[Erp5-report] r45993 nicolas - in /erp5/trunk/utils/erp5diff: ./ src/ERP5Diff/ src/tests/

nobody at svn.erp5.org nobody at svn.erp5.org
Tue Aug 9 16:18:31 CEST 2011


Author: nicolas
Date: Tue Aug  9 16:18:31 2011
New Revision: 45993

URL: http://svn.erp5.org?rev=45993&view=rev
Log:
Add support of deletion/addition for tailed text nodes



Modified:
    erp5/trunk/utils/erp5diff/CHANGES.txt
    erp5/trunk/utils/erp5diff/src/ERP5Diff/ERP5Diff.py
    erp5/trunk/utils/erp5diff/src/tests/erp5diff_test_suite.py

Modified: erp5/trunk/utils/erp5diff/CHANGES.txt
URL: http://svn.erp5.org/erp5/trunk/utils/erp5diff/CHANGES.txt?rev=45993&r1=45992&r2=45993&view=diff
==============================================================================
--- erp5/trunk/utils/erp5diff/CHANGES.txt [utf8] (original)
+++ erp5/trunk/utils/erp5diff/CHANGES.txt [utf8] Tue Aug  9 16:18:31 2011
@@ -1,5 +1,7 @@
 0.8.1.6 (unreleased)
 --------------------
+ * Bug fix
+ * Add support of deletion/addition for tailed text nodes
 
 0.8.1.5 (2011/08/08)
 --------------------

Modified: erp5/trunk/utils/erp5diff/src/ERP5Diff/ERP5Diff.py
URL: http://svn.erp5.org/erp5/trunk/utils/erp5diff/src/ERP5Diff/ERP5Diff.py?rev=45993&r1=45992&r2=45993&view=diff
==============================================================================
--- erp5/trunk/utils/erp5diff/src/ERP5Diff/ERP5Diff.py [utf8] (original)
+++ erp5/trunk/utils/erp5diff/src/ERP5Diff/ERP5Diff.py [utf8] Tue Aug  9 16:18:31 2011
@@ -202,8 +202,7 @@ class ERP5Diff:
       for child in element:
         clone_node = deepcopy(child)
         update_element.append(clone_node)
-    else:
-      update_element.text = element.text
+    update_element.text = element.text
     root.append(update_element)
 
   def _xupdateUpdateTextNode(self, element, text, path, nsmap=None):
@@ -215,6 +214,16 @@ class ERP5Diff:
     update_element.text = text
     root.append(update_element)
 
