Module rulebook-pylint.rulebook_pylint.member_separator

Functions

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

Classes

class MemberSeparatorChecker (linter: PyLinter)
Expand source code
class MemberSeparatorChecker(RulebookFileChecker):
    """See detail: https://hanggrian.github.io/rulebook/rules/#member-separator"""
    MSG: str = 'member-separator'

    name: str = 'member-separator'
    msgs: dict[str, MessageDefinitionTuple] = Messages.of(MSG)

    def visit_classdef(self, node: ClassDef) -> None:
        # collect members
        members: list[NodeNG] = [n for n in node.body if isinstance(n, (Assign, FunctionDef))]

        for (i, member) in enumerate(members):
            if i == 0:
                continue
            last_member: NodeNG = members[i - 1]

            # single-line fields can be joined
            if isinstance(last_member, Assign) and isinstance(member, Assign):
                continue
            key: str
            last_body: NodeNG
            if isinstance(last_member, FunctionDef):
                key = 'constructor' if last_member.name == '__init__' else 'function'
                last_body = last_member.body[-1]
            else:
                key = 'property'
                last_body = last_member

            # checks for violation
            if last_body.end_lineno != get_fromlineno_before(self.lines, member, last_body):
                continue
            self.add_message(
                self.MSG,
                args=key,
                line=last_body.lineno,
                end_lineno=last_body.end_lineno,
                col_offset=last_body.col_offset,
                end_col_offset=last_body.end_col_offset,
            )

See detail: https://hanggrian.github.io/rulebook/rules/#member-separator

Checker instances should have the linter as argument.

Ancestors

  • rulebook_pylint.checkers.RulebookFileChecker
  • pylint.checkers.base_checker.BaseRawFileChecker
  • pylint.checkers.base_checker.BaseChecker
  • pylint.config.arguments_provider._ArgumentsProvider
  • abc.ABC

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.

Methods

def visit_classdef(self, node: astroid.nodes.scoped_nodes.scoped_nodes.ClassDef) ‑> None
Expand source code
def visit_classdef(self, node: ClassDef) -> None:
    # collect members
    members: list[NodeNG] = [n for n in node.body if isinstance(n, (Assign, FunctionDef))]

    for (i, member) in enumerate(members):
        if i == 0:
            continue
        last_member: NodeNG = members[i - 1]

        # single-line fields can be joined
        if isinstance(last_member, Assign) and isinstance(member, Assign):
            continue
        key: str
        last_body: NodeNG
        if isinstance(last_member, FunctionDef):
            key = 'constructor' if last_member.name == '__init__' else 'function'
            last_body = last_member.body[-1]
        else:
            key = 'property'
            last_body = last_member

        # checks for violation
        if last_body.end_lineno != get_fromlineno_before(self.lines, member, last_body):
            continue
        self.add_message(
            self.MSG,
            args=key,
            line=last_body.lineno,
            end_lineno=last_body.end_lineno,
            col_offset=last_body.col_offset,
            end_col_offset=last_body.end_col_offset,
        )