commit a860f21b3d70eee07426fac683ee0b8f3a4e4b5f
parent f707050d8a67ebf9825035ebf1243a0d4ed3fc5c
Author: lash <dev@holbrook.no>
Date: Tue, 6 Jan 2026 16:54:36 +0100
Fix double float parse for amount, add unitindex tests
Diffstat:
4 files changed, 71 insertions(+), 7 deletions(-)
diff --git a/dummy/tests/unit.py b/dummy/tests/unit.py
@@ -0,0 +1,50 @@
+import unittest
+
+from usawa import UnitIndex
+
+
+class TestUnit(unittest.TestCase):
+
+ def setUp(self):
+ self.uidx_default = UnitIndex('FOO')
+ self.uidx_three = UnitIndex('FOO', precision=3)
+ self.uidx_none = UnitIndex('FOO', precision=0)
+ self.uidx_default.add('BAR', precision=4, ex=0.2)
+
+
+ def test_tostring(self):
+ v = self.uidx_default.to_floatstring('FOO', 12345)
+ self.assertEqual(v, '123.45')
+ v = self.uidx_three.to_floatstring('FOO', 12345)
+ self.assertEqual(v, '12.345')
+ v = self.uidx_three.to_floatstring('FOO', 123)
+ self.assertEqual(v, '0.123')
+ v = self.uidx_three.to_floatstring('FOO', 1)
+ self.assertEqual(v, '0.001')
+ v = self.uidx_none.to_floatstring('FOO', 12345)
+ self.assertEqual(v, '12345')
+ v = self.uidx_none.to_floatstring('FOO', 123)
+ self.assertEqual(v, '123')
+ v = self.uidx_default.to_floatstring('BAR', 12345)
+ self.assertEqual(v, '1.2345')
+
+
+ def test_fromstring(self):
+ v = self.uidx_default.from_floatstring('FOO', '123.45')
+ self.assertEqual(v, 12345)
+ v = self.uidx_three.from_floatstring('FOO', '12.345')
+ self.assertEqual(v, 12345)
+ v = self.uidx_three.from_floatstring('FOO', '0.123')
+ self.assertEqual(v, 123)
+ v = self.uidx_three.from_floatstring('FOO', '0.001')
+ self.assertEqual(v, 1)
+ v = self.uidx_none.from_floatstring('FOO', '12345')
+ self.assertEqual(v, 12345)
+ v = self.uidx_none.from_floatstring('FOO', '123')
+ self.assertEqual(v, 123)
+ v = self.uidx_default.from_floatstring('BAR', '1.2345')
+ self.assertEqual(v, 12345)
+
+
+if __name__ == '__main__':
+ unittest.main()
diff --git a/dummy/usawa/entry.py b/dummy/usawa/entry.py
@@ -75,6 +75,7 @@ class EntryPart:
o = etree.Element('amount')
o.text = str(self.amount)
+ logg.debug('tree amount {}'.format(o.text))
part.append(o)
tree.append(part)
diff --git a/dummy/usawa/runnable/add.py b/dummy/usawa/runnable/add.py
@@ -20,8 +20,9 @@ class Context:
self.uidx = None
self.ref = None
self.description = None
- self.src = [None, None, None]
- self.dst = [None, None, None]
+ self.src = [None, None]
+ self.dst = [None, None]
+ self.amount = None
self.part = []
@@ -40,8 +41,11 @@ class Context:
ctx.src[1] = args.src_account
ctx.dst[0] = args.dst_type
ctx.dst[1] = args.dst_account
+ if args.amount != None:
+ ctx.amount = args.amount
return ctx
+
def validate(self):
for v in self.src:
if v == None:
@@ -88,6 +92,7 @@ argp.add_argument('-i', action='store_true', help='interactive edit')
argp.add_argument('-r', type=str, help='external reference')
argp.add_argument('-s', type=str, dest='src_account', default='general', help='source account')
argp.add_argument('-t', type=str, dest='dst_account', default='general', help='destination account')
+argp.add_argument('-a', type=str, dest='amount', help='source and destination amount')
argp.add_argument('--src-type', dest='src_type', type=str, choices=CATEGORIES, default='expense', help='source type')
argp.add_argument('--dst-type', dest='dst_type', type=str, choices=CATEGORIES, default='asset', help='dest type')
argp.add_argument('-d', '--description', type=str, help='interactive edit')
@@ -127,13 +132,12 @@ def do_interactive(ctx):
o[k][1] = parse_account(v)
if amount != None:
- amount *= -1.0
+ amount *= -1
else:
- v = input_or_default('Entry {} amount'.format(k))
+ v = input_or_default('Entry {} amount'.format(k), ctx.amount)
amount = parse_amount(uidx, ctx.unit, v)
- o[k][2] = amount
- ctx.part.append(EntryPart(o[k][0], o[k][1], o[k][2]))
+ ctx.part.append(EntryPart(o[k][0], o[k][1], amount))
ctx.ref = input_or_default('External ref', ctx.ref)
return ctx
diff --git a/dummy/usawa/unit.py b/dummy/usawa/unit.py
@@ -9,6 +9,9 @@ BASE_UNIT = 'BTC'
class UnitIndex:
+
+ default_precision = 2
+
"""UnitIndex holds metadata for units of account.
Specifically, it defines an exchange rate aswell as decimal precision.
@@ -138,7 +141,13 @@ class UnitIndex:
if l < c:
ss = '0' * c
s = '0' + ss[:c-l] + s
- r = s[:i] + '.' + s[i:]
+
+ v = s[:i]
+ r = s[i:]
+ if self.detail[sym] > 0:
+ if len(v) == 0:
+ v = '0'
+ r = v + '.' + s[i:]
if neg:
r = '-' + r
return r