Commit efea8e7e authored by Larry Hastings's avatar Larry Hastings

Merging the 3.4.0a1 head.

parents b206ec26 2ebc82c3
...@@ -416,7 +416,8 @@ Functions ...@@ -416,7 +416,8 @@ Functions
and ``"end-ns"`` (the "ns" events are used to get detailed namespace and ``"end-ns"`` (the "ns" events are used to get detailed namespace
information). If *events* is omitted, only ``"end"`` events are reported. information). If *events* is omitted, only ``"end"`` events are reported.
*parser* is an optional parser instance. If not given, the standard *parser* is an optional parser instance. If not given, the standard
:class:`XMLParser` parser is used. Returns an :term:`iterator` providing :class:`XMLParser` parser is used. *parser* can only use the default
:class:`TreeBuilder` as a target. Returns an :term:`iterator` providing
``(event, elem)`` pairs. ``(event, elem)`` pairs.
Note that while :func:`iterparse` builds the tree incrementally, it issues Note that while :func:`iterparse` builds the tree incrementally, it issues
...@@ -880,7 +881,7 @@ IncrementalParser Objects ...@@ -880,7 +881,7 @@ IncrementalParser Objects
events are used to get detailed namespace information). If *events* is events are used to get detailed namespace information). If *events* is
omitted, only ``"end"`` events are reported. *parser* is an optional omitted, only ``"end"`` events are reported. *parser* is an optional
parser instance. If not given, the standard :class:`XMLParser` parser is parser instance. If not given, the standard :class:`XMLParser` parser is
used. used. *parser* can only use the default :class:`TreeBuilder` as a target.
.. method:: data_received(data) .. method:: data_received(data)
......
...@@ -351,8 +351,8 @@ def _optimize_unicode(charset, fixup): ...@@ -351,8 +351,8 @@ def _optimize_unicode(charset, fixup):
def _simple(av): def _simple(av):
# check if av is a "simple" operator # check if av is a "simple" operator
lo, hi = av[2].getwidth() lo, hi = av[2].getwidth()
if lo == 0 and hi == MAXREPEAT: #if lo == 0 and hi == MAXREPEAT:
raise error("nothing to repeat") # raise error("nothing to repeat")
return lo == hi == 1 and av[2][0][0] != SUBPATTERN return lo == hi == 1 and av[2][0][0] != SUBPATTERN
def _compile_info(code, pattern, flags): def _compile_info(code, pattern, flags):
......
...@@ -1735,8 +1735,6 @@ class UnicodeTest(string_tests.CommonTest, ...@@ -1735,8 +1735,6 @@ class UnicodeTest(string_tests.CommonTest,
self.assertRaises(TypeError, "hello".encode, 42, 42, 42) self.assertRaises(TypeError, "hello".encode, 42, 42, 42)
# Error handling (lone surrogate in PyUnicode_TransformDecimalToASCII()) # Error handling (lone surrogate in PyUnicode_TransformDecimalToASCII())
self.assertRaises(UnicodeError, int, "\ud800")
self.assertRaises(UnicodeError, int, "\udf00")
self.assertRaises(UnicodeError, float, "\ud800") self.assertRaises(UnicodeError, float, "\ud800")
self.assertRaises(UnicodeError, float, "\udf00") self.assertRaises(UnicodeError, float, "\udf00")
self.assertRaises(UnicodeError, complex, "\ud800") self.assertRaises(UnicodeError, complex, "\ud800")
......
...@@ -1839,6 +1839,20 @@ class ElementFindTest(unittest.TestCase): ...@@ -1839,6 +1839,20 @@ class ElementFindTest(unittest.TestCase):
summarize_list(e.findall(".//{http://effbot.org/ns}tag")), summarize_list(e.findall(".//{http://effbot.org/ns}tag")),
['{http://effbot.org/ns}tag'] * 3) ['{http://effbot.org/ns}tag'] * 3)
def test_findall_different_nsmaps(self):
root = ET.XML('''
<a xmlns:x="X" xmlns:y="Y">
<x:b><c/></x:b>
<b/>
<c><x:b/><b/></c><y:b/>
</a>''')
nsmap = {'xx': 'X'}
self.assertEqual(len(root.findall(".//xx:b", namespaces=nsmap)), 2)
self.assertEqual(len(root.findall(".//b", namespaces=nsmap)), 2)
nsmap = {'xx': 'Y'}
self.assertEqual(len(root.findall(".//xx:b", namespaces=nsmap)), 1)
self.assertEqual(len(root.findall(".//b", namespaces=nsmap)), 2)
def test_bad_find(self): def test_bad_find(self):
e = ET.XML(SAMPLE_XML) e = ET.XML(SAMPLE_XML)
with self.assertRaisesRegex(SyntaxError, 'cannot use absolute path'): with self.assertRaisesRegex(SyntaxError, 'cannot use absolute path'):
......
...@@ -249,10 +249,12 @@ class _SelectorContext: ...@@ -249,10 +249,12 @@ class _SelectorContext:
def iterfind(elem, path, namespaces=None): def iterfind(elem, path, namespaces=None):
# compile selector pattern # compile selector pattern
cache_key = (path, None if namespaces is None
else tuple(sorted(namespaces.items())))
if path[-1:] == "/": if path[-1:] == "/":
path = path + "*" # implicit all (FIXME: keep this?) path = path + "*" # implicit all (FIXME: keep this?)
try: try:
selector = _cache[path] selector = _cache[cache_key]
except KeyError: except KeyError:
if len(_cache) > 100: if len(_cache) > 100:
_cache.clear() _cache.clear()
...@@ -272,7 +274,7 @@ def iterfind(elem, path, namespaces=None): ...@@ -272,7 +274,7 @@ def iterfind(elem, path, namespaces=None):
token = next() token = next()
except StopIteration: except StopIteration:
break break
_cache[path] = selector _cache[cache_key] = selector
# execute selector pattern # execute selector pattern
result = [elem] result = [elem]
context = _SelectorContext(elem) context = _SelectorContext(elem)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment