From 16c20f5c4cc03345067d79267756272b3c1a146e Mon Sep 17 00:00:00 2001 From: Ismael Carnales Date: Sun, 1 Mar 2009 14:26:11 +0000 Subject: [PATCH] added default_adaptor to ItemAdaptor --HG-- extra : convert_revision : svn%3Ab85faa78-f9eb-468e-a121-7cced6da292c%40947 --- .../trunk/scrapy/contrib_exp/newitem/adaptors.py | 15 +++++++++++++-- scrapy/trunk/scrapy/tests/test_itemadaptor.py | 10 ++++++++++ 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/scrapy/trunk/scrapy/contrib_exp/newitem/adaptors.py b/scrapy/trunk/scrapy/contrib_exp/newitem/adaptors.py index 6bbe6189b..718bfe001 100644 --- a/scrapy/trunk/scrapy/contrib_exp/newitem/adaptors.py +++ b/scrapy/trunk/scrapy/contrib_exp/newitem/adaptors.py @@ -20,6 +20,7 @@ class ItemAdaptor(object): self.item_instance = item if item else self.item_class() self._response = response self._field_adaptors = self._get_field_adaptors() + self._default_adaptor = self._get_default_adaptor() def _get_field_adaptors(self): fa = {} @@ -31,14 +32,24 @@ class ItemAdaptor(object): return fa + def _get_default_adaptor(self): + try: + return object.__getattribute__(self, 'default_adaptor') + except: + return None + def __setattr__(self, name, value): - if name.startswith('_') or name == 'item_instance': + if name.startswith('_') or name == 'item_instance' \ + or name == 'default_adaptor': return object.__setattr__(self, name, value) try: fa = self._field_adaptors[name] except KeyError: - return setattr(self.item_instance, name, value) + if self._default_adaptor: + fa = self._default_adaptor + else: + return setattr(self.item_instance, name, value) adaptor_args = {'response': self._response} ovalue = fa(value, adaptor_args=adaptor_args) diff --git a/scrapy/trunk/scrapy/tests/test_itemadaptor.py b/scrapy/trunk/scrapy/tests/test_itemadaptor.py index 5a86094bb..8bd4699cb 100644 --- a/scrapy/trunk/scrapy/tests/test_itemadaptor.py +++ b/scrapy/trunk/scrapy/tests/test_itemadaptor.py @@ -23,6 +23,16 @@ class ItemAdaptorTest(unittest.TestCase): self.assertEqual(ia.item_instance.name, 'Marta') self.assertEqual(ia.name, 'Marta') + def test_defaultadaptor(self): + class DefaultedTestAdaptor(ItemAdaptor): + item_class = TestItem + default_adaptor = lambda v, adaptor_args: v.title() + + dta = DefaultedTestAdaptor() + assert dta._default_adaptor + dta.name = 'marta' + assert dta.name == 'Marta' + def test_inheritance(self): class ChildTestAdaptor(TestAdaptor): url = lambda v, adaptor_args: v.lower()