| # Licensed under the GPL: https://www.gnu.org/licenses/old-licenses/gpl-2.0.html |
| # For details: https://github.com/pylint-dev/pylint/blob/main/LICENSE |
| # Copyright (c) https://github.com/pylint-dev/pylint/blob/main/CONTRIBUTORS.txt |
| |
| """Test for the (new) implementation of option parsing with argparse.""" |
| |
| import re |
| from os.path import abspath, dirname, join |
| |
| import pytest |
| |
| from pylint.config.arguments_manager import _ArgumentsManager |
| from pylint.config.exceptions import UnrecognizedArgumentAction |
| from pylint.testutils._run import _Run as Run |
| |
| HERE = abspath(dirname(__file__)) |
| REGRTEST_DATA_DIR = join(HERE, "..", "regrtest_data") |
| EMPTY_MODULE = join(REGRTEST_DATA_DIR, "empty.py") |
| LOGGING_TEST = join(HERE, "data", "logging_format_interpolation_style.py") |
| |
| |
| class TestArgparseOptionsProviderMixin: |
| """Tests for the argparse implementation of OptionsProviderMixIn. |
| |
| The logger checker is used as an example checker for this implementation. |
| """ |
| |
| @staticmethod |
| def test_logger_without_options() -> None: |
| """Check that we raise messages when we do not supply any options.""" |
| with pytest.raises(SystemExit) as ex: |
| Run([LOGGING_TEST]) |
| assert ex.value.code == 2 |
| |
| @staticmethod |
| def test_logger_commandline() -> None: |
| """Check that we parse command-line options for the logging checker correctly.""" |
| with pytest.raises(SystemExit) as ex: |
| Run([LOGGING_TEST, "--logging-format-style=new"]) |
| assert ex.value.code == 0 |
| |
| @staticmethod |
| def test_logger_rcfile() -> None: |
| """Check that we parse the rcfile for the logging checker correctly.""" |
| with pytest.raises(SystemExit) as ex: |
| # replace only the last .py in the string with .rc |
| # we do so by inverting the string and replace the first occurrence (of the inverted tokens!) |
| _rcfile = LOGGING_TEST[::-1].replace("yp.", "cr.", 1)[::-1] |
| Run([LOGGING_TEST, f"--rcfile={_rcfile}"]) |
| assert ex.value.code == 0 |
| |
| |
| class TestDeprecationOptions: |
| @staticmethod |
| def test_new_names() -> None: |
| """Check that we correctly emit DeprecationWarnings for deprecated options.""" |
| with pytest.raises(SystemExit) as ex: |
| with pytest.warns(DeprecationWarning) as records: |
| Run([EMPTY_MODULE, "--ignore-mixin-members=yes"]) |
| assert len(records) == 1 |
| assert "--ignore-mixin-members has been deprecated" in records[0] |
| assert ex.value.code == 0 |
| |
| @staticmethod |
| def test_old_names() -> None: |
| """Check that we correctly double assign old name options.""" |
| run = Run([EMPTY_MODULE, "--ignore=test,test_two"], exit=False) |
| assert run.linter.config.ignore == ["test", "test_two"] |
| assert run.linter.config.ignore == run.linter.config.black_list |
| assert run.linter.config.ignore_patterns == (re.compile("^\\.#"),) |
| assert run.linter.config.ignore_patterns == run.linter.config.black_list_re |
| |
| |
| class TestArguments: |
| @staticmethod |
| def test_unrecognized_argument() -> None: |
| """Check that we correctly emit a warning for unrecognized argument types.""" |
| manager = _ArgumentsManager(prog="test") |
| group = manager._arg_parser.add_argument_group(title="test") |
| with pytest.raises(UnrecognizedArgumentAction): |
| # We test with None as that is 'unrecognized' |
| manager._add_parser_option(group, None) # type: ignore[arg-type] |