1.1 --- a/libxml2dom/rpc.py Sat Oct 06 20:46:13 2007 +0000
1.2 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
1.3 @@ -1,112 +0,0 @@
1.4 -#!/usr/bin/env python
1.5 -
1.6 -"""
1.7 -Conversion functions and data used by XML-RPC and SOAP.
1.8 -
1.9 -Copyright (C) 2007 Paul Boddie <paul@boddie.org.uk>
1.10 -
1.11 -This program is free software; you can redistribute it and/or modify it under
1.12 -the terms of the GNU Lesser General Public License as published by the Free
1.13 -Software Foundation; either version 3 of the License, or (at your option) any
1.14 -later version.
1.15 -
1.16 -This program is distributed in the hope that it will be useful, but WITHOUT
1.17 -ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
1.18 -FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
1.19 -details.
1.20 -
1.21 -You should have received a copy of the GNU Lesser General Public License along
1.22 -with this program. If not, see <http://www.gnu.org/licenses/>.
1.23 -"""
1.24 -
1.25 -import datetime
1.26 -
1.27 -# Utility classes.
1.28 -
1.29 -class ParameterName(object):
1.30 -
1.31 - "A method parameter name."
1.32 -
1.33 - def __init__(self, ns, name):
1.34 - self.ns = ns
1.35 - self.name = name
1.36 -
1.37 - def __eq__(self, other):
1.38 - return self.ns, to_localName(self.name) == other.ns, to_localName(other.name)
1.39 -
1.40 - def __hash__(self):
1.41 - return hash(self.ns + to_localName(self.name))
1.42 -
1.43 - def __repr__(self):
1.44 - return "ParameterName(%s, %s)" % (repr(self.ns), repr(self.name or None))
1.45 -
1.46 -class ParameterValue(object):
1.47 -
1.48 - "A method parameter value."
1.49 -
1.50 - def __init__(self, name, value):
1.51 - self.name = name
1.52 - self.value = value
1.53 -
1.54 - def convert(self, converters=None):
1.55 - conv = default_converters
1.56 - conv.update(converters or {})
1.57 - typename = self.name.ns
1.58 - localName = to_localName(self.name.name)
1.59 - if isinstance(self.value, list):
1.60 - return [item.convert(converters) for item in self.value]
1.61 - else:
1.62 - functions = conv.get(typename, {})
1.63 - function = functions.get(localName) or functions.get(None, unicode)
1.64 - return function(self.value)
1.65 -
1.66 - def _data(self):
1.67 - return self.convert()
1.68 -
1.69 - data = property(_data)
1.70 -
1.71 - def __eq__(self, other):
1.72 - return self.name == other.name and self.value == other.value
1.73 -
1.74 - def __hash__(self):
1.75 - return hash(self.value)
1.76 -
1.77 - def __repr__(self):
1.78 - return "ParameterValue(%s, %s)" % (repr(self.name), repr(self.value))
1.79 -
1.80 - # Sequence emulation.
1.81 -
1.82 - def __len__(self):
1.83 - return len(self.value)
1.84 -
1.85 - def __getitem__(self, i):
1.86 - return self.value[i]
1.87 -
1.88 -def to_localName(name):
1.89 - return (name or "").split(":")[-1] or None
1.90 -
1.91 -# Utility functions.
1.92 -
1.93 -def boolean(s):
1.94 - if s.lower() == "true":
1.95 - return True
1.96 - elif s.lower() == "false":
1.97 - return False
1.98 - else:
1.99 - raise ValueError, "String value %s not convertable to boolean." % repr(s)
1.100 -
1.101 -def iso8601(s):
1.102 - # NOTE: To be written.
1.103 - return s
1.104 -
1.105 -default_converters = {
1.106 - "string" : {None : unicode},
1.107 - "int" : {None : int},
1.108 - "i4" : {None : int},
1.109 - "double" : {None : float},
1.110 - "boolean" : {None : boolean},
1.111 - "dateTime.iso8601" : {None : iso8601},
1.112 - "base64" : {None : str}
1.113 - }
1.114 -
1.115 -# vim: tabstop=4 expandtab shiftwidth=4
2.1 --- a/libxml2dom/soap.py Sat Oct 06 20:46:13 2007 +0000
2.2 +++ b/libxml2dom/soap.py Sat Oct 06 23:48:45 2007 +0000
2.3 @@ -32,7 +32,6 @@
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, ParameterValue
2.8
2.9 # SOAP-related namespaces.
2.10
2.11 @@ -133,6 +132,45 @@
2.12 ns.update(namespaces or {})
2.13 return libxml2dom.Node.xpath(self, expr, variables, ns)
2.14
2.15 + # All nodes support convenience methods.
2.16 +
2.17 + def convert(self, node):
2.18 + return node.textContent.strip()
2.19 +
2.20 + def _contents(self):
2.21 + if not self.xpath("*"):
2.22 + return (self.localName, getattr(self.ownerDocument, "convert", self.convert)(self))
2.23 + else:
2.24 + return self
2.25 +
2.26 + def __len__(self):
2.27 + children = self.xpath("*")
2.28 + if not children:
2.29 + return 2
2.30 + else:
2.31 + return len(children)
2.32 +
2.33 + def __getitem__(self, i):
2.34 + children = self.xpath("*")
2.35 + if not children:
2.36 + return self.contents[i]
2.37 + else:
2.38 + return self.xpath("*")[i]
2.39 +
2.40 + def __eq__(self, other):
2.41 + children = self.xpath("*")
2.42 + if children:
2.43 + for i, j in map(None, self, other):
2.44 + if i != j:
2.45 + return False
2.46 + return True
2.47 + elif hasattr(other, "contents"):
2.48 + return self.contents == other.contents
2.49 + else:
2.50 + return self.contents == other
2.51 +
2.52 + contents = property(_contents)
2.53 +
2.54 class SOAPDocument(libxml2dom._Document, SOAPNode):
2.55
2.56 "A SOAP document fragment."
2.57 @@ -214,7 +252,7 @@
2.58 def _resultParameterValue(self):
2.59 if self.resultParameter:
2.60 name = self.resultParameter.textContent.strip()
2.61 - result = self.xpath(".//%s" % name, namespaces={self.prefix : self.namespaceURI})
2.62 + result = self.xpath(".//" + name, namespaces={self.prefix : self.namespaceURI})
2.63 if result:
2.64 return result[0].textContent.strip()
2.65 else:
2.66 @@ -222,61 +260,13 @@
2.67 else:
2.68 return None
2.69
2.70 - def _parameters(self):
2.71 - return self.xpath("*")
2.72 -
2.73 def _parameterValues(self):
2.74 - values = []
2.75 - for parameter in self.parameters:
2.76 - values.append(self._get_value(parameter))
2.77 - return values
2.78 -
2.79 - def _setParameterValues(self, parameters):
2.80 - for node in self.parameters:
2.81 - self.removeChild(node)
2.82 -
2.83 - # Add the parameter values.
2.84 -
2.85 - for parameter in parameters:
2.86 - self._add_value(self, parameter)
2.87 -
2.88 - # Internal methods.
2.89 -
2.90 - def _add_value(self, value, parameter):
2.91 -
2.92 - "Add to the 'value' element the given 'parameter'."
2.93 -
2.94 - container = self.ownerDocument.createElementNS(parameter.name.ns, parameter.name.name)
2.95 - value.appendChild(container)
2.96 - if isinstance(parameter.value, (list, dict)):
2.97 - if isinstance(parameter.value, dict):
2.98 - items = parameter.value.items()
2.99 - else:
2.100 - items = parameter.value
2.101 - for item in items:
2.102 - self._add_value(container, item)
2.103 - else:
2.104 - text = self.ownerDocument.createTextNode(unicode(parameter.value))
2.105 - container.appendChild(text)
2.106 -
2.107 - def _get_value(self, parameter):
2.108 -
2.109 - "Return the parameter name and value from within the given 'parameter'."
2.110 -
2.111 - elements = parameter.xpath("*")
2.112 - if elements:
2.113 - items = []
2.114 - for element in elements:
2.115 - items.append(self._get_value(element))
2.116 - return ParameterValue(ParameterName(parameter.namespaceURI, parameter.name), items)
2.117 - else:
2.118 - return ParameterValue(ParameterName(parameter.namespaceURI, parameter.name), parameter.textContent.strip())
2.119 + return [value.contents for value in self.xpath("*")]
2.120
2.121 methodName = property(_methodName)
2.122 resultParameter = property(_resultParameter)
2.123 resultParameterValue = property(_resultParameterValue)
2.124 - parameters = property(_parameters)
2.125 - parameterValues = property(_parameterValues, _setParameterValues)
2.126 + parameterValues = property(_parameterValues)
2.127
2.128 class SOAPFaultElement(SOAPNode):
2.129
3.1 --- a/libxml2dom/xmlrpc.py Sat Oct 06 20:46:13 2007 +0000
3.2 +++ b/libxml2dom/xmlrpc.py Sat Oct 06 23:48:45 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, ParameterValue
3.8 +import datetime
3.9
3.10 class XMLRPCImplementation(libxml2dom.Implementation):
3.11
3.12 @@ -169,120 +169,8 @@
3.13 self.appendChild(methodName)
3.14 self.methodNameElement.value = name
3.15
3.16 - def _parameters(self):
3.17 - return self.xpath("./params/param")
3.18 -
3.19 def _parameterValues(self):
3.20 - values = self.xpath("./params/param/value")
3.21 - if values:
3.22 - items = []
3.23 - for value in values:
3.24 - items.append(self._get_value(value))
3.25 - return items
3.26 - else:
3.27 - return []
3.28 -
3.29 - def _setParameterValues(self, parameters):
3.30 - param_list = self.parameters
3.31 - params = (self.xpath("./params") or [None])[0]
3.32 -
3.33 - # Remove any previous parameters.
3.34 -
3.35 - if params:
3.36 - if param_list:
3.37 - for param in param_list:
3.38 - params.removeChild(param)
3.39 - else:
3.40 - params = self.createParameters()
3.41 - self.appendChild(params)
3.42 -
3.43 - # Add parameter values.
3.44 -
3.45 - for parameter in parameters:
3.46 - param = self.ownerDocument.createElement("param")
3.47 - params.appendChild(param)
3.48 - value = self.ownerDocument.createElement("value")
3.49 - param.appendChild(value)
3.50 - self._add_value(value, parameter)
3.51 -
3.52 - # Internal methods.
3.53 -
3.54 - def _add_value(self, value, parameter):
3.55 -
3.56 - "Add to the 'value' element the given 'parameter'."
3.57 -
3.58 - if parameter.name.ns == "struct":
3.59 - if isinstance(parameter.value, dict):
3.60 - items = parameter.value.items()
3.61 - else:
3.62 - items = parameter.value
3.63 -
3.64 - # Create a struct element and add the members.
3.65 -
3.66 - struct = self.ownerDocument.createElement("struct")
3.67 - value.appendChild(struct)
3.68 -
3.69 - for item in items:
3.70 - member = struct.createMember()
3.71 - struct.appendChild(member)
3.72 -
3.73 - # Peek into the item to set up the name.
3.74 -
3.75 - member.memberName = item.name
3.76 -
3.77 - # Add the item inside a new value element.
3.78 -
3.79 - memberValue = member.createValue()
3.80 - member.appendChild(memberValue)
3.81 - self._add_value(memberValue, item)
3.82 -
3.83 - elif parameter.name.ns == "array":
3.84 -
3.85 - # Create an array element and add the members.
3.86 -
3.87 - array = self.ownerDocument.createElement("array")
3.88 - value.appendChild(array)
3.89 - data = array.createData()
3.90 - array.appendChild(data)
3.91 -
3.92 - for item in parameter.value:
3.93 -
3.94 - # Add the item inside a new value element.
3.95 -
3.96 - data_value = data.createValue()
3.97 - data.appendChild(data_value)
3.98 - self._add_value(data_value, item)
3.99 -
3.100 - else:
3.101 - container = self.ownerDocument.createElement(parameter.name.ns)
3.102 - value.appendChild(container)
3.103 - container.value = unicode(parameter.value)
3.104 -
3.105 - def _get_value(self, value, name=None):
3.106 -
3.107 - """
3.108 - Return the parameter name and value from within the given 'value'
3.109 - element, using the optional 'name' as part of the returned name if
3.110 - specified.
3.111 - """
3.112 -
3.113 - if value.type == "struct":
3.114 - items = []
3.115 -
3.116 - # Peek inside member values to get member names.
3.117 -
3.118 - for member in value.container.members:
3.119 - items.append(self._get_value(member.value, member.memberName))
3.120 - return ParameterValue(ParameterName(value.type, name), items)
3.121 -
3.122 - elif value.type == "array":
3.123 - items = []
3.124 - for data_value in value.container.data.values:
3.125 - items.append(self._get_value(data_value))
3.126 - return ParameterValue(ParameterName(value.type, name), items)
3.127 -
3.128 - else:
3.129 - return ParameterValue(ParameterName(value.type, name), value.container.value)
3.130 + return [value.container.contents for value in self.xpath("./params/param/value")]
3.131
3.132 # Node construction methods.
3.133
3.134 @@ -298,8 +186,7 @@
3.135 fault = property(_fault)
3.136 methodNameElement = property(_methodNameElement)
3.137 methodName = property(_methodName, _setMethodName)
3.138 - parameters = property(_parameters)
3.139 - parameterValues = property(_parameterValues, _setParameterValues)
3.140 + parameterValues = property(_parameterValues)
3.141
3.142 class XMLRPCArrayElement(XMLRPCNode):
3.143
3.144 @@ -308,12 +195,36 @@
3.145 def _data(self):
3.146 return (self.xpath("./data") or [None])[0]
3.147
3.148 + def _contents(self):
3.149 + return self
3.150 +
3.151 + # Sequence emulation.
3.152 +
3.153 + def __len__(self):
3.154 + if self.data:
3.155 + return len(self.data)
3.156 + else:
3.157 + return 0
3.158 +
3.159 + def __getitem__(self, i):
3.160 + if self.data:
3.161 + return self.data[i]
3.162 + else:
3.163 + raise IndexError, i
3.164 +
3.165 + def __eq__(self, other):
3.166 + for i, j in map(None, self, other):
3.167 + if i != j:
3.168 + return False
3.169 + return True
3.170 +
3.171 # Node construction methods.
3.172
3.173 def createData(self):
3.174 return self.ownerDocument.createElement("data")
3.175
3.176 data = property(_data)
3.177 + contents = property(_contents)
3.178
3.179 class XMLRPCStructElement(XMLRPCNode):
3.180
3.181 @@ -322,12 +233,30 @@
3.182 def _members(self):
3.183 return self.xpath("./member")
3.184
3.185 + def _contents(self):
3.186 + return self
3.187 +
3.188 + # Sequence emulation.
3.189 +
3.190 + def __len__(self):
3.191 + return len(self.members)
3.192 +
3.193 + def __getitem__(self, i):
3.194 + return self.members[i]
3.195 +
3.196 + def __eq__(self, other):
3.197 + for i, j in map(None, self, other):
3.198 + if i != j:
3.199 + return False
3.200 + return True
3.201 +
3.202 # Node construction methods.
3.203
3.204 def createMember(self):
3.205 return self.ownerDocument.createElement("member")
3.206
3.207 members = property(_members)
3.208 + contents = property(_contents)
3.209
3.210 class XMLRPCDataElement(XMLRPCNode):
3.211
3.212 @@ -336,13 +265,21 @@
3.213 def _values(self):
3.214 return self.xpath("./value")
3.215
3.216 - values = property(_values)
3.217 + # Sequence emulation.
3.218 +
3.219 + def __len__(self):
3.220 + return len(self.values)
3.221 +
3.222 + def __getitem__(self, i):
3.223 + return self.values[i].container.contents
3.224
3.225 # Node construction methods.
3.226
3.227 def createValue(self):
3.228 return self.ownerDocument.createElement("value")
3.229
3.230 + values = property(_values)
3.231 +
3.232 class XMLRPCMemberElement(XMLRPCNode):
3.233
3.234 "An XML-RPC structure member element."
3.235 @@ -365,6 +302,20 @@
3.236 self.appendChild(nameElement)
3.237 self.nameElement.value = name
3.238
3.239 + def _contents(self):
3.240 + return self
3.241 +
3.242 + # Item (name, value) emulation.
3.243 +
3.244 + def __len__(self):
3.245 + return 2
3.246 +
3.247 + def __getitem__(self, i):
3.248 + return (self.memberName, self.value.container.contents)[i]
3.249 +
3.250 + def __eq__(self, other):
3.251 + return self[0] == other[0] and self[1] == other[1]
3.252 +
3.253 # Node construction methods.
3.254
3.255 def createName(self):
3.256 @@ -376,11 +327,14 @@
3.257 value = property(_value)
3.258 nameElement = property(_nameElement)
3.259 memberName = property(_memberName, _setMemberName)
3.260 + contents = property(_contents)
3.261
3.262 class XMLRPCStringElement(XMLRPCNode):
3.263
3.264 "An XML-RPC string element."
3.265
3.266 + typename = "string"
3.267 +
3.268 def _value(self):
3.269 return self.textContent.strip()
3.270
3.271 @@ -390,7 +344,17 @@
3.272 text = self.ownerDocument.createTextNode(value)
3.273 self.appendChild(text)
3.274
3.275 + def _contents(self):
3.276 + return convert(self.typename, self.value)
3.277 +
3.278 + def __eq__(self, other):
3.279 + if hasattr(other, "contents"):
3.280 + return self.contents == other.contents
3.281 + else:
3.282 + return self.contents == other
3.283 +
3.284 value = property(_value, _setValue)
3.285 + contents = property(_contents)
3.286
3.287 class XMLRPCNameElement(XMLRPCStringElement):
3.288
3.289 @@ -425,31 +389,31 @@
3.290
3.291 "An XML-RPC integer element."
3.292
3.293 - pass
3.294 + typename = "int"
3.295
3.296 class XMLRPCBooleanElement(XMLRPCStringElement):
3.297
3.298 "An XML-RPC boolean element."
3.299
3.300 - pass
3.301 + typename = "boolean"
3.302
3.303 class XMLRPCDoubleElement(XMLRPCStringElement):
3.304
3.305 "An XML-RPC double floating point number element."
3.306
3.307 - pass
3.308 + typename = "double"
3.309
3.310 class XMLRPCDateTimeElement(XMLRPCStringElement):
3.311
3.312 "An XML-RPC date/time element."
3.313
3.314 - pass
3.315 + typename = "datetime"
3.316
3.317 class XMLRPCBase64Element(XMLRPCStringElement):
3.318
3.319 "An XML-RPC integer element."
3.320
3.321 - pass
3.322 + typename = "base64"
3.323
3.324 class XMLRPCFaultElement(XMLRPCNode):
3.325
3.326 @@ -472,6 +436,33 @@
3.327 code = property(_code)
3.328 reason = property(_reason)
3.329
3.330 +# Conversion functions.
3.331 +
3.332 +def convert(typename, value):
3.333 + return default_converters[typename](value)
3.334 +
3.335 +def boolean(s):
3.336 + if s.lower() == "true":
3.337 + return True
3.338 + elif s.lower() == "false":
3.339 + return False
3.340 + else:
3.341 + raise ValueError, "String value %s not convertable to boolean." % repr(s)
3.342 +
3.343 +def iso8601(s):
3.344 + year, month, day, hour, minute, second = map(int, (s[:4], s[4:6], s[6:8], s[9:11], s[12:14], s[15:17]))
3.345 + return datetime.datetime(year, month, day, hour, minute, second)
3.346 +
3.347 +default_converters = {
3.348 + "string" : unicode,
3.349 + "int" : int,
3.350 + "i4" : int,
3.351 + "double" : float,
3.352 + "boolean" : boolean,
3.353 + "dateTime.iso8601" : iso8601,
3.354 + "base64" : str
3.355 + }
3.356 +
3.357 # Utility functions.
3.358
3.359 createDocument = libxml2dom.createDocument
4.1 --- a/tests/soap_test.py Sat Oct 06 20:46:13 2007 +0000
4.2 +++ b/tests/soap_test.py Sat Oct 06 23:48:45 2007 +0000
4.3 @@ -2,7 +2,6 @@
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 @@ -33,14 +32,11 @@
4.12 req = libxml2dom.soap.parseString(request)
4.13 assert req.method.methodName == "chargeReservation"
4.14 assert req.method.parameterValues == [
4.15 - ParameterValue(ParameterName("http://travelcompany.example.org/reservation", "reservation"), [
4.16 - ParameterValue(ParameterName("http://travelcompany.example.org/reservation", "code"), "FT35ZBQ")
4.17 - ]),
4.18 - ParameterValue(ParameterName("http://mycompany.example.com/financial", "creditCard"), [
4.19 - ParameterValue(ParameterName("http://mycompany.example.com/employees", "name"), u"Åke Jógvan Øyvind"),
4.20 - ParameterValue(ParameterName("http://mycompany.example.com/financial", "number"), "123456789099999"),
4.21 - ParameterValue(ParameterName("http://mycompany.example.com/financial", "expiration"), "2005-02")
4.22 - ])
4.23 + [("code", "FT35ZBQ")],
4.24 + [("name", u"Åke Jógvan Øyvind"),
4.25 + ("number", "123456789099999"),
4.26 + ("expiration", "2005-02")
4.27 + ]
4.28 ]
4.29 assert req.fault is None
4.30 print "Method name:", req.method.methodName
4.31 @@ -70,9 +66,8 @@
4.32 resp = libxml2dom.soap.parseString(response)
4.33 assert resp.method.methodName == "chargeReservationResponse"
4.34 assert resp.method.parameterValues == [
4.35 - ParameterValue(ParameterName("http://travelcompany.example.org/", "code"), "FT35ZBQ"),
4.36 - ParameterValue(ParameterName("http://travelcompany.example.org/", "viewAt"),
4.37 - "http://travelcompany.example.org/reservations?code=FT35ZBQ")
4.38 + ("code", "FT35ZBQ"),
4.39 + ("viewAt", "http://travelcompany.example.org/reservations?code=FT35ZBQ")
4.40 ]
4.41 assert resp.fault is None
4.42 print "Method name:", resp.method.methodName
4.43 @@ -105,11 +100,10 @@
4.44 resp2 = libxml2dom.soap.parseString(response2)
4.45 assert resp2.method.methodName == "chargeReservationResponse"
4.46 assert resp2.method.parameterValues == [
4.47 - ParameterValue(ParameterName("http://www.w3.org/2003/05/soap-rpc", "result"), "m:status"),
4.48 - ParameterValue(ParameterName("http://travelcompany.example.org/", "status"), "confirmed"),
4.49 - ParameterValue(ParameterName("http://travelcompany.example.org/", "code"), "FT35ZBQ"),
4.50 - ParameterValue(ParameterName("http://travelcompany.example.org/", "viewAt"),
4.51 - "http://travelcompany.example.org/reservations?code=FT35ZBQ")
4.52 + ("result", "m:status"),
4.53 + ("status", "confirmed"),
4.54 + ("code", "FT35ZBQ"),
4.55 + ("viewAt", "http://travelcompany.example.org/reservations?code=FT35ZBQ")
4.56 ]
4.57 assert resp2.fault is None
4.58 print "Method name:", resp2.method.methodName
5.1 --- a/tests/xmlrpc_test.py Sat Oct 06 20:46:13 2007 +0000
5.2 +++ b/tests/xmlrpc_test.py Sat Oct 06 23:48:45 2007 +0000
5.3 @@ -1,7 +1,6 @@
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 @@ -17,7 +16,7 @@
5.12
5.13 req = libxml2dom.xmlrpc.parseString(request)
5.14 assert req.method.methodName == "examples.getStateName"
5.15 -assert req.method.parameterValues == [ParameterValue(ParameterName("i4", ""), "41")]
5.16 +assert req.method.parameterValues == [41]
5.17 assert req.fault is None
5.18 print "Method name:", req.method.methodName
5.19 print "Parameter values:", req.method.parameterValues
5.20 @@ -34,7 +33,7 @@
5.21
5.22 resp = libxml2dom.xmlrpc.parseString(response)
5.23 assert resp.method.methodName is None
5.24 -assert resp.method.parameterValues == [ParameterValue(ParameterName("string", ""), "South Dakota")]
5.25 +assert resp.method.parameterValues == ["South Dakota"]
5.26 assert resp.fault is None
5.27 print "Method name:", resp.method.methodName
5.28 print "Parameter values:", resp.method.parameterValues
5.29 @@ -98,11 +97,11 @@
5.30 s = libxml2dom.xmlrpc.parseString(search)
5.31 assert s.method.methodName == "search"
5.32 assert s.method.parameterValues == [
5.33 - ParameterValue(ParameterName("struct", None), [
5.34 - ParameterValue(ParameterName("string", "name"), "libxml2dom"),
5.35 - ParameterValue(ParameterName("string", "description"), "XML")
5.36 - ]),
5.37 - ParameterValue(ParameterName("string", None), "and")
5.38 + [
5.39 + ("name", "libxml2dom"),
5.40 + ("description", "XML")
5.41 + ],
5.42 + "and"
5.43 ]
5.44 assert s.fault is None
5.45 print "Method name:", s.method.methodName
5.46 @@ -147,13 +146,13 @@
5.47 s2 = libxml2dom.xmlrpc.parseString(search2)
5.48 assert s2.method.methodName == "search"
5.49 assert s2.method.parameterValues == [
5.50 - ParameterValue(ParameterName("struct", None), [
5.51 - ParameterValue(ParameterName("struct", "names"), [
5.52 - ParameterValue(ParameterName("string", "name"), "libxml2dom"),
5.53 - ParameterValue(ParameterName("string", "description"), "XML")
5.54 + [
5.55 + ("names", [
5.56 + ("name", "libxml2dom"),
5.57 + ("description", "XML")
5.58 ])
5.59 - ]),
5.60 - ParameterValue(ParameterName("string", None), "and")
5.61 + ],
5.62 + "and"
5.63 ]
5.64 assert s2.fault is None
5.65 print "Method name:", s2.method.methodName
5.66 @@ -182,12 +181,7 @@
5.67
5.68 a = libxml2dom.xmlrpc.parseString(arrays)
5.69 assert a.method.methodName is None
5.70 -assert a.method.parameterValues == [
5.71 - ParameterValue(ParameterName("array", None), [
5.72 - ParameterValue(ParameterName("string", None), "libxml2dom"),
5.73 - ParameterValue(ParameterName("string", None), "XSLTools")
5.74 - ])
5.75 - ]
5.76 +assert a.method.parameterValues == [["libxml2dom", "XSLTools"]]
5.77 assert a.fault is None
5.78 print "Method name:", a.method.methodName
5.79 print "Parameter values:", a.method.parameterValues