expenseAllocation: Date-limit the transactions we work on.

This prevents the plugin from giving meaning to postings that
might not really be there.
This commit is contained in:
Brett Smith 2020-03-05 14:37:47 -05:00
parent 910b95c942
commit 16c47c64b2
3 changed files with 43 additions and 1 deletions

View file

@ -14,10 +14,31 @@
# You should have received a copy of the GNU Affero General Public License # You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <https://www.gnu.org/licenses/>. # along with this program. If not, see <https://www.gnu.org/licenses/>.
import datetime
from . import errors as errormod from . import errors as errormod
DEFAULT_START_DATE = datetime.date(2020, 3, 1)
DEFAULT_STOP_DATE = datetime.date(datetime.MAXYEAR, 1, 1)
class _GenericRange:
def __init__(self, start, stop):
self.start = start
self.stop = stop
def __repr__(self):
return "{clsname}({self.start!r}, {self.stop!r})".format(
clsname=type(self).__name__,
self=self,
)
def __contains__(self, item):
return self.start <= item < self.stop
class PostingChecker: class PostingChecker:
ACCOUNTS = ('',) ACCOUNTS = ('',)
TXN_DATE_RANGE = _GenericRange(DEFAULT_START_DATE, DEFAULT_STOP_DATE)
VALUES_ENUM = {} VALUES_ENUM = {}
def _meta_get(self, txn, post, key, default=None): def _meta_get(self, txn, post, key, default=None):
@ -35,7 +56,7 @@ class PostingChecker:
raise errormod.InvalidMetadataError(txn, post, self.METADATA_KEY) raise errormod.InvalidMetadataError(txn, post, self.METADATA_KEY)
def _should_check(self, txn, post): def _should_check(self, txn, post):
ok = True ok = txn.date in self.TXN_DATE_RANGE
if isinstance(self.ACCOUNTS, tuple): if isinstance(self.ACCOUNTS, tuple):
ok = ok and post.account.startswith(self.ACCOUNTS) ok = ok and post.account.startswith(self.ACCOUNTS)
else: else:

View file

@ -109,3 +109,21 @@ def test_default_values(account, set_value):
errors = checker.check(txn, txn.postings[-1]) errors = checker.check(txn, txn.postings[-1])
assert not errors assert not errors
assert txn.postings[-1].meta['expenseAllocation'] == set_value assert txn.postings[-1].meta['expenseAllocation'] == set_value
@pytest.mark.parametrize('date,set_value', [
(testutil.EXTREME_FUTURE_DATE, False),
(testutil.FUTURE_DATE, True),
(testutil.FY_START_DATE, True),
(testutil.FY_MID_DATE, True),
(testutil.PAST_DATE, False),
])
def test_default_value_set_in_date_range(date, set_value):
txn = testutil.Transaction(date=date, postings=[
('Liabilites:CreditCard', -25),
('Expenses:General', 25),
])
checker = meta_expense_allocation.MetaExpenseAllocation()
errors = checker.check(txn, txn.postings[-1])
assert not errors
got_value = (txn.postings[-1].meta or {}).get('expenseAllocation')
assert bool(got_value) == bool(set_value)

View file

@ -21,8 +21,11 @@ import beancount.core.data as bc_data
from decimal import Decimal from decimal import Decimal
EXTREME_FUTURE_DATE = datetime.date(datetime.MAXYEAR, 12, 30)
FUTURE_DATE = datetime.date.today() + datetime.timedelta(days=365 * 99)
FY_START_DATE = datetime.date(2020, 3, 1) FY_START_DATE = datetime.date(2020, 3, 1)
FY_MID_DATE = datetime.date(2020, 9, 1) FY_MID_DATE = datetime.date(2020, 9, 1)
PAST_DATE = datetime.date(2000, 1, 1)
def parse_date(s, fmt='%Y-%m-%d'): def parse_date(s, fmt='%Y-%m-%d'):
return datetime.datetime.strptime(s, fmt).date() return datetime.datetime.strptime(s, fmt).date()