diff options
author | Łukasz Langa <lukasz@langa.pl> | 2013-01-01 22:45:33 (GMT) |
---|---|---|
committer | Łukasz Langa <lukasz@langa.pl> | 2013-01-01 22:45:33 (GMT) |
commit | a2e7acd17d64cfef3f502473c3b56db8cce24234 (patch) | |
tree | 702d51c468cf9ea9d9e3a17ad02948334aaf8574 | |
parent | e4110dc11f9e90d3a7fcd8f0a5f9ded344f433c6 (diff) | |
download | cpython-a2e7acd17d64cfef3f502473c3b56db8cce24234.zip cpython-a2e7acd17d64cfef3f502473c3b56db8cce24234.tar.gz cpython-a2e7acd17d64cfef3f502473c3b56db8cce24234.tar.bz2 |
configparser: preserve section order when using `__setitem__` (issue #16820)
-rw-r--r-- | Lib/configparser.py | 3 | ||||
-rw-r--r-- | Lib/test/test_cfgparser.py | 26 |
2 files changed, 28 insertions, 1 deletions
diff --git a/Lib/configparser.py b/Lib/configparser.py index 243efec..e5536a0 100644 --- a/Lib/configparser.py +++ b/Lib/configparser.py @@ -959,7 +959,8 @@ class RawConfigParser(MutableMapping): # XXX this is not atomic if read_dict fails at any point. Then again, # 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}) def __delitem__(self, key): diff --git a/Lib/test/test_cfgparser.py b/Lib/test/test_cfgparser.py index 7a9e8a8..cec9b44 100644 --- a/Lib/test/test_cfgparser.py +++ b/Lib/test/test_cfgparser.py @@ -797,6 +797,32 @@ boolean {0[0]} NO self.assertEqual(set(cf.sections()), set()) 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): config_class = configparser.RawConfigParser |