summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorClaude Paroz <claude@2xlibre.net>2019-11-07 23:05:40 +0100
committerClaude Paroz <claude@2xlibre.net>2019-11-10 18:00:31 +0100
commit626a06274750669b12f794c6800c1abcfd48a0a6 (patch)
tree681155be2941dd5af66495f2c971edc2f7da7540 /src
parent9d2f7d69991a45fa60e495f3bfa58d47dbaebc68 (diff)
downloadtablib-626a06274750669b12f794c6800c1abcfd48a0a6.tar.gz
Fixes #421 - Make all dependencies optional
Thanks Hugo van Kemenade for the review.
Diffstat (limited to 'src')
-rw-r--r--src/tablib/core.py27
-rw-r--r--src/tablib/exceptions.py18
-rw-r--r--src/tablib/formats/__init__.py52
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]