template: render() takes a single mapping argument.
This lets it receive other mapping types like ChainMap.
This commit is contained in:
parent
1b98ab2015
commit
34b71baaf7
3 changed files with 51 additions and 26 deletions
4
CODE.rst
4
CODE.rst
|
@ -61,8 +61,8 @@ Templates receive entry data dicts and format them into final output entries.
|
|||
``__init__(template_str)``
|
||||
Initializes the template from a single string, as read from the user's configuration.
|
||||
|
||||
``render(payee, amount, currency, date=None, **template_vars)``
|
||||
Returns a string with the output entry, using the given entry data. This is expected to be called as ``render(**entry_data)``; the arguments take the same types as entry data dicts.
|
||||
``render(entry_data)``
|
||||
Returns a string with the output entry, using the given entry data.
|
||||
|
||||
Loading importers and hooks
|
||||
---------------------------
|
||||
|
|
|
@ -247,19 +247,23 @@ class Template:
|
|||
else:
|
||||
self.splitter.set_metadata(str_flat)
|
||||
|
||||
def render(self, payee, amount, currency, date=None, **template_vars):
|
||||
if date is None:
|
||||
def render(self, template_vars):
|
||||
# template_vars must have these keys. Raise a KeyError if not.
|
||||
template_vars['currency']
|
||||
template_vars['payee']
|
||||
try:
|
||||
date = template_vars['date']
|
||||
except KeyError:
|
||||
date = datetime.date.today()
|
||||
template_vars.update(
|
||||
date=date.strftime(self.date_fmt),
|
||||
payee=payee,
|
||||
amount=strparse.currency_decimal(amount),
|
||||
currency=currency,
|
||||
)
|
||||
render_vars = {
|
||||
'amount': strparse.currency_decimal(template_vars['amount']),
|
||||
'date': date.strftime(self.date_fmt),
|
||||
}
|
||||
for key, value in template_vars.items():
|
||||
if key.endswith('_date'):
|
||||
template_vars[key] = value.strftime(self.date_fmt)
|
||||
return ''.join(f(template_vars) for f in self.format_funcs)
|
||||
render_vars[key] = value.strftime(self.date_fmt)
|
||||
all_vars = collections.ChainMap(render_vars, template_vars)
|
||||
return ''.join(f(all_vars) for f in self.format_funcs)
|
||||
|
||||
def is_empty(self):
|
||||
return not self.format_funcs
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
import collections
|
||||
import configparser
|
||||
import datetime
|
||||
import decimal
|
||||
|
@ -17,8 +18,20 @@ with pathlib.Path(DATA_DIR, 'templates.ini').open() as conffile:
|
|||
def template_from(section_name, *args, **kwargs):
|
||||
return template.Template(config[section_name]['template'], *args, **kwargs)
|
||||
|
||||
def template_vars(payee, amount, currency='USD', date=DATE, other_vars=None):
|
||||
call_vars = {
|
||||
'amount': decimal.Decimal(amount),
|
||||
'currency': currency,
|
||||
'date': date,
|
||||
'payee': payee,
|
||||
}
|
||||
if other_vars is None:
|
||||
return call_vars
|
||||
else:
|
||||
return collections.ChainMap(call_vars, other_vars)
|
||||
|
||||
def assert_easy_render(tmpl, entity, amount, currency, expect_date, expect_amt):
|
||||
rendered = tmpl.render(entity, decimal.Decimal(amount), currency, DATE)
|
||||
rendered = tmpl.render(template_vars(entity, amount, currency))
|
||||
lines = [normalize_whitespace(s) for s in rendered.splitlines()]
|
||||
assert lines == [
|
||||
"",
|
||||
|
@ -42,17 +55,17 @@ def test_currency_formatting():
|
|||
|
||||
def test_empty_template():
|
||||
tmpl = template.Template("\n \n")
|
||||
assert tmpl.render('BB', decimal.Decimal('8.99'), 'USD', DATE) == ''
|
||||
assert tmpl.render(template_vars('BB', '8.99')) == ''
|
||||
assert tmpl.is_empty()
|
||||
|
||||
def test_complex_template():
|
||||
template_vars = {
|
||||
render_vars = template_vars('TT', '125.50', other_vars={
|
||||
'entity': 'T-T',
|
||||
'program': 'Spectrum Defense',
|
||||
'txid': 'ABCDEF',
|
||||
}
|
||||
})
|
||||
tmpl = template_from('Complex', date_fmt='%Y-%m-%d', signed_currencies=['USD'])
|
||||
rendered = tmpl.render('TT', decimal.Decimal('125.50'), 'USD', DATE, **template_vars)
|
||||
rendered = tmpl.render(render_vars)
|
||||
lines = [normalize_whitespace(s) for s in rendered.splitlines()]
|
||||
assert lines == [
|
||||
"",
|
||||
|
@ -70,7 +83,7 @@ def test_complex_template():
|
|||
|
||||
def test_balancing():
|
||||
tmpl = template_from('FiftyFifty')
|
||||
rendered = tmpl.render('FF', decimal.Decimal('1.01'), 'USD', DATE)
|
||||
rendered = tmpl.render(template_vars('FF', '1.01'))
|
||||
lines = [normalize_whitespace(s) for s in rendered.splitlines()]
|
||||
assert lines == [
|
||||
"",
|
||||
|
@ -81,9 +94,11 @@ def test_balancing():
|
|||
]
|
||||
|
||||
def test_multivalue():
|
||||
render_vars = template_vars('DD', '150.00', other_vars={
|
||||
'tax': decimal.Decimal('12.50'),
|
||||
})
|
||||
tmpl = template_from('Multivalue')
|
||||
rendered = tmpl.render('DD', decimal.Decimal('150.00'), 'USD', DATE,
|
||||
tax=decimal.Decimal('12.50'))
|
||||
rendered = tmpl.render(render_vars)
|
||||
lines = [normalize_whitespace(s) for s in rendered.splitlines()]
|
||||
assert lines == [
|
||||
"",
|
||||
|
@ -96,9 +111,11 @@ def test_multivalue():
|
|||
]
|
||||
|
||||
def test_zeroed_account_skipped():
|
||||
render_vars = template_vars('GG', '110.00', other_vars={
|
||||
'tax': decimal.Decimal(0),
|
||||
})
|
||||
tmpl = template_from('Multivalue')
|
||||
rendered = tmpl.render('GG', decimal.Decimal('110.00'), 'USD', DATE,
|
||||
tax=decimal.Decimal(0))
|
||||
rendered = tmpl.render(render_vars)
|
||||
lines = [normalize_whitespace(s) for s in rendered.splitlines()]
|
||||
assert lines == [
|
||||
"",
|
||||
|
@ -109,9 +126,11 @@ def test_zeroed_account_skipped():
|
|||
]
|
||||
|
||||
def test_custom_payee_line():
|
||||
render_vars = template_vars('ZZ', '10.00', other_vars={
|
||||
'custom_date': datetime.date(2014, 2, 13),
|
||||
})
|
||||
tmpl = template_from('Custom Payee')
|
||||
rendered = tmpl.render('ZZ', decimal.Decimal('10.00'), 'USD', DATE,
|
||||
custom_date=datetime.date(2014, 2, 13))
|
||||
rendered = tmpl.render(render_vars)
|
||||
lines = [normalize_whitespace(s) for s in rendered.splitlines()]
|
||||
assert lines == [
|
||||
"",
|
||||
|
@ -121,9 +140,11 @@ def test_custom_payee_line():
|
|||
]
|
||||
|
||||
def test_line1_not_custom_payee():
|
||||
render_vars = template_vars('VV', '15.00', other_vars={
|
||||
'custom_date': datetime.date(2014, 2, 12),
|
||||
})
|
||||
tmpl = template_from('Simplest')
|
||||
rendered = tmpl.render('VV', decimal.Decimal('15.00'), 'USD', DATE,
|
||||
custom_date=datetime.date(2014, 2, 12))
|
||||
rendered = tmpl.render(render_vars)
|
||||
lines = [normalize_whitespace(s) for s in rendered.splitlines()]
|
||||
assert lines == [
|
||||
"",
|
||||
|
|
Loading…
Reference in a new issue