summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBruno Alla <bruno.alla@founders4schools.org.uk>2017-01-15 14:47:14 +0000
committerBruno Alla <bruno.alla@founders4schools.org.uk>2017-01-15 14:47:14 +0000
commita93f93a458f6ab3ce48439d2d571e4f88da4c024 (patch)
tree87269ecd3ded1ebdeed340d3ac560280e8505663
parent3d44bdec40f2572c985f763450aefce37b60380a (diff)
downloadtablib-a93f93a458f6ab3ce48439d2d571e4f88da4c024.tar.gz
Replaced vendored unicodecsv by a dependency
Using https://pypi.python.org/pypi/unicodecsv/0.14.1
-rwxr-xr-xsetup.py5
-rw-r--r--tablib/compat.py2
-rw-r--r--tablib/packages/unicodecsv/__init__.py197
3 files changed, 5 insertions, 199 deletions
diff --git a/setup.py b/setup.py
index b4b2054..2191a0e 100755
--- a/setup.py
+++ b/setup.py
@@ -40,7 +40,6 @@ packages = [
'tablib', 'tablib.formats',
'tablib.packages',
'tablib.packages.omnijson',
- 'tablib.packages.unicodecsv',
'tablib.packages.xlwt',
'tablib.packages.xlrd',
'tablib.packages.odf',
@@ -61,6 +60,9 @@ packages = [
'tablib.packages.dbfpy3'
]
+install = [
+ 'unicodecsv',
+]
setup(
name='tablib',
@@ -91,4 +93,5 @@ setup(
'Programming Language :: Python :: 3.6',
],
tests_require=['pytest'],
+ install_requires=install,
)
diff --git a/tablib/compat.py b/tablib/compat.py
index 2593e36..27ecd08 100644
--- a/tablib/compat.py
+++ b/tablib/compat.py
@@ -51,7 +51,7 @@ else:
from tablib.packages import openpyxl
from tablib.packages.odf import opendocument, style, text, table
- from tablib.packages import unicodecsv as csv
+ import unicodecsv as csv
import tablib.packages.dbfpy as dbfpy
unicode = unicode
diff --git a/tablib/packages/unicodecsv/__init__.py b/tablib/packages/unicodecsv/__init__.py
deleted file mode 100644
index 6a20118..0000000
--- a/tablib/packages/unicodecsv/__init__.py
+++ /dev/null
@@ -1,197 +0,0 @@
-# -*- coding: utf-8 -*-
-import csv
-try:
- from itertools import izip
-except ImportError:
- izip = zip
-
-#http://semver.org/
-VERSION = (0, 10, 1)
-__version__ = ".".join(map(str,VERSION))
-
-pass_throughs = [
- 'register_dialect',
- 'unregister_dialect',
- 'get_dialect',
- 'list_dialects',
- 'field_size_limit',
- 'Dialect',
- 'excel',
- 'excel_tab',
- 'Sniffer',
- 'QUOTE_ALL',
- 'QUOTE_MINIMAL',
- 'QUOTE_NONNUMERIC',
- 'QUOTE_NONE',
- 'Error'
-]
-__all__ = [
- 'reader',
- 'writer',
- 'DictReader',
- 'DictWriter',
-] + pass_throughs
-
-for prop in pass_throughs:
- globals()[prop]=getattr(csv, prop)
-
-def _stringify(s, encoding, errors):
- if s is None:
- return ''
- if isinstance(s, unicode):
- return s.encode(encoding, errors)
- elif isinstance(s, (int , float)):
- pass #let csv.QUOTE_NONNUMERIC do its thing.
- elif not isinstance(s, str):
- s=str(s)
- return s
-
-def _stringify_list(l, encoding, errors='strict'):
- try:
- return [_stringify(s, encoding, errors) for s in iter(l)]
- except TypeError as e:
- raise csv.Error(str(e))
-
-def _unicodify(s, encoding):
- if s is None:
- return None
- if isinstance(s, (unicode, int, float)):
- return s
- elif isinstance(s, str):
- return s.decode(encoding)
- return s
-
-class UnicodeWriter(object):
- """
- >>> import unicodecsv
- >>> from cStringIO import StringIO
- >>> f = StringIO()
- >>> w = unicodecsv.writer(f, encoding='utf-8')
- >>> w.writerow((u'é', u'ñ'))
- >>> f.seek(0)
- >>> r = unicodecsv.reader(f, encoding='utf-8')
- >>> row = r.next()
- >>> row[0] == u'é'
- True
- >>> row[1] == u'ñ'
- True
- """
- def __init__(self, f, dialect=csv.excel, encoding='utf-8', errors='strict',
- *args, **kwds):
- self.encoding = encoding
- self.writer = csv.writer(f, dialect, *args, **kwds)
- self.encoding_errors = errors
-
- def writerow(self, row):
- self.writer.writerow(_stringify_list(row, self.encoding, self.encoding_errors))
-
- def writerows(self, rows):
- for row in rows:
- self.writerow(row)
-
- @property
- def dialect(self):
- return self.writer.dialect
-writer = UnicodeWriter
-
-class UnicodeReader(object):
- def __init__(self, f, dialect=None, encoding='utf-8', errors='strict',
- **kwds):
- format_params = ['delimiter', 'doublequote', 'escapechar', 'lineterminator', 'quotechar', 'quoting', 'skipinitialspace']
- if dialect is None:
- if not any([kwd_name in format_params for kwd_name in kwds.keys()]):
- dialect = csv.excel
- self.reader = csv.reader(f, dialect, **kwds)
- self.encoding = encoding
- self.encoding_errors = errors
-
- def next(self):
- row = self.reader.next()
- encoding = self.encoding
- encoding_errors = self.encoding_errors
- float_ = float
- unicode_ = unicode
- return [(value if isinstance(value, float_) else
- unicode_(value, encoding, encoding_errors)) for value in row]
-
- def __iter__(self):
- return self
-
- @property
- def dialect(self):
- return self.reader.dialect
-
- @property
- def line_num(self):
- return self.reader.line_num
-reader = UnicodeReader
-
-class DictWriter(csv.DictWriter):
- """
- >>> from cStringIO import StringIO
- >>> f = StringIO()
- >>> w = DictWriter(f, ['a', u'ñ', 'b'], restval=u'î')
- >>> w.writerow({'a':'1', u'ñ':'2'})
- >>> w.writerow({'a':'1', u'ñ':'2', 'b':u'ø'})
- >>> w.writerow({'a':u'é', u'ñ':'2'})
- >>> f.seek(0)
- >>> r = DictReader(f, fieldnames=['a', u'ñ'], restkey='r')
- >>> r.next() == {'a': u'1', u'ñ':'2', 'r': [u'î']}
- True
- >>> r.next() == {'a': u'1', u'ñ':'2', 'r': [u'\xc3\xb8']}
- True
- >>> r.next() == {'a': u'\xc3\xa9', u'ñ':'2', 'r': [u'\xc3\xae']}
- True
- """
- def __init__(self, csvfile, fieldnames, restval='', extrasaction='raise', dialect='excel', encoding='utf-8', errors='strict', *args, **kwds):
- self.encoding = encoding
- csv.DictWriter.__init__(self, csvfile, fieldnames, restval, extrasaction, dialect, *args, **kwds)
- self.writer = UnicodeWriter(csvfile, dialect, encoding=encoding, errors=errors, *args, **kwds)
- self.encoding_errors = errors
-
- def writeheader(self):
- fieldnames = _stringify_list(self.fieldnames, self.encoding, self.encoding_errors)
- header = dict(zip(self.fieldnames, self.fieldnames))
- self.writerow(header)
-
-class DictReader(csv.DictReader):
- """
- >>> from cStringIO import StringIO
- >>> f = StringIO()
- >>> w = DictWriter(f, fieldnames=['name', 'place'])
- >>> w.writerow({'name': 'Cary Grant', 'place': 'hollywood'})
- >>> w.writerow({'name': 'Nathan Brillstone', 'place': u'øLand'})
- >>> w.writerow({'name': u'Willam ø. Unicoder', 'place': u'éSpandland'})
- >>> f.seek(0)
- >>> r = DictReader(f, fieldnames=['name', 'place'])
- >>> print r.next() == {'name': 'Cary Grant', 'place': 'hollywood'}
- True
- >>> print r.next() == {'name': 'Nathan Brillstone', 'place': u'øLand'}
- True
- >>> print r.next() == {'name': u'Willam ø. Unicoder', 'place': u'éSpandland'}
- True
- """
- def __init__(self, csvfile, fieldnames=None, restkey=None, restval=None,
- dialect='excel', encoding='utf-8', errors='strict', *args,
- **kwds):
- if fieldnames is not None:
- fieldnames = _stringify_list(fieldnames, encoding)
- csv.DictReader.__init__(self, csvfile, fieldnames, restkey, restval, dialect, *args, **kwds)
- self.reader = UnicodeReader(csvfile, dialect, encoding=encoding,
- errors=errors, *args, **kwds)
- if fieldnames is None and not hasattr(csv.DictReader, 'fieldnames'):
- # Python 2.5 fieldnames workaround. (http://bugs.python.org/issue3436)
- reader = UnicodeReader(csvfile, dialect, encoding=encoding, *args, **kwds)
- self.fieldnames = _stringify_list(reader.next(), reader.encoding)
- self.unicode_fieldnames = [_unicodify(f, encoding) for f in
- self.fieldnames]
- self.unicode_restkey = _unicodify(restkey, encoding)
-
- def next(self):
- row = csv.DictReader.next(self)
- result = dict((uni_key, row[str_key]) for (str_key, uni_key) in
- izip(self.fieldnames, self.unicode_fieldnames))
- rest = row.get(self.restkey)
- if rest:
- result[self.unicode_restkey] = rest
- return result