[Checkins] SVN: z3c.jsonrpc/trunk/src/z3c/jsonrpc/ Make progress with JSON-RPC 2.0 sepcification implementation

Roger Ineichen roger at projekt01.ch
Fri Jun 13 20:04:46 EDT 2008


Log message for revision 87380:
  Make progress with JSON-RPC 2.0 sepcification implementation

Changed:
  U   z3c.jsonrpc/trunk/src/z3c/jsonrpc/interfaces.py
  U   z3c.jsonrpc/trunk/src/z3c/jsonrpc/publisher.py
  U   z3c.jsonrpc/trunk/src/z3c/jsonrpc/tests/test_request.py

-=-
Modified: z3c.jsonrpc/trunk/src/z3c/jsonrpc/interfaces.py
===================================================================
--- z3c.jsonrpc/trunk/src/z3c/jsonrpc/interfaces.py	2008-06-13 21:19:15 UTC (rev 87379)
+++ z3c.jsonrpc/trunk/src/z3c/jsonrpc/interfaces.py	2008-06-14 00:04:45 UTC (rev 87380)
@@ -27,7 +27,6 @@
 from zope.publisher.interfaces.http import IHTTPRequest
 
 JSON_CHARSETS = ('utf-8','utf-16', 'utf-32')
-PYTHON_KW_MARKER = "pythonKwMaRkEr"
 
 
 class IMethodPublisher(zope.interface.Interface):

Modified: z3c.jsonrpc/trunk/src/z3c/jsonrpc/publisher.py
===================================================================
--- z3c.jsonrpc/trunk/src/z3c/jsonrpc/publisher.py	2008-06-13 21:19:15 UTC (rev 87379)
+++ z3c.jsonrpc/trunk/src/z3c/jsonrpc/publisher.py	2008-06-14 00:04:45 UTC (rev 87380)
@@ -16,6 +16,7 @@
 """
 __docformat__ = "reStructuredText"
 
+import re
 import traceback
 import logging
 
@@ -33,7 +34,6 @@
 from z3c.json.converter import premarshal
 from z3c.jsonrpc import interfaces
 from z3c.jsonrpc.interfaces import JSON_CHARSETS
-from z3c.jsonrpc.interfaces import PYTHON_KW_MARKER
 
 DEBUG = logging.DEBUG
 logger = logging.getLogger()
@@ -106,6 +106,8 @@
                 pass
         return text
 
+    _typeFormat = re.compile('([a-zA-Z][a-zA-Z0-9_]+|\\.[xy])$')
+
     def processInputs(self):
         """take the converted request and make useful args of it."""
         json = zope.component.getUtility(IJSONReader)
@@ -130,24 +132,34 @@
             # now, look for keyword parameters, the old way
             kwargs = None
             notPositional = []
-            for k in args:
-                if isinstance(k, dict):
-                    if k.has_key(PYTHON_KW_MARKER):
-                        if isinstance(k[PYTHON_KW_MARKER], dict):
-                            j = k[PYTHON_KW_MARKER]
-                            kwargs = j
-                            notPositional.append(k)
-            if notPositional:
-                for k in notPositional:
-                    args.remove(k)
-            if kwargs:
-                for m in kwargs.keys():
-                    self.form[str(m)] = kwargs[m]
+            for arg in args:
+                if isinstance(arg, dict):
+                    # set every dict key value as form items and support at 
+                    # least ``:list`` and ``:tuple`` input field name postifx
+                    # conversion.
+                    for key, d in arg.items():
+                        key = str(key)
+                        pos = key.rfind(":")
+                        if pos > 0:
+                            match = self._typeFormat.match(key, pos + 1)
+                            if match is not None:
+                                key, type_name = key[:pos], key[pos + 1:]
+                                if type_name == 'list':
+                                    d = [d]
+                                if type_name == 'tuple':
+                                    d = tuple(d)
+                        self.form[key] = d
         elif isinstance(params, dict):
+            # json-rpc 1.2
             # Note: the JSONRPCProxy uses allways a dict for params. This means
             # we only use this part for extract the data.
-            # json-rpc 1.1 (to be proposed)
-            # get the numeric params for positional params
+
+            # Get the numeric params for positional params
+            # This was proposed for json-rpc 1.1 but seems not get accepted.
+            # The new 2.0 proposal only defines named paramters if they get
+            # applied as key/value pair.
+            
+            # review and check this implementation after JSON-RPC 2.0 final
             temp_positional = []
             for key in params:
                 if str(key).isdigit():

Modified: z3c.jsonrpc/trunk/src/z3c/jsonrpc/tests/test_request.py
===================================================================
--- z3c.jsonrpc/trunk/src/z3c/jsonrpc/tests/test_request.py	2008-06-13 21:19:15 UTC (rev 87379)
+++ z3c.jsonrpc/trunk/src/z3c/jsonrpc/tests/test_request.py	2008-06-14 00:04:45 UTC (rev 87380)
@@ -58,7 +58,7 @@
 
 class ParamTestCall:
     def __init__(self):
-        self.body = '{"id":"httpReq","method":"keyworded","params":[1,{"pythonKwMaRkEr":{"kw1":"aaa"}}]}'
+        self.body = '{"id":"httpReq","method":"keyworded","params":[{"kw1":"aaa"}]}'
         self.headers = []
 
 



More information about the Checkins mailing list