diff options
| author | Michael Merickel <michael@merickel.org> | 2017-02-19 22:23:54 -0600 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2017-02-19 22:23:54 -0600 |
| commit | d3cb4b5796f341da609fe3397e31be67c68b32c1 (patch) | |
| tree | 7b98d6f63f13063265ba9b9a01906cfff638b73b | |
| parent | 40d71e805bfcf8522c6af71995c05c496f1c4b4f (diff) | |
| parent | 3c04c12d227bd08f248519691418f07070f9c587 (diff) | |
| download | pyramid-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.py | 1 | ||||
| -rw-r--r-- | pyramid/tests/test_config/test_settings.py | 25 |
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): |
