"Adds some YAML functionality to the excellent `pydantic` library."
Project description
pydantic-yaml
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
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
8bec8b6eee9889073b5461075d8b85efb00ba43bd34d5fb331fa394ec5a3b46f
|
|
| MD5 |
92aa0d9b62b9c8ef757191fcdbfb0225
|
|
| BLAKE2b-256 |
6f3b402549a950b2f94f426e8a0a7e1cfcd9af6770444c1bf879679096d8e77a
|
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
aaa3e9c55eeebc203dacd461ff635932d10a440bfda7f77f596351094c85322b
|
|
| MD5 |
4f11b120b9ef7cd38c2da76a3ccbeac6
|
|
| BLAKE2b-256 |
345a652b143c158de60974922dd54dcb4fe83ca63ef1d6a593d2131c392696d2
|