usawa

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

commit 01df1e54806b09d5aad99fc9d8d020cddd0db97d
parent 327b748e8bbaed71b1a24861f14260c567d94722
Author: lash <dev@holbrook.no>
Date:   Sun, 22 Mar 2026 21:36:55 -0600

Add asset index entry in store

Diffstat:
Mdummy/usawa/runnable/craft.py | 15++++++++-------
Mdummy/usawa/store.py | 12+++++++++++-
2 files changed, 19 insertions(+), 8 deletions(-)

diff --git a/dummy/usawa/runnable/craft.py b/dummy/usawa/runnable/craft.py @@ -54,7 +54,7 @@ class Context: if self.cfg.true('ACCOUNTS_STRICT'): self.accounts.lock() - self.entry = Entry.empty(ref=args.r) + self.entry = Entry.empty(ref=args.e) self.db = None if self.cfg.get('STORE_TYPE') == 'valkey': dbid = self.cfg.get('VALKEY_ID') @@ -62,7 +62,7 @@ class Context: port = self.cfg.get('VALKEY_PORT') self.db = ValkeyStore('', host=host, port=port) self.store = EntryStore(self.db) - if args.r: + if args.e: self.entry = self.store.get_draft(self.entry) self.state = 1 else: @@ -120,7 +120,9 @@ class Context: argp = argparse.ArgumentParser() -argp.add_argument('-r', type=str, help='entry unique reference') +argp.add_argument('-e', type=str, help='unique reference of entry') +argp.add_argument('-x', type=str, help='unique reference of attachment') +argp.add_argument('-z', type=str, help='sum of attachment') argp.add_argument('-v', type=str, choices=['info','debug','warning','error'], help='be verbose') argp.add_argument('-c', type=str, help='override config dir') argp.add_argument('-l', type=str, help='ledger file') @@ -133,8 +135,6 @@ if args.v: ctx = Context(args) - - def input_or_default(prompt, default=None, postfix=': ', validate_fn=None): if default != None: postfix = ' [{}]'.format(default) + postfix @@ -191,14 +191,15 @@ def do_interactive(ctx): #return ctx.open(output) entry = None -if ctx.state == 0: +if self.cmd == 'entry': do_interactive(ctx) ctx.validate() entry = Entry.empty(description=ctx.description, ref=ctx.ref, unitindex=ctx.uidx) entry.add_part(ctx.part[0], debit=True) entry.add_part(ctx.part[1]) -else: entry = ctx.entry +elif self.cmd == 'asset': + ctx.store.put_draft(entry) print(entry) diff --git a/dummy/usawa/store.py b/dummy/usawa/store.py @@ -16,6 +16,7 @@ PFX_LEDGER_LOCK = b'\x03' PFX_ENTRY = b'\x04' PFX_UNIT_INDEX = b'\x08' PFX_ASSET = b'\x10' +PFX_ASSET_INDEX = b'\x11' logg = logging.getLogger('usawa.store') @@ -105,6 +106,12 @@ def pfx_asset(asset): return PFX_ASSET + asset.get_digest(binary=True) +def pfx_asset_index(asset): + if not isinstance(asset, Asset): + raise ValueError('invalid asset') + return PFX_ASSET_INDEX + asset.get_ref(binary=True) + + class BaseStore(Interface): def __init__(self, implementation): @@ -201,7 +208,7 @@ class EntryStore(BaseStore): i += 1 return entry -class LedgerStore(KeyStore): +class LedgerStore(EntryStore, KeyStore): """Wrapper for an implementation of the whee store that handles encoding of ledgers and entries. :param implementation: Store implementation. @@ -306,6 +313,9 @@ class LedgerStore(KeyStore): k = pfx_asset(asset) v = asset.serialize() self.db.put(k, v) + v = k + k = pfx_asset_index(asset) + self.db.put(k, v) """Restore an entry attachment asset from the store.