removed is_adaptor check in ItemAdaptor in favour of funcion adaptizer

--HG--
extra : convert_revision : svn%3Ab85faa78-f9eb-468e-a121-7cced6da292c%40971
This commit is contained in:
Ismael Carnales 2009-03-10 13:38:32 +00:00
parent 4093a4b83e
commit f9aa0a6a01
2 changed files with 25 additions and 18 deletions

View File

@ -1,8 +1,15 @@
from scrapy.contrib_exp.newitem.declarative import Declarative
from scrapy.utils.python import get_func_args
def is_adaptor(func):
return hasattr(func, '__call__') and 'adaptor_args' in get_func_args(func)
def adaptize(func):
func_args = get_func_args(func)
if 'adaptor_args' in func_args:
return func
def _adaptor(value, adaptor_args):
return func(value)
return _adaptor
class ItemAdaptor(Declarative):
@ -12,24 +19,24 @@ class ItemAdaptor(Declarative):
field_adaptors = {}
def __classinit__(cls, attrs):
def set_adaptor(cls, name, func):
adaptor = adaptize(func)
cls.field_adaptors[name] = adaptor
# define adaptor as a staticmethod
setattr(cls, name, staticmethod(adaptor))
cls.field_adaptors = cls.field_adaptors.copy()
if cls.item_class:
# set new adaptors
for n, v in attrs.items():
if n in cls.item_class.fields.keys() and is_adaptor(v):
cls.set_adaptor(n, v)
if n in cls.item_class.fields.keys():
set_adaptor(cls, n, v)
# if default_adaptor is set, use it for the unadapted fields
if cls.default_adaptor:
for field in cls.item_class.fields.keys():
if field not in cls.field_adaptors.keys():
cls.set_adaptor(field, cls.default_adaptor.im_func)
@classmethod
def set_adaptor(cls, name, func):
cls.field_adaptors[name] = func
# define adaptor as a staticmethod
setattr(cls, name, staticmethod(func))
set_adaptor(cls, field, cls.default_adaptor.im_func)
def __init__(self, response=None, item=None):
self.item_instance = item if item else self.item_class()

View File

@ -12,7 +12,7 @@ class TestItem(Item):
class TestAdaptor(ItemAdaptor):
item_class = TestItem
name = lambda v, adaptor_args: v.title()
name = lambda v: v.title()
class ItemAdaptorTest(unittest.TestCase):
@ -26,7 +26,7 @@ class ItemAdaptorTest(unittest.TestCase):
def test_defaultadaptor(self):
class DefaultedTestAdaptor(ItemAdaptor):
item_class = TestItem
default_adaptor = lambda v, adaptor_args: v.title()
default_adaptor = lambda v: v.title()
dta = DefaultedTestAdaptor()
assert dta.default_adaptor
@ -35,7 +35,7 @@ class ItemAdaptorTest(unittest.TestCase):
def test_inheritance(self):
class ChildTestAdaptor(TestAdaptor):
url = lambda v, adaptor_args: v.lower()
url = lambda v: v.lower()
ia = ChildTestAdaptor()
assert 'url' in ia.field_adaptors
@ -48,8 +48,8 @@ class ItemAdaptorTest(unittest.TestCase):
self.assertEqual(ia.name, 'Marta')
class ChildChildTestAdaptor(ChildTestAdaptor):
url = lambda v, adaptor_args: v.upper()
summary = lambda v, adaptor_args: v
url = lambda v: v.upper()
summary = lambda v: v
ia = ChildChildTestAdaptor()
assert 'url' in ia.field_adaptors
@ -64,7 +64,7 @@ class ItemAdaptorTest(unittest.TestCase):
def test_staticmethods(self):
class ParentAdaptor(TestAdaptor):
name = adaptor(lambda v, adaptor_args: v)
name = adaptor(lambda v: v)
class ChildAdaptor(ParentAdaptor):
name = adaptor(ParentAdaptor.name, string.swapcase)
@ -76,7 +76,7 @@ class ItemAdaptorTest(unittest.TestCase):
def test_staticdefaults(self):
class ParentAdaptorDefaulted(ItemAdaptor):
item_class = TestItem
default_adaptor = lambda v, adaptor_args: v.title()
default_adaptor = lambda v: v.title()
class ChildAdaptorDefaulted(ParentAdaptorDefaulted):
name = adaptor(ParentAdaptorDefaulted.name, string.swapcase)