From 3a73bc22393a484a71312990dac6127b6792f6a4 Mon Sep 17 00:00:00 2001 From: Brett Smith Date: Tue, 17 Mar 2020 17:08:47 -0400 Subject: [PATCH] data: Start iter_postings function. --- conservancy_beancount/data.py | 7 ++++++ tests/test_data_iter_postings.py | 41 ++++++++++++++++++++++++++++++++ 2 files changed, 48 insertions(+) create mode 100644 tests/test_data_iter_postings.py diff --git a/conservancy_beancount/data.py b/conservancy_beancount/data.py index 2bb7b47..29148d7 100644 --- a/conservancy_beancount/data.py +++ b/conservancy_beancount/data.py @@ -68,3 +68,10 @@ class PostingMeta(collections.abc.MutableMapping): raise KeyError(key) else: del self.post.meta[key] + + +def iter_postings(txn: Transaction) -> Iterator[Posting]: + for index, source in enumerate(txn.postings): + yield source._replace( + meta=PostingMeta(txn, index, source), + ) diff --git a/tests/test_data_iter_postings.py b/tests/test_data_iter_postings.py new file mode 100644 index 0000000..173922e --- /dev/null +++ b/tests/test_data_iter_postings.py @@ -0,0 +1,41 @@ +"""Test data.iter_postings function""" +# Copyright © 2020 Brett Smith +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . + +import pytest + +from . import testutil + +from beancount.core import data as bc_data +from conservancy_beancount import data + +@pytest.fixture +def simple_txn(index=None, key=None): + return testutil.Transaction(note='txn note', postings=[ + ('Assets:Cash', 5), + ('Income:Donations', -5, {'note': 'donation love', 'extra': 'Extra'}), + ]) + +def test_iter_postings(simple_txn): + for source, post in zip(simple_txn.postings, data.iter_postings(simple_txn)): + assert all(source[x] == post[x] for x in range(len(source) - 1)) + assert post.meta['note'] # Only works with PostingMeta + +def test_editing_metadata_edits_source(simple_txn): + for index, post in enumerate(data.iter_postings(simple_txn)): + post.meta['edited'] = str(index) + for index, post in enumerate(simple_txn.postings): + assert post.meta['edited'] == str(index) + assert not isinstance(post.meta, data.PostingMeta)