From bf480015f40b3d539c0591ef6aed02e47ffae267 Mon Sep 17 00:00:00 2001 From: Martin Olveyra Date: Tue, 19 Mar 2013 16:02:53 -0200 Subject: [PATCH] added support generic python literals in settings, and for explicitly interpret a setting value as dict --- scrapy/settings/__init__.py | 10 ++++++++++ scrapy/tests/test_settings.py | 8 ++++++++ 2 files changed, 18 insertions(+) diff --git a/scrapy/settings/__init__.py b/scrapy/settings/__init__.py index be81bfd9d..345c3c133 100644 --- a/scrapy/settings/__init__.py +++ b/scrapy/settings/__init__.py @@ -1,3 +1,4 @@ +import json from . import default_settings @@ -37,6 +38,15 @@ class Settings(object): else: return str(value).split(',') + def getdict(self, name, default=None): + value = self.get(name) + if value is None: + return default or {} + if isinstance(value, basestring): + value = json.loads(value) + if isinstance(value, dict): + return value + raise ValueError("Cannot convert value for setting '%s' to dict: '%s'" % (name, value)) class CrawlerSettings(Settings): diff --git a/scrapy/tests/test_settings.py b/scrapy/tests/test_settings.py index 608afb045..68d30ccc6 100644 --- a/scrapy/tests/test_settings.py +++ b/scrapy/tests/test_settings.py @@ -21,6 +21,8 @@ class SettingsTest(unittest.TestCase): 'TEST_LIST1': ['one', 'two'], 'TEST_LIST2': 'one,two', 'TEST_STR': 'value', + 'TEST_DICT1': {'key1': 'val1', 'ke2': 3}, + 'TEST_DICT2': '{"key1": "val1", "ke2": 3}', }) assert settings.getbool('TEST_ENABLED1') is True assert settings.getbool('TEST_ENABLED2') is True @@ -47,6 +49,12 @@ class SettingsTest(unittest.TestCase): self.assertEqual(settings['TEST_STRx'], None) self.assertEqual(settings.get('TEST_STRx'), None) self.assertEqual(settings.get('TEST_STRx', 'default'), 'default') + self.assertEqual(settings.getdict('TEST_DICT1'), {'key1': 'val1', 'ke2': 3}) + self.assertEqual(settings.getdict('TEST_DICT2'), {'key1': 'val1', 'ke2': 3}) + self.assertEqual(settings.getdict('TEST_DICT3'), {}) + self.assertEqual(settings.getdict('TEST_DICT3', {'key1': 5}), {'key1': 5}) + self.assertRaises(ValueError, settings.getdict, 'TEST_LIST1') + class CrawlerSettingsTest(unittest.TestCase):