# HG changeset patch # User Paul Boddie # Date 1220999711 -7200 # Node ID 96756a26d72084136088edb6319b63687c24920e # Parent dfffc586a285d86425083be625e8154065aadc84 Added more XML-RPC convenience methods and properties, tidying the specific implementation to use a dictionary instead of a large "if" statement, and adding an optional "insert" parameter to various create methods. Updated release information. diff -r dfffc586a285 -r 96756a26d720 PKG-INFO --- a/PKG-INFO Sun Sep 07 18:46:50 2008 +0200 +++ b/PKG-INFO Wed Sep 10 00:35:11 2008 +0200 @@ -1,12 +1,12 @@ Metadata-Version: 1.1 Name: libxml2dom -Version: 0.4.7 +Version: 0.4.8 Author: Paul Boddie Author-email: paul at boddie org uk Maintainer: Paul Boddie Maintainer-email: paul at boddie org uk Home-page: http://www.boddie.org.uk/python/libxml2dom.html -Download-url: http://www.boddie.org.uk/python/downloads/libxml2dom-0.4.7.tar.gz +Download-url: http://www.boddie.org.uk/python/downloads/libxml2dom-0.4.8.tar.gz Summary: PyXML-style API for the libxml2 Python bindings License: LGPL (version 3 or later) Description: The libxml2dom package provides a traditional DOM wrapper around the Python diff -r dfffc586a285 -r 96756a26d720 libxml2dom/__init__.py --- a/libxml2dom/__init__.py Sun Sep 07 18:46:50 2008 +0200 +++ b/libxml2dom/__init__.py Wed Sep 10 00:35:11 2008 +0200 @@ -19,7 +19,7 @@ with this program. If not, see . """ -__version__ = "0.4.7" +__version__ = "0.4.8" from libxml2dom.macrolib import * from libxml2dom.macrolib import \ diff -r dfffc586a285 -r 96756a26d720 libxml2dom/macrolib/__init__.py --- a/libxml2dom/macrolib/__init__.py Sun Sep 07 18:46:50 2008 +0200 +++ b/libxml2dom/macrolib/__init__.py Wed Sep 10 00:35:11 2008 +0200 @@ -19,7 +19,7 @@ with this program. If not, see . """ -__version__ = "0.4.7" +__version__ = "0.4.8" # Expose all functions here. diff -r dfffc586a285 -r 96756a26d720 libxml2dom/xmlrpc.py --- a/libxml2dom/xmlrpc.py Sun Sep 07 18:46:50 2008 +0200 +++ b/libxml2dom/xmlrpc.py Wed Sep 10 00:35:11 2008 +0200 @@ -5,7 +5,7 @@ See: http://www.xmlrpc.com/spec -Copyright (C) 2007 Paul Boddie +Copyright (C) 2007, 2008 Paul Boddie This program is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free @@ -34,87 +34,18 @@ createDocument as Node_createDocument import datetime -class XMLRPCImplementation(libxml2dom.Implementation): - - "Contains an XML-RPC-specific implementation." - - # Wrapping of documents. - - def adoptDocument(self, node): - return XMLRPCDocument(node, self) - - # Factory functions. - - def get_node(self, _node, context_node): - - """ - Get a libxml2dom node for the given low-level '_node' and libxml2dom - 'context_node'. - """ - - if Node_nodeType(_node) == context_node.ELEMENT_NODE: - - # Make special elements. - - if Node_localName(_node) in ("methodCall", "methodResponse"): - return XMLRPCMethodElement(_node, self, context_node.ownerDocument) - elif Node_localName(_node) == "methodName": - return XMLRPCMethodNameElement(_node, self, context_node.ownerDocument) - elif Node_localName(_node) == "fault": - return XMLRPCFaultElement(_node, self, context_node.ownerDocument) - elif Node_localName(_node) == "string": - return XMLRPCStringElement(_node, self, context_node.ownerDocument) - elif Node_localName(_node) in ("int", "i4"): - return XMLRPCIntegerElement(_node, self, context_node.ownerDocument) - elif Node_localName(_node) == "boolean": - return XMLRPCBooleanElement(_node, self, context_node.ownerDocument) - elif Node_localName(_node) == "double": - return XMLRPCDoubleElement(_node, self, context_node.ownerDocument) - elif Node_localName(_node) == "dateTime.iso8601": - return XMLRPCDateTimeElement(_node, self, context_node.ownerDocument) - elif Node_localName(_node) == "base64": - return XMLRPCBase64Element(_node, self, context_node.ownerDocument) - elif Node_localName(_node) == "struct": - return XMLRPCStructElement(_node, self, context_node.ownerDocument) - elif Node_localName(_node) == "member": - return XMLRPCMemberElement(_node, self, context_node.ownerDocument) - elif Node_localName(_node) == "value": - return XMLRPCValueElement(_node, self, context_node.ownerDocument) - elif Node_localName(_node) == "name": - return XMLRPCNameElement(_node, self, context_node.ownerDocument) - elif Node_localName(_node) == "array": - return XMLRPCArrayElement(_node, self, context_node.ownerDocument) - elif Node_localName(_node) == "data": - return XMLRPCDataElement(_node, self, context_node.ownerDocument) - - # Otherwise, make generic XML-RPC elements. - - return XMLRPCElement(_node, self, context_node.ownerDocument) - - else: - return libxml2dom.Implementation.get_node(self, _node, context_node) - - # Convenience functions. - - def createXMLRPCMessage(self, namespaceURI, localName): - - "Create a new XML-RPC message document (fragment)." - - return XMLRPCDocument(Node_createDocument(namespaceURI, localName, None), self).documentElement - - def createMethodCall(self): - return self.createXMLRPCMessage(None, "methodCall") - - def createMethodResponse(self): - return self.createXMLRPCMessage(None, "methodResponse") - # Node classes. class XMLRPCNode(libxml2dom.Node): "Convenience modifications to nodes specific to libxml2dom.xmlrpc." - pass + def add_or_replace_element(self, new_element): + elements = self.xpath("*") + if elements: + self.replaceChild(new_element, elements[0]) + else: + self.appendChild(new_element) class XMLRPCElement(XMLRPCNode): @@ -140,11 +71,17 @@ # Node construction methods. - def createMethodCall(self): - return self.ownerDocument.createElement("methodCall") + def createMethodCall(self, insert=0): + e = self.ownerDocument.createElement("methodCall") + if insert: + self.add_or_replace_element(e) + return e - def createMethodResponse(self): - return self.ownerDocument.createElement("methodResponse") + def createMethodResponse(self, insert=0): + e = self.ownerDocument.createElement("methodResponse") + if insert: + self.add_or_replace_element(e) + return e class XMLRPCMethodElement(XMLRPCNode): @@ -174,20 +111,56 @@ # Node construction methods. - def createMethodName(self): - return self.ownerDocument.createElement("methodName") + def createMethodName(self, insert=0): + e = self.ownerDocument.createElement("methodName") + if insert: + self.add_or_replace_element(e) + return e - def createParameters(self): - return self.ownerDocument.createElement("params") + def createParameters(self, insert=0): + e = self.ownerDocument.createElement("params") + if insert: + self.add_or_replace_element(e) + return e - def createFault(self): - return self.ownerDocument.createElement("fault") + def createFault(self, insert=0): + e = self.ownerDocument.createElement("fault") + if insert: + self.add_or_replace_element(e) + return e fault = property(_fault) methodNameElement = property(_methodNameElement) methodName = property(_methodName, _setMethodName) parameterValues = property(_parameterValues) +class XMLRPCParametersElement(XMLRPCNode): + + "An XML-RPC parameters/params element." + + # Node construction methods. + + def createParameter(self, insert=0): + e = self.ownerDocument.createElement("param") + if insert: + self.appendChild(e) + return e + +class XMLRPCParameterElement(XMLRPCNode): + + "An XML-RPC parameter/param element." + + # Node construction methods. + + def createValue(self, typename=None, insert=0): + value = self.ownerDocument.createElement("value") + if typename is not None: + contents = self.ownerDocument.createElement(typename) + value.appendChild(contents) + if insert: + self.add_or_replace_element(value) + return value + class XMLRPCArrayElement(XMLRPCNode): "An XML-RPC array element." @@ -220,8 +193,11 @@ # Node construction methods. - def createData(self): - return self.ownerDocument.createElement("data") + def createData(self, insert=0): + e = self.ownerDocument.createElement("data") + if insert: + self.add_or_replace_element(e) + return e data = property(_data) contents = property(_contents) @@ -252,8 +228,11 @@ # Node construction methods. - def createMember(self): - return self.ownerDocument.createElement("member") + def createMember(self, insert=0): + e = self.ownerDocument.createElement("member") + if insert: + self.add_or_replace_element(e) + return e members = property(_members) contents = property(_contents) @@ -275,8 +254,11 @@ # Node construction methods. - def createValue(self): - return self.ownerDocument.createElement("value") + def createValue(self, insert=0): + e = self.ownerDocument.createElement("value") + if insert: + self.add_or_replace_element(e) + return e values = property(_values) @@ -318,11 +300,17 @@ # Node construction methods. - def createName(self): - return self.ownerDocument.createElement("name") + def createName(self, insert=0): + e = self.ownerDocument.createElement("name") + if insert: + self.add_or_replace_element(e) + return e - def createValue(self): - return self.ownerDocument.createElement("value") + def createValue(self, insert=0): + e = self.ownerDocument.createElement("value") + if insert: + self.add_or_replace_element(e) + return e value = property(_value) nameElement = property(_nameElement) @@ -373,10 +361,14 @@ else: return "string" + def _setType(self, typename): + new_contents = self.ownerDocument.createElement(typename) + self.add_or_replace_element(new_contents) + def _container(self): return (self.xpath("*") or [self])[0] - type = property(_type) + type = property(_type, _setType) container = property(_container) class XMLRPCMethodNameElement(XMLRPCStringElement): @@ -463,6 +455,87 @@ "base64" : str } +# Implementation-related functionality. + +class XMLRPCImplementation(libxml2dom.Implementation): + + "Contains an XML-RPC-specific implementation." + + # Mapping of element names to wrappers. + + _class_for_name = { + "methodCall" : XMLRPCMethodElement, + "methodResponse" : XMLRPCMethodElement, + "methodName" : XMLRPCMethodNameElement, + "params" : XMLRPCParametersElement, + "param" : XMLRPCParameterElement, + "fault" : XMLRPCFaultElement, + "string" : XMLRPCStringElement, + "int" : XMLRPCIntegerElement, + "i4" : XMLRPCIntegerElement, + "boolean" : XMLRPCBooleanElement, + "double" : XMLRPCDoubleElement, + "dateTime.iso8601" : XMLRPCDateTimeElement, + "base64" : XMLRPCBase64Element, + "struct" : XMLRPCStructElement, + "member" : XMLRPCMemberElement, + "value" : XMLRPCValueElement, + "name" : XMLRPCNameElement, + "array" : XMLRPCArrayElement, + "data" : XMLRPCDataElement + } + + # Wrapping of documents. + + def adoptDocument(self, node): + return XMLRPCDocument(node, self) + + # Factory functions. + + def get_node(self, _node, context_node): + + """ + Get a libxml2dom node for the given low-level '_node' and libxml2dom + 'context_node'. + """ + + if Node_nodeType(_node) == context_node.ELEMENT_NODE: + + # Make special objects for certain elements. + # Otherwise, make generic XML-RPC elements. + + cls = self._class_for_name.get(Node_localName(_node)) or XMLRPCElement + return cls(_node, self, context_node.ownerDocument) + + else: + return libxml2dom.Implementation.get_node(self, _node, context_node) + + # Convenience functions. + + def createXMLRPCMessage(self, namespaceURI, localName): + + "Create a new XML-RPC message document (fragment)." + + return XMLRPCDocument(Node_createDocument(namespaceURI, localName, None), self).documentElement + + def createMethodCall(self, name=None): + + """ + Create and return a message fragment for a method call having the given + 'name'. + """ + + message = self.createXMLRPCMessage(None, "methodCall") + if name is not None: + message.methodName = name + return message + + def createMethodResponse(self): + + "Create and return a message fragment for a method response." + + return self.createXMLRPCMessage(None, "methodResponse") + # Utility functions. createDocument = libxml2dom.createDocument @@ -471,8 +544,8 @@ def createXMLRPCMessage(namespaceURI, localName): return default_impl.createXMLRPCMessage(None, localName) -def createMethodCall(): - return default_impl.createMethodCall() +def createMethodCall(name=None): + return default_impl.createMethodCall(name) def createMethodResponse(): return default_impl.createMethodResponse() diff -r dfffc586a285 -r 96756a26d720 packages/debian-etch/python-libxml2dom/debian/changelog --- a/packages/debian-etch/python-libxml2dom/debian/changelog Sun Sep 07 18:46:50 2008 +0200 +++ b/packages/debian-etch/python-libxml2dom/debian/changelog Wed Sep 10 00:35:11 2008 +0200 @@ -1,3 +1,9 @@ +libxml2dom (0.4.8-0ubuntu1) stable; urgency=low + + * Added more XML-RPC convenience methods and properties. + + -- Paul Boddie Wed, 10 Sep 2008 00:31:55 +0200 + libxml2dom (0.4.7-0ubuntu1) stable; urgency=low * Fixed the ownerElement of attributes created by XPath diff -r dfffc586a285 -r 96756a26d720 packages/debian-sarge/python2.3-libxml2dom/debian/changelog --- a/packages/debian-sarge/python2.3-libxml2dom/debian/changelog Sun Sep 07 18:46:50 2008 +0200 +++ b/packages/debian-sarge/python2.3-libxml2dom/debian/changelog Wed Sep 10 00:35:11 2008 +0200 @@ -1,3 +1,9 @@ +libxml2dom (0.4.8-0ubuntu1) stable; urgency=low + + * Added more XML-RPC convenience methods and properties. + + -- Paul Boddie Wed, 10 Sep 2008 00:32:39 +0200 + libxml2dom (0.4.7-0ubuntu1) stable; urgency=low * Fixed the ownerElement of attributes created by XPath diff -r dfffc586a285 -r 96756a26d720 packages/ubuntu-feisty/python-libxml2dom/debian/changelog --- a/packages/ubuntu-feisty/python-libxml2dom/debian/changelog Sun Sep 07 18:46:50 2008 +0200 +++ b/packages/ubuntu-feisty/python-libxml2dom/debian/changelog Wed Sep 10 00:35:11 2008 +0200 @@ -1,3 +1,9 @@ +libxml2dom (0.4.8-0ubuntu1) feisty; urgency=low + + * Added more XML-RPC convenience methods and properties. + + -- Paul Boddie Wed, 10 Sep 2008 00:33:14 +0200 + libxml2dom (0.4.7-0ubuntu1) feisty; urgency=low * Fixed the ownerElement of attributes created by XPath diff -r dfffc586a285 -r 96756a26d720 packages/ubuntu-hoary/python2.4-libxml2dom/debian/changelog --- a/packages/ubuntu-hoary/python2.4-libxml2dom/debian/changelog Sun Sep 07 18:46:50 2008 +0200 +++ b/packages/ubuntu-hoary/python2.4-libxml2dom/debian/changelog Wed Sep 10 00:35:11 2008 +0200 @@ -1,3 +1,9 @@ +libxml2dom (0.4.8-0ubuntu1) hoary; urgency=low + + * Added more XML-RPC convenience methods and properties. + + -- Paul Boddie Wed, 10 Sep 2008 00:32:59 +0200 + libxml2dom (0.4.7-0ubuntu1) hoary; urgency=low * Fixed the ownerElement of attributes created by XPath