From e78d479c1463e63103353720d4a89452d36fd848 Mon Sep 17 00:00:00 2001 From: Andrew Mulbrook Date: Sun, 15 Mar 2026 20:48:43 -0500 Subject: [PATCH] Add tree data object --- trovedb/tree.py | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 trovedb/tree.py diff --git a/trovedb/tree.py b/trovedb/tree.py new file mode 100644 index 0000000..d4adc00 --- /dev/null +++ b/trovedb/tree.py @@ -0,0 +1,37 @@ +""" +tree.py — Tree object interface for Trove. + +A tree is a named mapping of entries to UUIDs, serialized as UTF-8 JSON. +Corresponds to a 'tree' row in the objects table; this class handles +only the data field — storage is the caller's concern. +""" + +import json + + +class Tree: + def __init__(self, data: bytes | None = None): + """ + Initialize a Tree. If data is provided, deserialize from UTF-8 JSON bytes. + An empty Tree is created if data is None. + """ + if data is None: + self._entries: dict[str, str] = {} + else: + self._entries = json.loads(data.decode("utf-8")) + + def serialize(self) -> bytes: + """Serialize the tree to UTF-8 JSON bytes.""" + return json.dumps(self._entries).encode("utf-8") + + def set_entry(self, name: str, uuid: str) -> None: + """Add or update an entry mapping name -> uuid.""" + self._entries[name] = uuid + + def rm_entry(self, name: str) -> None: + """Remove an entry by name. Raises KeyError if not found.""" + del self._entries[name] + + def list(self) -> dict[str, str]: + """Return a shallow copy of all entries as {name: uuid}.""" + return dict(self._entries)