diff options
| author | papisz <szablowska.patrycja@gmail.com> | 2014-04-09 22:35:56 +0200 |
|---|---|---|
| committer | papisz <szablowska.patrycja@gmail.com> | 2014-04-09 22:35:56 +0200 |
| commit | 70716fdd216755dc4b542df74e95b0e5ac74f0ee (patch) | |
| tree | b3800f8f2edac48593f79d7e0bc7fb01dac4708e | |
| parent | 56b627a561f2895d7847dd4794b1dd500916eeeb (diff) | |
| download | tablib-70716fdd216755dc4b542df74e95b0e5ac74f0ee.tar.gz | |
CSV custom delimiter support
| -rw-r--r-- | tablib/core.py | 2 | ||||
| -rw-r--r-- | tablib/formats/_csv.py | 20 | ||||
| -rw-r--r-- | tablib/formats/_tsv.py | 49 | ||||
| -rwxr-xr-x | test_tablib.py | 24 |
4 files changed, 46 insertions, 49 deletions
diff --git a/tablib/core.py b/tablib/core.py index 86f75b2..9953ffa 100644 --- a/tablib/core.py +++ b/tablib/core.py @@ -256,6 +256,8 @@ class Dataset(object): setattr(cls, fmt.title, property(fmt.export_set, fmt.import_set)) except AttributeError: setattr(cls, fmt.title, property(fmt.export_set)) + setattr(cls, 'set_%s' % fmt.title, fmt.import_set) + setattr(cls, 'get_%s' % fmt.title, fmt.export_set) except AttributeError: pass diff --git a/tablib/formats/_csv.py b/tablib/formats/_csv.py index c5d3202..7deec23 100644 --- a/tablib/formats/_csv.py +++ b/tablib/formats/_csv.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -""" Tablib - CSV Support. +""" Tablib - *SV Support. """ from tablib.compat import is_py3, csv, StringIO @@ -11,17 +11,17 @@ extensions = ('csv',) DEFAULT_ENCODING = 'utf-8' +DEFAULT_DELIMITER = ',' - -def export_set(dataset): +def export_set(dataset, delimiter=DEFAULT_DELIMITER): """Returns CSV representation of Dataset.""" stream = StringIO() if is_py3: - _csv = csv.writer(stream) + _csv = csv.writer(stream, delimiter=delimiter) else: - _csv = csv.writer(stream, encoding=DEFAULT_ENCODING) + _csv = csv.writer(stream, delimiter=delimiter, encoding=DEFAULT_ENCODING) for row in dataset._package(dicts=False): _csv.writerow(row) @@ -29,15 +29,15 @@ def export_set(dataset): return stream.getvalue() -def import_set(dset, in_stream, headers=True): +def import_set(dset, in_stream, headers=True, delimiter=DEFAULT_DELIMITER): """Returns dataset from CSV stream.""" dset.wipe() if is_py3: - rows = csv.reader(in_stream.splitlines()) + rows = csv.reader(in_stream.splitlines(), delimiter=delimiter) else: - rows = csv.reader(in_stream.splitlines(), encoding=DEFAULT_ENCODING) + rows = csv.reader(in_stream.splitlines(), delimiter=delimiter, encoding=DEFAULT_ENCODING) for i, row in enumerate(rows): if (i == 0) and (headers): @@ -46,10 +46,10 @@ def import_set(dset, in_stream, headers=True): dset.append(row) -def detect(stream): +def detect(stream, delimiter=DEFAULT_DELIMITER): """Returns True if given stream is valid CSV.""" try: - csv.Sniffer().sniff(stream, delimiters=',') + csv.Sniffer().sniff(stream, delimiters=delimiter) return True except (csv.Error, TypeError): return False diff --git a/tablib/formats/_tsv.py b/tablib/formats/_tsv.py index 8ef2b67..9380b3b 100644 --- a/tablib/formats/_tsv.py +++ b/tablib/formats/_tsv.py @@ -3,57 +3,28 @@ """ Tablib - TSV (Tab Separated Values) Support. """ -from tablib.compat import is_py3, csv, StringIO - - +from tablib.formats._csv import ( + export_set as export_set_wrapper, + import_set as import_set_wrapper, + detect as detect_wrapper, +) title = 'tsv' extensions = ('tsv',) DEFAULT_ENCODING = 'utf-8' +DELIMITER = '\t' def export_set(dataset): - """Returns a TSV representation of Dataset.""" - - stream = StringIO() - - if is_py3: - _tsv = csv.writer(stream, delimiter='\t') - else: - _tsv = csv.writer(stream, encoding=DEFAULT_ENCODING, delimiter='\t') - - for row in dataset._package(dicts=False): - _tsv.writerow(row) - - return stream.getvalue() + """Returns TSV representation of Dataset.""" + return export_set_wrapper(dataset, delimiter=DELIMITER) def import_set(dset, in_stream, headers=True): """Returns dataset from TSV stream.""" - - dset.wipe() - - if is_py3: - rows = csv.reader(in_stream.splitlines(), delimiter='\t') - else: - rows = csv.reader(in_stream.splitlines(), delimiter='\t', - encoding=DEFAULT_ENCODING) - - for i, row in enumerate(rows): - # Skip empty rows - if not row: - continue - - if (i == 0) and (headers): - dset.headers = row - else: - dset.append(row) + return import_set_wrapper(dset, in_stream, headers=headers, delimiter=DELIMITER) def detect(stream): """Returns True if given stream is valid TSV.""" - try: - csv.Sniffer().sniff(stream, delimiters='\t') - return True - except (csv.Error, TypeError): - return False + return detect_wrapper(stream, delimiter=DELIMITER) diff --git a/test_tablib.py b/test_tablib.py index 6125408..1c160d2 100755 --- a/test_tablib.py +++ b/test_tablib.py @@ -401,6 +401,17 @@ class TablibTestCase(unittest.TestCase): self.assertEqual(_csv, data.csv) + def test_csv_import_set_semicolons(self): + """Test for proper output with semicolon separated CSV.""" + data.append(self.john) + data.append(self.george) + data.headers = self.headers + + _csv = data.get_csv(delimiter=';') + + data.set_csv(_csv, delimiter=';') + + self.assertEqual(_csv, data.get_csv(delimiter=';')) def test_csv_import_set_with_spaces(self): """Generate and import CSV set serialization when row values have @@ -415,6 +426,19 @@ class TablibTestCase(unittest.TestCase): self.assertEqual(_csv, data.csv) + def test_csv_import_set_semicolon_with_spaces(self): + """Generate and import semicolon separated CSV set serialization when row values have + spaces.""" + data.append(('Bill Gates', 'Microsoft')) + data.append(('Steve Jobs', 'Apple')) + data.headers = ('Name', 'Company') + + _csv = data.get_csv(delimiter=';') + + data.set_csv(_csv, delimiter=';') + + self.assertEqual(_csv, data.get_csv(delimiter=';')) + def test_tsv_import_set(self): """Generate and import TSV set serialization.""" |
