Easily serialize dataclasses to and from JSON
Project description
serious
A dataclass model toolkit: serialization, validation, and more.
Features
- Model definitions in pure Python.
- Validation showing up in code coverage.
- Type annotations for all public-facing APIs.
- (Optionally) ensures immutability.
- Easily extensible.
- Made for people.
- Documented rigorously.
Basics
Installation
Available from PyPI:
pip install serious
Quick Example
Central part of Serious API are different Models.
Given a regular dataclass:
from dataclasses import dataclass
@dataclass
class Person:
name: str
Let’s create a JsonModel
:
from serious.json import JsonModel
model = JsonModel(Person)
And use its dump/load methods:
person = Person('Albert Einstein')
model.dump(person) # {"name": "Albert Einstein"}
Validation
To add validation to the example above all we need is to add __validate__
method to person:
from dataclasses import dataclass
from typing import Optional
from serious import ValidationError, Email
@dataclass
class Person:
name: str
email: Optional[Email]
phone: Optional[str]
def __validate__(self):
if len(self.name) == 0:
raise ValidationError('Every person needs a name')
if self.phone is None and self.email is None:
raise ValidationError('At least some contact should be present')
Supported formats:
- JSON
- Python Dictionaries
- YAML
- Form data
Supported field types
- Other dataclasses
- Primitives:
str
,int
,float
,bool
- Dictionaries: only with string keys:
Dict[str, Any]
- Lists, sets, deques: python collections of any serializable type
- Tuples both with and without ellipsis:
- tuples as set of independent elements (e.g.
Tuple[str, int, date]
) - with ellipses, acting as a frozen list (
Tuple[str, ...]
)
- tuples as set of independent elements (e.g.
- Enumerations by value:
- of primitives (e.g.
OperatingSystem(Enum)
) - typed enums (
Color(str, Enum)
andFilePermission(IntFlag)
)
- of primitives (e.g.
- Decimal: encoded to JSON as string
- Datetime, date and time: encoded to the ISO 8601 formatted string
- UUID
serious.types.Timestamp
: a UTC timestamp since UNIX epoch as float ms valueserious.types.Email
: a string Tiny Type that supports validation and contains additional properties- custom immutable alternatives to native python types in
serious.types
:FrozenList
,FrozenDict
A bigger example
from dataclasses import dataclass
from serious import JsonModel, ValidationError
from typing import List
from enum import Enum
class Specialty(Enum):
Worker = 1
Fool = 2
@dataclass(frozen=True)
class Minion:
name: str
type: Specialty
@dataclass(frozen=True)
class Boss:
name: str
minions: List[Minion]
def __validate__(self):
if len(self.minions) < 2:
raise ValidationError('What kind of boss are you?')
boss = Boss("me", [Minion('evil minion', Specialty.Fool), Minion('very evil minion', Specialty.Worker)])
boss_json = """{
"name": "me",
"minions": [
{
"name": "evil minion",
"type": "Fool"
},
{
"name": "very evil minion",
"type": "Worker"
}
]
}"""
model = JsonModel(Boss, indent=4)
assert model.dump(boss) == boss_json
assert model.load(boss_json) == boss
Acknowledgements
Initially, a fork of @lidatong/dataclasses-json.
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
serious-1.2.8.tar.gz
(26.2 kB
view details)
Built Distribution
serious-1.2.8-py3-none-any.whl
(31.8 kB
view details)
File details
Details for the file serious-1.2.8.tar.gz
.
File metadata
- Download URL: serious-1.2.8.tar.gz
- Upload date:
- Size: 26.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/4.0.2 CPython/3.10.14
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 912200396ee85f5f08fb4e31f35009e8a5e841d5704cc429f5d52e75c2acc80f |
|
MD5 | 06b5c01a034d5b34f00ac6464fe59945 |
|
BLAKE2b-256 | 7005e4cd70141b8076c101ac63c31b30e9f27694066f37cb3e0f9127b8800f5e |
File details
Details for the file serious-1.2.8-py3-none-any.whl
.
File metadata
- Download URL: serious-1.2.8-py3-none-any.whl
- Upload date:
- Size: 31.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/4.0.2 CPython/3.10.14
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 4edccadf6986309bc20089c6687db727cc0c2c203ff915bb741f0c9ac7db3826 |
|
MD5 | 2e098a407719ecd9a5a2791ee3cb58d6 |
|
BLAKE2b-256 | 6afde30652f4af411fa28d56e75e750efc80f8d93882236b36a798251debdb81 |