|
@@ -0,0 +1,188 @@
|
|
|
+import re
|
|
|
+
|
|
|
+from tools.mypy_helpers.check_stronglist import _glob_to_re, main
|
|
|
+
|
|
|
+
|
|
|
+def test_glob_to_re_exact_matches():
|
|
|
+ pat = re.compile(_glob_to_re("a.b.c"))
|
|
|
+ assert pat.fullmatch("a.b.c")
|
|
|
+ assert not pat.fullmatch("a.b.c.d")
|
|
|
+ assert not pat.fullmatch("a_b_c")
|
|
|
+
|
|
|
+
|
|
|
+def test_glob_to_re_wildcards():
|
|
|
+ pat = re.compile(_glob_to_re("a.b.c.*"))
|
|
|
+ assert pat.fullmatch("a.b.c")
|
|
|
+ assert pat.fullmatch("a.b.c.d")
|
|
|
+ assert not pat.fullmatch("a_b_c")
|
|
|
+
|
|
|
+
|
|
|
+def test_ok(tmp_path):
|
|
|
+ src = """\
|
|
|
+[[tool.mypy.overrides]]
|
|
|
+module = ["a.b.c", "d.e.f", "g.h.i"]
|
|
|
+disable_error_code = ["misc"]
|
|
|
+
|
|
|
+[[tool.mypy.overrides]]
|
|
|
+module = ["j.k.*"]
|
|
|
+disallow_untyped_defs = true
|
|
|
+"""
|
|
|
+ f = tmp_path.joinpath("f")
|
|
|
+ f.write_text(src)
|
|
|
+
|
|
|
+ tmp_path.joinpath("j/k").mkdir(parents=True)
|
|
|
+ tmp_path.joinpath("j/k/l.py").touch()
|
|
|
+
|
|
|
+ assert main((str(f),)) == 0
|
|
|
+
|
|
|
+
|
|
|
+def test_errors_on_exact_module(tmp_path, capsys):
|
|
|
+ src = """\
|
|
|
+[[tool.mypy.overrides]]
|
|
|
+module = ["a.b.c", "d.e.f", "g.h.i"]
|
|
|
+disable_error_code = ["misc"]
|
|
|
+
|
|
|
+[[tool.mypy.overrides]]
|
|
|
+module = ["a.b.c", "d.e.f"]
|
|
|
+disallow_untyped_defs = true
|
|
|
+"""
|
|
|
+ f = tmp_path.joinpath("f")
|
|
|
+ f.write_text(src)
|
|
|
+
|
|
|
+ tmp_path.joinpath("a/b").mkdir(parents=True)
|
|
|
+ tmp_path.joinpath("a/b/c.py").touch()
|
|
|
+ tmp_path.joinpath("d/e").mkdir(parents=True)
|
|
|
+ tmp_path.joinpath("d/e/f.py").touch()
|
|
|
+
|
|
|
+ assert main((str(f),)) == 1
|
|
|
+
|
|
|
+ expected = f"""\
|
|
|
+{f}: a.b.c is in the typing errors allowlist *and* stronglist
|
|
|
+{f}: d.e.f is in the typing errors allowlist *and* stronglist
|
|
|
+"""
|
|
|
+ assert capsys.readouterr().out == expected
|
|
|
+
|
|
|
+
|
|
|
+def test_errors_on_globbed_module(tmp_path, capsys):
|
|
|
+ src = """\
|
|
|
+[[tool.mypy.overrides]]
|
|
|
+module = ["a.b.c", "a.b.c.d", "a.b.c.e"]
|
|
|
+disable_error_code = ["misc"]
|
|
|
+
|
|
|
+[[tool.mypy.overrides]]
|
|
|
+module = ["a.b.c.*"]
|
|
|
+disallow_untyped_defs = true
|
|
|
+"""
|
|
|
+ f = tmp_path.joinpath("f")
|
|
|
+ f.write_text(src)
|
|
|
+
|
|
|
+ tmp_path.joinpath("a/b/c").mkdir(parents=True)
|
|
|
+ tmp_path.joinpath("a/b/c/d.py").touch()
|
|
|
+
|
|
|
+ assert main((str(f),)) == 1
|
|
|
+
|
|
|
+ expected = f"""\
|
|
|
+{f}: a.b.c is in the typing errors allowlist *and* stronglist
|
|
|
+{f}: a.b.c.d is in the typing errors allowlist *and* stronglist
|
|
|
+{f}: a.b.c.e is in the typing errors allowlist *and* stronglist
|
|
|
+"""
|
|
|
+ assert capsys.readouterr().out == expected
|
|
|
+
|
|
|
+
|
|
|
+def test_stronglist_existence_file_missing(tmp_path, capsys):
|
|
|
+ src = """\
|
|
|
+[[tool.mypy.overrides]]
|
|
|
+module = []
|
|
|
+disable_error_code = ["misc"]
|
|
|
+
|
|
|
+[[tool.mypy.overrides]]
|
|
|
+module = ["a.b"]
|
|
|
+disallow_untyped_defs = true
|
|
|
+"""
|
|
|
+ f = tmp_path.joinpath("f")
|
|
|
+ f.write_text(src)
|
|
|
+
|
|
|
+ assert main((str(f),)) == 1
|
|
|
+
|
|
|
+ expected = f"""\
|
|
|
+{f}: a.b in stronglist does not match any files!
|
|
|
+"""
|
|
|
+ assert capsys.readouterr().out == expected
|
|
|
+
|
|
|
+
|
|
|
+def test_stronglist_existence_glob_missing(tmp_path, capsys):
|
|
|
+ src = """\
|
|
|
+[[tool.mypy.overrides]]
|
|
|
+module = []
|
|
|
+disable_error_code = ["misc"]
|
|
|
+
|
|
|
+[[tool.mypy.overrides]]
|
|
|
+module = ["a.*"]
|
|
|
+disallow_untyped_defs = true
|
|
|
+"""
|
|
|
+ f = tmp_path.joinpath("f")
|
|
|
+ f.write_text(src)
|
|
|
+
|
|
|
+ assert main((str(f),)) == 1
|
|
|
+
|
|
|
+ expected = f"""\
|
|
|
+{f}: a.* in stronglist does not match any files!
|
|
|
+"""
|
|
|
+ assert capsys.readouterr().out == expected
|
|
|
+
|
|
|
+
|
|
|
+def test_stronglist_existence_ok_src_layout(tmp_path):
|
|
|
+ src = """\
|
|
|
+[[tool.mypy.overrides]]
|
|
|
+module = []
|
|
|
+disable_error_code = ["misc"]
|
|
|
+
|
|
|
+[[tool.mypy.overrides]]
|
|
|
+module = ["a.b"]
|
|
|
+disallow_untyped_defs = true
|
|
|
+"""
|
|
|
+ f = tmp_path.joinpath("f")
|
|
|
+ f.write_text(src)
|
|
|
+
|
|
|
+ tmp_path.joinpath("src/a").mkdir(parents=True)
|
|
|
+ tmp_path.joinpath("src/a/b.py").touch()
|
|
|
+
|
|
|
+ assert main((str(f),)) == 0
|
|
|
+
|
|
|
+
|
|
|
+def test_stronglist_existence_ok_glob(tmp_path):
|
|
|
+ src = """\
|
|
|
+[[tool.mypy.overrides]]
|
|
|
+module = []
|
|
|
+disable_error_code = ["misc"]
|
|
|
+
|
|
|
+[[tool.mypy.overrides]]
|
|
|
+module = ["a.*"]
|
|
|
+disallow_untyped_defs = true
|
|
|
+"""
|
|
|
+ f = tmp_path.joinpath("f")
|
|
|
+ f.write_text(src)
|
|
|
+
|
|
|
+ tmp_path.joinpath("a").mkdir(parents=True)
|
|
|
+ tmp_path.joinpath("a/c.py").touch()
|
|
|
+
|
|
|
+ assert main((str(f),)) == 0
|
|
|
+
|
|
|
+
|
|
|
+def test_stronglist_existince_ok_init_py(tmp_path):
|
|
|
+ src = """\
|
|
|
+[[tool.mypy.overrides]]
|
|
|
+module = []
|
|
|
+disable_error_code = ["misc"]
|
|
|
+
|
|
|
+[[tool.mypy.overrides]]
|
|
|
+module = ["a.b"]
|
|
|
+disallow_untyped_defs = true
|
|
|
+"""
|
|
|
+ f = tmp_path.joinpath("f")
|
|
|
+ f.write_text(src)
|
|
|
+
|
|
|
+ tmp_path.joinpath("a/b").mkdir(parents=True)
|
|
|
+ tmp_path.joinpath("a/b/__init__.py").touch()
|
|
|
+
|
|
|
+ assert main((str(f),)) == 0
|