Initial commit

This commit is contained in:
2026-06-12 19:15:46 +00:00
commit c254970ae5
34 changed files with 3143 additions and 0 deletions
+82
View File
@@ -0,0 +1,82 @@
import sys
from datetime import UTC, datetime
from pathlib import Path
from types import ModuleType
from uuid import UUID
import msgspec
from kanta import ChangeRecord, Kanta
class User(msgspec.Struct):
name: str = ""
age: int = 0
class Data(msgspec.Struct):
users: dict[str, User] = {}
counter: int = 0
class ExoticData(msgspec.Struct, omit_defaults=False):
uuid_values: dict[str, UUID] = {}
uuid_keys: dict[UUID, int] = {}
datetime_values: dict[str, datetime] = {}
datetime_keys: dict[datetime, int] = {}
bytes_values: dict[str, bytes] = {}
bytes_keys: dict[bytes, int] = {}
class EvolvableDataV1(msgspec.Struct, omit_defaults=False):
counter: int = 0
class EvolvableDataV2(msgspec.Struct, omit_defaults=False):
counter: int = 0
enabled: bool = True
def make_kanta(path: Path, data_or_type, format_config, **kwargs):
_, serializer_cls = format_config
root = data_or_type() if isinstance(data_or_type, type) else data_or_type
return Kanta(
str(path),
root,
serializer=serializer_cls(),
**kwargs,
)
def seed_single_change(path: Path, change: ChangeRecord, format_config) -> None:
_, serializer_cls = format_config
serializer = serializer_cls()
framer = serializer.framer_cls()
payload = serializer.encode(change)
path.write_bytes(framer.frame_change(payload, record_offset=0))
def change_actions(path: Path, format_config) -> list[str]:
_, serializer_cls = format_config
serializer = serializer_cls()
framer = serializer.framer_cls()
actions: list[str] = []
for is_snapshot, payload, _, _ in framer.iter_records(path.read_bytes(), 0):
if is_snapshot:
continue
rec = serializer.decode(payload, type=ChangeRecord)
actions.append(rec.a)
return actions
def make_migrations_module(name: str, fn_name: str, fn):
mod = ModuleType(name)
mod.__dict__[fn_name] = fn
sys.modules[name] = mod
return mod
def fixed_change(action: str, diff: dict, *, version: int = 0) -> ChangeRecord:
return ChangeRecord(
ts=datetime(2026, 1, 1, tzinfo=UTC), a=action, v=version, diff=diff
)