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).
This commit is contained in:
Serhiy Storchaka 2016-12-07 11:11:12 +02:00
parent 43153e4d49
commit 4fc7942118
3 changed files with 24 additions and 3 deletions

View File

@ -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:

View File

@ -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,

View File

@ -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.