commit 7f577b7fcd33cd43c41f2ab92a557e943664161e
parent 2b73cb3557674af04ea66dd1bfe52f3f0039ea2e
Author: lash <dev@holbrook.no>
Date: Sat, 10 Jan 2026 07:56:17 +0100
Add populated ledger generator tool
Diffstat:
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()