From 41266de2b4b12352d862f12151ffb7bd18d5edbe Mon Sep 17 00:00:00 2001 From: sobolevn Date: Sun, 4 Aug 2024 13:17:15 +0300 Subject: [PATCH 1/3] Add optional stderr result to `run_stubtest` in tests --- mypy/test/teststubtest.py | 55 ++++++++++++++++++++++++++++++++++++--- 1 file changed, 51 insertions(+), 4 deletions(-) diff --git a/mypy/test/teststubtest.py b/mypy/test/teststubtest.py index 1cc6c38e6e854..158c1a188ae91 100644 --- a/mypy/test/teststubtest.py +++ b/mypy/test/teststubtest.py @@ -9,7 +9,7 @@ import tempfile import textwrap import unittest -from typing import Any, Callable, Iterator +from typing import Any, Callable, Iterator, Literal, overload import mypy.stubtest from mypy.stubtest import parse_options, test_stubs @@ -144,9 +144,38 @@ def __invert__(self: _T) -> _T: pass """ +@overload def run_stubtest( - stub: str, runtime: str, options: list[str], config_file: str | None = None + stub: str, + runtime: str, + options: list[str], + config_file: str | None = None, + *, + include_stderr: Literal[True], +) -> tuple[str, str]: + """Include the stderr result.""" + + +@overload +def run_stubtest( + stub: str, + runtime: str, + options: list[str], + config_file: str | None = None, + *, + include_stderr: Literal[False] = False, ) -> str: + """Do not include the stderr result.""" + + +def run_stubtest( + stub: str, + runtime: str, + options: list[str], + config_file: str | None = None, + *, + include_stderr: bool = False, +) -> str | tuple[str, str]: with use_tmp_dir(TEST_MODULE_NAME) as tmp_dir: with open("builtins.pyi", "w") as f: f.write(stubtest_builtins_stub) @@ -163,13 +192,18 @@ def run_stubtest( f.write(config_file) options = options + ["--mypy-config-file", f"{TEST_MODULE_NAME}_config.ini"] output = io.StringIO() - with contextlib.redirect_stdout(output): + outerr = io.StringIO() + with contextlib.redirect_stdout(output), contextlib.redirect_stderr(outerr): test_stubs(parse_options([TEST_MODULE_NAME] + options), use_builtins_fixtures=True) - return remove_color_code( + 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, "") ) + if not include_stderr: + return filtered_output + + return (filtered_output, outerr.getvalue()) class Case: @@ -2490,6 +2524,19 @@ def test_config_file_error_codes(self) -> None: output = run_stubtest(stub=stub, runtime=runtime, options=[], config_file=config_file) assert output == "Success: no issues found in 1 module\n" + def test_config_file_error_codes_invalid(self) -> None: + runtime = "temp = 5\n" + stub = "temp: int\n" + config_file = "[mypy]\ndisable_error_code = not-a-valid-name\n" + output, outerr = run_stubtest( + stub=stub, runtime=runtime, options=[], config_file=config_file, include_stderr=True, + ) + assert output == "Success: no issues found in 1 module\n" + assert outerr == ( + "test_module_config.ini: [mypy]: disable_error_code: " + "Invalid error code(s): not-a-valid-name\n" + ) + def test_no_modules(self) -> None: output = io.StringIO() with contextlib.redirect_stdout(output): From 6ccdc40be8164b171c7861968c76749b8ce9d7f7 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Sun, 4 Aug 2024 10:18:49 +0000 Subject: [PATCH 2/3] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- mypy/test/teststubtest.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mypy/test/teststubtest.py b/mypy/test/teststubtest.py index 158c1a188ae91..2cfb936a130d3 100644 --- a/mypy/test/teststubtest.py +++ b/mypy/test/teststubtest.py @@ -2529,7 +2529,7 @@ def test_config_file_error_codes_invalid(self) -> None: stub = "temp: int\n" config_file = "[mypy]\ndisable_error_code = not-a-valid-name\n" output, outerr = run_stubtest( - stub=stub, runtime=runtime, options=[], config_file=config_file, include_stderr=True, + stub=stub, runtime=runtime, options=[], config_file=config_file, include_stderr=True ) assert output == "Success: no issues found in 1 module\n" assert outerr == ( From de247faa3def9ae71f94bb0cd974ec52735d535d Mon Sep 17 00:00:00 2001 From: sobolevn Date: Wed, 14 Aug 2024 09:48:21 +0300 Subject: [PATCH 3/3] Address review --- mypy/test/teststubtest.py | 63 +++++++++++++-------------------------- 1 file changed, 21 insertions(+), 42 deletions(-) diff --git a/mypy/test/teststubtest.py b/mypy/test/teststubtest.py index 32598d0043d0a..70687b499651f 100644 --- a/mypy/test/teststubtest.py +++ b/mypy/test/teststubtest.py @@ -9,7 +9,7 @@ import tempfile import textwrap import unittest -from typing import Any, Callable, Iterator, Literal, overload +from typing import Any, Callable, Iterator import mypy.stubtest from mypy.stubtest import parse_options, test_stubs @@ -144,38 +144,9 @@ def __invert__(self: _T) -> _T: pass """ -@overload -def run_stubtest( - stub: str, - runtime: str, - options: list[str], - config_file: str | None = None, - *, - include_stderr: Literal[True], +def run_stubtest_with_stderr( + stub: str, runtime: str, options: list[str], config_file: str | None = None ) -> tuple[str, str]: - """Include the stderr result.""" - - -@overload -def run_stubtest( - stub: str, - runtime: str, - options: list[str], - config_file: str | None = None, - *, - include_stderr: Literal[False] = False, -) -> str: - """Do not include the stderr result.""" - - -def run_stubtest( - stub: str, - runtime: str, - options: list[str], - config_file: str | None = None, - *, - include_stderr: bool = False, -) -> str | tuple[str, str]: with use_tmp_dir(TEST_MODULE_NAME) as tmp_dir: with open("builtins.pyi", "w") as f: f.write(stubtest_builtins_stub) @@ -195,15 +166,23 @@ def run_stubtest( outerr = io.StringIO() with contextlib.redirect_stdout(output), contextlib.redirect_stderr(outerr): test_stubs(parse_options([TEST_MODULE_NAME] + options), use_builtins_fixtures=True) - 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, "") - ) - if not include_stderr: - return filtered_output + 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, "") + ) + 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, "") + ) + return filtered_output, filtered_outerr - return (filtered_output, outerr.getvalue()) + +def run_stubtest( + stub: str, runtime: str, options: list[str], config_file: str | None = None +) -> str: + return run_stubtest_with_stderr(stub, runtime, options, config_file)[0] class Case: @@ -2628,8 +2607,8 @@ def test_config_file_error_codes_invalid(self) -> None: runtime = "temp = 5\n" stub = "temp: int\n" config_file = "[mypy]\ndisable_error_code = not-a-valid-name\n" - output, outerr = run_stubtest( - stub=stub, runtime=runtime, options=[], config_file=config_file, include_stderr=True + output, outerr = run_stubtest_with_stderr( + stub=stub, runtime=runtime, options=[], config_file=config_file ) assert output == "Success: no issues found in 1 module\n" assert outerr == (