diff --git a/hyde/loader.py b/hyde/loader.py new file mode 100644 index 0000000..1b3dc72 --- /dev/null +++ b/hyde/loader.py @@ -0,0 +1,42 @@ +""" +Generic loader of extensions (plugins & templates) +""" +import sys + +from hyde.exceptions import HydeException + +plugins = {} +templates = {} + + +def load_python_object(name): + """ + Loads a python module from string + """ + (module_name, _, object_name) = name.rpartition(".") + if module_name == '': + (module_name, object_name) = (object_name, module_name) + try: + module = __import__(module_name) + except ImportError: + raise HydeException("The given module name [%s] is invalid." % + module_name) + + if object_name == '': + return module + + try: + module = sys.modules[module_name] + except KeyError: + raise HydeException("Error occured when loading module [%s]" % + module_name) + + try: + return getattr(module, object_name) + except AttributeError: + raise HydeException("Cannot load the specified plugin [%s]. " + "The given module [%s] does not contain the " + "desired object [%s]. Please fix the" + "configuration or ensure that the module is " + "installed properly" % + (name, module_name, object_name)) diff --git a/hyde/tests/test_loader.py b/hyde/tests/test_loader.py new file mode 100644 index 0000000..aa21f84 --- /dev/null +++ b/hyde/tests/test_loader.py @@ -0,0 +1,54 @@ +# -*- coding: utf-8 -*- +""" +Use nose +`$ pip install nose` +`$ nosetests` +""" + +from hyde.loader import load_python_object +from nose.tools import raises +import os + +from hyde.exceptions import HydeException + + +def test_can_load_locals(): + + file_class = load_python_object('hyde.fs.File') + assert file_class + + f = file_class(__file__) + assert f + + assert f.name == os.path.basename(__file__) + + +def test_can_load_from_python_path(): + + markdown = load_python_object('markdown.markdown') + assert markdown + + assert "