newitem: support multiple depth inheritance of ItemAdaptor

--HG--
extra : convert_revision : svn%3Ab85faa78-f9eb-468e-a121-7cced6da292c%40929
This commit is contained in:
Daniel Grana 2009-02-25 09:15:28 +00:00
parent 03db659040
commit fdaa2ec3ff
2 changed files with 17 additions and 5 deletions

View File

@ -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

View File

@ -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')