From 40490d1ba5a55dd39e77569eb6f150241fcdb946 Mon Sep 17 00:00:00 2001 From: Kenneth Reitz Date: Wed, 8 Sep 2010 17:35:13 -0400 Subject: [PATCH 1/2] Added base DataBook object. --- tablib/core.py | 69 +++++++++++++++++++++++++++++++++++++------------- 1 file changed, 51 insertions(+), 18 deletions(-) diff --git a/tablib/core.py b/tablib/core.py index 5427221..9dc0400 100644 --- a/tablib/core.py +++ b/tablib/core.py @@ -20,9 +20,9 @@ try: except ImportError, why: from packages import yaml - -__all__ = ['Dataset', 'source'] + +__all__ = ['Dataset', 'DataBook', 'source'] __version__ = '0.0.4' __build__ = '0x000004' @@ -42,8 +42,6 @@ class Dataset(object): self._data = None self._saved_file = None self._saved_format = None - - self._data = list(args) try: @@ -56,11 +54,11 @@ class Dataset(object): except KeyError, why: self.title = None - + def __len__(self): return self.height - + def __getitem__(self, key): if is_string(key): if key in self.headers: @@ -80,7 +78,7 @@ class Dataset(object): def __delitem__(self, key): del self._data[key] - + def __repr__(self): if self.title: return '<%s dataset>' % (self.title.lower()) @@ -130,13 +128,13 @@ class Dataset(object): except KeyError, why: return 0 - + @property def json(self): """Returns JSON representation of Dataset.""" return json.dumps(self._package()) - + @property def yaml(self): """Returns YAML representation of Dataset.""" @@ -151,7 +149,7 @@ class Dataset(object): for row in self._package(dicts=False): _csv.writerow(row) - + return stream.getvalue() @@ -159,7 +157,7 @@ class Dataset(object): def xls(self): """Returns XLS representation of Dataset.""" stream = cStringIO.StringIO() - + wb = xlwt.Workbook() ws = wb.add_sheet(self.title if self.title else 'Tabbed Dataset') # for row in self._package(dicts=False): @@ -170,12 +168,13 @@ class Dataset(object): wb.save(stream) return stream.getvalue() - + def append(self, row): """Adds a row to the end of Dataset""" self._validate(row) self._data.append(tuple(row)) + def index(self, i, row): """Inserts a row at given position in Dataset""" self._validate(row) @@ -186,32 +185,66 @@ class Dataset(object): # todo: accpept string if headers, or index nubmer pass - def save(self, filename=None, format=None): """Saves dataset""" if not format: format = filename.split('.')[-1].lower() # set format from filename - + if format not in FILE_EXTENSIONS: raise UnsupportedFormat - + # note export format # open file, save the bitch - + def export(self): """Exports Dataset to given filename or file-object.""" + pass +class DataBook(object): + """A book of Dataset objects. + Currently, this exists only for excel workbook support. + """ + + def __init__(self): + self._datasets = [] + + + def add_book(self, dataset): + """Add given .""" + if type(dataset) is Dataset: + self._datasets.append(dataset) + else: + raise InvalidDatasetType + + + def export(self): + pass + + + @property + def size(self): + """The number of the Datasets within DataBook.""" + return len(self._datasets) + + + @property + def xls(self): + pass + + + +class InvalidDatasetType(Exception): + "Only Datasets can be added to a DataBook" + class InvalidDimensions(Exception): "Invalid size" - class UnsupportedFormat(NotImplementedError): "Format is not supported" - def source(src=None, file=None, filename=None): """docstring for import""" From d52537b75b016a9d8128998236badd980848394f Mon Sep 17 00:00:00 2001 From: Kenneth Reitz Date: Wed, 8 Sep 2010 18:05:32 -0400 Subject: [PATCH 2/2] Added workbook feature for xls support. Other formats expected. --- tablib/core.py | 25 ++++++++++++++++++------- tablib/tests/tests.py | 39 +++++++++++++++++++++++++++++++-------- 2 files changed, 49 insertions(+), 15 deletions(-) diff --git a/tablib/core.py b/tablib/core.py index 9dc0400..8a9e1c2 100644 --- a/tablib/core.py +++ b/tablib/core.py @@ -14,6 +14,8 @@ import os from helpers import * from packages import simplejson as json from packages import xlwt +import random + try: import yaml @@ -205,7 +207,7 @@ class Dataset(object): class DataBook(object): """A book of Dataset objects. - Currently, this exists only for excel workbook support. + Currently, this exists only for XLS workbook support. """ def __init__(self): @@ -219,11 +221,6 @@ class DataBook(object): else: raise InvalidDatasetType - - def export(self): - pass - - @property def size(self): """The number of the Datasets within DataBook.""" @@ -232,7 +229,21 @@ class DataBook(object): @property def xls(self): - pass + """Returns XLS representation of DataBook.""" + + stream = cStringIO.StringIO() + wb = xlwt.Workbook() + + for dset in self._datasets: + ws = wb.add_sheet(dset.title if dset.title else 'Tabbed Dataset %s' % (int(random.random() * 100000000))) + + #for row in self._package(dicts=False): + for i, row in enumerate(dset._package(dicts=False)): + for j, col in enumerate(row): + ws.write(i, j, col) + + wb.save(stream) + return stream.getvalue() diff --git a/tablib/tests/tests.py b/tablib/tests/tests.py index 55fa083..42b6110 100644 --- a/tablib/tests/tests.py +++ b/tablib/tests/tests.py @@ -10,17 +10,40 @@ data = [ data = tablib.Dataset(*data, headers=headers) -#print data[1] -data.append(['kenneth' ,'reitz', 4.3]) +data.append(['Kenneth' ,'Reitz', 4.3]) +#print '***WITH HEADERS***' -#print data.digest() +#print 'First Names:\n', +#print data['first_name'] +#print '\nYAML:' #print data.yaml +# +#print 'JSON:' #print data.json +# +#print '\nCSV:' +#print data.csv +# +# +#print '***AND WITHOUT HEADERS***' +# +#data.headers = None +# +#print '\nYAML:' +#print data.yaml +# +#print 'JSON:' +#print data.json +# +#print '\nCSV:' +#print data.csv + +book = tablib.DataBook() +book.add_book(data) +book.add_book(data) + +print book.xls + -data.headers = None -print data.csv -#print len(data.xls) -print data.yaml -print data.json \ No newline at end of file