From 3bbad369984020f7900e729191e0a04a8582270f Mon Sep 17 00:00:00 2001 From: Pablo Hoffman Date: Tue, 22 Jun 2010 14:00:31 -0300 Subject: [PATCH] Raise when trying to set an item field value using setattr api, and added tests. --- scrapy/item.py | 8 +++++++- scrapy/tests/test_item.py | 14 ++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/scrapy/item.py b/scrapy/item.py index bfa05774a..fa15738b4 100644 --- a/scrapy/item.py +++ b/scrapy/item.py @@ -65,9 +65,15 @@ class DictItem(DictMixin, BaseItem): def __getattr__(self, name): if name in self.fields: - raise AttributeError("Use [%r] to access item field value" % name) + raise AttributeError("Use item[%r] to get field value" % name) raise AttributeError(name) + def __setattr__(self, name, value): + if not name.startswith('_'): + raise AttributeError("Use item[%r] = %r to set field value" % \ + (name, value)) + super(DictItem, self).__setattr__(name, value) + def keys(self): return self._values.keys() diff --git a/scrapy/tests/test_item.py b/scrapy/tests/test_item.py index 2f51395bd..250a56335 100644 --- a/scrapy/tests/test_item.py +++ b/scrapy/tests/test_item.py @@ -71,6 +71,20 @@ class ItemTest(unittest.TestCase): i._private = 'test' self.assertEqual(i._private, 'test') + def test_raise_getattr(self): + class TestItem(Item): + name = Field() + + i = TestItem() + self.assertRaises(AttributeError, getattr, i, 'name') + + def test_raise_setattr(self): + class TestItem(Item): + name = Field() + + i = TestItem() + self.assertRaises(AttributeError, setattr, i, 'name', 'john') + def test_custom_methods(self): class TestItem(Item): name = Field()