pylama_radon.py 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. """Support Radon.
  2. Supports stdin.
  3. """
  4. from argparse import ArgumentError, ArgumentParser
  5. from radon.complexity import add_inner_blocks
  6. from radon.visitors import ComplexityVisitor
  7. from pylama.context import RunContext
  8. from pylama.lint import LinterV2 as Abstract
  9. class Linter(Abstract):
  10. """Radon runner."""
  11. name = "radon"
  12. @classmethod
  13. def add_args(cls, parser: ArgumentParser):
  14. """Add --max-complexity option."""
  15. parser.add_argument(
  16. "--radon-no-assert",
  17. default=False,
  18. action="store_true",
  19. help="Ignore `assert` statements.",
  20. )
  21. parser.add_argument(
  22. "--radon-show-closures",
  23. default=False,
  24. action="store_true",
  25. help="Increase complexity on closures.",
  26. )
  27. try:
  28. parser.add_argument(
  29. "--max-complexity",
  30. default=10,
  31. type=int,
  32. help="Max complexity threshold",
  33. )
  34. except ArgumentError:
  35. pass
  36. def run_check(self, ctx: RunContext): # noqa # noqa
  37. """Check code with Radon."""
  38. params = ctx.get_params("radon")
  39. options = ctx.options
  40. if options:
  41. params.setdefault("complexity", options.max_complexity)
  42. params.setdefault("no_assert", options.radon_no_assert)
  43. params.setdefault("show_closures", options.radon_show_closures)
  44. complexity = params.get("complexity", 10)
  45. no_assert = params.get("no_assert", False)
  46. show_closures = params.get("show_closures", False)
  47. visitor = ComplexityVisitor.from_code(ctx.source, no_assert=no_assert)
  48. blocks = visitor.blocks
  49. if show_closures:
  50. blocks = add_inner_blocks(blocks)
  51. for block in visitor.blocks:
  52. if block.complexity > complexity:
  53. ctx.push(
  54. lnum=block.lineno,
  55. col=block.col_offset + 1,
  56. source="radon",
  57. type="R",
  58. number="R901",
  59. text=f"{block.name} is too complex {block.complexity}",
  60. )