From 20e2ce5ba0382f66eee747f932265087ef7c1ec8 Mon Sep 17 00:00:00 2001 From: rabinnankhwa Date: Sat, 30 Aug 2014 08:26:08 +0545 Subject: [PATCH 1/4] __getslice__ method of Row classcorrected --- tablib/core.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tablib/core.py b/tablib/core.py index 02c9085..e2116f8 100644 --- a/tablib/core.py +++ b/tablib/core.py @@ -45,7 +45,7 @@ class Row(object): return repr(self._row) def __getslice__(self, i, j): - return self._row[i,j] + return self._row[i:j] def __getitem__(self, i): return self._row[i] From 87892d7266d8808374d2c32becc9df4687431227 Mon Sep 17 00:00:00 2001 From: rabinnankhwa Date: Sat, 30 Aug 2014 08:56:17 +0545 Subject: [PATCH 2/4] used get method of dictionary instead of exception handling --- tablib/core.py | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/tablib/core.py b/tablib/core.py index e2116f8..76f4569 100644 --- a/tablib/core.py +++ b/tablib/core.py @@ -163,15 +163,9 @@ class Dataset(object): # (column, callback) tuples self._formatters = [] - try: - self.headers = kwargs['headers'] - except KeyError: - self.headers = None + self.headers = kwargs.get('headers') - try: - self.title = kwargs['title'] - except KeyError: - self.title = None + self.title = kwargs.get('title') self._register_formats() From f187cef5f45e8e4e59d15b732c6c8307142bb634 Mon Sep 17 00:00:00 2001 From: rabinnankhwa Date: Sat, 30 Aug 2014 23:52:35 +0545 Subject: [PATCH 3/4] adding support for creating subset of a dataset. --- AUTHORS | 1 + tablib/core.py | 36 ++++++++++++++++++++++++++++++++++++ test_tablib.py | 20 ++++++++++++++++++++ 3 files changed, 57 insertions(+) diff --git a/AUTHORS b/AUTHORS index bd0e0c4..309c1f5 100644 --- a/AUTHORS +++ b/AUTHORS @@ -28,3 +28,4 @@ Patches and Suggestions - Marc Abramowitz - Alex Gaynor - James Douglass +- Rabin Nankhwa \ No newline at end of file diff --git a/tablib/core.py b/tablib/core.py index 76f4569..3fc55cb 100644 --- a/tablib/core.py +++ b/tablib/core.py @@ -933,6 +933,42 @@ class Dataset(object): self.__headers = None + def subset(self, rows=None, cols=None): + """Returns a new instance of the :class:`Dataset`, + including only specified rows and columns. + """ + + # Don't return if no data + if not self: + return + + if rows is None: + rows = list(range(self.height)) + + if cols is None: + cols = list(self.headers) + + _dset = Dataset() + + #filtering rows and columns + _dset.headers = list(cols) + + _dset._data = [] + for row_no, row in enumerate(self._data): + data_row = [] + for key in _dset.headers: + if key in self.headers: + pos = self.headers.index(key) + data_row.append(row[pos]) + else: + raise KeyError + + if row_no in rows: + _dset.append(row=Row(data_row)) + + return _dset + + class Databook(object): """A book of :class:`Dataset` objects. diff --git a/test_tablib.py b/test_tablib.py index ba57170..54049b1 100755 --- a/test_tablib.py +++ b/test_tablib.py @@ -713,6 +713,26 @@ class TablibTestCase(unittest.TestCase): self.assertTrue(data[0] == new_row) + def test_subset(self): + """Create a subset of a dataset""" + + rows = (0, 2) + columns = ('first_name','gpa') + + data.headers = self.headers + + data.append(self.john) + data.append(self.george) + data.append(self.tom) + + #Verify data is truncated + subset = data.subset(rows=rows, cols=columns) + self.assertEqual(type(subset), tablib.Dataset) + self.assertEqual(subset.headers, list(columns)) + self.assertEqual(subset._data[0].list, ['John', 90]) + self.assertEqual(subset._data[1].list, ['Thomas', 50]) + + def test_formatters(self): """Confirm formatters are being triggered.""" From 5fbdd56fba67b259a2bee7979b20fbbd9a31dc63 Mon Sep 17 00:00:00 2001 From: rabinnankhwa Date: Sun, 31 Aug 2014 00:12:44 +0545 Subject: [PATCH 4/4] filter row and column values --- tablib/core.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tablib/core.py b/tablib/core.py index 3fc55cb..48758bd 100644 --- a/tablib/core.py +++ b/tablib/core.py @@ -948,6 +948,10 @@ class Dataset(object): if cols is None: cols = list(self.headers) + #filter out impossible rows and columns + rows = [row for row in rows if row in range(self.height)] + cols = [header for header in cols if header in self.headers] + _dset = Dataset() #filtering rows and columns