From 8aca47e25dd406a39efebc28019db0226b6ec9aa Mon Sep 17 00:00:00 2001 From: Jalil SA Date: Tue, 7 Mar 2023 03:26:59 -0600 Subject: [PATCH] Add setdefault to BaseSettings (#5821) --- scrapy/settings/__init__.py | 7 +++++++ tests/test_settings/__init__.py | 13 +++++++++++++ 2 files changed, 20 insertions(+) diff --git a/scrapy/settings/__init__.py b/scrapy/settings/__init__.py index fde8fdde4..a3b849f7b 100644 --- a/scrapy/settings/__init__.py +++ b/scrapy/settings/__init__.py @@ -293,6 +293,13 @@ class BaseSettings(MutableMapping): else: self.attributes[name].set(value, priority) + def setdefault(self, name, default=None, priority="project"): + if name not in self: + self.set(name, default, priority) + return default + + return self.attributes[name].value + def setdict(self, values, priority="project"): self.update(values, priority) diff --git a/tests/test_settings/__init__.py b/tests/test_settings/__init__.py index 3e8187096..4a577cd8c 100644 --- a/tests/test_settings/__init__.py +++ b/tests/test_settings/__init__.py @@ -65,6 +65,19 @@ class BaseSettingsTest(unittest.TestCase): def setUp(self): self.settings = BaseSettings() + def test_setdefault_not_existing_value(self): + settings = BaseSettings() + value = settings.setdefault("TEST_OPTION", "value") + self.assertEqual(settings["TEST_OPTION"], "value") + self.assertEqual(value, "value") + self.assertIsNotNone(value) + + def test_setdefault_existing_value(self): + settings = BaseSettings({"TEST_OPTION": "value"}) + value = settings.setdefault("TEST_OPTION", None) + self.assertEqual(settings["TEST_OPTION"], "value") + self.assertEqual(value, "value") + def test_set_new_attribute(self): self.settings.set("TEST_OPTION", "value", 0) self.assertIn("TEST_OPTION", self.settings.attributes)