Ejemplo n.º 1
0
    def _is_allowed_decorator(self, node: ast.expr) -> bool:
        if not isinstance(node, _ALLOWED_DECORATOR_TYPES):  # pragma: py-lt-39
            return False

        if isinstance(node, ast.Name):
            return True  # Simple names are fine!

        return all(
            isinstance(part, _ALLOWED_DECORATOR_TYPES)
            for part in attributes.parts(node))
Ejemplo n.º 2
0
    def _is_correct_base_class(self, base_class: ast.AST) -> bool:
        if isinstance(base_class, ast.Name):
            return True
        elif isinstance(base_class, ast.Attribute):
            return all(
                isinstance(sub_node, (ast.Name, ast.Attribute))
                for sub_node in attributes.parts(base_class))
        elif isinstance(base_class, ast.Subscript):
            parts = list(attributes.parts(base_class))
            subscripts = list(
                filter(
                    lambda part: isinstance(part, ast.Subscript),
                    parts,
                ))
            correct_items = all(
                isinstance(sub_node, (ast.Name, ast.Attribute, ast.Subscript))
                for sub_node in parts)

            return len(subscripts) == 1 and correct_items
        return False
Ejemplo n.º 3
0
    def _check_argument_default_values(self, node: AnyFunctionDef) -> None:
        for arg in node.args.defaults:
            real_arg = operators.unwrap_unary_node(arg)
            parts = attributes.parts(real_arg) if isinstance(
                real_arg,
                ast.Attribute,
            ) else [real_arg]

            for part in parts:
                if not isinstance(part, self._allowed_default_value_types):
                    self.add_violation(ComplexDefaultValueViolation(arg))
                    return
Ejemplo n.º 4
0
    def _check_consecutive_access_number(self, node: AnyAccess) -> None:
        if node in self._visited_accesses:
            return

        consecutive_access = cast(
            Set[AnyAccess],
            set(takewhile(
                self._is_any_access,
                attributes.parts(node),
            )))

        self._visited_accesses.update(consecutive_access)
        access_number = len(consecutive_access)

        if access_number > self.options.max_access_level:
            self.add_violation(
                TooDeepAccessViolation(
                    node,
                    text=str(access_number),
                    baseline=self.options.max_access_level,
                ), )
Ejemplo n.º 5
0
    def _check_complex_argument_defaults(
        self,
        node: AnyFunctionDefAndLambda,
    ) -> None:
        all_defaults = filter(None, (
            *node.args.defaults,
            *node.args.kw_defaults,
        ))

        for arg in all_defaults:
            real_arg = operators.unwrap_unary_node(arg)
            parts = attributes.parts(real_arg) if isinstance(
                real_arg,
                ast.Attribute,
            ) else [real_arg]

            has_incorrect_part = any(
                not isinstance(part, self._allowed_default_value_types)
                for part in parts)

            if has_incorrect_part:
                self.add_violation(ComplexDefaultValueViolation(arg))
Ejemplo n.º 6
0
 def _is_valid_chaining(self, format_value: AnyChainable) -> bool:
     chained_parts: List[ast.AST] = list(attributes.parts(format_value))
     if len(chained_parts) <= self._max_chained_items:
         return self._is_valid_chain_structure(chained_parts)
     return False