From 33cd058f21d0673253c88cea70388282918992bc Mon Sep 17 00:00:00 2001 From: Cheryl Sabella Date: Tue, 12 Jun 2018 16:37:51 -0400 Subject: bpo-32108: Don't clear configparser values if key is assigned to itself (GH-7588) --- Lib/configparser.py | 3 ++- Lib/test/test_configparser.py | 6 ++++++ Misc/NEWS.d/next/Library/2018-06-10-12-15-26.bpo-32108.iEkvh0.rst | 1 + 3 files changed, 9 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Library/2018-06-10-12-15-26.bpo-32108.iEkvh0.rst diff --git a/Lib/configparser.py b/Lib/configparser.py index ea788ae..4a16101 100644 --- a/Lib/configparser.py +++ b/Lib/configparser.py @@ -963,7 +963,8 @@ class RawConfigParser(MutableMapping): def __setitem__(self, key, value): # To conform with the mapping protocol, overwrites existing values in # the section. - + if key in self and self[key] is value: + return # XXX this is not atomic if read_dict fails at any point. Then again, # no update method in configparser is atomic in this implementation. if key == self.default_section: diff --git a/Lib/test/test_configparser.py b/Lib/test/test_configparser.py index f4df622..f16da11 100644 --- a/Lib/test/test_configparser.py +++ b/Lib/test/test_configparser.py @@ -850,12 +850,18 @@ boolean {0[0]} NO self.assertEqual(set(cf['section3'].keys()), {'named'}) self.assertNotIn('name3', cf['section3']) self.assertEqual(cf.sections(), ['section1', 'section2', 'section3']) + # For bpo-32108, assigning default_section to itself. + cf[self.default_section] = cf[self.default_section] + self.assertNotEqual(set(cf[self.default_section].keys()), set()) cf[self.default_section] = {} self.assertEqual(set(cf[self.default_section].keys()), set()) self.assertEqual(set(cf['section1'].keys()), {'name1'}) self.assertEqual(set(cf['section2'].keys()), {'name22'}) self.assertEqual(set(cf['section3'].keys()), set()) self.assertEqual(cf.sections(), ['section1', 'section2', 'section3']) + # For bpo-32108, assigning section to itself. + cf['section2'] = cf['section2'] + self.assertEqual(set(cf['section2'].keys()), {'name22'}) def test_invalid_multiline_value(self): if self.allow_no_value: diff --git a/Misc/NEWS.d/next/Library/2018-06-10-12-15-26.bpo-32108.iEkvh0.rst b/Misc/NEWS.d/next/Library/2018-06-10-12-15-26.bpo-32108.iEkvh0.rst new file mode 100644 index 0000000..154d884 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2018-06-10-12-15-26.bpo-32108.iEkvh0.rst @@ -0,0 +1 @@ +In configparser, don't clear section when it is assigned to itself. -- cgit v0.12