1# http://pyrocko.org - GPLv3
2#
3# The Pyrocko Developers, 21st Century
4# ---|P------/S----------~Lg----------
6import sys
7import logging
9from . import common
10from .commands import command_modules
11from pyrocko import squirrel as sq
14logger = logging.getLogger('psq.cli')
17g_program_name = 'squirrel'
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.
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.
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.
41This tool's functionality is available through several subcommands. Run
42`squirrel SUBCOMMAND --help` to get further help.''')
45def from_command(
46 command=None,
47 args=None,
48 program_name=None,
49 description='''
50Pyrocko Squirrel based script.
52Run with --help to get further help.''',
53 subcommands=[],
54 setup=None):
56 if program_name is None:
57 program_name = sys.argv[0]
59 if args is None:
60 args = sys.argv[1:]
62 parser = common.PyrockoArgumentParser(
63 prog=program_name,
64 add_help=False,
65 description=description)
67 common.add_standard_arguments(parser)
69 if subcommands:
70 subparsers = parser.add_subparsers(
71 metavar='SUBCOMMAND',
72 title='Subcommands')
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)
80 elif command:
81 command.setup(parser)
83 else:
84 common.add_selection_arguments(parser)
86 args = parser.parse_args(args)
87 subparser = args.__dict__.pop('subparser', None)
89 common.process_standard_arguments(parser, args)
91 target = args.__dict__.pop('target', None)
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)
100 elif command:
101 command.call(parser, args)
103 elif not subcommands:
104 return common.squirrel_from_selection_arguments(args)
106 else:
107 parser.print_help()
108 sys.exit(0)
111__all__ = [
112 'main',
113 'from_command',
114]