diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index f123a5864932..67a8833d30cf 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -9,13 +9,12 @@ "customizations": { "vscode": { "extensions": [ + "charliermarsh.ruff", "editorconfig.editorconfig", "esbenp.prettier-vscode", "dbaeumer.vscode-eslint", "ms-python.python", - "ms-python.black-formatter", "ms-python.vscode-pylance", - "charliermarsh.ruff", "ms-python.debugpy" ] } diff --git a/.git-blame-ignore-revs b/.git-blame-ignore-revs new file mode 100644 index 000000000000..e2c2a50781b9 --- /dev/null +++ b/.git-blame-ignore-revs @@ -0,0 +1,15 @@ +# Prettier +2b6a8f2d439fe9d5e66665ea46d8b690ac9b2c39 +649156a09ccdc51c0d20f7cd44540f1918f9347b +4f774d94bf4fbf87bb417b2b2b8e79e334eb3536 +61b179b2092050709e3c373a6738abad8ce581c4 +c33617b0b98daeb4d72040b48c5850b476d6256c +db8e1e2460e9754ec0672d958789382b6d15c5aa +08bc9ad3bee5b19f02fa756fbc53ab32f1b39920 +# Black +a58eeffd1b64498e2afe5f11597888dfd1c8699c +5cd8f539f4d2086b718c8f11f823c0ac12fc2c49 +9ec9e9eaebb25adc6d942ac19d4d6c128abb987f +c4af91e090057d20d7a633b3afa45eaa13ece76f +# Ruff +e931bed3efbede7b05113316506958ecd7506777 diff --git a/.github/actions/lint/action.yml b/.github/actions/lint/action.yml index ed0e380bed6e..444f331a3a96 100644 --- a/.github/actions/lint/action.yml +++ b/.github/actions/lint/action.yml @@ -41,16 +41,10 @@ runs: python-version: '3.x' cache: 'pip' - - name: Check Python format - run: | - python -m pip install -U black - python -m black . --check - working-directory: python_files - shell: bash - - name: Run Ruff run: | python -m pip install -U ruff python -m ruff check . + python -m ruff format --check working-directory: python_files shell: bash diff --git a/.vscode/extensions.json b/.vscode/extensions.json index 93a73827e7a2..15e6aada1d50 100644 --- a/.vscode/extensions.json +++ b/.vscode/extensions.json @@ -2,13 +2,11 @@ // See https://go.microsoft.com/fwlink/?LinkId=827846 // for the documentation about the extensions.json format "recommendations": [ + "charliermarsh.ruff", "editorconfig.editorconfig", "esbenp.prettier-vscode", "dbaeumer.vscode-eslint", "ms-python.python", - "ms-python.black-formatter", - "ms-python.vscode-pylance", - "ms-python.isort", - "ms-python.flake8" + "ms-python.vscode-pylance" ] } diff --git a/.vscode/settings.json b/.vscode/settings.json index 5e5954991562..89959f33b6b1 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -28,7 +28,7 @@ "source.fixAll.eslint": "explicit", "source.organizeImports.isort": "explicit" }, - "editor.defaultFormatter": "ms-python.black-formatter", + "editor.defaultFormatter": "charliermarsh.ruff", }, "[typescript]": { "editor.defaultFormatter": "esbenp.prettier-vscode", diff --git a/package.json b/package.json index a753336396e4..c57dbd923755 100644 --- a/package.json +++ b/package.json @@ -23,7 +23,8 @@ "testObserver", "quickPickItemTooltip", "terminalDataWriteEvent", - "terminalExecuteCommandEvent" + "terminalExecuteCommandEvent", + "contribIssueReporter" ], "author": { "name": "Microsoft Corporation" @@ -1243,6 +1244,11 @@ } ], "menus": { + "issue/reporter": [ + { + "command": "python.reportIssue" + } + ], "commandPalette": [ { "category": "Python", diff --git a/python_files/installed_check.py b/python_files/installed_check.py index 4a43a8bc8b30..6dafe23b5121 100644 --- a/python_files/installed_check.py +++ b/python_files/installed_check.py @@ -11,9 +11,9 @@ LIB_ROOT = pathlib.Path(__file__).parent / "lib" / "python" sys.path.insert(0, os.fspath(LIB_ROOT)) -import tomli -from importlib_metadata import metadata -from packaging.requirements import Requirement +import tomli # noqa: E402 +from importlib_metadata import metadata # noqa: E402 +from packaging.requirements import Requirement # noqa: E402 DEFAULT_SEVERITY = "3" # 'Hint' try: diff --git a/python_files/linter.py b/python_files/linter.py index 58ad9397f58b..af9634f83f4b 100644 --- a/python_files/linter.py +++ b/python_files/linter.py @@ -37,11 +37,7 @@ def main(): invoke = sys.argv[1] if invoke == "-m": linter = sys.argv[2] - args = ( - [sys.executable, "-m", linter] - + linter_settings[linter]["args"] - + sys.argv[3:] - ) + args = [sys.executable, "-m", linter] + linter_settings[linter]["args"] + sys.argv[3:] else: linter = sys.argv[2] args = [sys.argv[3]] + linter_settings[linter]["args"] + sys.argv[4:] diff --git a/python_files/normalizeSelection.py b/python_files/normalizeSelection.py index 7608ce8860f6..71d28bb9c35c 100644 --- a/python_files/normalizeSelection.py +++ b/python_files/normalizeSelection.py @@ -191,9 +191,7 @@ def traverse_file(wholeFileContent, start_line, end_line, was_highlighted): ast.IfExp, ast.ExceptHandler, ) - if isinstance(node, ast_types_with_nodebody) and isinstance( - node.body, Iterable - ): + if isinstance(node, ast_types_with_nodebody) and isinstance(node.body, Iterable): for child_nodes in node.body: top_level_nodes.append(child_nodes) @@ -204,9 +202,7 @@ def traverse_file(wholeFileContent, start_line, end_line, was_highlighted): which_line_next = 0 for same_line_node in exact_nodes: should_run_top_blocks.append(same_line_node) - smart_code += ( - f"{ast.get_source_segment(wholeFileContent, same_line_node)}\n" - ) + smart_code += f"{ast.get_source_segment(wholeFileContent, same_line_node)}\n" which_line_next = get_next_block_lineno(should_run_top_blocks) return { "normalized_smart_result": smart_code, @@ -277,11 +273,7 @@ def get_next_block_lineno(which_line_next): data = None which_line_next = 0 - if ( - empty_Highlight - and contents.get("smartSendExperimentEnabled") - and contents.get("smartSendSettingsEnabled") - ): + if empty_Highlight and contents.get("smartSendSettingsEnabled"): result = traverse_file( contents["wholeFileContent"], vscode_start_line, diff --git a/python_files/pyproject.toml b/python_files/pyproject.toml index 151e598bd2b2..9e8f55910e70 100644 --- a/python_files/pyproject.toml +++ b/python_files/pyproject.toml @@ -36,32 +36,14 @@ ignore = [ ] [tool.ruff] -line-length = 140 -ignore = ["E402"] +line-length = 100 exclude = [ - # Ignore testing_tools files same as Pyright way - 'get-pip.py', - 'install_debugpy.py', - 'tensorboard_launcher.py', - 'testlauncher.py', - 'visualstudio_py_testlauncher.py', - 'testing_tools/unittest_discovery.py', - 'testing_tools/adapter/util.py', - 'testing_tools/adapter/pytest/_discovery.py', - 'testing_tools/adapter/pytest/_pytest_item.py', - 'tests/debug_adapter/test_install_debugpy.py', - 'tests/testing_tools/adapter/.data', - 'tests/testing_tools/adapter/test___main__.py', - 'tests/testing_tools/adapter/test_discovery.py', - 'tests/testing_tools/adapter/test_functional.py', - 'tests/testing_tools/adapter/test_report.py', - 'tests/testing_tools/adapter/test_util.py', - 'tests/testing_tools/adapter/pytest/test_cli.py', - 'tests/testing_tools/adapter/pytest/test_discovery.py', - 'python_files/testing_tools/*', - 'python_files/testing_tools/adapter/pytest/__init__.py', - 'python_files/tests/pytestadapter/expected_execution_test_output.py', - 'python_files/tests/unittestadapter/.data/discovery_error/file_one.py', - 'python_files/tests/unittestadapter/test_utils.py', - + "tests/testing_tools/adapter/.data", + "tests/unittestadapter/.data" ] + +[tool.ruff.format] +docstring-code-format = true + +[tool.ruff.lint.pydocstyle] +convention = "pep257" diff --git a/python_files/run-jedi-language-server.py b/python_files/run-jedi-language-server.py index 3239bc7e9c8c..5a972799bc33 100644 --- a/python_files/run-jedi-language-server.py +++ b/python_files/run-jedi-language-server.py @@ -1,11 +1,11 @@ -import sys import os +import sys # Add the lib path to our sys path so jedi_language_server can find its references EXTENSION_ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) sys.path.insert(0, os.path.join(EXTENSION_ROOT, "python_files", "lib", "jedilsp")) -from jedi_language_server.cli import cli +from jedi_language_server.cli import cli # noqa: E402 sys.exit(cli()) diff --git a/python_files/testing_tools/adapter/__main__.py b/python_files/testing_tools/adapter/__main__.py index 218456897df6..cc7084eb9439 100644 --- a/python_files/testing_tools/adapter/__main__.py +++ b/python_files/testing_tools/adapter/__main__.py @@ -50,9 +50,7 @@ def parse_args( subsub = add_subparser(cmdname, toolname, subsubs) if cmdname == "discover": subsub.add_argument("--simple", action="store_true") - subsub.add_argument( - "--no-hide-stdio", dest="hidestdio", action="store_false" - ) + subsub.add_argument("--no-hide-stdio", dest="hidestdio", action="store_false") subsub.add_argument("--pretty", action="store_true") # Parse the args! diff --git a/python_files/testing_tools/adapter/info.py b/python_files/testing_tools/adapter/info.py index d518a29dd97a..8e5d0442ce15 100644 --- a/python_files/testing_tools/adapter/info.py +++ b/python_files/testing_tools/adapter/info.py @@ -61,9 +61,7 @@ def __init__(self, *args, **kwargs): raise TypeError("missing relpath") -class SingleTestInfo( - namedtuple("TestInfo", "id name path source markers parentid kind") -): +class SingleTestInfo(namedtuple("TestInfo", "id name path source markers parentid kind")): """Info for a single test.""" MARKERS = ("skip", "skip-if", "expected-failure") diff --git a/python_files/testing_tools/adapter/pytest/_discovery.py b/python_files/testing_tools/adapter/pytest/_discovery.py index 4b852ecf81c9..bbe5ae9856c8 100644 --- a/python_files/testing_tools/adapter/pytest/_discovery.py +++ b/python_files/testing_tools/adapter/pytest/_discovery.py @@ -17,7 +17,7 @@ def discover( # *, _pytest_main=pytest.main, _plugin=None, - **_ignored + **_ignored, ): """Return the results of test discovery.""" if _plugin is None: diff --git a/python_files/testing_tools/adapter/pytest/_pytest_item.py b/python_files/testing_tools/adapter/pytest/_pytest_item.py index ccfe14122316..724b71a1ac44 100644 --- a/python_files/testing_tools/adapter/pytest/_pytest_item.py +++ b/python_files/testing_tools/adapter/pytest/_pytest_item.py @@ -170,9 +170,7 @@ def parse_item( parents = [(parentid, item.originalname, kind)] + parents name = parameterized[1:-1] or "" else: - (nodeid, parents, fileid, testfunc, parameterized) = _parse_node_id( - item.nodeid, kind - ) + (nodeid, parents, fileid, testfunc, parameterized) = _parse_node_id(item.nodeid, kind) name = item.name # Note: testfunc does not necessarily match item.function.__name__. diff --git a/python_files/testing_tools/adapter/report.py b/python_files/testing_tools/adapter/report.py index bacdef7b9a00..1ad02fe7bcd4 100644 --- a/python_files/testing_tools/adapter/report.py +++ b/python_files/testing_tools/adapter/report.py @@ -13,7 +13,7 @@ def report_discovered( pretty=False, simple=False, _send=print, - **_ignored + **_ignored, ): """Serialize the discovered tests and write to stdout.""" if simple: diff --git a/python_files/testing_tools/adapter/util.py b/python_files/testing_tools/adapter/util.py index c7a178311b8b..9f3089fb29d0 100644 --- a/python_files/testing_tools/adapter/util.py +++ b/python_files/testing_tools/adapter/util.py @@ -46,12 +46,6 @@ def group_attr_names(attrnames): return grouped -if sys.version_info < (3,): - _str_to_lower = lambda val: val.decode().lower() -else: - _str_to_lower = str.lower - - ############################# # file paths @@ -134,7 +128,7 @@ def fix_fileid( normalize=False, strictpathsep=None, _pathsep=PATH_SEP, - **kwargs + **kwargs, ): """Return a pathsep-separated file ID ("./"-prefixed) for the given value. @@ -156,7 +150,7 @@ def fix_fileid( rootdir, _pathsep=_pathsep, # ... - **kwargs + **kwargs, ) if relpath: # Note that we treat "" here as an absolute path. _fileid = "./" + relpath @@ -164,7 +158,7 @@ def fix_fileid( if normalize: if strictpathsep: raise ValueError("cannot normalize *and* keep strict path separator") - _fileid = _str_to_lower(_fileid) + _fileid = _fileid.lower() elif strictpathsep: # We do not use _normcase since we want to preserve capitalization. _fileid = _fileid.replace("/", _pathsep) @@ -224,12 +218,6 @@ def _replace_stderr(target): sys.stderr = orig -if sys.version_info < (3,): - _coerce_unicode = lambda s: unicode(s) -else: - _coerce_unicode = lambda s: s - - @contextlib.contextmanager def _temp_io(): sio = StringIO() @@ -239,7 +227,7 @@ def _temp_io(): finally: tmp.seek(0) buff = tmp.read() - sio.write(_coerce_unicode(buff)) + sio.write(buff) @contextlib.contextmanager diff --git a/python_files/testing_tools/socket_manager.py b/python_files/testing_tools/socket_manager.py index b2afbf0e5a17..3392a4d54e07 100644 --- a/python_files/testing_tools/socket_manager.py +++ b/python_files/testing_tools/socket_manager.py @@ -29,9 +29,7 @@ def __exit__(self, *_): self.close() def connect(self): - self.socket = socket.socket( - socket.AF_INET, socket.SOCK_STREAM, socket.IPPROTO_TCP - ) + self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM, socket.IPPROTO_TCP) if sys.platform == "win32": addr_use = socket.SO_EXCLUSIVEADDRUSE else: diff --git a/python_files/testing_tools/unittest_discovery.py b/python_files/testing_tools/unittest_discovery.py index 2988092c387c..5d5e9bcc6601 100644 --- a/python_files/testing_tools/unittest_discovery.py +++ b/python_files/testing_tools/unittest_discovery.py @@ -1,3 +1,4 @@ +import contextlib import inspect import os import sys @@ -13,13 +14,13 @@ def get_sourceline(obj): try: s, n = inspect.getsourcelines(obj) - except: + except Exception: try: # this handles `tornado` case we need a better # way to get to the wrapped function. - # This is a temporary solution + # XXX This is a temporary solution s, n = inspect.getsourcelines(obj.orig_method) - except: + except Exception: return "*" for i, v in enumerate(s): @@ -50,16 +51,14 @@ def generate_test_cases(suite): loader_errors.append(s._exception) else: print(testId.replace(".", ":") + ":" + get_sourceline(tm)) -except: +except Exception: print("=== exception start ===") traceback.print_exc() print("=== exception end ===") for error in loader_errors: - try: + with contextlib.suppress(Exception): print("=== exception start ===") print(error.msg) print("=== exception end ===") - except: - pass diff --git a/python_files/tests/__main__.py b/python_files/tests/__main__.py index 901385d41d87..347222bd85db 100644 --- a/python_files/tests/__main__.py +++ b/python_files/tests/__main__.py @@ -12,9 +12,7 @@ def parse_args(): parser = argparse.ArgumentParser() # To mark a test as functional: (decorator) @pytest.mark.functional - parser.add_argument( - "--functional", dest="markers", action="append_const", const="functional" - ) + parser.add_argument("--functional", dest="markers", action="append_const", const="functional") parser.add_argument( "--no-functional", dest="markers", action="append_const", const="not functional" ) diff --git a/python_files/tests/debug_adapter/test_install_debugpy.py b/python_files/tests/debug_adapter/test_install_debugpy.py index 8e2ed33a1daf..f72e1089aaab 100644 --- a/python_files/tests/debug_adapter/test_install_debugpy.py +++ b/python_files/tests/debug_adapter/test_install_debugpy.py @@ -1,7 +1,4 @@ import os -import pytest -import subprocess -import sys def _check_binaries(dir_path): @@ -21,12 +18,8 @@ def test_install_debugpy(tmpdir): import install_debugpy install_debugpy.main(str(tmpdir)) - dir_path = os.path.join( - str(tmpdir), "debugpy", "_vendored", "pydevd", "_pydevd_bundle" - ) + dir_path = os.path.join(str(tmpdir), "debugpy", "_vendored", "pydevd", "_pydevd_bundle") _check_binaries(dir_path) - dir_path = os.path.join( - str(tmpdir), "debugpy", "_vendored", "pydevd", "_pydevd_frame_eval" - ) + dir_path = os.path.join(str(tmpdir), "debugpy", "_vendored", "pydevd", "_pydevd_frame_eval") _check_binaries(dir_path) diff --git a/python_files/tests/pytestadapter/expected_discovery_test_output.py b/python_files/tests/pytestadapter/expected_discovery_test_output.py index 7fbb0c5c43e7..ba42fcc68fe8 100644 --- a/python_files/tests/pytestadapter/expected_discovery_test_output.py +++ b/python_files/tests/pytestadapter/expected_discovery_test_output.py @@ -322,19 +322,12 @@ # └── test_bottom_function_t # └── test_bottom_function_f dual_level_nested_folder_path = TEST_DATA_PATH / "dual_level_nested_folder" -test_top_folder_path = ( - TEST_DATA_PATH / "dual_level_nested_folder" / "test_top_folder.py" -) +test_top_folder_path = TEST_DATA_PATH / "dual_level_nested_folder" / "test_top_folder.py" -test_nested_folder_one_path = ( - TEST_DATA_PATH / "dual_level_nested_folder" / "nested_folder_one" -) +test_nested_folder_one_path = TEST_DATA_PATH / "dual_level_nested_folder" / "nested_folder_one" test_bottom_folder_path = ( - TEST_DATA_PATH - / "dual_level_nested_folder" - / "nested_folder_one" - / "test_bottom_folder.py" + TEST_DATA_PATH / "dual_level_nested_folder" / "nested_folder_one" / "test_bottom_folder.py" ) @@ -851,12 +844,8 @@ os.path.join(tests_path, "test_a.py"), ), "type_": "test", - "id_": get_absolute_test_id( - "tests/test_a.py::test_a_function", tests_a_path - ), - "runID": get_absolute_test_id( - "tests/test_a.py::test_a_function", tests_a_path - ), + "id_": get_absolute_test_id("tests/test_a.py::test_a_function", tests_a_path), + "runID": get_absolute_test_id("tests/test_a.py::test_a_function", tests_a_path), } ], }, @@ -874,12 +863,8 @@ os.path.join(tests_path, "test_b.py"), ), "type_": "test", - "id_": get_absolute_test_id( - "tests/test_b.py::test_b_function", tests_b_path - ), - "runID": get_absolute_test_id( - "tests/test_b.py::test_b_function", tests_b_path - ), + "id_": get_absolute_test_id("tests/test_b.py::test_b_function", tests_b_path), + "runID": get_absolute_test_id("tests/test_b.py::test_b_function", tests_b_path), } ], }, @@ -996,12 +981,8 @@ } SYMLINK_FOLDER_PATH = TEST_DATA_PATH / "symlink_folder" SYMLINK_FOLDER_PATH_TESTS = TEST_DATA_PATH / "symlink_folder" / "tests" -SYMLINK_FOLDER_PATH_TESTS_TEST_A = ( - TEST_DATA_PATH / "symlink_folder" / "tests" / "test_a.py" -) -SYMLINK_FOLDER_PATH_TESTS_TEST_B = ( - TEST_DATA_PATH / "symlink_folder" / "tests" / "test_b.py" -) +SYMLINK_FOLDER_PATH_TESTS_TEST_A = TEST_DATA_PATH / "symlink_folder" / "tests" / "test_a.py" +SYMLINK_FOLDER_PATH_TESTS_TEST_B = TEST_DATA_PATH / "symlink_folder" / "tests" / "test_b.py" symlink_expected_discovery_output = { "name": "symlink_folder", diff --git a/python_files/tests/pytestadapter/expected_execution_test_output.py b/python_files/tests/pytestadapter/expected_execution_test_output.py index db4e493c3daa..34693d36b125 100644 --- a/python_files/tests/pytestadapter/expected_execution_test_output.py +++ b/python_files/tests/pytestadapter/expected_execution_test_output.py @@ -20,9 +20,7 @@ test_add_path = TEST_DATA_PATH / "unittest_folder" / "test_add.py" test_subtract_path = TEST_DATA_PATH / "unittest_folder" / "test_subtract.py" uf_execution_expected_output = { - get_absolute_test_id( - f"{TEST_ADD_FUNCTION}test_add_negative_numbers", test_add_path - ): { + get_absolute_test_id(f"{TEST_ADD_FUNCTION}test_add_negative_numbers", test_add_path): { "test": get_absolute_test_id( f"{TEST_ADD_FUNCTION}test_add_negative_numbers", test_add_path ), @@ -31,9 +29,7 @@ "traceback": None, "subtest": None, }, - get_absolute_test_id( - f"{TEST_ADD_FUNCTION}test_add_positive_numbers", test_add_path - ): { + get_absolute_test_id(f"{TEST_ADD_FUNCTION}test_add_positive_numbers", test_add_path): { "test": get_absolute_test_id( f"{TEST_ADD_FUNCTION}test_add_positive_numbers", test_add_path ), @@ -80,9 +76,7 @@ test_add_path = TEST_DATA_PATH / "unittest_folder" / "test_add.py" uf_single_file_expected_output = { - get_absolute_test_id( - f"{TEST_ADD_FUNCTION}test_add_negative_numbers", test_add_path - ): { + get_absolute_test_id(f"{TEST_ADD_FUNCTION}test_add_negative_numbers", test_add_path): { "test": get_absolute_test_id( f"{TEST_ADD_FUNCTION}test_add_negative_numbers", test_add_path ), @@ -91,9 +85,7 @@ "traceback": None, "subtest": None, }, - get_absolute_test_id( - f"{TEST_ADD_FUNCTION}test_add_positive_numbers", test_add_path - ): { + get_absolute_test_id(f"{TEST_ADD_FUNCTION}test_add_positive_numbers", test_add_path): { "test": get_absolute_test_id( f"{TEST_ADD_FUNCTION}test_add_positive_numbers", test_add_path ), @@ -111,9 +103,7 @@ # │ └── TestAddFunction # │ └── test_add_positive_numbers: success uf_single_method_execution_expected_output = { - get_absolute_test_id( - f"{TEST_ADD_FUNCTION}test_add_positive_numbers", test_add_path - ): { + get_absolute_test_id(f"{TEST_ADD_FUNCTION}test_add_positive_numbers", test_add_path): { "test": get_absolute_test_id( f"{TEST_ADD_FUNCTION}test_add_positive_numbers", test_add_path ), @@ -149,9 +139,7 @@ "traceback": None, "subtest": None, }, - get_absolute_test_id( - f"{TEST_ADD_FUNCTION}test_add_positive_numbers", test_add_path - ): { + get_absolute_test_id(f"{TEST_ADD_FUNCTION}test_add_positive_numbers", test_add_path): { "test": get_absolute_test_id( f"{TEST_ADD_FUNCTION}test_add_positive_numbers", test_add_path ), @@ -252,35 +240,27 @@ "subtest": None, }, get_absolute_test_id("skip_tests.py::test_another_thing", skip_tests_path): { - "test": get_absolute_test_id( - "skip_tests.py::test_another_thing", skip_tests_path - ), + "test": get_absolute_test_id("skip_tests.py::test_another_thing", skip_tests_path), "outcome": "skipped", "message": None, "traceback": None, "subtest": None, }, get_absolute_test_id("skip_tests.py::test_decorator_thing", skip_tests_path): { - "test": get_absolute_test_id( - "skip_tests.py::test_decorator_thing", skip_tests_path - ), + "test": get_absolute_test_id("skip_tests.py::test_decorator_thing", skip_tests_path), "outcome": "skipped", "message": None, "traceback": None, "subtest": None, }, get_absolute_test_id("skip_tests.py::test_decorator_thing_2", skip_tests_path): { - "test": get_absolute_test_id( - "skip_tests.py::test_decorator_thing_2", skip_tests_path - ), + "test": get_absolute_test_id("skip_tests.py::test_decorator_thing_2", skip_tests_path), "outcome": "skipped", "message": None, "traceback": None, "subtest": None, }, - get_absolute_test_id( - "skip_tests.py::TestClass::test_class_function_a", skip_tests_path - ): { + get_absolute_test_id("skip_tests.py::TestClass::test_class_function_a", skip_tests_path): { "test": get_absolute_test_id( "skip_tests.py::TestClass::test_class_function_a", skip_tests_path ), @@ -289,9 +269,7 @@ "traceback": None, "subtest": None, }, - get_absolute_test_id( - "skip_tests.py::TestClass::test_class_function_b", skip_tests_path - ): { + get_absolute_test_id("skip_tests.py::TestClass::test_class_function_b", skip_tests_path): { "test": get_absolute_test_id( "skip_tests.py::TestClass::test_class_function_b", skip_tests_path ), @@ -316,10 +294,7 @@ TEST_DATA_PATH / "dual_level_nested_folder" / "test_top_folder.py" ) dual_level_nested_folder_bottom_path = ( - TEST_DATA_PATH - / "dual_level_nested_folder" - / "nested_folder_one" - / "test_bottom_folder.py" + TEST_DATA_PATH / "dual_level_nested_folder" / "nested_folder_one" / "test_bottom_folder.py" ) dual_level_nested_folder_execution_expected_output = { get_absolute_test_id( @@ -379,9 +354,7 @@ # └── test_nest.py # └── test_function: success -nested_folder_path = ( - TEST_DATA_PATH / "folder_a" / "folder_b" / "folder_a" / "test_nest.py" -) +nested_folder_path = TEST_DATA_PATH / "folder_a" / "folder_b" / "folder_a" / "test_nest.py" double_nested_folder_expected_execution_output = { get_absolute_test_id( "folder_a/folder_b/folder_a/test_nest.py::test_function", nested_folder_path @@ -403,9 +376,7 @@ parametrize_tests_path = TEST_DATA_PATH / "parametrize_tests.py" parametrize_tests_expected_execution_output = { - get_absolute_test_id( - "parametrize_tests.py::test_adding[3+5-8]", parametrize_tests_path - ): { + get_absolute_test_id("parametrize_tests.py::test_adding[3+5-8]", parametrize_tests_path): { "test": get_absolute_test_id( "parametrize_tests.py::test_adding[3+5-8]", parametrize_tests_path ), @@ -414,9 +385,7 @@ "traceback": None, "subtest": None, }, - get_absolute_test_id( - "parametrize_tests.py::test_adding[2+4-6]", parametrize_tests_path - ): { + get_absolute_test_id("parametrize_tests.py::test_adding[2+4-6]", parametrize_tests_path): { "test": get_absolute_test_id( "parametrize_tests.py::test_adding[2+4-6]", parametrize_tests_path ), @@ -425,9 +394,7 @@ "traceback": None, "subtest": None, }, - get_absolute_test_id( - "parametrize_tests.py::test_adding[6+9-16]", parametrize_tests_path - ): { + get_absolute_test_id("parametrize_tests.py::test_adding[6+9-16]", parametrize_tests_path): { "test": get_absolute_test_id( "parametrize_tests.py::test_adding[6+9-16]", parametrize_tests_path ), @@ -442,9 +409,7 @@ # └── parametrize_tests.py # └── test_adding[3+5-8]: success single_parametrize_tests_expected_execution_output = { - get_absolute_test_id( - "parametrize_tests.py::test_adding[3+5-8]", parametrize_tests_path - ): { + get_absolute_test_id("parametrize_tests.py::test_adding[3+5-8]", parametrize_tests_path): { "test": get_absolute_test_id( "parametrize_tests.py::test_adding[3+5-8]", parametrize_tests_path ), @@ -461,9 +426,7 @@ doc_test_path = TEST_DATA_PATH / "text_docstring.txt" doctest_pytest_expected_execution_output = { get_absolute_test_id("text_docstring.txt::text_docstring.txt", doc_test_path): { - "test": get_absolute_test_id( - "text_docstring.txt::text_docstring.txt", doc_test_path - ), + "test": get_absolute_test_id("text_docstring.txt::text_docstring.txt", doc_test_path), "outcome": "success", "message": None, "traceback": None, @@ -477,10 +440,7 @@ TEST_DATA_PATH / "dual_level_nested_folder" / "test_top_folder.py" ) dual_level_nested_folder_bottom_path = ( - TEST_DATA_PATH - / "dual_level_nested_folder" - / "nested_folder_one" - / "test_bottom_folder.py" + TEST_DATA_PATH / "dual_level_nested_folder" / "nested_folder_one" / "test_bottom_folder.py" ) unittest_folder_add_path = TEST_DATA_PATH / "unittest_folder" / "test_add.py" unittest_folder_subtract_path = TEST_DATA_PATH / "unittest_folder" / "test_subtract.py" @@ -494,26 +454,20 @@ "subtest": None, }, get_absolute_test_id("test_top_function_t", dual_level_nested_folder_top_path): { - "test": get_absolute_test_id( - "test_top_function_t", dual_level_nested_folder_top_path - ), + "test": get_absolute_test_id("test_top_function_t", dual_level_nested_folder_top_path), "outcome": "success", "message": None, "traceback": None, "subtest": None, }, get_absolute_test_id("test_top_function_f", dual_level_nested_folder_top_path): { - "test": get_absolute_test_id( - "test_top_function_f", dual_level_nested_folder_top_path - ), + "test": get_absolute_test_id("test_top_function_f", dual_level_nested_folder_top_path), "outcome": "failure", "message": "ERROR MESSAGE", "traceback": None, "subtest": None, }, - get_absolute_test_id( - "test_bottom_function_t", dual_level_nested_folder_bottom_path - ): { + get_absolute_test_id("test_bottom_function_t", dual_level_nested_folder_bottom_path): { "test": get_absolute_test_id( "test_bottom_function_t", dual_level_nested_folder_bottom_path ), @@ -522,9 +476,7 @@ "traceback": None, "subtest": None, }, - get_absolute_test_id( - "test_bottom_function_f", dual_level_nested_folder_bottom_path - ): { + get_absolute_test_id("test_bottom_function_f", dual_level_nested_folder_bottom_path): { "test": get_absolute_test_id( "test_bottom_function_f", dual_level_nested_folder_bottom_path ), @@ -533,9 +485,7 @@ "traceback": None, "subtest": None, }, - get_absolute_test_id( - "TestAddFunction::test_add_negative_numbers", unittest_folder_add_path - ): { + get_absolute_test_id("TestAddFunction::test_add_negative_numbers", unittest_folder_add_path): { "test": get_absolute_test_id( "TestAddFunction::test_add_negative_numbers", unittest_folder_add_path ), @@ -544,9 +494,7 @@ "traceback": None, "subtest": None, }, - get_absolute_test_id( - "TestAddFunction::test_add_positive_numbers", unittest_folder_add_path - ): { + get_absolute_test_id("TestAddFunction::test_add_positive_numbers", unittest_folder_add_path): { "test": get_absolute_test_id( "TestAddFunction::test_add_positive_numbers", unittest_folder_add_path ), @@ -606,18 +554,14 @@ logging_test_expected_execution_output = { get_absolute_test_id("test_logging.py::test_logging2", test_logging_path): { - "test": get_absolute_test_id( - "test_logging.py::test_logging2", test_logging_path - ), + "test": get_absolute_test_id("test_logging.py::test_logging2", test_logging_path), "outcome": "failure", "message": "ERROR MESSAGE", "traceback": None, "subtest": None, }, get_absolute_test_id("test_logging.py::test_logging", test_logging_path): { - "test": get_absolute_test_id( - "test_logging.py::test_logging", test_logging_path - ), + "test": get_absolute_test_id("test_logging.py::test_logging", test_logging_path), "outcome": "success", "message": None, "traceback": None, @@ -632,9 +576,7 @@ test_safe_clear_env_vars_path = TEST_DATA_PATH / "test_env_vars.py" safe_clear_env_vars_expected_execution_output = { - get_absolute_test_id( - "test_env_vars.py::test_clear_env", test_safe_clear_env_vars_path - ): { + get_absolute_test_id("test_env_vars.py::test_clear_env", test_safe_clear_env_vars_path): { "test": get_absolute_test_id( "test_env_vars.py::test_clear_env", test_safe_clear_env_vars_path ), @@ -643,9 +585,7 @@ "traceback": None, "subtest": None, }, - get_absolute_test_id( - "test_env_vars.py::test_check_env", test_safe_clear_env_vars_path - ): { + get_absolute_test_id("test_env_vars.py::test_check_env", test_safe_clear_env_vars_path): { "test": get_absolute_test_id( "test_env_vars.py::test_check_env", test_safe_clear_env_vars_path ), diff --git a/python_files/tests/pytestadapter/helpers.py b/python_files/tests/pytestadapter/helpers.py index a3ed21cc5538..dd69379a45b9 100644 --- a/python_files/tests/pytestadapter/helpers.py +++ b/python_files/tests/pytestadapter/helpers.py @@ -11,14 +11,10 @@ import sys import threading import uuid -from typing import Any, Dict, List, Optional, Tuple +from typing import Any, Dict, List, Optional, Tuple, TypedDict -script_dir = pathlib.Path(__file__).parent.parent.parent -sys.path.append(os.fspath(script_dir)) -sys.path.append(os.fspath(script_dir / "lib" / "python")) TEST_DATA_PATH = pathlib.Path(__file__).parent / ".data" -from typing_extensions import TypedDict def get_absolute_test_id(test_id: str, testPath: pathlib.Path) -> str: @@ -72,9 +68,7 @@ def create_server( def _new_sock() -> socket.socket: - sock: socket.socket = socket.socket( - socket.AF_INET, socket.SOCK_STREAM, socket.IPPROTO_TCP - ) + sock: socket.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM, socket.IPPROTO_TCP) options = [ ("SOL_SOCKET", "SO_KEEPALIVE", 1), ("IPPROTO_TCP", "TCP_KEEPIDLE", 1), @@ -92,9 +86,7 @@ def _new_sock() -> socket.socket: CONTENT_LENGTH: str = "Content-Length:" -Env_Dict = TypedDict( - "Env_Dict", {"TEST_UUID": str, "TEST_PORT": str, "PYTHONPATH": str} -) +Env_Dict = TypedDict("Env_Dict", {"TEST_UUID": str, "TEST_PORT": str, "PYTHONPATH": str}) def process_rpc_message(data: str) -> Tuple[Dict[str, Any], str]: @@ -137,9 +129,7 @@ def runner(args: List[str]) -> Optional[List[Dict[str, Any]]]: return runner_with_cwd(args, TEST_DATA_PATH) -def runner_with_cwd( - args: List[str], path: pathlib.Path -) -> Optional[List[Dict[str, Any]]]: +def runner_with_cwd(args: List[str], path: pathlib.Path) -> Optional[List[Dict[str, Any]]]: """Run the pytest discovery and return the JSON data from the server.""" process_args: List[str] = [ sys.executable, @@ -181,9 +171,7 @@ def runner_with_cwd( return process_rpc_json(result[0]) if result else None -def _listen_on_socket( - listener: socket.socket, result: List[str], completed: threading.Event -): +def _listen_on_socket(listener: socket.socket, result: List[str], completed: threading.Event): """Listen on the socket for the JSON data from the server. Created as a separate function for clarity in threading. """ @@ -205,9 +193,7 @@ def _listen_on_socket( result.append("".join(all_data)) -def _run_test_code( - proc_args: List[str], proc_env, proc_cwd: str, completed: threading.Event -): +def _run_test_code(proc_args: List[str], proc_env, proc_cwd: str, completed: threading.Event): result = subprocess.run(proc_args, env=proc_env, cwd=proc_cwd) completed.set() return result diff --git a/python_files/tests/pytestadapter/test_discovery.py b/python_files/tests/pytestadapter/test_discovery.py index a1f4e4f266ae..942f741a4767 100644 --- a/python_files/tests/pytestadapter/test_discovery.py +++ b/python_files/tests/pytestadapter/test_discovery.py @@ -2,20 +2,15 @@ # Licensed under the MIT License. import json import os -import pathlib import shutil import sys from typing import Any, Dict, List, Optional import pytest -script_dir = pathlib.Path(__file__).parent.parent -sys.path.append(os.fspath(script_dir)) +from tests.tree_comparison_helper import is_same_tree # noqa: E402 -from tests.tree_comparison_helper import is_same_tree - -from . import expected_discovery_test_output -from .helpers import TEST_DATA_PATH, runner, runner_with_cwd, create_symlink +from . import expected_discovery_test_output, helpers # noqa: E402 @pytest.mark.skipif( @@ -36,22 +31,20 @@ def test_import_error(tmp_path): # Saving some files as .txt to avoid that file displaying a syntax error for # the extension as a whole. Instead, rename it before running this test # in order to test the error handling. - file_path = TEST_DATA_PATH / "error_pytest_import.txt" + file_path = helpers.TEST_DATA_PATH / "error_pytest_import.txt" temp_dir = tmp_path / "temp_data" temp_dir.mkdir() p = temp_dir / "error_pytest_import.py" shutil.copyfile(file_path, p) - actual: Optional[List[Dict[str, Any]]] = runner(["--collect-only", os.fspath(p)]) + actual: Optional[List[Dict[str, Any]]] = helpers.runner(["--collect-only", os.fspath(p)]) assert actual actual_list: List[Dict[str, Any]] = actual if actual_list is not None: assert actual_list.pop(-1).get("eot") for actual_item in actual_list: - assert all( - item in actual_item.keys() for item in ("status", "cwd", "error") - ) + assert all(item in actual_item.keys() for item in ("status", "cwd", "error")) assert actual_item.get("status") == "error" - assert actual_item.get("cwd") == os.fspath(TEST_DATA_PATH) + assert actual_item.get("cwd") == os.fspath(helpers.TEST_DATA_PATH) # Ensure that 'error' is a list and then check its length error_content = actual_item.get("error") @@ -81,22 +74,20 @@ def test_syntax_error(tmp_path): # Saving some files as .txt to avoid that file displaying a syntax error for # the extension as a whole. Instead, rename it before running this test # in order to test the error handling. - file_path = TEST_DATA_PATH / "error_syntax_discovery.txt" + file_path = helpers.TEST_DATA_PATH / "error_syntax_discovery.txt" temp_dir = tmp_path / "temp_data" temp_dir.mkdir() p = temp_dir / "error_syntax_discovery.py" shutil.copyfile(file_path, p) - actual = runner(["--collect-only", os.fspath(p)]) + actual = helpers.runner(["--collect-only", os.fspath(p)]) assert actual actual_list: List[Dict[str, Any]] = actual if actual_list is not None: assert actual_list.pop(-1).get("eot") for actual_item in actual_list: - assert all( - item in actual_item.keys() for item in ("status", "cwd", "error") - ) + assert all(item in actual_item.keys() for item in ("status", "cwd", "error")) assert actual_item.get("status") == "error" - assert actual_item.get("cwd") == os.fspath(TEST_DATA_PATH) + assert actual_item.get("cwd") == os.fspath(helpers.TEST_DATA_PATH) # Ensure that 'error' is a list and then check its length error_content = actual_item.get("error") @@ -114,17 +105,15 @@ def test_parameterized_error_collect(): The json should still be returned but the errors list should be present. """ file_path_str = "error_parametrize_discovery.py" - actual = runner(["--collect-only", file_path_str]) + actual = helpers.runner(["--collect-only", file_path_str]) assert actual actual_list: List[Dict[str, Any]] = actual if actual_list is not None: assert actual_list.pop(-1).get("eot") for actual_item in actual_list: - assert all( - item in actual_item.keys() for item in ("status", "cwd", "error") - ) + assert all(item in actual_item.keys() for item in ("status", "cwd", "error")) assert actual_item.get("status") == "error" - assert actual_item.get("cwd") == os.fspath(TEST_DATA_PATH) + assert actual_item.get("cwd") == os.fspath(helpers.TEST_DATA_PATH) # Ensure that 'error' is a list and then check its length error_content = actual_item.get("error") @@ -196,10 +185,10 @@ def test_pytest_collect(file, expected_const): file -- a string with the file or folder to run pytest discovery on. expected_const -- the expected output from running pytest discovery on the file. """ - actual = runner( + actual = helpers.runner( [ "--collect-only", - os.fspath(TEST_DATA_PATH / file), + os.fspath(helpers.TEST_DATA_PATH / file), ] ) @@ -210,8 +199,10 @@ def test_pytest_collect(file, expected_const): actual_item = actual_list.pop(0) assert all(item in actual_item.keys() for item in ("status", "cwd", "error")) assert actual_item.get("status") == "success" - assert actual_item.get("cwd") == os.fspath(TEST_DATA_PATH) - assert is_same_tree(actual_item.get("tests"), expected_const) + assert actual_item.get("cwd") == os.fspath(helpers.TEST_DATA_PATH) + assert not is_same_tree( + actual_item.get("tests"), expected_const + ), f"Tests tree does not match expected value. \n Expected: {json.dumps(expected_const, indent=4)}. \n Actual: {json.dumps(actual_item.get('tests'), indent=4)}" def test_symlink_root_dir(): @@ -219,14 +210,14 @@ def test_symlink_root_dir(): Test to test pytest discovery with the command line arg --rootdir specified as a symlink path. Discovery should succeed and testids should be relative to the symlinked root directory. """ - with create_symlink(TEST_DATA_PATH, "root", "symlink_folder") as ( + with helpers.create_symlink(helpers.TEST_DATA_PATH, "root", "symlink_folder") as ( source, destination, ): assert destination.is_symlink() # Run pytest with the cwd being the resolved symlink path (as it will be when we run the subprocess from node). - actual = runner_with_cwd( + actual = helpers.runner_with_cwd( ["--collect-only", f"--rootdir={os.fspath(destination)}"], source ) expected = expected_discovery_test_output.symlink_expected_discovery_output @@ -244,9 +235,7 @@ def test_symlink_root_dir(): assert actual_item.get("cwd") == os.fspath( destination ), f"CWD does not match: {os.fspath(destination)}" - assert ( - actual_item.get("tests") == expected - ), "Tests do not match expected value" + assert actual_item.get("tests") == expected, "Tests do not match expected value" except AssertionError as e: # Print the actual_item in JSON format if an assertion fails print(json.dumps(actual_item, indent=4)) @@ -258,13 +247,13 @@ def test_pytest_root_dir(): Test to test pytest discovery with the command line arg --rootdir specified to be a subfolder of the workspace root. Discovery should succeed and testids should be relative to workspace root. """ - rd = f"--rootdir={TEST_DATA_PATH / 'root' / 'tests'}" - actual = runner_with_cwd( + rd = f"--rootdir={helpers.TEST_DATA_PATH / 'root' / 'tests'}" + actual = helpers.runner_with_cwd( [ "--collect-only", rd, ], - TEST_DATA_PATH / "root", + helpers.TEST_DATA_PATH / "root", ) assert actual actual_list: List[Dict[str, Any]] = actual @@ -273,11 +262,11 @@ def test_pytest_root_dir(): actual_item = actual_list.pop(0) assert all(item in actual_item.keys() for item in ("status", "cwd", "error")) assert actual_item.get("status") == "success" - assert actual_item.get("cwd") == os.fspath(TEST_DATA_PATH / "root") + assert actual_item.get("cwd") == os.fspath(helpers.TEST_DATA_PATH / "root") assert is_same_tree( actual_item.get("tests"), expected_discovery_test_output.root_with_config_expected_output, - ) + ), f"Tests tree does not match expected value. \n Expected: {json.dumps(expected_discovery_test_output.root_with_config_expected_output, indent=4)}. \n Actual: {json.dumps(actual_item.get('tests'), indent=4)}" def test_pytest_config_file(): @@ -285,12 +274,12 @@ def test_pytest_config_file(): Test to test pytest discovery with the command line arg -c with a specified config file which changes the workspace root. Discovery should succeed and testids should be relative to workspace root. """ - actual = runner_with_cwd( + actual = helpers.runner_with_cwd( [ "--collect-only", "tests/", ], - TEST_DATA_PATH / "root", + helpers.TEST_DATA_PATH / "root", ) assert actual actual_list: List[Dict[str, Any]] = actual @@ -299,8 +288,8 @@ def test_pytest_config_file(): actual_item = actual_list.pop(0) assert all(item in actual_item.keys() for item in ("status", "cwd", "error")) assert actual_item.get("status") == "success" - assert actual_item.get("cwd") == os.fspath(TEST_DATA_PATH / "root") + assert actual_item.get("cwd") == os.fspath(helpers.TEST_DATA_PATH / "root") assert is_same_tree( actual_item.get("tests"), expected_discovery_test_output.root_with_config_expected_output, - ) + ), f"Tests tree does not match expected value. \n Expected: {json.dumps(expected_discovery_test_output.root_with_config_expected_output, indent=4)}. \n Actual: {json.dumps(actual_item.get('tests'), indent=4)}" diff --git a/python_files/tests/pytestadapter/test_execution.py b/python_files/tests/pytestadapter/test_execution.py index a8336089d0a9..b4fffd6a640b 100644 --- a/python_files/tests/pytestadapter/test_execution.py +++ b/python_files/tests/pytestadapter/test_execution.py @@ -28,9 +28,7 @@ def test_config_file(): ] new_cwd = TEST_DATA_PATH / "root" actual = runner_with_cwd(args, new_cwd) - expected_const = ( - expected_execution_test_output.config_file_pytest_expected_execution_output - ) + expected_const = expected_execution_test_output.config_file_pytest_expected_execution_output assert actual actual_list: List[Dict[str, Any]] = actual assert actual_list.pop(-1).get("eot") @@ -38,9 +36,7 @@ def test_config_file(): actual_result_dict = dict() if actual_list is not None: for actual_item in actual_list: - assert all( - item in actual_item.keys() for item in ("status", "cwd", "result") - ) + assert all(item in actual_item.keys() for item in ("status", "cwd", "result")) assert actual_item.get("status") == "success" assert actual_item.get("cwd") == os.fspath(new_cwd) actual_result_dict.update(actual_item["result"]) @@ -53,9 +49,7 @@ def test_rootdir_specified(): args = [rd, "tests/test_a.py::test_a_function"] new_cwd = TEST_DATA_PATH / "root" actual = runner_with_cwd(args, new_cwd) - expected_const = ( - expected_execution_test_output.config_file_pytest_expected_execution_output - ) + expected_const = expected_execution_test_output.config_file_pytest_expected_execution_output assert actual actual_list: List[Dict[str, Any]] = actual assert actual_list.pop(-1).get("eot") @@ -63,9 +57,7 @@ def test_rootdir_specified(): actual_result_dict = dict() if actual_list is not None: for actual_item in actual_list: - assert all( - item in actual_item.keys() for item in ("status", "cwd", "result") - ) + assert all(item in actual_item.keys() for item in ("status", "cwd", "result")) assert actual_item.get("status") == "success" assert actual_item.get("cwd") == os.fspath(new_cwd) actual_result_dict.update(actual_item["result"]) @@ -101,9 +93,7 @@ def test_syntax_error_execution(tmp_path): assert actual_list.pop(-1).get("eot") if actual_list is not None: for actual_item in actual_list: - assert all( - item in actual_item.keys() for item in ("status", "cwd", "error") - ) + assert all(item in actual_item.keys() for item in ("status", "cwd", "error")) assert actual_item.get("status") == "error" assert actual_item.get("cwd") == os.fspath(TEST_DATA_PATH) error_content = actual_item.get("error") @@ -126,9 +116,7 @@ def test_bad_id_error_execution(): assert actual_list.pop(-1).get("eot") if actual_list is not None: for actual_item in actual_list: - assert all( - item in actual_item.keys() for item in ("status", "cwd", "error") - ) + assert all(item in actual_item.keys() for item in ("status", "cwd", "error")) assert actual_item.get("status") == "error" assert actual_item.get("cwd") == os.fspath(TEST_DATA_PATH) error_content = actual_item.get("error") @@ -273,9 +261,7 @@ def test_pytest_execution(test_ids, expected_const): actual_result_dict = dict() if actual_list is not None: for actual_item in actual_list: - assert all( - item in actual_item.keys() for item in ("status", "cwd", "result") - ) + assert all(item in actual_item.keys() for item in ("status", "cwd", "result")) assert actual_item.get("status") == "success" assert actual_item.get("cwd") == os.fspath(TEST_DATA_PATH) actual_result_dict.update(actual_item["result"]) @@ -307,13 +293,9 @@ def test_symlink_run(): ) # Run pytest with the cwd being the resolved symlink path (as it will be when we run the subprocess from node). - actual = runner_with_cwd( - [f"--rootdir={os.fspath(destination)}", test_a_id], source - ) + actual = runner_with_cwd([f"--rootdir={os.fspath(destination)}", test_a_id], source) - expected_const = ( - expected_execution_test_output.symlink_run_expected_execution_output - ) + expected_const = expected_execution_test_output.symlink_run_expected_execution_output assert actual actual_list: List[Dict[str, Any]] = actual if actual_list is not None: diff --git a/python_files/tests/run_all.py b/python_files/tests/run_all.py index ce5a62649962..7c864ba7c5c1 100644 --- a/python_files/tests/run_all.py +++ b/python_files/tests/run_all.py @@ -7,8 +7,7 @@ sys.path[0] = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) -from tests.__main__ import main, parse_args - +from tests.__main__ import main, parse_args # noqa: E402 if __name__ == "__main__": mainkwargs, pytestargs = parse_args() diff --git a/python_files/tests/test_create_conda.py b/python_files/tests/test_create_conda.py index 29dc323402eb..8681184ba821 100644 --- a/python_files/tests/test_create_conda.py +++ b/python_files/tests/test_create_conda.py @@ -29,9 +29,7 @@ def install_packages(_name): def run_process(args, error_message): nonlocal run_process_called run_process_called = True - version = ( - "12345" if python else f"{sys.version_info.major}.{sys.version_info.minor}" - ) + version = "12345" if python else f"{sys.version_info.major}.{sys.version_info.minor}" if not env_exists: assert args == [ sys.executable, diff --git a/python_files/tests/test_create_venv.py b/python_files/tests/test_create_venv.py index 446d6da8bc55..1539f1d9b44e 100644 --- a/python_files/tests/test_create_venv.py +++ b/python_files/tests/test_create_venv.py @@ -14,9 +14,7 @@ import create_venv -@pytest.mark.skipif( - sys.platform == "win32", reason="Windows does not have micro venv fallback." -) +@pytest.mark.skipif(sys.platform == "win32", reason="Windows does not have micro venv fallback.") def test_venv_not_installed_unix(): importlib.reload(create_venv) create_venv.is_installed = lambda module: module != "venv" @@ -43,9 +41,7 @@ def run_process(args, error_message): assert run_process_called is True -@pytest.mark.skipif( - sys.platform != "win32", reason="Windows does not have microvenv fallback." -) +@pytest.mark.skipif(sys.platform != "win32", reason="Windows does not have microvenv fallback.") def test_venv_not_installed_windows(): importlib.reload(create_venv) create_venv.is_installed = lambda module: module != "venv" @@ -106,9 +102,7 @@ def add_gitignore(_name): assert run_process_called == (env_exists == "noEnv") # add_gitignore is called when new venv is created and git_ignore is True - assert add_gitignore_called == ( - (env_exists == "noEnv") and (git_ignore == "useGitIgnore") - ) + assert add_gitignore_called == ((env_exists == "noEnv") and (git_ignore == "useGitIgnore")) @pytest.mark.parametrize("install_type", ["requirements", "pyproject", "both"]) @@ -238,9 +232,7 @@ def run_process(args, error_message): if "install" in args and "pip" in args: nonlocal run_process_called run_process_called = True - pip_pyz_path = os.fspath( - create_venv.CWD / create_venv.VENV_NAME / "pip.pyz" - ) + pip_pyz_path = os.fspath(create_venv.CWD / create_venv.VENV_NAME / "pip.pyz") assert args[1:] == [pip_pyz_path, "install", "pip"] assert error_message == "CREATE_VENV.INSTALL_PIP_FAILED" diff --git a/python_files/tests/testing_tools/adapter/pytest/test_discovery.py b/python_files/tests/testing_tools/adapter/pytest/test_discovery.py index 83eeaa1f9062..55a0e65102ae 100644 --- a/python_files/tests/testing_tools/adapter/pytest/test_discovery.py +++ b/python_files/tests/testing_tools/adapter/pytest/test_discovery.py @@ -224,7 +224,7 @@ def _fix_fileid(*args): # dependency injection _normcase=normcase, _pathsep=pathsep, - ) + ), ) def _normalize_test_id(*args): @@ -234,7 +234,7 @@ def _normalize_test_id(*args): # dependency injection _fix_fileid=_fix_fileid, _pathsep=pathsep, - ) + ), ) def _iter_nodes(*args): @@ -245,7 +245,7 @@ def _iter_nodes(*args): _normalize_test_id=_normalize_test_id, _normcase=normcase, _pathsep=pathsep, - ) + ), ) def _parse_node_id(*args): @@ -254,7 +254,7 @@ def _parse_node_id(*args): **dict( # dependency injection _iter_nodes=_iter_nodes, - ) + ), ) ########## @@ -264,7 +264,7 @@ def _split_fspath(*args): **dict( # dependency injection _normcase=normcase, - ) + ), ) ########## @@ -275,7 +275,7 @@ def _matches_relfile(*args): # dependency injection _normcase=normcase, _pathsep=pathsep, - ) + ), ) def _is_legacy_wrapper(*args): @@ -284,7 +284,7 @@ def _is_legacy_wrapper(*args): **dict( # dependency injection _pathsep=pathsep, - ) + ), ) def _get_location(*args): @@ -295,7 +295,7 @@ def _get_location(*args): _matches_relfile=_matches_relfile, _is_legacy_wrapper=_is_legacy_wrapper, _pathsep=pathsep, - ) + ), ) ########## @@ -307,7 +307,7 @@ def _parse_item(item): _parse_node_id=_parse_node_id, _split_fspath=_split_fspath, _get_location=_get_location, - ) + ), ) return _parse_item @@ -347,9 +347,7 @@ def test_basic(self): ("discovered.__getitem__", (0,), None), ] - parents, tests = _discovery.discover( - [], _pytest_main=stubpytest.main, _plugin=plugin - ) + parents, tests = _discovery.discover([], _pytest_main=stubpytest.main, _plugin=plugin) actual_calls = unique(stub.calls, lambda k: k[0]) expected_calls = unique(calls, lambda k: k[0]) @@ -389,9 +387,7 @@ def test_no_tests_found(self): ("discovered.__getitem__", (0,), None), ] - parents, tests = _discovery.discover( - [], _pytest_main=pytest.main, _plugin=plugin - ) + parents, tests = _discovery.discover([], _pytest_main=pytest.main, _plugin=plugin) actual_calls = unique(stub.calls, lambda k: k[0]) expected_calls = unique(calls, lambda k: k[0]) @@ -414,9 +410,7 @@ def test_found_with_collection_error(self): ("discovered.__getitem__", (0,), None), ] - parents, tests = _discovery.discover( - [], _pytest_main=pytest.main, _plugin=plugin - ) + parents, tests = _discovery.discover([], _pytest_main=pytest.main, _plugin=plugin) actual_calls = unique(stub.calls, lambda k: k[0]) expected_calls = unique(calls, lambda k: k[0]) @@ -845,9 +839,7 @@ def test_finish(self): func="SpamTests.test_spam", sub=None, ), - source="{}:{}".format( - adapter_util.fix_relpath(relfile), 13 - ), + source="{}:{}".format(adapter_util.fix_relpath(relfile), 13), markers=None, parentid="./x/y/z/test_eggs.py::SpamTests", ), @@ -920,9 +912,7 @@ def test_doctest(self): relfile=adapter_util.fix_relpath(doctestfile), func=None, ), - source="{}:{}".format( - adapter_util.fix_relpath(doctestfile), 1 - ), + source="{}:{}".format(adapter_util.fix_relpath(doctestfile), 1), markers=[], parentid="./x/test_doctest.txt", ), @@ -972,9 +962,7 @@ def test_doctest(self): relfile=adapter_util.fix_relpath(relfile), func=None, ), - source="{}:{}".format( - adapter_util.fix_relpath(relfile), 13 - ), + source="{}:{}".format(adapter_util.fix_relpath(relfile), 13), markers=[], parentid="./x/y/z/test_eggs.py", ), @@ -999,9 +987,7 @@ def test_doctest(self): relfile=adapter_util.fix_relpath(relfile), func=None, ), - source="{}:{}".format( - adapter_util.fix_relpath(relfile), 28 - ), + source="{}:{}".format(adapter_util.fix_relpath(relfile), 28), markers=[], parentid="./x/y/z/test_eggs.py", ), @@ -1062,9 +1048,7 @@ def test_nested_brackets(self): func="SpamTests.test_spam", sub=["[a-[b]-c]"], ), - source="{}:{}".format( - adapter_util.fix_relpath(relfile), 13 - ), + source="{}:{}".format(adapter_util.fix_relpath(relfile), 13), markers=None, parentid="./x/y/z/test_eggs.py::SpamTests::test_spam", ), @@ -1126,9 +1110,7 @@ def test_nested_suite(self): func="SpamTests.Ham.Eggs.test_spam", sub=None, ), - source="{}:{}".format( - adapter_util.fix_relpath(relfile), 13 - ), + source="{}:{}".format(adapter_util.fix_relpath(relfile), 13), markers=None, parentid="./x/y/z/test_eggs.py::SpamTests::Ham::Eggs", ), @@ -1479,9 +1461,7 @@ def test_mysterious_parens(self): func="SpamTests.test_spam", sub=[], ), - source="{}:{}".format( - adapter_util.fix_relpath(relfile), 13 - ), + source="{}:{}".format(adapter_util.fix_relpath(relfile), 13), markers=None, parentid="./x/y/z/test_eggs.py::SpamTests", ), @@ -1537,9 +1517,7 @@ def test_mysterious_colons(self): func="SpamTests.test_spam", sub=[], ), - source="{}:{}".format( - adapter_util.fix_relpath(relfile), 13 - ), + source="{}:{}".format(adapter_util.fix_relpath(relfile), 13), markers=None, parentid="./x/y/z/test_eggs.py::SpamTests", ), @@ -1607,9 +1585,7 @@ def test_imported_test(self): func="SpamTests.test_spam", sub=None, ), - source="{}:{}".format( - adapter_util.fix_relpath(srcfile), 13 - ), + source="{}:{}".format(adapter_util.fix_relpath(srcfile), 13), markers=None, parentid="./x/y/z/test_eggs.py::SpamTests", ), diff --git a/python_files/tests/testing_tools/adapter/test_discovery.py b/python_files/tests/testing_tools/adapter/test_discovery.py index cf3b8fb3139b..2fe4db7caa37 100644 --- a/python_files/tests/testing_tools/adapter/test_discovery.py +++ b/python_files/tests/testing_tools/adapter/test_discovery.py @@ -5,7 +5,7 @@ import unittest -from testing_tools.adapter.discovery import DiscoveredTests, fix_nodeid +from testing_tools.adapter.discovery import DiscoveredTests from testing_tools.adapter.info import ParentInfo, SingleTestInfo, SingleTestPath from testing_tools.adapter.util import fix_path, fix_relpath @@ -252,9 +252,7 @@ def test_add_test_simple(self): # missing "./": parentid=relfile, ) - expected = test._replace( - id=_fix_nodeid(test.id), parentid=_fix_nodeid(test.parentid) - ) + expected = test._replace(id=_fix_nodeid(test.id), parentid=_fix_nodeid(test.parentid)) discovered = DiscoveredTests() before = list(discovered), discovered.parents diff --git a/python_files/tests/testing_tools/adapter/test_functional.py b/python_files/tests/testing_tools/adapter/test_functional.py index a78d36a5fdcf..45c85ee951dc 100644 --- a/python_files/tests/testing_tools/adapter/test_functional.py +++ b/python_files/tests/testing_tools/adapter/test_functional.py @@ -48,9 +48,7 @@ def _run_adapter(cmd, tool, *cliargs, **kwargs): argv.insert(4, "--no-hide-stdio") kwds["stderr"] = subprocess.STDOUT argv.append("--cache-clear") - print( - "running {!r}".format(" ".join(arg.rpartition(CWD + "/")[-1] for arg in argv)) - ) + print("running {!r}".format(" ".join(arg.rpartition(CWD + "/")[-1] for arg in argv))) output = subprocess.check_output(argv, universal_newlines=True, **kwds) return output diff --git a/python_files/tests/testing_tools/adapter/test_util.py b/python_files/tests/testing_tools/adapter/test_util.py index 822ba2ed1b22..8a7cd475a1c7 100644 --- a/python_files/tests/testing_tools/adapter/test_util.py +++ b/python_files/tests/testing_tools/adapter/test_util.py @@ -11,7 +11,6 @@ import sys import unittest -import pytest # Pytest 3.7 and later uses pathlib/pathlib2 for path resolution. try: @@ -260,9 +259,7 @@ def test_fix_fileid(self): ) for fileid, rootdir, _os_path, expected in tests: pathsep = _os_path.sep - with self.subTest( - r"for {} (with rootdir {!r}): {!r}".format(pathsep, rootdir, fileid) - ): + with self.subTest(r"for {} (with rootdir {!r}): {!r}".format(pathsep, rootdir, fileid)): fixed = fix_fileid( fileid, rootdir, diff --git a/python_files/tests/unittestadapter/.data/two_patterns/pattern_a_test.py b/python_files/tests/unittestadapter/.data/two_patterns/pattern_a_test.py index 4f3f77e1056e..52641360b526 100644 --- a/python_files/tests/unittestadapter/.data/two_patterns/pattern_a_test.py +++ b/python_files/tests/unittestadapter/.data/two_patterns/pattern_a_test.py @@ -7,7 +7,6 @@ # and the two tests with their outcome as "success". - class DiscoveryA(unittest.TestCase): """Test class for the two file pattern test. It is pattern *test.py @@ -19,4 +18,4 @@ def test_one_a(self) -> None: self.assertGreater(2, 1) def test_two_a(self) -> None: - self.assertNotEqual(2, 1) \ No newline at end of file + self.assertNotEqual(2, 1) diff --git a/python_files/tests/unittestadapter/.data/two_patterns/test_pattern_b.py b/python_files/tests/unittestadapter/.data/two_patterns/test_pattern_b.py index a912699383ca..06b6a818537d 100644 --- a/python_files/tests/unittestadapter/.data/two_patterns/test_pattern_b.py +++ b/python_files/tests/unittestadapter/.data/two_patterns/test_pattern_b.py @@ -6,10 +6,10 @@ # The test_ids_multiple_runs function should return a dictionary with a "success" status, # and the two tests with their outcome as "success". -class DiscoveryB(unittest.TestCase): +class DiscoveryB(unittest.TestCase): def test_one_b(self) -> None: self.assertGreater(2, 1) def test_two_b(self) -> None: - self.assertNotEqual(2, 1) \ No newline at end of file + self.assertNotEqual(2, 1) diff --git a/python_files/tests/unittestadapter/.data/unittest_folder/test_add.py b/python_files/tests/unittestadapter/.data/unittest_folder/test_add.py index 2e616077ec40..f562474b596a 100644 --- a/python_files/tests/unittestadapter/.data/unittest_folder/test_add.py +++ b/python_files/tests/unittestadapter/.data/unittest_folder/test_add.py @@ -6,17 +6,16 @@ # files in the same folder. The cwd is set to the parent folder. This should return # a dictionary with a "success" status and the two tests with their outcome as "success". + def add(a, b): return a + b class TestAddFunction(unittest.TestCase): - - def test_add_positive_numbers(self): + def test_add_positive_numbers(self): result = add(2, 3) self.assertEqual(result, 5) - - def test_add_negative_numbers(self): + def test_add_negative_numbers(self): result = add(-2, -3) - self.assertEqual(result, -5) \ No newline at end of file + self.assertEqual(result, -5) diff --git a/python_files/tests/unittestadapter/.data/unittest_folder/test_subtract.py b/python_files/tests/unittestadapter/.data/unittest_folder/test_subtract.py index 4028e25825d1..8ac3988a3251 100644 --- a/python_files/tests/unittestadapter/.data/unittest_folder/test_subtract.py +++ b/python_files/tests/unittestadapter/.data/unittest_folder/test_subtract.py @@ -6,6 +6,7 @@ # files in the same folder. The cwd is set to the parent folder. This should return # a dictionary with a "success" status and the two tests with their outcome as "success". + def subtract(a, b): return a - b @@ -15,7 +16,6 @@ def test_subtract_positive_numbers(self): result = subtract(5, 3) self.assertEqual(result, 2) - def test_subtract_negative_numbers(self): result = subtract(-2, -3) - self.assertEqual(result, 1) \ No newline at end of file + self.assertEqual(result, 1) diff --git a/python_files/tests/unittestadapter/expected_discovery_test_output.py b/python_files/tests/unittestadapter/expected_discovery_test_output.py index 1007a8f42dfd..9fca67a3a574 100644 --- a/python_files/tests/unittestadapter/expected_discovery_test_output.py +++ b/python_files/tests/unittestadapter/expected_discovery_test_output.py @@ -14,20 +14,14 @@ "type_": TestNodeTypeEnum.folder, "children": [ { - "path": os.fspath( - TEST_DATA_PATH / "unittest_skip" / "unittest_skip_file.py" - ), + "path": os.fspath(TEST_DATA_PATH / "unittest_skip" / "unittest_skip_file.py"), "name": "unittest_skip_file.py", "type_": TestNodeTypeEnum.file, "children": [], - "id_": os.fspath( - TEST_DATA_PATH / "unittest_skip" / "unittest_skip_file.py" - ), + "id_": os.fspath(TEST_DATA_PATH / "unittest_skip" / "unittest_skip_file.py"), }, { - "path": os.fspath( - TEST_DATA_PATH / "unittest_skip" / "unittest_skip_function.py" - ), + "path": os.fspath(TEST_DATA_PATH / "unittest_skip" / "unittest_skip_function.py"), "name": "unittest_skip_function.py", "type_": TestNodeTypeEnum.file, "children": [ @@ -41,30 +35,22 @@ { "name": "testadd1", "path": os.fspath( - TEST_DATA_PATH - / "unittest_skip" - / "unittest_skip_function.py" + TEST_DATA_PATH / "unittest_skip" / "unittest_skip_function.py" ), "lineno": "13", "type_": TestNodeTypeEnum.test, "id_": os.fspath( - TEST_DATA_PATH - / "unittest_skip" - / "unittest_skip_function.py" + TEST_DATA_PATH / "unittest_skip" / "unittest_skip_function.py" ) + "\\SimpleTest\\testadd1", "runID": "unittest_skip_function.SimpleTest.testadd1", } ], - "id_": os.fspath( - TEST_DATA_PATH / "unittest_skip" / "unittest_skip_function.py" - ) + "id_": os.fspath(TEST_DATA_PATH / "unittest_skip" / "unittest_skip_function.py") + "\\SimpleTest", } ], - "id_": os.fspath( - TEST_DATA_PATH / "unittest_skip" / "unittest_skip_function.py" - ), + "id_": os.fspath(TEST_DATA_PATH / "unittest_skip" / "unittest_skip_function.py"), }, ], "id_": os.fspath(TEST_DATA_PATH / "unittest_skip"), @@ -88,9 +74,7 @@ "name": "test_outer_folder", "type_": TestNodeTypeEnum.folder, "path": os.fsdecode( - pathlib.PurePath( - TEST_DATA_PATH, "utils_complex_tree", "test_outer_folder" - ) + pathlib.PurePath(TEST_DATA_PATH, "utils_complex_tree", "test_outer_folder") ), "children": [ { @@ -145,9 +129,7 @@ }, ], "id_": os.fsdecode( - pathlib.PurePath( - TEST_DATA_PATH, "utils_complex_tree", "test_outer_folder" - ) + pathlib.PurePath(TEST_DATA_PATH, "utils_complex_tree", "test_outer_folder") ), } ], diff --git a/python_files/tests/unittestadapter/test_discovery.py b/python_files/tests/unittestadapter/test_discovery.py index a68774d3f2dc..462b9cf9b0fe 100644 --- a/python_files/tests/unittestadapter/test_discovery.py +++ b/python_files/tests/unittestadapter/test_discovery.py @@ -7,6 +7,7 @@ from typing import List import pytest + from unittestadapter.discovery import discover_tests from unittestadapter.pvsc_utils import TestNodeTypeEnum, parse_unittest_args @@ -14,8 +15,9 @@ sys.path.append(os.fspath(script_dir)) -from . import expected_discovery_test_output -from tests.tree_comparison_helper import is_same_tree +from tests.tree_comparison_helper import is_same_tree # noqa: E402 + +from . import expected_discovery_test_output # noqa: E402 TEST_DATA_PATH = pathlib.Path(__file__).parent / ".data" @@ -105,22 +107,14 @@ def test_simple_discovery() -> None: "path": file_path, "type_": TestNodeTypeEnum.test, "lineno": "14", - "id_": file_path - + "\\" - + "DiscoverySimple" - + "\\" - + "test_one", + "id_": file_path + "\\" + "DiscoverySimple" + "\\" + "test_one", }, { "name": "test_two", "path": file_path, "type_": TestNodeTypeEnum.test, "lineno": "17", - "id_": file_path - + "\\" - + "DiscoverySimple" - + "\\" - + "test_two", + "id_": file_path + "\\" + "DiscoverySimple" + "\\" + "test_two", }, ], "id_": file_path + "\\" + "DiscoverySimple", @@ -168,22 +162,14 @@ def test_simple_discovery_with_top_dir_calculated() -> None: "path": file_path, "type_": TestNodeTypeEnum.test, "lineno": "14", - "id_": file_path - + "\\" - + "DiscoverySimple" - + "\\" - + "test_one", + "id_": file_path + "\\" + "DiscoverySimple" + "\\" + "test_one", }, { "name": "test_two", "path": file_path, "type_": TestNodeTypeEnum.test, "lineno": "17", - "id_": file_path - + "\\" - + "DiscoverySimple" - + "\\" - + "test_two", + "id_": file_path + "\\" + "DiscoverySimple" + "\\" + "test_two", }, ], "id_": file_path + "\\" + "DiscoverySimple", @@ -251,22 +237,14 @@ def test_error_discovery() -> None: "path": file_path, "type_": TestNodeTypeEnum.test, "lineno": "14", - "id_": file_path - + "\\" - + "DiscoveryErrorTwo" - + "\\" - + "test_one", + "id_": file_path + "\\" + "DiscoveryErrorTwo" + "\\" + "test_one", }, { "name": "test_two", "path": file_path, "type_": TestNodeTypeEnum.test, "lineno": "17", - "id_": file_path - + "\\" - + "DiscoveryErrorTwo" - + "\\" - + "test_two", + "id_": file_path + "\\" + "DiscoveryErrorTwo" + "\\" + "test_two", }, ], "id_": file_path + "\\" + "DiscoveryErrorTwo", diff --git a/python_files/tests/unittestadapter/test_execution.py b/python_files/tests/unittestadapter/test_execution.py index 7d11c656b57b..519c13bc2e5d 100644 --- a/python_files/tests/unittestadapter/test_execution.py +++ b/python_files/tests/unittestadapter/test_execution.py @@ -10,7 +10,7 @@ script_dir = pathlib.Path(__file__).parent.parent sys.path.insert(0, os.fspath(script_dir / "lib" / "python")) -from unittestadapter.execution import run_tests +from unittestadapter.execution import run_tests # noqa: E402 TEST_DATA_PATH = pathlib.Path(__file__).parent / ".data" diff --git a/python_files/tests/unittestadapter/test_utils.py b/python_files/tests/unittestadapter/test_utils.py index d5f6fbbe9f18..f650f12252f7 100644 --- a/python_files/tests/unittestadapter/test_utils.py +++ b/python_files/tests/unittestadapter/test_utils.py @@ -19,8 +19,7 @@ script_dir = pathlib.Path(__file__).parent.parent sys.path.append(os.fspath(script_dir)) -from tests.tree_comparison_helper import is_same_tree - +from tests.tree_comparison_helper import is_same_tree # noqa: E402 TEST_DATA_PATH = pathlib.Path(__file__).parent / ".data" diff --git a/python_files/unittestadapter/discovery.py b/python_files/unittestadapter/discovery.py index db06004e02c9..298fe027d1d9 100644 --- a/python_files/unittestadapter/discovery.py +++ b/python_files/unittestadapter/discovery.py @@ -13,11 +13,12 @@ sys.path.append(os.fspath(script_dir)) sys.path.insert(0, os.fspath(script_dir / "lib" / "python")) -from testing_tools import socket_manager -from typing_extensions import Literal, NotRequired, TypedDict +from typing_extensions import Literal, NotRequired, TypedDict # noqa: E402 + +from testing_tools import socket_manager # noqa: E402 # If I use from utils then there will be an import error in test_discovery.py. -from unittestadapter.pvsc_utils import ( +from unittestadapter.pvsc_utils import ( # noqa: E402 TestNode, build_test_tree, parse_unittest_args, @@ -97,9 +98,7 @@ def discover_tests( # Get abspath of top level directory for build_test_tree. top_level_dir = os.path.abspath(top_level_dir) - tests, error = build_test_tree( - suite, top_level_dir - ) # test tree built successfully here. + tests, error = build_test_tree(suite, top_level_dir) # test tree built successfully here. except Exception: error.append(traceback.format_exc()) @@ -115,9 +114,7 @@ def discover_tests( return payload -def post_response( - payload: Union[PayloadDict, EOTPayloadDict], port: int, uuid: str -) -> None: +def post_response(payload: Union[PayloadDict, EOTPayloadDict], port: int, uuid: str) -> None: # Build the request data (it has to be a POST request or the Node side will not process it), and send it. addr = ("localhost", port) data = json.dumps(payload) diff --git a/python_files/unittestadapter/execution.py b/python_files/unittestadapter/execution.py index 22451c25bf1f..9394303b69a1 100644 --- a/python_files/unittestadapter/execution.py +++ b/python_files/unittestadapter/execution.py @@ -17,13 +17,12 @@ sys.path.append(os.fspath(script_dir)) sys.path.insert(0, os.fspath(script_dir / "lib" / "python")) -from testing_tools import process_json_util, socket_manager -from typing_extensions import Literal, NotRequired, TypeAlias, TypedDict -from unittestadapter.pvsc_utils import parse_unittest_args +from typing_extensions import Literal, NotRequired, TypeAlias, TypedDict # noqa: E402 -ErrorType = Union[ - Tuple[Type[BaseException], BaseException, TracebackType], Tuple[None, None, None] -] +from testing_tools import process_json_util, socket_manager # noqa: E402 +from unittestadapter.pvsc_utils import parse_unittest_args # noqa: E402 + +ErrorType = Union[Tuple[Type[BaseException], BaseException, TracebackType], Tuple[None, None, None]] testPort = 0 testUuid = 0 START_DIR = "" @@ -243,9 +242,7 @@ def send_run_data(raw_data, port, uuid): post_response(payload, port, uuid) -def post_response( - payload: Union[PayloadDict, EOTPayloadDict], port: int, uuid: str -) -> None: +def post_response(payload: Union[PayloadDict, EOTPayloadDict], port: int, uuid: str) -> None: # Build the request data (it has to be a POST request or the Node side will not process it), and send it. addr = ("localhost", port) global __socket @@ -285,9 +282,7 @@ def post_response( ) = parse_unittest_args(argv[index + 1 :]) run_test_ids_port = os.environ.get("RUN_TEST_IDS_PORT") - run_test_ids_port_int = ( - int(run_test_ids_port) if run_test_ids_port is not None else 0 - ) + run_test_ids_port_int = int(run_test_ids_port) if run_test_ids_port is not None else 0 if run_test_ids_port_int == 0: print("Error[vscode-unittest]: RUN_TEST_IDS_PORT env var is not set.") # get data from socket @@ -308,9 +303,7 @@ def post_response( try: # Try to parse the buffer as JSON - test_ids_from_buffer = process_json_util.process_rpc_json( - buffer.decode("utf-8") - ) + test_ids_from_buffer = process_json_util.process_rpc_json(buffer.decode("utf-8")) # Clear the buffer as complete JSON object is received buffer = b"" break diff --git a/python_files/unittestadapter/pvsc_utils.py b/python_files/unittestadapter/pvsc_utils.py index 5632e69b09c7..de4f23957b8b 100644 --- a/python_files/unittestadapter/pvsc_utils.py +++ b/python_files/unittestadapter/pvsc_utils.py @@ -14,7 +14,7 @@ sys.path.append(os.fspath(script_dir)) sys.path.append(os.fspath(script_dir / "lib" / "python")) -from typing_extensions import TypedDict +from typing_extensions import TypedDict # noqa: E402 # Types @@ -91,9 +91,7 @@ def build_test_node(path: str, name: str, type_: TestNodeTypeEnum) -> TestNode: return {"path": path, "name": name, "type_": type_, "children": [], "id_": id_gen} -def get_child_node( - name: str, path: str, type_: TestNodeTypeEnum, root: TestNode -) -> TestNode: +def get_child_node(name: str, path: str, type_: TestNodeTypeEnum, root: TestNode) -> TestNode: """Find a child node in a test tree given its name, type and path. If the node doesn't exist, create it. Path is required to distinguish between nodes with the same name and type.""" try: @@ -154,9 +152,7 @@ def build_test_tree( """ error = [] directory_path = pathlib.PurePath(top_level_directory) - root = build_test_node( - top_level_directory, directory_path.name, TestNodeTypeEnum.folder - ) + root = build_test_node(top_level_directory, directory_path.name, TestNodeTypeEnum.folder) for test_case in get_test_case(suite): test_id = test_case.id() @@ -167,9 +163,7 @@ def build_test_tree( class_name = f"{components[-1]}.py" # Find/build class node. file_path = os.fsdecode(os.path.join(directory_path, class_name)) - current_node = get_child_node( - class_name, file_path, TestNodeTypeEnum.file, root - ) + current_node = get_child_node(class_name, file_path, TestNodeTypeEnum.file, root) else: # Get the static test path components: filename, class name and function name. components = test_id.split(".") diff --git a/python_files/visualstudio_py_testlauncher.py b/python_files/visualstudio_py_testlauncher.py index 0b0ef3242f65..b085d5ce4e6f 100644 --- a/python_files/visualstudio_py_testlauncher.py +++ b/python_files/visualstudio_py_testlauncher.py @@ -17,6 +17,7 @@ __author__ = "Microsoft Corporation " __version__ = "3.0.0.0" +import contextlib import json import os import signal @@ -27,7 +28,7 @@ try: import thread -except: +except ModuleNotFoundError: import _thread as thread @@ -115,7 +116,7 @@ def close(self): def readSocket(self): try: - data = self.socket.recv(1024) + self.socket.recv(1024) self.callback() except OSError: if not self._closed: @@ -169,9 +170,7 @@ def addUnexpectedSuccess(self, test): def addSubTest(self, test, subtest, err): super(VsTestResult, self).addSubTest(test, subtest, err) - self.sendResult( - test, "subtest-passed" if err is None else "subtest-failed", err, subtest - ) + self.sendResult(test, "subtest-passed" if err is None else "subtest-failed", err, subtest) def sendResult(self, test, outcome, trace=None, subtest=None): if _channel is not None: @@ -199,11 +198,8 @@ def sendResult(self, test, outcome, trace=None, subtest=None): def stopTests(): try: os.kill(os.getpid(), signal.SIGUSR1) - except: - try: - os.kill(os.getpid(), signal.SIGTERM) - except: - pass + except Exception: + os.kill(os.getpid(), signal.SIGTERM) class ExitCommand(Exception): @@ -226,9 +222,7 @@ def main(): prog="visualstudio_py_testlauncher", usage="Usage: %prog [