From 383d7799c355d77a191d40cff99de70ebf294835 Mon Sep 17 00:00:00 2001 From: Joe Jevnik Date: Wed, 13 Sep 2017 21:01:24 -0400 Subject: [PATCH] BUG: fix multiple issues with directory and json types --- odo/backends/json.py | 12 ++++++---- odo/backends/tests/test_json.py | 5 +++++ odo/directory.py | 40 +++++++++++++++++++++++---------- 3 files changed, 41 insertions(+), 16 deletions(-) diff --git a/odo/backends/json.py b/odo/backends/json.py index e4e4dcfc..e76b0249 100644 --- a/odo/backends/json.py +++ b/odo/backends/json.py @@ -99,7 +99,10 @@ def discover_jsonlines(j, n=10, encoding='utf-8', **kwargs): @convert.register(list, (JSON, Temp(JSON))) def json_to_list(j, dshape=None, **kwargs): - return json_load(j.path, **kwargs) + result = json_load(j.path, **kwargs) + if not isinstance(result, list): + result = [result] + return result @convert.register(Iterator, (JSONLines, Temp(JSONLines))) @@ -138,9 +141,10 @@ def json_load(path, encoding='utf-8', **kwargs): f = open(path) s = f.read() - data = json.loads(s) - - f.close() + try: + data = json.loads(s) + finally: + f.close() return data diff --git a/odo/backends/tests/test_json.py b/odo/backends/tests/test_json.py index 258db122..2cec1e5d 100644 --- a/odo/backends/tests/test_json.py +++ b/odo/backends/tests/test_json.py @@ -105,6 +105,11 @@ def test_convert_json_list(): j = JSON(fn) assert convert(list, j) == dat + non_list_data ={'a': 1} + with json_file(non_list_data) as fn: + j = JSON(fn) + assert convert(list, j) == [non_list_data] + def test_convert_jsonlines(): with jsonlines_file(dat) as fn: diff --git a/odo/directory.py b/odo/directory.py index f409a007..f768f7ee 100644 --- a/odo/directory.py +++ b/odo/directory.py @@ -1,12 +1,15 @@ from __future__ import absolute_import, division, print_function from glob import glob +import os +import re + +from datashape import discover, var +from toolz import memoize, first + from .chunks import Chunks, chunks from .resource import resource from .utils import copydoc -from toolz import memoize, first -from datashape import discover, var -import os class _Directory(Chunks): @@ -25,29 +28,42 @@ class _Directory(Chunks): """ + @staticmethod + def container(uri): + raise NotImplementedError('overridden by Directory(cls) types') + def __init__(self, path, **kwargs): self.path = path self.kwargs = kwargs def __iter__(self): - return (resource(os.path.join(self.path, fn), **self.kwargs) - for fn in sorted(os.listdir(self.path))) + return ( + self.container( + os.path.join(self.path, fn), + **self.kwargs + ) + for fn in sorted(os.listdir(self.path)) + ) @memoize @copydoc(_Directory) def Directory(cls): - """ Parametrized DirectoryClass """ - return type('Directory(%s)' % cls.__name__, (_Directory, chunks(cls)), {}) + """Parametrized Directory class. + """ + return type( + 'Directory(%s)' % cls.__name__, + (_Directory, chunks(cls)), + {'container': cls}, + ) + +re_path_sep = re.escape(os.path.sep) -re_path_sep = os.path.sep -if re_path_sep == '\\': - re_path_sep = '\\\\' @discover.register(_Directory) -def discover_Directory(c, **kwargs): - return var * discover(first(c)).subshape[0] +def discover_directory(c, **kwargs): + return var * discover(first(c)).measure @resource.register('.+' + re_path_sep + '\*\..+', priority=15)