HamlPy
HamlPy copied to clipboard
HamlPy cannot run from library.zip
HamlPy fails to load when an application is run from a packed Python library, such as one produced by py2exe:
Traceback (most recent call last):
File "django\core\handlers\base.pyo", line 140, in get_response
File "django\template\response.pyo", line 105, in render
File "django\template\response.pyo", line 80, in rendered_content
File "django\template\response.pyo", line 58, in resolve_template
File "django\template\loader.pyo", line 146, in get_template
File "django\template\loader.pyo", line 129, in find_template
File "django\template\loader.pyo", line 96, in find_template_loader
File "django\utils\importlib.pyo", line 35, in import_module
File "hamlpy\template\__init__.pyo", line 1, in <module>
File "hamlpy\template\loaders.pyo", line 64, in <module>
File "hamlpy\template\utils.pyo", line 17, in get_django_template_loaders
File "hamlpy\template\utils.pyo", line 22, in get_submodules
File "hamlpy\template\utils.pyo", line 29, in package_contents
WindowsError: [Error 3] The system cannot find the path specified: 'X:\\path\\build\\dist.win32\\bin\\library.zip\\django\\template\\loaders/*.*'
This patch effectively disables wrapping for all Django template loaders at HamlPy module load time when Django modules do not reside on file system:
=== modified file 'hamlpy/template/utils.py'
--- hamlpy/template/utils.py 2013-05-09 01:59:39 +0000
+++ hamlpy/template/utils.py 2013-10-02 08:18:29 +0000
@@ -1,6 +1,6 @@
import imp
from os import listdir
-from os.path import dirname, splitext
+from os.path import dirname, isdir, splitext
try:
from django.template import loaders
@@ -25,7 +25,10 @@
def package_contents(package):
package_path = dirname(loaders.__file__)
- contents = set([splitext(module)[0]
- for module in listdir(package_path)
- if module.endswith(MODULE_EXTENSIONS)])
+ if isdir(package_path):
+ contents = set([splitext(module)[0]
+ for module in listdir(package_path)
+ if module.endswith(MODULE_EXTENSIONS)])
+ else:
+ contents = set()
return contents
With this change, one cannot import an arbitrary Django loader from hamlpy.template.
Loaders hamlpy.template.loaders.HamlPyFilesystemLoader and hamlpy.template.loaders.HamlPyAppDirectoriesLoader are not affected by this patch and work as expected as soon as module loading error is fixed.
By the way, I think more Pythonic approach would be to provide a way for explicit wrapping of needed loaders (in a way similar to what Django cached loader does) and not automatically create wrappers for everything we can find on a file system.
This is fixed in 84abeed87310daa9cbb4b704dccc149a2dd53be5 (courtesy of @KACAH).