From 03349ff7ec56afc8460bfda68231ccd6aa2a0be6 Mon Sep 17 00:00:00 2001 From: Jakob de Maeyer Date: Tue, 27 Oct 2015 13:56:14 +0100 Subject: [PATCH] Fix backwards-compatibility for users who explicitly set _BASE settings --- scrapy/settings/__init__.py | 15 +++++++++++---- tests/test_settings/__init__.py | 14 ++++++++++---- 2 files changed, 21 insertions(+), 8 deletions(-) diff --git a/scrapy/settings/__init__.py b/scrapy/settings/__init__.py index 3ae2187ae62..3cff0613ba6 100644 --- a/scrapy/settings/__init__.py +++ b/scrapy/settings/__init__.py @@ -116,9 +116,9 @@ def get(self, name, default=None): def getbool(self, name, default=False): """ Get a setting value as a boolean. - + ``1``, ``'1'``, and ``True`` return ``True``, while ``0``, ``'0'``, - ``False`` and ``None`` return ``False``. + ``False`` and ``None`` return ``False``. For example, settings populated through environment variables set to ``'0'`` will return ``False`` when using this method. @@ -203,8 +203,15 @@ def _getcomposite(self, name): if basename in self: warnings.warn('_BASE settings are deprecated.', category=ScrapyDeprecationWarning) - compsett = BaseSettings(self[name + "_BASE"], priority='default') - compsett.update(self[name]) + # When users defined a _BASE setting, they explicitly don't want to + # use any of Scrapy's defaults. Therefore, we only use these entries + # from self[name] (where the defaults now live) that have a priority + # higher than 'default' + compsett = BaseSettings(self[basename], priority='default') + for k in self[name]: + prio = self[name].getpriority(k) + if prio > get_settings_priority('default'): + compsett.set(k, self[name][k], prio) return compsett else: return self[name] diff --git a/tests/test_settings/__init__.py b/tests/test_settings/__init__.py index bb38964eff6..5fed4797db7 100644 --- a/tests/test_settings/__init__.py +++ b/tests/test_settings/__init__.py @@ -252,12 +252,18 @@ def test_getpriority(self): def test_getcomposite(self): s = BaseSettings({'TEST_BASE': {1: 1, 2: 2}, - 'TEST': BaseSettings({1: 10}), - 'HASNOBASE': BaseSettings({1: 1})}) + 'TEST': BaseSettings({1: 10, 3: 30}, 'default'), + 'HASNOBASE': BaseSettings({1: 1}, 'default')}) + s['TEST'].set(4, 4, priority='project') + # When users specify a _BASE setting they explicitly don't want to use + # Scrapy's defaults, so we don't want to see anything that has a + # 'default' priority from TEST cs = s._getcomposite('TEST') - self.assertEqual(len(cs), 2) - self.assertEqual(cs[1], 10) + print cs + self.assertEqual(len(cs), 3) + self.assertEqual(cs[1], 1) self.assertEqual(cs[2], 2) + self.assertEqual(cs[4], 4) cs = s._getcomposite('HASNOBASE') self.assertEqual(len(cs), 1) self.assertEqual(cs[1], 1)