[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