[Lxml-checkins] r46221 - in lxml/trunk: . src/lxml src/lxml/tests

scoder at codespeak.net scoder at codespeak.net
Fri Aug 31 19:07:27 CEST 2007


Author: scoder
Date: Fri Aug 31 19:07:26 2007
New Revision: 46221

Modified:
   lxml/trunk/CHANGES.txt
   lxml/trunk/src/lxml/extensions.pxi
   lxml/trunk/src/lxml/tests/test_xslt.py
   lxml/trunk/src/lxml/xslt.pxi
Log:
preliminary implementation of deep copy support for XSLT

Modified: lxml/trunk/CHANGES.txt
==============================================================================
--- lxml/trunk/CHANGES.txt	(original)
+++ lxml/trunk/CHANGES.txt	Fri Aug 31 19:07:26 2007
@@ -8,6 +8,8 @@
 Features added
 --------------
 
+* XSLT objects now support deep copying
+
 * New ``makeSubElement()`` C-API function that allows creating a new
   subelement straight with text, tail and attributes.
 

Modified: lxml/trunk/src/lxml/extensions.pxi
==============================================================================
--- lxml/trunk/src/lxml/extensions.pxi	(original)
+++ lxml/trunk/src/lxml/extensions.pxi	Fri Aug 31 19:07:26 2007
@@ -92,7 +92,7 @@
             _regexp = _ExsltRegExp()
             _regexp._register_in_context(self)
 
-    cdef _copy(self):
+    cdef _BaseContext _copy(self):
         cdef _BaseContext context
         if self._namespaces is not None:
             namespaces = self._namespaces[:]

Modified: lxml/trunk/src/lxml/tests/test_xslt.py
==============================================================================
--- lxml/trunk/src/lxml/tests/test_xslt.py	(original)
+++ lxml/trunk/src/lxml/tests/test_xslt.py	Fri Aug 31 19:07:26 2007
@@ -4,7 +4,7 @@
 Test cases related to XSLT processing
 """
 
-import unittest
+import unittest, copy
 
 from common_imports import etree, StringIO, HelperTestCase, fileInTestDir
 from common_imports import doctest
@@ -49,6 +49,41 @@
 
                 self.assertRaises(
                     etree.XSLTParseError, etree.XSLT, style)
+        
+    def test_xslt_copy(self):
+        tree = self.parse('<a><b>B</b><c>C</c></a>')
+        style = self.parse('''\
+<xsl:stylesheet version="1.0"
+    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+  <xsl:template match="*" />
+  <xsl:template match="/">
+    <foo><xsl:value-of select="/a/b/text()" /></foo>
+  </xsl:template>
+</xsl:stylesheet>''')
+
+        transform = etree.XSLT(style)
+        res = transform(tree)
+        self.assertEquals('''\
+<?xml version="1.0"?>
+<foo>B</foo>
+''',
+                          str(res))
+
+        transform_copy = copy.deepcopy(transform)
+        res = transform_copy(tree)
+        self.assertEquals('''\
+<?xml version="1.0"?>
+<foo>B</foo>
+''',
+                          str(res))
+
+        transform = etree.XSLT(style)
+        res = transform(tree)
+        self.assertEquals('''\
+<?xml version="1.0"?>
+<foo>B</foo>
+''',
+                          str(res))
 
     def test_xslt_utf8(self):
         tree = self.parse(u'<a><b>\uF8D2</b><c>\uF8D2</c></a>')

Modified: lxml/trunk/src/lxml/xslt.pxi
==============================================================================
--- lxml/trunk/src/lxml/xslt.pxi	(original)
+++ lxml/trunk/src/lxml/xslt.pxi	Fri Aug 31 19:07:26 2007
@@ -55,6 +55,12 @@
         self._parser = parser
         self._c_style_doc = NULL
 
+    cdef _XSLTResolverContext _copy(self):
+        cdef _XSLTResolverContext context
+        context = _XSLTResolverContext(self._parser)
+        context._c_style_doc = _copyDoc(self._c_style_doc, 1)
+        return context
+
 cdef xmlDoc* _xslt_resolve_stylesheet(char* c_uri, void* context):
     cdef xmlDoc* c_doc
     c_doc = (<_XSLTResolverContext>context)._c_style_doc
@@ -337,6 +343,26 @@
         """
         return str(result_tree)
 
+    def __deepcopy__(self, memo):
+        return self.__copy__()
+
+    def __copy__(self):
+        cdef XSLT new_xslt
+        cdef xmlDoc* c_doc
+        new_xslt = NEW_XSLT(XSLT)
+        new_xslt._access_control = self._access_control
+        new_xslt._error_log = _ErrorLog()
+        new_xslt._context = self._context._copy()
+        new_xslt._xslt_resolver_context = self._xslt_resolver_context._copy()
+
+        c_doc = _copyDoc(self._c_style.doc, 1)
+        new_xslt._c_style = xslt.xsltParseStylesheetDoc(c_doc)
+        if new_xslt._c_style is NULL:
+            tree.xmlFreeDoc(c_doc)
+            python.PyErr_NoMemory()
+
+        return new_xslt
+
     def __call__(self, _input, profile_run=False, **_kw):
         cdef _XSLTContext context
         cdef _Document input_doc
@@ -463,6 +489,10 @@
 
         return c_result
 
+cdef extern from "etree_defs.h":
+    # macro call to 't->tp_new()' for instantiation without calling __init__()
+    cdef XSLT NEW_XSLT "PY_NEW" (object t)
+
 cdef class _XSLTResultTree(_ElementTree):
     cdef XSLT _xslt
     cdef _Document _profile


More information about the lxml-checkins mailing list