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 "

h3

" == markdown("### h3") + +def test_can_load_module_without_dot(): + + yaml = load_python_object('yaml') + + abc = yaml.load(""" + d: efg + l: mno + """) + + assert abc['d'] == 'efg' + assert abc['l'] == 'mno' + + +@raises(HydeException) +def test_exception_raised_for_invalid_module(): + load_python_object("junk.junk.junk") + assert False + +@raises(HydeException) +def test_exception_raised_for_invalid_object(): + load_python_object("markdown.junk") + assert False \ No newline at end of file diff --git a/hyde/tests/test_util.py b/hyde/tests/test_util.py deleted file mode 100644 index 6f7e287..0000000 --- a/hyde/tests/test_util.py +++ /dev/null @@ -1,19 +0,0 @@ -# -*- coding: utf-8 -*- -""" -Use nose -`$ pip install nose` -`$ nosetests` -""" - -from hyde.util import load_python_object -import os - -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__) diff --git a/hyde/util.py b/hyde/util.py deleted file mode 100644 index 470d946..0000000 --- a/hyde/util.py +++ /dev/null @@ -1,14 +0,0 @@ -""" -Hyde utilities -""" -import sys - - -def load_python_object(name): - """ - Loads a python module from string - """ - (module_name, _ , object_name) = name.rpartition(".") - __import__(module_name) - module = sys.modules[module_name] - return getattr(module, object_name)