Skip to content

Commit 8e3f20a

Browse files
committed
Fix deprecated CrawlerSettings and increase backwards compatibility with .defaults attribute
1 parent af23770 commit 8e3f20a

File tree

2 files changed

+55
-4
lines changed

2 files changed

+55
-4
lines changed

scrapy/settings/__init__.py

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -126,14 +126,28 @@ def __setitem__(this, key, value):
126126
self._overrides = o = _DictProxy()
127127
return o
128128

129+
@property
130+
def defaults(self):
131+
warnings.warn("`Settings.defaults` attribute is deprecated and won't "
132+
"be supported in Scrapy 0.26, use "
133+
"`Settings.set(name, value, priority='default')` instead",
134+
category=ScrapyDeprecationWarning, stacklevel=2)
135+
try:
136+
o = self._defaults
137+
except AttributeError:
138+
class _DictProxy(dict):
139+
def __setitem__(this, key, value):
140+
super(_DictProxy, this).__setitem__(key, value)
141+
self.set(key, value, priority='default')
142+
self._defaults = o = _DictProxy()
143+
return o
144+
129145

130146
class CrawlerSettings(Settings):
131147

132148
def __init__(self, settings_module=None, **kw):
133149
Settings.__init__(self, **kw)
134150
self.settings_module = settings_module
135-
self.overrides = {}
136-
self.defaults = {}
137151

138152
def __getitem__(self, opt_name):
139153
if opt_name in self.overrides:

scrapy/tests/test_settings/__init__.py

Lines changed: 39 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
except ImportError:
77
import mock
88

9-
from scrapy.settings import Settings, SettingsAttribute
9+
from scrapy.settings import Settings, SettingsAttribute, CrawlerSettings
1010
from . import default_settings
1111

1212

@@ -190,7 +190,7 @@ def test_get(self):
190190
self.assertEqual(settings.getdict('TEST_DICT3', {'key1': 5}), {'key1': 5})
191191
self.assertRaises(ValueError, settings.getdict, 'TEST_LIST1')
192192

193-
def test_deprecated_attribute(self):
193+
def test_deprecated_attribute_overrides(self):
194194
self.settings.set('BAR', 'fuz', priority='cmdline')
195195
with warnings.catch_warnings(record=True) as w:
196196
self.settings.overrides['BAR'] = 'foo'
@@ -199,6 +199,43 @@ def test_deprecated_attribute(self):
199199
self.assertEqual(self.settings.overrides.get('BAR'), 'foo')
200200
self.assertIn('BAR', self.settings.overrides)
201201

202+
def test_deprecated_attribute_defaults(self):
203+
self.settings.set('BAR', 'fuz', priority='default')
204+
with warnings.catch_warnings(record=True) as w:
205+
self.settings.defaults['BAR'] = 'foo'
206+
self.assertIn("Settings.defaults", str(w[0].message))
207+
self.assertEqual(self.settings.get('BAR'), 'foo')
208+
self.assertEqual(self.settings.defaults.get('BAR'), 'foo')
209+
self.assertIn('BAR', self.settings.defaults)
210+
211+
212+
class CrawlerSettingsTest(unittest.TestCase):
213+
214+
def test_deprecated_crawlersettings(self):
215+
def _get_settings(settings_dict=None):
216+
settings_module = type('SettingsModuleMock', (object,), settings_dict or {})
217+
return CrawlerSettings(settings_module)
218+
219+
with warnings.catch_warnings(record=True) as w:
220+
settings = _get_settings()
221+
self.assertIn("CrawlerSettings is deprecated", str(w[0].message))
222+
223+
# test_global_defaults
224+
self.assertEqual(settings.getint('DOWNLOAD_TIMEOUT'), 180)
225+
226+
# test_defaults
227+
settings.defaults['DOWNLOAD_TIMEOUT'] = '99'
228+
self.assertEqual(settings.getint('DOWNLOAD_TIMEOUT'), 99)
229+
230+
# test_settings_module
231+
settings = _get_settings({'DOWNLOAD_TIMEOUT': '3'})
232+
self.assertEqual(settings.getint('DOWNLOAD_TIMEOUT'), 3)
233+
234+
# test_overrides
235+
settings = _get_settings({'DOWNLOAD_TIMEOUT': '3'})
236+
settings.overrides['DOWNLOAD_TIMEOUT'] = '15'
237+
self.assertEqual(settings.getint('DOWNLOAD_TIMEOUT'), 15)
238+
202239

203240
if __name__ == "__main__":
204241
unittest.main()

0 commit comments

Comments
 (0)