diff --git a/benedict/dicts/io/io_dict.py b/benedict/dicts/io/io_dict.py index 1223e3c..dd13d24 100644 --- a/benedict/dicts/io/io_dict.py +++ b/benedict/dicts/io/io_dict.py @@ -20,7 +20,8 @@ class IODict(dict): @staticmethod def _decode_init(s, **kwargs): - default_format = io_util.autodetect_format(s, default='json') + autodetected_format = io_util.autodetect_format(s) + default_format = autodetected_format or 'json' format = kwargs.pop('format', default_format).lower() if format in ['b64', 'base64']: kwargs.setdefault('subformat', 'json') diff --git a/benedict/dicts/io/io_util.py b/benedict/dicts/io/io_util.py index e936620..9117699 100644 --- a/benedict/dicts/io/io_util.py +++ b/benedict/dicts/io/io_util.py @@ -8,12 +8,10 @@ import os import requests -def autodetect_format(s, default=None): - if is_data(s): - return default - elif is_url(s) or is_filepath(s): +def autodetect_format(s): + if is_url(s) or is_filepath(s): return get_format_by_path(s) - return default + return None def decode(s, format, **kwargs): @@ -38,8 +36,9 @@ def is_data(s): def is_filepath(s): - return any([s.endswith(extension) - for extension in get_serializers_extensions()]) + if any([s.endswith(ext) for ext in get_serializers_extensions()]): + return True + return os.path.isfile(s) def is_url(s): diff --git a/tests/dicts/io/input/valid-content.json.txt b/tests/dicts/io/input/valid-content.json.txt new file mode 100644 index 0000000..74a974d --- /dev/null +++ b/tests/dicts/io/input/valid-content.json.txt @@ -0,0 +1 @@ +{"a": 1, "b": 2, "c": 3, "x": 7, "y": 8, "z": 9} \ No newline at end of file diff --git a/tests/dicts/io/test_io_dict_json.py b/tests/dicts/io/test_io_dict_json.py index 43bb30c..57adaa3 100644 --- a/tests/dicts/io/test_io_dict_json.py +++ b/tests/dicts/io/test_io_dict_json.py @@ -82,6 +82,18 @@ class io_dict_json_test_case(io_dict_test_case): d = IODict(filepath) self.assertTrue(isinstance(d, dict)) + def test_from_json_with_valid_file_valid_content_but_unexpected_extension(self): + filepath = self.input_path('valid-content.json.txt') + # static method + d = IODict.from_json(filepath) + self.assertTrue(isinstance(d, dict)) + # constructor + d = IODict(filepath, format='json') + self.assertTrue(isinstance(d, dict)) + # constructor with format autodetection + d = IODict(filepath) + self.assertTrue(isinstance(d, dict)) + def test_from_json_with_valid_file_valid_content_invalid_format(self): filepath = self.input_path('valid-content.base64') with self.assertRaises(ValueError): diff --git a/tests/dicts/io/test_io_util.py b/tests/dicts/io/test_io_util.py index 71e929c..e3dd61f 100644 --- a/tests/dicts/io/test_io_util.py +++ b/tests/dicts/io/test_io_util.py @@ -15,10 +15,6 @@ class io_util_test_case(unittest.TestCase): s = '{"a": 1, "b": 2, "c": 3}' self.assertEqual(io_util.autodetect_format(s), None) - def test_autodetect_format_by_data_with_default(self): - s = '{"a": 1, "b": 2, "c": 3}' - self.assertEqual(io_util.autodetect_format(s, default='json'), 'json') - def test_autodetect_format_by_path(self): s = 'path-to/data.xml' self.assertEqual(io_util.autodetect_format(s), 'xml')