From ec1a6af04ac767f32f66d3e6fc885a6a16ed20d4 Mon Sep 17 00:00:00 2001 From: Ismael Carnales Date: Tue, 10 Mar 2009 19:35:45 +0000 Subject: [PATCH] added MultiValuedField to newitem --HG-- extra : convert_revision : svn%3Ab85faa78-f9eb-468e-a121-7cced6da292c%40981 --- .../trunk/scrapy/contrib_exp/newitem/fields.py | 17 ++++++++++++++++- scrapy/trunk/scrapy/tests/test_newitem.py | 9 +++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/scrapy/trunk/scrapy/contrib_exp/newitem/fields.py b/scrapy/trunk/scrapy/contrib_exp/newitem/fields.py index 3cd5a7b22..9440efe28 100644 --- a/scrapy/trunk/scrapy/contrib_exp/newitem/fields.py +++ b/scrapy/trunk/scrapy/contrib_exp/newitem/fields.py @@ -3,7 +3,7 @@ import decimal import re -__all__ = ['BooleanField', 'DateField', 'DecimalField', +__all__ = ['MultiValuedField', 'BooleanField', 'DateField', 'DecimalField', 'FloatField', 'IntegerField', 'StringField'] @@ -34,6 +34,21 @@ class Field(object): return ' '.join(value) +class MultiValuedField(Field): + def __init__(self, field_type, required=False, default=None): + self._field = field_type() + super(MultiValuedField, self).__init__(required, default) + + def to_python(self, value): + if value is None: + return [] + else: + return [self._field.to_python(v) for v in value] + + def deiter(self, value): + return value + + class BooleanField(Field): def to_python(self, value): if value in (True, False): return value diff --git a/scrapy/trunk/scrapy/tests/test_newitem.py b/scrapy/trunk/scrapy/tests/test_newitem.py index f31797fd4..b724bd45f 100644 --- a/scrapy/trunk/scrapy/tests/test_newitem.py +++ b/scrapy/trunk/scrapy/tests/test_newitem.py @@ -13,3 +13,12 @@ class NewItemTest(unittest.TestCase): i.name = 'name' assert i.name == 'name' + def test_multi(self): + class TestMultiItem(Item): + name = StringField() + names = MultiValuedField(StringField) + + i = TestMultiItem() + i.name = 'name' + i.names = ['name1', 'name2'] + assert i.names == ['name1', 'name2']