Skip to content

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)
# )