diff -r a206f952668e Lib/test/test_xml_etree.py
--- a/Lib/test/test_xml_etree.py Thu Aug 08 18:28:53 2013 +0100
+++ b/Lib/test/test_xml_etree.py Fri Aug 09 13:41:13 2013 +0200
@@ -954,10 +954,10 @@
def _feed(self, parser, data, chunk_size=None):
if chunk_size is None:
- parser.data_received(data)
+ parser.feed(data)
else:
for i in range(0, len(data), chunk_size):
- parser.data_received(data[i:i+chunk_size])
+ parser.feed(data[i:i+chunk_size])
def assert_event_tags(self, parser, expected):
events = parser.events()
@@ -987,7 +987,7 @@
self.assert_event_tags(parser, [('end', 'root')])
# Receiving EOF sets the `root` attribute
self.assertIs(parser.root, None)
- parser.eof_received()
+ parser.close()
self.assertEqual(parser.root.tag, 'root')
def test_data_received_while_iterating(self):
@@ -1002,6 +1002,15 @@
with self.assertRaises(StopIteration):
next(it)
+ def test_close_returns_events_iterator(self):
+ parser = ET.IncrementalParser()
+ self._feed(parser, "\n text\n",
+ chunk_size=5)
+ self._feed(parser, "\n")
+ events = [(action, el.tag) for action, el in parser.close()]
+ self.assertEqual(events, [('end', 'element'), ('end', 'root')])
+ self.assert_event_tags(parser, [])
+
def test_simple_xml_with_ns(self):
parser = ET.IncrementalParser()
self.assert_event_tags(parser, [])
@@ -1023,7 +1032,7 @@
self.assert_event_tags(parser, [('end', '{namespace}root')])
# Receiving EOF sets the `root` attribute
self.assertIs(parser.root, None)
- parser.eof_received()
+ parser.close()
self.assertEqual(parser.root.tag, '{namespace}root')
def test_ns_events(self):
@@ -1039,7 +1048,7 @@
self._feed(parser, "\n")
self._feed(parser, "\n")
self.assertEqual(list(parser.events()), [('end-ns', None)])
- parser.eof_received()
+ parser.close()
def test_events(self):
parser = ET.IncrementalParser(events=())
@@ -1064,7 +1073,7 @@
('end', '{foo}element'),
])
self._feed(parser, "")
- parser.eof_received()
+ parser.close()
self.assertIs(parser.root, None)
self.assert_event_tags(parser, [('end', 'root')])
self.assertEqual(parser.root.tag, 'root')
@@ -1085,7 +1094,7 @@
('start', '{foo}empty-element'),
])
self._feed(parser, "")
- parser.eof_received()
+ parser.close()
self.assertEqual(parser.root.tag, 'root')
def test_events_sequence(self):
diff -r a206f952668e Lib/xml/etree/ElementTree.py
--- a/Lib/xml/etree/ElementTree.py Thu Aug 08 18:28:53 2013 +0100
+++ b/Lib/xml/etree/ElementTree.py Fri Aug 09 13:41:13 2013 +0200
@@ -1225,20 +1225,21 @@
events = ("end",)
self._parser._setevents(self._events_queue, events)
- def data_received(self, data):
+ def feed(self, data):
if self._parser is None:
- raise ValueError("data_received() called after end of stream")
+ raise ValueError("feed() called after end of stream")
if data:
try:
self._parser.feed(data)
except SyntaxError as exc:
self._events_queue.append(exc)
- def eof_received(self):
+ def close(self):
self._root = self._parser.close()
self._parser = None
if self._index >= len(self._events_queue):
self.root = self._root
+ return self.events()
def events(self):
events = self._events_queue
@@ -1265,27 +1266,29 @@
self.root = self._root
-class _IterParseIterator(IncrementalParser):
+class _IterParseIterator:
def __init__(self, source, events, parser, close_source=False):
- IncrementalParser.__init__(self, events, parser)
+ self._parser = IncrementalParser(events, parser)
self._file = source
self._close_file = close_source
+ self.root = None
def __next__(self):
while 1:
- for event in self.events():
+ for event in self._parser.events():
return event
- if self._parser is None:
+ if self._parser._parser is None:
+ self.root = self._parser.root
if self._close_file:
self._file.close()
raise StopIteration
# load event buffer
data = self._file.read(16384)
if data:
- self.data_received(data)
+ self._parser.feed(data)
else:
- self.eof_received()
+ self._parser.close()
def __iter__(self):
return self