Merge pull request #1737 from stummjr/fix-py3-exporters-multiple-types

[MRG+1] Fix PythonItemExporter and CSVExporter for non-string item types
This commit is contained in:
Mikhail Korobov 2016-01-28 00:46:00 +05:00
commit 394b991e3a
2 changed files with 33 additions and 5 deletions

View File

@ -200,7 +200,7 @@ class CsvItemExporter(BaseItemExporter):
try:
yield to_native_str(s)
except TypeError:
yield to_native_str(repr(s))
yield s
def _write_headers_and_set_fields_to_export(self, item):
if self.include_headers_line:
@ -273,10 +273,10 @@ class PythonItemExporter(BaseItemExporter):
return dict(self._serialize_dict(value))
if is_listlike(value):
return [self._serialize_value(v) for v in value]
if self.binary:
return to_bytes(value, encoding=self.encoding)
else:
return to_unicode(value, encoding=self.encoding)
encode_func = to_bytes if self.binary else to_unicode
if isinstance(value, (six.text_type, bytes)):
return encode_func(value, encoding=self.encoding)
return value
def _serialize_dict(self, value):
for key, val in six.iteritems(value):

View File

@ -134,6 +134,19 @@ class PythonItemExporterTest(BaseItemExporterTest):
expected = {b'name': b'John\xc2\xa3', b'age': b'22'}
self.assertEqual(expected, exporter.export_item(value))
def test_other_python_types_item(self):
from datetime import datetime
now = datetime.now()
item = {
'boolean': False,
'number': 22,
'time': now,
'float': 3.14,
}
ie = self._get_exporter()
exported = ie.export_item(item)
self.assertEqual(exported, item)
class PprintItemExporterTest(BaseItemExporterTest):
@ -258,6 +271,21 @@ class CsvItemExporterTest(BaseItemExporterTest):
expected='"[4, 8]",John\r\n',
)
def test_other_python_types_item(self):
from datetime import datetime
now = datetime(2015, 1, 1, 1, 1, 1)
item = {
'boolean': False,
'number': 22,
'time': now,
'float': 3.14,
}
self.assertExportResult(
item=item,
include_headers_line=False,
expected='22,False,3.14,2015-01-01 01:01:01\r\n'
)
class XmlItemExporterTest(BaseItemExporterTest):