Coverage for versioalueet/cli.py: 100.00%
42 statements
« prev ^ index » next coverage.py v7.6.10, created at 2025-01-08 06:11:21 +00:00
« prev ^ index » next coverage.py v7.6.10, created at 2025-01-08 06:11:21 +00:00
1"""CLI interface for version ranges."""
3import argparse
4import logging
5import sys
6from typing import Union
8import versioalueet.api as api
9import versioalueet.env as env
10from versioalueet import APP_ALIAS, APP_NAME, DEBUG, VERSION, log
13def parse_request(argv: list[str]) -> Union[int, argparse.Namespace]:
14 """Parse the command line arguments received."""
15 parser = argparse.ArgumentParser(
16 prog=APP_ALIAS, description=APP_NAME, formatter_class=argparse.RawTextHelpFormatter
17 )
18 parser.add_argument(
19 '-q',
20 '--quiet',
21 dest='quiet',
22 default=False,
23 action='store_true',
24 help='work as quiet as possible (default: False)',
25 )
26 parser.add_argument(
27 '-v',
28 '--verbose',
29 dest='verbose',
30 default=False,
31 action='store_true',
32 help='work logging more information along the way (default: False)',
33 )
34 parser.add_argument(
35 '-d',
36 '--debug',
37 dest='debug',
38 default=False,
39 action='store_true',
40 help='provide debug level information (default: False)',
41 )
42 parser.add_argument(
43 '-R',
44 '--report-environment',
45 dest='report',
46 default=False,
47 action='store_true',
48 help='report the runtime environment in JSON format (default: False)',
49 )
50 parser.add_argument(
51 '-V',
52 '--version-of-lib',
53 dest='package_version',
54 default=False,
55 action='store_true',
56 help='show the library / package version and exit (default: False)',
57 )
58 parser.add_argument(
59 '-r',
60 '--version-ranges',
61 dest='version_ranges',
62 default='',
63 type=str,
64 help="version ranges as valid vers string (default: '')",
65 )
66 parser.add_argument(
67 dest='versions',
68 nargs='*',
69 default='',
70 type=str,
71 help="version(s) to test against version ranges for inclusion (default: '')",
72 )
73 if not argv:
74 parser.print_help()
75 return 0
77 options = parser.parse_args(argv)
79 if options.package_version:
80 print(VERSION)
81 return 0
83 if options.report:
84 print(env.report(options, format='json'))
85 return 0
87 if options.verbose and options.quiet:
88 parser.error('you cannot be quiet and verbose at the same time')
90 if DEBUG:
91 options.debug = True # pragma: no cover
92 if options.debug and options.quiet:
93 parser.error('you cannot be quiet and debug at the same time')
95 return options
98def main(argv: Union[list[str], None] = None) -> int:
99 """Delegate processing to functional module.
101 Examples:
103 >>> main(['-qr', 'vers:pypi/ 42||'])
104 vers:pypi/42
105 0
106 """
107 argv = sys.argv[1:] if argv is None else argv
108 options = parse_request(argv)
109 if isinstance(options, int):
110 return 0
111 if options.quiet:
112 log.setLevel(logging.CRITICAL)
113 elif options.debug:
114 log.setLevel(logging.DEBUG)
116 return api.main(options)