From 4f907d5963a994f6cefe2e123267711c3b5e5c3a Mon Sep 17 00:00:00 2001 From: Sebastian Rittau Date: Mon, 21 Oct 2024 12:54:06 +0200 Subject: [PATCH 1/4] [stubtest] Verify __all__ exists in stub Closes: #13300 --- mypy/stubtest.py | 2 ++ mypy/test/teststubtest.py | 23 ++++++++--------------- 2 files changed, 10 insertions(+), 15 deletions(-) diff --git a/mypy/stubtest.py b/mypy/stubtest.py index 756f90dccf2e..eb7c536d599a 100644 --- a/mypy/stubtest.py +++ b/mypy/stubtest.py @@ -348,6 +348,8 @@ def verify_mypyfile( # Only verify the contents of the stub's __all__ # if the stub actually defines __all__ yield from _verify_exported_names(object_path, stub, runtime_all_as_set) + else: + yield Error(object_path + ["__all__"], "is not present in stub", stub, runtime) else: runtime_all_as_set = None diff --git a/mypy/test/teststubtest.py b/mypy/test/teststubtest.py index 70687b499651..66865deff830 100644 --- a/mypy/test/teststubtest.py +++ b/mypy/test/teststubtest.py @@ -169,12 +169,14 @@ def run_stubtest_with_stderr( filtered_output = remove_color_code( output.getvalue() # remove cwd as it's not available from outside - .replace(os.path.realpath(tmp_dir) + os.sep, "").replace(tmp_dir + os.sep, "") + .replace(os.path.realpath(tmp_dir) + os.sep, "") + .replace(tmp_dir + os.sep, "") ) filtered_outerr = remove_color_code( outerr.getvalue() # remove cwd as it's not available from outside - .replace(os.path.realpath(tmp_dir) + os.sep, "").replace(tmp_dir + os.sep, "") + .replace(os.path.realpath(tmp_dir) + os.sep, "") + .replace(tmp_dir + os.sep, "") ) return filtered_output, filtered_outerr @@ -1403,7 +1405,7 @@ def test_all_at_runtime_not_stub(self) -> Iterator[Case]: runtime=""" __all__ = [] Z = 5""", - error=None, + error="__all__", ) @collect_cases @@ -1443,7 +1445,7 @@ def h(x: str): ... runtime="", error="h", ) - yield Case(stub="", runtime="__all__ = []", error=None) # dummy case + yield Case(stub="", runtime="__all__ = []", error="__all__") # dummy case yield Case(stub="", runtime="__all__ += ['y']\ny = 5", error="y") yield Case(stub="", runtime="__all__ += ['g']\ndef g(): pass", error="g") # Here we should only check that runtime has B, since the stub explicitly re-exports it @@ -2435,11 +2437,6 @@ def test_output(self) -> None: assert output == expected def test_ignore_flags(self) -> None: - output = run_stubtest( - stub="", runtime="__all__ = ['f']\ndef f(): pass", options=["--ignore-missing-stub"] - ) - assert output == "Success: no issues found in 1 module\n" - output = run_stubtest(stub="", runtime="def f(): pass", options=["--ignore-missing-stub"]) assert output == "Success: no issues found in 1 module\n" @@ -2488,18 +2485,14 @@ def test_allowlist(self) -> None: def good() -> None: ... def bad(number: int) -> None: ... def also_bad(number: int) -> None: ... - """.lstrip( - "\n" - ) + """.lstrip("\n") ), runtime=textwrap.dedent( """ def good(): pass def bad(asdf): pass def also_bad(asdf): pass - """.lstrip( - "\n" - ) + """.lstrip("\n") ), options=["--allowlist", allowlist.name, "--generate-allowlist"], ) From 4d33334045ecff63d6d2e115e47de27a474e55b6 Mon Sep 17 00:00:00 2001 From: Sebastian Rittau Date: Mon, 21 Oct 2024 12:58:31 +0200 Subject: [PATCH 2/4] Reformat --- mypy/test/teststubtest.py | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/mypy/test/teststubtest.py b/mypy/test/teststubtest.py index 66865deff830..9f687fff5e4a 100644 --- a/mypy/test/teststubtest.py +++ b/mypy/test/teststubtest.py @@ -169,14 +169,12 @@ def run_stubtest_with_stderr( filtered_output = remove_color_code( output.getvalue() # remove cwd as it's not available from outside - .replace(os.path.realpath(tmp_dir) + os.sep, "") - .replace(tmp_dir + os.sep, "") + .replace(os.path.realpath(tmp_dir) + os.sep, "").replace(tmp_dir + os.sep, "") ) filtered_outerr = remove_color_code( outerr.getvalue() # remove cwd as it's not available from outside - .replace(os.path.realpath(tmp_dir) + os.sep, "") - .replace(tmp_dir + os.sep, "") + .replace(os.path.realpath(tmp_dir) + os.sep, "").replace(tmp_dir + os.sep, "") ) return filtered_output, filtered_outerr @@ -2485,14 +2483,18 @@ def test_allowlist(self) -> None: def good() -> None: ... def bad(number: int) -> None: ... def also_bad(number: int) -> None: ... - """.lstrip("\n") + """.lstrip( + "\n" + ) ), runtime=textwrap.dedent( """ def good(): pass def bad(asdf): pass def also_bad(asdf): pass - """.lstrip("\n") + """.lstrip( + "\n" + ) ), options=["--allowlist", allowlist.name, "--generate-allowlist"], ) From 86a01603beece03c2373977a4d24c02447164cc0 Mon Sep 17 00:00:00 2001 From: Sebastian Rittau Date: Tue, 22 Oct 2024 11:09:59 +0200 Subject: [PATCH 3/4] Fix missing stubs functionality --- mypy/stubtest.py | 2 +- mypy/test/teststubtest.py | 19 +++++++++++-------- 2 files changed, 12 insertions(+), 9 deletions(-) diff --git a/mypy/stubtest.py b/mypy/stubtest.py index eb7c536d599a..0de5411b01de 100644 --- a/mypy/stubtest.py +++ b/mypy/stubtest.py @@ -349,7 +349,7 @@ def verify_mypyfile( # if the stub actually defines __all__ yield from _verify_exported_names(object_path, stub, runtime_all_as_set) else: - yield Error(object_path + ["__all__"], "is not present in stub", stub, runtime) + yield Error(object_path + ["__all__"], "is not present in stub", MISSING, runtime) else: runtime_all_as_set = None diff --git a/mypy/test/teststubtest.py b/mypy/test/teststubtest.py index 9f687fff5e4a..d0156b2a5efb 100644 --- a/mypy/test/teststubtest.py +++ b/mypy/test/teststubtest.py @@ -169,12 +169,14 @@ def run_stubtest_with_stderr( filtered_output = remove_color_code( output.getvalue() # remove cwd as it's not available from outside - .replace(os.path.realpath(tmp_dir) + os.sep, "").replace(tmp_dir + os.sep, "") + .replace(os.path.realpath(tmp_dir) + os.sep, "") + .replace(tmp_dir + os.sep, "") ) filtered_outerr = remove_color_code( outerr.getvalue() # remove cwd as it's not available from outside - .replace(os.path.realpath(tmp_dir) + os.sep, "").replace(tmp_dir + os.sep, "") + .replace(os.path.realpath(tmp_dir) + os.sep, "") + .replace(tmp_dir + os.sep, "") ) return filtered_output, filtered_outerr @@ -2435,6 +2437,11 @@ def test_output(self) -> None: assert output == expected def test_ignore_flags(self) -> None: + output = run_stubtest( + stub="", runtime="__all__ = ['f']\ndef f(): pass", options=["--ignore-missing-stub"] + ) + assert output == "Success: no issues found in 1 module\n" + output = run_stubtest(stub="", runtime="def f(): pass", options=["--ignore-missing-stub"]) assert output == "Success: no issues found in 1 module\n" @@ -2483,18 +2490,14 @@ def test_allowlist(self) -> None: def good() -> None: ... def bad(number: int) -> None: ... def also_bad(number: int) -> None: ... - """.lstrip( - "\n" - ) + """.lstrip("\n") ), runtime=textwrap.dedent( """ def good(): pass def bad(asdf): pass def also_bad(asdf): pass - """.lstrip( - "\n" - ) + """.lstrip("\n") ), options=["--allowlist", allowlist.name, "--generate-allowlist"], ) From cc56ffe43e3e6ffc1ffa6dee00529b3f0e30a265 Mon Sep 17 00:00:00 2001 From: Sebastian Rittau Date: Tue, 22 Oct 2024 11:13:22 +0200 Subject: [PATCH 4/4] Reformat (again) --- mypy/test/teststubtest.py | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/mypy/test/teststubtest.py b/mypy/test/teststubtest.py index d0156b2a5efb..4cab62875647 100644 --- a/mypy/test/teststubtest.py +++ b/mypy/test/teststubtest.py @@ -169,14 +169,12 @@ def run_stubtest_with_stderr( filtered_output = remove_color_code( output.getvalue() # remove cwd as it's not available from outside - .replace(os.path.realpath(tmp_dir) + os.sep, "") - .replace(tmp_dir + os.sep, "") + .replace(os.path.realpath(tmp_dir) + os.sep, "").replace(tmp_dir + os.sep, "") ) filtered_outerr = remove_color_code( outerr.getvalue() # remove cwd as it's not available from outside - .replace(os.path.realpath(tmp_dir) + os.sep, "") - .replace(tmp_dir + os.sep, "") + .replace(os.path.realpath(tmp_dir) + os.sep, "").replace(tmp_dir + os.sep, "") ) return filtered_output, filtered_outerr @@ -2490,14 +2488,18 @@ def test_allowlist(self) -> None: def good() -> None: ... def bad(number: int) -> None: ... def also_bad(number: int) -> None: ... - """.lstrip("\n") + """.lstrip( + "\n" + ) ), runtime=textwrap.dedent( """ def good(): pass def bad(asdf): pass def also_bad(asdf): pass - """.lstrip("\n") + """.lstrip( + "\n" + ) ), options=["--allowlist", allowlist.name, "--generate-allowlist"], )