@@ -1193,6 +1193,9 @@ def _feed(self, parser, data, chunk_size=None):
11931193 for i in range (0 , len (data ), chunk_size ):
11941194 parser .feed (data [i :i + chunk_size ])
11951195
1196+ def assert_events (self , parser , expected ):
1197+ self .assertEqual (list (parser .read_events ()), expected )
1198+
11961199 def assert_event_tags (self , parser , expected ):
11971200 events = parser .read_events ()
11981201 self .assertEqual ([(action , elem .tag ) for action , elem in events ],
@@ -1275,8 +1278,10 @@ def test_events(self):
12751278 self .assert_event_tags (parser , [])
12761279
12771280 parser = ET .XMLPullParser (events = ('start' , 'end' ))
1278- self ._feed (parser , "<!-- comment -->\n " )
1279- self .assert_event_tags (parser , [])
1281+ self ._feed (parser , "<!-- text here -->\n " )
1282+ self .assert_events (parser , [])
1283+
1284+ parser = ET .XMLPullParser (events = ('start' , 'end' ))
12801285 self ._feed (parser , "<root>\n " )
12811286 self .assert_event_tags (parser , [('start' , 'root' )])
12821287 self ._feed (parser , "<element key='value'>text</element" )
@@ -1313,6 +1318,34 @@ def test_events(self):
13131318 self ._feed (parser , "</root>" )
13141319 self .assertIsNone (parser .close ())
13151320
1321+ def test_events_comment (self ):
1322+ parser = ET .XMLPullParser (events = ('start' , 'comment' , 'end' ))
1323+ self ._feed (parser , "<!-- text here -->\n " )
1324+ self .assert_events (parser , [('comment' , ' text here ' )])
1325+ self ._feed (parser , "<!-- more text here -->\n " )
1326+ self .assert_events (parser , [('comment' , ' more text here ' )])
1327+ self ._feed (parser , "<root-tag>text" )
1328+ self .assert_event_tags (parser , [('start' , 'root-tag' )])
1329+ self ._feed (parser , "<!-- inner comment-->\n " )
1330+ self .assert_events (parser , [('comment' , ' inner comment' )])
1331+ self ._feed (parser , "</root-tag>\n " )
1332+ self .assert_event_tags (parser , [('end' , 'root-tag' )])
1333+ self ._feed (parser , "<!-- outer comment -->\n " )
1334+ self .assert_events (parser , [('comment' , ' outer comment ' )])
1335+
1336+ parser = ET .XMLPullParser (events = ('comment' ,))
1337+ self ._feed (parser , "<!-- text here -->\n " )
1338+ self .assert_events (parser , [('comment' , ' text here ' )])
1339+
1340+ def test_events_pi (self ):
1341+ parser = ET .XMLPullParser (events = ('start' , 'pi' , 'end' ))
1342+ self ._feed (parser , "<?pitarget?>\n " )
1343+ self .assert_events (parser , [('pi' , ('pitarget' , '' ))])
1344+ parser = ET .XMLPullParser (events = ('pi' ,))
1345+ self ._feed (parser , "<?pitarget some text ?>\n " )
1346+ self .assert_events (parser , [('pi' , ('pitarget' , 'some text ' ))])
1347+
1348+
13161349 def test_events_sequence (self ):
13171350 # Test that events can be some sequence that's not just a tuple or list
13181351 eventset = {'end' , 'start' }
@@ -2658,6 +2691,31 @@ class DummyBuilder(BaseDummyBuilder):
26582691 parser .feed (self .sample1 )
26592692 self .assertIsNone (parser .close ())
26602693
2694+ def test_treebuilder_comment (self ):
2695+ b = ET .TreeBuilder ()
2696+ self .assertEqual (b .comment ('ctext' ), 'ctext' )
2697+
2698+ b = ET .TreeBuilder (comment_factory = ET .Comment )
2699+ self .assertEqual (b .comment ('ctext' ).tag , ET .Comment )
2700+ self .assertEqual (b .comment ('ctext' ).text , 'ctext' )
2701+
2702+ b = ET .TreeBuilder (comment_factory = len )
2703+ self .assertEqual (b .comment ('ctext' ), len ('ctext' ))
2704+
2705+ def test_treebuilder_pi (self ):
2706+ b = ET .TreeBuilder ()
2707+ self .assertEqual (b .pi ('target' , None ), ('target' , None ))
2708+
2709+ b = ET .TreeBuilder (pi_factory = ET .PI )
2710+ self .assertEqual (b .pi ('target' ).tag , ET .PI )
2711+ self .assertEqual (b .pi ('target' ).text , "target" )
2712+ self .assertEqual (b .pi ('pitarget' , ' text ' ).tag , ET .PI )
2713+ self .assertEqual (b .pi ('pitarget' , ' text ' ).text , "pitarget text " )
2714+
2715+ b = ET .TreeBuilder (pi_factory = lambda target , text : (len (target ), text ))
2716+ self .assertEqual (b .pi ('target' ), (len ('target' ), None ))
2717+ self .assertEqual (b .pi ('pitarget' , ' text ' ), (len ('pitarget' ), ' text ' ))
2718+
26612719 def test_treebuilder_elementfactory_none (self ):
26622720 parser = ET .XMLParser (target = ET .TreeBuilder (element_factory = None ))
26632721 parser .feed (self .sample1 )
@@ -2678,6 +2736,21 @@ def foobar(self, x):
26782736 e = parser .close ()
26792737 self ._check_sample1_element (e )
26802738
2739+ def test_subclass_comment_pi (self ):
2740+ class MyTreeBuilder (ET .TreeBuilder ):
2741+ def foobar (self , x ):
2742+ return x * 2
2743+
2744+ tb = MyTreeBuilder (comment_factory = ET .Comment , pi_factory = ET .PI )
2745+ self .assertEqual (tb .foobar (10 ), 20 )
2746+
2747+ parser = ET .XMLParser (target = tb )
2748+ parser .feed (self .sample1 )
2749+ parser .feed ('<!-- a comment--><?and a pi?>' )
2750+
2751+ e = parser .close ()
2752+ self ._check_sample1_element (e )
2753+
26812754 def test_element_factory (self ):
26822755 lst = []
26832756 def myfactory (tag , attrib ):
0 commit comments