| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970 |
- """Support Radon.
- Supports stdin.
- """
- from argparse import ArgumentError, ArgumentParser
- from radon.complexity import add_inner_blocks
- from radon.visitors import ComplexityVisitor
- from pylama.context import RunContext
- from pylama.lint import LinterV2 as Abstract
- class Linter(Abstract):
- """Radon runner."""
- name = "radon"
- @classmethod
- def add_args(cls, parser: ArgumentParser):
- """Add --max-complexity option."""
- parser.add_argument(
- "--radon-no-assert",
- default=False,
- action="store_true",
- help="Ignore `assert` statements.",
- )
- parser.add_argument(
- "--radon-show-closures",
- default=False,
- action="store_true",
- help="Increase complexity on closures.",
- )
- try:
- parser.add_argument(
- "--max-complexity",
- default=10,
- type=int,
- help="Max complexity threshold",
- )
- except ArgumentError:
- pass
- def run_check(self, ctx: RunContext): # noqa # noqa
- """Check code with Radon."""
- params = ctx.get_params("radon")
- options = ctx.options
- if options:
- params.setdefault("complexity", options.max_complexity)
- params.setdefault("no_assert", options.radon_no_assert)
- params.setdefault("show_closures", options.radon_show_closures)
- complexity = params.get("complexity", 10)
- no_assert = params.get("no_assert", False)
- show_closures = params.get("show_closures", False)
- visitor = ComplexityVisitor.from_code(ctx.source, no_assert=no_assert)
- blocks = visitor.blocks
- if show_closures:
- blocks = add_inner_blocks(blocks)
- for block in visitor.blocks:
- if block.complexity > complexity:
- ctx.push(
- lnum=block.lineno,
- col=block.col_offset + 1,
- source="radon",
- type="R",
- number="R901",
- text=f"{block.name} is too complex {block.complexity}",
- )
|