From 39e99d24b6a3d277b82b9aef067c28fd9ad1bf52 Mon Sep 17 00:00:00 2001 From: Pavel Patsey Date: Sun, 19 Jan 2025 01:00:01 +0300 Subject: [PATCH] add merge_nodes_cycle func --- cidr4_merger.py | 19 +++++++++++++++++-- tests/test_cidr4_merger.py | 27 +++++++++++++++++++++++++++ 2 files changed, 44 insertions(+), 2 deletions(-) diff --git a/cidr4_merger.py b/cidr4_merger.py index 8492b09..d7306c7 100644 --- a/cidr4_merger.py +++ b/cidr4_merger.py @@ -183,6 +183,20 @@ def merge_nodes_recursion(nodes: list[Node], required_len: int) -> list[Node]: return merge_nodes_recursion(new_nodes, required_len) +def merge_nodes_cycle(nodes_to_merge: list[Node], required_len: int) -> list[Node]: + nodes = [x for x in nodes_to_merge] + while not len(nodes) <= required_len: + groups = make_groups(nodes) + neighbours, singles = find_neighbours_singles(groups) + if neighbours: + nodes = merge_neighbors(nodes, neighbours) + elif singles: + nodes = lift_lonely_node(nodes, singles) + else: + raise Cidr4MergerError("Invalid case!") + return nodes + + def main(): file = "cidr4.txt" required_len = 20 @@ -191,8 +205,9 @@ def main(): nodes = list(map(cidr4_to_node, data)) nodes = sort_nodes(nodes) - # merged_nodes = merge_nodes(nodes, required_len) - merged_nodes = merge_nodes_recursion(nodes, required_len) + # merged_nodes = merge_nodes_deprecated(nodes, required_len) + # merged_nodes = merge_nodes_recursion(nodes, required_len) + merged_nodes = merge_nodes_cycle(nodes, required_len) cidr4s = [] sum_added_ips = 0 diff --git a/tests/test_cidr4_merger.py b/tests/test_cidr4_merger.py index 5053299..24a56a0 100644 --- a/tests/test_cidr4_merger.py +++ b/tests/test_cidr4_merger.py @@ -15,6 +15,7 @@ from cidr4_merger import ( merge_neighbors, merge_nodes_deprecated, merge_nodes_recursion, + merge_nodes_cycle, reduce_nodes, sort_nodes, ) @@ -351,3 +352,29 @@ def test_merge_nodes_recursion(): ) assert exc_info.type is Cidr4MergerError assert str(exc_info.value) == "The top of the tree has no parent!" + + +def test_merge_nodes_cycle(): + assert merge_nodes_cycle( + [ + (0, 2, 12, 0), + (2147483648, 2, 1, 2147483648), + (3221225472, 2, 2, 2147483648), + ], + 2, + ) == [ + (2147483648, 1, 3, 0), + (0, 2, 12, 0), + ] + + with pytest.raises(Exception) as exc_info: + merge_nodes_cycle( + [ + (0, 2, 12, 0), + (2147483648, 2, 1, 2147483648), + (3221225472, 2, 2, 2147483648), + ], + 1, + ) + assert exc_info.type is Cidr4MergerError + assert str(exc_info.value) == "The top of the tree has no parent!"