usawa

Signed, immutable accounting.
Log | Files | Refs | Submodules | LICENSE

commit 6778818f21d28e73f8068fdff505c54c56004b57
parent c8acc262fa7732872aacd9446b39b65b6e04dc88
Author: lash <dev@holbrook.no>
Date:   Sun, 17 May 2026 17:30:44 -0600

Add entry linking to serializations

Diffstat:
Mdummy/tests/entry.py | 2++
Mdummy/tests/link.py | 12++++++++++++
Mdummy/usawa/entry.py | 27+++++++++++++++++++++++----
3 files changed, 37 insertions(+), 4 deletions(-)

diff --git a/dummy/tests/entry.py b/dummy/tests/entry.py @@ -30,8 +30,10 @@ class TestEntry(unittest.TestCase): o.add_part(dst) s = o.serialize() + logg.debug('serialized first {}'.format(s.hex())) o = Entry.deserialize(s) ss = o.serialize() + logg.debug('serialized second {}'.format(ss.hex())) self.assertEqual(s, ss) diff --git a/dummy/tests/link.py b/dummy/tests/link.py @@ -72,5 +72,17 @@ class TestLink(unittest.TestCase): self.assertEqual(r[1], 666) + def test_entry_serialize(self): + uu = uuid.uuid4() + entry_a = Entry(serial=42, tx_date=datetime.datetime.now(datetime.UTC), ref=str(uu)) + entry_b = Entry(serial=666, tx_date=datetime.datetime.now(datetime.UTC)) + self.linker.link_to(entry_a, entry_b) + v = entry_a.serialize(linker=self.linker) + linker = EntryLink(self.ledger) + o = Entry.deserialize(v, linker=linker) + v = linker.get(o) + self.assertEqual(v, str(uu)) + + if __name__ == '__main__': unittest.main() diff --git a/dummy/usawa/entry.py b/dummy/usawa/entry.py @@ -391,7 +391,7 @@ class Entry(UsawaElement): :rtype: list :todo: Add time component to entry. """ - def to_list(self): + def to_list(self, linker=None): debit = [] credit = [] attach = [] @@ -407,6 +407,13 @@ class Entry(UsawaElement): if self.tags: tags = self.tags + link = None + if linker != None: + link = linker.get(self) + if link != None: + link = uuid.UUID(link) + link = link.bytes + base = super(Entry, self).serialize() logg.debug('serializing with parent {}'.format(self.parent.hex())) d = [ @@ -422,6 +429,7 @@ class Entry(UsawaElement): attach, tags.serialize(), self.extref, + link, ] return d @@ -431,8 +439,8 @@ class Entry(UsawaElement): :returns: String representation of the entry, in rencode format. :rtype: str """ - def serialize(self): - b = self.to_list() + def serialize(self, linker=None): + b = self.to_list(linker=linker) return rencode.dumps(b) @@ -444,11 +452,18 @@ class Entry(UsawaElement): :rtype: usawa.Entry """ @staticmethod - def deserialize(data, unitindex=None, store=None): + def deserialize(data, unitindex=None, store=None, linker=None): v = rencode.loads(data) parent = v[1] serial = v[2] ref = v[3].decode('utf-8') + link = None + try: + link = uuid.UUID(bytes=v[12]) + except IndexError: + pass + except TypeError: + pass extref = None try: extref = v[11] @@ -494,6 +509,10 @@ class Entry(UsawaElement): for v in attach_data: asset = Asset(digest=v) o.attach(asset) + + if link != None: + if linker != None: + linker.link(o, link_uuid=str(link)) logg.debug('deserialized entry {}'.format(o))