Changeset - 0d370c445b9e
[Not reviewed]
0 8 0
Brett Smith - 4 years ago 2020-03-19 21:23:27
brettcsmith@brettcsmith.org
plugin: User configuration is passed to hooks on initialization.
8 files changed with 62 insertions and 9 deletions:
0 comments (0 inline, 0 general)
conservancy_beancount/errors.py
Show inline comments
...
 
@@ -33,2 +33,6 @@ class Error(Exception):
 

	
 
    def _fill_source(self, source, filename='conservancy_beancount', lineno=0):
 
        source.setdefault('filename', filename)
 
        source.setdefault('lineno', lineno)
 

	
 

	
...
 
@@ -36,2 +40,10 @@ Iter = Iterable[Error]
 

	
 
class ConfigurationError(Error):
 
    def __init__(self, message, entry=None, source=None):
 
        if source is None:
 
            source = {}
 
        self._fill_source(source)
 
        super().__init__(message, entry, source)
 

	
 

	
 
class InvalidMetadataError(Error):
conservancy_beancount/plugin/__init__.py
Show inline comments
...
 
@@ -34,2 +34,3 @@ from ..beancount_types import (
 
)
 
from .. import config as configmod
 
from .core import (
...
 
@@ -102,4 +103,10 @@ def run(
 
    hooks: Dict[HookName, List[Hook]] = {}
 
    user_config = configmod.Config()
 
    for key, hook_type in hook_registry.group_by_directive(config):
 
        hooks.setdefault(key, []).append(hook_type())
 
        try:
 
            hook = hook_type(user_config)
 
        except Error as error:
 
            errors.append(error)
 
        else:
 
            hooks.setdefault(key, []).append(hook)
 
    for entry in entries:
conservancy_beancount/plugin/core.py
Show inline comments
...
 
@@ -20,2 +20,3 @@ import re
 

	
 
from .. import config as configmod
 
from .. import data
...
 
@@ -62,2 +63,7 @@ class Hook(Generic[Entry], metaclass=abc.ABCMeta):
 

	
 
    def __init__(self, config: configmod.Config) -> None:
 
        pass
 
        # Subclasses that need configuration should override __init__ to check
 
        # and store it.
 

	
 
    @abc.abstractmethod
tests/test_meta_expense_allocation.py
Show inline comments
...
 
@@ -41,3 +41,4 @@ TEST_KEY = 'expense-allocation'
 
def hook():
 
    return meta_expense_allocation.MetaExpenseAllocation()
 
    config = testutil.TestConfig()
 
    return meta_expense_allocation.MetaExpenseAllocation(config)
 

	
tests/test_meta_income_type.py
Show inline comments
...
 
@@ -41,3 +41,4 @@ TEST_KEY = 'income-type'
 
def hook():
 
    return meta_income_type.MetaIncomeType()
 
    config = testutil.TestConfig()
 
    return meta_income_type.MetaIncomeType(config)
 

	
tests/test_meta_tax_implication.py
Show inline comments
...
 
@@ -53,3 +53,4 @@ TEST_KEY = 'tax-implication'
 
def hook():
 
    return meta_tax_implication.MetaTaxImplication()
 
    config = testutil.TestConfig()
 
    return meta_tax_implication.MetaTaxImplication(config)
 

	
tests/test_plugin.py
Show inline comments
...
 
@@ -20,3 +20,3 @@ from . import testutil
 

	
 
from conservancy_beancount import beancount_types, plugin
 
from conservancy_beancount import beancount_types, errors as errormod, plugin
 

	
...
 
@@ -24,2 +24,6 @@ HOOK_REGISTRY = plugin.HookRegistry()
 

	
 
class NonError(errormod.Error):
 
    pass
 

	
 

	
 
class TransactionHook:
...
 
@@ -28,2 +32,5 @@ class TransactionHook:
 

	
 
    def __init__(self, config):
 
        self.config = config
 

	
 
    def run(self, txn):
...
 
@@ -32,2 +39,10 @@ class TransactionHook:
 

	
 
@HOOK_REGISTRY.add_hook
 
class ConfigurationError(TransactionHook):
 
    HOOK_GROUPS = frozenset(['unconfigured'])
 

	
 
    def __init__(self, config):
 
        raise errormod.ConfigurationError("testing error")
 

	
 

	
 
@HOOK_REGISTRY.add_hook
...
 
@@ -37,3 +52,3 @@ class TransactionError(TransactionHook):
 
    def run(self, txn):
 
        return ['txn:{}'.format(id(txn))]
 
        return [NonError('txn:{}'.format(id(txn)), txn)]
 

	
...
 
@@ -45,3 +60,4 @@ class PostingError(TransactionHook):
 
    def run(self, txn):
 
        return ['post:{}'.format(id(post)) for post in txn.postings]
 
        return [NonError('post:{}'.format(id(post)), txn)
 
                for post in txn.postings]
 

	
...
 
@@ -67,4 +83,4 @@ def map_errors(errors):
 
    retval = {}
 
    for errkey in errors:
 
        key, _, errid = errkey.partition(':')
 
    for error in errors:
 
        key, _, errid = error.message.partition(':')
 
        retval.setdefault(key, set()).add(errid)
tests/testutil.py
Show inline comments
...
 
@@ -22,2 +22,3 @@ import beancount.core.data as bc_data
 
from decimal import Decimal
 
from pathlib import Path
 

	
...
 
@@ -96 +97,9 @@ class Transaction:
 
        self.postings.append(posting)
 

	
 

	
 
class TestConfig:
 
    def __init__(self, repo_path=None):
 
        self.repo_path = None if repo_path is None else Path(repo_path)
 

	
 
    def repository_path(self):
 
        return self.repo_path
0 comments (0 inline, 0 general)