Changeset - 0a34ed6798bb
[Not reviewed]
0 2 0
Brett Smith - 4 years ago 2021-02-24 18:15:33
brettcsmith@brettcsmith.org
cliutil: ExceptHook catches RewriteRuleError.

Now that we have richer exceptions, this is the easiest way to refactor out
rewrite rule error handling from the various main functions where it
currenly lives.
2 files changed with 28 insertions and 2 deletions:
0 comments (0 inline, 0 general)
conservancy_beancount/cliutil.py
Show inline comments
...
 
@@ -30,4 +30,6 @@ from pathlib import Path
 
import rt.exceptions as rt_error
 
import yaml
 

	
 
from . import data
 
from . import errors
 
from . import filters
...
 
@@ -150,2 +152,7 @@ class ExceptHook:
 
            error_type = f"RT {error_type}"
 
        elif isinstance(exc_value, errors.RewriteRuleError):
 
            exitcode = ExitCode.RewriteRulesError
 
            msg = str(exc_value)
 
            if exc_value.source is not None:
 
                msg += f"\n\n source: {yaml.safe_dump(exc_value.source)}"
 
        elif isinstance(exc_value, OSError):
tests/test_cliutil.py
Show inline comments
 
"""Test CLI utilities"""
 
# Copyright © 2020  Brett Smith
 
# Copyright © 2020, 2021  Brett Smith
 
# License: AGPLv3-or-later WITH Beancount-Plugin-Additional-Permission-1.0
...
 
@@ -25,3 +25,3 @@ from . import testutil
 

	
 
from conservancy_beancount import cliutil
 
from conservancy_beancount import cliutil, errors
 

	
...
 
@@ -165,2 +165,21 @@ def test_excepthook_oserror(errnum, caplog):
 

	
 
@pytest.mark.parametrize('errcls', [
 
    errors.RewriteRuleActionError,
 
    errors.RewriteRuleConditionError,
 
    errors.RewriteRuleLoadError,
 
    errors.RewriteRuleValidationError,
 
])
 
def test_excepthook_rewrite_rule_error(errcls, caplog):
 
    name = errcls.__name__
 
    error = errcls("bad rewrite rule", f"{name}.yml", 170, [name])
 
    with pytest.raises(SystemExit) as exc_check:
 
        cliutil.ExceptHook()(type(error), error, None)
 
    assert exc_check.value.args[0] == cliutil.ExitCode.RewriteRulesError
 
    assert caplog.records
 
    for log in caplog.records:
 
        assert log.levelname == 'CRITICAL'
 
        lines = log.message.splitlines()
 
        assert lines[0].startswith(f"{name}: bad rewrite rule in {name}.yml rule #170")
 
        assert re.match(rf' source:\W+{name}\b', lines[-1])
 

	
 
@pytest.mark.parametrize('exc_type', [
0 comments (0 inline, 0 general)