[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