parent
fba0c89d36
commit
d79aff9f88
1 changed files with 125 additions and 0 deletions
@ -0,0 +1,125 @@ |
|||||||
|
# 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) |
Loading…
Reference in new issue