usawa

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

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:
Adummy/tests/unit.py | 50++++++++++++++++++++++++++++++++++++++++++++++++++
Mdummy/usawa/entry.py | 1+
Mdummy/usawa/runnable/add.py | 16++++++++++------
Mdummy/usawa/unit.py | 11++++++++++-
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