parse_args.py 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. """Procedure for parsing args, config, loading plugins."""
  2. from __future__ import annotations
  3. import argparse
  4. from typing import Sequence
  5. import flake8
  6. from flake8.main import options
  7. from flake8.options import aggregator
  8. from flake8.options import config
  9. from flake8.options import manager
  10. from flake8.plugins import finder
  11. def parse_args(
  12. argv: Sequence[str],
  13. ) -> tuple[finder.Plugins, argparse.Namespace]:
  14. """Procedure for parsing args, config, loading plugins."""
  15. prelim_parser = options.stage1_arg_parser()
  16. args0, rest = prelim_parser.parse_known_args(argv)
  17. # XXX (ericvw): Special case "forwarding" the output file option so
  18. # that it can be reparsed again for the BaseFormatter.filename.
  19. if args0.output_file:
  20. rest.extend(("--output-file", args0.output_file))
  21. flake8.configure_logging(args0.verbose, args0.output_file)
  22. cfg, cfg_dir = config.load_config(
  23. config=args0.config,
  24. extra=args0.append_config,
  25. isolated=args0.isolated,
  26. )
  27. plugin_opts = finder.parse_plugin_options(
  28. cfg,
  29. cfg_dir,
  30. enable_extensions=args0.enable_extensions,
  31. require_plugins=args0.require_plugins,
  32. )
  33. raw_plugins = finder.find_plugins(cfg, plugin_opts)
  34. plugins = finder.load_plugins(raw_plugins, plugin_opts)
  35. option_manager = manager.OptionManager(
  36. version=flake8.__version__,
  37. plugin_versions=plugins.versions_str(),
  38. parents=[prelim_parser],
  39. formatter_names=list(plugins.reporters),
  40. )
  41. options.register_default_options(option_manager)
  42. option_manager.register_plugins(plugins)
  43. opts = aggregator.aggregate_options(option_manager, cfg, cfg_dir, rest)
  44. for loaded in plugins.all_plugins():
  45. parse_options = getattr(loaded.obj, "parse_options", None)
  46. if parse_options is None:
  47. continue
  48. # XXX: ideally we wouldn't have two forms of parse_options
  49. try:
  50. parse_options(
  51. option_manager,
  52. opts,
  53. opts.filenames,
  54. )
  55. except TypeError:
  56. parse_options(opts)
  57. return plugins, opts