1from __future__ import print_function, absolute_import 

2 

3import sys 

4import logging 

5from optparse import OptionParser 

6from io import StringIO 

7 

8import pyrocko 

9from pyrocko import util 

10 

11 

12logger = logging.getLogger('pyrocko.gui.drum.cli') 

13km = 1e3 

14 

15 

16def d2u(d): 

17 if isinstance(d, dict): 

18 return dict((k.replace('-', '_'), v) for (k, v) in d.items()) 

19 else: 

20 return d.replace('-', '_') 

21 

22 

23subcommand_descriptions = { 

24 'view': 'open viewer (default)', 

25 'version': 'print version number', 

26} 

27 

28subcommand_usages = { 

29 'view': 'view [options] <files> ...', 

30 'version': 'version', 

31} 

32 

33subcommands = list(subcommand_descriptions.keys()) 

34 

35program_name = 'drum' 

36 

37usage_tdata = d2u(subcommand_descriptions) 

38usage_tdata['program_name'] = program_name 

39usage_tdata['version_number'] = pyrocko.__version__ 

40 

41 

42usage = '''%(program_name)s <subcommand> [options] [--] <arguments> ... 

43 

44A helicorder and datalogger. 

45 

46The Drum is part of Pyrocko version %(version_number)s. 

47 

48Subcommands: 

49 

50 view %(view)s 

51 version %(version)s 

52 

53To get further help and a list of available options for any subcommand run: 

54 

55 %(program_name)s <subcommand> --help 

56 

57''' % usage_tdata 

58 

59 

60def main(args=None): 

61 if not args: 

62 args = sys.argv 

63 

64 help_triggers = ['--help', '-h', 'help'] 

65 

66 args = list(args) 

67 if len(args) < 2 or args[1] not in subcommands + help_triggers: 

68 args[1:1] = ['view'] 

69 

70 args.pop(0) 

71 command = args.pop(0) 

72 

73 if command in subcommands: 

74 globals()['command_' + d2u(command)](args) 

75 

76 elif command in help_triggers: 

77 if command == 'help' and args: 

78 acommand = args[0] 

79 if acommand in subcommands: 

80 globals()['command_' + acommand](['--help']) 

81 

82 sys.exit('Usage: %s' % usage) 

83 

84 else: 

85 die('No such subcommand: %s' % command) 

86 

87 

88def add_common_options(parser): 

89 parser.add_option( 

90 '--loglevel', 

91 action='store', 

92 dest='loglevel', 

93 type='choice', 

94 choices=('critical', 'error', 'warning', 'info', 'debug'), 

95 default='info', 

96 help='set logger level to ' 

97 '"critical", "error", "warning", "info", or "debug". ' 

98 'Default is "%default".') 

99 

100 

101def process_common_options(command, parser, options): 

102 util.setup_logging(program_name, options.loglevel) 

103 

104 

105def cl_parse(command, args, setup=None, details=None): 

106 usage = subcommand_usages[command] 

107 descr = subcommand_descriptions[command] 

108 

109 if isinstance(usage, str): 

110 usage = [usage] 

111 

112 susage = '%s %s' % (program_name, usage[0]) 

113 for s in usage[1:]: 

114 susage += '\n%s%s %s' % (' '*7, program_name, s) 

115 

116 description = descr[0].upper() + descr[1:] + '.' 

117 

118 if details: 

119 description = description + '\n\n%s' % details 

120 

121 parser = OptionParser(usage=susage, description=description) 

122 

123 if setup: 

124 setup(parser) 

125 

126 add_common_options(parser) 

127 (options, args) = parser.parse_args(args) 

128 process_common_options(command, parser, options) 

129 return parser, options, args 

130 

131 

132def die(message, err='', prelude=''): 

133 if prelude: 

134 prelude = prelude + '\n' 

135 

136 if err: 

137 err = '\n' + err 

138 

139 sys.exit('%s%s failed: %s%s' % (prelude, program_name, message, err)) 

140 

141 

142def help_and_die(parser, message): 

143 sio = StringIO() 

144 parser.print_help(sio) 

145 die(message, prelude=sio.getvalue()) 

146 

147 

148def command_view(args): 

149 def setup(parser): 

150 pass 

151 

152 parser, options, args = cl_parse('view', args, setup) 

153 

154 pyrocko.drum() 

155 

156 

157def command_version(args): 

158 def setup(parser): 

159 parser.add_option( 

160 '--short', dest='short', action='store_true', 

161 help='only print Pyrocko\'s version number') 

162 

163 parser, options, args = cl_parse('version', args, setup) 

164 

165 from pyrocko.print_version import print_version 

166 print_version(not options.short) 

167 

168 

169if __name__ == '__main__': 

170 main()