also incrementally remove plugins from hook callers
--HG-- branch : more_plugin
This commit is contained in:
		
							parent
							
								
									02a4042dca
								
							
						
					
					
						commit
						f41528433b
					
				|  | @ -185,7 +185,7 @@ class PluginManager(object): | |||
|         for plugin in hc.plugins: | ||||
|             meth = getattr(plugin, name, None) | ||||
|             if meth is not None: | ||||
|                 hc._add_method(meth) | ||||
|                 hc.add_method(meth) | ||||
|         return hc | ||||
| 
 | ||||
|     def register(self, plugin, name=None): | ||||
|  | @ -219,8 +219,7 @@ class PluginManager(object): | |||
|                 del self._name2plugin[name] | ||||
|         hookcallers = self._plugin2hookcallers.pop(plugin) | ||||
|         for hookcaller in hookcallers: | ||||
|             hookcaller.plugins.remove(plugin) | ||||
|             hookcaller._scan_methods() | ||||
|             hookcaller.remove_plugin(plugin) | ||||
| 
 | ||||
|     def addhooks(self, module_or_class): | ||||
|         """ add new hook definitions from the given module_or_class using | ||||
|  | @ -242,7 +241,7 @@ class PluginManager(object): | |||
|                     hc.setspec(firstresult=firstresult, argnames=argnames) | ||||
|                     for plugin in hc.plugins: | ||||
|                         self._verify_hook(hc, specfunc, plugin) | ||||
|                         hc._add_method(getattr(plugin, name)) | ||||
|                         hc.add_method(getattr(plugin, name)) | ||||
|                 names.append(name) | ||||
|         if not names: | ||||
|             raise ValueError("did not find new %r hooks in %r" | ||||
|  | @ -292,7 +291,7 @@ class PluginManager(object): | |||
|                 # we have a hook spec, can verify early | ||||
|                 self._verify_hook(hook, method, plugin) | ||||
|                 hook.plugins.append(plugin) | ||||
|                 hook._add_method(method) | ||||
|                 hook.add_method(method) | ||||
|             hookcallers.append(hook) | ||||
|         return hookcallers | ||||
| 
 | ||||
|  | @ -420,13 +419,15 @@ class HookCaller: | |||
|         self.argnames = ["__multicall__"] + list(argnames) | ||||
|         self.firstresult = firstresult | ||||
| 
 | ||||
|     def _scan_methods(self): | ||||
|         self.wrappers[:] = [] | ||||
|         self.nonwrappers[:] = [] | ||||
|         for plugin in self.plugins: | ||||
|             self._add_method(getattr(plugin, self.name)) | ||||
|     def remove_plugin(self, plugin): | ||||
|         self.plugins.remove(plugin) | ||||
|         meth = getattr(plugin, self.name) | ||||
|         try: | ||||
|             self.nonwrappers.remove(meth) | ||||
|         except ValueError: | ||||
|             self.wrappers.remove(meth) | ||||
| 
 | ||||
|     def _add_method(self, meth): | ||||
|     def add_method(self, meth): | ||||
|         assert not self.pre | ||||
|         if hasattr(meth, 'hookwrapper'): | ||||
|             self.wrappers.append(meth) | ||||
|  |  | |||
|  | @ -96,7 +96,7 @@ class TestAddMethodOrdering: | |||
|                     func.trylast = True | ||||
|                 if hookwrapper: | ||||
|                     func.hookwrapper = True | ||||
|                 hc._add_method(func) | ||||
|                 hc.add_method(func) | ||||
|                 return func | ||||
|             return wrap | ||||
|         return addmeth | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue