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
+21 -7
View File
@@ -11,25 +11,30 @@ 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():
__builtin__.__import__ = custom_importer if __builtin__.__import__ != custom_importer:
INVALID_MODULES = INVALID_MODULES.union(sys.modules.keys())
__builtin__.__import__ = custom_importer
def track_changes(track=True): def track_changes(track=True):
assert track in (True,False), "must be True or False" assert track in (True,False), "must be True or False"
global TRACK_CHANGES global TRACK_CHANGES
TRACK_CHANGES = track TRACK_CHANGES = track
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
tries to transform import statements as something like tries to transform import statements as something like
"import applications.app_name.modules.x". "import applications.app_name.modules.x".
If the import failed, fall back on naive_importer If the import failed, fall back on naive_importer
""" """
@@ -43,7 +48,8 @@ def custom_importer(name, globals=None, locals=None, fromlist=None, level=-1):
if hasattr(current,'request') \ if hasattr(current,'request') \
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)