Transform python data using declarative schemas
Project description
# kat-transform
Kittie's attempt to declaratively transform Python objects into serializable dictionaries. Minimal, composable, Pydantic-free. Just fields, dataclasses, and a pinch of magic.
Features
- Declarative schema definition
- Field-level transformation
- Nested schemas
- Dependency-injected getters via FunDI
- No runtime overhead, no metaclasses, no opinionated data modeling
- Multiple getters(with fallback:
"created_at"->"created") - Custom field metadata and schema metadata
Basic Usage:
from dataclasses import dataclass
from datetime import datetime
from kat_transform import schema, field, transform
user_schema = schema(
"User",
field(str, "username"),
field(int, "id")
)
@dataclass
class User:
username: str,
id: int
user = User("Kuyugama", -1)
raw = user_schema.get(user)
transformed = transform(raw)
assert transformed == {"username": "Kuyugama", "id": -1}
print(transformed)
Deep dive
Transform on the Fly
from dataclasses import dataclass
from datetime import datetime
from kat_transform import schema, field, transform
user_schema = schema(
"User",
field(str, "username", transform=lambda x: x.lower()),
field(int, "created", transform=lambda x: int(x.timestamp()), getter=("created_at", "created")),
field(int, "id")
)
@dataclass
class User:
username: str,
created_at: datetime
id: int
user = User("Kuyugama", datetime(day=17, month=3, year=2026), -1)
raw = user_schema.get(user)
transformed = transform(raw)
assert transformed == {"username": "kuyugama", "created": 1773612000, "id": -1}
print(transformed)
DI-based getters (aka fields from the void)
from dataclasses import dataclass
from datetime import datetime
from kat_transform import schema, field, resolve_fields, transform
error_schema = schema(
"Error",
field(str, "message"),
field(str, "category"),
field(str, "code"),
field(str, "cat", transform=lambda x: f"https://http.cat/{x}", getter=lambda response: response["status_code"])
)
@dataclass
class Error:
message: str
category: str
code: str
error = Error("User not found", "users", "not-found")
raw = error_schema.get(error)
resolved = resolve_fields({"response": {"status_code": 404}}, raw)
transformed = transform(resolved)
assert transformed == {"message": "User not found", "category": "users", "code": "not-found", "cat": "https://http.cat/404"}
print(transformed)
resolve_fieldsuses FunDI dependency injection under the hood. Allgetterfunctions should be valid FunDI dependencies.
Nested schemas? Awww, gotcha!
from dataclasses import dataclass
from datetime import datetime
from kat_transform import schema, field, resolve_fields, transform
user_schema = schema(
"User",
field(str, "username", transform=lambda x: x.lower()),
field(int, "id"),
)
content_schema = schema(
"Content",
field(user_schema, "owner"),
field(str, "title", transform=lambda x: x.title()),
)
@dataclass
class User:
username: str
id: int
@dataclass
class Content:
owner: User
title: str
user = User("Kuyugama", 1)
content = Content(user, "Clever flower")
raw = content_schema.get(content)
transformed = transform(raw)
assert transformed == {"owner": {"username": "kuyugama", "id": 1}, "title": "Clever Flower"}
print(transformed)
Project details
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 kat_transform-0.0.3.tar.gz.
File metadata
- Download URL: kat_transform-0.0.3.tar.gz
- Upload date:
- Size: 89.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.7.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
0f04bab6f0ae6b49ea8b5f0537e7fb7c6d5d039afc312f177a1d004cee665a92
|
|
| MD5 |
c00a2e21590d4aeff403a1f0a684c3ca
|
|
| BLAKE2b-256 |
bbcfa276e88e7d4e76bdf0ab6e775ea24c8b08294549631d0d45cc00dc2ef2eb
|
File details
Details for the file kat_transform-0.0.3-py3-none-any.whl.
File metadata
- Download URL: kat_transform-0.0.3-py3-none-any.whl
- Upload date:
- Size: 19.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.7.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c1b78d06ece092d2e7de58be14796d4ac7b119e874e2e1c60f097ac0f704adb7
|
|
| MD5 |
d53fb0a0188291f53dfe1fa8692818da
|
|
| BLAKE2b-256 |
5c04f202d50623572aa1dd9e7db36e8145a3834a7d0e625f136db2e317efab3e
|