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, )