1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127
|
"""Create entry point for the command-line interface (CLI)."""
from __future__ import annotations
import argparse
import importlib
from importlib.metadata import PackageNotFoundError
import sys
from typing import Any
import scooby
from scooby.report import AutoReport, Report
def main(args: list[str] | None = None) -> None:
"""Parse command line inputs of CLI interface."""
# If not explicitly called, catch arguments
if args is None:
args = sys.argv[1:]
# Start CLI-arg-parser and define arguments
parser = argparse.ArgumentParser(description='Great Dane turned Python environment detective.')
# arg: Packages
parser.add_argument(
'packages',
nargs='*',
default=None,
type=str,
help=('names of the packages to report'),
)
# arg: Report of a package
parser.add_argument(
'--report',
'-r',
default=None,
type=str,
help=('print `Report()` of this package'),
)
# arg: Sort
parser.add_argument(
'--no-opt',
action='store_true',
default=None,
help='do not show the default optional packages. Defaults to True if '
'using --report and defaults to False otherwise.',
)
# arg: Sort
parser.add_argument(
'--sort',
action='store_true',
default=False,
help='sort the packages when the report is shown',
)
# arg: Version
parser.add_argument(
'--version',
'-v',
action='store_true',
default=False,
help='only display scooby version',
)
# Call act with command line arguments as dict.
act(vars(parser.parse_args(args)))
def act(args_dict: dict[str, Any]) -> None:
"""Act upon CLI inputs."""
# Quick exit if only scooby version.
if args_dict.pop('version'):
print(f'scooby v{scooby.__version__}')
return
report = args_dict.pop('report')
no_opt = args_dict.pop('no_opt')
packages = args_dict.pop('packages')
if no_opt is None:
if report is None:
no_opt = False
else:
no_opt = True
# Report of another package.
if report:
try:
module = importlib.import_module(report)
except ImportError:
pass
else:
try:
print(module.Report())
except AttributeError:
pass
else:
return
try:
print(AutoReport(report))
except PackageNotFoundError:
print(
f'Package `{report}` has no Report class and `importlib` could not '
'be used to autogenerate one.',
file=sys.stderr,
)
sys.exit(1)
else:
return
# Collect input.
inp = {'additional': packages, 'sort': args_dict['sort']}
# Define optional as empty list if no-opt.
if no_opt:
inp['optional'] = []
# Print the report.
print(Report(**inp))
if __name__ == '__main__':
main()
|