commit 8667fb450d48c880fc69de2f779fd45921f67829
parent 933ecbb807e82c8593f4823de35e26d2e040a054
Author: lash <dev@holbrook.no>
Date: Sat, 6 Dec 2025 18:27:01 +0000
WIP update xml imports
Diffstat:
4 files changed, 113 insertions(+), 5 deletions(-)
diff --git a/dummy/svcontas/entry.py b/dummy/svcontas/entry.py
@@ -109,8 +109,8 @@ class Entry:
description = description.text
dt = datetime.date.fromisoformat(o.find('date', namespaces=nsmap()).text)
dtreg = datetime.datetime.strptime(o.find('dateTimeRegistered', namespaces=nsmap()).text, '%Y-%m-%dT%H:%M:%SZ')
- src = EntryPart.from_tree(tree.find('src', namespaces=nsmap()), src=True)
- dst = EntryPart.from_tree(tree.find('dst', namespaces=nsmap()))
+ src = EntryPart.from_tree(o.find('src', namespaces=nsmap()), src=True)
+ dst = EntryPart.from_tree(o.find('dst', namespaces=nsmap()), src=True)
r = Entry(src, dst, unit, serial, dt, ref=ref, parent=parent, tx_datereg=dtreg, description=description)
for sig in tree.iter(NSPREFIX + 'sig'):
diff --git a/dummy/svcontas/ledger.py b/dummy/svcontas/ledger.py
@@ -102,11 +102,16 @@ class Ledger:
return self.serial
- def reset(self, src='defalsify.org'):
+ def reset(self, src='defalsify.org', topic=None):
self.entries[self.uidx.base] = []
self.running[self.uidx.base] = RunningTotal(self.uidx.base, self.uidx)
self.tree = lxml.etree.XML('<ledger xmlns="http://svcontas.defalsify.org/" version="{}"></ledger>'.format(XML_FORMAT_VERSION))
#self.tree = lxml.etree.Element('ledger', nsmap=nsmap())
+ o = lxml.etree.SubElement(self.tree, NSPREFIX + 'topic', nsmap=nsmap())
+ if topic == None:
+ topic = os.urandom(64)
+ topic = topic.hex()
+ o.text = topic
o = lxml.etree.SubElement(self.tree, NSPREFIX + 'retrieved', nsmap=nsmap())
o.text = datetime.datetime.strftime(datetime.datetime.now(), '%Y-%m-%dT%H:%M:%SZ')
#self.tree.append(o)
@@ -189,7 +194,7 @@ class Ledger:
continue
wallet = DemoWallet(publickey=b)
v = entry.sum()
- r = wallet.verify(v, sig)
+ r = wallet.verify(v[0], sig)
have = True
logg.debug('having sig {}'.format(r.hex()))
return have
@@ -221,12 +226,15 @@ class Ledger:
@staticmethod
def from_tree(tree, unitindex, acl=None):
+ topic_node = tree.find('topic', namespaces=nsmap())
+ topic = bytes.fromhex(topic_node.text)
+
units = tree.find('units', namespaces=nsmap())
unit = units.get('base')
part = tree.find('incoming', namespaces=nsmap())
serial = int(part.get('serial'))
o = part.find('digest', namespaces=nsmap()).text # verify that is sha512
- r = Ledger(unitindex, tree=tree, acl=acl, serial=serial, base=bytes.fromhex(o))
+ r = Ledger(unitindex, topic=topic, tree=tree, acl=acl, serial=serial, base=bytes.fromhex(o))
for sig in part.iter(NSPREFIX + 'sig'):
keyid = sig.get('keyid')
diff --git a/dummy/tests/ledger.py b/dummy/tests/ledger.py
@@ -4,6 +4,7 @@ import unittest
import os
import copy
+import lxml.etree
from whee.mem import MemStore
from svcontas import Ledger, UnitIndex
@@ -26,6 +27,16 @@ class TestLedger(unittest.TestCase):
o = Ledger(uidx)
store = LedgerStore(self.store, ledger=o)
store.start()
+ print(o.to_string())
+
+
+ def test_ledger_xml(self):
+ uidx = UnitIndex('USD')
+
+ xml_file = os.path.join(testdir, 'test.xml')
+ tree = lxml.etree.parse(xml_file)
+ ledger = Ledger.from_tree(tree, uidx)
+
if __name__ == '__main__':
diff --git a/dummy/tests/test.xml b/dummy/tests/test.xml
@@ -0,0 +1,89 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+
+<ledger xmlns="http://svcontas.defalsify.org/">
+ <topic>fca5eb40383af54fb270283251683f97f8804f35036264bb657e72f1d53b6bcf6afc532b02d2216dff01a2df69f5515c887833b98ed15a8bc6433fb28c5b4834</topic>
+ <retrieved>2025-11-02T13:09:55Z</retrieved>
+ <src>playalastunas.org</src>
+ <units base="BTC">
+ <unit sym="USD">
+ <precision>2</precision>
+ <ex>10999310</ex>
+ </unit>
+ <unit sym="BTC">
+ <precision>8</precision>
+ <ex>1</ex>
+ </unit>
+ </units>
+ <resolver algo="sha256" proto="https">g33k.holbrook.no</resolver>
+ <identity keyid="f1d2d2f924e986ac86fdf7b36c94bcdf32beec15" didtype="web">nondominium.org/lash/</identity>
+ <identity keyid="f1d2d2f924e986ac86fdf7b36c94bcdf32beec15" didtype="web">holbrook.no</identity>
+ <incoming serial="231">
+ <digest algo="sha512">b5bb9d8014a0f9b1d61e21e796d78dccdf1352f23cd32812f4850b878ae4944cb5bb9d8014a0f9b1d61e21e796d78dccdf1352f23cd32812f4850b878ae4944c</digest>
+ <sig type='ed25519' keyid="58851ae2166b3f1454193e0a7e821402dd1c1a91">1f74a9c0196a025f27d4e940c4abedfa2d37504f268aea359659cb65b85bd4d7974369507950006964c93391d3d4580ab8064f6d30a62908468ef771be952e95</sig>
+ <sig type='ed25519' keyid="566c38287d3f31c7e50836cae58e426c6bccc52d">117a57c72ed210b91469307a1c2e73fe2d5ee306cd8ccf1a9db4ecb15d38ecbbfc97d62fec4ab8aadb08c531f2d1ede34cb6e4d3987bcba63322a0767e532e13</sig>
+ <real unit="BTC">
+ <asset>6323141</asset>
+ <liability>0</liability>
+ </real>
+ <virt symbol="USD">
+ <income>4213</income>
+ <expense>77718</expense>
+ <asset>11400</asset>
+ <liability>22284</liability>
+ </virt>
+ <virt symbol="BTC">
+ <income>3249191</income>
+ <expense>0</expense>
+ <asset>3249191</asset>
+ <liability>0</liability>
+ </virt>
+ </incoming>
+ <entry type="income">
+ <data>
+ <parent>b5bb9d8014a0f9b1d61e21e796d78dccdf1352f23cd32812f4850b878ae4944c</parent>
+ <ref>8bcc1c17-f920-4641-a268-83d12e700555</ref>
+ <serial>246</serial>
+ <unit>USD</unit>
+ <date>2025-11-01</date>
+ <dateTimeRegistered>2025-11-05T12:24:05Z</dateTimeRegistered>
+ <src>
+ <account>Income</account>
+ <description>Alice</description>
+ <amount>524</amount>
+ </src>
+ <dst>
+ <account>Donations</account>
+ <description>Alice</description>
+ <amount>524</amount>
+ </dst>
+ <attachment mime="image/jpeg">
+ <slug>troll</slug>
+ <description>The face of a troll</description>
+ <digest algo="sha512">777b30c8fc40aea3c717777831a05c9f29c7b6735f1573e9b0b55373c264f6f3777b30c8fc40aea3c717777831a05c9f29c7b6735f1573e9b0b55373c264f6f3</digest>
+ </attachment>
+ </data>
+ <sig type="ed25519" keyid="b5bb9d8014a0f9b1d61e21e796d78dccdf1352f23cd32812f4850b878ae4944c">0cf9180a764aba863a67b6d72f0918bc131c6772642cb2dce5a34f0a702f9470ddc2bf125c12198b1995c233c34b4afd346c54a2334c350a948a51b6e8b4e6b6</sig>
+ </entry>
+ <entry type="liability">
+ <data>
+ <parent>fa975b67586adb4ed8a937d383a0ef3eac3c06140253f94d2b563acada064c9f</parent>
+ <ref>7f6421434218e1a89ad69822e97d01017bd720cdfde1fa55673cb3133678b918</ref>
+ <serial>245</serial>
+ <unit>BTC</unit>
+ <date>2025-11-03</date>
+ <dateTimeRegistered>2025-11-05T12:24:05Z</dateTimeRegistered>
+ <src>
+ <account>Expenses</account>
+ <description>Install AC</description>
+ <amount>1000000</amount>
+ </src>
+ <dst>
+ <account>Construction</account>
+ <description>Install AC</description>
+ <amount>1000000</amount>
+ </dst>
+
+ </data>
+ <sig type="ed25519" keyid="7d865e959b2466918c9863afca942d0fb89d7c9ac0c99bafc3749504ded97730">cc06808cbbee0510331aa97974132e8dc296aeb795be229d064bae784b0a87a5cf4281d82e8c99271b75db2148f08a026c1a60ed9cabdb8cac6d24242dac4063</sig>
+ </entry>
+</ledger>