Module rulebook-pylint.rulebook_pylint.required_generics_name

Functions

def register(linter: PyLinter)
Expand source code
def register(linter: 'PyLinter') -> None:
    linter.register_checker(RequiredGenericsNameChecker(linter))

Classes

class RequiredGenericsNameChecker (linter: PyLinter)
Expand source code
class RequiredGenericsNameChecker(RulebookChecker):
    """See detail: https://hanggrian.github.io/rulebook/rules/#required-generics-name"""
    MSG: str = 'required-generics-name'

    name: str = 'required-generics-name'
    msgs: dict[str, MessageDefinitionTuple] = Messages.of(MSG)
    options: Options = (
        (
            'rulebook-required-generics-names',
            {
                'default': ('E', 'K', 'N', 'T', 'V'),
                'type': 'csv',
                'metavar': '<comma-separated names>',
                'help': 'A set of common generics.',
            },
        ),
    )

    _allow_generics_names: list[str]

    def open(self) -> None:
        self._allow_generics_names = self.linter.config.rulebook_required_generics_names

    def visit_assign(self, node: Assign) -> None:
        # only target TypeVar declaration
        if not isinstance(node.value, Call):
            return
        call: Call = node.value
        if not isinstance(call.func, Name) or call.func.name != 'TypeVar':
            return

        # get assigned property
        target: AssignName | None = get_assignname(node)
        if not target:
            return

        # checks for violation
        if target.name in self._allow_generics_names:
            return
        self.add_message(
            self.MSG,
            node=target,
            args=', '.join(self._allow_generics_names),
        )

See detail: https://hanggrian.github.io/rulebook/rules/#required-generics-name

Checker instances should have the linter as argument.

Ancestors

  • rulebook_pylint.checkers.RulebookChecker
  • pylint.checkers.base_checker.BaseChecker
  • pylint.config.arguments_provider._ArgumentsProvider

Class variables

var MSG : str

The type of the None singleton.

var msgs : dict[str, tuple[str, str, str] | tuple[str, str, str, pylint.typing.ExtraMessageOptions]]

The type of the None singleton.

var name : str

The type of the None singleton.

var options : tuple[tuple[str, dict[str, str | bool | int | re.Pattern[str] | Iterable[str | int | re.Pattern[str]] | type['_CallbackAction'] | Callable[[Any], Any] | Callable[[Any, Any, Any, Any], Any] | None]], ...]

The type of the None singleton.

Methods

def open(self) ‑> None
Expand source code
def open(self) -> None:
    self._allow_generics_names = self.linter.config.rulebook_required_generics_names

Called before visiting project (i.e. set of modules).

def visit_assign(self, node: astroid.nodes.node_classes.Assign) ‑> None
Expand source code
def visit_assign(self, node: Assign) -> None:
    # only target TypeVar declaration
    if not isinstance(node.value, Call):
        return
    call: Call = node.value
    if not isinstance(call.func, Name) or call.func.name != 'TypeVar':
        return

    # get assigned property
    target: AssignName | None = get_assignname(node)
    if not target:
        return

    # checks for violation
    if target.name in self._allow_generics_names:
        return
    self.add_message(
        self.MSG,
        node=target,
        args=', '.join(self._allow_generics_names),
    )