Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/marshmallow-code/marshmallow-oneofschema
Marshmallow library extension that allows schema (de)multiplexing
https://github.com/marshmallow-code/marshmallow-oneofschema
hacktoberfest marshmallow polymorphic
Last synced: 3 days ago
JSON representation
Marshmallow library extension that allows schema (de)multiplexing
- Host: GitHub
- URL: https://github.com/marshmallow-code/marshmallow-oneofschema
- Owner: marshmallow-code
- License: mit
- Created: 2016-03-15T04:46:28.000Z (over 8 years ago)
- Default Branch: main
- Last Pushed: 2024-10-08T10:02:58.000Z (about 1 month ago)
- Last Synced: 2024-10-29T15:45:42.617Z (12 days ago)
- Topics: hacktoberfest, marshmallow, polymorphic
- Language: Python
- Homepage:
- Size: 141 KB
- Stars: 135
- Watchers: 8
- Forks: 43
- Open Issues: 26
-
Metadata Files:
- Readme: README.rst
- Changelog: CHANGELOG.rst
- Funding: .github/FUNDING.yml
- License: LICENSE
- Security: SECURITY.md
Awesome Lists containing this project
README
=======================
marshmallow-oneofschema
=======================|pypi| |build-status| |marshmallow3|
.. |pypi| image:: https://badgen.net/pypi/v/marshmallow-oneofschema
:target: https://pypi.org/project/marshmallow-oneofschema/
:alt: PyPI package.. |build-status| image:: https://github.com/marshmallow-code/marshmallow-oneofschema/actions/workflows/build-release.yml/badge.svg
:target: https://github.com/marshmallow-code/flask-marshmallow/actions/workflows/build-release.yml
:alt: Build status.. |marshmallow3| image:: https://badgen.net/badge/marshmallow/3
:target: https://marshmallow.readthedocs.io/en/latest/upgrading.html
:alt: marshmallow 3 compatibleAn extension to marshmallow to support schema (de)multiplexing.
marshmallow is a fantastic library for serialization and deserialization of data.
For more on that project see its `GitHub `_
page or its `Documentation `_.This library adds a special kind of schema that actually multiplexes other schemas
based on object type. When serializing values, it uses get_obj_type() method
to get object type name. Then it uses ``type_schemas`` name-to-Schema mapping
to get schema for that particular object type, serializes object using that
schema and adds an extra field with name of object type. Deserialization is reverse.Installing
----------::
$ pip install marshmallow-oneofschema
Example
-------The code below demonstrates how to set up a polymorphic schema. For the full context check out the tests.
Once setup the schema should act like any other schema. If it does not then please file an Issue... code:: python
import marshmallow
import marshmallow.fields
from marshmallow_oneofschema import OneOfSchemaclass Foo:
def __init__(self, foo):
self.foo = fooclass Bar:
def __init__(self, bar):
self.bar = barclass FooSchema(marshmallow.Schema):
foo = marshmallow.fields.String(required=True)@marshmallow.post_load
def make_foo(self, data, **kwargs):
return Foo(**data)class BarSchema(marshmallow.Schema):
bar = marshmallow.fields.Integer(required=True)@marshmallow.post_load
def make_bar(self, data, **kwargs):
return Bar(**data)class MyUberSchema(OneOfSchema):
type_schemas = {"foo": FooSchema, "bar": BarSchema}def get_obj_type(self, obj):
if isinstance(obj, Foo):
return "foo"
elif isinstance(obj, Bar):
return "bar"
else:
raise Exception("Unknown object type: {}".format(obj.__class__.__name__))MyUberSchema().dump([Foo(foo="hello"), Bar(bar=123)], many=True)
# => [{'type': 'foo', 'foo': 'hello'}, {'type': 'bar', 'bar': 123}]MyUberSchema().load(
[{"type": "foo", "foo": "hello"}, {"type": "bar", "bar": 123}], many=True
)
# => [Foo('hello'), Bar(123)]By default get_obj_type() returns obj.__class__.__name__, so you can just reuse that
to save some typing:.. code:: python
class MyUberSchema(OneOfSchema):
type_schemas = {"Foo": FooSchema, "Bar": BarSchema}You can customize type field with `type_field` class property:
.. code:: python
class MyUberSchema(OneOfSchema):
type_field = "object_type"
type_schemas = {"Foo": FooSchema, "Bar": BarSchema}MyUberSchema().dump([Foo(foo="hello"), Bar(bar=123)], many=True)
# => [{'object_type': 'Foo', 'foo': 'hello'}, {'object_type': 'Bar', 'bar': 123}]You can use resulting schema everywhere marshmallow.Schema can be used, e.g.
.. code:: python
import marshmallow as m
import marshmallow.fields as fclass MyOtherSchema(m.Schema):
items = f.List(f.Nested(MyUberSchema))License
-------MIT licensed. See the bundled `LICENSE `_ file for more details.