85 lines
No EOL
2.6 KiB
Python
85 lines
No EOL
2.6 KiB
Python
|
|
from __future__ import print_function
|
|
import os
|
|
import pickle
|
|
from xml.etree.ElementTree import ElementTree
|
|
import dsz.lp
|
|
|
|
class XMLConfigError(Exception, ):
|
|
pass
|
|
|
|
def enforce(condition, msg=None):
|
|
if (not condition):
|
|
if msg:
|
|
raise XMLConfigError, (msg if (type(msg) is not type((lambda : None))) else msg())
|
|
else:
|
|
raise XMLConfigError
|
|
|
|
class ConfigProcessor(object, ):
|
|
|
|
def __init__(self, file, flags):
|
|
self.flags = flags
|
|
self.file = file
|
|
|
|
def process(self):
|
|
enforce(False, (lambda : ('XML config processor not implemented for %s' % self.__class__)))
|
|
|
|
def validate(self):
|
|
enforce(False, (lambda : ('XML config validation not implemented for %s' % self.__class__)))
|
|
|
|
class Config(object, ):
|
|
|
|
def __init__(self, file, flags={}, **kwargs):
|
|
self.__file = file
|
|
self.flags = flags
|
|
self.kwargs = kwargs
|
|
|
|
@property
|
|
def file(self):
|
|
return self.__file
|
|
|
|
def validate(self):
|
|
return self.__process(validate_only=True)
|
|
|
|
def process(self):
|
|
self.__process(validate_only=False)
|
|
|
|
def __process(self, validate_only):
|
|
ver = version(self.file)
|
|
initargs = _processors[ver]['init']
|
|
processor = _processors[ver]['processor']
|
|
for i in self.kwargs:
|
|
if (i not in initargs):
|
|
initargs[i] = self.kwargs[i]
|
|
config = processor(file=self.file, flags=self.flags, **initargs)
|
|
if validate_only:
|
|
return config.validate()
|
|
else:
|
|
config.process()
|
|
_HANDLER_CACHE = os.path.normpath(os.path.join(dsz.lp.GetResourcesDirectory(), '..', 'tmp', 'survey', 'engines.pickle'))
|
|
|
|
def _loadhandlers():
|
|
if (not os.path.exists(_HANDLER_CACHE)):
|
|
return {}
|
|
with open(_HANDLER_CACHE, 'r') as input:
|
|
return pickle.load(input)
|
|
_processors = _loadhandlers()
|
|
|
|
def _savehandlers():
|
|
if (not os.path.exists(os.path.split(_HANDLER_CACHE)[0])):
|
|
os.makedirs(os.path.split(_HANDLER_CACHE)[0])
|
|
with open(_HANDLER_CACHE, 'w') as output:
|
|
pickle.dump(_processors, output)
|
|
|
|
def version(file):
|
|
tree = ElementTree(file=file)
|
|
version = tree.getroot().get('version', default=None)
|
|
enforce((version in _processors), (lambda : ("Unsupported XML configuration version '%s' read from file." % version)))
|
|
return version
|
|
|
|
def register_handler(version, processor, **initargs):
|
|
if (version in _processors):
|
|
return False
|
|
_processors[version] = {'processor': processor, 'init': initargs}
|
|
_savehandlers()
|
|
return True |