Skip to content

Commit

Permalink
smarter detect_format function
Browse files Browse the repository at this point in the history
  • Loading branch information
kennethreitz committed Feb 7, 2016
1 parent f7fc324 commit e51c4fa
Show file tree
Hide file tree
Showing 3 changed files with 32 additions and 47 deletions.
2 changes: 1 addition & 1 deletion tablib/__init__.py
Original file line number Diff line number Diff line change
@@ -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__
)
Expand Down
67 changes: 26 additions & 41 deletions tablib/core.py
Original file line number Diff line number Diff line change
Expand Up @@ -241,7 +241,6 @@ def __unicode__(self):
def __str__(self):
return self.__unicode__()


# ---------
# Internals
# ---------
Expand Down Expand Up @@ -431,17 +430,25 @@ def width(self):
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):
"""
Expand All @@ -451,7 +458,7 @@ def export(self, format, **kwargs):
"""
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)

Expand Down Expand Up @@ -1097,17 +1104,22 @@ def size(self):
"""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):
"""
Expand All @@ -1117,57 +1129,30 @@ def export(self, format, **kwargs):
"""
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):
Expand Down
10 changes: 5 additions & 5 deletions test_tablib.py
Original file line number Diff line number Diff line change
Expand Up @@ -716,11 +716,11 @@ def test_auto_format_detect(self):
_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):
Expand Down

0 comments on commit e51c4fa

Please sign in to comment.