summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKenneth Reitz <me@kennethreitz.com>2010-09-25 18:03:03 -0400
committerKenneth Reitz <me@kennethreitz.com>2010-10-01 17:52:08 -0400
commiteaa4de779391d9cbfc970cd418ccb36efdde122e (patch)
treedc58128651c5ce4c43a6df37b96fb08b38698cc8
parentd479c5735ad5875fc2a953abd1c20654ddc83aef (diff)
downloadtablib-eaa4de779391d9cbfc970cd418ccb36efdde122e.tar.gz
Auto-detectors operational.
-rw-r--r--tablib/core.py10
-rw-r--r--tablib/formats/__init__.py2
-rw-r--r--tablib/formats/_csv.py9
-rw-r--r--tablib/formats/_json.py9
-rw-r--r--tablib/formats/_yaml.py13
-rwxr-xr-xtest_tablib.py37
6 files changed, 76 insertions, 4 deletions
diff --git a/tablib/core.py b/tablib/core.py
index dfb8027..5b6b8ca 100644
--- a/tablib/core.py
+++ b/tablib/core.py
@@ -277,6 +277,16 @@ class Databook(object):
return len(self._datasets)
+def detect(stream):
+ """Return (format, stream) of given stream."""
+ for fmt in formats:
+ try:
+ if fmt.detect(stream):
+ return (fmt, stream)
+ except AttributeError:
+ pass
+ return (None, stream)
+
class InvalidDatasetType(Exception):
"Only Datasets can be added to a DataBook"
diff --git a/tablib/formats/__init__.py b/tablib/formats/__init__.py
index b22a959..69eada7 100644
--- a/tablib/formats/__init__.py
+++ b/tablib/formats/__init__.py
@@ -8,4 +8,4 @@ import _json as json
import _xls as xls
import _yaml as yaml
-FORMATS = (csv, json, xls, yaml)
+FORMATS = (json, xls, yaml, csv)
diff --git a/tablib/formats/_csv.py b/tablib/formats/_csv.py
index 8b19da7..27d2e0d 100644
--- a/tablib/formats/_csv.py
+++ b/tablib/formats/_csv.py
@@ -40,3 +40,12 @@ def import_set(dset, in_stream, headers=True):
dset.headers = row
else:
dset.append(row)
+
+
+def detect(stream):
+ """Returns True if given stream is valid CSV."""
+ try:
+ rows = dialect = csv.Sniffer().sniff(stream)
+ return True
+ except csv.Error:
+ return False \ No newline at end of file
diff --git a/tablib/formats/_json.py b/tablib/formats/_json.py
index 1f92b58..f7c88ee 100644
--- a/tablib/formats/_json.py
+++ b/tablib/formats/_json.py
@@ -36,3 +36,12 @@ def import_book(dbook, in_stream):
data.title = sheet['title']
data.dict = sheet['data']
dbook.add_sheet(data)
+
+
+def detect(stream):
+ """Returns True if given stream is valid JSON."""
+ try:
+ json.loads(stream)
+ return True
+ except json.decoder.JSONDecodeError:
+ return False \ No newline at end of file
diff --git a/tablib/formats/_yaml.py b/tablib/formats/_yaml.py
index 4cac8aa..57d63d7 100644
--- a/tablib/formats/_yaml.py
+++ b/tablib/formats/_yaml.py
@@ -39,4 +39,15 @@ def import_book(dbook, in_stream):
data = tablib.core.Dataset()
data.title = sheet['title']
data.dict = sheet['data']
- dbook.add_sheet(data) \ No newline at end of file
+ dbook.add_sheet(data)
+
+def detect(stream):
+ """Returns True if given stream is valid YAML."""
+ try:
+ _yaml = yaml.load(stream)
+ if isinstance(_yaml, (list, tuple, dict)):
+ return True
+ else:
+ return False
+ except yaml.parser.ParserError:
+ return False \ No newline at end of file
diff --git a/test_tablib.py b/test_tablib.py
index 9c1941e..3f8ee37 100755
--- a/test_tablib.py
+++ b/test_tablib.py
@@ -269,9 +269,42 @@ class TablibTestCase(unittest.TestCase):
self.assertEqual(_csv, data.csv)
def test_csv_format_detect(self):
- """Test format detection."""
+ """Test CSV format detection."""
- pass
+ _csv = (
+ '1,2,3\n'
+ '4,5,6\n'
+ '7,8,9\n'
+ )
+ _bunk = (
+ '¡¡¡¡¡¡¡¡£™∞¢£§∞§¶•¶ª∞¶•ªº••ª–º§•†•§º¶•†¥ª–º•§ƒø¥¨©πƒø†ˆ¥ç©¨√øˆ¥≈†ƒ¥ç©ø¨çˆ¥ƒçø¶'
+ )
+
+ self.assertTrue(tablib.formats.csv.detect(_csv))
+ self.assertFalse(tablib.formats.csv.detect(_bunk))
+
+ def test_json_format_detect(self):
+ """Test JSON format detection."""
+
+ _json = '[{"last_name": "Adams","age": 90,"first_name": "John"}]'
+ _bunk = (
+ '¡¡¡¡¡¡¡¡£™∞¢£§∞§¶•¶ª∞¶•ªº••ª–º§•†•§º¶•†¥ª–º•§ƒø¥¨©πƒø†ˆ¥ç©¨√øˆ¥≈†ƒ¥ç©ø¨çˆ¥ƒçø¶'
+ )
+
+ self.assertTrue(tablib.formats.json.detect(_json))
+ self.assertFalse(tablib.formats.json.detect(_bunk))
+
+
+ def test_yaml_format_detect(self):
+ """Test YAML format detection."""
+
+ _yaml = '- {age: 90, first_name: John, last_name: Adams}'
+ _bunk = (
+ '¡¡¡¡¡¡---///\n\n\n¡¡£™∞¢£§∞§¶•¶ª∞¶•ªº••ª–º§•†•§º¶•†¥ª–º•§ƒø¥¨©πƒø†ˆ¥ç©¨√øˆ¥≈†ƒ¥ç©ø¨çˆ¥ƒçø¶'
+ )
+
+ self.assertTrue(tablib.formats.yaml.detect(_yaml))
+ self.assertFalse(tablib.formats.yaml.detect(_bunk))
def test_wipe(self):