diff --git a/HISTORY.rst b/HISTORY.rst index c113ff5..ca0470f 100644 --- a/HISTORY.rst +++ b/HISTORY.rst @@ -1,11 +1,20 @@ History ======= -0.6.4 (2010-09-13) +0.7.0 (2010-09-20) ------------------ -* Updated unicode export for XLS -* More exhaustive unit tests +* Renamed DataBook Databook for consistiency. +* Export properties changed to methods (XLS filename / StringIO bug). +* Optional Dataset.xls(path='filename') support (for writing on windows). +* Added utf-8 on the worksheet level. + + +0.6.4 (2010-09-19) +------------------ + +* Updated unicode export for XLS. +* More exhaustive unit tests. 0.6.3 (2010-09-14) diff --git a/README.rst b/README.rst index 32d477f..4fe26bd 100644 --- a/README.rst +++ b/README.rst @@ -70,7 +70,7 @@ JSON! +++++ :: - >>> print data.json + >>> print data.json() [ { "last_name": "Adams", @@ -89,7 +89,7 @@ YAML! +++++ :: - >>> print data.yaml + >>> print data.yaml() - {age: 90, first_name: John, last_name: Adams} - {age: 83, first_name: Henry, last_name: Ford} @@ -97,7 +97,7 @@ CSV... ++++++ :: - >>> print data.csv + >>> print data.csv() first_name,last_name,age John,Adams,90 Henry,Ford,83 @@ -106,8 +106,8 @@ EXCEL! ++++++ :: - >>> open('people.xls').write(data.xls) - + >>> data.xls('people.xls') + It's that easy. diff --git a/setup.py b/setup.py index f9b71ea..c853439 100644 --- a/setup.py +++ b/setup.py @@ -18,7 +18,7 @@ if sys.argv[-1] == "publish": setup( name='tablib', - version='0.6.4', + version='0.7.0', description='Format agnostic tabular data library (XLS, JSON, YAML, CSV)', long_description=open('README.rst').read() + '\n\n' + open('HISTORY.rst').read(), diff --git a/tablib/core.py b/tablib/core.py index e97b8a6..f300be6 100644 --- a/tablib/core.py +++ b/tablib/core.py @@ -8,7 +8,7 @@ import csv -import cStringIO +import StringIO import random import simplejson as json @@ -21,8 +21,8 @@ from helpers import * # __all__ = ['Dataset', 'DataBook'] __name__ = 'tablib' -__version__ = '0.6.4' -__build__ = 0x000604 +__version__ = '0.7.0' +__build__ = 0x000700 __author__ = 'Kenneth Reitz' __license__ = 'MIT' __copyright__ = 'Copyright 2010 Kenneth Reitz' @@ -149,29 +149,25 @@ class Dataset(object): self.__headers = None - @property def dict(self): """Returns python dict of Dataset.""" return self._package() - @property def json(self): """Returns JSON representation of Dataset.""" return json.dumps(self.dict) - @property def yaml(self): """Returns YAML representation of Dataset.""" return yaml.dump(self.dict) - @property def csv(self): """Returns CSV representation of Dataset.""" - stream = cStringIO.StringIO() + stream = StringIO.StringIO() _csv = csv.writer(stream) for row in self._package(dicts=False): @@ -180,19 +176,23 @@ class Dataset(object): return stream.getvalue() - @property - def xls(self): + def xls(self, path=None): """Returns XLS representation of Dataset.""" - stream = cStringIO.StringIO() - wb = xlwt.Workbook() + wb = xlwt.Workbook(encoding='utf8') ws = wb.add_sheet(self.title if self.title else 'Tabbed Dataset') + for i, row in enumerate(self._package(dicts=False)): for j, col in enumerate(row): - ws.write(i, j, col.decode('utf8')) + ws.write(i, j, col) - wb.save(stream) - return stream.getvalue() + if path: + wb.save(path) + return True + else: + stream = StringIO.StringIO() + wb.save(stream) + return stream.getvalue() def append(self, row=None, col=None): @@ -227,7 +227,7 @@ class Dataset(object): pass -class DataBook(object): +class Databook(object): """A book of Dataset objects. Currently, this exists only for XLS workbook support. """ @@ -256,7 +256,7 @@ class DataBook(object): for dset in self._datasets: collector.append(dict( title = dset.title, - data = dset.dict + data = dset.dict() )) return collector @@ -267,12 +267,11 @@ class DataBook(object): return len(self._datasets) - @property - def xls(self): + def xls(self, path=None): """Returns XLS representation of DataBook.""" - stream = cStringIO.StringIO() - wb = xlwt.Workbook() + + wb = xlwt.Workbook(encoding='utf8') for i, dset in enumerate(self._datasets): ws = wb.add_sheet(dset.title if dset.title else 'Sheet%s' % (i)) @@ -280,20 +279,25 @@ class DataBook(object): #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, str(col)) + ws.write(i, j, col) + + + + if path: + wb.save(path) + return True + else: + stream = cStringIO.StringIO() + wb.save(stream) + return stream.getvalue() - wb.save(stream) - return stream.getvalue() - - @property def json(self): """Returns JSON representation of Databook.""" return json.dumps(self._package()) - @property def yaml(self): """Returns YAML representation of Databook.""" diff --git a/test_tablib.py b/test_tablib.py index 959a01c..fc8cb7d 100755 --- a/test_tablib.py +++ b/test_tablib.py @@ -167,7 +167,7 @@ class TablibTestCase(unittest.TestCase): csv += str(col) + ',' csv = csv.strip(',') + '\r\n' - self.assertEqual(csv, self.founders.csv) + self.assertEqual(csv, self.founders.csv()) def test_unicode_append(self): @@ -176,10 +176,10 @@ class TablibTestCase(unittest.TestCase): new_row = ('å', 'é') data.append(new_row) - data.json - data.yaml - data.csv - data.xls + data.json() + data.yaml() + data.csv() + data.xls() if __name__ == '__main__':