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:
parent
dff510384b
commit
8634a0d181
@ -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
|
||||||
|
@ -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):
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user