You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
126 lines
2.6 KiB
126 lines
2.6 KiB
3 years ago
|
# Imports
|
||
|
|
||
|
from commonkit import smart_cast
|
||
|
from configparser import ParsingError, RawConfigParser
|
||
|
import logging
|
||
|
import os
|
||
|
|
||
|
log = logging.getLogger(__name__)
|
||
|
|
||
|
# Exports
|
||
|
|
||
|
__all__ = (
|
||
|
"Context",
|
||
|
"Variable",
|
||
|
)
|
||
|
|
||
|
# Functions
|
||
|
|
||
|
|
||
|
def load_variables(path):
|
||
|
"""Load variables from an INI file.
|
||
|
|
||
|
:param path: The path to the INI file.
|
||
|
:type path: str
|
||
|
|
||
|
:rtype: scripttease.lib.contexts.Context
|
||
|
|
||
|
"""
|
||
|
if not os.path.exists(path):
|
||
|
log.warning("Variables file does not exist: %s" % path)
|
||
|
return Context()
|
||
|
|
||
|
ini = RawConfigParser()
|
||
|
try:
|
||
|
ini.read(path)
|
||
|
except ParsingError as e:
|
||
|
log.warning("Failed to parse %s variables file: %s" % (path, str(e)))
|
||
|
return Context()
|
||
|
|
||
|
context = Context()
|
||
|
for variable_name in ini.sections():
|
||
|
_value = None
|
||
|
kwargs = dict()
|
||
|
for key, value in ini.items(variable_name):
|
||
|
if key == "value":
|
||
|
_value = smart_cast(value)
|
||
|
continue
|
||
|
|
||
|
kwargs[key] = smart_cast(value)
|
||
|
|
||
|
context.add(variable_name, _value, **kwargs)
|
||
|
|
||
|
context.is_loaded = True
|
||
|
|
||
|
return context
|
||
|
|
||
|
|
||
|
# Classes
|
||
|
|
||
|
|
||
|
class Context(object):
|
||
|
"""A collection of context variables."""
|
||
|
|
||
|
def __init__(self):
|
||
|
"""Initialize the context."""
|
||
|
self.is_loaded = False
|
||
|
self.variables = dict()
|
||
|
|
||
|
def __getattr__(self, item):
|
||
|
return self.variables.get(item)
|
||
|
|
||
|
def add(self, name, value, **kwargs):
|
||
|
"""Add a variable to the context.
|
||
|
|
||
|
:param name: The name of the variable.
|
||
|
:type name: str
|
||
|
|
||
|
:param value: The value of the variable.
|
||
|
|
||
|
:rtype: scripttease.lib.contexts.Variable
|
||
|
|
||
|
kwargs are passed to instantiate the Variable.
|
||
|
|
||
|
"""
|
||
|
v = Variable(name, value, **kwargs)
|
||
|
self.variables[name] = v
|
||
|
|
||
|
return v
|
||
|
|
||
|
def mapping(self):
|
||
|
"""Get the context as a dictionary.
|
||
|
|
||
|
:rtype: dict
|
||
|
|
||
|
"""
|
||
|
d = dict()
|
||
|
for name, variable in self.variables.items():
|
||
|
d[name] = variable.value
|
||
|
|
||
|
return d
|
||
|
|
||
|
|
||
|
class Variable(object):
|
||
|
"""An individual variable."""
|
||
|
|
||
|
def __init__(self, name, value, **kwargs):
|
||
|
"""Initialize a variable.
|
||
|
|
||
|
:param name: The name of the variable.
|
||
|
:type name: str
|
||
|
|
||
|
:param value: The value of the variable.
|
||
|
|
||
|
kwargs are available as dynamic attributes.
|
||
|
|
||
|
"""
|
||
|
self.attributes = kwargs
|
||
|
self.name = name
|
||
|
self.value = value
|
||
|
|
||
|
def __getattr__(self, item):
|
||
|
return self.attributes.get(item)
|
||
|
|
||
|
def __str__(self):
|
||
|
return str(self.value)
|