smarter detect_format function

This commit is contained in:
2016-02-07 10:43:38 -05:00
parent f7fc3244ee
commit e51c4faec7
3 changed files with 30 additions and 45 deletions
+1 -1
View File
@@ -1,7 +1,7 @@
""" Tablib. """
from tablib.core import (
Databook, Dataset, detect, import_set, import_book,
Databook, Dataset, detect_format, import_set, import_book,
InvalidDatasetType, InvalidDimensions, UnsupportedFormat,
__version__
)
+24 -39
View File
@@ -241,7 +241,6 @@ class Dataset(object):
def __str__(self):
return self.__unicode__()
# ---------
# Internals
# ---------
@@ -431,17 +430,25 @@ class Dataset(object):
except TypeError:
return 0
def import_(self, format, in_stream, **kwargs):
def load(self, in_stream, format=None, **kwargs):
"""
Import `in_stream` to the :class:`Dataset` object using the `format`.
:param \*\*kwargs: (optional) custom configuration to the format `import_set`.
"""
if not format:
format = detect_format(in_stream)
export_set, import_set = self._formats.get(format, (None, None))
if not import_set:
raise UnsupportedFormat
raise UnsupportedFormat('Format {0} cannot be imported.'.format(format))
import_set(self, in_stream, **kwargs)
return self
def export(self, format, **kwargs):
"""
@@ -451,7 +458,7 @@ class Dataset(object):
"""
export_set, import_set = self._formats.get(format, (None, None))
if not export_set:
raise UnsupportedFormat
raise UnsupportedFormat('Format {0} cannot be exported.'.format(format))
return export_set(self, **kwargs)
@@ -1097,17 +1104,22 @@ class Databook(object):
"""The number of the :class:`Dataset` objects within :class:`Databook`."""
return len(self._datasets)
def import_(self, format, in_stream, **kwargs):
def load(self, format, in_stream, **kwargs):
"""
Import `in_stream` to the :class:`Databook` object using the `format`.
:param \*\*kwargs: (optional) custom configuration to the format `import_book`.
"""
if not format:
format = detect_format(in_stream)
export_book, import_book = self._formats.get(format, (None, None))
if not import_book:
raise UnsupportedFormat
raise UnsupportedFormat('Format {0} cannot be loaded.'.format(format))
import_book(self, in_stream, **kwargs)
return self
def export(self, format, **kwargs):
"""
@@ -1117,57 +1129,30 @@ class Databook(object):
"""
export_book, import_book = self._formats.get(format, (None, None))
if not export_book:
raise UnsupportedFormat
raise UnsupportedFormat('Format {0} cannot be exported.'.format(format))
return export_book(self, **kwargs)
def detect(stream):
"""Return (format, stream) of given stream."""
def detect_format(stream):
"""Return format name of given stream."""
for fmt in formats.available:
try:
if fmt.detect(stream):
return (fmt, stream)
return fmt.title
except AttributeError:
pass
return (None, stream)
def import_set(stream, format=None, **kwargs):
"""Return dataset of given stream."""
if format:
format = get_formatter(format)
else:
format, stream = detect(stream)
data = Dataset()
try:
format.import_set(data, stream, **kwargs)
return data
except AttributeError:
return None
return Dataset().load(stream, format, **kwargs)
def import_book(stream, format=None, **kwargs):
"""Return dataset of given stream."""
if format:
format = get_formatter(format)
else:
format, stream = detect(stream)
databook = Databook()
try:
format.import_book(databook, stream, **kwargs)
return databook
except AttributeError:
return None
def get_formatter(format):
for item in formats.available:
if item.title == format:
return item
raise UnsupportedFormat(format)
return Databook().load(stream, format, **kwargs)
class InvalidDatasetType(Exception):
+5 -5
View File
@@ -716,11 +716,11 @@ class TablibTestCase(unittest.TestCase):
_tsv = '1\t2\t3\n4\t5\t6\n7\t8\t9\n'
_bunk = '¡¡¡¡¡¡---///\n\n\n¡¡£™∞¢£§∞§¶•¶ª∞¶•ªº••ª–º§•†•§º¶•†¥ª–º•§ƒø¥¨©πƒø†ˆ¥ç©¨√øˆ¥≈†ƒ¥ç©ø¨çˆ¥ƒçø¶'
self.assertEqual(tablib.detect(_yaml)[0], tablib.formats.yaml)
self.assertEqual(tablib.detect(_csv)[0], tablib.formats.csv)
self.assertEqual(tablib.detect(_tsv)[0], tablib.formats.tsv)
self.assertEqual(tablib.detect(_json)[0], tablib.formats.json)
self.assertEqual(tablib.detect(_bunk)[0], None)
self.assertEqual(tablib.detect_format(_yaml), 'yaml')
self.assertEqual(tablib.detect_format(_csv), 'csv')
self.assertEqual(tablib.detect_format(_tsv), 'tsv')
self.assertEqual(tablib.detect_format(_json), 'json')
self.assertEqual(tablib.detect_format(_bunk), None)
def test_transpose(self):