1
0
mirror of https://github.com/scrapy/scrapy.git synced 2025-02-25 12:03:58 +00:00

more efficient Item implementation and added support for using custom methods (unittests included)

This commit is contained in:
Pablo Hoffman 2009-07-13 14:00:41 -03:00
parent dff510384b
commit 8634a0d181
2 changed files with 32 additions and 9 deletions

View File

@ -10,6 +10,7 @@ class _ItemMeta(type):
for n, v in attrs.iteritems(): for n, v in attrs.iteritems():
if isinstance(v, BaseField): if isinstance(v, BaseField):
cls.fields[n] = v cls.fields[n] = v
delattr(cls, n)
return cls return cls
@ -38,17 +39,14 @@ class Item(ScrapedItem):
else: else:
raise AttributeError(name) raise AttributeError(name)
def __getattribute__(self, name): def __getattr__(self, name):
if name.startswith('_') or name == 'fields': try:
return ScrapedItem.__getattribute__(self, name) return self._values[name]
except KeyError:
if name in self.fields.keys():
try: try:
return self._values[name]
except KeyError:
return self.fields[name].default return self.fields[name].default
else: except KeyError:
raise AttributeError(name) raise AttributeError(name)
def __repr__(self): def __repr__(self):
"""Generate a representation of this item that can be used to """Generate a representation of this item that can be used to

View File

@ -85,6 +85,31 @@ class NewItemTest(unittest.TestCase):
assert i2.name == 'John Doe' assert i2.name == 'John Doe'
assert i2.number == 123 assert i2.number == 123
def test_private_attr(self):
class TestItem(Item):
name = fields.StringField()
i = TestItem()
i._private = 'test'
self.assertEqual(i._private, 'test')
def test_custom_methods(self):
class TestItem(Item):
name = fields.StringField()
def get_name(self):
return self.name
def change_name(self, name):
self.name = name
i = TestItem()
self.assertEqual(i.get_name(), None)
i.name = 'lala'
self.assertEqual(i.get_name(), 'lala')
i.change_name('other')
self.assertEqual(i.get_name(), 'other')
class NewItemFieldsTest(unittest.TestCase): class NewItemFieldsTest(unittest.TestCase):