Skip to content

Commit afe7d06

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

File tree

3 files changed

+55
-3
lines changed

3 files changed

+55
-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,10 +275,13 @@ 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)
279279
except Exception as e:
280280
raise ValueError("Error with output processor: field=%r value=%r error='%s: %s'" %
281281
(field_name, value, type(e).__name__, str(e)))
282+
if not result and default is not None:
283+
return default
284+
return result
282285

283286
def get_collected_values(self, field_name):
284287
"""Return the collected values for the given field."""

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

+49
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,54 @@ 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', []), [])
99+
self.assertEqual(il.get_output_value('name', 'foo'), 'foo')
100+
self.assertEqual(il.load_item(), {})
101+
102+
input_item2 = self.item_class()
103+
il2 = ItemLoader(item=input_item2)
104+
il2.default_output_processor = TakeFirst()
105+
il2.add_value('name', 'foo')
106+
self.assertEqual(il2.get_output_value('name'), 'foo')
107+
self.assertEqual(il2.get_output_value('name', 'bar'), 'foo')
108+
self.assertEqual(il2.load_item(), dict({'name': 'foo'}))
109+
110+
def test_get_output_value_default_list(self):
111+
"""
112+
The default value should be used only when the returned value is
113+
empty ([], etc.) and there is a default value defined
114+
"""
115+
input_item = self.item_class()
116+
il = ItemLoader(item=input_item)
117+
il.add_value('name', [])
118+
self.assertEqual(il.get_output_value('name'), [])
119+
self.assertEqual(il.get_output_value('name', 'foo'), 'foo')
120+
self.assertEqual(il.load_item(), {})
121+
122+
input_item2 = self.item_class()
123+
il2 = ItemLoader(item=input_item2)
124+
il2.add_value('name', ['foo', 'bar'])
125+
self.assertEqual(il2.get_output_value('name'), ['foo', 'bar'])
126+
self.assertEqual(il2.get_output_value('name', ['spam']), ['foo', 'bar'])
127+
self.assertEqual(il2.load_item(), dict({'name': ['foo', 'bar']}))
128+
80129
def test_values_single(self):
81130
"""Values from initial item must be added to loader._values"""
82131
input_item = self.item_class(name='foo')

0 commit comments

Comments
 (0)