bpo-29204: Emit warnings for already deprecated ElementTree features.… · python/cpython@762ec97 (original) (raw)
`@@ -6,6 +6,7 @@
`
6
6
`# monkey-patched when running the "test_xml_etree_c" test suite.
`
7
7
``
8
8
`import copy
`
``
9
`+
import functools
`
9
10
`import html
`
10
11
`import io
`
11
12
`import operator
`
90
91
`"""
`
91
92
``
92
93
``
``
94
`+
def checkwarnings(*filters, quiet=False):
`
``
95
`+
def decorator(test):
`
``
96
`+
def newtest(*args, **kwargs):
`
``
97
`+
with support.check_warnings(*filters, quiet=quiet):
`
``
98
`+
test(*args, **kwargs)
`
``
99
`+
functools.update_wrapper(newtest, test)
`
``
100
`+
return newtest
`
``
101
`+
return decorator
`
``
102
+
``
103
+
93
104
`class ModuleTest(unittest.TestCase):
`
94
105
`def test_sanity(self):
`
95
106
`# Import sanity.
`
`@@ -690,6 +701,10 @@ def comment(self, data):
`
690
701
` ])
`
691
702
``
692
703
``
``
704
`+
Element.getchildren() and ElementTree.getiterator() are deprecated.
`
``
705
`+
@checkwarnings(("This method will be removed in future versions. "
`
``
706
`+
"Use .+ instead.",
`
``
707
`+
(DeprecationWarning, PendingDeprecationWarning)))
`
693
708
`def test_getchildren(self):
`
694
709
`# Test Element.getchildren()
`
695
710
``
`@@ -1558,7 +1573,7 @@ def test_bug_200708_close(self):
`
1558
1573
`class EchoTarget:
`
1559
1574
`def close(self):
`
1560
1575
`return ET.Element("element") # simulate root
`
1561
``
`-
parser = ET.XMLParser(EchoTarget())
`
``
1576
`+
parser = ET.XMLParser(target=EchoTarget())
`
1562
1577
`parser.feed("some text")
`
1563
1578
`self.assertEqual(parser.close().tag, 'element')
`
1564
1579
``
`@@ -2225,8 +2240,12 @@ def test_find_through_ElementTree(self):
`
2225
2240
`self.assertEqual(summarize_list(ET.ElementTree(e).findall('tag')),
`
2226
2241
` ['tag'] * 2)
`
2227
2242
`# this produces a warning
`
2228
``
`-
self.assertEqual(summarize_list(ET.ElementTree(e).findall('//tag')),
`
2229
``
`-
['tag'] * 3)
`
``
2243
`+
msg = ("This search is broken in 1.3 and earlier, and will be fixed "
`
``
2244
`+
"in a future version. If you rely on the current behaviour, "
`
``
2245
`+
"change it to '.+'")
`
``
2246
`+
with self.assertWarnsRegex(FutureWarning, msg):
`
``
2247
`+
it = ET.ElementTree(e).findall('//tag')
`
``
2248
`+
self.assertEqual(summarize_list(it), ['tag'] * 3)
`
2230
2249
``
2231
2250
``
2232
2251
`class ElementIterTest(unittest.TestCase):
`
`@@ -2311,6 +2330,9 @@ def test_iter_by_tag(self):
`
2311
2330
`self.assertEqual(self._ilist(doc), all_tags)
`
2312
2331
`self.assertEqual(self._ilist(doc, '*'), all_tags)
`
2313
2332
``
``
2333
`+
Element.getiterator() is deprecated.
`
``
2334
`+
@checkwarnings(("This method will be removed in future versions. "
`
``
2335
`+
"Use .+ instead.", PendingDeprecationWarning))
`
2314
2336
`def test_getiterator(self):
`
2315
2337
`doc = ET.XML('''
`
2316
2338
`
`
`@@ -2493,13 +2515,13 @@ def _check_sample_element(self, e):
`
2493
2515
`def test_constructor_args(self):
`
2494
2516
`# Positional args. The first (html) is not supported, but should be
`
2495
2517
`# nevertheless correctly accepted.
`
2496
``
`-
parser = ET.XMLParser(None, ET.TreeBuilder(), 'utf-8')
`
``
2518
`+
with self.assertWarnsRegex(DeprecationWarning, r'\bhtml\b'):
`
``
2519
`+
parser = ET.XMLParser(None, ET.TreeBuilder(), 'utf-8')
`
2497
2520
`parser.feed(self.sample1)
`
2498
2521
`self._check_sample_element(parser.close())
`
2499
2522
``
2500
2523
`# Now as keyword args.
`
2501
2524
`parser2 = ET.XMLParser(encoding='utf-8',
`
2502
``
`-
html=[{}],
`
2503
2525
`target=ET.TreeBuilder())
`
2504
2526
`parser2.feed(self.sample1)
`
2505
2527
`self._check_sample_element(parser2.close())
`
`@@ -3016,46 +3038,6 @@ def test_correct_import_pyET(self):
`
3016
3038
`# --------------------------------------------------------------------
`
3017
3039
``
3018
3040
``
3019
``
`-
class CleanContext(object):
`
3020
``
`-
"""Provide default namespace mapping and path cache."""
`
3021
``
`-
checkwarnings = None
`
3022
``
-
3023
``
`-
def init(self, quiet=False):
`
3024
``
`-
if sys.flags.optimize >= 2:
`
3025
``
`-
under -OO, doctests cannot be run and therefore not all warnings
`
3026
``
`-
will be emitted
`
3027
``
`-
quiet = True
`
3028
``
`-
deprecations = (
`
3029
``
`-
Search behaviour is broken if search path starts with "/".
`
3030
``
`-
("This search is broken in 1.3 and earlier, and will be fixed "
`
3031
``
`-
"in a future version. If you rely on the current behaviour, "
`
3032
``
`-
"change it to '.+'", FutureWarning),
`
3033
``
`-
Element.getchildren() and Element.getiterator() are deprecated.
`
3034
``
`-
("This method will be removed in future versions. "
`
3035
``
`-
"Use .+ instead.", DeprecationWarning),
`
3036
``
`-
("This method will be removed in future versions. "
`
3037
``
`-
"Use .+ instead.", PendingDeprecationWarning))
`
3038
``
`-
self.checkwarnings = support.check_warnings(*deprecations, quiet=quiet)
`
3039
``
-
3040
``
`-
def enter(self):
`
3041
``
`-
from xml.etree import ElementPath
`
3042
``
`-
self._nsmap = ET.register_namespace._namespace_map
`
3043
``
`-
Copy the default namespace mapping
`
3044
``
`-
self._nsmap_copy = self._nsmap.copy()
`
3045
``
`-
Copy the path cache (should be empty)
`
3046
``
`-
self._path_cache = ElementPath._cache
`
3047
``
`-
ElementPath._cache = self._path_cache.copy()
`
3048
``
`-
self.checkwarnings.enter()
`
3049
``
-
3050
``
`-
def exit(self, *args):
`
3051
``
`-
from xml.etree import ElementPath
`
3052
``
`-
Restore mapping and path cache
`
3053
``
`-
self._nsmap.clear()
`
3054
``
`-
self._nsmap.update(self._nsmap_copy)
`
3055
``
`-
ElementPath._cache = self._path_cache
`
3056
``
`-
self.checkwarnings.exit(*args)
`
3057
``
-
3058
``
-
3059
3041
`def test_main(module=None):
`
3060
3042
`# When invoked without a module, runs the Python ET tests by loading pyET.
`
3061
3043
`# Otherwise, uses the given module as the ET.
`
`@@ -3095,11 +3077,22 @@ def test_main(module=None):
`
3095
3077
`NoAcceleratorTest,
`
3096
3078
` ])
`
3097
3079
``
``
3080
`+
Provide default namespace mapping and path cache.
`
``
3081
`+
from xml.etree import ElementPath
`
``
3082
`+
nsmap = ET.register_namespace._namespace_map
`
``
3083
`+
Copy the default namespace mapping
`
``
3084
`+
nsmap_copy = nsmap.copy()
`
``
3085
`+
Copy the path cache (should be empty)
`
``
3086
`+
path_cache = ElementPath._cache
`
``
3087
`+
ElementPath._cache = path_cache.copy()
`
3098
3088
`try:
`
3099
``
`-
XXX the C module should give the same warnings as the Python module
`
3100
``
`-
with CleanContext(quiet=(pyET is not ET)):
`
3101
``
`-
support.run_unittest(*test_classes)
`
``
3089
`+
support.run_unittest(*test_classes)
`
3102
3090
`finally:
`
``
3091
`+
from xml.etree import ElementPath
`
``
3092
`+
Restore mapping and path cache
`
``
3093
`+
nsmap.clear()
`
``
3094
`+
nsmap.update(nsmap_copy)
`
``
3095
`+
ElementPath._cache = path_cache
`
3103
3096
`# don't interfere with subsequent tests
`
3104
3097
`ET = pyET = None
`
3105
3098
``