added declarative module for declarative style classses and make Item use it

--HG--
extra : convert_revision : svn%3Ab85faa78-f9eb-468e-a121-7cced6da292c%40962
This commit is contained in:
Ismael Carnales 2009-03-03 21:12:37 +00:00
parent 0d47fdf6e8
commit 60de639434
2 changed files with 32 additions and 8 deletions

View File

@ -0,0 +1,18 @@
class DeclarativeMeta(type):
"""Metaclass for declarative objects"""
def __new__(meta, class_name, bases, attrs):
cls = type.__new__(meta, class_name, bases, attrs)
cls.__classinit__.im_func(cls, attrs)
return cls
class Declarative(object):
"""Base class for declarative objects"""
__metaclass__ = DeclarativeMeta
def __classinit__(cls, attrs):
"""Override this method to initialize your class"""
pass

View File

@ -1,19 +1,25 @@
from scrapy.item import ScrapedItem
from scrapy.contrib_exp.newitem.declarative import Declarative
from scrapy.contrib_exp.newitem.fields import Field
class Item(ScrapedItem):
"""
This is the base class for all scraped items.
"""
class Item(Declarative, ScrapedItem):
""" This is the base class for all scraped items. """
fields = {}
def __classinit__(cls, attrs):
cls.fields = cls.fields.copy()
for n, v in attrs.items():
if isinstance(v, Field):
cls.fields[n] = v
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], Field))
@property
def _fields(self):
return self.__class__.fields
def __setattr__(self, name, value):
if not name.startswith('_'):