changeset: 105504:a10361dfbf64 user: Serhiy Storchaka date: Wed Dec 07 11:11:12 2016 +0200 files: Lib/dbm/dumb.py Lib/test/test_dbm_dumb.py Misc/NEWS description: Issue #28847: A deprecation warning is now emitted if the index file is missed and recreated in the 'r' and 'w' modes (will be an error in future Python releases). diff -r 2f59be67830c -r a10361dfbf64 Lib/dbm/dumb.py --- a/Lib/dbm/dumb.py Wed Dec 07 11:02:18 2016 +0200 +++ b/Lib/dbm/dumb.py Wed Dec 07 11:11:12 2016 +0200 @@ -68,7 +68,7 @@ # Handle the creation self._create(flag) - self._update() + self._update(flag) def _create(self, flag): if flag == 'n': @@ -92,12 +92,17 @@ f.close() # Read directory file into the in-memory index dict. - def _update(self): + def _update(self, flag): self._index = {} try: f = _io.open(self._dirfile, 'r', encoding="Latin-1") except OSError: self._modified = not self._readonly + if flag not in ('c', 'n'): + import warnings + warnings.warn("The index file is missing, the " + "semantics of the 'c' flag will be used.", + DeprecationWarning, stacklevel=4) else: self._modified = False with f: diff -r 2f59be67830c -r a10361dfbf64 Lib/test/test_dbm_dumb.py --- a/Lib/test/test_dbm_dumb.py Wed Dec 07 11:02:18 2016 +0200 +++ b/Lib/test/test_dbm_dumb.py Wed Dec 07 11:11:12 2016 +0200 @@ -252,6 +252,20 @@ f = dumbdbm.open(_fname, value) f.close() + def test_missing_index(self): + with dumbdbm.open(_fname, 'n') as f: + pass + os.unlink(_fname + '.dir') + for value in ('r', 'w'): + with self.assertWarnsRegex(DeprecationWarning, + "The index file is missing, the " + "semantics of the 'c' flag will " + "be used."): + f = dumbdbm.open(_fname, value) + f.close() + self.assertEqual(os.path.exists(_fname + '.dir'), value == 'w') + self.assertFalse(os.path.exists(_fname + '.bak')) + def test_invalid_flag(self): for flag in ('x', 'rf', None): with self.assertWarnsRegex(DeprecationWarning, diff -r 2f59be67830c -r a10361dfbf64 Misc/NEWS --- a/Misc/NEWS Wed Dec 07 11:02:18 2016 +0200 +++ b/Misc/NEWS Wed Dec 07 11:11:12 2016 +0200 @@ -166,7 +166,9 @@ ------- - Issue #28847: dbm.dumb now supports reading read-only files and no longer - writes the index file when it is not changed. + writes the index file when it is not changed. A deprecation warning is now + emitted if the index file is missed and recreated in the 'r' and 'w' modes + (will be an error in future Python releases). - Issue #27030: Unknown escapes consisting of ``'\'`` and an ASCII letter in re.sub() replacement templates regular expressions now are errors.