summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKenneth Reitz <me@kennethreitz.com>2010-11-17 20:49:08 -0500
committerKenneth Reitz <me@kennethreitz.com>2010-11-17 20:49:08 -0500
commit17bb0d3b2c4a2e46e2e9dfb8cecf8169db16b59c (patch)
tree14a978a170ab64f950259b032f0ddb20a32d1742
parent46f302255dc4b807114eaca3c9584323f1913f81 (diff)
parent1a9aee928970ecaaba40529fd2def1e47059b828 (diff)
downloadtablib-17bb0d3b2c4a2e46e2e9dfb8cecf8169db16b59c.tar.gz
Merge branch 'feature/stacking' into develop
-rw-r--r--tablib/core.py57
-rwxr-xr-xtest_tablib.py54
2 files changed, 103 insertions, 8 deletions
diff --git a/tablib/core.py b/tablib/core.py
index 816e0e1..7d3c94c 100644
--- a/tablib/core.py
+++ b/tablib/core.py
@@ -548,6 +548,63 @@ class Dataset(object):
return _dset
+
+ def stack_rows(self, other):
+ """Stack two :class:`Dataset` instances together by
+ joining at the row level, and return new combined
+ ``Dataset`` instance."""
+
+ if not isinstance(other, Dataset):
+ return
+
+ if self.width != other.width:
+ raise InvalidDimensions
+
+ # Copy the source data
+ _dset = copy(self)
+
+ rows_to_stack = [row for row in _dset._data]
+ other_rows = [row for row in other._data]
+
+ rows_to_stack.extend(other_rows)
+ _dset._data = rows_to_stack
+
+ return _dset
+
+
+ def stack_columns(self, other):
+ """Stack two :class:`Dataset` instances together by
+ joining at the column level, and return a new
+ combined ``Dataset`` instance. If either ``Dataset``
+ has headers set, than the other must as well."""
+
+ if not isinstance(other, Dataset):
+ return
+
+ if self.headers or other.headers:
+ if not self.headers or not other.headers:
+ raise HeadersNeeded
+
+ if self.height != other.height:
+ raise InvalidDimensions
+
+ try:
+ new_headers = self.headers + other.headers
+ except TypeError:
+ new_headers = None
+
+ _dset = Dataset()
+
+ for column in self.headers:
+ _dset.append(col=self[column])
+
+ for column in other.headers:
+ _dset.append(col=other[column])
+
+ _dset.headers = new_headers
+
+ return _dset
+
def wipe(self):
"""Removes all content and headers from the :class:`Dataset` object."""
self._data = list()
diff --git a/test_tablib.py b/test_tablib.py
index f203179..8e2454f 100755
--- a/test_tablib.py
+++ b/test_tablib.py
@@ -194,7 +194,7 @@ class TablibTestCase(unittest.TestCase):
data.tsv
data.xls
-
+
def test_book_export_no_exceptions(self):
"""Test that varoius exports don't error out."""
@@ -245,7 +245,7 @@ class TablibTestCase(unittest.TestCase):
self.assertEqual(_yaml, data.yaml)
-
+
def test_yaml_import_book(self):
"""Generate and import YAML book serialization."""
data.append(self.john)
@@ -258,7 +258,7 @@ class TablibTestCase(unittest.TestCase):
book.yaml = _yaml
self.assertEqual(_yaml, book.yaml)
-
+
def test_csv_import_set(self):
"""Generate and import CSV set serialization."""
@@ -286,7 +286,7 @@ class TablibTestCase(unittest.TestCase):
def test_csv_format_detect(self):
"""Test CSV format detection."""
-
+
_csv = (
'1,2,3\n'
'4,5,6\n'
@@ -295,13 +295,13 @@ class TablibTestCase(unittest.TestCase):
_bunk = (
'¡¡¡¡¡¡¡¡£™∞¢£§∞§¶•¶ª∞¶•ªº••ª–º§•†•§º¶•†¥ª–º•§ƒø¥¨©πƒø†ˆ¥ç©¨√øˆ¥≈†ƒ¥ç©ø¨çˆ¥ƒçø¶'
)
-
+
self.assertTrue(tablib.formats.csv.detect(_csv))
self.assertFalse(tablib.formats.csv.detect(_bunk))
def test_tsv_format_detect(self):
"""Test TSV format detection."""
-
+
_tsv = (
'1\t2\t3\n'
'4\t5\t6\n'
@@ -310,7 +310,7 @@ class TablibTestCase(unittest.TestCase):
_bunk = (
'¡¡¡¡¡¡¡¡£™∞¢£§∞§¶•¶ª∞¶•ªº••ª–º§•†•§º¶•†¥ª–º•§ƒø¥¨©πƒø†ˆ¥ç©¨√øˆ¥≈†ƒ¥ç©ø¨çˆ¥ƒçø¶'
)
-
+
self.assertTrue(tablib.formats.tsv.detect(_tsv))
self.assertFalse(tablib.formats.tsv.detect(_bunk))
@@ -357,7 +357,7 @@ class TablibTestCase(unittest.TestCase):
transposed_founders = self.founders.transpose()
first_row = transposed_founders[0]
second_row = transposed_founders[1]
-
+
self.assertEqual(transposed_founders.headers,
["first_name","John", "George", "Thomas"])
self.assertEqual(first_row,
@@ -365,6 +365,44 @@ class TablibTestCase(unittest.TestCase):
self.assertEqual(second_row,
("gpa",90, 67, 50))
+ def test_row_stacking(self):
+
+ """Row stacking."""
+
+ to_join = tablib.Dataset(headers=self.founders.headers)
+
+ for row in self.founders:
+ to_join.append(row=row)
+
+ row_stacked = self.founders.stack_rows(to_join)
+
+ for column in row_stacked.headers:
+
+ original_data = self.founders[column]
+ expected_data = original_data + original_data
+ self.assertEqual(row_stacked[column], expected_data)
+
+ def test_column_stacking(self):
+
+ """Column stacking"""
+
+ to_join = tablib.Dataset(headers=self.founders.headers)
+
+ for row in self.founders:
+ to_join.append(row=row)
+
+ column_stacked = self.founders.stack_columns(to_join)
+
+ for index, row in enumerate(column_stacked):
+
+ original_data = self.founders[index]
+ expected_data = original_data + original_data
+ self.assertEqual(row, expected_data)
+
+ self.assertEqual(column_stacked[0],
+ ("John", "Adams", 90, "John", "Adams", 90))
+
+
def test_wipe(self):
"""Purge a dataset."""