{add,replace}_value: add processors args and allow field_name to be None

* value is first proccessed by processors before passing to input
    processor
  * if field_name is None, values for multiple fields may be
    added/replaced. The keys of the processed value are as the field names
  * add get_value function for the processor logic

Signed-off-by: Ping Yin <pkufranky@gmail.com>
This commit is contained in:
Ping Yin 2010-04-23 01:42:55 +08:00
parent cf35e09d35
commit ddfaf6049f
1 changed files with 33 additions and 4 deletions

View File

@ -25,14 +25,43 @@ class ItemLoader(object):
self.context = context
self._values = defaultdict(list)
def add_value(self, field_name, value):
def add_value(self, field_name, value, *processors):
value = self.get_value(value, *processors)
if not value:
return
if not field_name:
for k,v in value.iteritems():
self._add_value(k, v)
else:
self._add_value(field_name, value)
def replace_value(self, field_name, value, *processors):
value = self.get_value(value, *processors)
if not value:
return
if not field_name:
for k,v in value.iteritems():
self._replace_value(k, v)
else:
self._replace_value(field_name, value)
def _add_value(self, field_name, value):
value = arg_to_iter(value)
processed_value = self._process_input_value(field_name, value)
self._values[field_name] += arg_to_iter(processed_value)
if processed_value:
self._values[field_name] += arg_to_iter(processed_value)
def replace_value(self, field_name, value):
def _replace_value(self, field_name, value):
self._values.pop(field_name, None)
self.add_value(field_name, value)
self._add_value(field_name, value)
def get_value(self, value, *processors):
for proc in processors:
if value is None:
break
proc = wrap_loader_context(proc, self.context)
value = proc(value)
return value
def load_item(self):
item = self.item