reports: Add RelatedPostings.meta_values() method.
This corresponds to the ledtag_onevalue check in the payment-report and income-report scripts.
This commit is contained in:
parent
54a1bc4600
commit
ed4258daf7
2 changed files with 72 additions and 0 deletions
|
@ -29,9 +29,14 @@ from typing import (
|
||||||
Mapping,
|
Mapping,
|
||||||
Optional,
|
Optional,
|
||||||
Sequence,
|
Sequence,
|
||||||
|
Set,
|
||||||
Tuple,
|
Tuple,
|
||||||
Union,
|
Union,
|
||||||
)
|
)
|
||||||
|
from ..beancount_types import (
|
||||||
|
MetaKey,
|
||||||
|
MetaValue,
|
||||||
|
)
|
||||||
|
|
||||||
class Balance(Mapping[str, data.Amount]):
|
class Balance(Mapping[str, data.Amount]):
|
||||||
"""A collection of amounts mapped by currency
|
"""A collection of amounts mapped by currency
|
||||||
|
@ -134,3 +139,9 @@ class RelatedPostings(Sequence[data.Posting]):
|
||||||
return balance
|
return balance
|
||||||
except NameError:
|
except NameError:
|
||||||
return Balance()
|
return Balance()
|
||||||
|
|
||||||
|
def meta_values(self,
|
||||||
|
key: MetaKey,
|
||||||
|
default: Optional[MetaValue]=None,
|
||||||
|
) -> Set[Optional[MetaValue]]:
|
||||||
|
return {post.meta.get(key, default) for post in self}
|
||||||
|
|
|
@ -106,3 +106,64 @@ def test_iter_with_balance_credit_card(credit_card_cycle):
|
||||||
|
|
||||||
def test_iter_with_balance_two_acccruals(two_accruals_three_payments):
|
def test_iter_with_balance_two_acccruals(two_accruals_three_payments):
|
||||||
check_iter_with_balance(two_accruals_three_payments)
|
check_iter_with_balance(two_accruals_three_payments)
|
||||||
|
|
||||||
|
def test_meta_values_empty():
|
||||||
|
related = core.RelatedPostings()
|
||||||
|
assert related.meta_values('key') == set()
|
||||||
|
|
||||||
|
def test_meta_values_no_match():
|
||||||
|
related = core.RelatedPostings()
|
||||||
|
related.add(testutil.Posting('Income:Donations', -1, metakey='metavalue'))
|
||||||
|
assert related.meta_values('key') == {None}
|
||||||
|
|
||||||
|
def test_meta_values_no_match_default_given():
|
||||||
|
related = core.RelatedPostings()
|
||||||
|
related.add(testutil.Posting('Income:Donations', -1, metakey='metavalue'))
|
||||||
|
assert related.meta_values('key', '') == {''}
|
||||||
|
|
||||||
|
def test_meta_values_one_match():
|
||||||
|
related = core.RelatedPostings()
|
||||||
|
related.add(testutil.Posting('Income:Donations', -1, key='metavalue'))
|
||||||
|
assert related.meta_values('key') == {'metavalue'}
|
||||||
|
|
||||||
|
def test_meta_values_some_match():
|
||||||
|
related = core.RelatedPostings()
|
||||||
|
related.add(testutil.Posting('Income:Donations', -1, key='1'))
|
||||||
|
related.add(testutil.Posting('Income:Donations', -2, metakey='2'))
|
||||||
|
assert related.meta_values('key') == {'1', None}
|
||||||
|
|
||||||
|
def test_meta_values_some_match_default_given():
|
||||||
|
related = core.RelatedPostings()
|
||||||
|
related.add(testutil.Posting('Income:Donations', -1, key='1'))
|
||||||
|
related.add(testutil.Posting('Income:Donations', -2, metakey='2'))
|
||||||
|
assert related.meta_values('key', '') == {'1', ''}
|
||||||
|
|
||||||
|
def test_meta_values_all_match():
|
||||||
|
related = core.RelatedPostings()
|
||||||
|
related.add(testutil.Posting('Income:Donations', -1, key='1'))
|
||||||
|
related.add(testutil.Posting('Income:Donations', -2, key='2'))
|
||||||
|
assert related.meta_values('key') == {'1', '2'}
|
||||||
|
|
||||||
|
def test_meta_values_all_match_one_value():
|
||||||
|
related = core.RelatedPostings()
|
||||||
|
related.add(testutil.Posting('Income:Donations', -1, key='1'))
|
||||||
|
related.add(testutil.Posting('Income:Donations', -2, key='1'))
|
||||||
|
assert related.meta_values('key') == {'1'}
|
||||||
|
|
||||||
|
def test_meta_values_all_match_default_given():
|
||||||
|
related = core.RelatedPostings()
|
||||||
|
related.add(testutil.Posting('Income:Donations', -1, key='1'))
|
||||||
|
related.add(testutil.Posting('Income:Donations', -2, key='2'))
|
||||||
|
assert related.meta_values('key', '') == {'1', '2'}
|
||||||
|
|
||||||
|
def test_meta_values_many_types():
|
||||||
|
expected = {
|
||||||
|
datetime.date(2020, 4, 1),
|
||||||
|
Decimal(42),
|
||||||
|
testutil.Amount(5),
|
||||||
|
'rt:42',
|
||||||
|
}
|
||||||
|
related = core.RelatedPostings()
|
||||||
|
for index, value in enumerate(expected):
|
||||||
|
related.add(testutil.Posting('Income:Donations', -index, key=value))
|
||||||
|
assert related.meta_values('key') == expected
|
||||||
|
|
Loading…
Add table
Reference in a new issue