From 87f7868af12434baffacff7fa7ddb2bd3d0ba2b3 Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Sun, 14 Jun 2026 01:43:14 +0100 Subject: [PATCH] Cache Python document schema catalogs --- .../cultcache-py/src/cultcache_py/documents.py | 7 ++++++- packages/cultcache-py/tests/test_cultcache.py | 15 +++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/packages/cultcache-py/src/cultcache_py/documents.py b/packages/cultcache-py/src/cultcache_py/documents.py index 10cf3d80..e8511249 100644 --- a/packages/cultcache-py/src/cultcache_py/documents.py +++ b/packages/cultcache-py/src/cultcache_py/documents.py @@ -89,6 +89,7 @@ class DocumentDefinition(Generic[T]): canonical_schema_json: str | None = None compatible_schema_ids: tuple[str, ...] = field(default_factory=tuple) members: tuple[CultCacheSchemaCatalogMember, ...] = field(default_factory=tuple) + _catalog_entry: CultCacheSchemaCatalogEntry | None = field(default=None, init=False, repr=False, compare=False) def encode_payload(self, value: T) -> bytes: if self.validate: @@ -102,6 +103,8 @@ class DocumentDefinition(Generic[T]): return value def catalog_entry(self) -> CultCacheSchemaCatalogEntry: + if self._catalog_entry is not None: + return self._catalog_entry schema_id = self.schema_id or self.type schema_name = self.schema_name or self.type schema_version = self.schema_version or f"{schema_name}.v1" @@ -127,7 +130,7 @@ class DocumentDefinition(Generic[T]): separators=(",", ":"), ) compatible_schema_ids = self.compatible_schema_ids or (schema_id,) - return CultCacheSchemaCatalogEntry( + catalog_entry = CultCacheSchemaCatalogEntry( schema_id=schema_id, schema_name=schema_name, schema_version=schema_version, @@ -136,6 +139,8 @@ class DocumentDefinition(Generic[T]): compatible_schema_ids=tuple(compatible_schema_ids), members=tuple(self.members), ) + object.__setattr__(self, "_catalog_entry", catalog_entry) + return catalog_entry def define_document_type( diff --git a/packages/cultcache-py/tests/test_cultcache.py b/packages/cultcache-py/tests/test_cultcache.py index 00fa72bb..15c2ab66 100644 --- a/packages/cultcache-py/tests/test_cultcache.py +++ b/packages/cultcache-py/tests/test_cultcache.py @@ -190,6 +190,21 @@ class CultCacheTests(unittest.TestCase): self.assertEqual(msgpack.unpackb(payload, raw=False), ["ash", None, 3]) self.assertEqual(document.decode_payload(msgpack.packb(["ash"], use_bin_type=True)).retries, 0) + def test_document_catalog_entry_is_cached_after_first_derivation(self) -> None: + document = define_database_entry_type( + "settings", + [ + ("theme", 0), + ("retries", 2, 0), + ], + ) + + first = document.catalog_entry() + second = document.catalog_entry() + + self.assertIs(first, second) + self.assertEqual([member.slot for member in first.members], [0, 2]) + def test_messagepack_store_writes_v1_snapshot(self) -> None: try: import msgpack # type: ignore