blob: b818b7af1da9f18fb84b9aa878525b87068c18b2 [file] [log] [blame]
# 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]