From f9aa0a6a019041820540f997cb3bb87b7c897dc4 Mon Sep 17 00:00:00 2001 From: Ismael Carnales Date: Tue, 10 Mar 2009 13:38:32 +0000 Subject: [PATCH] removed is_adaptor check in ItemAdaptor in favour of funcion adaptizer --HG-- extra : convert_revision : svn%3Ab85faa78-f9eb-468e-a121-7cced6da292c%40971 --- .../scrapy/contrib_exp/newitem/adaptors.py | 29 ++++++++++++------- scrapy/trunk/scrapy/tests/test_itemadaptor.py | 14 ++++----- 2 files changed, 25 insertions(+), 18 deletions(-) diff --git a/scrapy/trunk/scrapy/contrib_exp/newitem/adaptors.py b/scrapy/trunk/scrapy/contrib_exp/newitem/adaptors.py index abe07d339..0edf561d3 100644 --- a/scrapy/trunk/scrapy/contrib_exp/newitem/adaptors.py +++ b/scrapy/trunk/scrapy/contrib_exp/newitem/adaptors.py @@ -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() diff --git a/scrapy/trunk/scrapy/tests/test_itemadaptor.py b/scrapy/trunk/scrapy/tests/test_itemadaptor.py index 4600e425e..abd36e7e9 100644 --- a/scrapy/trunk/scrapy/tests/test_itemadaptor.py +++ b/scrapy/trunk/scrapy/tests/test_itemadaptor.py @@ -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)