1
0
mirror of https://github.com/scrapy/scrapy.git synced 2025-02-25 06:04:29 +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():
if isinstance(v, BaseField):
cls.fields[n] = v
delattr(cls, n)
return cls
@ -38,17 +39,14 @@ class Item(ScrapedItem):
else:
raise AttributeError(name)
def __getattribute__(self, name):
if name.startswith('_') or name == 'fields':
return ScrapedItem.__getattribute__(self, name)
if name in self.fields.keys():
def __getattr__(self, name):
try:
return self._values[name]
except KeyError:
try:
return self._values[name]
except KeyError:
return self.fields[name].default
else:
raise AttributeError(name)
except KeyError:
raise AttributeError(name)
def __repr__(self):
"""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.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):