Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033 import __builtin__
00034 import os
00035 import sys
00036
00037
00038 class ReloadImporter:
00039
00040 """Overrides the builtin import and automatically reloads all modules which are imported from on
00041 of the reload paths after calling enable."""
00042
00043 def __init__(self):
00044 self._excluded_modules = sys.modules.keys()
00045 self._reload_paths = None
00046 self._import_stack = []
00047 self._reloaded_modules = set()
00048 self._import = __builtin__.__import__
00049
00050 def enable(self):
00051 __builtin__.__import__ = self._reimport
00052
00053 def disable(self):
00054 __builtin__.__import__ = self._import
00055
00056 def add_reload_path(self, path):
00057 if self._reload_paths is None:
00058 self._reload_paths = tuple()
00059 self._reload_paths += (os.path.abspath(path),)
00060
00061 def _reload(self, module):
00062 if module.__name__ not in self._import_stack and module.__name__ in sys.modules:
00063 if not self._import_stack:
00064 self._reloaded_modules.clear()
00065 self._import_stack.append(module.__name__)
00066
00067 if module.__name__ not in self._reloaded_modules:
00068 reload(module)
00069 self._reloaded_modules.add(module.__name__)
00070 self._import_stack.pop()
00071
00072 def _reimport(self, name, globals_=None, locals_=None, fromlist=None, level=-1):
00073 module = self._import(name, globals_, locals_, fromlist if not None else [], level if not None else -1)
00074
00075 if module.__name__ not in self._excluded_modules and \
00076 (self._reload_paths is None or \
00077 (hasattr(module, '__file__') and len([p for p in self._reload_paths if module.__file__.startswith(p)]) > 0) \
00078 ):
00079 self._reload(module)
00080
00081 return module