+  def _xupdateInsertAfterTextNode(self, element, path, nsmap=None):
+    """insert new tail text node
+    """
+    root = self._getResultRoot()
+    insert_element = etree.Element('{%s}insert-after' % self._ns, nsmap=nsmap)
+    insert_element.attrib['select'] = path
+    text_element = etree.SubElement(insert_element, '{%s}text' % self._ns, nsmap=nsmap)
+    text_element.text = element.tail
+    root.append(insert_element)
+
   def _xupdateRemoveElement(self, path, nsmap=None):
     """
       Remove an element at 'path'.
@@ -607,20 +616,28 @@ class ERP5Diff:
               self._testAttributes(old_node, new_node, child_path)
               if not old_ignore_text and len(old_element):
                 # Mixed Content
-                if old_node.text and old_node.text.strip() and new_node.text\
-                  and new_node.text.strip() and old_node.text != new_node.text:
-                  text_path = child_path + '/text()[%i]' % (new_node.getparent().index(new_node))
+                if ((old_node.text and old_node.text.strip()) or (new_node.text\
+                  and new_node.text.strip())) and old_node.text != new_node.text\
+                  and (self._checkIgnoreText(new_node) == self._checkIgnoreText(old_node)):
+                  text_path = child_path + '/text()[1]'
                   self._xupdateUpdateTextNode(new_node, new_node.text,
                                               text_path, nsmap=new_element.nsmap)
-                if old_node.tail and old_node.tail.strip() and new_node.tail\
-                  and new_node.tail.strip() and old_node.tail != new_node.tail:
-                  position = 1
-                  if new_node.getparent().text:
-                    position += 1
-                  position += len([sibling for sibling in old_node.itersiblings(preceding=True) if sibling.tail])
-                  text_path = path + '/text()[%i]' % (position)
-                  self._xupdateUpdateTextNode(new_node, new_node.tail,
-                                              text_path, nsmap=new_element.nsmap)
+                if ((old_node.tail and old_node.tail.strip()) or (new_node.tail\
+                  and new_node.tail.strip())) and old_node.tail != new_node.tail:
+                  if old_node.tail:
+                    # case 1: edit existing text node, usage of position should works to reach
+                    # expected text node
+                    position = 1
+                    position += len([sibling for sibling in old_node.itersiblings(preceding=True) if sibling.tail])
+                    if old_node.getparent().text:
+                      position += 1
+                    text_path = path + '/text()[%i]' % (position)
+                    self._xupdateUpdateTextNode(new_node, new_node.tail,
+                                                text_path, nsmap=new_element.nsmap)
+                  else:
+                    # case 2: Means adding a new text node, the position is ambiguous,
+                    # so use insert-after instead
+                    self._xupdateInsertAfterTextNode(new_node, child_path, nsmap=new_element.nsmap)
               self._compareChildNodes(old_node, new_node, child_path)
               new_start = new_current + 1
               if new_current in new_object_left_index_set:

Modified: erp5/trunk/utils/erp5diff/src/tests/erp5diff_test_suite.py
URL: http://svn.erp5.org/erp5/trunk/utils/erp5diff/src/tests/erp5diff_test_suite.py?rev=45993&r1=45992&r2=45993&view=diff
==============================================================================
--- erp5/trunk/utils/erp5diff/src/tests/erp5diff_test_suite.py [utf8] (original)
+++ erp5/trunk/utils/erp5diff/src/tests/erp5diff_test_suite.py [utf8] Tue Aug  9 16:18:31 2011
@@ -1120,6 +1120,10 @@ class TestERP5Diff(unittest.TestCase):
   <node>AAA<blank/>BBB</node>
   <node>AAA<blank/>BBB</node>
   <node>AAA<blank/>BBB<blank/>BBB</node>CCC
+  <a_node/>AAA
+  <b_node/>
+  <b_node/>
+  <node/>
 </ul>
 """
     new_xml = """
@@ -1128,6 +1132,10 @@ class TestERP5Diff(unittest.TestCase):
   <node>C<blank/>BBB</node>
   <node>AAA<blank/>D</node>
   <node>AAA<blank/>BBB<blank/>E</node>F
+  <a_node/>
+  <b_node/>
+  <b_node/>G
+  <node>BBB<blank/>H</node>
 </ul>
 """
     expected_result_string = """<xupdate:modifications xmlns:xupdate="http://www.xmldb.org/xupdate" version="1.0">
@@ -1136,8 +1144,14 @@ class TestERP5Diff(unittest.TestCase):
   <xupdate:update select="/ul/node[2]/text()[1]">C</xupdate:update>
   <xupdate:update select="/ul/node[3]/text()[2]">D</xupdate:update>
   <xupdate:update select="/ul/text()[2]">F
-</xupdate:update>
+  </xupdate:update>
   <xupdate:update select="/ul/node[4]/text()[3]">E</xupdate:update>
+  <xupdate:update select="/ul/text()[3]"/>
+  <xupdate:insert-after select="/ul/b_node[2]">
+    <xupdate:text>G
+  </xupdate:text>
+  </xupdate:insert-after>
+  <xupdate:update select="/ul/node[5]">BBB<blank/>H</xupdate:update>
 </xupdate:modifications>
 """
     self._assertERP5DiffWorks(old_xml, new_xml, expected_result_string)



More information about the Erp5-report mailing list