summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGordon P. Hemsley <me@gphemsley.org>2019-09-10 15:22:01 (GMT)
committerStefan Behnel <stefan_ml@behnel.de>2019-09-10 15:22:01 (GMT)
commit7d952ded6813c896ea3f4234bb8db5247dcb5484 (patch)
tree15472d3858af207919e4893b1335d99d08974616
parenta9b6033179b64b985394ad351501089a6a94fc9d (diff)
downloadcpython-7d952ded6813c896ea3f4234bb8db5247dcb5484.zip
cpython-7d952ded6813c896ea3f4234bb8db5247dcb5484.tar.gz
cpython-7d952ded6813c896ea3f4234bb8db5247dcb5484.tar.bz2
bpo-32424: Deprecate xml.etree.ElementTree.Element.copy() in favor of copy.copy() (GH-12995)
-rw-r--r--Lib/test/test_xml_etree.py29
-rw-r--r--Lib/xml/etree/ElementTree.py7
-rw-r--r--Misc/NEWS.d/next/Library/2019-04-28-10-34-19.bpo-32424.eqNPhM.rst3
3 files changed, 39 insertions, 0 deletions
diff --git a/Lib/test/test_xml_etree.py b/Lib/test/test_xml_etree.py
index 87a6fa1..9fbb4ac 100644
--- a/Lib/test/test_xml_etree.py
+++ b/Lib/test/test_xml_etree.py
@@ -2211,6 +2211,35 @@ class BasicElementTest(ElementTestCase, unittest.TestCase):
self.assertIsNot(element_foo.attrib, attrib)
self.assertNotEqual(element_foo.attrib, attrib)
+ def test_copy(self):
+ # Only run this test if Element.copy() is defined.
+ if "copy" not in dir(ET.Element):
+ raise unittest.SkipTest("Element.copy() not present")
+
+ element_foo = ET.Element("foo", { "zix": "wyp" })
+ element_foo.append(ET.Element("bar", { "baz": "qix" }))
+
+ with self.assertWarns(DeprecationWarning):
+ element_foo2 = element_foo.copy()
+
+ # elements are not the same
+ self.assertIsNot(element_foo2, element_foo)
+
+ # string attributes are equal
+ self.assertEqual(element_foo2.tag, element_foo.tag)
+ self.assertEqual(element_foo2.text, element_foo.text)
+ self.assertEqual(element_foo2.tail, element_foo.tail)
+
+ # number of children is the same
+ self.assertEqual(len(element_foo2), len(element_foo))
+
+ # children are the same
+ for (child1, child2) in itertools.zip_longest(element_foo, element_foo2):
+ self.assertIs(child1, child2)
+
+ # attrib is a copy
+ self.assertEqual(element_foo2.attrib, element_foo.attrib)
+
def test___copy__(self):
element_foo = ET.Element("foo", { "zix": "wyp" })
element_foo.append(ET.Element("bar", { "baz": "qix" }))
diff --git a/Lib/xml/etree/ElementTree.py b/Lib/xml/etree/ElementTree.py
index e75200a..c8d898f 100644
--- a/Lib/xml/etree/ElementTree.py
+++ b/Lib/xml/etree/ElementTree.py
@@ -195,6 +195,13 @@ class Element:
original tree.
"""
+ warnings.warn(
+ "elem.copy() is deprecated. Use copy.copy(elem) instead.",
+ DeprecationWarning
+ )
+ return self.__copy__()
+
+ def __copy__(self):
elem = self.makeelement(self.tag, self.attrib)
elem.text = self.text
elem.tail = self.tail
diff --git a/Misc/NEWS.d/next/Library/2019-04-28-10-34-19.bpo-32424.eqNPhM.rst b/Misc/NEWS.d/next/Library/2019-04-28-10-34-19.bpo-32424.eqNPhM.rst
new file mode 100644
index 0000000..a60d68b
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2019-04-28-10-34-19.bpo-32424.eqNPhM.rst
@@ -0,0 +1,3 @@
+Deprecate xml.etree.ElementTree.Element.copy() in favor of copy.copy().
+
+Patch by Gordon P. Hemsley