commit 355a2e1ce20918f522be69e3078d66fb9c754a9a
parent 8667fb450d48c880fc69de2f779fd45921f67829
Author: lash <dev@holbrook.no>
Date: Sat, 6 Dec 2025 19:19:31 +0000
Rehabilitate xml create and mirror ledger, entry imports
Diffstat:
7 files changed, 48 insertions(+), 106 deletions(-)
diff --git a/dummy/create.py b/dummy/create.py
@@ -1,12 +1,22 @@
import argparse
import datetime
+import logging
import lxml.etree
import confini
import nacl.signing
-from svcontas import Entry, DemoWallet, ACL, get_units, init_ledger
+from svcontas import Entry, EntryPart, DemoWallet, ACL, get_units, init_ledger
+logging.basicConfig(level=logging.DEBUG)
+logg = logging.getLogger()
+
+default_counter = {
+ 'income': 'asset',
+ 'asset': 'income',
+ 'expense': 'liability',
+ 'liability': 'expense',
+ }
seed = bytes.fromhex('2c26b46b68ffc68ff99b453c1d30413413422d706483bfa0f98a5e886266e7ae')
@@ -15,14 +25,18 @@ if __name__ == '__main__':
argp = argparse.ArgumentParser()
argp.add_argument('amount', type=str, help='value amount in decimal or whole units')
argp.add_argument('-t', type=str, choices=['income', 'expense', 'asset', 'liability'], default='income', help='delta type')
+ argp.add_argument('--counter', type=str, choices=['income', 'expense', 'asset', 'liability'], help='delta type')
argp.add_argument('-u', type=str, default='USD', help='unit of account')
argp.add_argument('-r', type=str, help='reference')
argp.add_argument('-p', type=str, help='parent')
argp.add_argument('-a', type=str, default='Miscellaneous', help='account')
argp.add_argument('--date', type=lambda d: datetime.date.fromisoformat(d), default=str(now.date()), help='date of transaction')
- argp.add_argument('--xml-file', dest='xml_file', type=str, default='running.xml', help='xml file to manipulate')
+ argp.add_argument('--xml-file', dest='xml_file', type=str, default='empty.xml', help='xml file to manipulate')
arg = argp.parse_args()
+ counter = arg.counter
+ if counter == None:
+ counter = default_counter[arg.t]
tree = lxml.etree.parse(arg.xml_file)
root = tree.getroot()
units = get_units(root)
@@ -31,10 +45,13 @@ if __name__ == '__main__':
fakepub = bytes.fromhex('7d865e959b2466918c9863afca942d0fb89d7c9ac0c99bafc3749504ded97730')
acl.add(wallet.pubkey(), 1, label='foo')
ledger = init_ledger(root, units, acl=acl)
-
- amount = units.from_floatstring(arg.u, arg.amount, allow_negative=False)
+
+ amount = units.from_floatstring(arg.u, arg.amount)
+ src = EntryPart(arg.t, arg.a, amount, src=True)
+ dst = EntryPart(counter, arg.a, amount)
+ #amount = units.from_floatstring(arg.u, arg.amount, allow_negative=False)
- entry = Entry(arg.t, amount, arg.u, ledger.state.serial + 1, arg.a, arg.date, parent=ledger.state.base)
+ entry = Entry(src, dst, arg.u, ledger.serial + 1, arg.date, parent=ledger.base)
entry.sign(wallet)
ledger.add_entry(entry)
tree = ledger.to_tree()
diff --git a/dummy/empty.xml b/dummy/empty.xml
@@ -1,6 +1,7 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<ledger xmlns="http://svcontas.defalsify.org">
+<ledger xmlns="http://svcontas.defalsify.org/">
+ <topic>fca5eb40383af54fb270283251683f97f8804f35036264bb657e72f1d53b6bcf6afc532b02d2216dff01a2df69f5515c887833b98ed15a8bc6433fb28c5b4834</topic>
<retrieved>2025-11-02T13:09:55Z</retrieved>
<src>playalastunas.org</src>
<units base="BTC">
diff --git a/dummy/running.xml b/dummy/running.xml
@@ -1,6 +1,5 @@
-<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-
-<ledger>
+<?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>
@@ -18,56 +17,25 @@
<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">
+ <virt unit="USD">
<income>4213</income>
<expense>77718</expense>
<asset>11400</asset>
<liability>22284</liability>
</virt>
- <virt symbol="BTC">
+ <virt unit="BTC">
<income>3249191</income>
<expense>0</expense>
<asset>3249191</asset>
<liability>0</liability>
</virt>
+ <digest algo="sha512">b5bb9d8014a0f9b1d61e21e796d78dccdf1352f23cd32812f4850b878ae4944cb5bb9d8014a0f9b1d61e21e796d78dccdf1352f23cd32812f4850b878ae4944c</digest>
+ <sig type="ed25519" keyid="58851ae2166b3f1454193e0a7e821402dd1c1a91">1f74a9c0196a025f27d4e940c4abedfa2d37504f268aea359659cb65b85bd4d7974369507950006964c93391d3d4580ab8064f6d30a62908468ef771be952e95</sig>
+ <sig type="ed25519" keyid="566c38287d3f31c7e50836cae58e426c6bccc52d">117a57c72ed210b91469307a1c2e73fe2d5ee306cd8ccf1a9db4ecb15d38ecbbfc97d62fec4ab8aadb08c531f2d1ede34cb6e4d3987bcba63322a0767e532e13</sig>
+
</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>
- <account>Donations</account>
- <description>Alice</description>
- <amount>524</amount>
- <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>
- <account>Construction</account>
- <description>Install AC</description>
- <amount>1000000</amount>
- </data>
- <sig type="ed25519" keyid="7d865e959b2466918c9863afca942d0fb89d7c9ac0c99bafc3749504ded97730">cc06808cbbee0510331aa97974132e8dc296aeb795be229d064bae784b0a87a5cf4281d82e8c99271b75db2148f08a026c1a60ed9cabdb8cac6d24242dac4063</sig>
- </entry>
-</ledger>
+<entry><dst type="income"><account>Miscellaneous</account><amount>12300</amount></dst><dst type="asset"><account>Miscellaneous</account><amount>12300</amount></dst><data><parent>b5bb9d8014a0f9b1d61e21e796d78dccdf1352f23cd32812f4850b878ae4944cb5bb9d8014a0f9b1d61e21e796d78dccdf1352f23cd32812f4850b878ae4944c</parent><ref>76bc9066-bc31-45c1-a897-5f9c890a0ca0</ref><serial>1</serial><unit>USD</unit><date>2025-12-06</date><dateTimeRegistered>2025-12-06T19:11:09Z</dateTimeRegistered></data><sig type="ed25519" keyid="34d26579dbb456693e540672cf922f52dde0d6532e35bf06be013a7c532f20e0">49ea917dcf6267b736daf4a61b9e919eaddfc57f6fbf101a81ebc4159795e0e4283b3d63baf64db40e886dcae5ef0dc735b666c81926da15db8fedf36ece3509</sig></entry></ledger>
diff --git a/dummy/svcontas/crypto.py b/dummy/svcontas/crypto.py
@@ -85,6 +85,9 @@ class ACL:
for k in self.axx.values():
v = k[0]
if not binary:
- v = v.hex()
+ try:
+ v = v.hex()
+ except AttributeError:
+ v = self.axx[self.rev[v]][0]
r.append(v)
return r
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(o.find('src', namespaces=nsmap()), src=True)
- dst = EntryPart.from_tree(o.find('dst', namespaces=nsmap()), src=True)
+ src = EntryPart.from_tree(tree.find('src', namespaces=nsmap()), src=True)
+ dst = EntryPart.from_tree(tree.find('dst', namespaces=nsmap()))
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
@@ -186,6 +186,7 @@ class Ledger:
valid_keys = list(entry.sigs.keys())
else:
valid_keys = list(self.acl.pubkeys(binary=False))
+ logg.debug('testing valid keys {}'.format(valid_keys))
for k in valid_keys:
b = bytes.fromhex(k)
try:
diff --git a/dummy/tests/test.xml b/dummy/tests/test.xml
@@ -1,5 +1,4 @@
-<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-
+<?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>
@@ -18,72 +17,25 @@
<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">
+ <virt unit="USD">
<income>4213</income>
<expense>77718</expense>
<asset>11400</asset>
<liability>22284</liability>
</virt>
- <virt symbol="BTC">
+ <virt unit="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>
+ <digest algo="sha512">b5bb9d8014a0f9b1d61e21e796d78dccdf1352f23cd32812f4850b878ae4944cb5bb9d8014a0f9b1d61e21e796d78dccdf1352f23cd32812f4850b878ae4944c</digest>
+ <sig type="ed25519" keyid="58851ae2166b3f1454193e0a7e821402dd1c1a91">1f74a9c0196a025f27d4e940c4abedfa2d37504f268aea359659cb65b85bd4d7974369507950006964c93391d3d4580ab8064f6d30a62908468ef771be952e95</sig>
+ <sig type="ed25519" keyid="566c38287d3f31c7e50836cae58e426c6bccc52d">117a57c72ed210b91469307a1c2e73fe2d5ee306cd8ccf1a9db4ecb15d38ecbbfc97d62fec4ab8aadb08c531f2d1ede34cb6e4d3987bcba63322a0767e532e13</sig>
- </data>
- <sig type="ed25519" keyid="7d865e959b2466918c9863afca942d0fb89d7c9ac0c99bafc3749504ded97730">cc06808cbbee0510331aa97974132e8dc296aeb795be229d064bae784b0a87a5cf4281d82e8c99271b75db2148f08a026c1a60ed9cabdb8cac6d24242dac4063</sig>
- </entry>
-</ledger>
+ </incoming>
+<entry><src type="income"><account>Miscellaneous</account><amount>12300</amount></src><dst type="asset"><account>Miscellaneous</account><amount>12300</amount></dst><data><parent>b5bb9d8014a0f9b1d61e21e796d78dccdf1352f23cd32812f4850b878ae4944cb5bb9d8014a0f9b1d61e21e796d78dccdf1352f23cd32812f4850b878ae4944c</parent><ref>ae559408-7663-4289-ba95-e861751c05a7</ref><serial>1</serial><unit>USD</unit><date>2025-12-06</date><dateTimeRegistered>2025-12-06T19:18:46Z</dateTimeRegistered></data><sig type="ed25519" keyid="34d26579dbb456693e540672cf922f52dde0d6532e35bf06be013a7c532f20e0">5e9e43c246e7a34aa47c54844d044111b940addde3cf952a2d622c92641307ee4e859e301ebe80dea3e3bc59cce633fa4fed80fd2dcf9c54b05b01dfdd0fae0d</sig></entry></ledger>