提交 b7e3e913 编写于 作者: HansBug's avatar HansBug 😆

refactor cli part

上级 f3d3d42e
treevalue.utils.exception
================================
str_traceback
-----------------
.. autofunction:: treevalue.utils.exception.str_traceback
......@@ -7,6 +7,7 @@ treevalue.utils
clazz
color
enum
exception
final
func
imports
......
from .test_clazz import TestUtilsClazz
from .test_color import TestUtilsColor
from .test_enum import TestUtilsEnum
from .test_exception import TestUtilsException
from .test_final import TestUtilsFinal
from .test_func import TestUtilsFunc
from .test_imports import TestUtilsImports
......
import pytest
from treevalue.utils import str_traceback
@pytest.mark.unittest
class TestUtilsException:
def test_str_traceback(self):
def func1(x):
return func2(x * 3 + 1)
def func2(x):
if x % 2 == 0:
return func3(x)
else:
return func4(x)
def func3(x):
raise RuntimeError('this is a runtime error')
def func4(x):
raise ValueError('this is a value error')
try:
func1(1)
except Exception as err:
str_ = str_traceback(err)
assert 'func1' in str_
assert 'func2' in str_
assert 'func3' in str_
assert 'RuntimeError' in str_
assert 'this is a runtime error' in str_
assert 'func4' not in str_
assert 'ValueError' not in str_
assert 'this is a value error' not in str_
try:
func1(2)
except Exception as err:
str_ = str_traceback(err)
assert 'func1' in str_
assert 'func2' in str_
assert 'func3' not in str_
assert 'RuntimeError' not in str_
assert 'this is a runtime error' not in str_
assert 'func4' in str_
assert 'ValueError' in str_
assert 'this is a value error' in str_
......@@ -15,7 +15,7 @@ import dill
from graphviz import Digraph, Graph
from .base import CONTEXT_SETTINGS
from .utils import _multiple_validator, _click_pending, _err_validator, _validator
from .utils import multiple_validator, _click_pending, err_validator, validator
from ...tree import TreeValue, load, graphics
from ...utils import dynamic_call, quick_import_object, iter_import_objects
......@@ -53,16 +53,16 @@ def _import_tree_from_binary(filename_pattern, title='') -> Iterator[Tuple[TreeV
))
@_err_validator((ImportError,))
@_multiple_validator
@_validator
@err_validator((ImportError,))
@multiple_validator
@validator
def validate_trees(value: str) -> Iterator[Tuple[TreeValue, str]]:
_items = [item.strip() for item in value.split(':', maxsplit=3)]
return chain(_import_tree_from_binary(*_items), _import_tree_from_package(*_items))
@_err_validator((ImportError,))
@_validator
@err_validator((ImportError,))
@validator
def validate_graph(value: str):
if value is None:
return value
......@@ -71,8 +71,8 @@ def validate_graph(value: str):
return _graph
@_multiple_validator
@_validator
@multiple_validator
@validator
def validate_cfg(value: str) -> Tuple[str, str]:
_items = value.split('=', maxsplit=2)
if len(_items) < 2:
......@@ -82,9 +82,9 @@ def validate_cfg(value: str) -> Tuple[str, str]:
return key, value
@_err_validator((ImportError,))
@_multiple_validator
@_validator
@err_validator((ImportError,))
@multiple_validator
@validator
def validate_duplicate_types(value: str):
_it, _, _ = quick_import_object(value, lambda t: isinstance(t, type))
return _it
......
import io
import sys
import traceback
from contextlib import contextmanager
from functools import wraps
from typing import Callable, Union, Tuple
import click
from ...utils import dynamic_call
from ...utils import dynamic_call, str_traceback
def _validator(func):
def validator(func):
func = dynamic_call(func)
@wraps(func)
......@@ -20,8 +18,8 @@ def _validator(func):
return _new_func
def _multiple_validator(func):
func = _validator(func)
def multiple_validator(func):
func = validator(func)
@wraps(func)
def _new_func(ctx, param, value):
......@@ -38,9 +36,9 @@ _EXPECTED_TREE_ERRORS = (
_EXCEPTION_WRAPPED = '__exception_wrapped__'
def _err_validator(types: Union[type, Tuple[type]]):
def err_validator(types: Union[type, Tuple[type]]):
def _decorator(func):
func = _validator(func)
func = validator(func)
@wraps(func)
def _new_func(ctx, param, value):
......@@ -83,15 +81,9 @@ def _click_pending(text: str, ok: Union[Callable, str] = 'OK', error: Union[Call
yield
except BaseException as err:
click.secho(click.style(error(err), fg='red'), nl=False)
click.secho(_print_exception(err), file=sys.stderr)
click.secho(str_traceback(err), file=sys.stderr)
raise err
else:
click.secho(click.style(ok(), fg='green'), nl=False)
finally:
click.echo('.', nl=True)
def _print_exception(err: BaseException) -> str:
with io.StringIO() as fs:
traceback.print_exception(type(err), err, err.__backtrace__, file=fs)
return fs.getvalue()
from .clazz import init_magic, class_wraps, common_bases, common_direct_base, get_class_full_name
from .color import Color
from .enum import int_enum_loads
from .exception import str_traceback
from .final import FinalMeta
from .func import args_iter, dynamic_call, static_call, post_process, pre_process, freduce, raising, warning_
from .imports import import_object, quick_import_object, iter_import_objects
......
import io
import traceback
def str_traceback(err: BaseException) -> str:
"""
Overview:
Get full backtrace for exception object.
Arguments:
- err (:obj:`BaseException`): Exception object.
Returns:
- backtrace (:obj:`str`): Full string backtrace.
Example:
>>> try:
>>> raise RuntimeError('runtime error')
>>> except Exception as err:
>>> s = str_traceback(err)
The output should be like
>>> Traceback (most recent call last):
>>> File "<stdin>", line 2, in <module>
>>> raise RuntimeError('runtime error')
>>> RuntimeError: runtime error
"""
with io.StringIO() as fs:
traceback.print_exception(type(err), err, err.__traceback__, file=fs)
return fs.getvalue()
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册