Changeset - 4009c626d4cb
[Not reviewed]
0 3 0
Brett Smith - 5 years ago 2019-07-29 16:05:51
brettcsmith@brettcsmith.org
ledger_entry: Improve error reporting for amount expressions.

This is going to become more important as amount expressions become more
capable.
3 files changed with 30 insertions and 5 deletions:
0 comments (0 inline, 0 general)
import2ledger/hooks/ledger_entry.py
Show inline comments
...
 
@@ -168,11 +168,17 @@ class AccountSplitter:
 
    def _build_amounts(self, template_vars):
 
        amount_vars = {k: v for k, v in template_vars.items() if isinstance(v, decimal.Decimal)}
 
        amount_vars['Decimal'] = decimal.Decimal
 
        amounts = [
 
            (account, self._currency_decimal(eval(amount_expr, amount_vars),
 
                                             template_vars['currency']))
 
            for account, amount_expr in self.splits
 
        ]
 
        try:
 
            amounts = [
 
                (account, self._currency_decimal(eval(amount_expr, amount_vars),
 
                                                 template_vars['currency']))
 
                for account, amount_expr in self.splits
 
            ]
 
        except (ArithmeticError, NameError, TypeError, ValueError) as error:
 
            raise errors.UserInputConfigurationError(
 
                "{}: {}".format(type(error).__name__, error),
 
                "template {!r}".format(self.template_name)
 
            ) from error
 
        self._balance_amounts(amounts, template_vars['amount'])
 
        self._balance_amounts(amounts, -template_vars['amount'])
 
        return amounts
tests/data/templates.ini
Show inline comments
...
 
@@ -53,6 +53,16 @@ template =
 
 Expenses:Banking Fees  (6 if {amount} > 50 else 3)
 
 Income:Sales  -{amount}
 

	
 
[NondecimalWord]
 
template =
 
 Income:Sales  -5
 
 Assets:Cash   foo
 

	
 
[NondecimalVariable]
 
template =
 
 Income:Sales  -5
 
 Assets:Cash   {payee}
 

	
 
[Empty]
 
template =
 

	
tests/test_hook_ledger_entry.py
Show inline comments
...
 
@@ -259,3 +259,12 @@ def test_hook_handles_template_undefined():
 
    entry_data = template_vars('DD', 1)
 
    assert not run_hook(entry_data, 'Nonexistent')
 

	
 
def test_string_value_is_user_error():
 
    entry_data = template_vars('EE', 1)
 
    with pytest.raises(errors.UserInputConfigurationError):
 
        run_hook(entry_data, 'NondecimalWord')
 

	
 
def test_string_variable_is_user_error():
 
    entry_data = template_vars('FF', 1)
 
    with pytest.raises(errors.UserInputConfigurationError):
 
        run_hook(entry_data, 'NondecimalVariable')
0 comments (0 inline, 0 general)