add JSONSource test
This commit is contained in:
parent
e0e4dd43e2
commit
5ac3948ffe
@ -226,20 +226,20 @@ class FileSource(object):
|
|||||||
def __iter__(self):
|
def __iter__(self):
|
||||||
# This method would be a lot cleaner with the proposed
|
# This method would be a lot cleaner with the proposed
|
||||||
# 'yield from' expression (PEP 380)
|
# 'yield from' expression (PEP 380)
|
||||||
if hasattr(self._input, '__read__'):
|
if hasattr(self._input, '__read__') or hasattr(self._input, 'read'):
|
||||||
for record in self._process_file(input):
|
for record in self._process_file(self._input):
|
||||||
yield record
|
yield record
|
||||||
elif isinstance(self._input, basestring):
|
elif isinstance(self._input, str):
|
||||||
with open(self._input) as f:
|
with open(self._input) as f:
|
||||||
for record in self._process_file(f):
|
for record in self._process_file(f):
|
||||||
yield record
|
yield record
|
||||||
elif hasattr(self._input, '__iter__'):
|
elif hasattr(self._input, '__iter__'):
|
||||||
for el in self._input:
|
for el in self._input:
|
||||||
if isinstance(el, basestring):
|
if isinstance(el, str):
|
||||||
with open(el) as f:
|
with open(el) as f:
|
||||||
for record in self._process_file(f):
|
for record in self._process_file(f):
|
||||||
yield record
|
yield record
|
||||||
elif hasattr(el, '__read__'):
|
elif hasattr(el, '__read__') or hasattr(el, 'read'):
|
||||||
for record in self._process_file(f):
|
for record in self._process_file(f):
|
||||||
yield record
|
yield record
|
||||||
|
|
||||||
@ -256,10 +256,11 @@ class JSONSource(FileSource):
|
|||||||
object.
|
object.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def _process_file(self, file):
|
def _process_file(self, f):
|
||||||
|
|
||||||
import json
|
import json
|
||||||
|
|
||||||
obj = json.load(file)
|
obj = json.load(f)
|
||||||
|
|
||||||
# If the top-level JSON object in the file is a list
|
# If the top-level JSON object in the file is a list
|
||||||
# then yield each element separately; otherwise, yield
|
# then yield each element separately; otherwise, yield
|
||||||
|
@ -2,7 +2,8 @@ from __future__ import unicode_literals
|
|||||||
from io import BytesIO, StringIO
|
from io import BytesIO, StringIO
|
||||||
import unittest
|
import unittest
|
||||||
|
|
||||||
from saucebrush.sources import CSVSource, FixedWidthFileSource, HtmlTableSource
|
from saucebrush.sources import (
|
||||||
|
CSVSource, FixedWidthFileSource, HtmlTableSource, JSONSource)
|
||||||
|
|
||||||
class SourceTestCase(unittest.TestCase):
|
class SourceTestCase(unittest.TestCase):
|
||||||
|
|
||||||
@ -44,6 +45,13 @@ class SourceTestCase(unittest.TestCase):
|
|||||||
'year':'1999'}]
|
'year':'1999'}]
|
||||||
self.assertEqual(list(source), expected_data)
|
self.assertEqual(list(source), expected_data)
|
||||||
|
|
||||||
|
def test_json_source(self):
|
||||||
|
|
||||||
|
content = StringIO("""[{"a": 1, "b": "2", "c": 3}]""")
|
||||||
|
|
||||||
|
js = JSONSource(content)
|
||||||
|
self.assertEqual(list(js), [{'a': 1, 'b': '2', 'c': 3}])
|
||||||
|
|
||||||
def test_html_table_source(self):
|
def test_html_table_source(self):
|
||||||
|
|
||||||
content = StringIO("""
|
content = StringIO("""
|
||||||
|
Loading…
Reference in New Issue
Block a user