mirror of https://github.com/scrapy/scrapy.git
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:
parent
4093a4b83e
commit
f9aa0a6a01
|
|
@ -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()
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
Loading…
Reference in New Issue