[Checkins] SVN: z3c.configurator/trunk/src/z3c/configurator/ handle interface changes in dependency analysis

Bernd Dorn bernd.dorn at lovelysystems.com
Sun Jan 14 07:48:31 EST 2007


Log message for revision 72021:
  handle interface changes in dependency analysis

Changed:
  U   z3c.configurator/trunk/src/z3c/configurator/browser/views.py
  U   z3c.configurator/trunk/src/z3c/configurator/configurator.py

-=-
Modified: z3c.configurator/trunk/src/z3c/configurator/browser/views.py
===================================================================
--- z3c.configurator/trunk/src/z3c/configurator/browser/views.py	2007-01-14 11:52:47 UTC (rev 72020)
+++ z3c.configurator/trunk/src/z3c/configurator/browser/views.py	2007-01-14 12:48:31 UTC (rev 72021)
@@ -68,7 +68,8 @@
             plugins = configurator.requiredPlugins(self.context,
                                                    self._pluginNames)
             self.subforms = []
-            for name, plugin in plugins:
+            for name, factory in plugins:
+                plugin = factory(self.context)
                 if not interfaces.ISchemaConfigurationPlugin.providedBy(
                     plugin):
                     continue
@@ -93,7 +94,7 @@
 
     @form.action(_("Apply"), condition='_pluginsSelected')
     def handleApply(self, action, data):
-        plugins = configurator.requiredPlugins(self._pluginNames)
+
         configuratorData = {}
         for subform in self.subforms:
             subform.update()

Modified: z3c.configurator/trunk/src/z3c/configurator/configurator.py
===================================================================
--- z3c.configurator/trunk/src/z3c/configurator/configurator.py	2007-01-14 11:52:47 UTC (rev 72020)
+++ z3c.configurator/trunk/src/z3c/configurator/configurator.py	2007-01-14 12:48:31 UTC (rev 72021)
@@ -23,16 +23,38 @@
 
 from z3c.configurator import interfaces
 
+def getAdapterFactories(component, specific=True):
+    """Get adapter registrations where @iface is provided and prefer
+    the specific registrations."""
+    iface =  interfaces.IConfigurationPlugin
+    gsm = zope.component.getGlobalSiteManager()
+    res = {}
+    for reg in gsm.registeredAdapters():
+        # Only get adapters for which this interface is provided
+        if reg.provided is None or not reg.provided.isOrExtends(iface):
+            continue
+        if reg.required[0].providedBy(component):
+            res[reg.name] = reg.factory
+        if specific or reg.name in res:
+            continue
+        res[reg.name] = reg.factory
+    return res
+
 def requiredPlugins(component, names=[]):
 
-    """returns a list of tuples (name, plugin) in the right order to
-    be executed"""
-    
-    plugins = dict(zope.component.getAdapters(
-        (component,), interfaces.IConfigurationPlugin))
-    # if we have no names we return them all
+    """returns a list of tuples of (name, pluginfactory) in the right
+    order to be executed"""
+
     if not names:
-        return [(name, plugins[name]) for name in sorted(plugins.keys())]
+        # get all names we have available
+        names = getAdapterFactories(component,
+                                    specific=True).keys()
+        
+    # we need this in order to get dependencies from plugins which are
+    # not available in the unconfigured component because the provided
+    # interfaces may change during execution
+    plugins = getAdapterFactories(component,
+                                  specific=False)
     
     def _add(name, res):
         deps = getattr(plugins[name], 'dependencies', ())
@@ -49,12 +71,13 @@
 def configure(component, data, names=[], useNameSpaces=False):
 
     plugins = requiredPlugins(component, names)
-    for name, plugin in plugins:
+
+    for name, factory in plugins:
         if useNameSpaces is True:
             d = data.get(name, {})
         else:
             d = data
-            
+        plugin = factory(component)
         plugin(d)
 
 class ConfigurationPluginBase(object):



More information about the Checkins mailing list