Skip to main content

marshmallow-toplevel

Load and validate top-level lists with all the power of marshmallow.

Installation

pip install marshmallow-toplevel

Usage

from marshmallow import fields
from marshmallow_toplevel import TopLevelSchema


class BatchOfSomething(TopLevelSchema):
    _toplevel = fields.Nested(
        SomethingSchema,
        required=True,
        many=True,
        validate=any_validation_logic_applied_to_list
    )

Rationale

Imagine that you have an API endpoint (or any other program that accepts user input), which is intended to accept multiple blog articles and save them to a database. Semantically, your data is a list of dictionaries:

[
    {"id": 1, "title": "Hello World!"},
    {"id": 2, "title": "Yet another awesome article."},
    ...
]

You describe article object schema and put constraints on your data:

from marshmallow import Schema, fields, validate


class ArticleSchema(Schema):
    id = fields.Int(required=True)
    title = fields.Str(required=True, validate=validate.Length(min=2, max=256))

But you also want to put some constraints onto outer list itself, for example, you want it to have length between 1 and 10. How do you describe it in terms of marshmallow?

Obvious solution: nest your data

class BatchOfArticles(Schema):
    articles = fields.Nested(
        ArticleSchema,
        required=True,
        many=True,
        validate=validate.Length(1, 10)
    )

But now a client have to send data this way, with this extra dictionary around:

{
    "articles": [
        {"id": 1, "title": "Hello World!"},
        {"id": 2, "title": "Yet another awesome article."},
        ...
    ]
}

It makes your API not so beautiful and user-friendly.

Good solution: use marshmallow-toplevel

With marshmallow-toplevel you can describe you data this way:

from marshmallow_toplevel import TopLevelSchema


class BatchOfArticles(TopLevelSchema):
    _toplevel = fields.Nested(
        ArticleSchema,
        required=True,
        many=True,
        validate=validate.Length(1, 10)
    )

Notice that schema inherits from TopLevelSchema and uses this special _toplevel key. It means that the field under this key describes top level object. You can define any constrains that you can define in marshmallow and it will just work:

schema = BatchOfArticles()

# validation should fail
errors = schema.validate([])
assert errors  # length < 1
errors = schema.validate([{"id": i, "title": "title"} for i in range(100)])
assert errors  # length > 10

# validation should succeed
errors = schema.validate([{"id": i, "title": "title"} for i in range(5)])
assert not errors

You can also use load for this schema as usual:

data = schema.load([{"id": "10", "title": "wow!"}])
print(data)
# [{"id": 10, "title": "wow!"}]

Now a client can send data as a list without redundancy.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

marshmallow-toplevel-0.1.3.tar.gz (4.1 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

marshmallow_toplevel-0.1.3-py3-none-any.whl (3.9 kB view details)

Uploaded Python 3

File details

Details for the file marshmallow-toplevel-0.1.3.tar.gz.

File metadata

  • Download URL: marshmallow-toplevel-0.1.3.tar.gz
  • Upload date:
  • Size: 4.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.1.4 CPython/3.8.5 Linux/4.4.0-19041-Microsoft

File hashes

Hashes for marshmallow-toplevel-0.1.3.tar.gz
Algorithm Hash digest
SHA256 e0b28277d28fbfa49d2ad527b3270fb8964438d55360a16fe84e385f0473bf32
MD5 f400bec1a0f37ffd5501175e0c564c4d
BLAKE2b-256 cf6a34ec3695b91a32cc06721500b86d467e89a4537df3247dfcf58b45af7a4d

See more details on using hashes here.

File details

Details for the file marshmallow_toplevel-0.1.3-py3-none-any.whl.

File metadata

  • Download URL: marshmallow_toplevel-0.1.3-py3-none-any.whl
  • Upload date:
  • Size: 3.9 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.1.4 CPython/3.8.5 Linux/4.4.0-19041-Microsoft

File hashes

Hashes for marshmallow_toplevel-0.1.3-py3-none-any.whl
Algorithm Hash digest
SHA256 5b5e0ad521a9244fb3a9f8d00770cfdd0f89e706d685f3fe0216b7eaf91771ab
MD5 bf5e8472f2a7be9d16fc48d5eb54f8ed
BLAKE2b-256 ac96c4363050539f226628b3bcae139d6592788292fef1e9a1323c3a9990d953

See more details on using hashes here.

Release history Release notifications | RSS feed

This release

0.1.3 This release

2 files

0.1.2

2 files

0.1.1

2 files

0.1.0

2 files

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page