From 4fc7942118f017c214534d29b18f2f844e68c8cf Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Wed, 7 Dec 2016 11:11:12 +0200 Subject: [PATCH] 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). --- Lib/dbm/dumb.py | 9 +++++++-- Lib/test/test_dbm_dumb.py | 14 ++++++++++++++ Misc/NEWS | 4 +++- 3 files changed, 24 insertions(+), 3 deletions(-) diff --git a/Lib/dbm/dumb.py b/Lib/dbm/dumb.py index 2296dbfd547..c3c4a666011 100644 --- a/Lib/dbm/dumb.py +++ b/Lib/dbm/dumb.py @@ -68,7 +68,7 @@ class _Database(collections.MutableMapping): # Handle the creation self._create(flag) - self._update() + self._update(flag) def _create(self, flag): if flag == 'n': @@ -92,12 +92,17 @@ class _Database(collections.MutableMapping): 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 --git a/Lib/test/test_dbm_dumb.py b/Lib/test/test_dbm_dumb.py index df531d64e48..c2703d7e0b6 100644 --- a/Lib/test/test_dbm_dumb.py +++ b/Lib/test/test_dbm_dumb.py @@ -252,6 +252,20 @@ class DumbDBMTestCase(unittest.TestCase): 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 --git a/Misc/NEWS b/Misc/NEWS index d45f035415b..d0760914815 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -166,7 +166,9 @@ Library ------- - 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.