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

1"""CLI interface for version ranges.""" 

2 

3import argparse 

4import logging 

5import sys 

6from typing import Union 

7 

8import versioalueet.api as api 

9import versioalueet.env as env 

10from versioalueet import APP_ALIAS, APP_NAME, DEBUG, VERSION, log 

11 

12 

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 

76 

77 options = parser.parse_args(argv) 

78 

79 if options.package_version: 

80 print(VERSION) 

81 return 0 

82 

83 if options.report: 

84 print(env.report(options, format='json')) 

85 return 0 

86 

87 if options.verbose and options.quiet: 

88 parser.error('you cannot be quiet and verbose at the same time') 

89 

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') 

94 

95 return options 

96 

97 

98def main(argv: Union[list[str], None] = None) -> int: 

99 """Delegate processing to functional module. 

100 

101 Examples: 

102 

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) 

115 

116 return api.main(options)