diff options
-rw-r--r-- | Lib/configparser.py | 3 | ||||
-rw-r--r-- | Lib/test/test_cfgparser.py | 26 | ||||
-rw-r--r-- | Lib/test/test_os.py | 9 | ||||
-rw-r--r-- | Misc/NEWS | 11 | ||||
-rw-r--r-- | Modules/posixmodule.c | 10 |
5 files changed, 55 insertions, 4 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 diff --git a/Lib/test/test_os.py b/Lib/test/test_os.py index 5b67da1..bd799b2 100644 --- a/Lib/test/test_os.py +++ b/Lib/test/test_os.py @@ -1057,6 +1057,15 @@ if sys.platform != 'win32': f = open(os.path.join(self.dir, fn), 'rb') f.close() + @unittest.skipUnless(hasattr(os, 'statvfs'), + "need os.statvfs()") + def test_statvfs(self): + # issue #9645 + for fn in self.unicodefn: + # should not fail with file not found error + fullname = os.path.join(self.dir, fn) + os.statvfs(fullname) + def test_stat(self): for fn in self.unicodefn: os.stat(os.path.join(self.dir, fn)) @@ -191,6 +191,17 @@ Library - Issue #16541: tk_setPalette() now works with keyword arguments. +- Issue #16820: In configparser, `parser.popitem()` no longer raises ValueError. + This makes `parser.clean()` work correctly. + +- Issue #16820: In configparser, ``parser['section'] = {}`` now preserves + section order within the parser. This makes `parser.update()` preserve section + order as well. + +- Issue #9644: Fix the encoding used by os.statvfs(): use the filesystem + encoding with the surrogateescape error handler, instead of UTF-8 in strict + mode. + - Issue #16819: IDLE method completion now correctly works for bytes literals. - Issue #9586: Redefine SEM_FAILED on MacOSX to keep compiler happy. diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c index 0d2919b..e7e5305 100644 --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -6463,18 +6463,22 @@ Perform a statvfs system call on the given path."); static PyObject * posix_statvfs(PyObject *self, PyObject *args) { + PyObject *opath, *result = NULL; char *path; int res; struct statvfs st; - if (!PyArg_ParseTuple(args, "s:statvfs", &path)) + if (!PyArg_ParseTuple(args, "O&:statvfs", PyUnicode_FSConverter, &opath)) return NULL; + path = PyBytes_AS_STRING(opath); Py_BEGIN_ALLOW_THREADS res = statvfs(path, &st); Py_END_ALLOW_THREADS if (res != 0) - return posix_error_with_filename(path); + return posix_error_with_allocated_filename(opath); - return _pystatvfs_fromstructstatvfs(st); + result = _pystatvfs_fromstructstatvfs(st); + Py_DECREF(opath); + return result; } #endif /* HAVE_STATVFS */ |