Changeset - 16c47c64b23d
[Not reviewed]
0 3 0
Brett Smith - 4 years ago 2020-03-05 19:37:47
brettcsmith@brettcsmith.org
expenseAllocation: Date-limit the transactions we work on.

This prevents the plugin from giving meaning to postings that
might not really be there.
3 files changed with 43 insertions and 1 deletions:
0 comments (0 inline, 0 general)
conservancy_beancount/plugin/core.py
Show inline comments
...
 
@@ -14,10 +14,31 @@
 
# 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/>.
 

	
 
import datetime
 

	
 
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:
 
    ACCOUNTS = ('',)
 
    TXN_DATE_RANGE = _GenericRange(DEFAULT_START_DATE, DEFAULT_STOP_DATE)
 
    VALUES_ENUM = {}
 

	
 
    def _meta_get(self, txn, post, key, default=None):
...
 
@@ -35,7 +56,7 @@ class PostingChecker:
 
        raise errormod.InvalidMetadataError(txn, post, self.METADATA_KEY)
 

	
 
    def _should_check(self, txn, post):
 
        ok = True
 
        ok = txn.date in self.TXN_DATE_RANGE
 
        if isinstance(self.ACCOUNTS, tuple):
 
            ok = ok and post.account.startswith(self.ACCOUNTS)
 
        else:
tests/test_meta_expenseAllocation.py
Show inline comments
...
 
@@ -109,3 +109,21 @@ def test_default_values(account, set_value):
 
    errors = checker.check(txn, txn.postings[-1])
 
    assert not errors
 
    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)
tests/testutil.py
Show inline comments
...
 
@@ -21,8 +21,11 @@ import beancount.core.data as bc_data
 

	
 
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_MID_DATE = datetime.date(2020, 9, 1)
 
PAST_DATE = datetime.date(2000, 1, 1)
 

	
 
def parse_date(s, fmt='%Y-%m-%d'):
 
    return datetime.datetime.strptime(s, fmt).date()
0 comments (0 inline, 0 general)