diff --git a/scrapy/contrib_exp/newitem/adaptors.py b/scrapy/contrib_exp/newitem/adaptors.py index 4121180d3..f2c782610 100644 --- a/scrapy/contrib_exp/newitem/adaptors.py +++ b/scrapy/contrib_exp/newitem/adaptors.py @@ -1,4 +1,3 @@ - from scrapy.utils.misc import arg_to_iter from scrapy.utils.python import get_func_args @@ -28,7 +27,7 @@ class ItemAdaptorMeta(type): cls._field_adaptors = cls._field_adaptors.copy() if cls.item_class: - for item_field in cls.item_class.fields.keys(): + for item_field in cls.item_class.get_fields(): if item_field in attrs: adaptor = adaptize(attrs[item_field]) cls._field_adaptors[item_field] = adaptor @@ -36,7 +35,7 @@ class ItemAdaptorMeta(type): return cls def __getattr__(cls, name): - if name in cls.item_class.fields: + if name in cls.item_class.get_fields(): return cls.default_adaptor raise AttributeError(name) diff --git a/scrapy/contrib_exp/newitem/models.py b/scrapy/contrib_exp/newitem/models.py index afa1105ce..e3f769263 100644 --- a/scrapy/contrib_exp/newitem/models.py +++ b/scrapy/contrib_exp/newitem/models.py @@ -6,10 +6,10 @@ class _ItemMeta(type): def __new__(meta, class_name, bases, attrs): cls = type.__new__(meta, class_name, bases, attrs) - cls.fields = cls.fields.copy() + cls._fields = cls._fields.copy() for n, v in attrs.iteritems(): if isinstance(v, BaseField): - cls.fields[n] = v + cls._fields[n] = v delattr(cls, n) return cls @@ -19,7 +19,7 @@ class Item(ScrapedItem): __metaclass__ = _ItemMeta - fields = {} + _fields = {} def __init__(self, values=None): self._values = {} @@ -34,8 +34,8 @@ class Item(ScrapedItem): if name.startswith('_'): return ScrapedItem.__setattr__(self, name, value) - if name in self.fields.keys(): - self._values[name] = self.fields[name].to_python(value) + if name in self._fields: + self._values[name] = self._fields[name].to_python(value) else: raise AttributeError(name) @@ -44,7 +44,7 @@ class Item(ScrapedItem): return self._values[name] except KeyError: try: - return self.fields[name].get_default() + return self._fields[name].get_default() except KeyError: raise AttributeError(name) @@ -52,6 +52,11 @@ class Item(ScrapedItem): """Generate a representation of this item that can be used to reconstruct the item by evaluating it """ - values = dict((field, getattr(self, field)) for field in self.fields) + values = dict((field, getattr(self, field)) for field in self._fields) return "%s(%s)" % (self.__class__.__name__, repr(values)) + @classmethod + def get_fields(cls): + """Returns the item fields""" + return cls._fields +