Source code for morfdict.factory
from os.path import dirname, abspath
from morfdict import StringDict, PathDict
[docs]class Factory(object):
"""Loader for settings files."""
def __init__(self, main_modulepath, settings_modulepath='settings'):
"""
:param main_modulepath: import path to a main module
:param settings_modulepath: import path to a settings module within
main module
"""
self.main_modulepath = main_modulepath
self.settings_modulepath = settings_modulepath
def _import_wrapper(self, modulepath):
return __import__(
modulepath, globals(), locals(), ['']
)
[docs] def import_module(self, modulename):
"""Import module from settings module."""
modulepath = '.'.join(
[self.main_modulepath, self.settings_modulepath, modulename])
return self._import_wrapper(modulepath)
[docs] def run_module(self, name):
"""Import settings from a module. Raise ImportError on missing module.
"""
module = self.import_module(name)
module.make_settings(self.settings, self.paths)
[docs] def run_module_without_errors(self, name):
"""Import settings from a module. Do not raise ImportError on missing
module."""
try:
module = self.import_module(name)
module.make_settings(self.settings, self.paths)
except ImportError:
pass
[docs] def init_data(self, settings, paths):
"""Initialize settings and paths with data. Add 'project_path' to paths
depending on main module.
"""
self.settings = StringDict(settings)
self.paths = PathDict(paths)
mainmodule = self._import_wrapper(self.main_modulepath)
self.paths['project_path'] = dirname(abspath(mainmodule.__file__))
[docs] def make_settings(self, settings={}, paths={}, additional_modules=None):
"""Make StringDict and PathDict from modules.
:param settings: default settings
:param paths: default paths
:param additional_modules: list of tuples of additional modules. First
:param element: in tuple is a module name, second is bool. If setted to
true,
:param method: will raise ImportError on missing module.
"""
additional_modules = additional_modules or (('local', False),)
self.init_data(settings, paths)
self.run_module('default')
for module_name, show_error in additional_modules:
if show_error:
self.run_module(module_name)
else:
self.run_module_without_errors(module_name)
return self.settings, self.paths