plugin: Refactor _RequireLinksPostingMetadataHook out of MetaInvoice.

This will be a common hook type.
This commit is contained in:
Brett Smith 2020-03-28 14:48:49 -04:00
parent d9420ac2b6
commit 7658aaedf8
2 changed files with 23 additions and 12 deletions

View file

@ -239,3 +239,25 @@ class _NormalizePostingMetadataHook(_PostingHook):
post.meta[self.METADATA_KEY] = set_value post.meta[self.METADATA_KEY] = set_value
else: else:
yield error yield error
class _RequireLinksPostingMetadataHook(_PostingHook):
"""Base class to require that posting metadata include links"""
# This base class confirms that a posting's metadata has one or more links
# under METADATA_KEY.
# Most subclasses only need to define METADATA_KEY and _run_on_post.
METADATA_KEY: str
def __init_subclass__(cls) -> None:
super().__init_subclass__()
cls.HOOK_GROUPS = cls.HOOK_GROUPS.union(['metadata', cls.METADATA_KEY])
def post_run(self, txn: Transaction, post: data.Posting) -> errormod.Iter:
try:
problem = not post.meta.get_links(self.METADATA_KEY)
value = None
except TypeError:
problem = True
value = post.meta[self.METADATA_KEY]
if problem:
yield errormod.InvalidMetadataError(txn, self.METADATA_KEY, value, post)

View file

@ -22,19 +22,8 @@ from ..beancount_types import (
Transaction, Transaction,
) )
class MetaInvoice(core._PostingHook): class MetaInvoice(core._RequireLinksPostingMetadataHook):
METADATA_KEY = 'invoice' METADATA_KEY = 'invoice'
HOOK_GROUPS = frozenset(['metadata', METADATA_KEY])
def _run_on_post(self, txn: Transaction, post: data.Posting) -> bool: def _run_on_post(self, txn: Transaction, post: data.Posting) -> bool:
return post.account.is_under('Accrued') is not None return post.account.is_under('Accrued') is not None
def post_run(self, txn: Transaction, post: data.Posting) -> errormod.Iter:
try:
problem = not post.meta.get_links(self.METADATA_KEY)
value = None
except TypeError:
problem = True
value = post.meta[self.METADATA_KEY]
if problem:
yield errormod.InvalidMetadataError(txn, self.METADATA_KEY, value, post)