From e5e81335e7e3d9d438f77539e7d218943d454b3f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Gra=C3=B1a?= Date: Tue, 8 Jul 2014 05:27:02 -0300 Subject: [PATCH] Use a mutable mapping to proxy deprecated settings.overrides and settings.defaults attribute --- scrapy/settings/__init__.py | 37 +++++++++++++++++++------- scrapy/tests/test_settings/__init__.py | 9 +++++++ 2 files changed, 36 insertions(+), 10 deletions(-) diff --git a/scrapy/settings/__init__.py b/scrapy/settings/__init__.py index 8c3b4f112bf..2dd6a29209e 100644 --- a/scrapy/settings/__init__.py +++ b/scrapy/settings/__init__.py @@ -1,6 +1,7 @@ import six import json import warnings +from collections import MutableMapping from importlib import import_module from scrapy.utils.deprecate import create_deprecated_class @@ -119,11 +120,7 @@ def overrides(self): try: o = self._overrides except AttributeError: - class _DictProxy(dict): - def __setitem__(this, key, value): - super(_DictProxy, this).__setitem__(key, value) - self.set(key, value, priority='cmdline') - self._overrides = o = _DictProxy() + self._overrides = o = _DictProxy(self, 'cmdline') return o @property @@ -135,14 +132,34 @@ def defaults(self): try: o = self._defaults except AttributeError: - class _DictProxy(dict): - def __setitem__(this, key, value): - super(_DictProxy, this).__setitem__(key, value) - self.set(key, value, priority='default') - self._defaults = o = _DictProxy() + self._defaults = o = _DictProxy(self, 'default') return o +class _DictProxy(MutableMapping): + + def __init__(self, settings, priority): + self.o = {} + self.settings = settings + self.priority = priority + + def __len__(self): + return len(self.o) + + def __getitem__(self, k): + return self.o[k] + + def __setitem__(self, k, v): + self.settings.set(k, v, priority=self.priority) + self.o[k] = v + + def __delitem__(self, k): + del self.o[k] + + def __iter__(self, k, v): + return iter(self.o) + + class CrawlerSettings(Settings): def __init__(self, settings_module=None, **kw): diff --git a/scrapy/tests/test_settings/__init__.py b/scrapy/tests/test_settings/__init__.py index 3997b23eb1a..5ffedb1346d 100644 --- a/scrapy/tests/test_settings/__init__.py +++ b/scrapy/tests/test_settings/__init__.py @@ -199,6 +199,15 @@ def test_deprecated_attribute_overrides(self): self.assertEqual(self.settings.overrides.get('BAR'), 'foo') self.assertIn('BAR', self.settings.overrides) + self.settings.overrides.update(BAR='bus') + self.assertEqual(self.settings.get('BAR'), 'bus') + self.assertEqual(self.settings.overrides.get('BAR'), 'bus') + + self.settings.overrides.setdefault('FOO', 'fez') + self.assertEqual(self.settings.get('FOO'), 'fez') + self.assertEqual(self.settings.overrides.get('FOO'), 'fez') + + def test_deprecated_attribute_defaults(self): self.settings.set('BAR', 'fuz', priority='default') with warnings.catch_warnings(record=True) as w: