From 4594446a197e7fa08fd20a6e4d4da08ccfb03d66 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dani=C3=ABl=20van=20Noord?= <13665637+DanielNoord@users.noreply.github.com> Date: Thu, 14 Apr 2022 10:42:13 +0200 Subject: [PATCH 1/2] Use ``python-typing-update`` on ``pylint/config`` directory --- pylint/config/argument.py | 80 +++++++++----------- pylint/config/arguments_manager.py | 48 ++++++------ pylint/config/arguments_provider.py | 25 +++--- pylint/config/callback_actions.py | 88 +++++++++++----------- pylint/config/config_file_parser.py | 22 +++--- pylint/config/config_initialization.py | 14 ++-- pylint/config/deprecation_actions.py | 16 ++-- pylint/config/find_default_config_files.py | 10 ++- pylint/config/help_formatter.py | 4 +- pylint/config/option.py | 8 +- pylint/config/option_manager_mixin.py | 12 +-- pylint/config/utils.py | 34 ++++----- 12 files changed, 181 insertions(+), 180 deletions(-) diff --git a/pylint/config/argument.py b/pylint/config/argument.py index 9be36f79e0..d63cf10629 100644 --- a/pylint/config/argument.py +++ b/pylint/config/argument.py @@ -7,23 +7,13 @@ An Argument instance represents a pylint option to be handled by an argparse.ArgumentParser """ +from __future__ import annotations import argparse import pathlib import re import sys -from typing import ( - Any, - Callable, - Dict, - List, - Optional, - Pattern, - Sequence, - Tuple, - Type, - Union, -) +from typing import Any, Callable, Pattern, Sequence, Tuple, Union from pylint import interfaces from pylint import utils as pylint_utils @@ -89,7 +79,7 @@ def _non_empty_string_transformer(value: str) -> str: return pylint_utils._unquote(value) -def _py_version_transformer(value: str) -> Tuple[int, ...]: +def _py_version_transformer(value: str) -> tuple[int, ...]: """Transforms a version string into a version tuple.""" try: version = tuple(int(val) for val in value.replace(",", ".").split(".")) @@ -102,7 +92,7 @@ def _py_version_transformer(value: str) -> Tuple[int, ...]: def _regexp_csv_transfomer(value: str) -> Sequence[Pattern[str]]: """Transforms a comma separated list of regular expressions.""" - patterns: List[Pattern[str]] = [] + patterns: list[Pattern[str]] = [] for pattern in _csv_transformer(value): patterns.append(re.compile(pattern)) return patterns @@ -110,7 +100,7 @@ def _regexp_csv_transfomer(value: str) -> Sequence[Pattern[str]]: def _regexp_paths_csv_transfomer(value: str) -> Sequence[Pattern[str]]: """Transforms a comma separated list of regular expressions paths.""" - patterns: List[Pattern[str]] = [] + patterns: list[Pattern[str]] = [] for pattern in _csv_transformer(value): patterns.append( re.compile( @@ -122,7 +112,7 @@ def _regexp_paths_csv_transfomer(value: str) -> Sequence[Pattern[str]]: return patterns -_TYPE_TRANSFORMERS: Dict[str, Callable[[str], _ArgumentTypes]] = { +_TYPE_TRANSFORMERS: dict[str, Callable[[str], _ArgumentTypes]] = { "choice": str, "csv": _csv_transformer, "float": float, @@ -156,10 +146,10 @@ class _Argument: def __init__( self, *, - flags: List[str], + flags: list[str], arg_help: str, hide_help: bool, - section: Optional[str], + section: str | None, ) -> None: self.flags = flags """The name of the argument.""" @@ -189,12 +179,12 @@ class _BaseStoreArgument(_Argument): def __init__( self, *, - flags: List[str], + flags: list[str], action: str, default: _ArgumentTypes, arg_help: str, hide_help: bool, - section: Optional[str], + section: str | None, ) -> None: super().__init__( flags=flags, arg_help=arg_help, hide_help=hide_help, section=section @@ -218,15 +208,15 @@ class _StoreArgument(_BaseStoreArgument): def __init__( self, *, - flags: List[str], + flags: list[str], action: str, default: _ArgumentTypes, arg_type: str, - choices: Optional[List[str]], + choices: list[str] | None, arg_help: str, metavar: str, hide_help: bool, - section: Optional[str], + section: str | None, ) -> None: super().__init__( flags=flags, @@ -266,12 +256,12 @@ class _StoreTrueArgument(_BaseStoreArgument): def __init__( self, *, - flags: List[str], + flags: list[str], action: Literal["store_true"], default: _ArgumentTypes, arg_help: str, hide_help: bool, - section: Optional[str], + section: str | None, ) -> None: super().__init__( flags=flags, @@ -294,15 +284,15 @@ class _DeprecationArgument(_Argument): def __init__( self, *, - flags: List[str], - action: Type[argparse.Action], + flags: list[str], + action: type[argparse.Action], default: _ArgumentTypes, arg_type: str, - choices: Optional[List[str]], + choices: list[str] | None, arg_help: str, metavar: str, hide_help: bool, - section: Optional[str], + section: str | None, ) -> None: super().__init__( flags=flags, arg_help=arg_help, hide_help=hide_help, section=section @@ -342,16 +332,16 @@ class _ExtendArgument(_DeprecationArgument): def __init__( self, *, - flags: List[str], + flags: list[str], action: Literal["extend"], default: _ArgumentTypes, arg_type: str, metavar: str, arg_help: str, hide_help: bool, - section: Optional[str], - choices: Optional[List[str]], - dest: Optional[str], + section: str | None, + choices: list[str] | None, + dest: str | None, ) -> None: # The extend action is included in the stdlib from 3.8+ if PY38_PLUS: @@ -386,15 +376,15 @@ class _StoreOldNamesArgument(_DeprecationArgument): def __init__( self, *, - flags: List[str], + flags: list[str], default: _ArgumentTypes, arg_type: str, - choices: Optional[List[str]], + choices: list[str] | None, arg_help: str, metavar: str, hide_help: bool, - kwargs: Dict[str, Any], - section: Optional[str], + kwargs: dict[str, Any], + section: str | None, ) -> None: super().__init__( flags=flags, @@ -423,15 +413,15 @@ class _StoreNewNamesArgument(_DeprecationArgument): def __init__( self, *, - flags: List[str], + flags: list[str], default: _ArgumentTypes, arg_type: str, - choices: Optional[List[str]], + choices: list[str] | None, arg_help: str, metavar: str, hide_help: bool, - kwargs: Dict[str, Any], - section: Optional[str], + kwargs: dict[str, Any], + section: str | None, ) -> None: super().__init__( flags=flags, @@ -460,12 +450,12 @@ class _CallableArgument(_Argument): def __init__( self, *, - flags: List[str], - action: Type[_CallbackAction], + flags: list[str], + action: type[_CallbackAction], arg_help: str, - kwargs: Dict[str, Any], + kwargs: dict[str, Any], hide_help: bool, - section: Optional[str], + section: str | None, ) -> None: super().__init__( flags=flags, arg_help=arg_help, hide_help=hide_help, section=section diff --git a/pylint/config/arguments_manager.py b/pylint/config/arguments_manager.py index 206951c275..bc5de9111c 100644 --- a/pylint/config/arguments_manager.py +++ b/pylint/config/arguments_manager.py @@ -4,6 +4,8 @@ """Arguments manager class used to handle command-line arguments and options.""" +from __future__ import annotations + import argparse import collections import configparser @@ -15,7 +17,7 @@ import textwrap import warnings from pathlib import Path -from typing import TYPE_CHECKING, Any, Dict, List, Optional, TextIO, Tuple, Union +from typing import TYPE_CHECKING, Any, TextIO, Union import tomlkit @@ -58,7 +60,7 @@ class _ArgumentsManager: """Arguments manager class used to handle command-line arguments and options.""" - def __init__(self, prog: str, usage: Optional[str] = None) -> None: + def __init__(self, prog: str, usage: str | None = None) -> None: self.namespace = argparse.Namespace() """Namespace for all options.""" @@ -69,10 +71,10 @@ def __init__(self, prog: str, usage: Optional[str] = None) -> None: ) """The command line argument parser.""" - self._argument_groups_dict: Dict[str, argparse._ArgumentGroup] = {} + self._argument_groups_dict: dict[str, argparse._ArgumentGroup] = {} """Dictionary of all the argument groups.""" - self._option_dicts: Dict[str, OptionDict] = {} + self._option_dicts: dict[str, OptionDict] = {} """All option dictionaries that have been registered.""" # pylint: disable=fixme @@ -82,12 +84,12 @@ def __init__(self, prog: str, usage: Optional[str] = None) -> None: warnings.filterwarnings("ignore", category=DeprecationWarning) self.reset_parsers(usage or "") # list of registered options providers - self.options_providers: List[ConfigProvider] = [] + self.options_providers: list[ConfigProvider] = [] # dictionary associating option name to checker self._all_options: OrderedDict[str, ConfigProvider] = collections.OrderedDict() - self._short_options: Dict[str, str] = {} - self._nocallback_options: Dict[ConfigProvider, str] = {} - self._mygroups: Dict[str, optparse.OptionGroup] = {} + self._short_options: dict[str, str] = {} + self._nocallback_options: dict[ConfigProvider, str] = {} + self._mygroups: dict[str, optparse.OptionGroup] = {} # verbosity self._maxlevel: int = 0 @@ -95,7 +97,7 @@ def __init__(self, prog: str, usage: Optional[str] = None) -> None: def config(self) -> argparse.Namespace: return self.namespace - def _register_options_provider(self, provider: "_ArgumentsProvider") -> None: + def _register_options_provider(self, provider: _ArgumentsProvider) -> None: """Register an options provider and load its defaults.""" for opt, optdict in provider.options: self._option_dicts[opt] = optdict @@ -113,7 +115,7 @@ def _register_options_provider(self, provider: "_ArgumentsProvider") -> None: self._load_default_argument_values() def _add_arguments_to_parser( - self, section: str, section_desc: Optional[str], argument: _Argument + self, section: str, section_desc: str | None, argument: _Argument ) -> None: """Add an argument to the correct argument section/group.""" try: @@ -210,15 +212,15 @@ def _load_default_argument_values(self) -> None: """Loads the default values of all registered options.""" self.namespace = self._arg_parser.parse_args([], self.namespace) - def _parse_configuration_file(self, arguments: List[str]) -> None: + def _parse_configuration_file(self, arguments: list[str]) -> None: """Parse the arguments found in a configuration file into the namespace.""" # pylint: disable-next=fixme # TODO: This should parse_args instead of parse_known_args self.namespace = self._arg_parser.parse_known_args(arguments, self.namespace)[0] def _parse_command_line_configuration( - self, arguments: Optional[List[str]] = None - ) -> List[str]: + self, arguments: list[str] | None = None + ) -> list[str]: """Parse the arguments found on the command line into the namespace.""" arguments = sys.argv[1:] if arguments is None else arguments @@ -287,8 +289,8 @@ def register_options_provider( def add_option_group( self, group_name: str, - _: Optional[str], - options: List[Tuple[str, OptionDict]], + _: str | None, + options: list[tuple[str, OptionDict]], provider: ConfigProvider, ) -> None: """DEPRECATED.""" @@ -325,7 +327,7 @@ def add_option_group( def add_optik_option( self, provider: ConfigProvider, - optikcontainer: Union[optparse.OptionParser, optparse.OptionGroup], + optikcontainer: optparse.OptionParser | optparse.OptionGroup, opt: str, optdict: OptionDict, ) -> None: @@ -344,7 +346,7 @@ def add_optik_option( def optik_option( self, provider: ConfigProvider, opt: str, optdict: OptionDict - ) -> Tuple[List[str], OptionDict]: + ) -> tuple[list[str], OptionDict]: """DEPRECATED: Get our personal option definition and return a suitable form for use with optik/optparse """ @@ -381,7 +383,7 @@ def optik_option( return args, optdict def generate_config( - self, stream: Optional[TextIO] = None, skipsections: Tuple[str, ...] = () + self, stream: TextIO | None = None, skipsections: tuple[str, ...] = () ) -> None: """DEPRECATED: Write a configuration file according to the current configuration into the given stream or stdout @@ -450,7 +452,7 @@ def load_provider_defaults(self) -> None: provider.load_defaults() def read_config_file( - self, config_file: Optional[Path] = None, verbose: bool = False + self, config_file: Path | None = None, verbose: bool = False ) -> None: """DEPRECATED: Read the configuration file but do not load it (i.e. dispatching values to each option's provider) @@ -548,7 +550,7 @@ def load_configuration(self, **kwargs: Any) -> None: warnings.filterwarnings("ignore", category=DeprecationWarning) return self.load_configuration_from_config(kwargs) - def load_configuration_from_config(self, config: Dict[str, Any]) -> None: + def load_configuration_from_config(self, config: dict[str, Any]) -> None: warnings.warn( "DEPRECATED: load_configuration_from_config has been deprecated. It will be removed in pylint 3.0.", DeprecationWarning, @@ -559,8 +561,8 @@ def load_configuration_from_config(self, config: Dict[str, Any]) -> None: provider.set_option(opt, opt_value) def load_command_line_configuration( - self, args: Optional[List[str]] = None - ) -> List[str]: + self, args: list[str] | None = None + ) -> list[str]: """DEPRECATED: Override configuration according to command line parameters. return additional arguments @@ -580,7 +582,7 @@ def load_command_line_configuration( setattr(config, attr, value) # pragma: no cover # Handled by argparse. return args - def help(self, level: Optional[int] = None) -> str: + def help(self, level: int | None = None) -> str: """Return the usage string based on the available options.""" if level is not None: warnings.warn( diff --git a/pylint/config/arguments_provider.py b/pylint/config/arguments_provider.py index 88038eb901..f89aafd002 100644 --- a/pylint/config/arguments_provider.py +++ b/pylint/config/arguments_provider.py @@ -4,10 +4,11 @@ """Arguments provider class used to expose options.""" +from __future__ import annotations import optparse # pylint: disable=deprecated-module import warnings -from typing import Any, Dict, Iterator, List, Optional, Tuple, Union +from typing import Any, Iterator from pylint.config.arguments_manager import _ArgumentsManager from pylint.config.callback_actions import _CallbackAction @@ -28,7 +29,7 @@ class _ArgumentsProvider: options: Options = () """Options provided by this provider.""" - option_groups_descs: Dict[str, str] = {} + option_groups_descs: dict[str, str] = {} """Option groups of this provider and their descriptions.""" def __init__(self, arguments_manager: _ArgumentsManager) -> None: @@ -71,7 +72,7 @@ def load_defaults(self) -> None: default = optdict.get("default") self.set_option(opt, default, action, optdict) - def option_attrname(self, opt: str, optdict: Optional[OptionDict] = None) -> str: + def option_attrname(self, opt: str, optdict: OptionDict | None = None) -> str: """DEPRECATED: Get the config attribute corresponding to opt.""" warnings.warn( "option_attrname has been deprecated. It will be removed " @@ -174,12 +175,12 @@ def get_option_def(self, opt: str) -> OptionDict: def options_by_section( self, ) -> Iterator[ - Tuple[ - Optional[str], - Union[ - Dict[str, List[Tuple[str, OptionDict, Any]]], - List[Tuple[str, OptionDict, Any]], - ], + tuple[ + str | None, + ( + dict[str, list[tuple[str, OptionDict, Any]]] + | list[tuple[str, OptionDict, Any]] + ), ] ]: """DEPRECATED: Return an iterator on options grouped by section. @@ -191,7 +192,7 @@ def options_by_section( "in a future release.", DeprecationWarning, ) - sections: Dict[str, List[Tuple[str, OptionDict, Any]]] = {} + sections: dict[str, list[tuple[str, OptionDict, Any]]] = {} for optname, optdict in self.options: with warnings.catch_warnings(): warnings.filterwarnings("ignore", category=DeprecationWarning) @@ -204,8 +205,8 @@ def options_by_section( yield section.upper(), options def options_and_values( - self, options: Optional[Options] = None - ) -> Iterator[Tuple[str, OptionDict, Any]]: + self, options: Options | None = None + ) -> Iterator[tuple[str, OptionDict, Any]]: """DEPRECATED.""" warnings.warn( "options_and_values has been deprecated. It will be removed " diff --git a/pylint/config/callback_actions.py b/pylint/config/callback_actions.py index a46674d4bd..f8409e4ff1 100644 --- a/pylint/config/callback_actions.py +++ b/pylint/config/callback_actions.py @@ -6,12 +6,14 @@ """Callback actions for various options.""" +from __future__ import annotations + import abc import argparse import sys import warnings from pathlib import Path -from typing import TYPE_CHECKING, Any, Optional, Sequence, Union +from typing import TYPE_CHECKING, Any, Sequence from pylint import exceptions, extensions, interfaces, utils @@ -29,8 +31,8 @@ def __call__( self, parser: argparse.ArgumentParser, namespace: argparse.Namespace, - values: Union[str, Sequence[Any], None], - option_string: Optional[str] = None, + values: str | Sequence[Any] | None, + option_string: str | None = None, ) -> None: raise NotImplementedError @@ -46,8 +48,8 @@ def __call__( self, parser: argparse.ArgumentParser, namespace: argparse.Namespace, - values: Union[str, Sequence[Any], None], - option_string: Optional[str] = None, + values: str | Sequence[Any] | None, + option_string: str | None = None, ) -> None: return None @@ -63,8 +65,8 @@ def __call__( self, parser: argparse.ArgumentParser, namespace: argparse.Namespace, - values: Union[str, Sequence[Any], None], - option_string: Optional[str] = None, + values: str | Sequence[Any] | None, + option_string: str | None = None, ) -> None: assert isinstance(values, (tuple, list)) current = getattr(namespace, self.dest, []) @@ -88,7 +90,7 @@ def __init__( required: bool = False, help: str = "", metavar: str = "", - **kwargs: "Run", + **kwargs: Run, ) -> None: self.run = kwargs["Run"] @@ -110,8 +112,8 @@ def __call__( self, parser: argparse.ArgumentParser, namespace: argparse.Namespace, - values: Union[str, Sequence[Any], None], - option_string: Optional[str] = None, + values: str | Sequence[Any] | None, + option_string: str | None = None, ) -> None: raise NotImplementedError @@ -131,7 +133,7 @@ def __init__( required: bool = False, help: str = "", metavar: str = "", - **kwargs: "Run", + **kwargs: Run, ) -> None: self.run = kwargs["Run"] super().__init__( @@ -151,8 +153,8 @@ def __call__( self, parser: argparse.ArgumentParser, namespace: argparse.Namespace, - values: Union[str, Sequence[str], None], - option_string: Optional[str] = "--help-msg", + values: str | Sequence[str] | None, + option_string: str | None = "--help-msg", ) -> None: assert isinstance(values, (list, tuple)) self.run.linter.msgs_store.help_message(values) @@ -166,8 +168,8 @@ def __call__( self, parser: argparse.ArgumentParser, namespace: argparse.Namespace, - values: Union[str, Sequence[Any], None], - option_string: Optional[str] = "--list-enabled", + values: str | Sequence[Any] | None, + option_string: str | None = "--list-enabled", ) -> None: self.run.linter.msgs_store.list_messages() sys.exit(0) @@ -180,8 +182,8 @@ def __call__( self, parser: argparse.ArgumentParser, namespace: argparse.Namespace, - values: Union[str, Sequence[Any], None], - option_string: Optional[str] = "--list-msgs-enabled", + values: str | Sequence[Any] | None, + option_string: str | None = "--list-msgs-enabled", ) -> None: self.run.linter.list_messages_enabled() sys.exit(0) @@ -194,8 +196,8 @@ def __call__( self, parser: argparse.ArgumentParser, namespace: argparse.Namespace, - values: Union[str, Sequence[Any], None], - option_string: Optional[str] = "--list-groups", + values: str | Sequence[Any] | None, + option_string: str | None = "--list-groups", ) -> None: for check in self.run.linter.get_checker_names(): print(check) @@ -209,8 +211,8 @@ def __call__( self, parser: argparse.ArgumentParser, namespace: argparse.Namespace, - values: Union[str, Sequence[Any], None], - option_string: Optional[str] = "--list-conf-levels", + values: str | Sequence[Any] | None, + option_string: str | None = "--list-conf-levels", ) -> None: for level in interfaces.CONFIDENCE_LEVELS: print(f"%-18s: {level}") @@ -224,8 +226,8 @@ def __call__( self, parser: argparse.ArgumentParser, namespace: argparse.Namespace, - values: Union[str, Sequence[Any], None], - option_string: Optional[str] = "--list-extensions", + values: str | Sequence[Any] | None, + option_string: str | None = "--list-extensions", ) -> None: for filename in Path(extensions.__file__).parent.iterdir(): if filename.suffix == ".py" and not filename.stem.startswith("_"): @@ -241,8 +243,8 @@ def __call__( self, parser: argparse.ArgumentParser, namespace: argparse.Namespace, - values: Union[str, Sequence[Any], None], - option_string: Optional[str] = "--full-documentation", + values: str | Sequence[Any] | None, + option_string: str | None = "--full-documentation", ) -> None: utils.print_full_documentation(self.run.linter) sys.exit(0) @@ -255,8 +257,8 @@ def __call__( self, parser: argparse.ArgumentParser, namespace: argparse.Namespace, - values: Union[str, Sequence[Any], None], - option_string: Optional[str] = "--generate-rcfile", + values: str | Sequence[Any] | None, + option_string: str | None = "--generate-rcfile", ) -> None: # pylint: disable-next=fixme # TODO: Optparse: Deprecate this after discussion about this removal has been completed. @@ -273,8 +275,8 @@ def __call__( self, parser: argparse.ArgumentParser, namespace: argparse.Namespace, - values: Union[str, Sequence[Any], None], - option_string: Optional[str] = "--generate-toml-config", + values: str | Sequence[Any] | None, + option_string: str | None = "--generate-toml-config", ) -> None: self.run.linter._generate_config_file() sys.exit(0) @@ -295,8 +297,8 @@ def __call__( self, parser: argparse.ArgumentParser, namespace: argparse.Namespace, - values: Union[str, Sequence[Any], None], - option_string: Optional[str] = "--errors-only", + values: str | Sequence[Any] | None, + option_string: str | None = "--errors-only", ) -> None: self.run.linter._error_mode = True @@ -308,10 +310,10 @@ def __call__( self, parser: argparse.ArgumentParser, namespace: argparse.Namespace, - values: Union[str, Sequence[Any], None], - option_string: Optional[str] = "--long-help", + values: str | Sequence[Any] | None, + option_string: str | None = "--long-help", ) -> None: - formatter: "_HelpFormatter" = self.run.linter._arg_parser._get_formatter() + formatter: _HelpFormatter = self.run.linter._arg_parser._get_formatter() # Add extra info as epilog to the help message self.run.linter._arg_parser.epilog = formatter.get_long_description() @@ -335,7 +337,7 @@ def __init__( required: bool = False, help: str = "", metavar: str = "", - **kwargs: "PyLinter", + **kwargs: PyLinter, ) -> None: self.linter = kwargs["linter"] @@ -357,8 +359,8 @@ def __call__( self, parser: argparse.ArgumentParser, namespace: argparse.Namespace, - values: Union[str, Sequence[Any], None], - option_string: Optional[str] = None, + values: str | Sequence[Any] | None, + option_string: str | None = None, ) -> None: raise NotImplementedError @@ -370,8 +372,8 @@ def __call__( self, parser: argparse.ArgumentParser, namespace: argparse.Namespace, - values: Union[str, Sequence[Any], None], - option_string: Optional[str] = "--disable", + values: str | Sequence[Any] | None, + option_string: str | None = "--disable", ) -> None: assert isinstance(values, (tuple, list)) msgids = utils._check_csv(values[0]) @@ -391,8 +393,8 @@ def __call__( self, parser: argparse.ArgumentParser, namespace: argparse.Namespace, - values: Union[str, Sequence[Any], None], - option_string: Optional[str] = "--enable", + values: str | Sequence[Any] | None, + option_string: str | None = "--enable", ) -> None: assert isinstance(values, (tuple, list)) msgids = utils._check_csv(values[0]) @@ -412,8 +414,8 @@ def __call__( self, parser: argparse.ArgumentParser, namespace: argparse.Namespace, - values: Union[str, Sequence[Any], None], - option_string: Optional[str] = "--enable", + values: str | Sequence[Any] | None, + option_string: str | None = "--enable", ) -> None: assert isinstance(values, (tuple, list)) assert isinstance( diff --git a/pylint/config/config_file_parser.py b/pylint/config/config_file_parser.py index d71fc6e099..931b65145a 100644 --- a/pylint/config/config_file_parser.py +++ b/pylint/config/config_file_parser.py @@ -4,11 +4,13 @@ """Configuration file parser class.""" +from __future__ import annotations + import configparser import os import sys from pathlib import Path -from typing import TYPE_CHECKING, Dict, List, Optional, Tuple +from typing import TYPE_CHECKING from pylint.config.utils import _parse_rich_type_value @@ -24,12 +26,12 @@ class _ConfigurationFileParser: """Class to parse various formats of configuration files.""" - def __init__(self, verbose: bool, linter: "PyLinter") -> None: + def __init__(self, verbose: bool, linter: PyLinter) -> None: self.verbose_mode = verbose self.linter = linter @staticmethod - def _parse_ini_file(file_path: Path) -> Tuple[Dict[str, str], List[str]]: + def _parse_ini_file(file_path: Path) -> tuple[dict[str, str], list[str]]: """Parse and handle errors of a ini configuration file.""" parser = configparser.ConfigParser(inline_comment_prefixes=("#", ";")) @@ -37,8 +39,8 @@ def _parse_ini_file(file_path: Path) -> Tuple[Dict[str, str], List[str]]: with open(file_path, encoding="utf_8_sig") as fp: parser.read_file(fp) - config_content: Dict[str, str] = {} - options: List[str] = [] + config_content: dict[str, str] = {} + options: list[str] = [] for section in parser.sections(): for opt, value in parser[section].items(): value = value.replace("\n", "") @@ -46,7 +48,7 @@ def _parse_ini_file(file_path: Path) -> Tuple[Dict[str, str], List[str]]: options += [f"--{opt}", value] return config_content, options - def _parse_toml_file(self, file_path: Path) -> Tuple[Dict[str, str], List[str]]: + def _parse_toml_file(self, file_path: Path) -> tuple[dict[str, str], list[str]]: """Parse and handle errors of a toml configuration file.""" try: with open(file_path, mode="rb") as fp: @@ -60,8 +62,8 @@ def _parse_toml_file(self, file_path: Path) -> Tuple[Dict[str, str], List[str]]: except KeyError: return {}, [] - config_content: Dict[str, str] = {} - options: List[str] = [] + config_content: dict[str, str] = {} + options: list[str] = [] for opt, values in sections_values.items(): if isinstance(values, dict): for config, value in values.items(): @@ -75,8 +77,8 @@ def _parse_toml_file(self, file_path: Path) -> Tuple[Dict[str, str], List[str]]: return config_content, options def parse_config_file( - self, file_path: Optional[Path] - ) -> Tuple[Dict[str, str], List[str]]: + self, file_path: Path | None + ) -> tuple[dict[str, str], list[str]]: """Parse a config file and return str-str pairs.""" if file_path is None: if self.verbose_mode: diff --git a/pylint/config/config_initialization.py b/pylint/config/config_initialization.py index cd4457fb6a..a508aae3df 100644 --- a/pylint/config/config_initialization.py +++ b/pylint/config/config_initialization.py @@ -2,9 +2,11 @@ # For details: https://github.com/PyCQA/pylint/blob/main/LICENSE # Copyright (c) https://github.com/PyCQA/pylint/blob/main/CONTRIBUTORS.txt +from __future__ import annotations + import sys from pathlib import Path -from typing import TYPE_CHECKING, List, Union +from typing import TYPE_CHECKING from pylint import config, reporters from pylint.utils import utils @@ -14,12 +16,12 @@ def _config_initialization( - linter: "PyLinter", - args_list: List[str], - reporter: Union[reporters.BaseReporter, reporters.MultiReporter, None] = None, - config_file: Union[None, str, Path] = None, + linter: PyLinter, + args_list: list[str], + reporter: reporters.BaseReporter | reporters.MultiReporter | None = None, + config_file: None | str | Path = None, verbose_mode: bool = False, -) -> List[str]: +) -> list[str]: """Parse all available options, read config files and command line arguments and set options accordingly. """ diff --git a/pylint/config/deprecation_actions.py b/pylint/config/deprecation_actions.py index ec142fec2c..2847436a93 100644 --- a/pylint/config/deprecation_actions.py +++ b/pylint/config/deprecation_actions.py @@ -6,9 +6,11 @@ """Deprecated option actions.""" +from __future__ import annotations + import argparse import warnings -from typing import Any, List, Optional, Sequence, Union +from typing import Any, Sequence class _OldNamesAction(argparse._StoreAction): @@ -26,7 +28,7 @@ def __init__( required: bool = False, help: str = "", metavar: str = "", - old_names: Optional[List[str]] = None, + old_names: list[str] | None = None, ) -> None: assert old_names self.old_names = old_names @@ -47,8 +49,8 @@ def __call__( self, parser: argparse.ArgumentParser, namespace: argparse.Namespace, - values: Union[str, Sequence[Any], None], - option_string: Optional[str] = None, + values: str | Sequence[Any] | None, + option_string: str | None = None, ): assert isinstance(values, list) setattr(namespace, self.dest, values[0]) @@ -71,7 +73,7 @@ def __init__( required: bool = False, help: str = "", metavar: str = "", - new_names: Optional[List[str]] = None, + new_names: list[str] | None = None, ) -> None: assert new_names self.new_names = new_names @@ -92,8 +94,8 @@ def __call__( self, parser: argparse.ArgumentParser, namespace: argparse.Namespace, - values: Union[str, Sequence[Any], None], - option_string: Optional[str] = None, + values: str | Sequence[Any] | None, + option_string: str | None = None, ): assert isinstance(values, list) setattr(namespace, self.dest, values[0]) diff --git a/pylint/config/find_default_config_files.py b/pylint/config/find_default_config_files.py index 71ba222b3b..34db721ff7 100644 --- a/pylint/config/find_default_config_files.py +++ b/pylint/config/find_default_config_files.py @@ -2,12 +2,14 @@ # For details: https://github.com/PyCQA/pylint/blob/main/LICENSE # Copyright (c) https://github.com/PyCQA/pylint/blob/main/CONTRIBUTORS.txt +from __future__ import annotations + import configparser import os import sys import warnings from pathlib import Path -from typing import Iterator, Optional, Union +from typing import Iterator if sys.version_info >= (3, 11): import tomllib @@ -18,7 +20,7 @@ CONFIG_NAMES = RC_NAMES + (Path("pyproject.toml"), Path("setup.cfg")) -def _toml_has_config(path: Union[Path, str]) -> bool: +def _toml_has_config(path: Path | str) -> bool: with open(path, mode="rb") as toml_handle: try: content = tomllib.load(toml_handle) @@ -28,7 +30,7 @@ def _toml_has_config(path: Union[Path, str]) -> bool: return "pylint" in content.get("tool", []) -def _cfg_has_config(path: Union[Path, str]) -> bool: +def _cfg_has_config(path: Path | str) -> bool: parser = configparser.ConfigParser() try: parser.read(path, encoding="utf-8") @@ -74,7 +76,7 @@ def find_default_config_files() -> Iterator[Path]: yield Path("/etc/pylintrc").resolve() -def find_pylintrc() -> Optional[str]: +def find_pylintrc() -> str | None: """Search the pylint rc file and return its path if it finds it, else return None.""" # pylint: disable-next=fixme # TODO: Remove this function in 3.0 diff --git a/pylint/config/help_formatter.py b/pylint/config/help_formatter.py index 23223f8157..5e517d9443 100644 --- a/pylint/config/help_formatter.py +++ b/pylint/config/help_formatter.py @@ -2,9 +2,9 @@ # For details: https://github.com/PyCQA/pylint/blob/main/LICENSE # Copyright (c) https://github.com/PyCQA/pylint/blob/main/CONTRIBUTORS.txt +from __future__ import annotations import argparse -from typing import Optional from pylint.config.callback_actions import _CallbackAction from pylint.constants import DEFAULT_PYLINT_HOME, OLD_DEFAULT_PYLINT_HOME @@ -13,7 +13,7 @@ class _HelpFormatter(argparse.RawDescriptionHelpFormatter): """Formatter for the help message emitted by argparse.""" - def _get_help_string(self, action: argparse.Action) -> Optional[str]: + def _get_help_string(self, action: argparse.Action) -> str | None: """Copied from argparse.ArgumentDefaultsHelpFormatter.""" assert action.help help_string = action.help diff --git a/pylint/config/option.py b/pylint/config/option.py index 1bc273377d..2c4b52fc52 100644 --- a/pylint/config/option.py +++ b/pylint/config/option.py @@ -2,11 +2,13 @@ # For details: https://github.com/PyCQA/pylint/blob/main/LICENSE # Copyright (c) https://github.com/PyCQA/pylint/blob/main/CONTRIBUTORS.txt +from __future__ import annotations + import copy import optparse # pylint: disable=deprecated-module import pathlib import re -from typing import List, Pattern, Union +from typing import Pattern from pylint import utils @@ -29,8 +31,8 @@ def _regexp_csv_validator(_, name, value): def _regexp_paths_csv_validator( - _, name: str, value: Union[str, List[Pattern[str]]] -) -> List[Pattern[str]]: + _, name: str, value: str | list[Pattern[str]] +) -> list[Pattern[str]]: if isinstance(value, list): return value patterns = [] diff --git a/pylint/config/option_manager_mixin.py b/pylint/config/option_manager_mixin.py index 71b8657af0..583ff9b1b2 100644 --- a/pylint/config/option_manager_mixin.py +++ b/pylint/config/option_manager_mixin.py @@ -2,6 +2,8 @@ # For details: https://github.com/PyCQA/pylint/blob/main/LICENSE # Copyright (c) https://github.com/PyCQA/pylint/blob/main/CONTRIBUTORS.txt +from __future__ import annotations + import collections import configparser import contextlib @@ -10,7 +12,7 @@ import os import sys from pathlib import Path -from typing import Dict, List, Optional, TextIO, Tuple +from typing import TextIO from pylint import utils from pylint.config.option import Option @@ -188,12 +190,12 @@ def global_set_option(self, opt, value): self._all_options[opt].set_option(opt, value) def generate_config( - self, stream: Optional[TextIO] = None, skipsections: Tuple[str, ...] = () + self, stream: TextIO | None = None, skipsections: tuple[str, ...] = () ) -> None: """Write a configuration file according to the current configuration into the given stream or stdout """ - options_by_section: Dict[str, List[Tuple]] = {} + options_by_section: dict[str, list[tuple]] = {} sections = [] for provider in self.options_providers: for section, options in provider.options_by_section(): @@ -228,7 +230,7 @@ def load_provider_defaults(self): provider.load_defaults() def read_config_file( - self, config_file: Optional[Path] = None, verbose: bool = False + self, config_file: Path | None = None, verbose: bool = False ) -> None: """Read the configuration file but do not load it (i.e. dispatching values to each option's provider) @@ -317,7 +319,7 @@ def load_configuration_from_config(self, config): provider = self._all_options[opt] provider.set_option(opt, opt_value) - def load_command_line_configuration(self, args=None) -> List[str]: + def load_command_line_configuration(self, args=None) -> list[str]: """Override configuration according to command line parameters. return additional arguments diff --git a/pylint/config/utils.py b/pylint/config/utils.py index eb3f21e4f1..a10b338662 100644 --- a/pylint/config/utils.py +++ b/pylint/config/utils.py @@ -4,11 +4,12 @@ """Utils for arguments/options parsing and handling.""" +from __future__ import annotations import re import warnings from pathlib import Path -from typing import TYPE_CHECKING, Any, Callable, Dict, List, Optional, Tuple, Union +from typing import TYPE_CHECKING, Any, Callable from pylint import extensions, utils from pylint.config.argument import ( @@ -27,15 +28,8 @@ def _convert_option_to_argument( - opt: str, optdict: Dict[str, Any] -) -> Union[ - _StoreArgument, - _StoreTrueArgument, - _CallableArgument, - _StoreOldNamesArgument, - _StoreNewNamesArgument, - _ExtendArgument, -]: + opt: str, optdict: dict[str, Any] +) -> _StoreArgument | _StoreTrueArgument | _CallableArgument | _StoreOldNamesArgument | _StoreNewNamesArgument | _ExtendArgument: """Convert an optdict to an Argument class instance.""" if "level" in optdict and "hide" not in optdict: warnings.warn( @@ -161,7 +155,7 @@ def _parse_rich_type_value(value: Any) -> str: # pylint: disable-next=unused-argument -def _init_hook(run: "Run", value: Optional[str]) -> None: +def _init_hook(run: Run, value: str | None) -> None: """Execute arbitrary code from the init_hook. This can be used to set the 'sys.path' for example. @@ -170,30 +164,30 @@ def _init_hook(run: "Run", value: Optional[str]) -> None: exec(value) # pylint: disable=exec-used -def _set_rcfile(run: "Run", value: Optional[str]) -> None: +def _set_rcfile(run: Run, value: str | None) -> None: """Set the rcfile.""" assert value is not None run._rcfile = value -def _set_output(run: "Run", value: Optional[str]) -> None: +def _set_output(run: Run, value: str | None) -> None: """Set the output.""" assert value is not None run._output = value -def _add_plugins(run: "Run", value: Optional[str]) -> None: +def _add_plugins(run: Run, value: str | None) -> None: """Add plugins to the list of loadable plugins.""" assert value is not None run._plugins.extend(utils._splitstrip(value)) -def _set_verbose_mode(run: "Run", value: Optional[str]) -> None: +def _set_verbose_mode(run: Run, value: str | None) -> None: assert value is None run.verbose = True -def _enable_all_extensions(run: "Run", value: Optional[str]) -> None: +def _enable_all_extensions(run: Run, value: str | None) -> None: """Enable all extensions.""" assert value is None for filename in Path(extensions.__file__).parent.iterdir(): @@ -203,8 +197,8 @@ def _enable_all_extensions(run: "Run", value: Optional[str]) -> None: run._plugins.append(extension_name) -PREPROCESSABLE_OPTIONS: Dict[ - str, Tuple[bool, Callable[["Run", Optional[str]], None]] +PREPROCESSABLE_OPTIONS: dict[ + str, tuple[bool, Callable[[Run, str | None], None]] ] = { # pylint: disable=consider-using-namedtuple-or-dataclass "--init-hook": (True, _init_hook), "--rcfile": (True, _set_rcfile), @@ -215,9 +209,9 @@ def _enable_all_extensions(run: "Run", value: Optional[str]) -> None: } -def _preprocess_options(run: "Run", args: List[str]) -> List[str]: +def _preprocess_options(run: Run, args: list[str]) -> list[str]: """Preprocess options before full config parsing has started.""" - processed_args: List[str] = [] + processed_args: list[str] = [] i = 0 while i < len(args): From 6a98bd31ef9cc475fbbde6a91eb58f1b8fa960fe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dani=C3=ABl=20van=20Noord?= <13665637+DanielNoord@users.noreply.github.com> Date: Thu, 14 Apr 2022 10:49:49 +0200 Subject: [PATCH 2/2] Add some formatting --- pylint/config/utils.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/pylint/config/utils.py b/pylint/config/utils.py index a10b338662..84cd09e3ca 100644 --- a/pylint/config/utils.py +++ b/pylint/config/utils.py @@ -29,7 +29,14 @@ def _convert_option_to_argument( opt: str, optdict: dict[str, Any] -) -> _StoreArgument | _StoreTrueArgument | _CallableArgument | _StoreOldNamesArgument | _StoreNewNamesArgument | _ExtendArgument: +) -> ( + _StoreArgument + | _StoreTrueArgument + | _CallableArgument + | _StoreOldNamesArgument + | _StoreNewNamesArgument + | _ExtendArgument +): """Convert an optdict to an Argument class instance.""" if "level" in optdict and "hide" not in optdict: warnings.warn(