Skip to content

Commit 882882e

Browse files
committed
add the default parameter to get_output_value
1 parent e6c9d3e commit 882882e

File tree

4 files changed

+60
-3
lines changed

4 files changed

+60
-3
lines changed

Diff for: itemloaders/__init__.py

+5-2
Original file line numberDiff line numberDiff line change
@@ -266,7 +266,7 @@ def load_item(self):
266266

267267
return adapter.item
268268

269-
def get_output_value(self, field_name):
269+
def get_output_value(self, field_name, default=None):
270270
"""
271271
Return the collected values parsed using the output processor, for the
272272
given field. This method doesn't populate or modify the item at all.
@@ -275,7 +275,10 @@ def get_output_value(self, field_name):
275275
proc = wrap_loader_context(proc, self.context)
276276
value = self._values.get(field_name, [])
277277
try:
278-
return proc(value)
278+
result = proc(value)
279+
if not result and default is not None:
280+
return default
281+
return result
279282
except Exception as e:
280283
raise ValueError("Error with output processor: field=%r value=%r error='%s: %s'" %
281284
(field_name, value, type(e).__name__, str(e)))

Diff for: main.py

+6
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
from itemloaders import ItemLoader
2+
from itemloaders.processors import MapCompose, TakeFirst
3+
4+
5+
class CustomItemLoader(ItemLoader):
6+
name_out = TakeFirst()

Diff for: tests/test_base_loader.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ class MyLoader(ItemLoader):
6868
url_out = TakeFirst()
6969

7070
def img_url_out(self, values):
71-
return (self.get_output_value('url') or '') + values[0]
71+
return self.get_output_value('url', '') + values[0]
7272

7373
il = MyLoader(item={})
7474
il.add_value('url', 'http://example.com/')

Diff for: tests/test_loader_initialization.py

+48
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import unittest
22

33
from itemloaders import ItemLoader
4+
from itemloaders.processors import TakeFirst
45

56

67
class InitializationTestMixin:
@@ -77,6 +78,53 @@ def test_get_output_value_list(self):
7778
self.assertIsInstance(loaded_item, self.item_class)
7879
self.assertEqual(loaded_item, dict({'name': ['foo', 'bar']}))
7980

81+
def test_get_output_value_default_singlevalue(self):
82+
"""
83+
The default value should be used only when the returned value is
84+
empty (None, '', etc.) and there is a default value defined
85+
"""
86+
input_item = self.item_class()
87+
il = ItemLoader(item=input_item)
88+
il.default_output_processor = TakeFirst() # make "name" field single
89+
90+
self.assertEqual(il.get_output_value('name'), None)
91+
self.assertEqual(il.get_output_value('name', ''), '')
92+
self.assertEqual(il.get_output_value('name', []), [])
93+
self.assertEqual(il.get_output_value('name', 'foo'), 'foo')
94+
95+
il.add_value('name', '')
96+
self.assertEqual(il.get_output_value('name'), None)
97+
self.assertEqual(il.get_output_value('name', ''), '')
98+
self.assertEqual(il.get_output_value('name', 'foo'), 'foo')
99+
self.assertEqual(il.load_item(), {})
100+
101+
input_item2 = self.item_class()
102+
il2 = ItemLoader(item=input_item2)
103+
il2.default_output_processor = TakeFirst()
104+
il2.add_value('name', 'foo')
105+
self.assertEqual(il2.get_output_value('name'), 'foo')
106+
self.assertEqual(il2.get_output_value('name', 'bar'), 'foo')
107+
self.assertEqual(il2.load_item(), dict({'name': 'foo'}))
108+
109+
def test_get_output_value_default_list(self):
110+
"""
111+
The default value should be used only when the returned value is
112+
empty ([], etc.) and there is a default value defined
113+
"""
114+
input_item = self.item_class()
115+
il = ItemLoader(item=input_item)
116+
il.add_value('name', [])
117+
self.assertEqual(il.get_output_value('name'), [])
118+
self.assertEqual(il.get_output_value('name', 'foo'), 'foo')
119+
self.assertEqual(il.load_item(), {})
120+
121+
input_item2 = self.item_class()
122+
il2 = ItemLoader(item=input_item2)
123+
il2.add_value('name', ['foo', 'bar'])
124+
self.assertEqual(il2.get_output_value('name'), ['foo', 'bar'])
125+
self.assertEqual(il2.get_output_value('name', ['spam']), ['foo', 'bar'])
126+
self.assertEqual(il2.load_item(), dict({'name': ['foo', 'bar']}))
127+
80128
def test_values_single(self):
81129
"""Values from initial item must be added to loader._values"""
82130
input_item = self.item_class(name='foo')

0 commit comments

Comments
 (0)