Source code for flexget.plugins.cli.cli_config
"""Allows specifying yml configuration values from commandline parameters.
Yml variables are prefixed with dollar sign ($).
Commandline parameter must be comma separated list of variable=values.
Configuration example::
tasks:
my task:
rss: $url
download: $path
Commandline example::
--cli-config url=http://some.url/ path=~/downloads
"""
import argparse
import functools
from loguru import logger
from flexget import options
from flexget.event import event
logger = logger.bind(name='cli_config')
[docs]
def replace_in_item(replaces, item):
replace = functools.partial(replace_in_item, replaces)
if isinstance(item, str):
# Do replacement in text objects
for key, val in replaces.items():
item = item.replace(f'${key}', val)
return item
if isinstance(item, list):
# Make a new list with replacements done on each item
return list(map(replace, item))
if isinstance(item, dict):
# Make a new dict with replacements done on keys and values
return dict(list(map(replace, kv_pair)) for kv_pair in item.items())
# We don't know how to do replacements on this item, just return it
return item
[docs]
@event('manager.before_config_validate')
def substitute_cli_variables(config, manager):
if not manager.options.execute.cli_config:
return None
return replace_in_item(dict(manager.options.execute.cli_config), config)
[docs]
def key_value_pair(text):
if '=' not in text:
raise argparse.ArgumentTypeError('arguments must be in VARIABLE=VALUE form')
return text.split('=', 1)
[docs]
@event('options.register')
def register_parser_arguments():
options.get_parser('execute').add_argument(
'--cli-config',
nargs='+',
type=key_value_pair,
metavar='VARIABLE=VALUE',
help='configuration parameters through commandline',
)