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
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 serious-1.6.2.tar.gz.
File metadata
- Download URL: serious-1.6.2.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 |
fd1bf279d2ae860f057a893c214d2e5b538991b935ca0d1791ad9cb7b9c81ce5
|
|
| MD5 |
500660544684d3c019917a020bc6c4c8
|
|
| BLAKE2b-256 |
c20d4521c2b0c8ed477414bd1f53f3b4fcd6d2a28c2a7a001221dd589cc9322a
|
File details
Details for the file serious-1.6.2-py3-none-any.whl.
File metadata
- Download URL: serious-1.6.2-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 |
5327ffe1c30a95d91d33c6d9b2d6a98840016fc149cd4569523ac601741bc774
|
|
| MD5 |
53783268d2e66461b48ebdb9b8828a15
|
|
| BLAKE2b-256 |
a8563a444766462825506d48fd71b08a6a41b3fe6d9bc17bc2e08f2de44b0307
|