summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Merickel <michael@merickel.org>2017-02-19 22:23:54 -0600
committerGitHub <noreply@github.com>2017-02-19 22:23:54 -0600
commitd3cb4b5796f341da609fe3397e31be67c68b32c1 (patch)
tree7b98d6f63f13063265ba9b9a01906cfff638b73b
parent40d71e805bfcf8522c6af71995c05c496f1c4b4f (diff)
parent3c04c12d227bd08f248519691418f07070f9c587 (diff)
downloadpyramid-d3cb4b5796f341da609fe3397e31be67c68b32c1.tar.gz
pyramid-d3cb4b5796f341da609fe3397e31be67c68b32c1.tar.bz2
pyramid-d3cb4b5796f341da609fe3397e31be67c68b32c1.zip
Merge pull request #2959 from Natim/2958-do-not-update-the-settings-parameter
The Configurator object should not alter the input settings dict object.
-rw-r--r--pyramid/config/settings.py1
-rw-r--r--pyramid/tests/test_config/test_settings.py25
2 files changed, 23 insertions, 3 deletions
diff --git a/pyramid/config/settings.py b/pyramid/config/settings.py
index 26eb48951..52b30db81 100644
--- a/pyramid/config/settings.py
+++ b/pyramid/config/settings.py
@@ -56,6 +56,7 @@ def Settings(d=None, _environ_=os.environ, **kw):
keyword args)."""
if d is None:
d = {}
+ d = dict(d)
d.update(**kw)
eget = _environ_.get
diff --git a/pyramid/tests/test_config/test_settings.py b/pyramid/tests/test_config/test_settings.py
index 2dbe9b1bb..a3afd24e7 100644
--- a/pyramid/tests/test_config/test_settings.py
+++ b/pyramid/tests/test_config/test_settings.py
@@ -1,5 +1,6 @@
import unittest
+
class TestSettingsConfiguratorMixin(unittest.TestCase):
def _makeOne(self, *arg, **kw):
from pyramid.config import Configurator
@@ -11,12 +12,12 @@ class TestSettingsConfiguratorMixin(unittest.TestCase):
settings = config._set_settings(None)
self.assertTrue(settings)
- def test__set_settings_uses_original_dict(self):
+ def test__set_settings_does_not_uses_original_dict(self):
config = self._makeOne()
dummy = {}
result = config._set_settings(dummy)
- self.assertTrue(dummy is result)
- self.assertEqual(dummy['pyramid.debug_all'], False)
+ self.assertTrue(dummy is not result)
+ self.assertNotIn('pyramid.debug_all', dummy)
def test__set_settings_as_dictwithvalues(self):
config = self._makeOne()
@@ -63,6 +64,24 @@ class TestSettingsConfiguratorMixin(unittest.TestCase):
settings = reg.getUtility(ISettings)
self.assertEqual(settings['a'], 1)
+ def test_settings_parameter_dict_is_never_updated(self):
+ class ReadOnlyDict(dict):
+ def __readonly__(self, *args, **kwargs): # pragma: no cover
+ raise RuntimeError("Cannot modify ReadOnlyDict")
+ __setitem__ = __readonly__
+ __delitem__ = __readonly__
+ pop = __readonly__
+ popitem = __readonly__
+ clear = __readonly__
+ update = __readonly__
+ setdefault = __readonly__
+ del __readonly__
+
+ initial = ReadOnlyDict()
+ config = self._makeOne(settings=initial)
+ config._set_settings({'a': '1'})
+
+
class TestSettings(unittest.TestCase):
def _getTargetClass(self):