summaryrefslogtreecommitdiff
path: root/src/tablib/formats/__init__.py
diff options
context:
space:
mode:
authorClaude Paroz <claude@2xlibre.net>2019-10-05 15:03:49 +0200
committerClaude Paroz <claude@2xlibre.net>2019-11-02 17:44:05 +0100
commitf1046cd13ee5d7ab93b1bf31fdc2cb2a6fcd3d9a (patch)
tree30c97ef1f9fcdd80603e9018a40c10d0083f41cd /src/tablib/formats/__init__.py
parentd21bd109087dd93d0a5611887297c7069fefe995 (diff)
downloadtablib-f1046cd13ee5d7ab93b1bf31fdc2cb2a6fcd3d9a.tar.gz
Refs #256 - Implement class-based formats
This allows to extend Tablib with new formats far more easily.
Diffstat (limited to 'src/tablib/formats/__init__.py')
-rw-r--r--src/tablib/formats/__init__.py90
1 files changed, 74 insertions, 16 deletions
diff --git a/src/tablib/formats/__init__.py b/src/tablib/formats/__init__.py
index 12f2610..a462ce0 100644
--- a/src/tablib/formats/__init__.py
+++ b/src/tablib/formats/__init__.py
@@ -1,19 +1,77 @@
""" Tablib - formats
"""
+from collections import OrderedDict
+from functools import partialmethod
-from . import _csv as csv
-from . import _dbf as dbf
-from . import _df as df
-from . import _html as html
-from . import _jira as jira
-from . import _json as json
-from . import _latex as latex
-from . import _ods as ods
-from . import _rst as rst
-from . import _tsv as tsv
-from . import _xls as xls
-from . import _xlsx as xlsx
-from . import _yaml as yaml
-
-# xlsx before as xls (xlrd) can also read xlsx
-available = (json, xlsx, xls, yaml, csv, dbf, tsv, html, jira, latex, ods, df, rst)
+from ._csv import CSVFormat
+from ._dbf import DBFFormat
+from ._df import DataFrameFormat
+from ._html import HTMLFormat
+from ._jira import JIRAFormat
+from ._json import JSONFormat
+from ._latex import LATEXFormat
+from ._ods import ODSFormat
+from ._rst import ReSTFormat
+from ._tsv import TSVFormat
+from ._xls import XLSFormat
+from ._xlsx import XLSXFormat
+from ._yaml import YAMLFormat
+
+
+class Registry:
+ _formats = OrderedDict()
+
+ def register(self, key, format_):
+ from tablib.core import Databook, Dataset
+
+ # Create Databook.<format> read or read/write properties
+ try:
+ setattr(Databook, format_.title, property(format_.export_book, format_.import_book))
+ except AttributeError:
+ try:
+ setattr(Databook, format_.title, property(format_.export_book))
+ except AttributeError:
+ pass
+
+ # Create Dataset.<format> read or read/write properties,
+ # and Dataset.get_<format>/set_<format> methods.
+ try:
+ try:
+ setattr(Dataset, format_.title, property(format_.export_set, format_.import_set))
+ setattr(Dataset, 'get_%s' % format_.title, partialmethod(Dataset._get_in_format, format_))
+ setattr(Dataset, 'set_%s' % format_.title, partialmethod(Dataset._set_in_format, format_))
+ except AttributeError:
+ setattr(Dataset, format_.title, property(format_.export_set))
+ setattr(Dataset, 'get_%s' % format_.title, partialmethod(Dataset._get_in_format, format_))
+
+ except AttributeError:
+ raise Exception("Your format class should minimally implement the export_set interface.")
+
+ self._formats[key] = format_
+
+ def register_builtins(self):
+ # 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())
+ self.register('csv', CSVFormat())
+ self.register('tsv', TSVFormat())
+ self.register('ods', ODSFormat())
+ self.register('dbf', DBFFormat())
+ self.register('html', HTMLFormat())
+ self.register('jira', JIRAFormat())
+ self.register('latex', LATEXFormat())
+ self.register('df', DataFrameFormat())
+ self.register('rst', ReSTFormat())
+
+ def formats(self):
+ for frm in self._formats.values():
+ yield frm
+
+ def get_format(self, key):
+ return self._formats[key]
+
+
+registry = Registry()