diff --git a/beangulp/importers/csvbase.py b/beangulp/importers/csvbase.py index f2bb6d6..3bb042e 100644 --- a/beangulp/importers/csvbase.py +++ b/beangulp/importers/csvbase.py @@ -144,17 +144,22 @@ class Amount(Column): subs: Dictionary mapping regular expression patterns to replacement strings. Substitutions are performed with re.sub() in the order they are specified. + negate: If true, negate the amount. default: Value to return if the field is empty, if specified. """ - def __init__(self, name, subs=None, default=NA): + def __init__(self, name, subs=None, negate=False, default=NA): super().__init__(name, default=default) self.subs = subs if subs is not None else {} + self.negate = negate def parse(self, value): for pattern, replacement in self.subs.items(): value = re.sub(pattern, replacement, value) - return decimal.Decimal(value) + parsed = decimal.Decimal(value) + if self.negate: + parsed = -parsed + return parsed # The CSV Importer class needs to inherit from beangulp.Importer which diff --git a/beangulp/importers/csvbase_test.py b/beangulp/importers/csvbase_test.py index ea64de0..bfb9597 100644 --- a/beangulp/importers/csvbase_test.py +++ b/beangulp/importers/csvbase_test.py @@ -151,6 +151,13 @@ def test_default_value_none(self): value = func(('', )) self.assertIsNone(value) + def test_parse_negate(self): + column = Amount(0, negate=True) + func = column.getter(None) + value = func(('123.45', )) + self.assertIsInstance(value, decimal.Decimal) + self.assertEqual(value, -decimal.Decimal('123.45')) + class TestCSVMeta(unittest.TestCase):