Source code for oriole_service.cli
""" Oriole-CLI """
import os
import re
import sys
import yaml
import argparse
from .modules import *
from oriole_service import api
ENV_VAR_MATCHER = re.compile(r"""
\$\{ # match characters `${` literally
([^}:\s]+) # 1st group: matches any character except `}` or `:`
:? # matches the literal `:` character zero or one times
([^}]+)? # 2nd group: matches any character except `}`
\} # match character `}` literally
""", re.VERBOSE)
IMPLICIT_ENV_VAR_MATCHER = re.compile(r"""
.* # matches any number of any characters
\$\{.*\} # matches any number of any characters
# between `${` and `}` literally
.* # matches any number of any characters
""", re.VERBOSE)
def _add_parser(parser, module, name):
module_parser = parser.add_parser(name, description=module.__doc__)
module.init_parser(module_parser)
module_parser.set_defaults(main=module.main)
[docs]def add_parser(parser, modules):
for module in modules:
name = module.__name__.split('.')[-1]
_add_parser(parser, module, name)
_add_parser(parser, module, name[0])
[docs]def setup_parser():
curdir = os.getcwd()
if curdir not in sys.path:
sys.path.insert(0, curdir)
parser = argparse.ArgumentParser()
subparsers = parser.add_subparsers()
add_parser(subparsers, modules)
return parser
def _replace_env_var(match):
env_var, default = match.groups()
return os.environ.get(env_var, default)
def _env_var_constructor(loader, node):
value = loader.construct_scalar(node)
return ENV_VAR_MATCHER.sub(_replace_env_var, value)
[docs]def setup_yaml_parser():
yaml.add_constructor('!env_var', _env_var_constructor)
yaml.add_implicit_resolver('!env_var', IMPLICIT_ENV_VAR_MATCHER)
[docs]def main():
parser = setup_parser()
args = parser.parse_args()
setup_yaml_parser()
args.main(args)