Skip to content

Commit

Permalink
Use overload to type get_global_option (pylint-dev#4978)
Browse files Browse the repository at this point in the history
* Use ``overload`` to type ``get_global_option``
* Use type alias and TypeVar

Co-authored-by: Marc Mueller <30130371+cdce8p@users.noreply.github.com>
  • Loading branch information
DanielNoord and cdce8p committed Sep 8, 2021
1 parent 9683362 commit 1e85bb7
Show file tree
Hide file tree
Showing 3 changed files with 91 additions and 4 deletions.
2 changes: 1 addition & 1 deletion pylint/extensions/code_style.py
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,7 @@ def __init__(self, linter: PyLinter) -> None:
super().__init__(linter=linter)

def open(self) -> None:
py_version: Tuple[int, int] = get_global_option(self, "py-version")
py_version = get_global_option(self, "py-version")
self._py38_plus = py_version >= (3, 8)
self._max_length: int = (
self.config.max_line_length_suggestions
Expand Down
4 changes: 2 additions & 2 deletions pylint/extensions/typing.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
from typing import Dict, List, NamedTuple, Set, Tuple, Union
from typing import Dict, List, NamedTuple, Set, Union

import astroid.bases
from astroid import nodes
Expand Down Expand Up @@ -139,7 +139,7 @@ def __init__(self, linter: PyLinter) -> None:
self._consider_using_alias_msgs: List[DeprecatedTypingAliasMsg] = []

def open(self) -> None:
py_version: Tuple[int, int] = get_global_option(self, "py-version")
py_version = get_global_option(self, "py-version")
self._py37_plus = py_version >= (3, 7)
self._py39_plus = py_version >= (3, 9)
self._py310_plus = py_version >= (3, 10)
Expand Down
89 changes: 88 additions & 1 deletion pylint/utils/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,13 +17,55 @@
import sys
import textwrap
import tokenize
from typing import (
TYPE_CHECKING,
List,
Optional,
Pattern,
Tuple,
TypeVar,
Union,
overload,
)

from astroid import Module, modutils

from pylint.constants import PY_EXTS

if sys.version_info >= (3, 8):
from typing import Literal
else:
from typing_extensions import Literal

if TYPE_CHECKING:
from pylint.checkers.base_checker import BaseChecker

DEFAULT_LINE_LENGTH = 79

# These are types used to overload get_global_option() and refer to the options type
GLOBAL_OPTION_BOOL = Literal[
"ignore-mixin-members",
"suggestion-mode",
"analyse-fallback-blocks",
"allow-global-unused-variables",
]
GLOBAL_OPTION_INT = Literal["max-line-length", "docstring-min-length"]
GLOBAL_OPTION_LIST = Literal["ignored-modules"]
GLOBAL_OPTION_PATTERN = Literal[
"no-docstring-rgx", "dummy-variables-rgx", "ignored-argument-names"
]
GLOBAL_OPTION_TUPLE_INT = Literal["py-version"]
GLOBAL_OPTION_NAMES = Union[
GLOBAL_OPTION_BOOL,
GLOBAL_OPTION_INT,
GLOBAL_OPTION_LIST,
GLOBAL_OPTION_PATTERN,
GLOBAL_OPTION_TUPLE_INT,
]
T_GlobalOptionReturnTypes = TypeVar(
"T_GlobalOptionReturnTypes", bool, int, List[str], Pattern, Tuple[int, ...]
)


def normalize_text(text, line_len=DEFAULT_LINE_LENGTH, indent=""):
"""Wrap the text on the given line length."""
Expand Down Expand Up @@ -148,7 +190,52 @@ def register_plugins(linter, directory):
imported[base] = 1


def get_global_option(checker, option, default=None):
@overload
def get_global_option(
checker: "BaseChecker", option: GLOBAL_OPTION_BOOL, default: Optional[bool] = None
) -> bool:
...


@overload
def get_global_option(
checker: "BaseChecker", option: GLOBAL_OPTION_INT, default: Optional[int] = None
) -> int:
...


@overload
def get_global_option(
checker: "BaseChecker",
option: GLOBAL_OPTION_LIST,
default: Optional[List[str]] = None,
) -> List[str]:
...


@overload
def get_global_option(
checker: "BaseChecker",
option: GLOBAL_OPTION_PATTERN,
default: Optional[Pattern] = None,
) -> Pattern:
...


@overload
def get_global_option(
checker: "BaseChecker",
option: GLOBAL_OPTION_TUPLE_INT,
default: Optional[Tuple[int, ...]] = None,
) -> Tuple[int, ...]:
...


def get_global_option(
checker: "BaseChecker",
option: GLOBAL_OPTION_NAMES,
default: Optional[T_GlobalOptionReturnTypes] = None,
) -> Optional[T_GlobalOptionReturnTypes]:
"""Retrieve an option defined by the given *checker* or
by all known option providers.
Expand Down

0 comments on commit 1e85bb7

Please sign in to comment.