From f1a47aaed402252d0b2399e6898a3b1402938b39 Mon Sep 17 00:00:00 2001 From: evilchili Date: Fri, 3 Oct 2025 12:03:21 -0700 Subject: [PATCH] Make pointer serialization idempotent --- src/grung/types.py | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/src/grung/types.py b/src/grung/types.py index d929524..cda5f6b 100644 --- a/src/grung/types.py +++ b/src/grung/types.py @@ -130,14 +130,19 @@ class Pointer(Field): name: str = "" value_type: type = Record - def serialize(self, value: value_type) -> str: + def serialize(self, value: value_type | str) -> str: return Pointer.reference(value) def deserialize(self, value: str, db: TinyDB, recurse: bool = True) -> value_type: return Pointer.dereference(value, db, recurse) @classmethod - def reference(cls, value: Record): + def reference(cls, value: Record | str): + # XXX This could be smarter + if isinstance(value, str): + if '::' not in value: + raise PointerReferenceError("Value {value} does not look like a reference!") + return value if value: if not value.doc_id: raise PointerReferenceError(value) @@ -196,7 +201,7 @@ class Collection(Field): for member in record[self.name]: target = Pointer.dereference(member, db=db, recurse=False) for backref in target._metadata.backrefs(type(record)): - target[backref.name] = Pointer.reference(record) - db.table(target._metadata.table).update( - {backref.name: target[backref.name]}, where("uid") == target.uid - ) + target[backref.name] = record + db.save(target) + +