commit 77f049963f1d12afee1dce974778e04dab24dd6d
parent 4b20fb9466dc35da71a1ac43f79dfd79e72c004d
Author: lash <dev@holbrook.no>
Date: Thu, 19 Feb 2026 18:28:53 -0600
Complete resolver based entries restore
Diffstat:
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)