mirror of https://github.com/scrapy/scrapy.git
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:
parent
cf3afb9490
commit
3e8945a477
|
|
@ -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_'):
|
||||
|
|
|
|||
|
|
@ -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):
|
||||
|
|
|
|||
Loading…
Reference in New Issue