usawa

Unnamed repository; edit this file 'description' to name the repository.
Info | Log | Files | Refs | Submodules | LICENSE

commit 77f049963f1d12afee1dce974778e04dab24dd6d
parent 4b20fb9466dc35da71a1ac43f79dfd79e72c004d
Author: lash <dev@holbrook.no>
Date:   Thu, 19 Feb 2026 18:28:53 -0600

Complete resolver based entries restore

Diffstat:
Mdummy/tests/resolver.py | 11++++++++---
Mdummy/usawa/entry.py | 9+++++----
Mdummy/usawa/ledger.py | 4++--
Mdummy/usawa/resolve/base.py | 13++++++++-----
4 files changed, 23 insertions(+), 14 deletions(-)

diff --git a/dummy/tests/resolver.py b/dummy/tests/resolver.py @@ -8,7 +8,7 @@ import datetime import lxml.etree -from usawa import Ledger, UnitIndex, Entry, EntryPart, DemoWallet +from usawa import Ledger, UnitIndex, Entry, EntryPart, DemoWallet, ACL from usawa.resolve.fs import FSResolver from usawa.error import VerifyError @@ -64,8 +64,8 @@ class TestResolver(unittest.TestCase): dst = EntryPart('FOO', 'asset', 'foo', 1337) src = EntryPart('FOO', 'income', 'foo', 1337, debit=True) entry = Entry(1, datetime.datetime.strptime('2025-11-11', '%Y-%m-%d'), parent=self.parent, tx_datereg=self.dtreg) - entry.add_part(src, debit=True) entry.add_part(dst) + entry.add_part(src, debit=True) entry.sign(wallet) first_entry_key = self.backend.put_entry(entry, 'sha512') ledger.add_entry(entry) @@ -73,8 +73,8 @@ class TestResolver(unittest.TestCase): dst = EntryPart('FOO', 'expense', 'bar̈́', 42, debit=True) src = EntryPart('FOO', 'liability', 'bar', 42) entry = Entry(ledger.peek(), datetime.datetime.now(), parent=ledger.current()) - entry.add_part(src, debit=True) entry.add_part(dst) + entry.add_part(src, debit=True) entry.sign(wallet) ledger.add_entry(entry) last_entry_key = self.backend.put_entry(entry, 'sha512') @@ -83,6 +83,11 @@ class TestResolver(unittest.TestCase): ledger.truncate(lookup='sha512') logg.debug('after trunc {}'.format(ledger.lookup)) + acl = ACL.from_wallet(wallet) + s = ledger.to_string(lookup='sha512') + logg.debug('ledgerstring {}'.format(s)) + ledger = ledger.from_string(s, acl=acl) + self.backend.restore_ledger(ledger) # tree = ledger.to_tree(lookup='sha512') diff --git a/dummy/usawa/entry.py b/dummy/usawa/entry.py @@ -286,8 +286,8 @@ class Entry: entry = Entry(serial, dt, ref=ref, parent=parent, tx_datereg=dtreg, description=description, unitindex=unitindex) src = EntryPart.from_tree(src_tree, debit=True) dst = EntryPart.from_tree(dst_tree) - entry.add_part(src, debit=True) entry.add_part(dst) + entry.add_part(src, debit=True) for v in o.findall('attachment', namespaces=nsmap()): asset = Asset.from_tree(v) @@ -336,8 +336,8 @@ class Entry: self.dtreg.strftime('%Y%m%d%H%M%S'), self.dt.strftime('%Y%m%d'), self.description, - debit, credit, + debit, attach, ] return d @@ -371,8 +371,8 @@ class Entry: date = datetime.datetime.strptime(v[4].decode('utf-8'), '%Y%m%d') #unit = v[5].decode('utf-8') description = v[5].decode('utf-8') - src_data = v[6] - dst_data = v[7] + dst_data = v[6] + src_data = v[7] attach_data = v[8] o = Entry(serial, date, ref=ref, description=description, parent=parent, tx_datereg=date_reg) for v in src_data: @@ -606,6 +606,7 @@ class Entry: def to_string(self, canon=False, lookup=None): tree = self.to_tree(canon=canon, lookup=lookup) + #return lxml.etree.canonicalize(tree).decode('utf-8') return lxml.etree.tostring(tree).decode('utf-8') diff --git a/dummy/usawa/ledger.py b/dummy/usawa/ledger.py @@ -465,8 +465,8 @@ class Ledger: :raises ValueError: When entry parent does not match ledger state. :raises VerifyError: When entry is missing valid signature. """ - def add_entry(self, entry): - if self.cur != entry.parent: + def add_entry(self, entry, check_parent=True): + if check_parent and self.cur != entry.parent: raise ValueError('entry parent {} does not match ledger state {}'.format(entry.parent.hex(), self.cur.hex())) self.check_sigs(entry) diff --git a/dummy/usawa/resolve/base.py b/dummy/usawa/resolve/base.py @@ -109,16 +109,19 @@ class BaseResolver: def restore_ledger(self, ledger, min=0): - lookup = self.get(ledger.lookup) + lookup = self.get(ledger.current()) while True: entry = Entry.from_string(lookup, ledger.uidx) if entry.serial == 0 or entry.serial < min: break + logg.debug('restore entry {} {}'.format(str(entry), lookup)) k = entry.parent + ledger.add_entry(entry, check_parent=False) if k == DEFAULTPARENT: break logg.debug('getting parent {}'.format(k.hex())) - v = self.get(k) - entry_nolookup = Entry.from_string(v, ledger.uidx) - lookup = self.get(entry_nolookup.lookup) - + lookup = self.get(k) + #v = self.get(k) + #logg.debug('getting parent {} {}'.format(k.hex(), v)) + #entry_nolookup = Entry.from_string(v, ledger.uidx) + #lookup = self.get(entry_nolookup.lookup)