-
Notifications
You must be signed in to change notification settings - Fork 1
/
__init__.py
81 lines (68 loc) · 2.83 KB
/
__init__.py
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
""" Place for Console Scripts.
"""
import argparse
import asyncio
import logging
import logging.config
import sys
from pathlib import Path
from pkg_resources import get_distribution
from . import commands
from solo.integrations.alembic import integrate_alembic_cli
from solo.config.app import Config, EventLoopType
from .util import parse_app_config
def main(args=None, stdout=None):
parser = argparse.ArgumentParser(description='Manage Solo projects.')
parser.add_argument('-V', '--version', action='version',
version='Solo {}'.format(get_distribution("solo").version))
subparsers = parser.add_subparsers(title='sub-commands',
description='valid sub-commands',
help='additional help',
dest='sub-command')
# make subparsers required (see http://stackoverflow.com/a/23354355/458106)
subparsers.required = True
# $ solo run <config>
# ---------------------------
commands.run.setup(subparsers)
# $ solo db [args]
# ---------------------------
integrate_alembic_cli(subparsers, prefix='db')
# Common arguments
# ----------------
_add_common_arguments(subparsers)
# Parse arguments and config
# --------------------------
if args is None:
args = sys.argv[1:]
args = parser.parse_args(args)
solo_cfg = parse_app_config(Path(args.solocfg))
# Set up and run
# --------------
decide_event_loop_policy(solo_cfg)
logging.config.dictConfig(solo_cfg.logging)
args.func(args, solo_cfg)
def _add_common_arguments(subparsers: argparse._SubParsersAction):
""" Recursively search for innermost parsers and add common arguments to their arguments.
The goal is to allow common arguments be specified after all subcommand-specific arguments,
i.e. to be able to invoke
$ solo db revision [--solocfg SOLOCFG]
instead of
$ solo [--solocfg SOLOCFG] db revision
without having to manually specify parent parsers as described at
# https://docs.python.org/3/library/argparse.html#parents
"""
for sp in subparsers.choices.values(): # type: argparse.ArgumentParser
if sp._subparsers:
for action in sp._subparsers._actions:
if not isinstance(action, argparse._SubParsersAction):
continue
# Traverse to the inner subparser
_add_common_arguments(action)
else:
sp.add_argument("--solocfg", default='solocfg.yml', help="path to a YAML config (default ./solocfg.yml).")
def decide_event_loop_policy(solo_cfg: Config) -> None:
""" Select and set event loop implementation.
"""
if solo_cfg.server.event_loop is EventLoopType.UVLOOP:
import uvloop
asyncio.set_event_loop_policy(uvloop.EventLoopPolicy())