def test_get_exceptions_simple(text, expected): tree = astroid.parse(text) print(tree.repr_tree()) returns = tuple(r.value for r in get_exceptions(body=tree.body)) assert returns == expected tree = ast.parse(text) print(ast.dump(tree)) returns = tuple(r.value for r in get_exceptions(body=tree.body)) assert returns == expected
def test_inference_simple(): text = """ def subf(): raise ValueError # explicit raise def subf2(): c = 1 - 1 1 / c # implicit raise d = [1, 2, 3] 1 / d # resolved into not a constant a = b @deal.raises(KeyError) def f(): a = 1 a() # resolved not in a function unknown() # cannot resolve subf() # resolve subf2() """ tree = astroid.parse(dedent(text)) print(tree.repr_tree()) func_tree = tree.body[-1].body returns = tuple(r.value for r in get_exceptions(body=func_tree)) assert returns == (ValueError, ZeroDivisionError)
def test_stubs_next_to_imported_module(tmp_path: Path): root = tmp_path / 'project' root.mkdir() (root / '__init__.py').touch() (root / 'other.py').write_text('def parent(): pass') stub = {'parent': {'raises': ['ZeroDivisionError', 'SomeError']}} (root / 'other.json').write_text(json.dumps(stub)) stubs = StubsManager() text = """ from project.other import parent @deal.raises() def child(): parent() """ sys.path.append(str(tmp_path)) try: tree = astroid.parse(dedent(text)) print(tree.repr_tree()) func_tree = tree.body[-1].body returns = tuple(r.value for r in get_exceptions(body=func_tree, stubs=stubs)) assert set(returns) == {ZeroDivisionError, 'SomeError'} finally: sys.path = sys.path[:-1]
def test_resolve_doesnt_fail_for_simple_ast(): text = """ def subf(): raise ValueError # explicit raise @deal.raises(KeyError) def f(): subf() """ tree = ast.parse(dedent(text)) print(ast.dump(tree)) func_tree = tree.body[-1].body tuple(get_exceptions(body=func_tree))
def test_inference_ok_uncalled(): text = """ def subf(): raise ValueError @deal.raises(KeyError) def f(): subf """ tree = astroid.parse(dedent(text)) print(tree.repr_tree()) func_tree = tree.body[-1].body returns = tuple(r.value for r in get_exceptions(body=func_tree)) assert returns == ()
def test_inference_assign(): text = """ def subf(): raise Unknown @deal.raises(KeyError) def f(): b = subf() """ tree = astroid.parse(dedent(text)) print(tree.repr_tree()) func_tree = tree.body[-1].body returns = tuple(r.value for r in get_exceptions(body=func_tree)) assert returns == ('Unknown', )
def test_inference_doesnt_have_exceptions(): text = """ def subf(): something() return 1 @deal.raises(KeyError) def f(): b = subf() """ tree = astroid.parse(dedent(text)) print(tree.repr_tree()) func_tree = tree.body[-1].body returns = tuple(r.value for r in get_exceptions(body=func_tree)) assert returns == ()
def test_no_stubs_for_module(): stubs = StubsManager() text = """ from astroid import inference_tip @deal.raises() def child(): inference_tip() """ tree = astroid.parse(dedent(text)) print(tree.repr_tree()) func_tree = tree.body[-1].body returns = tuple(r.value for r in get_exceptions(body=func_tree, stubs=stubs)) assert returns == ()
def test_built_in_stubs(): stubs = StubsManager() text = """ from inspect import getfile @deal.raises() def child(): getfile(1) """ tree = astroid.parse(dedent(text)) print(tree.repr_tree()) func_tree = tree.body[-1].body returns = tuple(r.value for r in get_exceptions(body=func_tree, stubs=stubs)) assert returns == (TypeError, )
def test_marhsmallow_stubs(): stubs = StubsManager() text = """ from marshmallow.utils import from_iso_datetime @deal.raises() def child(): return from_iso_datetime('example') """ tree = astroid.parse(dedent(text)) print(tree.repr_tree()) func_tree = tree.body[-1].body returns = tuple(r.value for r in get_exceptions(body=func_tree, stubs=stubs)) assert returns == (ValueError, )
def test_inference_subcontracts(): text = """ @deal.raises(SomeError) # actual contract @deal.raises(1) # ignore junk @deal.post(lambda _: 1) # ignore other contracts def subf(): return 1 @deal.raises(KeyError) def f(): b = subf() """ tree = astroid.parse(dedent(text)) print(tree.repr_tree()) func_tree = tree.body[-1].body returns = tuple(r.value for r in get_exceptions(body=func_tree)) assert returns == ('SomeError', )
def test_inference_subcalls(): text = """ def subf(): raise ValueError def subf2(): raise IndexError @deal.raises(KeyError) def f(): other(subf(), b=subf2()) """ tree = astroid.parse(dedent(text)) print(tree.repr_tree()) func_tree = tree.body[-1].body returns = tuple(r.value for r in get_exceptions(body=func_tree)) assert returns == (ValueError, IndexError)
def test_infer_junk(): stubs = StubsManager() text = """ def another(): return 2 number = 3 @deal.raises() def child(): another() number() return unknown() # uninferrable """ tree = astroid.parse(dedent(text)) print(tree.repr_tree()) func_tree = tree.body[-1].body returns = tuple(r.value for r in get_exceptions(body=func_tree, stubs=stubs)) assert returns == ()
def test_stubs_in_the_root(tmp_path: Path): root = tmp_path / 'project' root.mkdir() (root / '__init__.py').touch() # (root / 'other.py').touch() stub = {'isnan': {'raises': ['ZeroDivisionError']}} (root / 'math.json').write_text(json.dumps(stub)) stubs = StubsManager(paths=[root]) text = """ from math import isnan @deal.raises() def child(): isnan() """ tree = astroid.parse(dedent(text)) print(tree.repr_tree()) func_tree = tree.body[-1].body returns = tuple(r.value for r in get_exceptions(body=func_tree, stubs=stubs)) assert returns == (ZeroDivisionError, )