From 08ba86af28cc89e5604ae1e11e6e8323cd93086b Mon Sep 17 00:00:00 2001 From: pszulczewski Date: Thu, 20 Apr 2023 11:12:38 +0200 Subject: [PATCH 1/4] Baseline unittests --- tests/test_get_value.py | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/tests/test_get_value.py b/tests/test_get_value.py index 10200b1..0f2ae4b 100644 --- a/tests/test_get_value.py +++ b/tests/test_get_value.py @@ -71,6 +71,25 @@ def test_jmspath_return_none(jmspath): "", marks=pytest.mark.xfail(reason="Jmespath issue - path returns empty list."), ), + ("global.peers.*.is_enabled", [True, True, False, True]), + ( + "global.peers.$*$.is_enabled", + [ + {"10.1.0.0": {"is_enabled": True}}, + {"10.2.0.0": {"is_enabled": True}}, + {"10.64.207.255": {"is_enabled": False}}, + {"7.7.7.7": {"is_enabled": True}}, + ], + ), + ( + "global.peers.$*$.[is_enabled]", + [ + {"10.1.0.0": {"is_enabled": True}}, + {"10.2.0.0": {"is_enabled": True}}, + {"10.64.207.255": {"is_enabled": False}}, + {"7.7.7.7": {"is_enabled": True}}, + ], + ), ] @@ -81,5 +100,5 @@ def test_extract_data_from_json(jmspath, expected_value): """Test JMSPath return value.""" data = load_json_file("napalm_get_bgp_neighbors", "multi_vrf.json") value = extract_data_from_json(data=data, path=jmspath) - + print(value) assert value == expected_value, ASSERT_FAIL_MESSAGE.format(output=value, expected_output=expected_value) From eb09781de183f81cbed2f51693587bac10635242 Mon Sep 17 00:00:00 2001 From: pszulczewski Date: Thu, 20 Apr 2023 11:40:36 +0200 Subject: [PATCH 2/4] Fix issue #94 --- jdiff/utils/jmespath_parsers.py | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/jdiff/utils/jmespath_parsers.py b/jdiff/utils/jmespath_parsers.py index 2cb88b8..c209db7 100644 --- a/jdiff/utils/jmespath_parsers.py +++ b/jdiff/utils/jmespath_parsers.py @@ -87,13 +87,19 @@ def associate_key_of_my_value(paths: str, wanted_value: List) -> List: final_list = [] - for items in wanted_value: - if len(items) != len(my_key_value_list): - raise ValueError("Key's value len != from value len") + if not all(isinstance(item, list) for item in wanted_value) and len(my_key_value_list) == 1: + for item in wanted_value: + temp_dict = {my_key_value_list[0]: item} + final_list.append(temp_dict) - temp_dict = {my_key_value_list[my_index]: my_value for my_index, my_value in enumerate(items)} + else: + for items in wanted_value: + if len(items) != len(my_key_value_list): + raise ValueError("Key's value len != from value len") + + temp_dict = {my_key_value_list[my_index]: my_value for my_index, my_value in enumerate(items)} - final_list.append(temp_dict) + final_list.append(temp_dict) return final_list From 333726b7d30ce9348a3f286275a418e3ae286d33 Mon Sep 17 00:00:00 2001 From: pszulczewski Date: Thu, 20 Apr 2023 11:50:33 +0200 Subject: [PATCH 3/4] Remove test print --- tests/test_get_value.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_get_value.py b/tests/test_get_value.py index 0f2ae4b..ee83577 100644 --- a/tests/test_get_value.py +++ b/tests/test_get_value.py @@ -100,5 +100,5 @@ def test_extract_data_from_json(jmspath, expected_value): """Test JMSPath return value.""" data = load_json_file("napalm_get_bgp_neighbors", "multi_vrf.json") value = extract_data_from_json(data=data, path=jmspath) - print(value) + assert value == expected_value, ASSERT_FAIL_MESSAGE.format(output=value, expected_output=expected_value) From 7e69efb03561635ec50c185cb9c331cb63c874fd Mon Sep 17 00:00:00 2001 From: pszulczewski Date: Thu, 20 Apr 2023 12:29:51 +0200 Subject: [PATCH 4/4] Fix issue #91 --- jdiff/utils/jmespath_parsers.py | 2 +- tests/test_get_value.py | 35 +++++++++++++++++++++++++++++++++ 2 files changed, 36 insertions(+), 1 deletion(-) diff --git a/jdiff/utils/jmespath_parsers.py b/jdiff/utils/jmespath_parsers.py index c209db7..ee1e669 100644 --- a/jdiff/utils/jmespath_parsers.py +++ b/jdiff/utils/jmespath_parsers.py @@ -69,7 +69,7 @@ def jmespath_refkey_parser(path: str): if regex_match_anchor and not element.startswith("[") and not element.endswith("]"): splitted_jmespath = splitted_jmespath[:number] - return ".".join(splitted_jmespath) + return ".".join(splitted_jmespath) or "@" def associate_key_of_my_value(paths: str, wanted_value: List) -> List: diff --git a/tests/test_get_value.py b/tests/test_get_value.py index ee83577..6288386 100644 --- a/tests/test_get_value.py +++ b/tests/test_get_value.py @@ -102,3 +102,38 @@ def test_extract_data_from_json(jmspath, expected_value): value = extract_data_from_json(data=data, path=jmspath) assert value == expected_value, ASSERT_FAIL_MESSAGE.format(output=value, expected_output=expected_value) + + +test_cases_top_key_anchor = [ + ("$*$.is_enabled", [{".local.": {"is_enabled": True}}, {".local..0": {"is_enabled": True}}]), + ("$*$.is_up", [{".local.": {"is_up": True}}, {".local..0": {"is_up": True}}]), +] + + +@pytest.mark.parametrize("jmspath, expected_value", test_cases_top_key_anchor) +def test_top_key_anchor(jmspath, expected_value): + """Test JMSPath return value for anchoring the top key.""" + data = { + ".local.": { + "description": "", + "is_enabled": True, + "is_up": True, + "last_flapped": -1, + "mac_address": "Unspecified", + "mtu": 0, + "speed": -1, + }, + ".local..0": { + "description": "", + "is_enabled": True, + "is_up": True, + "last_flapped": -1, + "mac_address": "Unspecified", + "mtu": 0, + "speed": -1, + }, + } + + value = extract_data_from_json(data=data, path=jmspath) + + assert value == expected_value, ASSERT_FAIL_MESSAGE.format(output=value, expected_output=expected_value)