errors: Redo InvalidMetadataError.

This needs to be generally usable for transactions.
This commit is contained in:
Brett Smith 2020-03-28 09:47:40 -04:00
parent 33cb734b19
commit 2cb131423f
6 changed files with 13 additions and 27 deletions

View file

@ -67,26 +67,13 @@ class ConfigurationError(Error):
class InvalidMetadataError(Error): class InvalidMetadataError(Error):
def __init__(self, txn, post, key, value=None, source=None): def __init__(self, txn, key, value=None, post=None, source=None):
if value is None:
msg_fmt = "{post.account} missing {key}"
else:
msg_fmt = "{post.account} has invalid {key}: {value}"
super().__init__(
msg_fmt.format(post=post, key=key, value=value),
txn,
source,
)
class InvalidEntityError(InvalidMetadataError):
def __init__(self, txn, post=None, key='entity', value=None, source=None):
if post is None: if post is None:
srcname = 'transaction' srcname = 'transaction'
else: else:
srcname = post.account srcname = post.account
if value is None: if value is None:
msg = "{} missing entity".format(srcname) msg = "{} missing {}".format(srcname, key)
else: else:
msg = "{} entity malformed: {}".format(srcname, value) msg = "{} has invalid {}: {}".format(srcname, key, value)
super(InvalidMetadataError, self).__init__(msg, txn, source) super().__init__(msg, txn, source)

View file

@ -217,7 +217,7 @@ class _NormalizePostingMetadataHook(_PostingHook):
# a value string from METADATA_ENUM, or else raise InvalidMetadataError. # a value string from METADATA_ENUM, or else raise InvalidMetadataError.
# This base implementation does the latter. # This base implementation does the latter.
def _default_value(self, txn: Transaction, post: data.Posting) -> MetaValueEnum: def _default_value(self, txn: Transaction, post: data.Posting) -> MetaValueEnum:
raise errormod.InvalidMetadataError(txn, post, self.METADATA_KEY) raise errormod.InvalidMetadataError(txn, self.METADATA_KEY, None, post)
def post_run(self, txn: Transaction, post: data.Posting) -> errormod.Iter: def post_run(self, txn: Transaction, post: data.Posting) -> errormod.Iter:
source_value = post.meta.get(self.METADATA_KEY) source_value = post.meta.get(self.METADATA_KEY)
@ -233,7 +233,7 @@ class _NormalizePostingMetadataHook(_PostingHook):
set_value = self.VALUES_ENUM[source_value] set_value = self.VALUES_ENUM[source_value]
except KeyError: except KeyError:
error = errormod.InvalidMetadataError( error = errormod.InvalidMetadataError(
txn, post, self.METADATA_KEY, source_value, txn, self.METADATA_KEY, source_value, post,
) )
if error is None: if error is None:
post.meta[self.METADATA_KEY] = set_value post.meta[self.METADATA_KEY] = set_value

View file

@ -37,14 +37,14 @@ class MetaEntity(core.TransactionHook):
else: else:
txn_entity_ok = False txn_entity_ok = False
if txn_entity_ok is False: if txn_entity_ok is False:
yield errormod.InvalidEntityError(txn, value=txn_entity) yield errormod.InvalidMetadataError(txn, self.METADATA_KEY, txn_entity)
for post in data.iter_postings(txn): for post in data.iter_postings(txn):
if post.account.is_under('Assets', 'Liabilities'): if post.account.is_under('Assets', 'Liabilities'):
continue continue
entity = post.meta.get(self.METADATA_KEY) entity = post.meta.get(self.METADATA_KEY)
if entity is None: if entity is None:
yield errormod.InvalidEntityError(txn, post) yield errormod.InvalidMetadataError(txn, self.METADATA_KEY, entity, post)
elif entity is txn_entity: elif entity is txn_entity:
pass pass
elif not self.ENTITY_RE.match(entity): elif not self.ENTITY_RE.match(entity):
yield errormod.InvalidEntityError(txn, post, value=entity) yield errormod.InvalidMetadataError(txn, self.METADATA_KEY, entity, post)

View file

@ -49,4 +49,4 @@ class MetaIncomeType(core._NormalizePostingMetadataHook):
try: try:
return self.DEFAULT_VALUES[post.account] return self.DEFAULT_VALUES[post.account]
except KeyError: except KeyError:
raise errormod.InvalidMetadataError(txn, post, self.METADATA_KEY) from None raise errormod.InvalidMetadataError(txn, self.METADATA_KEY, None, post) from None

View file

@ -87,5 +87,4 @@ class MetaProject(core._NormalizePostingMetadataHook):
): ):
return self.DEFAULT_PROJECT return self.DEFAULT_PROJECT
else: else:
raise errormod.InvalidMetadataError(txn, post, self.METADATA_KEY) raise errormod.InvalidMetadataError(txn, self.METADATA_KEY, None, post)

View file

@ -60,7 +60,7 @@ def test_invalid_values_on_postings(hook, src_value):
]) ])
errors = list(hook.run(txn)) errors = list(hook.run(txn))
assert len(errors) == 1 assert len(errors) == 1
assert errors[0].message == "Expenses:General entity malformed: {}".format(src_value) assert errors[0].message == "Expenses:General has invalid entity: {}".format(src_value)
@pytest.mark.parametrize('src_value', VALID_VALUES) @pytest.mark.parametrize('src_value', VALID_VALUES)
def test_valid_values_on_transactions(hook, src_value): def test_valid_values_on_transactions(hook, src_value):
@ -78,7 +78,7 @@ def test_invalid_values_on_transactions(hook, src_value):
]) ])
errors = list(hook.run(txn)) errors = list(hook.run(txn))
assert 1 <= len(errors) <= 2 assert 1 <= len(errors) <= 2
assert all(error.message == "transaction entity malformed: {}".format(src_value) assert all(error.message == "transaction has invalid entity: {}".format(src_value)
for error in hook.run(txn)) for error in hook.run(txn))
@pytest.mark.parametrize('account,required', [ @pytest.mark.parametrize('account,required', [