newitem: another fix to ItemAdaptor inheritance and tests included

--HG--
extra : convert_revision : svn%3Ab85faa78-f9eb-468e-a121-7cced6da292c%40925
This commit is contained in:
Daniel Grana 2009-02-25 07:39:14 +00:00
parent cf3afb9490
commit 3e8945a477
2 changed files with 25 additions and 9 deletions

View File

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

View File

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