Data description language for defining data models
Project description
district42
Data description language for defining data models
(!) Work in progress, breaking changes are possible until v2.0 is released
Installation
pip3 install district42
Usage
from district42 import schema
UserSchema = schema.dict({
"id": schema.int.min(1),
"name": schema.str | schema.none,
"is_deleted": schema.bool,
})
print(UserSchema)
More powerful with:
And more
Documentation
None
schema.none
sch = schema.none
Bool
schema.bool
sch = schema.bool
schema.bool(value
)
sch = schema.bool(True)
Int
schema.int
sch = schema.int
schema.int(value
)
sch = schema.int(42)
schema.int.min(value
)
sch = schema.int.min(0)
schema.int.max(value
)
sch = schema.int.max(0)
Float
schema.float
sch = schema.float
schema.float(value
)
sch = schema.float(3.14)
schema.float.min(value
)
sch = schema.float.min(0.0)
schema.float.max(value
)
sch = schema.float.max(0.0)
Str
schema.str
sch = schema.str
schema.str.len(length
)
sch = schema.str.len(10)
schema.str.len(min_length
, max_length
)
sch = schema.str.len(1, ...)
sch = schema.str.len(..., 32)
sch = schema.str.len(1, 32)
schema.str.alphabet(letters
)
digits = "01234567890"
sch = schema.str.alphabet(digits)
schema.str.contains(substr
)
sch = schema.str.contains("@")
schema.str.regex(pattern
)
import re
sch = schema.str.regex(r"[a-z]+")
List
schema.list
sch = schema.list
schema.list(elements
)
sch = schema.list([schema.int(1), schema.int(2)])
schema.list(type
)
sch = schema.list(schema.int)
schema.list(type
).len(length
)
sch = schema.list(schema.int).len(3)
schema.list(type
).len(min_length
, max_length
)
sch = schema.list(schema.int).len(1, ...)
sch = schema.list(schema.int).len(..., 10)
sch = schema.list(schema.int).len(1, 10)
Dict
schema.dict
sch = schema.dict
schema.dict(keys
)
sch = schema.dict({
"id": schema.int,
"name": schema.str | schema.none,
optional("platform"): schema.str,
})
Any
schema.any
sch = schema.any
schema.any(*types
)
sch = schema.any(schema.str, schema.int)
Custom Types
1. Declare Schema
from typing import Any
from uuid import UUID
from district42 import Props, SchemaVisitor, SchemaVisitorReturnType as ReturnType
from district42.types import Schema
from niltype import Nilable
class UUIDProps(Props):
@property
def value(self) -> Nilable[UUID]:
return self.get("value")
class UUIDSchema(Schema[UUIDProps]):
def __accept__(self, visitor: SchemaVisitor[ReturnType], **kwargs: Any) -> ReturnType:
return visitor.visit_uuid(self, **kwargs)
def __call__(self, /, value: UUID) -> "UUIDSchema":
return self.__class__(self.props.update(value=value))
2. Register Representor
from typing import Any
from district42.representor import Representor
from niltype import Nil
class UUIDRepresentor(Representor, extend=True):
def visit_uuid(self, schema: UUIDSchema, *, indent: int = 0, **kwargs: Any) -> str:
r = f"{self._name}.uuid"
if schema.props.value is not Nil:
r += f"({schema.props.value!r})"
return r
3. Use
from uuid import uuid4
from district42 import register_type, schema
register_type("uuid", UUIDSchema)
print(schema.uuid(uuid4()))
# schema.uuid(UUID('ce80d2b7-cdce-4e24-ab26-00c75471ce78'))
Full code available here: district42_exp_types/uuid
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
district42-1.3.8.tar.gz
(24.8 kB
view hashes)
Built Distribution
district42-1.3.8-py3-none-any.whl
(42.2 kB
view hashes)
Close
Hashes for district42-1.3.8-py3-none-any.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 4e5de211ac5e1a1a9eb4c982f8c862d0df9236a1a62cfa0197e237ace2af1ada |
|
MD5 | f2ac568b40fc52f632f91fe6bf39f16b |
|
BLAKE2b-256 | f2374dbd26a4e46959c639e58d049c12ef0d5e7a70cf7c0ba25a927113f746d6 |