diff --git a/docs/experimental/loaders.rst b/docs/experimental/loaders.rst index 017870564..5d72df5a8 100644 --- a/docs/experimental/loaders.rst +++ b/docs/experimental/loaders.rst @@ -404,6 +404,17 @@ one, as the other is just an identity expander. Loader arguments passed to on each expander call. This arguments can be overriden with specific noader arguments passed on each expander call. + Example:: + + >>> def filter_world(x): + ... return None if x == 'world' else x + ... + >>> from scrapy.newitem.loader.expanders import TreeExpander + >>> expander = TreeExpander(filter_world, str.upper) + >>> expander(['hello', 'world', 'this', 'is', 'scrapy']) + ['HELLO, 'THIS', 'IS', 'SCRAPY'] + + IdentityExpander ---------------- diff --git a/scrapy/newitem/loader/expanders.py b/scrapy/newitem/loader/expanders.py index 3e2cb68d4..3e7d77e73 100644 --- a/scrapy/newitem/loader/expanders.py +++ b/scrapy/newitem/loader/expanders.py @@ -26,7 +26,7 @@ class TreeExpander(object): def wrap_with_args(self, f): return lambda x, y: f(x, loader_args=y) - def __call__(self, value, loader_args): + def __call__(self, value, loader_args=None): values = arg_to_iter(value) largs = self.default_loader_args if loader_args: diff --git a/scrapy/tests/test_itemloader.py b/scrapy/tests/test_itemloader.py index fdfb32458..eefcf6421 100644 --- a/scrapy/tests/test_itemloader.py +++ b/scrapy/tests/test_itemloader.py @@ -70,6 +70,14 @@ class LoaderTest(unittest.TestCase): self.assertEqual(il.get_expanded_value('name'), [u'Pepe']) self.assertEqual(il.get_reduced_value('name'), u'Pepe') + def test_tree_expander_filter(self): + def filter_world(x): + return None if x == 'world' else x + + expander = TreeExpander(filter_world, str.upper) + self.assertEqual(expander(['hello', 'world', 'this', 'is', 'scrapy']), + ['HELLO', 'THIS', 'IS', 'SCRAPY']) + def test_tree_expander_multiple_functions(self): class TestLoader(NameLoader): name_exp = TreeExpander(lambda v: v.title(), lambda v: v[:-1])