added newitem exporter tests and fixed exporter errors

This commit is contained in:
Ismael Carnales 2009-08-12 10:17:06 -03:00
parent bc4ec80db7
commit c83fb1c7d1
2 changed files with 136 additions and 10 deletions

View File

@ -22,15 +22,15 @@ class BaseItemExporter(object):
def _serialize_field(self, field, name, value):
if hasattr(self, 'serialize_%s' % name):
serializer = getattr('serialize_%s' % name)
serializer = getattr(self, 'serialize_%s' % name)
elif hasattr(field, 'serializer'):
serializer = field.serializer
else:
serializer = _default_serializer(field, name, value)
serializer = self._default_serializer
return serializer(field, name, value)
def _default_serializer(field, name, value):
def _default_serializer(self, field, name, value):
return str(value)
@ -67,8 +67,8 @@ class CsvItemExporter(BaseItemExporter):
values = []
for field in self.fields_to_export:
if field in item:
values.append(self._serialize_field(item.fields[field]), field, \
item[field])
values.append(self._serialize_field(item.fields[field], field,
item[field]))
else:
values.append('')
self.csv_writer.writerow(values)
@ -92,9 +92,7 @@ class XmlItemExporter(BaseItemExporter):
self.xg.startElement(self.item_element, {})
for field in self.fields_to_export:
if field in item:
self.xg.startElement(self.item_element, {})
self._export_xml_field(item.fields[field], field, item[field])
self.xg.endElement(self.item_element)
elif self.include_empty_elements:
self.xg.startElement(self.item_element, {})
self.xg.endElement()
@ -105,9 +103,6 @@ class XmlItemExporter(BaseItemExporter):
self.xg.endDocument()
def _export_xml_field(self, field, name, value):
if isinstance(field, fields.ListField):
for v in value:
self._export_xml_field(field._field, 'value', v)
self.xg.startElement(name, {})
self.xg.characters(self._serialize_field(field, name, value))
self.xg.endElement(name)

View File

@ -0,0 +1,131 @@
from cPickle import Pickler
from cStringIO import StringIO
import pprint
from twisted.trial import unittest
from scrapy.newitem import Item, Field
from scrapy.newitem.exporters import *
class TestItem(Item):
name = Field()
age = Field()
class BaseItemExporterTest(unittest.TestCase):
def test_export(self):
i = TestItem(name=u'John', age=22)
ie = BaseItemExporter()
self.assertRaises(NotImplementedError, ie.export, i)
def test_default_serializer(self):
i = TestItem(name=u'John', age=22)
ie = BaseItemExporter()
self.assertEqual(ie._serialize_field(i.fields['name'], 'name', i['name']), 'John')
self.assertEqual( ie._serialize_field(i.fields['age'], 'age', i['age']), '22')
def test_exporter_custom_serializer(self):
class CustomItemExporter(BaseItemExporter):
def serialize_age(self, field, name, value):
return str(value + 1)
i = TestItem(name=u'John', age=22)
ie = CustomItemExporter()
self.assertEqual(ie._serialize_field(i.fields['name'], 'name', i['name']), 'John')
self.assertEqual(ie._serialize_field(i.fields['age'], 'age', i['age']), '23')
def test_field_custom_serializer(self):
class CustomField(Field):
def serializer(self, field, name, value):
return str(value + 2)
class CustomFieldItem(Item):
name = Field()
age = CustomField()
i = CustomFieldItem(name=u'John', age=22)
ie = BaseItemExporter()
self.assertEqual(ie._serialize_field(i.fields['name'], 'name', i['name']), 'John')
self.assertEqual(ie._serialize_field(i.fields['age'], 'age', i['age']), '24')
class PprintItemExporterTest(unittest.TestCase):
def test_export(self):
i = TestItem(name=u'John', age=22)
output = StringIO()
ie = PprintItemExporter(output)
ie.export(i)
self.assertEqual(output.getvalue(), "{'age': 22, 'name': u'John'}\n")
class PickleItemExporterTest(unittest.TestCase):
def test_export(self):
i = TestItem(name=u'John', age=22)
output = StringIO()
ie = PickleItemExporter(output)
ie.export(i)
poutput = StringIO()
p = Pickler(poutput)
p.dump(dict(i))
self.assertEqual(output.getvalue(), poutput.getvalue())
class CsvItemExporterTest(unittest.TestCase):
def test_export(self):
i = TestItem(name=u'John', age=22)
output = StringIO()
ie = CsvItemExporter(output)
ie.fields_to_export = i.fields.keys()
ie.export(i)
self.assertEqual(output.getvalue(), 'age,name\r\n22,John\r\n')
class XmlItemExporterTest(unittest.TestCase):
def test_export(self):
i = TestItem(name=u'John', age=22)
output = StringIO()
ie = XmlItemExporter(output)
ie.fields_to_export = i.fields.keys()
ie.export(i)
self.assertEqual(output.getvalue(), '<?xml version="1.0" encoding="iso-8859-1"?>\n<items><item><age>22</age><name>John</name></item>')
class JSONItemExporterTest(unittest.TestCase):
def setUp(self):
try:
from scrapy.newitem.exporters.jsonexporter import JSONItemExporter
self.output = StringIO()
self.ie = JSONItemExporter(self.output)
except ImportError, e:
raise unittest.SkipTest("Json library not available")
def test_export(self):
i = TestItem(name=u'John', age=22)
self.ie.export(i)
self.assertEqual(self.output.getvalue(), '{"age": 22, "name": "John"}\n')