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