pylama_vulture.py 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. """Support Vulture."""
  2. from argparse import ArgumentParser
  3. from vulture.core import ERROR_CODES, Vulture, make_config
  4. from pylama.context import RunContext
  5. from pylama.lint import LinterV2 as BaseLinter
  6. class Linter(BaseLinter):
  7. """vulture runner."""
  8. name = "vulture"
  9. @classmethod
  10. def add_args(cls, parser: ArgumentParser):
  11. """Add --max-complexity option."""
  12. parser.add_argument(
  13. "--vulture-min-confidence",
  14. type=int,
  15. help="Minimum confidence (between 0 and 100) for code to be reported as unused.",
  16. )
  17. parser.add_argument(
  18. "--vulture-ignore-names",
  19. help="Comma-separated list of names to ignore",
  20. )
  21. parser.add_argument(
  22. "--vulture-ignore-decorators",
  23. help="Comma-separated list of decorators to ignore",
  24. )
  25. def run_check(self, ctx: RunContext): # noqa
  26. """Check code with vulture."""
  27. params = ctx.get_params("vulture")
  28. options = ctx.options
  29. if options:
  30. params.setdefault("min-confidence", options.vulture_min_confidence)
  31. params.setdefault("ignore-names", options.vulture_ignore_names)
  32. params.setdefault("ignore-decorators", options.vulture_ignore_decorators)
  33. config = make_config(parse_params(ctx.filename, params))
  34. vulture = Vulture(
  35. verbose=config["verbose"],
  36. ignore_names=config["ignore_names"],
  37. ignore_decorators=config["ignore_decorators"],
  38. )
  39. vulture.scan(ctx.source, filename=ctx.filename)
  40. unused_code_items = vulture.get_unused_code(
  41. min_confidence=config["min_confidence"], sort_by_size=config["sort_by_size"]
  42. )
  43. for item in unused_code_items:
  44. error_code = ERROR_CODES[item.typ]
  45. ctx.push(
  46. source="vulture",
  47. type="R",
  48. lnum=item.first_lineno,
  49. number=error_code,
  50. text=f"{item.message} ({item.confidence}% confidence)",
  51. )
  52. def parse_params(path, params=None):
  53. """Convert params from pylama."""
  54. return [f"--{key}={value}" for key, value in params.items() if value] + [path]