diff --git a/conservancy_beancount/data.py b/conservancy_beancount/data.py index 28c587f14ce2ff9b323e5c45e892deb71894e5b6..55c995d136f9a571a7188c7c192db48790414015 100644 --- a/conservancy_beancount/data.py +++ b/conservancy_beancount/data.py @@ -192,6 +192,11 @@ class Account(str): elif isinstance(entry, bc_data.Close): cls.load_closing(entry) # type:ignore[arg-type] + @classmethod + def load_from_books(cls, entries: Iterable[Directive], options_map: OptionsMap) -> None: + cls.load_options_map(options_map) + cls.load_openings_and_closings(entries) + @classmethod def is_account(cls, s: str) -> bool: return cls.ACCOUNT_RE.fullmatch(s) is not None diff --git a/tests/test_data_account.py b/tests/test_data_account.py index 3b92fcde6de1c214858452c16dfdd48203c2360c..2ef4b4256d65429a47616b1aee629304652221b3 100644 --- a/tests/test_data_account.py +++ b/tests/test_data_account.py @@ -313,3 +313,23 @@ def test_is_account_respects_configured_roots(clean_account_meta, account_s, exp config['name_income'] = 'Revenue' data.Account.load_options_map(config) assert data.Account.is_account(account_s) == expected + +def test_load_from_books(clean_account_meta): + entries = [ + Open({'lineno': 310}, Date(2001, 1, 1), 'Assets:Bank:Checking', ['USD'], None), + Open({'lineno': 315}, Date(2001, 2, 1), 'Revenue:Donations', None, Booking.STRICT), + testutil.Transaction(date=Date(2001, 2, 10), postings=[ + ('Revenue:Donations', -10), + ('Assets:Bank:Checking', 10), + ]), + Close({'lineno': 320}, Date(2001, 3, 1), 'Assets:Bank:Checking'), + ] + config = bc_options.OPTIONS_DEFAULTS.copy() + config['name_expenses'] = 'Costs' + config['name_income'] = 'Revenue' + data.Account.load_from_books(entries, config) + for post in entries[2].postings: + assert data.Account.is_account(post.account) + check_meta = data.Account(entries[0].account).meta + assert check_meta.open_date == entries[0].date + assert check_meta.close_date == entries[-1].date