|
|
|
# Imports
|
|
|
|
|
|
|
|
from commonkit import smart_cast
|
|
|
|
from configparser import ConfigParser
|
|
|
|
import logging
|
|
|
|
import os
|
|
|
|
from ..constants import LOGGER_NAME
|
|
|
|
|
|
|
|
log = logging.getLogger(LOGGER_NAME)
|
|
|
|
|
|
|
|
# Exports
|
|
|
|
|
|
|
|
__all__ = (
|
|
|
|
"context_from_cli",
|
|
|
|
"filters_from_cli",
|
|
|
|
"options_from_cli",
|
|
|
|
"variables_from_file",
|
|
|
|
)
|
|
|
|
|
|
|
|
# Functions
|
|
|
|
|
|
|
|
|
|
|
|
def context_from_cli(variables):
|
|
|
|
"""Takes a list of variables given in the form of ``name:value`` and converts them to a dictionary.
|
|
|
|
|
|
|
|
:param variables: A list of strings of ``name:value`` pairs.
|
|
|
|
:type variables: list[str]
|
|
|
|
|
|
|
|
:rtype: dict
|
|
|
|
|
|
|
|
The ``value`` of the pair passes through "smart casting" to convert it to the appropriate Python data type.
|
|
|
|
|
|
|
|
"""
|
|
|
|
context = dict()
|
|
|
|
for i in variables:
|
|
|
|
key, value = i.split(":")
|
|
|
|
context[key] = smart_cast(value)
|
|
|
|
|
|
|
|
return context
|
|
|
|
|
|
|
|
|
|
|
|
def filters_from_cli(filters):
|
|
|
|
"""Takes a list of filters given in the form of ``name:value`` and converts them to a dictionary.
|
|
|
|
|
|
|
|
:param filters: A list of strings of ``attribute:value`` pairs.
|
|
|
|
:type filters: list[str]
|
|
|
|
|
|
|
|
:rtype: dict
|
|
|
|
|
|
|
|
"""
|
|
|
|
_filters = dict()
|
|
|
|
for i in filters:
|
|
|
|
key, value = i.split(":")
|
|
|
|
if key not in filters:
|
|
|
|
_filters[key] = list()
|
|
|
|
|
|
|
|
_filters[key].append(value)
|
|
|
|
|
|
|
|
return _filters
|
|
|
|
|
|
|
|
|
|
|
|
def options_from_cli(options):
|
|
|
|
"""Takes a list of variables given in the form of ``name:value`` and converts them to a dictionary.
|
|
|
|
|
|
|
|
:param options: A list of strings of ``name:value`` pairs.
|
|
|
|
:type options: list[str]
|
|
|
|
|
|
|
|
:rtype: dict
|
|
|
|
|
|
|
|
The ``value`` of the pair passes through "smart casting" to convert it to the appropriate Python data type.
|
|
|
|
|
|
|
|
"""
|
|
|
|
_options = dict()
|
|
|
|
for i in options:
|
|
|
|
key, value = i.split(":")
|
|
|
|
_options[key] = smart_cast(value)
|
|
|
|
|
|
|
|
return _options
|
|
|
|
|
|
|
|
|
|
|
|
def variables_from_file(path):
|
|
|
|
"""Loads variables from a given INI file.
|
|
|
|
|
|
|
|
:param path: The path to the INI file.
|
|
|
|
:type path: str
|
|
|
|
|
|
|
|
:rtype: dict | None
|
|
|
|
|
|
|
|
The resulting dictionary flattens the sections and values. For example:
|
|
|
|
|
|
|
|
.. code-block:: ini
|
|
|
|
|
|
|
|
[copyright]
|
|
|
|
name = ACME, Inc.
|
|
|
|
year = 2020
|
|
|
|
|
|
|
|
[domain]
|
|
|
|
name = example.com
|
|
|
|
tld = example_com
|
|
|
|
|
|
|
|
The dictionary would contain:
|
|
|
|
|
|
|
|
.. code-block:: python
|
|
|
|
|
|
|
|
{
|
|
|
|
'copyright_name': "ACME, Inc.",
|
|
|
|
'copyright_year': 2020,
|
|
|
|
'domain_name': "example.com",
|
|
|
|
'domain_tld': "example_com",
|
|
|
|
}
|
|
|
|
|
|
|
|
"""
|
|
|
|
if not os.path.exists(path):
|
|
|
|
log.warning("Variables file does not exist: %s" % path)
|
|
|
|
return None
|
|
|
|
|
|
|
|
ini = ConfigParser()
|
|
|
|
ini.read(path)
|
|
|
|
|
|
|
|
variables = dict()
|
|
|
|
for section in ini.sections():
|
|
|
|
for key, value in ini.items(section):
|
|
|
|
key = "%s_%s" % (section, key)
|
|
|
|
variables[key] = smart_cast(value)
|
|
|
|
|
|
|
|
return variables
|