diff options
author | Daniel Santos <dfsantosbu@unal.edu.co> | 2019-12-10 00:04:03 +0100 |
---|---|---|
committer | Hugo van Kemenade <hugovk@users.noreply.github.com> | 2019-12-10 01:04:03 +0200 |
commit | fa30ea858d0ac41f2f542e0c50d9f9a2e343deb2 (patch) | |
tree | 43b8ec6362e4989a9b6669f82d1e15426d3f5f40 | |
parent | 4de2e17984165400bc8aa610ea61c9f441ccbedb (diff) | |
download | tablib-fa30ea858d0ac41f2f542e0c50d9f9a2e343deb2.tar.gz |
Implement feature that allows to export tabular data suited to a… (#437)
-rw-r--r-- | docs/formats.rst | 25 | ||||
-rwxr-xr-x | setup.py | 3 | ||||
-rw-r--r-- | src/tablib/formats/__init__.py | 8 | ||||
-rw-r--r-- | src/tablib/formats/_cli.py | 20 | ||||
-rw-r--r-- | tests/requirements.txt | 1 | ||||
-rwxr-xr-x | tests/test_tablib.py | 11 |
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 @@ -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')) |