From f8affd0c3d4de330bdcc8c87cb2235beed70fd73 Mon Sep 17 00:00:00 2001 From: Ismael Carnales Date: Wed, 18 Feb 2009 13:36:47 +0000 Subject: [PATCH] added fields.py with ItemField class and subclasses based on Django's for new items --HG-- extra : convert_revision : svn%3Ab85faa78-f9eb-468e-a121-7cced6da292c%40865 --- scrapy/trunk/scrapy/contrib/item/fields.py | 83 ++++++++++++++++++++++ 1 file changed, 83 insertions(+) create mode 100644 scrapy/trunk/scrapy/contrib/item/fields.py diff --git a/scrapy/trunk/scrapy/contrib/item/fields.py b/scrapy/trunk/scrapy/contrib/item/fields.py new file mode 100644 index 000000000..e22d842a3 --- /dev/null +++ b/scrapy/trunk/scrapy/contrib/item/fields.py @@ -0,0 +1,83 @@ +import re + +class ItemFieldValueError(Exception): + pass + + +class ItemField(object): + def __init__(self, required=False): + self.required = required + + def to_python(self, value): + pass + + +class BooleanItemField(ItemField): + def to_python(self, value): + if value in (True, False): return value + if value in ('t', 'True', '1'): return True + if value in ('f', 'False', '0'): return False + raise ItemFieldValueError("This value must be either True or False.") + + +ansi_date_re = re.compile(r'^\d{4}-\d{1,2}-\d{1,2}$') + + +class DateItemField(ItemField): + def to_python(self, value): + if value is None: + return value + if isinstance(value, datetime.datetime): + return value.date() + if isinstance(value, datetime.date): + return value + + if not ansi_date_re.search(value): + raise ItemFieldValueError( + "Enter a valid date in YYYY-MM-DD format.") + + year, month, day = map(int, value.split('-')) + try: + return datetime.date(year, month, day) + except ValueError, e: + raise ItemFieldValueError("Invalid date: %s" % str(e)) + + +class DecimalItemField(ItemField): + def to_python(self, value): + if value is None: + return value + try: + return decimal.Decimal(value) + except decimal.InvalidOperation: + raise ItemFieldValueError("This value must be a decimal number.") + + +class FloatItemField(ItemField): + def to_python(self, value): + if value is None: + return value + try: + return float(value) + except (TypeError, ValueError): + raise ItemFieldValueError("This value must be a float.") + + +class IntegerItemField(ItemField): + def to_python(self, value): + if value is None: + return value + try: + return int(value) + except (TypeError, ValueError): + raise ItemFieldValueError("This value must be an integer.") + + +class StringItemField(ItemField): + def to_python(self, value): + if isinstance(value, basestring): + return value + if value is None: + return value + raise ItemFieldValueError("This field must be a string.") +