usawa

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

commit 7f577b7fcd33cd43c41f2ab92a557e943664161e
parent 2b73cb3557674af04ea66dd1bfe52f3f0039ea2e
Author: lash <dev@holbrook.no>
Date:   Sat, 10 Jan 2026 07:56:17 +0100

Add populated ledger generator tool

Diffstat:
M.gitignore | 1+
Mdummy/present.xsl | 12++++++------
Mdummy/usawa/ledger.py | 3++-
Mdummy/usawa/runnable/add.py | 26+++++++++++++++-----------
Mdummy/usawa/runnable/view.py | 28++++++++++++++++++++++++++++
Mdummy/usawa/store.py | 1-
6 files changed, 52 insertions(+), 19 deletions(-)

diff --git a/.gitignore b/.gitignore @@ -2,3 +2,4 @@ __pycache__ *.egg-info .state +_build diff --git a/dummy/present.xsl b/dummy/present.xsl @@ -1,20 +1,20 @@ <?xml version="1.0"?> -<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fn="http://www.w3.org/2005/xpath-functions"> +<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fn="http://www.w3.org/2005/xpath-functions" xmlns:df="http://usawa.defalsify.org/"> <xsl:template match="/"> <html> <head> <title>Accounting</title> </head> <body> - <xsl:apply-templates select="ledger" /> + <xsl:apply-templates select="df:ledger" /> </body> </html> </xsl:template> - <xsl:template match="/ledger"> - <p>Documento recuperado: <xsl:value-of select="retrieved" /> from <xsl:value-of select="src" /></p> - <xsl:for-each select="entry"> - <p><xsl:value-of select="data/serial" />:<xsl:value-of select="data/date" />:<xsl:value-of select="data/ref" /></p> + <xsl:template match="/df:ledger"> + <p>Documento recuperado: <xsl:value-of select="df:retrieved" /> from <xsl:value-of select="df:src" /></p> + <xsl:for-each select="df:entry"> + <p><xsl:value-of select="df:data/df:serial" />:<xsl:value-of select="df:data/df:date" />:<xsl:value-of select="df:data/df:ref" /></p> </xsl:for-each> </xsl:template> diff --git a/dummy/usawa/ledger.py b/dummy/usawa/ledger.py @@ -387,7 +387,8 @@ class Ledger: self.entries[entry.serial].append(entry) self.running[entry.unit].apply_entry(entry) if self.tree != None and modify_tree: - self.tree.append(entry.to_tree()) + entry_tree = entry.to_tree() + self.tree.append(entry_tree) logg.debug('entryunit {} {}'.format(entry.unit, self.running[entry.unit])) diff --git a/dummy/usawa/runnable/add.py b/dummy/usawa/runnable/add.py @@ -26,6 +26,7 @@ class Context: self.dst = [None, None] self.amount = None self.part = [] + self.output = None self.f = None @@ -34,6 +35,15 @@ class Context: self.f.close() + def open(self, output): + if output == '<stdout>': + self.f = sys.stdout.buffer + logg.debug('output is stdout') + else: + self.f = open(output, 'wb') + return self + + @staticmethod def from_args(args): ctx = Context() @@ -159,13 +169,8 @@ def do_interactive(ctx): output = input_or_default('Output file', ctx.output) logg.debug('output {}'.format(output)) - if output == '<stdout>': - ctx.f = sys.stdout.buffer - logg.debug('output is stdout') - else: - ctx.f = open(output, 'wb') - return ctx - + return ctx.open(output) + if arg.i: ctx = do_interactive(ctx) @@ -175,7 +180,6 @@ entry = Entry(ctx.part[0], ctx.part[1], ctx.unit, ledger.serial, dt, parent=ledg entry.sign(wallet) store.add_entry(entry) ledger.add_entry(entry, modify_tree=True) -if ctx.output != None: - ledger.truncate() - ctx.f.write(ledger.to_string()) - ctx.close() +ledger.truncate() +ctx.f.write(ledger.to_string()) +ctx.close() diff --git a/dummy/usawa/runnable/view.py b/dummy/usawa/runnable/view.py @@ -20,11 +20,38 @@ class Context: def __init__(self): self.unit = None self.uidx = None + self.output = None + self.f = None + + + def close(self): + if self.f and self.f != sys.stdout: + self.f.close() + + + def open(self, output): + if output == '<stdout>': + self.f = sys.stdout.buffer + logg.debug('output is stdout') + else: + self.f = open(output, 'wb') + return self + + @staticmethod + def from_args(args): + ctx = Context() + if args.output != None: + ctx.output = os.path.realpath(args.output) + else: + ctx.output = '<stdout>' + return ctx argp = argparse.ArgumentParser() +argp.add_argument('-o', type=str, dest='output', help='output file for resulting XML document') argp.add_argument('ledger_xml_file', type=str, help='load ledger metadata from XML file') arg = argp.parse_args() +ctx = Context.from_args(arg) ledger = None ledger_tree = load(arg.ledger_xml_file) @@ -36,3 +63,4 @@ store = LedgerStore(db, ledger) pk = store.get_key() wallet = DemoWallet(privatekey=pk) store.load() +sys.stdout.buffer.write(ledger.to_string()) diff --git a/dummy/usawa/store.py b/dummy/usawa/store.py @@ -166,7 +166,6 @@ class LedgerStore(Interface): try: o = self.get_entry(self.ledger.serial) except FileNotFoundError: - self.ledger.reset() break self.ledger.add_entry(o, modify_tree=True) self.ledger.next_serial()