actually revert back to using older simpler method for subset hook
calling. It is slightly more inefficient but easier to implement and read. --HG-- branch : more_plugin
This commit is contained in:
		
							parent
							
								
									d2ea7387f2
								
							
						
					
					
						commit
						dea1c96031
					
				|  | @ -242,14 +242,19 @@ class PluginManager(object): | |||
|         """ Return a new HookCaller instance for the named method | ||||
|         which manages calls to all registered plugins except the | ||||
|         ones from remove_plugins. """ | ||||
|         hc = getattr(self.hook, name) | ||||
|         orig = getattr(self.hook, name) | ||||
|         plugins_to_remove = [plugin for plugin in remove_plugins | ||||
|                                     if hasattr(plugin, name)] | ||||
|         if plugins_to_remove: | ||||
|             hc = hc.clone() | ||||
|             for plugin in plugins_to_remove: | ||||
|                 hc._remove_plugin(plugin) | ||||
|         return hc | ||||
|             hc = HookCaller(orig.name, orig._hookexec, orig._specmodule_or_class) | ||||
|             for plugin in orig._plugins: | ||||
|                 if plugin not in plugins_to_remove: | ||||
|                     hc._add_plugin(plugin) | ||||
|                     # we also keep track of this hook caller so it | ||||
|                     # gets properly removed on plugin unregistration | ||||
|                     self._plugin2hookcallers.setdefault(plugin, []).append(hc) | ||||
|             return hc | ||||
|         return orig | ||||
| 
 | ||||
|     def get_canonical_name(self, plugin): | ||||
|         """ Return canonical name for a plugin object. """ | ||||
|  | @ -488,7 +493,6 @@ class HookCaller(object): | |||
|         self._wrappers = [] | ||||
|         self._nonwrappers = [] | ||||
|         self._hookexec = hook_execute | ||||
|         self._subcaller = [] | ||||
|         if specmodule_or_class is not None: | ||||
|             self.set_specification(specmodule_or_class) | ||||
| 
 | ||||
|  | @ -506,21 +510,6 @@ class HookCaller(object): | |||
|         if hasattr(specfunc, "historic"): | ||||
|             self._call_history = [] | ||||
| 
 | ||||
|     def clone(self): | ||||
|         assert not self.is_historic() | ||||
|         hc = object.__new__(HookCaller) | ||||
|         hc.name = self.name | ||||
|         hc._plugins = list(self._plugins) | ||||
|         hc._wrappers = list(self._wrappers) | ||||
|         hc._nonwrappers = list(self._nonwrappers) | ||||
|         hc._hookexec = self._hookexec | ||||
|         hc.argnames = self.argnames | ||||
|         hc.firstresult = self.firstresult | ||||
|         # we keep track of this hook caller so it | ||||
|         # gets properly pruned on plugin unregistration | ||||
|         self._subcaller.append(hc) | ||||
|         return hc | ||||
| 
 | ||||
|     def is_historic(self): | ||||
|         return hasattr(self, "_call_history") | ||||
| 
 | ||||
|  | @ -531,10 +520,6 @@ class HookCaller(object): | |||
|             self._nonwrappers.remove(meth) | ||||
|         except ValueError: | ||||
|             self._wrappers.remove(meth) | ||||
|         if hasattr(self, "_subcaller"): | ||||
|             for hc in self._subcaller: | ||||
|                 if plugin in hc._plugins: | ||||
|                     hc._remove_plugin(plugin) | ||||
| 
 | ||||
|     def _add_plugin(self, plugin): | ||||
|         self._plugins.append(plugin) | ||||
|  | @ -553,6 +538,7 @@ class HookCaller(object): | |||
|             i = len(nonwrappers) - 1 | ||||
|             while i >= 0 and hasattr(nonwrappers[i], "tryfirst"): | ||||
|                 i -= 1 | ||||
| 
 | ||||
|             # and insert right in front of the tryfirst ones | ||||
|             nonwrappers.insert(i+1, meth) | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue