summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKenneth Reitz <me@kennethreitz.com>2011-01-31 00:58:27 -0500
committerKenneth Reitz <me@kennethreitz.com>2011-01-31 00:58:27 -0500
commit695e8c5af7a0d66c6ea96dec535535b0e1ac25b0 (patch)
tree5cb6de300cc64b2f0eb7a721bec883acabd50d3a
parent0797ec67d4a4c6c145d86d0b7dca9d3b03c6d8e6 (diff)
parent1852624a7ebe88eba70b16eb6ea7c5032ec23346 (diff)
downloadtablib-695e8c5af7a0d66c6ea96dec535535b0e1ac25b0.tar.gz
Merge branch 'feature/sorting' into release/0.9.3
-rw-r--r--tablib/core.py20
-rwxr-xr-xtest_tablib.py15
2 files changed, 35 insertions, 0 deletions
diff --git a/tablib/core.py b/tablib/core.py
index 6eb57db..19eec3e 100644
--- a/tablib/core.py
+++ b/tablib/core.py
@@ -10,6 +10,7 @@
"""
from copy import copy
+from operator import itemgetter
from tablib import formats
@@ -528,6 +529,25 @@ class Dataset(object):
return _dset
+ def sort(self, col, reverse=False):
+
+ """Sort a :class:`Dataset` by a specific column. The order can be
+ reversed by setting ``reverse`` to ``True``. Requires headers to be
+ set. Returns a new :class:`Dataset` instance where columns have been
+ sorted."""
+
+ if not self.headers:
+ raise HeadersNeeded
+
+ _sorted = sorted(self.dict, key=itemgetter(col), reverse=reverse)
+ _dset = Dataset(headers=self.headers)
+
+ for item in _sorted:
+ row = [item[key] for key in self.headers]
+ _dset.append(row=row)
+
+ return _dset
+
def transpose(self):
"""Transpose a :class:`Dataset`, turning rows into columns and vice
versa, returning a new ``Dataset`` instance. The first row of the
diff --git a/test_tablib.py b/test_tablib.py
index 2d1f6b4..15630f2 100755
--- a/test_tablib.py
+++ b/test_tablib.py
@@ -425,7 +425,22 @@ class TablibTestCase(unittest.TestCase):
self.assertEqual(column_stacked[0],
("John", "Adams", 90, "John", "Adams", 90))
+ def test_sorting(self):
+ """Sort columns."""
+
+ sorted_data = self.founders.sort(col="first_name")
+
+ first_row = sorted_data[0]
+ second_row = sorted_data[2]
+ third_row = sorted_data[1]
+ expected_first = self.founders[1]
+ expected_second = self.founders[2]
+ expected_third = self.founders[0]
+
+ self.assertEqual(first_row, expected_first)
+ self.assertEqual(second_row, expected_second)
+ self.assertEqual(third_row, expected_third)
def test_wipe(self):
"""Purge a dataset."""