[Zope3-checkins] SVN: Zope3/branches/tziade_xmlintrospection/src/zope/app/xmlrpcintrospection/ methodSignature implementation

Tarek Ziadé tziade at nuxeo.com
Sat Oct 8 12:44:30 EDT 2005


Log message for revision 38970:
  methodSignature implementation

Changed:
  U   Zope3/branches/tziade_xmlintrospection/src/zope/app/xmlrpcintrospection/README.txt
  U   Zope3/branches/tziade_xmlintrospection/src/zope/app/xmlrpcintrospection/xmlrpcintrospection.py

-=-
Modified: Zope3/branches/tziade_xmlintrospection/src/zope/app/xmlrpcintrospection/README.txt
===================================================================
--- Zope3/branches/tziade_xmlintrospection/src/zope/app/xmlrpcintrospection/README.txt	2005-10-08 16:42:26 UTC (rev 38969)
+++ Zope3/branches/tziade_xmlintrospection/src/zope/app/xmlrpcintrospection/README.txt	2005-10-08 16:44:29 UTC (rev 38970)
@@ -206,4 +206,63 @@
   </methodResponse>
   <BLANKLINE>
 
+No we want to test methodHelp and methodSignature, to check that it returns,
 
+    - The method doc
+
+    - The list of attributes
+
+Let's add a new method that has i all:
+
+  >>> class JacksonFiveRPC:
+  ...     def says(self, a, b, c):
+  ...         return '%s %s, %s, lalalala, you and me, lalalala' % (a, b, c)
+  >>> from zope.configuration import xmlconfig
+  >>> ignored = xmlconfig.string("""
+  ... <configure
+  ...     xmlns="http://namespaces.zope.org/zope"
+  ...     xmlns:xmlrpc="http://namespaces.zope.org/xmlrpc"
+  ...     >
+  ...   <!-- We only need to do this include in this example,
+  ...        Normally the include has already been done for us. -->
+  ...   <include package="zope.app.publisher.xmlrpc" file="meta.zcml" />
+  ...
+  ...   <xmlrpc:view
+  ...       for="zope.app.folder.folder.IFolder"
+  ...       methods="says"
+  ...       class="zope.app.xmlrpcintrospection.README.JacksonFiveRPC"
+  ...       permission="zope.ManageContent"
+  ...       />
+  ... </configure>
+  ... """)
+
+Now let's try to get the attributes for `says()`:
+
+  >>> print http(r"""
+  ... POST / HTTP/1.0
+  ... Content-Type: text/xml
+  ...
+  ... <?xml version='1.0'?>
+  ... <methodCall>
+  ... <methodName>methodSignature</methodName>
+  ... <params>
+  ... <param>
+  ... <value>says</value>
+  ... </params>
+  ... </methodCall>
+  ... """, handle_errors=False)
+  HTTP/1.0 200 Ok
+  Content-Length: ...
+  Content-Type: text/xml...
+  <BLANKLINE>
+  <?xml version='1.0'?>
+  <methodResponse>
+  <params>
+  <param>
+  <value><string>(a, b, c)</string></value>
+  </param>
+  </params>
+  </methodResponse>
+  <BLANKLINE>
+
+  
\ No newline at end of file

Modified: Zope3/branches/tziade_xmlintrospection/src/zope/app/xmlrpcintrospection/xmlrpcintrospection.py
===================================================================
--- Zope3/branches/tziade_xmlintrospection/src/zope/app/xmlrpcintrospection/xmlrpcintrospection.py	2005-10-08 16:42:26 UTC (rev 38969)
+++ Zope3/branches/tziade_xmlintrospection/src/zope/app/xmlrpcintrospection/xmlrpcintrospection.py	2005-10-08 16:44:29 UTC (rev 38970)
@@ -21,43 +21,72 @@
 from zope.publisher.interfaces.xmlrpc import IXMLRPCRequest
 from zope.app.publisher.xmlrpc import XMLRPCView
 from zope.app.apidoc.presentation import getViews, filterViewRegistrations
+from zope.app.apidoc.utilities import getFunctionSignature
 
 class XMLRPCIntrospection(object):
 
+    def listAllMethods(self):
+        """ lists all methods available """
+        return self._getXMLRPCMethods()
+
+    def methodHelp(self, method_name):
+        pass
+
+    def methodSignature(self, method_name):
+        """ returns the method signature """
+        return self._getXMLRPCMethodSignature(method_name)
+
+    def __call__(self, *args, **kw):
+        return self.listAllMethods()
+
+    #
+    # Introspection APIS
+    #
     _reserved_method_names = (u'', u'listAllMethods', u'methodHelp',
                               u'methodSignature')
 
     def _filterXMLRPCRequestRegistrations(self, registrations):
+        """ XXX might be outsourced in some utility """
         for registration in registrations:
             for required_iface in registration.required:
                 if (required_iface is IXMLRPCRequest and
                     registration.name.strip() not in
                     self._reserved_method_names):
-                    yield registration.name
+                    yield registration
 
+    def _getRegistrationAdapters(self, interfaces):
+        """ XXX might be outsourced in some utility """
+        results = []
+        for interface in interfaces:
+            registrations = list(getViews(interface, IXMLRPCRequest))
+            filtered_adapters = list(self._filterXMLRPCRequestRegistrations(registrations))
+            results.extend(filtered_adapters)
+        return results
+
+    #
+    # Lookup APIS
+    #
     def _getXMLRPCMethods(self):
         adapter_registrations = []
         interfaces = list(providedBy(self.context))
 
-        for interface in interfaces:
-            registrations = list(getViews(interface, IXMLRPCRequest))
-            results = list(self._filterXMLRPCRequestRegistrations(registrations))
-            for result in results:
-                if result not in adapter_registrations:
-                    adapter_registrations.append(result)
+        for result in self._getRegistrationAdapters(interfaces):
+            if result.name not in adapter_registrations:
+                adapter_registrations.append(result.name)
 
         adapter_registrations.sort()
         return adapter_registrations
 
-    def listAllMethods(self):
-        return self._getXMLRPCMethods()
+    def _getFunctionAttributesDoc(self, function):
+        return getFunctionSignature(function)
 
-    def methodHelp(self, method_name):
-        pass
+    def _getXMLRPCMethodSignature(self, method_name):
+        interfaces = list(providedBy(self.context))
 
-    def methodSignature(self, method_name):
-        pass
+        for result in self._getRegistrationAdapters(interfaces):
+            if result.name == method_name:
+                method = getattr(result.value, method_name)
+                return self._getFunctionAttributesDoc(method)
+        # XXX see RFC here, if we want to raise or no
+        return None
 
-    def __call__(self, *args, **kw):
-        return self.listAllMethods()
-



More information about the Zope3-Checkins mailing list