mirror of
				https://github.com/python/cpython.git
				synced 2025-11-03 19:34:08 +00:00 
			
		
		
		
	configparser: preserve section order when using __setitem__ (issue #16820)
				
					
				
			This commit is contained in:
		
							parent
							
								
									e4110dc11f
								
							
						
					
					
						commit
						a2e7acd17d
					
				
					 2 changed files with 28 additions and 1 deletions
				
			
		| 
						 | 
					@ -959,7 +959,8 @@ class RawConfigParser(MutableMapping):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        # XXX this is not atomic if read_dict fails at any point. Then again,
 | 
					        # XXX this is not atomic if read_dict fails at any point. Then again,
 | 
				
			||||||
        # no update method in configparser is atomic in this implementation.
 | 
					        # no update method in configparser is atomic in this implementation.
 | 
				
			||||||
        self.remove_section(key)
 | 
					        if key in self._sections:
 | 
				
			||||||
 | 
					            self._sections[key].clear()
 | 
				
			||||||
        self.read_dict({key: value})
 | 
					        self.read_dict({key: value})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def __delitem__(self, key):
 | 
					    def __delitem__(self, key):
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -797,6 +797,32 @@ boolean {0[0]} NO
 | 
				
			||||||
        self.assertEqual(set(cf.sections()), set())
 | 
					        self.assertEqual(set(cf.sections()), set())
 | 
				
			||||||
        self.assertEqual(set(cf[self.default_section].keys()), {'foo'})
 | 
					        self.assertEqual(set(cf[self.default_section].keys()), {'foo'})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def test_setitem(self):
 | 
				
			||||||
 | 
					        cf = self.fromstring("""
 | 
				
			||||||
 | 
					            [section1]
 | 
				
			||||||
 | 
					            name1 {0[0]} value1
 | 
				
			||||||
 | 
					            [section2]
 | 
				
			||||||
 | 
					            name2 {0[0]} value2
 | 
				
			||||||
 | 
					            [section3]
 | 
				
			||||||
 | 
					            name3 {0[0]} value3
 | 
				
			||||||
 | 
					        """.format(self.delimiters), defaults={"nameD": "valueD"})
 | 
				
			||||||
 | 
					        self.assertEqual(set(cf['section1'].keys()), {'name1', 'named'})
 | 
				
			||||||
 | 
					        self.assertEqual(set(cf['section2'].keys()), {'name2', 'named'})
 | 
				
			||||||
 | 
					        self.assertEqual(set(cf['section3'].keys()), {'name3', 'named'})
 | 
				
			||||||
 | 
					        self.assertEqual(cf['section1']['name1'], 'value1')
 | 
				
			||||||
 | 
					        self.assertEqual(cf['section2']['name2'], 'value2')
 | 
				
			||||||
 | 
					        self.assertEqual(cf['section3']['name3'], 'value3')
 | 
				
			||||||
 | 
					        self.assertEqual(cf.sections(), ['section1', 'section2', 'section3'])
 | 
				
			||||||
 | 
					        cf['section2'] = {'name22': 'value22'}
 | 
				
			||||||
 | 
					        self.assertEqual(set(cf['section2'].keys()), {'name22', 'named'})
 | 
				
			||||||
 | 
					        self.assertEqual(cf['section2']['name22'], 'value22')
 | 
				
			||||||
 | 
					        self.assertNotIn('name2', cf['section2'])
 | 
				
			||||||
 | 
					        self.assertEqual(cf.sections(), ['section1', 'section2', 'section3'])
 | 
				
			||||||
 | 
					        cf['section3'] = {}
 | 
				
			||||||
 | 
					        self.assertEqual(set(cf['section3'].keys()), {'named'})
 | 
				
			||||||
 | 
					        self.assertNotIn('name3', cf['section3'])
 | 
				
			||||||
 | 
					        self.assertEqual(cf.sections(), ['section1', 'section2', 'section3'])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class StrictTestCase(BasicTestCase):
 | 
					class StrictTestCase(BasicTestCase):
 | 
				
			||||||
    config_class = configparser.RawConfigParser
 | 
					    config_class = configparser.RawConfigParser
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue