diff --git a/scrapy/trunk/scrapy/contrib_exp/newitem/adaptors.py b/scrapy/trunk/scrapy/contrib_exp/newitem/adaptors.py index 6545a2f86..07c1cda50 100644 --- a/scrapy/trunk/scrapy/contrib_exp/newitem/adaptors.py +++ b/scrapy/trunk/scrapy/contrib_exp/newitem/adaptors.py @@ -15,14 +15,16 @@ class ItemAdaptor(object): def _get_field_adaptors(self): def get_field_adaptor(field, cls): if field in cls.__dict__: - fa[field] = cls.__dict__[field] + return cls.__dict__[field] + else: + for class_ in cls.__bases__: + return get_field_adaptor(field, class_) fa = {} for field in self.item_instance._fields.keys(): - for base in self.__class__.__bases__: - get_field_adaptor(field, base) - - get_field_adaptor(field, self.__class__) + adaptor = get_field_adaptor(field, self.__class__) + if adaptor: + fa[field] = adaptor return fa diff --git a/scrapy/trunk/scrapy/tests/test_itemadaptor.py b/scrapy/trunk/scrapy/tests/test_itemadaptor.py index 98e254cbd..c7872fb32 100644 --- a/scrapy/trunk/scrapy/tests/test_itemadaptor.py +++ b/scrapy/trunk/scrapy/tests/test_itemadaptor.py @@ -7,6 +7,7 @@ from scrapy.contrib_exp.newitem import Item, StringField class TestItem(Item): name = StringField() url = StringField() + summary = StringField() class TestAdaptor(ItemAdaptor): item_class = TestItem @@ -30,6 +31,15 @@ class ItemAdaptorTest(unittest.TestCase): assert 'name' in ia._field_adaptors + class ChildChildTestAdaptor(ChildTestAdaptor): + summary = lambda v, adaptor_args: v + + ia = ChildChildTestAdaptor() + assert 'url' in ia._field_adaptors + assert 'name' in ia._field_adaptors + assert 'summary' in ia._field_adaptors + + ia.url = 'HTTP://scrapy.ORG' self.assertEqual(ia.url, 'http://scrapy.org')