mirror of https://github.com/scrapy/scrapy.git
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:
parent
0d47fdf6e8
commit
60de639434
|
|
@ -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
|
||||
|
||||
|
|
@ -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('_'):
|
||||
|
|
|
|||
Loading…
Reference in New Issue