1.1 --- a/libxml2dom/rpc.py Sat Oct 06 19:33:47 2007 +0000
1.2 +++ b/libxml2dom/rpc.py Sat Oct 06 20:46:13 2007 +0000
1.3 @@ -32,8 +32,7 @@
1.4 self.name = name
1.5
1.6 def __eq__(self, other):
1.7 - other_ns, other_name = other
1.8 - return self.ns, to_localName(self.name) == other_ns, to_localName(other_name)
1.9 + return self.ns, to_localName(self.name) == other.ns, to_localName(other.name)
1.10
1.11 def __hash__(self):
1.12 return hash(self.ns + to_localName(self.name))
1.13 @@ -41,40 +40,51 @@
1.14 def __repr__(self):
1.15 return "ParameterName(%s, %s)" % (repr(self.ns), repr(self.name or None))
1.16
1.17 +class ParameterValue(object):
1.18 +
1.19 + "A method parameter value."
1.20 +
1.21 + def __init__(self, name, value):
1.22 + self.name = name
1.23 + self.value = value
1.24 +
1.25 + def convert(self, converters=None):
1.26 + conv = default_converters
1.27 + conv.update(converters or {})
1.28 + typename = self.name.ns
1.29 + localName = to_localName(self.name.name)
1.30 + if isinstance(self.value, list):
1.31 + return [item.convert(converters) for item in self.value]
1.32 + else:
1.33 + functions = conv.get(typename, {})
1.34 + function = functions.get(localName) or functions.get(None, unicode)
1.35 + return function(self.value)
1.36 +
1.37 + def _data(self):
1.38 + return self.convert()
1.39 +
1.40 + data = property(_data)
1.41 +
1.42 + def __eq__(self, other):
1.43 + return self.name == other.name and self.value == other.value
1.44 +
1.45 + def __hash__(self):
1.46 + return hash(self.value)
1.47 +
1.48 + def __repr__(self):
1.49 + return "ParameterValue(%s, %s)" % (repr(self.name), repr(self.value))
1.50 +
1.51 # Sequence emulation.
1.52
1.53 def __len__(self):
1.54 - return 2
1.55 + return len(self.value)
1.56
1.57 def __getitem__(self, i):
1.58 - return (self.ns, self.name)[i]
1.59 + return self.value[i]
1.60
1.61 def to_localName(name):
1.62 return (name or "").split(":")[-1] or None
1.63
1.64 -def convert(parameters, converters=None):
1.65 -
1.66 - """
1.67 - Convert the 'parameters', returning a list of name, value items where the
1.68 - names are the plain names for each parameter, and the values may be
1.69 - converted from strings to other data types.
1.70 - """
1.71 -
1.72 - conv = default_converters
1.73 - conv.update(converters or {})
1.74 - results = []
1.75 - for parameter_name, parameter_value in parameters:
1.76 - typename, name = parameter_name
1.77 - localName = to_localName(name)
1.78 - if isinstance(parameter_value, list):
1.79 - value = convert(parameter_value, converters)
1.80 - else:
1.81 - functions = conv.get(typename, {})
1.82 - function = functions.get(localName) or functions.get(None, unicode)
1.83 - value = function(parameter_value)
1.84 - results.append((localName, value))
1.85 - return results
1.86 -
1.87 # Utility functions.
1.88
1.89 def boolean(s):
2.1 --- a/libxml2dom/soap.py Sat Oct 06 19:33:47 2007 +0000
2.2 +++ b/libxml2dom/soap.py Sat Oct 06 20:46:13 2007 +0000
2.3 @@ -32,7 +32,7 @@
2.4 from libxml2dom.macrolib import *
2.5 from libxml2dom.macrolib import \
2.6 createDocument as Node_createDocument
2.7 -from libxml2dom.rpc import ParameterName
2.8 +from libxml2dom.rpc import ParameterName, ParameterValue
2.9
2.10 # SOAP-related namespaces.
2.11
2.12 @@ -225,13 +225,13 @@
2.13 def _parameters(self):
2.14 return self.xpath("*")
2.15
2.16 - def _rawParameterValues(self):
2.17 + def _parameterValues(self):
2.18 values = []
2.19 for parameter in self.parameters:
2.20 values.append(self._get_value(parameter))
2.21 return values
2.22
2.23 - def _setRawParameterValues(self, parameters):
2.24 + def _setParameterValues(self, parameters):
2.25 for node in self.parameters:
2.26 self.removeChild(node)
2.27
2.28 @@ -240,27 +240,23 @@
2.29 for parameter in parameters:
2.30 self._add_value(self, parameter)
2.31
2.32 - def _parameterValues(self):
2.33 - return libxml2dom.rpc.convert(self.rawParameterValues, getattr(self.ownerDocument, "converters", None))
2.34 -
2.35 # Internal methods.
2.36
2.37 def _add_value(self, value, parameter):
2.38
2.39 "Add to the 'value' element the given 'parameter'."
2.40
2.41 - parameter_name, parameter_value = parameter
2.42 - container = self.ownerDocument.createElementNS(*parameter_name)
2.43 + container = self.ownerDocument.createElementNS(parameter.name.ns, parameter.name.name)
2.44 value.appendChild(container)
2.45 - if isinstance(parameter_value, (list, dict)):
2.46 - if isinstance(parameter_value, dict):
2.47 - items = parameter_value.items()
2.48 + if isinstance(parameter.value, (list, dict)):
2.49 + if isinstance(parameter.value, dict):
2.50 + items = parameter.value.items()
2.51 else:
2.52 - items = parameter_value
2.53 + items = parameter.value
2.54 for item in items:
2.55 self._add_value(container, item)
2.56 else:
2.57 - text = self.ownerDocument.createTextNode(unicode(parameter_value))
2.58 + text = self.ownerDocument.createTextNode(unicode(parameter.value))
2.59 container.appendChild(text)
2.60
2.61 def _get_value(self, parameter):
2.62 @@ -272,16 +268,15 @@
2.63 items = []
2.64 for element in elements:
2.65 items.append(self._get_value(element))
2.66 - return ParameterName(parameter.namespaceURI, parameter.name), items
2.67 + return ParameterValue(ParameterName(parameter.namespaceURI, parameter.name), items)
2.68 else:
2.69 - return ParameterName(parameter.namespaceURI, parameter.name), parameter.textContent.strip()
2.70 + return ParameterValue(ParameterName(parameter.namespaceURI, parameter.name), parameter.textContent.strip())
2.71
2.72 methodName = property(_methodName)
2.73 resultParameter = property(_resultParameter)
2.74 resultParameterValue = property(_resultParameterValue)
2.75 parameters = property(_parameters)
2.76 - rawParameterValues = property(_rawParameterValues, _setRawParameterValues)
2.77 - parameterValues = property(_parameterValues)
2.78 + parameterValues = property(_parameterValues, _setParameterValues)
2.79
2.80 class SOAPFaultElement(SOAPNode):
2.81
3.1 --- a/libxml2dom/xmlrpc.py Sat Oct 06 19:33:47 2007 +0000
3.2 +++ b/libxml2dom/xmlrpc.py Sat Oct 06 20:46:13 2007 +0000
3.3 @@ -32,7 +32,7 @@
3.4 from libxml2dom.macrolib import *
3.5 from libxml2dom.macrolib import \
3.6 createDocument as Node_createDocument
3.7 -from libxml2dom.rpc import ParameterName
3.8 +from libxml2dom.rpc import ParameterName, ParameterValue
3.9
3.10 class XMLRPCImplementation(libxml2dom.Implementation):
3.11
3.12 @@ -172,7 +172,7 @@
3.13 def _parameters(self):
3.14 return self.xpath("./params/param")
3.15
3.16 - def _rawParameterValues(self):
3.17 + def _parameterValues(self):
3.18 values = self.xpath("./params/param/value")
3.19 if values:
3.20 items = []
3.21 @@ -182,7 +182,7 @@
3.22 else:
3.23 return []
3.24
3.25 - def _setRawParameterValues(self, parameters):
3.26 + def _setParameterValues(self, parameters):
3.27 param_list = self.parameters
3.28 params = (self.xpath("./params") or [None])[0]
3.29
3.30 @@ -205,22 +205,17 @@
3.31 param.appendChild(value)
3.32 self._add_value(value, parameter)
3.33
3.34 - def _parameterValues(self):
3.35 - return libxml2dom.rpc.convert(self.rawParameterValues)
3.36 -
3.37 # Internal methods.
3.38
3.39 def _add_value(self, value, parameter):
3.40
3.41 "Add to the 'value' element the given 'parameter'."
3.42
3.43 - (typename, parameter_name), parameter_value = parameter
3.44 -
3.45 - if typename == "struct":
3.46 - if isinstance(parameter_value, dict):
3.47 - items = parameter_value.items()
3.48 + if parameter.name.ns == "struct":
3.49 + if isinstance(parameter.value, dict):
3.50 + items = parameter.value.items()
3.51 else:
3.52 - items = parameter_value
3.53 + items = parameter.value
3.54
3.55 # Create a struct element and add the members.
3.56
3.57 @@ -228,13 +223,12 @@
3.58 value.appendChild(struct)
3.59
3.60 for item in items:
3.61 - (item_typename, item_name), item_value = item
3.62 member = struct.createMember()
3.63 struct.appendChild(member)
3.64
3.65 # Peek into the item to set up the name.
3.66
3.67 - member.memberName = item_name
3.68 + member.memberName = item.name
3.69
3.70 # Add the item inside a new value element.
3.71
3.72 @@ -242,7 +236,7 @@
3.73 member.appendChild(memberValue)
3.74 self._add_value(memberValue, item)
3.75
3.76 - elif typename == "array":
3.77 + elif parameter.name.ns == "array":
3.78
3.79 # Create an array element and add the members.
3.80
3.81 @@ -251,7 +245,7 @@
3.82 data = array.createData()
3.83 array.appendChild(data)
3.84
3.85 - for item in parameter_value:
3.86 + for item in parameter.value:
3.87
3.88 # Add the item inside a new value element.
3.89
3.90 @@ -260,9 +254,9 @@
3.91 self._add_value(data_value, item)
3.92
3.93 else:
3.94 - container = self.ownerDocument.createElement(typename)
3.95 + container = self.ownerDocument.createElement(parameter.name.ns)
3.96 value.appendChild(container)
3.97 - container.value = unicode(parameter_value)
3.98 + container.value = unicode(parameter.value)
3.99
3.100 def _get_value(self, value, name=None):
3.101
3.102 @@ -279,16 +273,16 @@
3.103
3.104 for member in value.container.members:
3.105 items.append(self._get_value(member.value, member.memberName))
3.106 - return (ParameterName(value.type, name), items)
3.107 + return ParameterValue(ParameterName(value.type, name), items)
3.108
3.109 elif value.type == "array":
3.110 items = []
3.111 for data_value in value.container.data.values:
3.112 items.append(self._get_value(data_value))
3.113 - return (ParameterName(value.type, name), items)
3.114 + return ParameterValue(ParameterName(value.type, name), items)
3.115
3.116 else:
3.117 - return (ParameterName(value.type, name), value.container.value)
3.118 + return ParameterValue(ParameterName(value.type, name), value.container.value)
3.119
3.120 # Node construction methods.
3.121
3.122 @@ -305,8 +299,7 @@
3.123 methodNameElement = property(_methodNameElement)
3.124 methodName = property(_methodName, _setMethodName)
3.125 parameters = property(_parameters)
3.126 - rawParameterValues = property(_rawParameterValues, _setRawParameterValues)
3.127 - parameterValues = property(_parameterValues)
3.128 + parameterValues = property(_parameterValues, _setParameterValues)
3.129
3.130 class XMLRPCArrayElement(XMLRPCNode):
3.131
4.1 --- a/tests/soap_test.py Sat Oct 06 19:33:47 2007 +0000
4.2 +++ b/tests/soap_test.py Sat Oct 06 20:46:13 2007 +0000
4.3 @@ -2,6 +2,7 @@
4.4 # -*- coding: iso-8859-15 -*-
4.5
4.6 import libxml2dom.soap
4.7 +from libxml2dom.rpc import ParameterName, ParameterValue
4.8
4.9 request = """<?xml version='1.0' encoding='iso-8859-1'?>
4.10 <env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope" >
4.11 @@ -31,19 +32,19 @@
4.12
4.13 req = libxml2dom.soap.parseString(request)
4.14 assert req.method.methodName == "chargeReservation"
4.15 -assert req.method.rawParameterValues == [
4.16 - (("http://travelcompany.example.org/reservation", "reservation"), [
4.17 - (("http://travelcompany.example.org/reservation", "code"), "FT35ZBQ")
4.18 +assert req.method.parameterValues == [
4.19 + ParameterValue(ParameterName("http://travelcompany.example.org/reservation", "reservation"), [
4.20 + ParameterValue(ParameterName("http://travelcompany.example.org/reservation", "code"), "FT35ZBQ")
4.21 ]),
4.22 - (("http://mycompany.example.com/financial", "creditCard"), [
4.23 - (("http://mycompany.example.com/employees", "name"), u"Åke Jógvan Øyvind"),
4.24 - (("http://mycompany.example.com/financial", "number"), "123456789099999"),
4.25 - (("http://mycompany.example.com/financial", "expiration"), "2005-02")
4.26 + ParameterValue(ParameterName("http://mycompany.example.com/financial", "creditCard"), [
4.27 + ParameterValue(ParameterName("http://mycompany.example.com/employees", "name"), u"Åke Jógvan Øyvind"),
4.28 + ParameterValue(ParameterName("http://mycompany.example.com/financial", "number"), "123456789099999"),
4.29 + ParameterValue(ParameterName("http://mycompany.example.com/financial", "expiration"), "2005-02")
4.30 ])
4.31 ]
4.32 assert req.fault is None
4.33 print "Method name:", req.method.methodName
4.34 -print "Parameter values:", req.method.rawParameterValues
4.35 +print "Parameter values:", req.method.parameterValues
4.36 print "Fault:", req.fault
4.37
4.38 response = """<?xml version='1.0' encoding='iso-8859-1'?>
4.39 @@ -68,13 +69,14 @@
4.40
4.41 resp = libxml2dom.soap.parseString(response)
4.42 assert resp.method.methodName == "chargeReservationResponse"
4.43 -assert resp.method.rawParameterValues == [
4.44 - (("http://travelcompany.example.org/", "code"), "FT35ZBQ"),
4.45 - (("http://travelcompany.example.org/", "viewAt"), "http://travelcompany.example.org/reservations?code=FT35ZBQ")
4.46 +assert resp.method.parameterValues == [
4.47 + ParameterValue(ParameterName("http://travelcompany.example.org/", "code"), "FT35ZBQ"),
4.48 + ParameterValue(ParameterName("http://travelcompany.example.org/", "viewAt"),
4.49 + "http://travelcompany.example.org/reservations?code=FT35ZBQ")
4.50 ]
4.51 assert resp.fault is None
4.52 print "Method name:", resp.method.methodName
4.53 -print "Parameter values:", resp.method.rawParameterValues
4.54 +print "Parameter values:", resp.method.parameterValues
4.55 print "Fault:", resp.fault
4.56
4.57 response2 = """<?xml version='1.0' encoding='iso-8859-1'?>
4.58 @@ -102,15 +104,16 @@
4.59
4.60 resp2 = libxml2dom.soap.parseString(response2)
4.61 assert resp2.method.methodName == "chargeReservationResponse"
4.62 -assert resp2.method.rawParameterValues == [
4.63 - (("http://www.w3.org/2003/05/soap-rpc", "result"), "m:status"),
4.64 - (("http://travelcompany.example.org/", "status"), "confirmed"),
4.65 - (("http://travelcompany.example.org/", "code"), "FT35ZBQ"),
4.66 - (("http://travelcompany.example.org/", "viewAt"), "http://travelcompany.example.org/reservations?code=FT35ZBQ")
4.67 +assert resp2.method.parameterValues == [
4.68 + ParameterValue(ParameterName("http://www.w3.org/2003/05/soap-rpc", "result"), "m:status"),
4.69 + ParameterValue(ParameterName("http://travelcompany.example.org/", "status"), "confirmed"),
4.70 + ParameterValue(ParameterName("http://travelcompany.example.org/", "code"), "FT35ZBQ"),
4.71 + ParameterValue(ParameterName("http://travelcompany.example.org/", "viewAt"),
4.72 + "http://travelcompany.example.org/reservations?code=FT35ZBQ")
4.73 ]
4.74 assert resp2.fault is None
4.75 print "Method name:", resp2.method.methodName
4.76 -print "Parameter values:", resp2.method.rawParameterValues
4.77 +print "Parameter values:", resp2.method.parameterValues
4.78 print "Fault:", resp2.fault
4.79
4.80 failed = """<?xml version='1.0' encoding='iso-8859-1'?>
5.1 --- a/tests/xmlrpc_test.py Sat Oct 06 19:33:47 2007 +0000
5.2 +++ b/tests/xmlrpc_test.py Sat Oct 06 20:46:13 2007 +0000
5.3 @@ -1,6 +1,7 @@
5.4 #!/usr/bin/env python
5.5
5.6 import libxml2dom.xmlrpc
5.7 +from libxml2dom.rpc import ParameterName, ParameterValue
5.8
5.9 # Some examples from the specification.
5.10
5.11 @@ -16,10 +17,10 @@
5.12
5.13 req = libxml2dom.xmlrpc.parseString(request)
5.14 assert req.method.methodName == "examples.getStateName"
5.15 -assert req.method.rawParameterValues == [(("i4", ""), "41")]
5.16 +assert req.method.parameterValues == [ParameterValue(ParameterName("i4", ""), "41")]
5.17 assert req.fault is None
5.18 print "Method name:", req.method.methodName
5.19 -print "Parameter values:", req.method.rawParameterValues
5.20 +print "Parameter values:", req.method.parameterValues
5.21 print "Fault:", req.fault
5.22
5.23 response = """<?xml version="1.0"?>
5.24 @@ -33,10 +34,10 @@
5.25
5.26 resp = libxml2dom.xmlrpc.parseString(response)
5.27 assert resp.method.methodName is None
5.28 -assert resp.method.rawParameterValues == [(("string", ""), "South Dakota")]
5.29 +assert resp.method.parameterValues == [ParameterValue(ParameterName("string", ""), "South Dakota")]
5.30 assert resp.fault is None
5.31 print "Method name:", resp.method.methodName
5.32 -print "Parameter values:", resp.method.rawParameterValues
5.33 +print "Parameter values:", resp.method.parameterValues
5.34 print "Fault:", resp.fault
5.35
5.36 failed = """<?xml version="1.0"?>
5.37 @@ -59,11 +60,11 @@
5.38
5.39 f = libxml2dom.xmlrpc.parseString(failed)
5.40 assert f.method.methodName is None
5.41 -assert f.method.rawParameterValues == []
5.42 +assert f.method.parameterValues == []
5.43 assert f.fault.code == "4"
5.44 assert f.fault.reason == "Too many parameters."
5.45 print "Method name:", f.method.methodName
5.46 -print "Parameter values:", f.method.rawParameterValues
5.47 +print "Parameter values:", f.method.parameterValues
5.48 print "Fault code:", f.fault.code
5.49
5.50 # Python Package Index examples.
5.51 @@ -96,15 +97,16 @@
5.52
5.53 s = libxml2dom.xmlrpc.parseString(search)
5.54 assert s.method.methodName == "search"
5.55 -assert s.method.rawParameterValues == [
5.56 - (("struct", None), [
5.57 - (("string", "name"), "libxml2dom"), (("string", "description"), "XML")
5.58 +assert s.method.parameterValues == [
5.59 + ParameterValue(ParameterName("struct", None), [
5.60 + ParameterValue(ParameterName("string", "name"), "libxml2dom"),
5.61 + ParameterValue(ParameterName("string", "description"), "XML")
5.62 ]),
5.63 - (("string", None), "and")
5.64 + ParameterValue(ParameterName("string", None), "and")
5.65 ]
5.66 assert s.fault is None
5.67 print "Method name:", s.method.methodName
5.68 -print "Parameter values:", s.method.rawParameterValues
5.69 +print "Parameter values:", s.method.parameterValues
5.70 print "Fault:", s.fault
5.71
5.72 # Nested structure examples.
5.73 @@ -144,15 +146,18 @@
5.74
5.75 s2 = libxml2dom.xmlrpc.parseString(search2)
5.76 assert s2.method.methodName == "search"
5.77 -assert s2.method.rawParameterValues == [
5.78 - (("struct", None), [
5.79 - (("struct", "names"), [(("string", "name"), "libxml2dom"), (("string", "description"), "XML")])
5.80 +assert s2.method.parameterValues == [
5.81 + ParameterValue(ParameterName("struct", None), [
5.82 + ParameterValue(ParameterName("struct", "names"), [
5.83 + ParameterValue(ParameterName("string", "name"), "libxml2dom"),
5.84 + ParameterValue(ParameterName("string", "description"), "XML")
5.85 + ])
5.86 ]),
5.87 - (("string", None), "and")
5.88 + ParameterValue(ParameterName("string", None), "and")
5.89 ]
5.90 assert s2.fault is None
5.91 print "Method name:", s2.method.methodName
5.92 -print "Parameter values:", s2.method.rawParameterValues
5.93 +print "Parameter values:", s2.method.parameterValues
5.94 print "Fault:", s2.fault
5.95
5.96 arrays = """<?xml version="1.0"?>
5.97 @@ -177,12 +182,15 @@
5.98
5.99 a = libxml2dom.xmlrpc.parseString(arrays)
5.100 assert a.method.methodName is None
5.101 -assert a.method.rawParameterValues == [
5.102 - (("array", None), [(("string", None), "libxml2dom"), (("string", None), "XSLTools")])
5.103 +assert a.method.parameterValues == [
5.104 + ParameterValue(ParameterName("array", None), [
5.105 + ParameterValue(ParameterName("string", None), "libxml2dom"),
5.106 + ParameterValue(ParameterName("string", None), "XSLTools")
5.107 + ])
5.108 ]
5.109 assert a.fault is None
5.110 print "Method name:", a.method.methodName
5.111 -print "Parameter values:", a.method.rawParameterValues
5.112 +print "Parameter values:", a.method.parameterValues
5.113 print "Fault:", a.fault
5.114
5.115 # vim: tabstop=4 expandtab shiftwidth=4