Skip to content

Commit

Permalink
fix: return non-dict objects loaded if the parser allows that at once
Browse files Browse the repository at this point in the history
- anyconfig.backend.base.load_with_fn: return non-dict objects loaded
  such like bare arrays, empty dicts and lists if the parser allows that
  at once without trying to convert the loaded data to a mapping object.
- anyconfig.backend.base.load_*: pass allow_primitives keyword option.
- tests.backend.common.Test_10_dumps_and_loads: follow changes in
  anyconfig.backend.base.load_with_fn and compare results with
  predefined expected values in test_22_loads_empty_data.
- tests.backend.common.Test_20_dump_and_load: add a test case
  (test_34_dump_and_load__list) to dump and load list data
- tests.backend.{json,yaml}: follow changes in
  tests.backend.common.Test_10_dumps_and_loads
  • Loading branch information
ssato committed Jun 30, 2018
1 parent 6b206ef commit 6547344
Show file tree
Hide file tree
Showing 5 changed files with 35 additions and 22 deletions.
16 changes: 8 additions & 8 deletions anyconfig/backend/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -567,12 +567,10 @@ def load_with_fn(load_fn, content_or_strm, container, allow_primitives=False,
:return: container object holding data
"""
ret = load_fn(content_or_strm, **options)
try:
return container() if ret is None else container(ret)
except (TypeError, ValueError):
if allow_primitives:
return ret # Just return it.
raise # Something goes wrong.
if anyconfig.utils.is_dict_like(ret):
return container() if (ret is None or not ret) else container(ret)

return ret if allow_primitives else container(ret)


def dump_with_fn(dump_fn, data, stream, **options):
Expand Down Expand Up @@ -627,7 +625,8 @@ def load_from_string(self, content, container, **options):
:return: container object holding the configuration data
"""
return load_with_fn(self._load_from_string_fn, content, container,
self.allow_primitives(), **options)
allow_primitives=self.allow_primitives(),
**options)

def load_from_stream(self, stream, container, **options):
"""
Expand All @@ -640,7 +639,8 @@ def load_from_stream(self, stream, container, **options):
:return: container object holding the configuration data
"""
return load_with_fn(self._load_from_stream_fn, stream, container,
self.allow_primitives(), **options)
allow_primitives=self.allow_primitives(),
**options)

def dump_to_string(self, cnf, **kwargs):
"""
Expand Down
21 changes: 12 additions & 9 deletions anyconfig/backend/yaml.py
Original file line number Diff line number Diff line change
Expand Up @@ -187,24 +187,27 @@ def _yml_load(stream, container, **options):
return ret


def _yml_dump(cnf, stream, **options):
def _yml_dump(data, stream, **options):
"""An wrapper of yaml.safe_dump and yaml.dump.
:param cnf: Mapping object to dump
:param data: Some data to dump
:param stream: a file or file-like object to dump YAML data
"""
_is_dict = anyconfig.utils.is_dict_like(data)

if options.get("ac_safe", False):
options = {}
elif not options.get("Dumper", False):
elif not options.get("Dumper", False) and _is_dict:
# TODO: Any other way to get its constructor?
cnf_type = type(cnf)
maybe_container = options.get("ac_dict", cnf_type)
maybe_container = options.get("ac_dict", type(data))
options["Dumper"] = _customized_dumper(maybe_container)

# Type information and the order of items are lost on dump currently.
cnf = anyconfig.dicts.convert_to(cnf, ac_dict=dict)
options = _filter_from_options("ac_dict", options)
return _yml_fnc("dump", cnf, stream, **options)
if _is_dict:
# Type information and the order of items are lost on dump currently.
data = anyconfig.dicts.convert_to(data, ac_dict=dict)
options = _filter_from_options("ac_dict", options)

return _yml_fnc("dump", data, stream, **options)


class Parser(anyconfig.backend.base.StreamParser):
Expand Down
15 changes: 12 additions & 3 deletions tests/backend/common.py
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@ class Test_10_dumps_and_loads(TestBase):

load_options = {} # Must be set to a dict in children classes.
dump_options = {} # Do.
empty_patterns = [''] # Do.
empty_patterns = [('', {})] # Do.

def test_10_loads(self):
if self.is_ready():
Expand Down Expand Up @@ -118,9 +118,9 @@ def test_20_loads_with_dict_option(self):

def test_22_loads_empty_data(self):
if self.is_ready():
for pat in self.empty_patterns:
for pat, exp in self.empty_patterns:
cnf = self.psr.loads(pat)
self.assertEqual(cnf, dict())
self.assertEqual(cnf, exp)

def test_30_dumps(self):
if self.is_ready():
Expand Down Expand Up @@ -158,6 +158,8 @@ def tearDown(self):

class Test_20_dump_and_load(TestBaseWithIO):

list_data = [dict(a=1, b=2), dict(a=2, b=3)]

def test_10_load(self):
if self.is_ready():
cnf = self.psr.load(self.ioi)
Expand Down Expand Up @@ -202,4 +204,11 @@ def test_32_dump_to_stream(self):
self.assertTrue(cnf)
self._assert_dicts_equal(cnf)

def test_34_dump_and_load__list(self):
if self.is_ready() and self.psr.allow_primitives():
self.psr.dump(self.list_data, self.ioi)
cnf = self.psr.load(self.ioi, ac_dict=MyDict)
self.assertTrue(cnf)
self.assertEqual(cnf, self.list_data)

# vim:sw=4:ts=4:et:
2 changes: 1 addition & 1 deletion tests/backend/json.py
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ class HasParserTrait(TBC.HasParserTrait):
class Test_10(TBC.Test_10_dumps_and_loads, HasParserTrait):

load_options = dump_options = dict(parse_int=None, indent=2)
empty_patterns = ['', '{}', '[]', 'null']
empty_patterns = [('', {}), ('{}', {}), ('[]', []), ('null', None)]


class Test_20(TBC.Test_20_dump_and_load, HasParserTrait):
Expand Down
3 changes: 2 additions & 1 deletion tests/backend/yaml.py
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,8 @@ class Test_10(TBC.Test_10_dumps_and_loads, HasParserTrait):

load_options = dict(ac_safe=True, Loader=TT.yaml.loader.Loader)
dump_options = dict(ac_safe=True)
empty_patterns = ['', ' ', "#%s#%s" % (os.linesep, os.linesep)]
empty_patterns = [('', {}), (' ', {}), ('[]', []),
("#%s#%s" % (os.linesep, os.linesep), {})]


class Test_20(TBC.Test_20_dump_and_load, HasParserTrait):
Expand Down

0 comments on commit 6547344

Please sign in to comment.