Skip to content

Commit

Permalink
Merge pull request #11 from thecodingmachine/jindun
Browse files Browse the repository at this point in the history
handling None type merge
  • Loading branch information
JinTotonic committed Jun 11, 2018
2 parents 76dbece + ce6c214 commit 9b80009
Show file tree
Hide file tree
Showing 2 changed files with 43 additions and 0 deletions.
37 changes: 37 additions & 0 deletions src/tests/tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -137,6 +137,9 @@ class TestMergeByType(unittest.TestCase):
test:
- item3
"""
mock_None = 'test: '

# from scalar to any

def test_merge_scalar_to_scalar(self):
out = yaml_tools.successive_merge([self.mock_scalar_1, self.mock_scalar_2])
Expand All @@ -156,6 +159,13 @@ def test_merge_scalar_to_list(self):
"""
expected_out = ruamel.yaml.round_trip_load(expected_out_str)
self.assertEqual(out, expected_out)

def test_merge_scalar_to_None(self):
out = yaml_tools.successive_merge([self.mock_None, self.mock_scalar_2])
expected_out = ruamel.yaml.round_trip_load(self.mock_scalar_2)
self.assertEqual(out, expected_out)

# from dict to any

def test_merge_dict_to_scalar(self):
self.assertRaises(TypeError, yaml_tools.successive_merge, [self.mock_scalar_1, self.mock_dict_2])
Expand All @@ -173,6 +183,13 @@ def test_merge_dict_to_dict(self):

def test_merge_dict_to_list(self):
self.assertRaises(TypeError, yaml_tools.successive_merge, [self.mock_list_1, self.mock_dict_2])

def test_merge_dict_to_None(self):
out = yaml_tools.successive_merge([self.mock_None, self.mock_dict_2])
expected_out = ruamel.yaml.round_trip_load(self.mock_dict_2)
self.assertEqual(out, expected_out)

## from list to any

def test_merge_list_to_scalar(self):
out = yaml_tools.successive_merge([self.mock_scalar_1, self.mock_list_2])
Expand All @@ -198,6 +215,26 @@ def test_merge_list_to_list(self):
expected_out = ruamel.yaml.round_trip_load(expected_out_str)
self.assertEqual(out, expected_out)

def test_merge_list_to_None(self):
out = yaml_tools.successive_merge([self.mock_None, self.mock_list_2])
expected_out = ruamel.yaml.round_trip_load(self.mock_list_2)
self.assertEqual(out, expected_out)

## from None to any
def test_merge_None_to_any(self):
out = yaml_tools.successive_merge([self.mock_None, self.mock_None])
expected_out = ruamel.yaml.round_trip_load(self.mock_None)
self.assertEqual(out, expected_out, 'Merge None to None should succeed')
out = yaml_tools.successive_merge([self.mock_scalar_1, self.mock_None])
expected_out = ruamel.yaml.round_trip_load(self.mock_scalar_1)
self.assertEqual(out, expected_out, 'Merge None to scalar should succeed')
out = yaml_tools.successive_merge([self.mock_dict_1, self.mock_None])
expected_out = ruamel.yaml.round_trip_load(self.mock_dict_1)
self.assertEqual(out, expected_out, 'Merge None to dict should succeed')
out = yaml_tools.successive_merge([self.mock_list_1, self.mock_None])
expected_out = ruamel.yaml.round_trip_load(self.mock_list_1)
self.assertEqual(out, expected_out, 'Merge None to list should succeed')


if __name__ == '__main__': # pragma: no cover
unittest.main()
6 changes: 6 additions & 0 deletions src/yaml_tools.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,16 +23,22 @@ def _merge(dest, src, current_path=""):
if k in src.ca._items and src.ca._items[k][2] and \
src.ca._items[k][2].value.strip():
dest.ca._items[k] = src.ca._items[k] # copy non-empty comment
elif dest is None:
dest = src
else:
raise get_type_error(dest, src, current_path)
elif isinstance(src, ruamel.yaml.comments.CommentedSeq):
if isinstance(dest, ruamel.yaml.comments.CommentedMap):
raise get_type_error(dest, src, current_path)
elif isinstance(dest, ruamel.yaml.comments.CommentedSeq):
dest.extend(src)
elif dest is None:
dest=src
else:
src.append(dest)
dest = src
elif src is None:
return dest
else:
if isinstance(dest, ruamel.yaml.comments.CommentedMap):
raise get_type_error(dest, src, current_path)
Expand Down

0 comments on commit 9b80009

Please sign in to comment.