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.6.1.tar.gz
(28.1 kB
view details)
Built Distribution
serious-1.6.1-py3-none-any.whl
(33.7 kB
view details)
File details
Details for the file serious-1.6.1.tar.gz
.
File metadata
- Download URL: serious-1.6.1.tar.gz
- Upload date:
- Size: 28.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/5.1.1 CPython/3.10.15
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 1378fa18b1527fd189366e1f3a4410b31be40f32b1a21b61e3589c1859caa0a1 |
|
MD5 | 68456da7f59efcb01d88abbd71cc53e4 |
|
BLAKE2b-256 | 19b9a00997d8499fd1dc09eb4bd1f444921b0de701cda95991bca1f5a5962d1a |
File details
Details for the file serious-1.6.1-py3-none-any.whl
.
File metadata
- Download URL: serious-1.6.1-py3-none-any.whl
- Upload date:
- Size: 33.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/5.1.1 CPython/3.10.15
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | cdcf7efda50efc1dce29d321c3b4f728b823b03588d66fa15664997416ce66ff |
|
MD5 | 53aebd2d3339eeae046a9cfdd0291963 |
|
BLAKE2b-256 | 6f0e3097e06f707646a54468e4c1ebeb3cbfacfcd5db67db267871503ef161c7 |