[Zope-Checkins] CVS: Zope3/lib/python/Zope/ComponentArchitecture - IToIRegistry.py:1.1.4.15 IViewService.py:1.1.2.7 ViewService.py:1.1.2.14

Jim Fulton jim@zope.com
Sun, 24 Mar 2002 16:09:37 -0500


Update of /cvs-repository/Zope3/lib/python/Zope/ComponentArchitecture
In directory cvs.zope.org:/tmp/cvs-serv21372

Modified Files:
      Tag: Zope-3x-branch
	IToIRegistry.py IViewService.py ViewService.py 
Log Message:
Added an API to viewService to query view definitions. This is useful
for browsing tools.



=== Zope3/lib/python/Zope/ComponentArchitecture/IToIRegistry.py 1.1.4.14 => 1.1.4.15 ===
         return None
 
+
+    def getDefinitions(self, used_for=None, provide=None):
+        if used_for is not None:
+            if provide is not None:
+                c = self._find(used_for, provide)
+                if c is None:
+                    return []
+                else:
+                    return [{ 'used_for': used_for,
+                              'provides': provide,
+                              'factory': c
+                              }]
+            else:
+                return self.getDefinitionsFor(used_for)
+                
+        # get everything
+        reg = self._reg
+        return [{ 'used_for': key[0],
+                  'provides': key[1],
+                  'factory': reg[key][1],
+                  } for key in reg]
+
+    def getDefinitionsFor(self, used_for):
+        """Return the components registered to provide some interfaces
+        """
+        # This is tricky, because we want the most specific provider
+        seen = {}
+        reg = self._reg
+        for for_, provides in reg:
+            if not used_for.extends(for_, 0):
+                continue
+            if provides not in seen or for_.extends(seen[provides]):
+                seen[provides] = for_
+
+        return [{ 'used_for': seen[provides],
+                  'provides': provides,
+                  'factory': reg[seen[provides], provides][1],
+                  } for provides in seen]
+
     def getAll(self, ob_interface, provide, result=None, seen=None):
         """Get all components that match an interface
         


=== Zope3/lib/python/Zope/ComponentArchitecture/IViewService.py 1.1.2.6 => 1.1.2.7 ===
 class IViewService(Interface):
 
-    def provideView(forInterface, name, type, maker, layer=''):
-        """Provide a view
-
-        A view provides some type of presentation (e.g. browser, ftp)
-        for components of a given interface.
-
-        Arguments:
-
-        forInterface -- The interface the view is for
-
-        name -- The view name
-
-        type -- The view type, expressed as an interface
-
-        maker -- a callable object that gets a view component for
-        a context component.
-
-        layer -- Optional view layer. Layers are used to define skins.
-        """
-
     def getView(object, name, type, default=None, skin=''):
         """Look up a named view of a given type for an object
 
@@ -79,7 +59,25 @@
         A Zope.NotFoundError will be raised if the suitable
         default view name for the object cannot be found.
         """
-        
+
+    def getViewDefinitions(name=None, use_for=None, type=None, layer=None):
+        """Get matching view definitions
+
+        Get view definitions as a sequence of mapping objects with keys:
+
+        - name
+
+        - used_for
+
+        - type
+
+        - layer
+
+        - factory
+
+        The arguments may be given as keyword arguments and define a
+        query for the retrieval.
+        """
 
 class IViewRequest(Interface):
     """An IViewRequest provides methods for getting view meta data.


=== Zope3/lib/python/Zope/ComponentArchitecture/ViewService.py 1.1.2.13 => 1.1.2.14 ===
         self.__default_view_names = IToIDataRegistry()
 
-    __implements__ = IViewService
+        __implements__ = IViewService
 
     def setDefaultViewName(self, i_required, i_provided, name):
         '''Add name to our registry of default view names for
@@ -41,6 +41,39 @@
         
     # Implementation methods for interface
     # Zope.ComponentArchitecture.IViewService.
+
+    def getViewDefinitions(self, name=None, used_for=None, type=None,
+                           layer=None):
+        '''See interface IViewService'''
+
+        result = []
+
+        if layer is None:
+            layers = self.__layers.keys()
+        else:
+            layers = [layer]
+
+        for layername in layers:
+            layer = self.__layers[layername]
+            if name is None:
+                names = layer.keys()
+            else:
+                names = [name]
+
+            for n in names:
+                result.extend(
+                    [{ 'name': n,
+                       'used_for': definition['used_for'],
+                       'type': definition['provides'],
+                       'layer': layername,
+                       'factory': definition['factory'],
+                       }
+                     for definition
+                     in layer[n].getDefinitions(used_for, type)
+                     ]
+                    )
+                    
+        return result                
 
     def getView(self, object, name, type, default=_marker, skin=''):
         '''See interface IViewService'''