diff --git a/jsog3/__init__.pyi b/jsog3/__init__.pyi new file mode 100644 index 0000000..e69de29 diff --git a/jsog3/jsog.py b/jsog3/jsog.py index dea3444..52ee710 100644 --- a/jsog3/jsog.py +++ b/jsog3/jsog.py @@ -1,26 +1,24 @@ import json import itertools -def dump(*args, **kwargs): +def dump(obj, fp, **kwargs): """Identical to json.dump(), but produces JSOG""" - encoded = encode(args[0]) - args = (encoded,) + args[1:] - json.dump(*args, **kwargs) + obj = encode(obj) + return json.dump(obj, fp, **kwargs) -def dumps(*args, **kwargs): +def dumps(obj, **kwargs): """Identical to json.dumps(), but produces JSOG""" - encoded = encode(args[0]) - args = (encoded,) + args[1:] - return json.dumps(*args, **kwargs) + obj = encode(obj) + return json.dumps(obj, **kwargs) -def load(*args, **kwargs): +def load(fp, **kwargs): """Identical to json.load(), but understands JSOG. Works on plain JSON, but incurs some additional processing overhead.""" - obj = json.load(*args, **kwargs) + obj = json.load(fp, **kwargs) return decode(obj) -def loads(*args, **kwargs): +def loads(s, **kwargs): """Identical to json.loads(), but understands JSOG. Works on plain JSON, but incurs some additional processing overhead.""" - obj = json.loads(*args, **kwargs) + obj = json.loads(s, **kwargs) return decode(obj) diff --git a/jsog3/jsog.pyi b/jsog3/jsog.pyi new file mode 100644 index 0000000..2b78c24 --- /dev/null +++ b/jsog3/jsog.pyi @@ -0,0 +1,65 @@ +from _typeshed import SupportsRead +from collections.abc import Callable +from typing import IO, Any +from json import JSONEncoder, JSONDecoder + +__all__ = ["dump", "dumps", "load", "loads", "encode", "decode"] + +# Typing for dump/dumps/load/loads were extracted from Python's typeshed library: +# https://github.com/python/typeshed/blob/master/stdlib/json/__init__.pyi + +def dumps( + obj: Any, + *, + skipkeys: bool = ..., + ensure_ascii: bool = ..., + check_circular: bool = ..., + allow_nan: bool = ..., + cls: type[JSONEncoder] | None = ..., + indent: None | int | str = ..., + separators: tuple[str, str] | None = ..., + default: Callable[[Any], Any] | None = ..., + sort_keys: bool = ..., + **kwds: Any, +) -> str: ... +def dump( + obj: Any, + fp: IO[str], + *, + skipkeys: bool = ..., + ensure_ascii: bool = ..., + check_circular: bool = ..., + allow_nan: bool = ..., + cls: type[JSONEncoder] | None = ..., + indent: None | int | str = ..., + separators: tuple[str, str] | None = ..., + default: Callable[[Any], Any] | None = ..., + sort_keys: bool = ..., + **kwds: Any, +) -> None: ... +def loads( + s: str | bytes, + *, + cls: type[JSONDecoder] | None = ..., + object_hook: Callable[[dict[Any, Any]], Any] | None = ..., + parse_float: Callable[[str], Any] | None = ..., + parse_int: Callable[[str], Any] | None = ..., + parse_constant: Callable[[str], Any] | None = ..., + object_pairs_hook: Callable[[list[tuple[Any, Any]]], Any] | None = ..., + **kwds: Any, +) -> Any: ... +def load( + fp: SupportsRead[str | bytes], + *, + cls: type[JSONDecoder] | None = ..., + object_hook: Callable[[dict[Any, Any]], Any] | None = ..., + parse_float: Callable[[str], Any] | None = ..., + parse_int: Callable[[str], Any] | None = ..., + parse_constant: Callable[[str], Any] | None = ..., + object_pairs_hook: Callable[[list[tuple[Any, Any]]], Any] | None = ..., + **kwds: Any, +) -> Any: ... + +def encode(original: Any) -> Any: ... + +def decode(encoded: Any) -> Any: ... diff --git a/jsog3/py.typed b/jsog3/py.typed new file mode 100644 index 0000000..e69de29 diff --git a/setup.py b/setup.py index 87ec9f1..5abaeda 100644 --- a/setup.py +++ b/setup.py @@ -21,7 +21,7 @@ package_data={ # If any package contains *.txt or *.rst files, include them: - '': ['*.txt', '*.md'], + '': ['*.txt', '*.md', 'py.typed', '*.pyi'], }, # metadata for upload to PyPI