| import ast |
| |
| import pytest |
| |
| from pre_commit_hooks.check_builtin_literals import BuiltinTypeCall |
| from pre_commit_hooks.check_builtin_literals import BuiltinTypeVisitor |
| from pre_commit_hooks.check_builtin_literals import main |
| |
| BUILTIN_CONSTRUCTORS = '''\ |
| from six.moves import builtins |
| |
| c1 = complex() |
| d1 = dict() |
| f1 = float() |
| i1 = int() |
| l1 = list() |
| s1 = str() |
| t1 = tuple() |
| |
| c2 = builtins.complex() |
| d2 = builtins.dict() |
| f2 = builtins.float() |
| i2 = builtins.int() |
| l2 = builtins.list() |
| s2 = builtins.str() |
| t2 = builtins.tuple() |
| ''' |
| BUILTIN_LITERALS = '''\ |
| c1 = 0j |
| d1 = {} |
| f1 = 0.0 |
| i1 = 0 |
| l1 = [] |
| s1 = '' |
| t1 = () |
| ''' |
| |
| |
| @pytest.fixture |
| def visitor(): |
| return BuiltinTypeVisitor() |
| |
| |
| @pytest.mark.parametrize( |
| ('expression', 'calls'), |
| [ |
| # see #285 |
| ('x[0]()', []), |
| # complex |
| ("0j", []), |
| ("complex()", [BuiltinTypeCall('complex', 1, 0)]), |
| ("complex(0, 0)", []), |
| ("complex('0+0j')", []), |
| ('builtins.complex()', []), |
| # float |
| ("0.0", []), |
| ("float()", [BuiltinTypeCall('float', 1, 0)]), |
| ("float('0.0')", []), |
| ('builtins.float()', []), |
| # int |
| ("0", []), |
| ("int()", [BuiltinTypeCall('int', 1, 0)]), |
| ("int('0')", []), |
| ('builtins.int()', []), |
| # list |
| ("[]", []), |
| ("list()", [BuiltinTypeCall('list', 1, 0)]), |
| ("list('abc')", []), |
| ("list([c for c in 'abc'])", []), |
| ("list(c for c in 'abc')", []), |
| ('builtins.list()', []), |
| # str |
| ("''", []), |
| ("str()", [BuiltinTypeCall('str', 1, 0)]), |
| ("str('0')", []), |
| ('builtins.str()', []), |
| # tuple |
| ("()", []), |
| ("tuple()", [BuiltinTypeCall('tuple', 1, 0)]), |
| ("tuple('abc')", []), |
| ("tuple([c for c in 'abc'])", []), |
| ("tuple(c for c in 'abc')", []), |
| ('builtins.tuple()', []), |
| ], |
| ) |
| def test_non_dict_exprs(visitor, expression, calls): |
| visitor.visit(ast.parse(expression)) |
| assert visitor.builtin_type_calls == calls |
| |
| |
| @pytest.mark.parametrize( |
| ('expression', 'calls'), |
| [ |
| ("{}", []), |
| ("dict()", [BuiltinTypeCall('dict', 1, 0)]), |
| ("dict(a=1, b=2, c=3)", []), |
| ("dict(**{'a': 1, 'b': 2, 'c': 3})", []), |
| ("dict([(k, v) for k, v in [('a', 1), ('b', 2), ('c', 3)]])", []), |
| ("dict((k, v) for k, v in [('a', 1), ('b', 2), ('c', 3)])", []), |
| ('builtins.dict()', []), |
| ], |
| ) |
| def test_dict_allow_kwargs_exprs(visitor, expression, calls): |
| visitor.visit(ast.parse(expression)) |
| assert visitor.builtin_type_calls == calls |
| |
| |
| @pytest.mark.parametrize( |
| ('expression', 'calls'), |
| [ |
| ("dict()", [BuiltinTypeCall('dict', 1, 0)]), |
| ("dict(a=1, b=2, c=3)", [BuiltinTypeCall('dict', 1, 0)]), |
| ("dict(**{'a': 1, 'b': 2, 'c': 3})", [BuiltinTypeCall('dict', 1, 0)]), |
| ('builtins.dict()', []), |
| ], |
| ) |
| def test_dict_no_allow_kwargs_exprs(expression, calls): |
| visitor = BuiltinTypeVisitor(allow_dict_kwargs=False) |
| visitor.visit(ast.parse(expression)) |
| assert visitor.builtin_type_calls == calls |
| |
| |
| def test_ignore_constructors(): |
| visitor = BuiltinTypeVisitor(ignore=('complex', 'dict', 'float', 'int', 'list', 'str', 'tuple')) |
| visitor.visit(ast.parse(BUILTIN_CONSTRUCTORS)) |
| assert visitor.builtin_type_calls == [] |
| |
| |
| def test_failing_file(tmpdir): |
| f = tmpdir.join('f.py') |
| f.write(BUILTIN_CONSTRUCTORS) |
| rc = main([f.strpath]) |
| assert rc == 1 |
| |
| |
| def test_passing_file(tmpdir): |
| f = tmpdir.join('f.py') |
| f.write(BUILTIN_LITERALS) |
| rc = main([f.strpath]) |
| assert rc == 0 |
| |
| |
| def test_failing_file_ignore_all(tmpdir): |
| f = tmpdir.join('f.py') |
| f.write(BUILTIN_CONSTRUCTORS) |
| rc = main(['--ignore=complex,dict,float,int,list,str,tuple', f.strpath]) |
| assert rc == 0 |