]> granicus.if.org Git - python/commitdiff
Issue #28847: dbm.dumb now supports reading read-only files and no longer
authorSerhiy Storchaka <storchaka@gmail.com>
Wed, 7 Dec 2016 09:00:06 +0000 (11:00 +0200)
committerSerhiy Storchaka <storchaka@gmail.com>
Wed, 7 Dec 2016 09:00:06 +0000 (11:00 +0200)
writes the index file when it is not changed.

1  2 
Lib/dbm/dumb.py
Lib/test/support/__init__.py
Lib/test/test_dbm_dumb.py
Misc/NEWS

diff --cc Lib/dbm/dumb.py
Simple merge
Simple merge
index 2d77f078b76b4234653194e8c62339989e7776dd,235ab11b614d6feb3001fe2adacdcb2c80a78e03..df531d64e4889d87795eafa3ecd43de4d5c57fec
@@@ -5,8 -5,8 +5,9 @@@
  import io
  import operator
  import os
+ import stat
  import unittest
 +import warnings
  import dbm.dumb as dumbdbm
  from test import support
  from functools import partial
@@@ -241,24 -235,21 +242,39 @@@ class DumbDBMTestCase(unittest.TestCase
                      pass
              self.assertEqual(stdout.getvalue(), '')
  
 +    def test_warn_on_ignored_flags(self):
 +        for value in ('r', 'w'):
 +            _delete_files()
 +            with self.assertWarnsRegex(DeprecationWarning,
 +                                       "The database file is missing, the "
 +                                       "semantics of the 'c' flag will "
 +                                       "be used."):
 +                f = dumbdbm.open(_fname, value)
 +            f.close()
 +
 +    def test_invalid_flag(self):
 +        for flag in ('x', 'rf', None):
 +            with self.assertWarnsRegex(DeprecationWarning,
 +                                       "Flag must be one of "
 +                                       "'r', 'w', 'c', or 'n'"):
 +                f = dumbdbm.open(_fname, flag)
 +            f.close()
 +
+     @unittest.skipUnless(hasattr(os, 'chmod'), 'test needs os.chmod()')
+     def test_readonly_files(self):
+         with support.temp_dir() as dir:
+             fname = os.path.join(dir, 'db')
+             with dumbdbm.open(fname, 'n') as f:
+                 self.assertEqual(list(f.keys()), [])
+                 for key in self._dict:
+                     f[key] = self._dict[key]
+             os.chmod(fname + ".dir", stat.S_IRUSR)
+             os.chmod(fname + ".dat", stat.S_IRUSR)
+             os.chmod(dir, stat.S_IRUSR|stat.S_IXUSR)
+             with dumbdbm.open(fname, 'r') as f:
+                 self.assertEqual(sorted(f.keys()), sorted(self._dict))
+                 f.close()  # don't write
      def tearDown(self):
          _delete_files()
  
diff --cc Misc/NEWS
index fe8cb97ec1e9a0d3f618a6136e908540b516072d,07897d7bb33bfc00a149a575d682d76030b4576c..7277b2cb30990f9618cebf3f831946b1e9a2c8e6
+++ b/Misc/NEWS
@@@ -10,108 -10,113 +10,111 @@@ What's New in Python 3.6.1 release cand
  Core and Builtins
  -----------------
  
 -- Issue #28648: Fixed crash in Py_DecodeLocale() in debug build on Mac OS X
 -  when decode astral characters.  Patch by Xiang Zhang.
 +Library
 +-------
  
 -- Issue #19398: Extra slash no longer added to sys.path components in case of
 -  empty compile-time PYTHONPATH components.
++- Issue #28847: dbm.dumb now supports reading read-only files and no longer
++  writes the index file when it is not changed.
 -- Issue #28426: Fixed potential crash in PyUnicode_AsDecodedObject() in debug
 -  build.
  
 -- Issue #23782: Fixed possible memory leak in _PyTraceback_Add() and exception
 -  loss in PyTraceBack_Here().
 +What's New in Python 3.6.0 release candidate 1
 +==============================================
  
 -- Issue #28379: Added sanity checks and tests for PyUnicode_CopyCharacters().
 -  Patch by Xiang Zhang.
 +*Release date: 2016-12-06*
  
 -- Issue #28376: The type of long range iterator is now registered as Iterator.
 -  Patch by Oren Milman.
 +Core and Builtins
 +-----------------
  
 -- Issue #28376: The constructor of range_iterator now checks that step is not 0.
 -  Patch by Oren Milman.
 +- Issue #23722: Rather than silently producing a class that doesn't support
 +  zero-argument ``super()`` in methods, failing to pass the new
 +  ``__classcell__`` namespace entry up to ``type.__new__`` now results in a
 +  ``DeprecationWarning`` and a class that supports zero-argument ``super()``.
  
 -- Issue #26906: Resolving special methods of uninitialized type now causes
 -  implicit initialization of the type instead of a fail.
 +- Issue #28797: Modifying the class __dict__ inside the __set_name__ method of
 +  a descriptor that is used inside that class no longer prevents calling the
 +  __set_name__ method of other descriptors.
  
 -- Issue #18287: PyType_Ready() now checks that tp_name is not NULL.
 -  Original patch by Niklas Koep.
 +- Issue #28782: Fix a bug in the implementation ``yield from`` when checking
 +  if the next instruction is YIELD_FROM. Regression introduced by WORDCODE
 +  (issue #26647).
  
 -- Issue #24098: Fixed possible crash when AST is changed in process of
 -  compiling it.
 +Library
 +-------
  
 -- Issue #28350: String constants with null character no longer interned.
 +- Issue #27030: Unknown escapes in re.sub() replacement template are allowed
 +  again.  But they still are deprecated and will be disabled in 3.7.
  
 -- Issue #26617: Fix crash when GC runs during weakref callbacks.
 +- Issue #28835: Fix a regression introduced in warnings.catch_warnings():
 +  call warnings.showwarning() if it was overriden inside the context manager.
  
 -- Issue #27942: String constants now interned recursively in tuples and frozensets.
 +- Issue #27172: To assist with upgrades from 2.7, the previously documented
 +  deprecation of ``inspect.getfullargspec()`` has been reversed. This decision
 +  may be revisited again after the Python 2.7 branch is no longer officially
 +  supported.
  
 -- Issue #21578: Fixed misleading error message when ImportError called with
 -  invalid keyword args.
 +- Issue #24142: Reading a corrupt config file left configparser in an
 +  invalid state.  Original patch by Florian Höch.
  
 -- Issue #28203: Fix incorrect type in error message from
 -  ``complex(1.0, {2:3})``. Patch by Soumya Sharma.
 +- Issue #28843: Fix asyncio C Task to handle exceptions __traceback__.
  
 -- Issue #27955: Fallback on reading /dev/urandom device when the getrandom()
 -  syscall fails with EPERM, for example when blocked by SECCOMP.
 +C API
 +-----
  
 -- Issue #28131: Fix a regression in zipimport's compile_source().  zipimport
 -  should use the same optimization level as the interpreter.
 +- Issue #28808: PyUnicode_CompareWithASCIIString() now never raises exceptions.
  
 -- Issue #25221: Fix corrupted result from PyLong_FromLong(0) when
 -  Python is compiled with NSMALLPOSINTS = 0.
 +Documentation
 +-------------
  
 -- Issue #25758: Prevents zipimport from unnecessarily encoding a filename
 -  (patch by Eryk Sun)
 +- Issue #23722: The data model reference and the porting section in the What's
 +  New guide now cover the additional ``__classcell__`` handling needed for
 +  custom metaclasses to fully support PEP 487 and zero-argument ``super()``.
  
 -- Issue #28189: dictitems_contains no longer swallows compare errors.
 -  (Patch by Xiang Zhang)
 +Tools/Demos
 +-----------
  
 -- Issue #27812: Properly clear out a generator's frame's backreference to the
 -  generator to prevent crashes in frame.clear().
 +- Issue #28023: Fix python-gdb.py didn't support new dict implementation.
  
 -- Issue #27811: Fix a crash when a coroutine that has not been awaited is
 -  finalized with warnings-as-errors enabled.
  
 -- Issue #27587: Fix another issue found by PVS-Studio: Null pointer check
 -  after use of 'def' in _PyState_AddModule().
 -  Initial patch by Christian Heimes.
 +What's New in Python 3.6.0 beta 4
 +=================================
  
 -- Issue #26020: set literal evaluation order did not match documented behaviour.
 +*Release date: 2016-11-21*
  
 -- Issue #27782: Multi-phase extension module import now correctly allows the
 -  ``m_methods`` field to be used to add module level functions to instances
 -  of non-module types returned from ``Py_create_mod``. Patch by Xiang Zhang.
 +Core and Builtins
 +-----------------
  
 -- Issue #27936: The round() function accepted a second None argument
 -  for some types but not for others.  Fixed the inconsistency by
 -  accepting None for all numeric types.
 +- Issue #28532: Show sys.version when -V option is supplied twice.
  
 -- Issue #27487: Warn if a submodule argument to "python -m" or
 -  runpy.run_module() is found in sys.modules after parent packages are
 -  imported, but before the submodule is executed.
 +- Issue #27100: The with-statement now checks for __enter__ before it
 +  checks for __exit__.  This gives less confusing error messages when
 +  both methods are missing. Patch by Jonathan Ellington.
  
 -- Issue #27558: Fix a SystemError in the implementation of "raise" statement.
 -  In a brand new thread, raise a RuntimeError since there is no active
 -  exception to reraise. Patch written by Xiang Zhang.
 +- Issue #28746: Fix the set_inheritable() file descriptor method on platforms
 +  that do not have the ioctl FIOCLEX and FIONCLEX commands.
  
 -- Issue #27419: Standard __import__() no longer look up "__import__" in globals
 -  or builtins for importing submodules or "from import".  Fixed handling an
 -  error of non-string package name.
 +- Issue #26920: Fix not getting the locale's charset upon initializing the
 +  interpreter, on platforms that do not have langinfo.
  
 -- Issue #27083: Respect the PYTHONCASEOK environment variable under Windows.
 +- Issue #28648: Fixed crash in Py_DecodeLocale() in debug build on Mac OS X
 +  when decode astral characters.  Patch by Xiang Zhang.
  
 -- Issue #27514: Make having too many statically nested blocks a SyntaxError
 -  instead of SystemError.
 +- Issue #19398: Extra slash no longer added to sys.path components in case of
 +  empty compile-time PYTHONPATH components.
  
 -- Issue #27473: Fixed possible integer overflow in bytes and bytearray
 -  concatenations.  Patch by Xiang Zhang.
 +- Issue #28665:  Improve speed of the STORE_DEREF opcode by 40%.
  
 -- Issue #27507: Add integer overflow check in bytearray.extend().  Patch by
 -  Xiang Zhang.
 +- Issue #28583: PyDict_SetDefault didn't combine split table when needed.
 +  Patch by Xiang Zhang.
  
 -- Issue #27581: Don't rely on wrapping for overflow check in
 -  PySequence_Tuple().  Patch by Xiang Zhang.
 +- Issue #27243: Change PendingDeprecationWarning -> DeprecationWarning.
 +  As it was agreed in the issue, __aiter__ returning an awaitable
 +  should result in PendingDeprecationWarning in 3.5 and in
 +  DeprecationWarning in 3.6.
  
 -- Issue #27443: __length_hint__() of bytearray iterators no longer return a
 -  negative integer for a resized bytearray.
 +- Issue #26182: Fix a refleak in code that raises DeprecationWarning.
  
 -- Issue #27942: Fix memory leak in codeobject.c
 +- Issue #28721: Fix asynchronous generators aclose() and athrow() to
 +  handle StopAsyncIteration propagation properly.
  
  Library
  -------