summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Santos <dfsantosbu@unal.edu.co>2019-12-10 00:04:03 +0100
committerHugo van Kemenade <hugovk@users.noreply.github.com>2019-12-10 01:04:03 +0200
commitfa30ea858d0ac41f2f542e0c50d9f9a2e343deb2 (patch)
tree43b8ec6362e4989a9b6669f82d1e15426d3f5f40
parent4de2e17984165400bc8aa610ea61c9f441ccbedb (diff)
downloadtablib-fa30ea858d0ac41f2f542e0c50d9f9a2e343deb2.tar.gz
Implement feature that allows to export tabular data suited to a… (#437)
-rw-r--r--docs/formats.rst25
-rwxr-xr-xsetup.py3
-rw-r--r--src/tablib/formats/__init__.py8
-rw-r--r--src/tablib/formats/_cli.py20
-rw-r--r--tests/requirements.txt1
-rwxr-xr-xtests/test_tablib.py11
6 files changed, 65 insertions, 3 deletions
diff --git a/docs/formats.rst b/docs/formats.rst
index 42b8cd5..9db94ce 100644
--- a/docs/formats.rst
+++ b/docs/formats.rst
@@ -7,6 +7,29 @@ Formats
Tablib supports a wide variety of different tabular formats, both for input and
output. Moreover, you can :ref:`register your own formats <newformats>`.
+cli
+===
+
+The ``cli`` format is currently export-only. The exports produce a representation
+table suited to a terminal.
+
+When exporting to a CLI you can pass the table format with the ``tablefmt``
+parameter, the supported formats are::
+
+ >>> import tabulate
+ >>> list(tabulate._table_formats)
+ ['simple', 'plain', 'grid', 'fancy_grid', 'github', 'pipe', 'orgtbl',
+ 'jira', 'presto', 'psql', 'rst', 'mediawiki', 'moinmoin', 'youtrack',
+ 'html', 'latex', 'latex_raw', 'latex_booktabs', 'tsv', 'textile']
+
+For example::
+
+ dataset.export("cli", tablefmt="github")
+ dataset.export("cli", tablefmt="grid")
+
+This format is optional, install Tablib with ``pip install tablib[cli]`` to
+make the format available.
+
csv
===
@@ -100,7 +123,7 @@ latex
Import/export using the LaTeX_ format. This format is export-only.
If a title has been set, it will be exported as the table caption.
-
+
.. _LaTeX: https://www.latex-project.org/
ods
diff --git a/setup.py b/setup.py
index e22ba11..f46ff1b 100755
--- a/setup.py
+++ b/setup.py
@@ -33,7 +33,8 @@ setup(
],
python_requires='>=3.5',
extras_require={
- 'all': ['markuppy', 'odfpy', 'openpyxl>=2.4.0', 'pandas', 'pyyaml', 'xlrd', 'xlwt'],
+ 'all': ['markuppy', 'odfpy', 'openpyxl>=2.4.0', 'pandas', 'pyyaml', 'tabulate', 'xlrd', 'xlwt'],
+ 'cli': ['tabulate'],
'html': ['markuppy'],
'ods': ['odfpy'],
'pandas': ['pandas'],
diff --git a/src/tablib/formats/__init__.py b/src/tablib/formats/__init__.py
index 5c46008..543f682 100644
--- a/src/tablib/formats/__init__.py
+++ b/src/tablib/formats/__init__.py
@@ -12,6 +12,10 @@ from ._json import JSONFormat
from ._tsv import TSVFormat
uninstalled_format_messages = {
+ 'cli': (
+ "The 'cli' format is not available. You may want to install the tabulate "
+ "package (or `pip install tablib[cli]`)."
+ ),
'df': (
"The 'df' format is not available. You may want to install the pandas "
"package (or `pip install tablib[pandas]`)."
@@ -88,7 +92,7 @@ class Registry:
def register(self, key, format_or_path):
from tablib.core import Databook, Dataset
- # Create Databook.<format> read or read/write properties
+ # Create Databook.<format> read or read/write properties
setattr(Databook, key, ImportExportBookDescriptor(key, format_or_path))
# Create Dataset.<format> read or read/write properties,
@@ -124,6 +128,8 @@ class Registry:
if find_spec('pandas'):
self.register('df', 'tablib.formats._df.DataFrameFormat')
self.register('rst', 'tablib.formats._rst.ReSTFormat')
+ if find_spec('tabulate'):
+ self.register('cli', 'tablib.formats._cli.CLIFormat')
def formats(self):
for key, frm in self._formats.items():
diff --git a/src/tablib/formats/_cli.py b/src/tablib/formats/_cli.py
new file mode 100644
index 0000000..0297ae8
--- /dev/null
+++ b/src/tablib/formats/_cli.py
@@ -0,0 +1,20 @@
+"""Tablib - Command-line Interface table export support.
+
+ Generates a representation for CLI from the dataset.
+ Wrapper for tabulate library.
+"""
+from tabulate import tabulate as Tabulate
+
+
+class CLIFormat:
+ """ Class responsible to export to CLI Format """
+ title = 'cli'
+ DEFAULT_FMT = 'plain'
+
+ @classmethod
+ def export_set(cls, dataset, **kwargs):
+ """Returns CLI representation of a Dataset."""
+ if dataset.headers:
+ kwargs.setdefault('headers', dataset.headers)
+ kwargs.setdefault('tablefmt', cls.DEFAULT_FMT)
+ return Tabulate(dataset, **kwargs)
diff --git a/tests/requirements.txt b/tests/requirements.txt
index dc91fc9..8d49fd2 100644
--- a/tests/requirements.txt
+++ b/tests/requirements.txt
@@ -5,5 +5,6 @@ odfpy
openpyxl>=2.4.0
pandas
pyyaml
+tabulate
xlrd
xlwt
diff --git a/tests/test_tablib.py b/tests/test_tablib.py
index 5754bb2..8918105 100755
--- a/tests/test_tablib.py
+++ b/tests/test_tablib.py
@@ -1288,3 +1288,14 @@ class DocTests(unittest.TestCase):
import tablib.formats._rst
results = doctest.testmod(tablib.formats._rst)
self.assertEqual(results.failed, 0)
+
+
+class CliTests(BaseTestCase):
+ def test_cli_export_github(self):
+ self.assertEqual('|---|---|---|\n| a | b | c |', tablib.Dataset(['a','b','c']).export('cli', tablefmt='github'))
+
+ def test_cli_export_simple(self):
+ self.assertEqual('- - -\na b c\n- - -', tablib.Dataset(['a','b','c']).export('cli', tablefmt='simple'))
+
+ def test_cli_export_grid(self):
+ self.assertEqual('+---+---+---+\n| a | b | c |\n+---+---+---+', tablib.Dataset(['a','b','c']).export('cli', tablefmt='grid'))