From bb3c4467374a31b713099a14f800fa3d5b6a4650 Mon Sep 17 00:00:00 2001 From: Pierre Sassoulas Date: Sun, 28 Nov 2021 18:05:29 +0100 Subject: Add a warning in functional test update for bad python versions --- pylint/testutils/functional/find_functional_tests.py | 2 +- pylint/testutils/functional/lint_module_output_update.py | 16 ++++++++++++++++ pylint/testutils/functional_test_file.py | 4 ++-- tests/testutils/test_lint_module_output_update.py | 12 ++++++++++++ 4 files changed, 31 insertions(+), 3 deletions(-) diff --git a/pylint/testutils/functional/find_functional_tests.py b/pylint/testutils/functional/find_functional_tests.py index 6eab2e9e8..27e5880da 100644 --- a/pylint/testutils/functional/find_functional_tests.py +++ b/pylint/testutils/functional/find_functional_tests.py @@ -22,7 +22,7 @@ def get_functional_test_files_from_directory( assert ( len(filenames) <= REASONABLY_DISPLAYABLE_VERTICALLY - ), f"{dirpath} contain too much functional tests files." + ), f"{dirpath} contains too many functional tests files." for filename in filenames: if filename != "__init__.py" and filename.endswith(".py"): diff --git a/pylint/testutils/functional/lint_module_output_update.py b/pylint/testutils/functional/lint_module_output_update.py index 113f6448f..dfb891189 100644 --- a/pylint/testutils/functional/lint_module_output_update.py +++ b/pylint/testutils/functional/lint_module_output_update.py @@ -3,7 +3,12 @@ import csv import os +from typing import Optional +from _pytest.config import Config + +from pylint.constants import PY38_PLUS +from pylint.testutils.functional.test_file import FunctionalTestFile from pylint.testutils.lint_module_test import LintModuleTest @@ -16,6 +21,17 @@ class LintModuleOutputUpdate(LintModuleTest): csv.register_dialect("test", TestDialect) + def __init__( + self, test_file: FunctionalTestFile, config: Optional[Config] = None + ) -> None: + if not PY38_PLUS: + raise RuntimeError( + "You need at least python 3.8 for the functional test updater to work. " + "This is because python 3.8 includes a new AST parser, which amongst others " + "returns the end line and end column of most nodes." + ) + super().__init__(test_file, config) + def _check_output_text(self, _, expected_output, actual_output): if not expected_output and not actual_output: if os.path.exists(self._test_file.expected_output): diff --git a/pylint/testutils/functional_test_file.py b/pylint/testutils/functional_test_file.py index 5a6cad2df..cb13cd21d 100644 --- a/pylint/testutils/functional_test_file.py +++ b/pylint/testutils/functional_test_file.py @@ -16,7 +16,7 @@ from pylint.testutils.functional import ( ) warnings.warn( - "'pylint.testutils.functional_test_file' will be accessible by" - " the 'pylint.testutils.functional' API in pylint 3.0", + "'pylint.testutils.functional_test_file' will be accessible from" + " the 'pylint.testutils.functional' namespace in pylint 3.0.", DeprecationWarning, ) diff --git a/tests/testutils/test_lint_module_output_update.py b/tests/testutils/test_lint_module_output_update.py index bf566a473..9f581ce76 100644 --- a/tests/testutils/test_lint_module_output_update.py +++ b/tests/testutils/test_lint_module_output_update.py @@ -7,6 +7,7 @@ from typing import Callable, Tuple import pytest +from pylint.constants import PY38_PLUS from pylint.testutils import FunctionalTestFile from pylint.testutils.functional import LintModuleOutputUpdate @@ -26,6 +27,15 @@ def lint_module_fixture( return inner +@pytest.mark.skipif(PY38_PLUS, reason="Requires python 3.7 or lower") +def test_not_py38(tmp_path: Path) -> None: + with pytest.raises(RuntimeError, match="new, better AST in python 3.8"): + LintModuleOutputUpdate( + test_file=FunctionalTestFile(str(tmp_path), str(tmp_path / "filename.py")) + ) + + +@pytest.mark.skipif(not PY38_PLUS, reason="Requires python 3.8 or superior") def test_lint_module_output_update_fail_before( lint_module_fixture: Callable[[str], Tuple[Path, Path, LintModuleOutputUpdate]] ) -> None: @@ -38,6 +48,7 @@ def test_lint_module_output_update_fail_before( assert not expected_output_file.exists() +@pytest.mark.skipif(not PY38_PLUS, reason="Requires python 3.8 or superior") def test_lint_module_output_update_effective( lint_module_fixture: Callable[[str], Tuple[Path, Path, LintModuleOutputUpdate]] ) -> None: @@ -52,6 +63,7 @@ def test_lint_module_output_update_effective( ) +@pytest.mark.skipif(not PY38_PLUS, reason="Requires python 3.8 or superior") def test_lint_module_output_update_remove_useless_txt( lint_module_fixture: Callable[[str], Tuple[Path, Path, LintModuleOutputUpdate]] ) -> None: -- cgit v1.2.1