diff --git a/rows/plugins/plugin_csv.py b/rows/plugins/plugin_csv.py index a06b1571..1fb578d9 100644 --- a/rows/plugins/plugin_csv.py +++ b/rows/plugins/plugin_csv.py @@ -49,7 +49,7 @@ def discover_dialect(sample, encoding): def import_from_csv(filename_or_fobj, encoding='utf-8', dialect=None, - sample_size=8192, *args, **kwargs): + sample_size=8192, fmtparams=None, *args, **kwargs): '''Import data from a CSV file If a file-like object is provided it MUST be in binary mode, like in @@ -63,7 +63,8 @@ def import_from_csv(filename_or_fobj, encoding='utf-8', dialect=None, dialect = discover_dialect(fobj.read(sample_size), encoding) fobj.seek(cursor) - reader = unicodecsv.reader(fobj, encoding=encoding, dialect=dialect) + fmtparams = fmtparams or {} + reader = unicodecsv.reader(fobj, encoding=encoding, dialect=dialect, **fmtparams) meta = {'imported_from': 'csv', 'filename': filename, diff --git a/tests/tests_plugin_csv.py b/tests/tests_plugin_csv.py index 9430f3be..cb60874e 100644 --- a/tests/tests_plugin_csv.py +++ b/tests/tests_plugin_csv.py @@ -112,6 +112,23 @@ def test_import_from_csv_force_dialect(self, mocked_create_table): call_args = mocked_create_table.call_args_list[0] self.assertEqual(data, list(call_args[0][0])) + @mock.patch('rows.plugins.plugin_csv.create_table', mock.Mock()) + @mock.patch('rows.plugins.plugin_csv.unicodecsv') + @mock.patch('rows.plugins.plugin_csv.get_filename_and_fobj', mock.Mock(return_value=('f_name', 'f_obj'))) + def test_import_from_csv_forcing_fmtparams(self, mocked_unicodecsv): + data, lines = make_csv_data(quote_char="'", + field_delimiter=";", + line_delimiter="\r\n") + fobj = BytesIO() + fobj.write(lines.encode('utf-8')) + fobj.seek(0) + + rows.import_from_csv(fobj, dialect='excel', fmtparams={'delimiter': ';'}) + + mocked_unicodecsv.assert_called_once_with( + 'f_obj', encoding='utf-8', dialect='excel', delimiter=';' + ) + def test_detect_dialect_more_data(self): temp = tempfile.NamedTemporaryFile(delete=False) filename = '{}.{}'.format(temp.name, self.file_extension)