diff --git a/scrapy/contrib_exp/newitem/fields.py b/scrapy/contrib_exp/newitem/fields.py index 54da4a86e..63bd6e777 100644 --- a/scrapy/contrib_exp/newitem/fields.py +++ b/scrapy/contrib_exp/newitem/fields.py @@ -6,7 +6,7 @@ import time class BaseField(object): def __init__(self, default=None): - self.default = default or self.to_python(None) + self._default = self.to_python(default) if default is not None else None def to_python(self, value): """ @@ -15,6 +15,10 @@ class BaseField(object): """ return value + def get_default(self): + """Returns the default value for the field.""" + return self._default + class MultiValuedField(BaseField): def __init__(self, field_type, default=None): diff --git a/scrapy/contrib_exp/newitem/models.py b/scrapy/contrib_exp/newitem/models.py index 867894612..afa1105ce 100644 --- a/scrapy/contrib_exp/newitem/models.py +++ b/scrapy/contrib_exp/newitem/models.py @@ -44,7 +44,7 @@ class Item(ScrapedItem): return self._values[name] except KeyError: try: - return self.fields[name].default + return self.fields[name].get_default() except KeyError: raise AttributeError(name) @@ -54,3 +54,4 @@ class Item(ScrapedItem): """ values = dict((field, getattr(self, field)) for field in self.fields) return "%s(%s)" % (self.__class__.__name__, repr(values)) + diff --git a/scrapy/tests/test_newitem.py b/scrapy/tests/test_newitem.py index 3092de758..a7dea5fee 100644 --- a/scrapy/tests/test_newitem.py +++ b/scrapy/tests/test_newitem.py @@ -63,6 +63,13 @@ class NewItemTest(unittest.TestCase): i = TestItem() assert i.name == u'John' + def test_wrong_default(self): + def set_wrong_default(): + class TestItem(Item): + name = fields.TextField(default=3) + + self.assertRaises(ValueError, set_wrong_default) + def test_to_python_iter(self): class TestItem(Item): name = fields.TextField() @@ -117,7 +124,7 @@ class NewItemFieldsTest(unittest.TestCase): def test_base_field(self): f = fields.BaseField() - assert f.default == None + assert f.get_default() is None assert f.to_python(1) == 1 def test_boolean_field(self):