better errors in custom_import, thanks Michele

This commit is contained in:
mdipierro
2012-10-15 05:46:57 -05:00
parent 8607b09e64
commit b6429ca5fd
2 changed files with 22 additions and 8 deletions
+1 -1
View File
@@ -1 +1 @@
Version 2.1.0 (2012-10-15 05:33:14) dev Version 2.1.0 (2012-10-15 05:46:52) dev
+16 -2
View File
@@ -11,10 +11,12 @@ from gluon import current
NATIVE_IMPORTER = __builtin__.__import__ NATIVE_IMPORTER = __builtin__.__import__
TRACK_CHANGES = False TRACK_CHANGES = False
INVALID_MODULES = set(sys.modules.keys()).union(('','gluon','applications','custom_import')) INVALID_MODULES = set(('','gluon','applications','custom_import'))
# backward compatibility API # backward compatibility API
def custom_import_install(): def custom_import_install():
if __builtin__.__import__ != custom_importer:
INVALID_MODULES = INVALID_MODULES.union(sys.modules.keys())
__builtin__.__import__ = custom_importer __builtin__.__import__ = custom_importer
def track_changes(track=True): def track_changes(track=True):
@@ -25,6 +27,9 @@ def track_changes(track=True):
def is_tracking_changes(): def is_tracking_changes():
return TRACK_CHANGES return TRACK_CHANGES
class CustomImportException(ImportError):
pass
def custom_importer(name, globals=None, locals=None, fromlist=None, level=-1): def custom_importer(name, globals=None, locals=None, fromlist=None, level=-1):
""" """
The web2py custom importer. Like the standard Python importer but it The web2py custom importer. Like the standard Python importer but it
@@ -44,6 +49,7 @@ def custom_importer(name, globals=None, locals=None, fromlist=None, level=-1):
and level<=0 \ and level<=0 \
and not name.split('.')[0] in INVALID_MODULES \ and not name.split('.')[0] in INVALID_MODULES \
and isinstance(globals, dict): and isinstance(globals, dict):
import_tb = None
try: try:
items = current.request.folder.split(os.path.sep) items = current.request.folder.split(os.path.sep)
if not items[-1]: items = items[:-1] if not items[-1]: items = items[:-1]
@@ -65,9 +71,17 @@ def custom_importer(name, globals=None, locals=None, fromlist=None, level=-1):
pname = modules_prefix + "." + name pname = modules_prefix + "." + name
return base_importer(pname, globals, locals, fromlist, level) return base_importer(pname, globals, locals, fromlist, level)
except ImportError, e1: except ImportError, e1:
pass # the module does not exist import_tb = sys.exc_info()[2]
try:
return NATIVE_IMPORTER(name,globals,locals,fromlist,level)
except ImportError, e3:
raise ImportError, e1, import_tb # there an import error in the module
except Exception, e2: except Exception, e2:
raise e2 # there is an error in the module raise e2 # there is an error in the module
finally:
if import_tb:
import_tb = None
return NATIVE_IMPORTER(name,globals,locals,fromlist,level) return NATIVE_IMPORTER(name,globals,locals,fromlist,level)