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

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

164

165

166

167

168

169

170

171

172

173

174

175

176

177

from __future__ import print_function, absolute_import 

 

import sys 

import logging 

from optparse import OptionParser 

from io import StringIO 

 

import pyrocko 

from pyrocko import util 

 

 

logger = logging.getLogger('pyrocko.gui.sparrow.cli') 

km = 1e3 

 

 

def d2u(d): 

if isinstance(d, dict): 

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

else: 

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

 

 

subcommand_descriptions = { 

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

'version': 'print version number', 

} 

 

subcommand_usages = { 

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

'version': 'version', 

} 

 

subcommands = list(subcommand_descriptions.keys()) 

 

program_name = 'sparrow' 

 

usage_tdata = d2u(subcommand_descriptions) 

usage_tdata['program_name'] = program_name 

usage_tdata['version_number'] = pyrocko.__version__ 

 

 

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

 

A quick little bird to visualize geophysical data. 

 

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

 

Subcommands: 

 

view %(view)s 

version %(version)s 

 

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

 

%(program_name)s <subcommand> --help 

 

Where does your journey go today?! 

''' % usage_tdata 

 

 

def main(args=None): 

if not args: 

args = sys.argv 

 

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

 

args = list(args) 

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

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

 

args.pop(0) 

command = args.pop(0) 

 

if command in subcommands: 

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

 

elif command in help_triggers: 

if command == 'help' and args: 

acommand = args[0] 

if acommand in subcommands: 

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

 

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

 

else: 

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

 

 

def add_common_options(parser): 

parser.add_option( 

'--loglevel', 

action='store', 

dest='loglevel', 

type='choice', 

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

default='info', 

help='set logger level to ' 

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

'Default is "%default".') 

 

 

def process_common_options(command, parser, options): 

util.setup_logging(program_name, options.loglevel) 

 

 

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

usage = subcommand_usages[command] 

descr = subcommand_descriptions[command] 

 

if isinstance(usage, str): 

usage = [usage] 

 

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

for s in usage[1:]: 

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

 

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

 

if details: 

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

 

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

 

if setup: 

setup(parser) 

 

add_common_options(parser) 

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

process_common_options(command, parser, options) 

return parser, options, args 

 

 

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

if prelude: 

prelude = prelude + '\n' 

 

if err: 

err = '\n' + err 

 

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

 

 

def help_and_die(parser, message): 

sio = StringIO() 

parser.print_help(sio) 

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

 

 

def command_view(args): 

def setup(parser): 

parser.add_option( 

'--no-depth-peeling', 

dest='use_depth_peeling', 

action='store_false', 

default=True, 

help='disable use of VTKs depth peeling (e.g. if the hardware ' 

'doesn\'t support it).') 

 

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

 

pyrocko.sparrow(use_depth_peeling=options.use_depth_peeling) 

 

 

def command_version(args): 

def setup(parser): 

parser.add_option( 

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

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

 

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

 

from pyrocko.print_version import print_version 

print_version(not options.short) 

 

 

if __name__ == '__main__': 

main()