added newitem with new item model and fields

--HG--
extra : convert_revision : svn%3Ab85faa78-f9eb-468e-a121-7cced6da292c%40867
This commit is contained in:
Ismael Carnales 2009-02-18 18:38:26 +00:00
parent 918908db8e
commit 3039453148
3 changed files with 62 additions and 2 deletions

View File

@ -0,0 +1,2 @@
from scrapy.contrib.newitem.models import Item
from scrapy.contrib.newitem.fields import *

View File

@ -1,15 +1,31 @@
import datetime
import decimal
import re
class ItemFieldValueError(Exception):
pass
class ItemField(object):
def __init__(self, required=False):
def __init__(self, required=False, default=None):
self.required = required
self.default = default
def to_python(self, value):
pass
"""
Converts the input value into the expected Python data type.
Subclasses should override this.
"""
return value
def from_list(self, list):
"Converts the input list into the expected Python data type."
return self.to_python(list.join(''))
def default_value(self):
"Returns the default value for this field"
return self.default or self.to_python(None)
class BooleanItemField(ItemField):

View File

@ -0,0 +1,42 @@
from scrapy.contrib.newitem.fields import ItemField
class Item(object):
"""
This is the base class for all scraped items.
"""
def __init__(self):
self._values = {}
self._fields = self._get_fields()
def _get_fields(self):
return dict(i for i in self.__class__.__dict__.iteritems() if
isinstance(i[1], ItemField))
def __setattr__(self, name, value):
if not name.startswith('_') and name in self._fields.keys():
self._values[name] = self._fields[name].to_python(value)
else:
# for now setting values that are not fields is permitted
object.__setattr__(self, name, value)
def __getattribute__(self, name):
if not name.startswith('_') and name in self._fields.keys():
try:
return self._values[name]
except KeyError:
# what to to in this case?
# maybe return a default value:
# return self._fields[name].default_value()
return None
else:
return object.__getattribute__(self, name)
def __repr__(self):
"""
Generate the following format so that items can be deserialized
easily: ClassName({'attrib': value, ...})
"""
reprdict = dict((field, getattr(self, field)) for field in self._fields)
return "%s(%s)" % (self.__class__.__name__, repr(reprdict))