errors: Redo InvalidMetadataError.
This needs to be generally usable for transactions.
This commit is contained in:
parent
33cb734b19
commit
2cb131423f
6 changed files with 13 additions and 27 deletions
|
@ -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)
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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)
|
||||||
|
|
||||||
|
|
|
@ -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', [
|
||||||
|
|
Loading…
Reference in a new issue