1# http://pyrocko.org - GPLv3 

2# 

3# The Pyrocko Developers, 21st Century 

4# ---|P------/S----------~Lg---------- 

5 

6import sys 

7import logging 

8 

9from . import common 

10from .commands import command_modules 

11from pyrocko import squirrel as sq 

12 

13 

14logger = logging.getLogger('psq.cli') 

15 

16 

17g_program_name = 'squirrel' 

18 

19 

20def main(args=None): 

21 from_command( 

22 args=args, 

23 program_name=g_program_name, 

24 subcommands=command_modules, 

25 description=''' 

26Pyrocko Squirrel - Prompt seismological data access with a fluffy tail. 

27 

28This is `squirrel`, a command-line front-end to the Squirrel data access 

29infrastructure. The Squirrel infrastructure offers meta-data caching, blazingly 

30fast data lookup for large datasets and transparent online data download to 

31applications building on it. 

32 

33In most cases, the Squirrel does its business discretely under the hood and 

34does not require human interaction or awareness. However, using this tool, some 

35aspects can be configured for the benefit of greater performance or 

36convenience, including (1) using a separate (isolated, local) environment for a 

37specific project, (2) using named selections to speed up access to very large 

38datasets, (3), pre-scanning/indexing of file collections. It can also be used 

39to inspect various aspects of a data collection. 

40 

41This tool's functionality is available through several subcommands. Run 

42`squirrel SUBCOMMAND --help` to get further help.''') 

43 

44 

45def from_command( 

46 command=None, 

47 args=None, 

48 program_name=None, 

49 description=''' 

50Pyrocko Squirrel based script. 

51 

52Run with --help to get further help.''', 

53 subcommands=[], 

54 setup=None): 

55 

56 if program_name is None: 

57 program_name = sys.argv[0] 

58 

59 if args is None: 

60 args = sys.argv[1:] 

61 

62 parser = common.PyrockoArgumentParser( 

63 prog=program_name, 

64 add_help=False, 

65 description=description) 

66 

67 common.add_standard_arguments(parser) 

68 

69 if subcommands: 

70 subparsers = parser.add_subparsers( 

71 metavar='SUBCOMMAND', 

72 title='Subcommands') 

73 

74 for mod in subcommands: 

75 subparser = mod.setup_subcommand(subparsers) 

76 assert subparser is not None 

77 mod.setup(subparser) 

78 subparser.set_defaults(target=mod.call, subparser=subparser) 

79 

80 elif command: 

81 command.setup(parser) 

82 

83 else: 

84 common.add_selection_arguments(parser) 

85 

86 args = parser.parse_args(args) 

87 subparser = args.__dict__.pop('subparser', None) 

88 

89 common.process_standard_arguments(parser, args) 

90 

91 target = args.__dict__.pop('target', None) 

92 

93 if target: 

94 try: 

95 target(parser, args) 

96 except (sq.SquirrelError, sq.ToolError) as e: 

97 logger.fatal(str(e)) 

98 sys.exit(1) 

99 

100 elif command: 

101 command.call(parser, args) 

102 

103 elif not subcommands: 

104 return common.squirrel_from_selection_arguments(args) 

105 

106 else: 

107 parser.print_help() 

108 sys.exit(0) 

109 

110 

111__all__ = [ 

112 'main', 

113 'from_command', 

114]