books: Let files under books/ include any Beancount files they want.
This provides more flexibility in repository setup while remaining backwards compatible. The changes to test_reports_query are just to accommodate the new transaction in 2020-expenses.beancount.
This commit is contained in:
parent
96b39a8778
commit
6752a40206
7 changed files with 15 additions and 6 deletions
|
@ -24,6 +24,7 @@ from typing import (
|
||||||
Mapping,
|
Mapping,
|
||||||
NamedTuple,
|
NamedTuple,
|
||||||
Optional,
|
Optional,
|
||||||
|
Set,
|
||||||
TextIO,
|
TextIO,
|
||||||
Union,
|
Union,
|
||||||
)
|
)
|
||||||
|
@ -177,16 +178,19 @@ class Loader:
|
||||||
result = LoadResult._make(bc_loader.load_file(next(paths)))
|
result = LoadResult._make(bc_loader.load_file(next(paths)))
|
||||||
except StopIteration:
|
except StopIteration:
|
||||||
result = LoadResult.empty()
|
result = LoadResult.empty()
|
||||||
|
seen_files: Set[str] = set(result.options_map['include'])
|
||||||
for load_path in paths:
|
for load_path in paths:
|
||||||
new_entries, new_errors, new_options = bc_loader.load_file(load_path)
|
new_entries, new_errors, new_options = bc_loader.load_file(load_path)
|
||||||
# We only want transactions from the new fiscal year.
|
# We only want transactions from the new fiscal year.
|
||||||
# We don't want the opening balance, duplicate definitions, etc.
|
# We don't want the opening balance, duplicate definitions, etc.
|
||||||
fy_filename = str(load_path.parent.parent / load_path.name)
|
seen_files.add(new_options['filename'])
|
||||||
result.entries.extend(
|
result.entries.extend(
|
||||||
entry for entry in new_entries
|
entry for entry in new_entries
|
||||||
if entry.meta.get('filename') == fy_filename
|
if entry.meta.get('filename') not in seen_files
|
||||||
)
|
)
|
||||||
result.errors.extend(new_errors)
|
result.errors.extend(new_errors)
|
||||||
|
seen_files.update(new_options['include'])
|
||||||
|
result.options_map['include'] = list(seen_files)
|
||||||
return result
|
return result
|
||||||
|
|
||||||
def _path_year(self, path: Path) -> int:
|
def _path_year(self, path: Path) -> int:
|
||||||
|
|
2
setup.py
2
setup.py
|
@ -5,7 +5,7 @@ from setuptools import setup
|
||||||
setup(
|
setup(
|
||||||
name='conservancy_beancount',
|
name='conservancy_beancount',
|
||||||
description="Plugin, library, and reports for reading Conservancy's books",
|
description="Plugin, library, and reports for reading Conservancy's books",
|
||||||
version='1.18.2',
|
version='1.18.3',
|
||||||
author='Software Freedom Conservancy',
|
author='Software Freedom Conservancy',
|
||||||
author_email='info@sfconservancy.org',
|
author_email='info@sfconservancy.org',
|
||||||
license='GNU AGPLv3+',
|
license='GNU AGPLv3+',
|
||||||
|
|
3
tests/books/2020-expenses.beancount
Normal file
3
tests/books/2020-expenses.beancount
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
2020-04-02 * "2020 bank maintenance fee"
|
||||||
|
Expenses:BankingFees 1.00 USD
|
||||||
|
Assets:Checking
|
|
@ -1,3 +1,4 @@
|
||||||
option "title" "Books from 2020"
|
option "title" "Books from 2020"
|
||||||
include "../definitions.beancount"
|
include "../definitions.beancount"
|
||||||
include "../2020.beancount"
|
include "../2020-expenses.beancount"
|
||||||
|
include "../2020-income.beancount"
|
||||||
|
|
|
@ -1,2 +1,3 @@
|
||||||
2018-03-01 open Assets:Checking
|
2018-03-01 open Assets:Checking
|
||||||
|
2018-03-01 open Expenses:BankingFees
|
||||||
2018-03-01 open Income:Donations
|
2018-03-01 open Income:Donations
|
||||||
|
|
|
@ -183,7 +183,7 @@ def test_text_query(arglist, fy):
|
||||||
lines = iter(stdout)
|
lines = iter(stdout)
|
||||||
next(lines); next(lines) # Skip header
|
next(lines); next(lines) # Skip header
|
||||||
for count, line in enumerate(lines, 1):
|
for count, line in enumerate(lines, 1):
|
||||||
assert re.match(rf'^{fy}-\d\d-\d\d\s+{fy} donation\b', line)
|
assert re.match(rf'^{fy}-\d\d-\d\d\s+{fy} ', line)
|
||||||
assert count >= 2
|
assert count >= 2
|
||||||
|
|
||||||
@pytest.mark.parametrize('arglist,fy', testutil.combine_values(
|
@pytest.mark.parametrize('arglist,fy', testutil.combine_values(
|
||||||
|
@ -199,7 +199,7 @@ def test_csv_query(arglist, fy):
|
||||||
stdout.seek(0)
|
stdout.seek(0)
|
||||||
for count, row in enumerate(csv.DictReader(stdout), 1):
|
for count, row in enumerate(csv.DictReader(stdout), 1):
|
||||||
assert re.fullmatch(rf'{fy}-\d\d-\d\d', row['date'])
|
assert re.fullmatch(rf'{fy}-\d\d-\d\d', row['date'])
|
||||||
assert row['narration'] == f'{fy} donation'
|
assert row['narration'].startswith(f'{fy} ')
|
||||||
assert count >= 2
|
assert count >= 2
|
||||||
|
|
||||||
@pytest.mark.parametrize('end_index', range(3))
|
@pytest.mark.parametrize('end_index', range(3))
|
||||||
|
|
Loading…
Reference in a new issue