From 3e8945a477a49bbbff59a6225ee08a964e180fae Mon Sep 17 00:00:00 2001 From: Daniel Grana Date: Wed, 25 Feb 2009 07:39:14 +0000 Subject: [PATCH] newitem: another fix to ItemAdaptor inheritance and tests included --HG-- extra : convert_revision : svn%3Ab85faa78-f9eb-468e-a121-7cced6da292c%40925 --- .../scrapy/contrib_exp/newitem/adaptors.py | 12 +++++----- scrapy/trunk/scrapy/tests/test_itemadaptor.py | 22 +++++++++++++++---- 2 files changed, 25 insertions(+), 9 deletions(-) diff --git a/scrapy/trunk/scrapy/contrib_exp/newitem/adaptors.py b/scrapy/trunk/scrapy/contrib_exp/newitem/adaptors.py index 63ac7d8df..a9c9cfdf2 100644 --- a/scrapy/trunk/scrapy/contrib_exp/newitem/adaptors.py +++ b/scrapy/trunk/scrapy/contrib_exp/newitem/adaptors.py @@ -19,8 +19,6 @@ class ItemAdaptor(object): except AttributeError: pass - if self.__class__.__dict__.has_key(field): - fa[field] = self.__class__.__dict__[field] return fa def __setattr__(self, name, value): @@ -28,13 +26,17 @@ class ItemAdaptor(object): return object.__setattr__(self, name, value) try: - fieldadaptor = self._field_adaptors[name] + bounded_fa = self._field_adaptors[name] + # unbound bounded field adaptor here because use of + # @staticmethod decorator in class definition is not practical + # for ItemAdaptor's + fa = bounded_fa.__func__.__call__ except KeyError: raise AttributeError(name) adaptor_args = {'response': self._response} - final = fieldadaptor(value, adaptor_args=adaptor_args) - setattr(self.item_instance, name, final) + ovalue = fa(value, adaptor_args=adaptor_args) + setattr(self.item_instance, name, ovalue) def __getattribute__(self, name): if name.startswith('_') or name.startswith('item_'): diff --git a/scrapy/trunk/scrapy/tests/test_itemadaptor.py b/scrapy/trunk/scrapy/tests/test_itemadaptor.py index 645e0517d..b552c9370 100644 --- a/scrapy/trunk/scrapy/tests/test_itemadaptor.py +++ b/scrapy/trunk/scrapy/tests/test_itemadaptor.py @@ -8,14 +8,20 @@ class TestItem(Item): name = StringField() url = StringField() +class TestAdaptor(ItemAdaptor): + item_class = TestItem + name = lambda v, adaptor_args: v.title() + class ItemAdaptorTest(unittest.TestCase): - def test_inheritance(self): - class TestAdaptor(ItemAdaptor): - item_class = TestItem - name = lambda v, adaptor_args: v.title() + def test_basic(self): + ia = TestAdaptor() + ia.name = 'marta' + self.assertEqual(ia.item_instance.name, 'Marta') + self.assertEqual(ia.name, 'Marta') + def test_inheritance(self): class ChildTestAdaptor(TestAdaptor): url = lambda v, adaptor_args: v.lower() @@ -24,6 +30,14 @@ class ItemAdaptorTest(unittest.TestCase): assert 'name' in ia._field_adaptors + ia.url = 'HTTP://scrapy.ORG' + self.assertEqual(ia.url, 'http://scrapy.org') + + ia.name = 'marta' + self.assertEqual(ia.name, 'Marta') + + + class TreeadaptTest(unittest.TestCase): def test_1_passtrough(self):