Extensions
Attrs
Already working with attrs? CleanChausie can serialize / deserialize attrs classes directly:
import attrs
from cleanchausie import clean, serialize
from cleanchausie.ext.attrs import schema_def_from_attrs_class
@attrs.frozen
class User:
first_name: str
last_name: str
user_schema_definition = schema_def_from_attrs_class(User)
result = clean(user_schema_definition, {"first_name": "Janice", "last_name": "Smith"})
print(result)
# User(first_name='Janice', last_name='Smith')
print(serialize(user_schema_definition, result))
# { 'first_name': 'Janice', 'last_name': 'Smith' }
Schemas (declarative class-based definitions) can also be automatically generated based on existing attrs classes:
import attrs
from cleanchausie import clean, serialize
from cleanchausie.ext.attrs import schema_for_attrs_class
@attrs.frozen
class User:
first_name: str
last_name: str
UserSchema = schema_for_attrs_class(User)
result = clean(UserSchema, {"first_name": "Janice", "last_name": "Smith"})
print(result)
# UserSchema(first_name='Janice', last_name='Smith')
print(serialize(result))
# { 'first_name': 'Janice', 'last_name': 'Smith' }
user = User(**serialize(result))
print(user)
# User(first_name='Janice', last_name='Smith')
Or include attrs classes as a nested field within a Schema:
import attrs
from cleanchausie import Schema, clean
@attrs.frozen
class LanguagePreference:
language: str
closed_captions: bool
class UserSchema(Schema):
first_name: str
last_name: str
language_preference: LanguagePreference
result = clean(
UserSchema,
{
"first_name": "Janice",
"last_name": "Smith",
"language_preference": {"language": "en", "closed_captions": True}
}
)
print(result)
# UserSchema(
# first_name='Janice',
# last_name='Smith',
# language_preference=LanguagePreference(language='en', closed_captions=True)
# )