ledger_entry: Improve error reporting for amount expressions.
This is going to become more important as amount expressions become more capable.
This commit is contained in:
		
							parent
							
								
									5463290f87
								
							
						
					
					
						commit
						4009c626d4
					
				
					 3 changed files with 30 additions and 5 deletions
				
			
		| 
						 | 
				
			
			@ -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
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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 =
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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')
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		
		Reference in a new issue