1from __future__ import print_function, absolute_import
3import sys
4import logging
5from optparse import OptionParser
6from io import StringIO
8import pyrocko
9from pyrocko import util
12logger = logging.getLogger('pyrocko.gui.drum.cli')
13km = 1e3
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('-', '_')
23subcommand_descriptions = {
24 'view': 'open viewer (default)',
25 'version': 'print version number',
26}
28subcommand_usages = {
29 'view': 'view [options] <files> ...',
30 'version': 'version',
31}
33subcommands = list(subcommand_descriptions.keys())
35program_name = 'drum'
37usage_tdata = d2u(subcommand_descriptions)
38usage_tdata['program_name'] = program_name
39usage_tdata['version_number'] = pyrocko.__version__
42usage = '''%(program_name)s <subcommand> [options] [--] <arguments> ...
44A helicorder and datalogger.
46The Drum is part of Pyrocko version %(version_number)s.
48Subcommands:
50 view %(view)s
51 version %(version)s
53To get further help and a list of available options for any subcommand run:
55 %(program_name)s <subcommand> --help
57''' % usage_tdata
60def main(args=None):
61 if not args:
62 args = sys.argv
64 help_triggers = ['--help', '-h', 'help']
66 args = list(args)
67 if len(args) < 2 or args[1] not in subcommands + help_triggers:
68 args[1:1] = ['view']
70 args.pop(0)
71 command = args.pop(0)
73 if command in subcommands:
74 globals()['command_' + d2u(command)](args)
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'])
82 sys.exit('Usage: %s' % usage)
84 else:
85 die('No such subcommand: %s' % command)
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".')
101def process_common_options(command, parser, options):
102 util.setup_logging(program_name, options.loglevel)
105def cl_parse(command, args, setup=None, details=None):
106 usage = subcommand_usages[command]
107 descr = subcommand_descriptions[command]
109 if isinstance(usage, str):
110 usage = [usage]
112 susage = '%s %s' % (program_name, usage[0])
113 for s in usage[1:]:
114 susage += '\n%s%s %s' % (' '*7, program_name, s)
116 description = descr[0].upper() + descr[1:] + '.'
118 if details:
119 description = description + '\n\n%s' % details
121 parser = OptionParser(usage=susage, description=description)
123 if setup:
124 setup(parser)
126 add_common_options(parser)
127 (options, args) = parser.parse_args(args)
128 process_common_options(command, parser, options)
129 return parser, options, args
132def die(message, err='', prelude=''):
133 if prelude:
134 prelude = prelude + '\n'
136 if err:
137 err = '\n' + err
139 sys.exit('%s%s failed: %s%s' % (prelude, program_name, message, err))
142def help_and_die(parser, message):
143 sio = StringIO()
144 parser.print_help(sio)
145 die(message, prelude=sio.getvalue())
148def command_view(args):
149 def setup(parser):
150 pass
152 parser, options, args = cl_parse('view', args, setup)
154 pyrocko.drum()
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')
163 parser, options, args = cl_parse('version', args, setup)
165 from pyrocko.print_version import print_version
166 print_version(not options.short)
169if __name__ == '__main__':
170 main()