import dataclasses
import typing as t
import attr
import marshmallow
import desert._make
import desert._version
[docs]def schema(
cls: t.Type, many: bool = False, meta: t.Dict[str, t.Any] = {}
) -> marshmallow.Schema:
"""Build a marshmallow schema *instance* for the class.
Args:
cls: A type-hinted attrs class or dataclass.
meta: The schema's Meta class will be built from this dict.
Use values from :class:`marshmallow.Schema.Meta`.
Returns:
An instance of the marshmallow schema for the class.
"""
return desert._make.class_schema(cls, meta=meta)(many=many)
[docs]def schema_class(
cls: t.Type, meta: t.Dict[str, t.Any] = {}
) -> t.Type[marshmallow.Schema]:
"""Build a marshmallow schema *class* for the class.
Args:
cls: A type-hinted attrs class or dataclass.
meta: The schema's Meta class will be built from this dict.
Use values from :class:`marshmallow.Schema.Meta`.
Returns:
The marshmallow schema class.
"""
return desert._make.class_schema(cls, meta=meta)
[docs]def field(marshmallow_field: marshmallow.fields.Field, **kw) -> dataclasses.Field:
"""Specify a marshmallow field in the metadata for a ``dataclasses.dataclass``.
.. code-block:: python
@dataclasses.dataclass
class A:
x: int = desert.field(marshmallow.fields.Int())
"""
meta = metadata(marshmallow_field)
meta.update(kw.pop("metadata", {}))
return dataclasses.field(**kw, metadata=meta)
[docs]def ib(marshmallow_field: marshmallow.fields.Field, **kw) -> attr._make._CountingAttr:
"""Specify a marshmallow field in the metadata for an ``attr.dataclass``.
.. code-block:: python
@attr.dataclass
class A:
x: int = desert.ib(marshmallow.fields.Int())
"""
meta = metadata(marshmallow_field)
meta.update(kw.pop("metadata", {}))
return attr.ib(**kw, metadata=meta)
__version__ = desert._version.__version__