Repository: jazzband/tablib
Pull request #365 (2019-05-16 10:29:48)

Avoid DeprecationWarning due to invalid escapes in docstrings
Will become a SyntaxError in Python 3.8:
https://bugs.python.org/issue32912


Patch:
diff --git a/.gitignore b/.gitignore
index 379075b..d6fdabd 100644
--- a/.gitignore
+++ b/.gitignore
@@ -29,3 +29,4 @@ junit-py27.xml
 
 # pyenv noise
 .python-version
+tablib.egg-info/*
diff --git a/.travis.yml b/.travis.yml
index 53af531..cd17bd1 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -1,10 +1,11 @@
 language: python
 cache: pip
-python:
-  - 2.7
-  - 3.4
-  - 3.5
-  - 3.6
+matrix:
+  include:
+    - python: 2.7
+    - python: 3.5
+    - python: 3.6
+    - python: 3.7
 install:
   - pip install -r requirements.txt
 script: python test_tablib.py
diff --git a/HISTORY.rst b/HISTORY.md
similarity index 53%
rename from HISTORY.rst
rename to HISTORY.md
index 5e9401f..f23994f 100644
--- a/HISTORY.rst
+++ b/HISTORY.md
@@ -1,120 +1,105 @@
-History
--------
+# History
 
-0.11.5 (2017-06-13)
-+++++++++++++++++++
+## 0.11.5 (2017-06-13)
 
-- Use ``yaml.safe_load`` for importing yaml.
+- Use `yaml.safe_load` for importing yaml.
 
-0.11.4 (2017-01-23)
-+++++++++++++++++++
+## 0.11.4 (2017-01-23)
 
 - Use built-in `json` package if available
 - Support Python 3.5+ in classifiers
 
-** Bugfixes **
+### Bugfixes
 
 - Fixed textual representation for Dataset with no headers
 - Handle decimal types
 
-0.11.3 (2016-02-16)
-+++++++++++++++++++
+## 0.11.3 (2016-02-16)
 
 - Release fix.
 
-0.11.2 (2016-02-16)
-+++++++++++++++++++
+## 0.11.2 (2016-02-16)
 
-**Bugfixes**
+### Bugfixes
 
 - Fix export only formats.
 - Fix for xlsx output.
 
-0.11.1 (2016-02-07)
-+++++++++++++++++++
+## 0.11.1 (2016-02-07)
 
-**Bugfixes**
+### Bugfixes
 
 - Fixed packaging error on Python 3.
 
 
-0.11.0 (2016-02-07)
-+++++++++++++++++++
+## 0.11.0 (2016-02-07)
 
-**New Formats!**
+### New Formats!
 
-- Added LaTeX table export format (``Dataset.latex``).
-- Support for dBase (DBF) files (``Dataset.dbf``).
+- Added LaTeX table export format (`Dataset.latex`).
+- Support for dBase (DBF) files (`Dataset.dbf`).
 
-**Improvements**
+### Improvements
 
-- New import/export interface (``Dataset.export()``, ``Dataset.load()``).
-- CSV custom delimiter support (``Dataset.export('csv', delimiter='$')``).
-- Adding ability to remove duplicates to all rows in a dataset (``Dataset.remove_duplicates()``).
-- Added a mechanism to avoid ``datetime.datetime`` issues when serializing data.
-- New ``detect_format()`` function (mostly for internal use).
-- Update the vendored unicodecsv to fix ``None`` handling.
+- New import/export interface (`Dataset.export()`, `Dataset.load()`).
+- CSV custom delimiter support (`Dataset.export('csv', delimiter='$')`).
+- Adding ability to remove duplicates to all rows in a dataset (`Dataset.remove_duplicates()`).
+- Added a mechanism to avoid `datetime.datetime` issues when serializing data.
+- New `detect_format()` function (mostly for internal use).
+- Update the vendored unicodecsv to fix `None` handling.
 - Only freeze the headers row, not the headers columns (xls).
 
-**Breaking Changes**
+### Breaking Changes
 
-- ``detect()`` function removed.
+- `detect()` function removed.
 
-**Bugfixes**
+### Bugfixes
 
 - Fix XLSX import.
-- Bugfix for ``Dataset.transpose().transpose()``.
+- Bugfix for `Dataset.transpose().transpose()`.
 
 
-0.10.0 (2014-05-27)
-+++++++++++++++++++
+## 0.10.0 (2014-05-27)
 
 * Unicode Column Headers
 * ALL the bugfixes!
 
-0.9.11 (2011-06-30)
-+++++++++++++++++++
+## 0.9.11 (2011-06-30)
 
 * Bugfixes
 
-0.9.10 (2011-06-22)
-+++++++++++++++++++
+## 0.9.10 (2011-06-22)
 
 * Bugfixes
 
-0.9.9 (2011-06-21)
-++++++++++++++++++
+## 0.9.9 (2011-06-21)
 
 * Dataset API Changes
-* ``stack_rows`` => ``stack``, ``stack_columns`` => ``stack_cols``
-* column operations have their own methods now (``append_col``, ``insert_col``)
-* List-style ``pop()``
-* Redis-style ``rpush``, ``lpush``, ``rpop``, ``lpop``, ``rpush_col``, and ``lpush_col``
+* `stack_rows` => `stack`, `stack_columns` => `stack_cols`
+* column operations have their own methods now (`append_col`, `insert_col`)
+* List-style `pop()`
+* Redis-style `rpush`, `lpush`, `rpop`, `lpop`, `rpush_col`, and `lpush_col`
 
-0.9.8 (2011-05-22)
-++++++++++++++++++
+## 0.9.8 (2011-05-22)
 
 * OpenDocument Spreadsheet support (.ods)
 * Full Unicode TSV support
 
 
-0.9.7 (2011-05-12)
-++++++++++++++++++
+## 0.9.7 (2011-05-12)
 
 * Full XLSX Support!
 * Pickling Bugfix
 * Compat Module
 
 
-0.9.6 (2011-05-12)
-++++++++++++++++++
+## 0.9.6 (2011-05-12)
 
-* ``seperators`` renamed to ``separators``
+* `seperators` renamed to `separators`
 * Full unicode CSV support
 
 
-0.9.5 (2011-03-24)
-++++++++++++++++++
+## 0.9.5 (2011-03-24)
 
 * Python 3.1, Python 3.2 Support (same code base!)
 * Formatter callback support
@@ -122,8 +107,7 @@ History
 
 
 
-0.9.4 (2011-02-18)
-++++++++++++++++++
+## 0.9.4 (2011-02-18)
 
 * Python 2.5 Support!
 * Tox Testing for 2.5, 2.6, 2.7
@@ -132,16 +116,14 @@ History
 * Caved to community pressure (spaces)
 
 
-0.9.3 (2011-01-31)
-++++++++++++++++++
+## 0.9.3 (2011-01-31)
 
 * Databook duplication leak fix.
 * HTML Table output.
 * Added column sorting.
 
 
-0.9.2 (2010-11-17)
-++++++++++++++++++
+## 0.9.2 (2010-11-17)
 
 * Transpose method added to Datasets.
 * New frozen top row in Excel output.
@@ -149,14 +131,12 @@ History
 * Support for row/column stacking.
 
 
-0.9.1 (2010-11-04)
-++++++++++++++++++
+## 0.9.1 (2010-11-04)
 
 * Minor reference shadowing bugfix.
 
 
-0.9.0 (2010-11-04)
-++++++++++++++++++
+## 0.9.0 (2010-11-04)
 
 * Massive documentation update!
 * Tablib.org!
@@ -166,56 +146,48 @@ History
 * Internal Changes (Row object and use thereof)
 
 
-0.8.5 (2010-10-06)
-++++++++++++++++++
+## 0.8.5 (2010-10-06)
 
 * New import system. All dependencies attempt to load from site-packages,
   then fallback on tenderized modules.
 
 
-0.8.4 (2010-10-04)
-++++++++++++++++++
+## 0.8.4 (2010-10-04)
 
 * Updated XLS output: Only wrap if '\\n' in cell.
 
 
-0.8.3 (2010-10-04)
-++++++++++++++++++
+## 0.8.3 (2010-10-04)
 
 * Ability to append new column passing a callable
   as the value that will be applied to every row.
 
 
-0.8.2 (2010-10-04)
-++++++++++++++++++
+## 0.8.2 (2010-10-04)
 
 * Added alignment wrapping to written cells.
 * Added separator support to XLS.
 
 
-0.8.1 (2010-09-28)
-++++++++++++++++++
+## 0.8.1 (2010-09-28)
 
 * Packaging Fix
 
 
-0.8.0 (2010-09-25)
-++++++++++++++++++
+## 0.8.0 (2010-09-25)
 
 * New format plugin system!
 * Imports! ELEGANT Imports!
 * Tests. Lots of tests.
 
 
-0.7.1 (2010-09-20)
-++++++++++++++++++
+## 0.7.1 (2010-09-20)
 
 * Reverting methods back to properties.
 * Windows bug compensated in documentation.
 
 
-0.7.0 (2010-09-20)
-++++++++++++++++++
+## 0.7.0 (2010-09-20)
 
 * Renamed DataBook Databook for consistency.
 * Export properties changed to methods (XLS filename / StringIO bug).
@@ -223,32 +195,29 @@ History
 * Added utf-8 on the worksheet level.
 
 
-0.6.4 (2010-09-19)
-++++++++++++++++++
+## 0.6.4 (2010-09-19)
 
 * Updated unicode export for XLS.
 * More exhaustive unit tests.
 
 
-0.6.3 (2010-09-14)
-++++++++++++++++++
+## 0.6.3 (2010-09-14)
+
 * Added Dataset.append() support for columns.
 
 
-0.6.2 (2010-09-13)
-++++++++++++++++++
+## 0.6.2 (2010-09-13)
+
 * Fixed Dataset.append() error on empty dataset.
 * Updated Dataset.headers property w/ validation.
 * Added Testing Fixtures.
 
-0.6.1 (2010-09-12)
-++++++++++++++++++
+## 0.6.1 (2010-09-12)
 
 * Packaging hotfixes.
 
 
-0.6.0 (2010-09-11)
-++++++++++++++++++
+## 0.6.0 (2010-09-11)
 
 * Public Release.
 * Export Support for XLS, JSON, YAML, and CSV.
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..09518b3
--- /dev/null
+++ b/README.md
@@ -0,0 +1,180 @@
+# Tablib: format-agnostic tabular dataset library
+
+[![Jazzband](https://jazzband.co/static/img/badge.svg)](https://jazzband.co/)
+[![Build Status](https://travis-ci.org/jazzband/tablib.svg?branch=master)](https://travis-ci.org/jazzband/tablib)
+
+    _____         ______  ___________ ______
+    __  /_______ ____  /_ ___  /___(_)___  /_
+    _  __/_  __ `/__  __ \__  / __  / __  __ \
+    / /_  / /_/ / _  /_/ /_  /  _  /  _  /_/ /
+    \__/  \__,_/  /_.___/ /_/   /_/   /_.___/
+
+
+Tablib is a format-agnostic tabular dataset library, written in Python.
+
+Output formats supported:
+
+- Excel (Sets + Books)
+- JSON (Sets + Books)
+- YAML (Sets + Books)
+- Pandas DataFrames (Sets)
+- HTML (Sets)
+- Jira (Sets)
+- TSV (Sets)
+- ODS (Sets)
+- CSV (Sets)
+- DBF (Sets)
+
+Note that tablib *purposefully* excludes XML support. It always will. (Note: This is a
+joke. Pull requests are welcome.)
+
+If you're interested in financially supporting Kenneth Reitz open source, consider
+[visiting this link](https://cash.me/$KennethReitz>). Your support helps tremendously
+with sustainability of motivation, as Open Source is no longer part of my day job.
+
+
+## Overview
+
+`tablib.Dataset()`
+
+A Dataset is a table of tabular data.
+It may or may not have a header row.
+They can be build and manipulated as raw Python datatypes (Lists of tuples|dictionaries).
+Datasets can be imported from JSON, YAML, DBF, and CSV;
+they can be exported to XLSX, XLS, ODS, JSON, YAML, DBF, CSV, TSV, and HTML.
+
+`tablib.Databook()`
+
+A Databook is a set of Datasets.
+The most common form of a Databook is an Excel file with multiple spreadsheets.
+Databooks can be imported from JSON and YAML;
+they can be exported to XLSX, XLS, ODS, JSON, and YAML.
+
+
+## Usage
+
+Populate fresh data files:
+
+```python
+headers = ('first_name', 'last_name')
+
+data = [
+    ('John', 'Adams'),
+    ('George', 'Washington')
+]
+
+data = tablib.Dataset(*data, headers=headers)
+```
+
+Intelligently add new rows:
+
+```python
+>>> data.append(('Henry', 'Ford'))
+```
+
+Intelligently add new columns:
+
+```python
+>>> data.append_col((90, 67, 83), header='age')
+```
+
+Slice rows:
+
+```python
+>>> print(data[:2])
+[('John', 'Adams', 90), ('George', 'Washington', 67)]
+```
+
+Slice columns by header:
+
+```python
+>>> print(data['first_name'])
+['John', 'George', 'Henry']
+```
+
+Easily delete rows:
+
+```python
+>>> del data[1]
+```
+
+
+## Exports
+
+Drumroll please...........
+
+### JSON!
+
+```python
+>>> print(data.export('json'))
+[
+  {
+    "last_name": "Adams",
+    "age": 90,
+    "first_name": "John"
+  },
+  {
+    "last_name": "Ford",
+    "age": 83,
+    "first_name": "Henry"
+  }
+]
+```
+
+### YAML!
+
+```python
+>>> print(data.export('yaml'))
+- {age: 90, first_name: John, last_name: Adams}
+- {age: 83, first_name: Henry, last_name: Ford}
+```
+
+### CSV...
+
+```python
+>>> print(data.export('csv'))
+first_name,last_name,age
+John,Adams,90
+Henry,Ford,83
+```
+
+### EXCEL!
+
+```python
+>>> with open('people.xls', 'wb') as f:
+...     f.write(data.export('xls'))
+```
+
+### DBF!
+
+```python
+>>> with open('people.dbf', 'wb') as f:
+...     f.write(data.export('dbf'))
+```
+
+### Pandas DataFrame!
+
+```python
+>>> print(data.export('df')):
+      first_name last_name  age
+0       John     Adams   90
+1      Henry      Ford   83
+```
+
+It's that easy.
+
+
+## Installation
+
+To install tablib, simply:
+
+```console
+$ pip install tablib[pandas]
+```
+
+Make sure to check out [Tablib on PyPI](https://pypi.python.org/pypi/tablib/)!
+
+
+## Contribute
+
+Please see the [contributing guide](https://github.com/jazzband/tablib/blob/master/.github/CONTRIBUTING.md).
diff --git a/README.rst b/README.rst
deleted file mode 100644
index ecdbc56..0000000
--- a/README.rst
+++ /dev/null
@@ -1,179 +0,0 @@
-Tablib: format-agnostic tabular dataset library
-===============================================
-
-.. image:: https://travis-ci.org/kennethreitz/tablib.svg?branch=master
-    :target: https://travis-ci.org/kennethreitz/tablib
-
-::
-
-    _____         ______  ___________ ______
-    __  /_______ ____  /_ ___  /___(_)___  /_
-    _  __/_  __ `/__  __ \__  / __  / __  __ \
-    / /_  / /_/ / _  /_/ /_  /  _  /  _  /_/ /
-    \__/  \__,_/  /_.___/ /_/   /_/   /_.___/
-
-
-
-Tablib is a format-agnostic tabular dataset library, written in Python.
-
-Output formats supported:
-
-- Excel (Sets + Books)
-- JSON (Sets + Books)
-- YAML (Sets + Books)
-- Pandas DataFrames (Sets)
-- HTML (Sets)
-- Jira (Sets)
-- TSV (Sets)
-- ODS (Sets)
-- CSV (Sets)
-- DBF (Sets)
-
-Note that tablib *purposefully* excludes XML support. It always will. (Note: This is a joke. Pull requests are welcome.)
-
-If you're interested in financially supporting Kenneth Reitz open source, consider `visiting this link <https://cash.me/$KennethReitz>`_. Your support helps tremendously with sustainability of motivation, as Open Source is no longer part of my day job.
-
-Overview
---------
-
-`tablib.Dataset()`
-    A Dataset is a table of tabular data.
-    It may or may not have a header row.
-    They can be build and manipulated as raw Python datatypes (Lists of tuples|dictionaries).
-    Datasets can be imported from JSON, YAML, DBF, and CSV;
-    they can be exported to XLSX, XLS, ODS, JSON, YAML, DBF, CSV, TSV, and HTML.
-
-`tablib.Databook()`
-    A Databook is a set of Datasets.
-    The most common form of a Databook is an Excel file with multiple spreadsheets.
-    Databooks can be imported from JSON and YAML;
-    they can be exported to XLSX, XLS, ODS, JSON, and YAML.
-
-Usage
------
-
-
-Populate fresh data files: ::
-
-    headers = ('first_name', 'last_name')
-
-    data = [
-        ('John', 'Adams'),
-        ('George', 'Washington')
-    ]
-
-    data = tablib.Dataset(*data, headers=headers)
-
-
-Intelligently add new rows: ::
-
-    >>> data.append(('Henry', 'Ford'))
-
-Intelligently add new columns: ::
-
-    >>> data.append_col((90, 67, 83), header='age')
-
-Slice rows:  ::
-
-    >>> print(data[:2])
-    [('John', 'Adams', 90), ('George', 'Washington', 67)]
-
-
-Slice columns by header: ::
-
-    >>> print(data['first_name'])
-    ['John', 'George', 'Henry']
-
-Easily delete rows: ::
-
-    >>> del data[1]
-
-Exports
--------
-
-Drumroll please...........
-
-JSON!
-+++++
-::
-
-	>>> print(data.export('json'))
-	[
-	  {
-	    "last_name": "Adams",
-	    "age": 90,
-	    "first_name": "John"
-	  },
-	  {
-	    "last_name": "Ford",
-	    "age": 83,
-	    "first_name": "Henry"
-	  }
-	]
-
-
-YAML!
-+++++
-::
-
-	>>> print(data.export('yaml'))
-	- {age: 90, first_name: John, last_name: Adams}
-	- {age: 83, first_name: Henry, last_name: Ford}
-
-CSV...
-++++++
-::
-
-	>>> print(data.export('csv'))
-	first_name,last_name,age
-	John,Adams,90
-	Henry,Ford,83
-
-EXCEL!
-++++++
-::
-
-	>>> with open('people.xls', 'wb') as f:
-	...     f.write(data.export('xls'))
-
-DBF!
-++++
-::
-
-    >>> with open('people.dbf', 'wb') as f:
-    ...     f.write(data.export('dbf'))
-
-Pandas DataFrame!
-+++++++++++++++++
-::
-
-    >>> print(data.export('df')):
-          first_name last_name  age
-    0       John     Adams   90
-    1      Henry      Ford   83
-
-It's that easy.
-
-
-Installation
-------------
-
-To install tablib, simply: ::
-
-	$ pip install tablib[pandas]
-
-Make sure to check out `Tablib on PyPi <https://pypi.python.org/pypi/tablib/>`_!
-
-
-Contribute
-----------
-
-If you'd like to contribute, simply fork `the repository`_, commit your
-changes to the **develop** branch (or branch off of it), and send a pull
-request. Make sure you add yourself to AUTHORS_.
-
-
-
-
-.. _`the repository`: http://github.com/kennethreitz/tablib
-.. _AUTHORS: http://github.com/kennethreitz/tablib/blob/master/AUTHORS
diff --git a/docs/_templates/sidebarintro.html b/docs/_templates/sidebarintro.html
index 81f1166..8d19480 100644
--- a/docs/_templates/sidebarintro.html
+++ b/docs/_templates/sidebarintro.html
@@ -37,6 +37,6 @@
 <ul>
   <li><a href="http://docs.python-tablib.org/">The Tablib Website</a></li>
   <li><a href="http://pypi.python.org/pypi/tablib">Tablib @ PyPI</a></li>
-  <li><a href="http://github.com/kennethreitz/tablib">Tablib @ GitHub</a></li>
-  <li><a href="http://github.com/kennethreitz/tablib/issues">Issue Tracker</a></li>
+  <li><a href="http://github.com/jazzband/tablib">Tablib @ GitHub</a></li>
+  <li><a href="http://github.com/jazzband/tablib/issues">Issue Tracker</a></li>
 </ul>
diff --git a/docs/_themes/kr/layout.html b/docs/_themes/kr/layout.html
index 470f017..975b793 100644
--- a/docs/_themes/kr/layout.html
+++ b/docs/_themes/kr/layout.html
@@ -12,7 +12,7 @@
   <div class="footer">
       &copy; Copyright {{ copyright }}.
     </div>
-    <a href="https://github.com/kennethreitz/tablib">
+    <a href="https://github.com/jazzband/tablib">
         <img style="position: absolute; top: 0; right: 0; border: 0;" src="//s3.amazonaws.com/github/ribbons/forkme_right_darkblue_121621.png" alt="Fork me on GitHub" />
     </a>
 
diff --git a/docs/development.rst b/docs/development.rst
index 5dcd920..e3767fa 100644
--- a/docs/development.rst
+++ b/docs/development.rst
@@ -8,7 +8,7 @@ Tablib is under active development, and contributors are welcome.
 If you have a feature request, suggestion, or bug report, please open a new
 issue on GitHub_. To submit patches, please send a pull request on GitHub_.
 
-.. _GitHub: http://github.com/kennethreitz/tablib/
+.. _GitHub: http://github.com/jazzband/tablib/
 
 
 
@@ -45,12 +45,12 @@ The repository is publicly accessible.
 
 .. code-block:: console
 
-    git clone git://github.com/kennethreitz/tablib.git
+    git clone git://github.com/jazzband/tablib.git
 
 The project is hosted on **GitHub**.
 
     GitHub:
-        http://github.com/kennethreitz/tablib
+        http://github.com/jazzband/tablib
 
 
 Git Branch Structure
@@ -186,7 +186,7 @@ you will receive an email accordingly.
 
 Anyone may view the build status and history at any time.
 
-    https://travis-ci.org/kennethreitz/tablib
+    https://travis-ci.org/jazzband/tablib
 
 Additional reports will also be included here in the future, including :pep:`8` checks and stress reports for extremely large datasets.
 
diff --git a/docs/install.rst b/docs/install.rst
index 7246972..225f538 100644
--- a/docs/install.rst
+++ b/docs/install.rst
@@ -45,8 +45,8 @@ or install it into your site-packages easily.
 
 To download the full source history from Git, see :ref:`Source Control <scm>`.
 
-.. _tarball: http://github.com/kennethreitz/tablib/tarball/master
-.. _zipball: http://github.com/kennethreitz/tablib/zipball/master
+.. _tarball: http://github.com/jazzband/tablib/tarball/master
+.. _zipball: http://github.com/jazzband/tablib/zipball/master
 
 
 .. _updates:
@@ -57,7 +57,7 @@ Staying Updated
 The latest version of Tablib will always be available here:
 
 * PyPI: http://pypi.python.org/pypi/tablib/
-* GitHub: http://github.com/kennethreitz/tablib/
+* GitHub: http://github.com/jazzband/tablib/
 
 When a new version is available, upgrading is simple::
 
diff --git a/docs/intro.rst b/docs/intro.rst
index fabaa17..c1b94d9 100644
--- a/docs/intro.rst
+++ b/docs/intro.rst
@@ -74,17 +74,11 @@ THE SOFTWARE.
 Pythons Supported
 -----------------
 
-At this time, the following Python platforms are officially supported:
-
-* cPython 2.7
-* cPython 3.3
-* cPython 3.4
-* cPython 3.5
-* cPython 3.6
-
-Support for other Pythons will be rolled out soon.
-
-
+At this time, the following Python versions are officially supported:
 
+* CPython 2.7
+* CPython 3.5
+* CPython 3.6
+* CPython 3.7
 
 Now, go :ref:`Install Tablib <install>`.
diff --git a/setup.py b/setup.py
index 9b87c6b..ccde09a 100755
--- a/setup.py
+++ b/setup.py
@@ -48,8 +48,9 @@ setup(
     name='tablib',
     version=version,
     description='Format agnostic tabular data library (XLS, JSON, YAML, CSV)',
-    long_description=(open('README.rst').read() + '\n\n' +
-        open('HISTORY.rst').read()),
+    long_description=(open('README.md').read() + '\n\n' +
+        open('HISTORY.md').read()),
+    long_description_content_type="text/markdown",
     author='Kenneth Reitz',
     author_email='me@kennethreitz.org',
     url='http://python-tablib.org',
@@ -61,11 +62,14 @@ setup(
         'Natural Language :: English',
         'License :: OSI Approved :: MIT License',
         'Programming Language :: Python',
+        'Programming Language :: Python :: 2',
         'Programming Language :: Python :: 2.7',
-        'Programming Language :: Python :: 3.4',
+        'Programming Language :: Python :: 3',
         'Programming Language :: Python :: 3.5',
         'Programming Language :: Python :: 3.6',
+        'Programming Language :: Python :: 3.7',
     ],
+    python_requires='>=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*',
     tests_require=['pytest'],
     install_requires=install,
     extras_require={
diff --git a/tablib/core.py b/tablib/core.py
index 93caded..6432469 100644
--- a/tablib/core.py
+++ b/tablib/core.py
@@ -142,7 +142,7 @@ class Dataset(object):
 
         data = tablib.Dataset(*data, headers=headers)
 
-    :param \*args: (optional) list of rows to populate Dataset
+    :param \\*args: (optional) list of rows to populate Dataset
     :param headers: (optional) list strings for Dataset header row
     :param title: (optional) string to use as title of the Dataset
 
@@ -440,7 +440,7 @@ class Dataset(object):
         """
         Import `in_stream` to the :class:`Dataset` object using the `format`.
 
-        :param \*\*kwargs: (optional) custom configuration to the format `import_set`.
+        :param \\*\\*kwargs: (optional) custom configuration to the format `import_set`.
         """
 
         if not format:
@@ -459,7 +459,7 @@ class Dataset(object):
         """
         Export :class:`Dataset` object to `format`.
 
-        :param \*\*kwargs: (optional) custom configuration to the format `export_set`.
+        :param \\*\\*kwargs: (optional) custom configuration to the format `export_set`.
         """
         export_set, import_set = self._formats.get(format, (None, None))
         if not export_set:
@@ -1143,7 +1143,7 @@ class Databook(object):
         """
         Import `in_stream` to the :class:`Databook` object using the `format`.
 
-        :param \*\*kwargs: (optional) custom configuration to the format `import_book`.
+        :param \\*\\*kwargs: (optional) custom configuration to the format `import_book`.
         """
 
         if not format:
@@ -1160,7 +1160,7 @@ class Databook(object):
         """
         Export :class:`Databook` object to `format`.
 
-        :param \*\*kwargs: (optional) custom configuration to the format `export_book`.
+        :param \\*\\*kwargs: (optional) custom configuration to the format `export_book`.
         """
         export_book, import_book = self._formats.get(format, (None, None))
         if not export_book:
diff --git a/tablib/formats/_csv.py b/tablib/formats/_csv.py
index 8b536a7..9e8515a 100644
--- a/tablib/formats/_csv.py
+++ b/tablib/formats/_csv.py
@@ -13,8 +13,8 @@ extensions = ('csv',)
 DEFAULT_DELIMITER = unicode(',')
 
 
-def export_set(dataset, **kwargs):
-    """Returns CSV representation of Dataset."""
+def export_stream_set(dataset, **kwargs):
+    """Returns CSV representation of Dataset as file-like."""
     stream = StringIO()
 
     kwargs.setdefault('delimiter', DEFAULT_DELIMITER)
@@ -24,6 +24,13 @@ def export_set(dataset, **kwargs):
     for row in dataset._package(dicts=False):
         _csv.writerow(row)
 
+    stream.seek(0)
+    return stream
+
+
+def export_set(dataset, **kwargs):
+    """Returns CSV representation of Dataset."""
+    stream = export_stream_set(dataset, **kwargs)
     return stream.getvalue()
 
 
diff --git a/tox.ini b/tox.ini
index bc8ee43..0a954c4 100644
--- a/tox.ini
+++ b/tox.ini
@@ -1,6 +1,6 @@
 [tox]
 minversion = 2.4
-envlist = py27, py34, py35, py36
+envlist = py27, py35, py36, py37
 
 [testenv]
 deps = pytest


Test patch:
diff --git a/test_tablib.py b/test_tablib.py
index e7b7233..aad1668 100755
--- a/test_tablib.py
+++ b/test_tablib.py
@@ -13,7 +13,7 @@ from uuid import uuid4
 import tablib
 from tablib.compat import markup, unicode, is_py3
 from tablib.core import Row
-from tablib.formats import csv as csv_format
+from tablib.formats import _csv as csv_module
 
 
 class TablibTestCase(unittest.TestCase):
@@ -137,7 +137,7 @@ class TablibTestCase(unittest.TestCase):
         data.headers = self.headers
         data.append(self.john)
 
-        new_col = [10];
+        new_col = [10]
 
         data.append_col(new_col, header='age')
 
@@ -262,6 +262,24 @@ class TablibTestCase(unittest.TestCase):
 
         self.assertEqual(csv, self.founders.csv)
 
+    def test_csv_stream_export(self):
+        """Verify exporting dataset object as CSV from file object."""
+
+        # Build up the csv string with headers first, followed by each row
+        csv = ''
+        for col in self.headers:
+            csv += col + ','
+
+        csv = csv.strip(',') + '\r\n'
+
+        for founder in self.founders:
+            for col in founder:
+                csv += str(col) + ','
+            csv = csv.strip(',') + '\r\n'
+
+        csv_stream = csv_module.export_stream_set(self.founders)
+        self.assertEqual(csv, csv_stream.getvalue())
+
     def test_tsv_export(self):
         """Verify exporting dataset object as TSV."""