Skip to main content

"Adds some YAML functionality to the excellent `pydantic` library."

Project description

pydantic-yaml

PyPI version Documentation Status Unit Tests

This is a small helper library that adds some YAML capabilities to pydantic, namely dumping to yaml via the yaml_model.yaml() function, and parsing from strings/files using YamlModel.parse_raw() and YamlModel.parse_file(). It also adds Enum subclasses that get dumped to YAML as strings or integers, and fixes dumping of some typical types.

Documentation on ReadTheDocs.org

Basic Usage

Typical usage is seen below. See the pydantic docs for more usage examples.

from pydantic import BaseModel, validator
from pydantic_yaml import YamlStrEnum, YamlModel


class MyEnum(YamlStrEnum):
    """This is a custom enumeration that is YAML-safe."""

    a = "a"
    b = "b"

class InnerModel(BaseModel):
    """This is a normal pydantic model that can be used as an inner class."""

    fld: float = 1.0

class MyModel(YamlModel):
    """This is our custom class, with a `.yaml()` method.

    The `parse_raw()` and `parse_file()` methods are also updated to be able to
    handle `content_type='application/yaml'`, `protocol="yaml"` and file names
    ending with `.yml`/`.yaml`
    """

    x: int = 1
    e: MyEnum = MyEnum.a
    m: InnerModel = InnerModel()

    @validator('x')
    def _chk_x(cls, v: int) -> int:  # noqa
        """You can add your normal pydantic validators, like this one."""
        assert v > 0
        return v

m1 = MyModel(x=2, e="b", m=InnerModel(fld=1.5))

# This dumps to YAML and JSON respectively
yml = m1.yaml()
jsn = m1.json()

m2 = MyModel.parse_raw(yml)  # This automatically assumes YAML
assert m1 == m2

m3 = MyModel.parse_raw(jsn)  # This will fallback to JSON
assert m1 == m3

m4 = MyModel.parse_raw(yml, proto="yaml")
assert m1 == m4

m5 = MyModel.parse_raw(yml, content_type="application/yaml")
assert m1 == m5

Installation

pip install pydantic_yaml

Make sure to install ruamel.yaml or pyyaml as well. These are optional dependencies:

pip install pydantic_yaml[ruamel]

pip install pydantic_yaml[pyyaml]

Mixin Class

Version 0.5.0 adds a YamlModelMixin which can be used to add YAML functionality on top of, or alongside, other base classes:

from typing import List

from pydantic import BaseModel
from pydantic_yaml import YamlModelMixin


class MyBase(BaseModel):
    """This is a normal."""
    x: str = "x"

class ExtModel(YamlModelMixin, MyBase):
    """This model can be sent to/read from YAML."""
    y: List[int] = [1, 2, 3]  # and you can define additional fields, if you want

Note that this YamlModelMixin must be before any BaseModel-derived classes. This will hopefully be resolved in Pydantic 2.0 (see this discussion for more details). If you know a better way of implementing this, please make raise an issue or create a PR!

Configuration

You can configure the function used to dump and load the YAML by using the Config inner class, as in Pydantic:

class MyModel(YamlModel):
    # ...
    class Config:
        # You can override these fields:
        yaml_dumps = my_custom_dumper
        yaml_loads = lambda x: MyModel()
        # As well as other Pydantic configuration:
        allow_mutation = False

Versioned Models

Since YAML is often used for config files, there is also a SemVer str-like class and VersionedYamlModel base class.

The version attribute is parsed according to the SemVer (Semantic Versioning) specification. It's constrained between the min_version and max_version specified by your models' Config inner class (similar to regular pydantic models).

Usage example

from pydantic import ValidationError
from pydantic_yaml import SemVer, VersionedYamlModel

class A(VersionedYamlModel):
    """Model with min, max constraints as None."""

    foo: str = "bar"


class B(VersionedYamlModel):
    """Model with a maximum version set."""

    foo: str = "bar"

    class Config:
        min_version = "2.0.0"

ex_yml = """
version: 1.0.0
foo: baz
"""

a = A.parse_raw(ex_yml)
assert a.version == SemVer("1.0.0")
assert a.foo == "baz"

try:
    B.parse_raw(ex_yml)
except ValidationError as e:
    print("Correctly got ValidationError:", e, sep="\n")

Project details


Download files

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

Source Distribution

pydantic_yaml-0.6.3.tar.gz (18.7 kB view details)

Uploaded Source

Built Distribution

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

pydantic_yaml-0.6.3-py3-none-any.whl (21.7 kB view details)

Uploaded Python 3

File details

Details for the file pydantic_yaml-0.6.3.tar.gz.

File metadata

  • Download URL: pydantic_yaml-0.6.3.tar.gz
  • Upload date:
  • Size: 18.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.8.0 pkginfo/1.8.2 readme-renderer/34.0 requests/2.27.1 requests-toolbelt/0.9.1 urllib3/1.26.9 tqdm/4.63.0 importlib-metadata/4.11.3 keyring/23.5.0 rfc3986/2.0.0 colorama/0.4.4 CPython/3.8.12

File hashes

Hashes for pydantic_yaml-0.6.3.tar.gz
Algorithm Hash digest
SHA256 8bec8b6eee9889073b5461075d8b85efb00ba43bd34d5fb331fa394ec5a3b46f
MD5 92aa0d9b62b9c8ef757191fcdbfb0225
BLAKE2b-256 6f3b402549a950b2f94f426e8a0a7e1cfcd9af6770444c1bf879679096d8e77a

See more details on using hashes here.

File details

Details for the file pydantic_yaml-0.6.3-py3-none-any.whl.

File metadata

  • Download URL: pydantic_yaml-0.6.3-py3-none-any.whl
  • Upload date:
  • Size: 21.7 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.8.0 pkginfo/1.8.2 readme-renderer/34.0 requests/2.27.1 requests-toolbelt/0.9.1 urllib3/1.26.9 tqdm/4.63.0 importlib-metadata/4.11.3 keyring/23.5.0 rfc3986/2.0.0 colorama/0.4.4 CPython/3.8.12

File hashes

Hashes for pydantic_yaml-0.6.3-py3-none-any.whl
Algorithm Hash digest
SHA256 aaa3e9c55eeebc203dacd461ff635932d10a440bfda7f77f596351094c85322b
MD5 4f11b120b9ef7cd38c2da76a3ccbeac6
BLAKE2b-256 345a652b143c158de60974922dd54dcb4fe83ca63ef1d6a593d2131c392696d2

See more details on using hashes here.

Supported by

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