[Erp5-report] r45991 nicolas - in /erp5/trunk/utils/erp5diff: ./ src/ERP5Diff/ src/tests/
nobody at svn.erp5.org
nobody at svn.erp5.org
Mon Aug 8 10:30:07 CEST 2011
Author: nicolas
Date: Mon Aug 8 10:30:06 2011
New Revision: 45991
URL: http://svn.erp5.org?rev=45991&view=rev
Log:
Improve Handling of mixed content
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=45991&r1=45990&r2=45991&view=diff
==============================================================================
--- erp5/trunk/utils/erp5diff/CHANGES.txt [utf8] (original)
+++ erp5/trunk/utils/erp5diff/CHANGES.txt [utf8] Mon Aug 8 10:30:06 2011
@@ -1,6 +1,7 @@
0.8.1.5 (unreleased)
--------------------
* Fix rst syntax
+ * Improve Handling of mixed content
0.8.1.4 (2011/08/05)
--------------------
Modified: erp5/trunk/utils/erp5diff/src/ERP5Diff/ERP5Diff.py
URL: http://svn.erp5.org/erp5/trunk/utils/erp5diff/src/ERP5Diff/ERP5Diff.py?rev=45991&r1=45990&r2=45991&view=diff
==============================================================================
--- erp5/trunk/utils/erp5diff/src/ERP5Diff/ERP5Diff.py [utf8] (original)
+++ erp5/trunk/utils/erp5diff/src/ERP5Diff/ERP5Diff.py [utf8] Mon Aug 8 10:30:06 2011
@@ -206,6 +206,15 @@ class ERP5Diff:
update_element.text = element.text
root.append(update_element)
+ def _xupdateUpdateTextNode(self, element, text, path, nsmap=None):
+ """Update only text attribute
+ """
+ root = self._getResultRoot()
+ update_element = etree.Element('{%s}update' % self._ns, nsmap=nsmap)
+ update_element.attrib['select'] = path
+ update_element.text = text
+ root.append(update_element)
+
def _xupdateRemoveElement(self, path, nsmap=None):
"""
Remove an element at 'path'.
@@ -571,7 +580,7 @@ class ERP5Diff:
# This means that the semantics of this element is quite different.
self._p("One of them has only text and the other does not, so just update all the contents.")
self._xupdateUpdateElement(new_element, path, nsmap=new_element.nsmap)
- elif not old_ignore_text:
+ elif not old_ignore_text and not len(old_element):
# The contents are only text.
self._p("Both have only text.")
old_text = self._aggregateText(old_element)
@@ -596,6 +605,22 @@ class ERP5Diff:
new_node = new_list[new_current]
if self._testElements(old_node, new_node):
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))
+ 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)
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=45991&r1=45990&r2=45991&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] Mon Aug 8 10:30:06 2011
@@ -1117,16 +1117,27 @@ class TestERP5Diff(unittest.TestCase):
old_xml = """
<ul>
<node/>blablabla
+ <node>AAA<blank/>BBB</node>
+ <node>AAA<blank/>BBB</node>
+ <node>AAA<blank/>BBB<blank/>BBB</node>CCC
</ul>
"""
new_xml = """
<ul>
<node/>yayaya
+ <node>C<blank/>BBB</node>
+ <node>AAA<blank/>D</node>
+ <node>AAA<blank/>BBB<blank/>E</node>F
</ul>
"""
expected_result_string = """<xupdate:modifications xmlns:xupdate="http://www.xmldb.org/xupdate" version="1.0">
- <xupdate:update select="/ul"><node/>yayaya
+ <xupdate:update select="/ul/text()[1]">yayaya
+ </xupdate:update>
+ <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 select="/ul/node[4]/text()[3]">E</xupdate:update>
</xupdate:modifications>
"""
self._assertERP5DiffWorks(old_xml, new_xml, expected_result_string)
More information about the Erp5-report
mailing list