diff options
| author | Claude Paroz <claude@2xlibre.net> | 2019-11-07 23:05:40 +0100 |
|---|---|---|
| committer | Claude Paroz <claude@2xlibre.net> | 2019-11-10 18:00:31 +0100 |
| commit | 626a06274750669b12f794c6800c1abcfd48a0a6 (patch) | |
| tree | 681155be2941dd5af66495f2c971edc2f7da7540 /src/tablib | |
| parent | 9d2f7d69991a45fa60e495f3bfa58d47dbaebc68 (diff) | |
| download | tablib-626a06274750669b12f794c6800c1abcfd48a0a6.tar.gz | |
Fixes #421 - Make all dependencies optional
Thanks Hugo van Kemenade for the review.
Diffstat (limited to 'src/tablib')
| -rw-r--r-- | src/tablib/core.py | 27 | ||||
| -rw-r--r-- | src/tablib/exceptions.py | 18 | ||||
| -rw-r--r-- | src/tablib/formats/__init__.py | 52 |
3 files changed, 71 insertions, 26 deletions
diff --git a/src/tablib/core.py b/src/tablib/core.py index d17e1e8..9fcbebd 100644 --- a/src/tablib/core.py +++ b/src/tablib/core.py @@ -13,6 +13,13 @@ from copy import copy from operator import itemgetter from tablib import formats +from tablib.exceptions import ( + HeadersNeeded, + InvalidDatasetIndex, + InvalidDatasetType, + InvalidDimensions, + UnsupportedFormat, +) from tablib.formats import registry __title__ = 'tablib' @@ -903,24 +910,4 @@ def import_book(stream, format=None, **kwargs): return Databook().load(stream, format, **kwargs) -class InvalidDatasetType(Exception): - "Only Datasets can be added to a DataBook" - - -class InvalidDimensions(Exception): - "Invalid size" - - -class InvalidDatasetIndex(Exception): - "Outside of Dataset size" - - -class HeadersNeeded(Exception): - "Header parameter must be given when appending a column in this Dataset." - - -class UnsupportedFormat(NotImplementedError): - "Format is not supported" - - registry.register_builtins() diff --git a/src/tablib/exceptions.py b/src/tablib/exceptions.py new file mode 100644 index 0000000..dee2b29 --- /dev/null +++ b/src/tablib/exceptions.py @@ -0,0 +1,18 @@ +class InvalidDatasetType(Exception): + "Only Datasets can be added to a DataBook" + + +class InvalidDimensions(Exception): + "Invalid size" + + +class InvalidDatasetIndex(Exception): + "Outside of Dataset size" + + +class HeadersNeeded(Exception): + "Header parameter must be given when appending a column in this Dataset." + + +class UnsupportedFormat(NotImplementedError): + "Format is not supported" diff --git a/src/tablib/formats/__init__.py b/src/tablib/formats/__init__.py index a462ce0..c324484 100644 --- a/src/tablib/formats/__init__.py +++ b/src/tablib/formats/__init__.py @@ -2,6 +2,9 @@ """ from collections import OrderedDict from functools import partialmethod +from importlib.util import find_spec + +from tablib.exceptions import UnsupportedFormat from ._csv import CSVFormat from ._dbf import DBFFormat @@ -17,6 +20,33 @@ from ._xls import XLSFormat from ._xlsx import XLSXFormat from ._yaml import YAMLFormat +uninstalled_format_messages = { + 'df': ( + "The 'df' format is not available. You may want to install the pandas " + "package (or `pip install tablib[pandas]`)." + ), + 'html': ( + "The 'html' format is not available. You may want to install the MarkupPy " + "package (or `pip install tablib[html]`)." + ), + 'ods': ( + "The 'ods' format is not available. You may want to install the odfpy " + "package (or `pip install tablib[ods]`)." + ), + 'xls': ( + "The 'xls' format is not available. You may want to install the xlrd and " + "xlwt packages (or `pip install tablib[xls]`)." + ), + 'xlsx': ( + "The 'xlsx' format is not available. You may want to install the openpyxl " + "package (or `pip install tablib[xlsx]`)." + ), + 'yaml': ( + "The 'yaml' format is not available. You may want to install the pyyaml " + "package (or `pip install tablib[yaml]`)." + ), +} + class Registry: _formats = OrderedDict() @@ -53,17 +83,23 @@ class Registry: # Registration ordering matters for autodetection. self.register('json', JSONFormat()) # xlsx before as xls (xlrd) can also read xlsx - self.register('xlsx', XLSXFormat()) - self.register('xls', XLSFormat()) - self.register('yaml', YAMLFormat()) + if find_spec('openpyxl'): + self.register('xlsx', XLSXFormat()) + if find_spec('xlrd') and find_spec('xlwt'): + self.register('xls', XLSFormat()) + if find_spec('yaml'): + self.register('yaml', YAMLFormat()) self.register('csv', CSVFormat()) self.register('tsv', TSVFormat()) - self.register('ods', ODSFormat()) + if find_spec('odf'): + self.register('ods', ODSFormat()) self.register('dbf', DBFFormat()) - self.register('html', HTMLFormat()) + if find_spec('MarkupPy'): + self.register('html', HTMLFormat()) self.register('jira', JIRAFormat()) self.register('latex', LATEXFormat()) - self.register('df', DataFrameFormat()) + if find_spec('pandas'): + self.register('df', DataFrameFormat()) self.register('rst', ReSTFormat()) def formats(self): @@ -71,6 +107,10 @@ class Registry: yield frm def get_format(self, key): + if key not in self._formats: + if key in uninstalled_format_messages: + raise UnsupportedFormat(uninstalled_format_messages[key]) + raise UnsupportedFormat("Tablib has no format '%s' or it is not registered." % key) return self._formats[key] |
