summaryrefslogtreecommitdiff
path: root/test_tablib.py
diff options
context:
space:
mode:
Diffstat (limited to 'test_tablib.py')
-rwxr-xr-xtest_tablib.py214
1 files changed, 206 insertions, 8 deletions
diff --git a/test_tablib.py b/test_tablib.py
index 1c160d2..d4127b0 100755
--- a/test_tablib.py
+++ b/test_tablib.py
@@ -1,13 +1,14 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
-
"""Tests for Tablib."""
+import json
import unittest
import sys
import os
import tablib
-from tablib.compat import markup, unicode
+from tablib.compat import markup, unicode, is_py3
+from tablib.core import Row
@@ -206,6 +207,18 @@ class TablibTestCase(unittest.TestCase):
self.assertEqual(self.founders[2:], [self.tom])
+ def test_row_slicing(self):
+ """Verify Row's __getslice__ method. Issue #184."""
+
+ john = Row(self.john)
+
+ self.assertEqual(john[:], list(self.john[:]))
+ self.assertEqual(john[0:], list(self.john[0:]))
+ self.assertEqual(john[:2], list(self.john[:2]))
+ self.assertEqual(john[0:2], list(self.john[0:2]))
+ self.assertEqual(john[0:-1], list(self.john[0:-1]))
+
+
def test_delete(self):
"""Verify deleting from dataset works."""
@@ -306,10 +319,76 @@ class TablibTestCase(unittest.TestCase):
self.assertEqual(html, d.html)
+ def test_latex_export(self):
+ """LaTeX export"""
+
+ expected = """\
+% Note: add \\usepackage{booktabs} to your preamble
+%
+\\begin{table}[!htbp]
+ \\centering
+ \\caption{Founders}
+ \\begin{tabular}{lrr}
+ \\toprule
+ first\\_name & last\\_name & gpa \\\\
+ \\cmidrule(r){1-1} \\cmidrule(lr){2-2} \\cmidrule(l){3-3}
+ John & Adams & 90 \\\\
+ George & Washington & 67 \\\\
+ Thomas & Jefferson & 50 \\\\
+ \\bottomrule
+ \\end{tabular}
+\\end{table}
+"""
+ output = self.founders.latex
+ self.assertEqual(output, expected)
+
+
+ def test_latex_export_empty_dataset(self):
+ self.assertTrue(tablib.Dataset().latex is not None)
+
+
+ def test_latex_export_no_headers(self):
+ d = tablib.Dataset()
+ d.append(('one', 'two', 'three'))
+ self.assertTrue('one' in d.latex)
+
+
+ def test_latex_export_caption(self):
+ d = tablib.Dataset()
+ d.append(('one', 'two', 'three'))
+ self.assertFalse('caption' in d.latex)
+
+ d.title = 'Title'
+ self.assertTrue('\\caption{Title}' in d.latex)
+
+
+ def test_latex_export_none_values(self):
+ headers = ['foo', None, 'bar']
+ d = tablib.Dataset(['foo', None, 'bar'], headers=headers)
+ output = d.latex
+ self.assertTrue('foo' in output)
+ self.assertFalse('None' in output)
+
+
+ def test_latex_escaping(self):
+ d = tablib.Dataset(['~', '^'])
+ output = d.latex
+
+ self.assertFalse('~' in output)
+ self.assertTrue('textasciitilde' in output)
+ self.assertFalse('^' in output)
+ self.assertTrue('textasciicircum' in output)
+
+
def test_unicode_append(self):
"""Passes in a single unicode character and exports."""
- new_row = (u'å', u'é')
+ if is_py3:
+ new_row = ('å', 'é')
+ else:
+ exec("new_row = (u'å', u'é')")
+
+
data.append(new_row)
data.json
@@ -320,6 +399,7 @@ class TablibTestCase(unittest.TestCase):
data.xlsx
data.ods
data.html
+ data.latex
def test_book_export_no_exceptions(self):
@@ -345,7 +425,7 @@ class TablibTestCase(unittest.TestCase):
data.json = _json
- self.assertEqual(_json, data.json)
+ self.assertEqual(json.loads(_json), json.loads(data.json))
def test_json_import_book(self):
@@ -359,7 +439,7 @@ class TablibTestCase(unittest.TestCase):
book.json = _json
- self.assertEqual(_json, book.json)
+ self.assertEqual(json.loads(_json), json.loads(book.json))
def test_yaml_import_set(self):
@@ -440,6 +520,22 @@ class TablibTestCase(unittest.TestCase):
self.assertEqual(_csv, data.get_csv(delimiter=';'))
+ def test_csv_import_set_with_newlines(self):
+ """Generate and import CSV set serialization when row values have
+ newlines."""
+ data.append(('Markdown\n=======',
+ 'A cool language\n\nwith paragraphs'))
+ data.append(('reStructedText\n==============',
+ 'Another cool language\n\nwith paragraphs'))
+ data.headers = ('title', 'body')
+
+ _csv = data.csv
+
+ data.csv = _csv
+
+ self.assertEqual(_csv, data.csv)
+
+
def test_tsv_import_set(self):
"""Generate and import TSV set serialization."""
data.append(self.john)
@@ -453,6 +549,108 @@ class TablibTestCase(unittest.TestCase):
self.assertEqual(_tsv, data.tsv)
+ def test_dbf_import_set(self):
+ data.append(self.john)
+ data.append(self.george)
+ data.headers = self.headers
+
+ _dbf = data.dbf
+ data.dbf = _dbf
+
+ #self.assertEqual(_dbf, data.dbf)
+ try:
+ self.assertEqual(_dbf, data.dbf)
+ except AssertionError:
+ index = 0
+ so_far = ''
+ for reg_char, data_char in zip(_dbf, data.dbf):
+ so_far += chr(data_char)
+ if reg_char != data_char and index not in [1, 2, 3]:
+ raise AssertionError('Failing at char %s: %s vs %s %s' % (
+ index, reg_char, data_char, so_far))
+ index += 1
+
+ def test_dbf_export_set(self):
+ """Test DBF import."""
+ data.append(self.john)
+ data.append(self.george)
+ data.append(self.tom)
+ data.headers = self.headers
+
+ _regression_dbf = (b'\x03r\x06\x06\x03\x00\x00\x00\x81\x00\xab\x00\x00'
+ b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
+ b'\x00\x00\x00FIRST_NAME\x00C\x00\x00\x00\x00P\x00\x00\x00\x00\x00'
+ b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00LAST_NAME\x00\x00C\x00'
+ b'\x00\x00\x00P\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
+ b'\x00\x00GPA\x00\x00\x00\x00\x00\x00\x00\x00N\x00\x00\x00\x00\n'
+ b'\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\r'
+ )
+ _regression_dbf += b' John' + (b' ' * 75)
+ _regression_dbf += b' Adams' + (b' ' * 74)
+ _regression_dbf += b' 90.0000000'
+ _regression_dbf += b' George' + (b' ' * 73)
+ _regression_dbf += b' Washington' + (b' ' * 69)
+ _regression_dbf += b' 67.0000000'
+ _regression_dbf += b' Thomas' + (b' ' * 73)
+ _regression_dbf += b' Jefferson' + (b' ' * 70)
+ _regression_dbf += b' 50.0000000'
+ _regression_dbf += b'\x1a'
+
+ if is_py3:
+ # If in python3, decode regression string to binary.
+ #_regression_dbf = bytes(_regression_dbf, 'utf-8')
+ #_regression_dbf = _regression_dbf.replace(b'\n', b'\r')
+ pass
+
+ try:
+ self.assertEqual(_regression_dbf, data.dbf)
+ except AssertionError:
+ index = 0
+ found_so_far = ''
+ for reg_char, data_char in zip(_regression_dbf, data.dbf):
+ #found_so_far += chr(data_char)
+ if reg_char != data_char and index not in [1, 2, 3]:
+ raise AssertionError(
+ 'Failing at char %s: %s vs %s (found %s)' % (
+ index, reg_char, data_char, found_so_far))
+ index += 1
+
+ def test_dbf_format_detect(self):
+ """Test the DBF format detection."""
+ _dbf = (b'\x03r\x06\x03\x03\x00\x00\x00\x81\x00\xab\x00\x00'
+ b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
+ b'\x00\x00\x00FIRST_NAME\x00C\x00\x00\x00\x00P\x00\x00\x00\x00\x00'
+ b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00LAST_NAME\x00\x00C\x00'
+ b'\x00\x00\x00P\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
+ b'\x00\x00GPA\x00\x00\x00\x00\x00\x00\x00\x00N\x00\x00\x00\x00\n'
+ b'\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\r'
+ )
+ _dbf += b' John' + (b' ' * 75)
+ _dbf += b' Adams' + (b' ' * 74)
+ _dbf += b' 90.0000000'
+ _dbf += b' George' + (b' ' * 73)
+ _dbf += b' Washington' + (b' ' * 69)
+ _dbf += b' 67.0000000'
+ _dbf += b' Thomas' + (b' ' * 73)
+ _dbf += b' Jefferson' + (b' ' * 70)
+ _dbf += b' 50.0000000'
+ _dbf += b'\x1a'
+
+ _yaml = '- {age: 90, first_name: John, last_name: Adams}'
+ _tsv = 'foo\tbar'
+ _csv = '1,2,3\n4,5,6\n7,8,9\n'
+ _json = '[{"last_name": "Adams","age": 90,"first_name": "John"}]'
+
+ _bunk = (
+ '¡¡¡¡¡¡¡¡£™∞¢£§∞§¶•¶ª∞¶•ªº••ª–º§•†•§º¶•†¥ª–º•§ƒø¥¨©πƒø†ˆ¥ç©¨√øˆ¥≈†ƒ¥ç©ø¨çˆ¥ƒçø¶'
+ )
+ self.assertTrue(tablib.formats.dbf.detect(_dbf))
+ self.assertFalse(tablib.formats.dbf.detect(_yaml))
+ self.assertFalse(tablib.formats.dbf.detect(_tsv))
+ self.assertFalse(tablib.formats.dbf.detect(_csv))
+ self.assertFalse(tablib.formats.dbf.detect(_json))
+ self.assertFalse(tablib.formats.dbf.detect(_bunk))
+
def test_csv_format_detect(self):
"""Test CSV format detection."""
@@ -649,7 +847,7 @@ class TablibTestCase(unittest.TestCase):
orig_first_name = self.founders[self.headers[0]]
csv_first_name = data[headers[0]]
- self.assertEquals(orig_first_name, csv_first_name)
+ self.assertEqual(orig_first_name, csv_first_name)
def test_csv_column_delete(self):
@@ -677,14 +875,14 @@ class TablibTestCase(unittest.TestCase):
self.founders.sort(orig_target_header)
data.sort(target_header)
- self.assertEquals(self.founders[orig_target_header], data[target_header])
+ self.assertEqual(self.founders[orig_target_header], data[target_header])
def test_unicode_renders_markdown_table(self):
# add another entry to test right field width for
# integer
self.founders.append(('Old', 'Man', 100500))
- self.assertEquals(
+ self.assertEqual(
"""
first_name|last_name |gpa
----------|----------|------