diff --git a/conservancy_beancount/plugin/txn_date.py b/conservancy_beancount/plugin/txn_date.py index 2aff09c9bbb04b88454dbd3d06058104b06b81ae..41f8de26305edea84203307ea562838a9f0d7575 100644 --- a/conservancy_beancount/plugin/txn_date.py +++ b/conservancy_beancount/plugin/txn_date.py @@ -5,6 +5,7 @@ # Full copyright and licensing details can be found at toplevel file # LICENSE.txt in the repository. +import os.path import re from ..beancount_types import ( @@ -24,11 +25,11 @@ class TransactionDate(core.TransactionHook): "books dir setting is required to check transaction dates", ) books_pat = re.escape(str(books_path)) - self.filename_re = re.compile(rf'^{books_pat}/(\d{{4,}})\.beancount$') + self.filename_re = re.compile(rf'^{books_pat}/(\d{{4,}})[{os.path.sep}_.]') self.fy = config.fiscal_year_begin() def run(self, txn: Transaction) -> errormod.Iter: - match = self.filename_re.fullmatch(txn.meta.get('filename', '')) + match = self.filename_re.match(txn.meta.get('filename', '')) if match is None: return file_fy = int(match.group(1)) diff --git a/setup.py b/setup.py index 1cf9c852890d1538103946ff740a50c387420821..940b34c916a96f1bdf1ef480037364fca0f6936c 100755 --- a/setup.py +++ b/setup.py @@ -5,7 +5,7 @@ from setuptools import setup setup( name='conservancy_beancount', description="Plugin, library, and reports for reading Conservancy's books", - version='1.18.3', + version='1.18.4', author='Software Freedom Conservancy', author_email='info@sfconservancy.org', license='GNU AGPLv3+', diff --git a/tests/test_plugin_txn_date.py b/tests/test_plugin_txn_date.py index 956bba4a2ab3563ccc670ce3e35e580085b4f8d5..7c08ce17659559d22a46a7e3243444a5c5c50752 100644 --- a/tests/test_plugin_txn_date.py +++ b/tests/test_plugin_txn_date.py @@ -5,6 +5,8 @@ # Full copyright and licensing details can be found at toplevel file # LICENSE.txt in the repository. +import itertools + from datetime import date import pytest @@ -18,30 +20,35 @@ from conservancy_beancount.plugin import txn_date as hookmod BOOKS_PATH = testutil.test_path('books') CONFIG = testutil.TestConfig(books_path=BOOKS_PATH) HOOK = hookmod.TransactionDate(CONFIG) +SUFFIXES = itertools.cycle([ + '', + '_sidefile', + '/subdirfile', +]) -@pytest.mark.parametrize('txn_date,fyear', [ - (date(2016, 1, 1), 2015), - (date(2016, 2, 29), 2015), - (date(2016, 3, 1), 2016), - (date(2016, 12, 31), 2016), - (date(2017, 2, 28), 2016), - (date(2017, 3, 1), 2017), +@pytest.mark.parametrize('txn_date,fyear,suffix', [ + (date(2016, 1, 1), 2015, next(SUFFIXES)), + (date(2016, 2, 29), 2015, next(SUFFIXES)), + (date(2016, 3, 1), 2016, next(SUFFIXES)), + (date(2016, 12, 31), 2016, next(SUFFIXES)), + (date(2017, 2, 28), 2016, next(SUFFIXES)), + (date(2017, 3, 1), 2017, next(SUFFIXES)), ]) -def test_good_txn(txn_date, fyear): - filename = str(BOOKS_PATH / f'{fyear}.beancount') +def test_good_txn(txn_date, fyear, suffix): + filename = str(BOOKS_PATH / f'{fyear}{suffix}.beancount') txn = testutil.Transaction(date=txn_date, filename=filename, postings=[ ('Assets:Cash', 5), ('Income:Donations', -5), ]) assert not list(HOOK.run(txn)) -@pytest.mark.parametrize('txn_date,fyear', [ - (date(2018, 1, 1), 2017), - (date(2018, 12, 31), 2018), - (date(2019, 3, 1), 2019), +@pytest.mark.parametrize('txn_date,fyear,suffix', [ + (date(2018, 1, 1), 2017, next(SUFFIXES)), + (date(2018, 12, 31), 2018, next(SUFFIXES)), + (date(2019, 3, 1), 2019, next(SUFFIXES)), ]) -def test_bad_txn(txn_date, fyear): - filename = str(BOOKS_PATH / '2020.beancount') +def test_bad_txn(txn_date, fyear, suffix): + filename = str(BOOKS_PATH / f'2020{suffix}.beancount') txn = testutil.Transaction(date=txn_date, filename=filename, postings=[ ('Assets:Cash', 5), ('Income:Donations', -5),