From 65df91ed3c6620ca661d57fd8f9ad597d31a3c6c Mon Sep 17 00:00:00 2001 From: Daniil Fajnberg Date: Sat, 11 Mar 2023 16:17:12 +0100 Subject: [PATCH] =?UTF-8?q?=F0=9F=93=9D=20Write=20and=20configure=20docume?= =?UTF-8?q?ntation?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/api_reference/decorators.md | 1 + docs/api_reference/schema.md | 1 + docs/img/ide_suggestion_user.png | Bin 0 -> 73373 bytes docs/index.md | 73 +++++++++++++- mkdocs.yaml | 17 +++- pyproject.toml | 1 + src/marshmallow_generic/decorators.py | 30 +++++- src/marshmallow_generic/schema.py | 136 ++++++++++++++++++++++---- 8 files changed, 234 insertions(+), 25 deletions(-) create mode 100644 docs/api_reference/decorators.md create mode 100644 docs/api_reference/schema.md create mode 100644 docs/img/ide_suggestion_user.png diff --git a/docs/api_reference/decorators.md b/docs/api_reference/decorators.md new file mode 100644 index 0000000..53549cb --- /dev/null +++ b/docs/api_reference/decorators.md @@ -0,0 +1 @@ +::: marshmallow_generic.decorators \ No newline at end of file diff --git a/docs/api_reference/schema.md b/docs/api_reference/schema.md new file mode 100644 index 0000000..8e0a448 --- /dev/null +++ b/docs/api_reference/schema.md @@ -0,0 +1 @@ +::: marshmallow_generic.schema diff --git a/docs/img/ide_suggestion_user.png b/docs/img/ide_suggestion_user.png new file mode 100644 index 0000000000000000000000000000000000000000..4c194363389bfbfe12548114828e1e039397c820 GIT binary patch literal 73373 zcmbTdbyyrhx9~}@1oz+&Ai>=of+oS;-6gnta3{FCySoPlg1h@5gWKRXOOp5Q-o4+q z&+fDJ$G~*;^y#WPT}OVW!{lWpQ4k3bp`f5pzJ3u?go1(rK|w*wzk`20ax8%Zc>M$G zDDqYL-D~rDXB-Lz^#SUu*k@(8jN>(TFO}WQyNd}P*RifMq$L>GUj vPB|m3uS+ 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 z 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 OAna@%ZOW~%F@FOaI|*t4 literal 0 HcmV?d00001 diff --git a/docs/index.md b/docs/index.md index 8532ea9..0f3b91c 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,15 +1,82 @@ # marshmallow-generic -Generic schema with full typing support and minimal boilerplate +**Generic schema with full typing support and minimal boilerplate** -## Usage +--- + +**Documentation**: daniil-berg.github.io/marshmallow-generic + +**Source Code**: github.com/daniil-berg/marshmallow-generic + +--- + +Extension for `marshmallow` to make deserialization to objects easier and improve type safety. + +The main `GenericSchema` class extends `marshmallow.Schema` making it **generic** in terms of the class that data should be deserialized to, when calling `load`/`loads`. + +With `GenericSchema` there is no need to explicitly write `post_load` hooks to initialize the object anymore. 🎉 + +If the "model" class is (for example) `User`, it just needs to be passed as the type argument, when subclassing `GenericSchema`. Depending on whether `many` is `True` or not, the output of the `load`/`loads` method will then be automatically inferred as either `User` or `list[User]` by any competent type checker. ✨ + +## Usage Example + +```python +from marshmallow import fields +from marshmallow_generic import GenericSchema + + +class User: + def __init__(self, name: str, email: str) -> None: + self.name = name + self.email = email + + def __repr__(self) -> str: + return "".format(self=self) ... +class UserSchema(GenericSchema[User]): + name = fields.Str() + email = fields.Email() + + +user_data = {"name": "Monty", "email": "monty@python.org"} +schema = UserSchema() +single_user = schema.load(user_data) +print(single_user) # + +json_data = '''[ + {"name": "Monty", "email": "monty@python.org"}, + {"name": "Ronnie", "email": "ronnie@stones.com"} +]''' +multiple_users = schema.loads(json_data, many=True) +print(multiple_users) # [, ] +``` + +Adding `reveal_type(single_user)` and `reveal_type(multiple_users)` at the bottom and running that code through `mypy` would yield the following output: + +``` +# note: Revealed type is "User" +# note: Revealed type is "builtins.list[User]" +``` + +With the regular `marshmallow.Schema`, the output of `mypy` would instead be this: + +``` +# note: Revealed type is "Any" +# note: Revealed type is "Any" +``` + +This also means your IDE will be able to infer the types and thus provide useful auto-suggestions for the loaded objects. 👨‍💻 + +Here is PyCharm with the example from above: + +![Image title](img/ide_suggestion_user.png){ width="540" } + ## Installation `pip install marshmallow-generic` ## Dependencies -Python Version ..., OS ... +Python Version `3.9+` and `marshmallow` (duh) diff --git a/mkdocs.yaml b/mkdocs.yaml index 5a41e3d..2b927c5 100644 --- a/mkdocs.yaml +++ b/mkdocs.yaml @@ -26,13 +26,28 @@ extra_css: plugins: - search - - mkdocstrings + - mkdocstrings: + handlers: + python: + options: + show_source: false + show_root_toc_entry: false + import: + - https://marshmallow.readthedocs.io/en/stable/objects.inv markdown_extensions: - admonition - codehilite - extra - pymdownx.superfences + - toc: + permalink: true + +watch: + - src nav: - Home: index.md + - 'API Reference': + - api_reference/schema.md + - api_reference/decorators.md diff --git a/pyproject.toml b/pyproject.toml index 9086c39..5182983 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -120,6 +120,7 @@ ignore = [ "D203", # 1 blank line required before class docstring -> D211 is better "D212", # Multi-line docstring summary should start at the first line -> ugly, D212 is better "D401", # First line of docstring should be in imperative mood -> no, it shouldn't + "D407", # Missing dashed underline after section -> different docstring style ] [tool.ruff.per-file-ignores] diff --git a/src/marshmallow_generic/decorators.py b/src/marshmallow_generic/decorators.py index 9d672a5..93f50b3 100644 --- a/src/marshmallow_generic/decorators.py +++ b/src/marshmallow_generic/decorators.py @@ -1,4 +1,8 @@ -"""Typed overloads for some of the `marshmallow.decorators` module.""" +""" +Typed overloads for the [`marshmallow.decorators`][marshmallow.decorators] module. + +Implements decorators as generic in terms of the decorated method types. +""" from collections.abc import Callable from typing import Any, Optional, TypeVar, overload @@ -34,9 +38,31 @@ def post_load( pass_original: bool = False, ) -> Callable[..., Any]: """ - Typed overload of the original `marshmallow.post_load` decorator function. + Register a method to invoke after deserializing an object. + Typed overload of the original [`marshmallow.post_load`] + [marshmallow.post_load] decorator function. Generic to ensure that the decorated function retains its type. Runtime behavior is unchanged. + + Receives the deserialized data and returns the processed data. + By default it receives a single object at a time, transparently handling + the `many` argument passed to the [`Schema.load`][marshmallow.Schema.load] + call. + + Args: + fn (Optional[Callable[P, R]]): + The function to decorate or `None`; if a function is supplied, + a decorated version of it is returned; if `None` the decorator + is returned with its other arguments already bound. + pass_many: + If `True`, the raw data (which may be a collection) is passed + pass_original: + If `True`, the original data (before deserializing) will be passed + as an additional argument to the method + + Returns: + (Callable[P, R]): if `fn` is passed a function + (Callable[[Callable[P, R]], Callable[P, R]]): if `fn` is `None` """ return _post_load(fn, pass_many=pass_many, pass_original=pass_original) diff --git a/src/marshmallow_generic/schema.py b/src/marshmallow_generic/schema.py index 797faac..8e68ecd 100644 --- a/src/marshmallow_generic/schema.py +++ b/src/marshmallow_generic/schema.py @@ -1,4 +1,9 @@ -"""Definition of the `GenericSchema` base class.""" +""" +Definition of the `GenericSchema` base class. + +For details about the inherited methods and attributes, see the official +documentation of [`marshmallow.Schema`][marshmallow.Schema]. +""" from collections.abc import Iterable, Mapping, Sequence from typing import TYPE_CHECKING, Any, Literal, Optional, TypeVar, Union, overload @@ -8,23 +13,58 @@ from marshmallow import Schema from ._util import GenericInsightMixin from .decorators import post_load -_T = TypeVar("_T") +Model = TypeVar("Model") -class GenericSchema(GenericInsightMixin[_T], Schema): +class GenericSchema(GenericInsightMixin[Model], Schema): """ - Schema parameterized by the class it deserializes data to. + Generic schema parameterized by a **`Model`** class. + + Data will always be deserialized to instances of that **`Model`** class. + + !!! note + The **`Model`** referred to throughout the documentation is a + **type variable**, not any concrete class. For more information about + type variables, see the "Generics" section in + [PEP 484](https://peps.python.org/pep-0484/#generics). Registers a `post_load` hook to pass validated data to the constructor - of the specified class. + of the specified **`Model`**. - Requires a specific (non-generic) class to be passed as the type argument - for deserialization to work properly. + Requires a specific (non-generic) class to be passed as the **`Model`** + type argument for deserialization to work properly: + + ```python + class Foo: # Model + ... + + class FooSchema(GenericSchema[Foo]): + ... + ``` """ @post_load - def instantiate(self, data: dict[str, Any], **_kwargs: Any) -> _T: - """Unpacks `data` into the constructor of the specified type.""" + def instantiate(self, data: dict[str, Any], **_kwargs: Any) -> Model: + """ + Unpacks `data` into the constructor of the specified **`Model`**. + + Registered as a [`@post_load`] + [marshmallow_generic.decorators.post_load] hook for the schema. + + !!! warning + You should probably **not** use this method directly; + no parsing, transformation or validation of any kind is done + in this method. The `data` passed to the **`Model`** constructor + "as is". + + Args: + data: + The validated data after deserialization; will be unpacked + into the constructor of the specified **`Model`** class. + + Returns: + Instance of the schema's **`Model`** initialized with `**data` + """ return self._get_type_arg()(**data) if TYPE_CHECKING: @@ -37,7 +77,7 @@ class GenericSchema(GenericInsightMixin[_T], Schema): many: Literal[True], partial: Union[bool, Sequence[str], set[str], None] = None, unknown: Optional[str] = None, - ) -> list[_T]: + ) -> list[Model]: ... @overload @@ -48,7 +88,7 @@ class GenericSchema(GenericInsightMixin[_T], Schema): many: Optional[Literal[False]] = None, partial: Union[bool, Sequence[str], set[str], None] = None, unknown: Optional[str] = None, - ) -> _T: + ) -> Model: ... def load( @@ -58,12 +98,40 @@ class GenericSchema(GenericInsightMixin[_T], Schema): many: Optional[bool] = None, partial: Union[bool, Sequence[str], set[str], None] = None, unknown: Optional[str] = None, - ) -> Union[list[_T], _T]: + ) -> Union[list[Model], Model]: """ - Same as `marshmallow.Schema.load` at runtime. + Deserializes data to objects of the specified **`Model`** class. + + Same as [`marshmallow.Schema.load`] + [marshmallow.schema.Schema.load] at runtime, but data will always + pass through the [`instantiate`] + [marshmallow_generic.schema.GenericSchema.instantiate] + hook after deserialization. Annotations ensure that type checkers will infer the return type - correctly based on the type argument passed to a specific subclass. + correctly based on the **`Model`** type argument of the class. + + Args: + data: + The data to deserialize + many: + Whether to deserialize `data` as a collection. If `None`, + the value for `self.many` is used. + partial: + Whether to ignore missing fields and not require any + fields declared. Propagates down to [`Nested`] + [marshmallow.fields.Nested] fields as well. If its value + is an iterable, only missing fields listed in that + iterable will be ignored. Use dot delimiters to specify + nested fields. + unknown: + Whether to exclude, include, or raise an error for unknown + fields in the data. Use `EXCLUDE`, `INCLUDE` or `RAISE`. + If `None`, the value for `self.unknown` is used. + + Returns: + (Model): if `many` is set to `False` + (list[Model]): if `many` is set to `True` """ ... @@ -76,7 +144,7 @@ class GenericSchema(GenericInsightMixin[_T], Schema): partial: Union[bool, Sequence[str], set[str], None] = None, unknown: Optional[str] = None, **kwargs: Any, - ) -> list[_T]: + ) -> list[Model]: ... @overload @@ -88,7 +156,7 @@ class GenericSchema(GenericInsightMixin[_T], Schema): partial: Union[bool, Sequence[str], set[str], None] = None, unknown: Optional[str] = None, **kwargs: Any, - ) -> _T: + ) -> Model: ... def loads( @@ -99,11 +167,41 @@ class GenericSchema(GenericInsightMixin[_T], Schema): partial: Union[bool, Sequence[str], set[str], None] = None, unknown: Optional[str] = None, **kwargs: Any, - ) -> Union[list[_T], _T]: + ) -> Union[list[Model], Model]: """ - Same as `marshmallow.Schema.loads` at runtime. + Deserializes data to objects of the specified **`Model`** class. + + Same as [`marshmallow.Schema.loads`] + [marshmallow.schema.Schema.loads] at runtime, but data will always + pass through the [`instantiate`] + [marshmallow_generic.schema.GenericSchema.instantiate] + hook after deserialization. Annotations ensure that type checkers will infer the return type - correctly based on the type argument passed to a specific subclass. + correctly based on the **`Model`** type argument of the class. + + Args: + json_data: + A JSON string of the data to deserialize + many: + Whether to deserialize `data` as a collection. If `None`, + the value for `self.many` is used. + partial: + Whether to ignore missing fields and not require any + fields declared. Propagates down to [`Nested`] + [marshmallow.fields.Nested] fields as well. If its value + is an iterable, only missing fields listed in that + iterable will be ignored. Use dot delimiters to specify + nested fields. + unknown: + Whether to exclude, include, or raise an error for unknown + fields in the data. Use `EXCLUDE`, `INCLUDE` or `RAISE`. + If `None`, the value for `self.unknown` is used. + **kwargs: + Passed to the JSON decoder + + Returns: + (Model): if `many` is set to `False` + (list[Model]): if `many` is set to `True` """ ...