diff options
| author | Claude Paroz <claude@2xlibre.net> | 2019-10-05 15:03:49 +0200 |
|---|---|---|
| committer | Claude Paroz <claude@2xlibre.net> | 2019-11-02 17:44:05 +0100 |
| commit | f1046cd13ee5d7ab93b1bf31fdc2cb2a6fcd3d9a (patch) | |
| tree | 30c97ef1f9fcdd80603e9018a40c10d0083f41cd /src/tablib/formats/__init__.py | |
| parent | d21bd109087dd93d0a5611887297c7069fefe995 (diff) | |
| download | tablib-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__.py | 90 |
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() |
