diff --git a/stone/frontend/ir_generator.py b/stone/frontend/ir_generator.py index 8ef0a8cd..a9f33503 100644 --- a/stone/frontend/ir_generator.py +++ b/stone/frontend/ir_generator.py @@ -1704,10 +1704,6 @@ def _filter_namespaces_by_route_whitelist(self): namespace.route_by_name = {} namespace.routes_by_name = {} - # We need a stable sort in order to keep the resultant output - # the same across runs. - routes.sort() - for route in routes: namespace.add_route(route) diff --git a/stone/ir/api.py b/stone/ir/api.py index 8cb74846..6c768b9f 100644 --- a/stone/ir/api.py +++ b/stone/ir/api.py @@ -328,9 +328,9 @@ def get_namespaces_imported_by_route_io(self): def normalize(self): # type: () -> None """ - Alphabetizes routes to make route declaration order irrelevant. + Sorts routes to make route declaration order irrelevant. """ - self.routes.sort(key=lambda route: route.name) + self.routes.sort() self.data_types.sort(key=lambda data_type: data_type.name) self.aliases.sort(key=lambda alias: alias.name) self.annotations.sort(key=lambda annotation: annotation.name) @@ -411,9 +411,9 @@ def _compare(self, lhs, rhs): if not isinstance(rhs, ApiRoute): raise TypeError("Expected ApiRoute for object: {}".format(rhs)) - if lhs.name < rhs.name or lhs.version < rhs.version: + if (lhs.name, lhs.version) < (rhs.name, rhs.version): return -1 - elif lhs.name > rhs.name or lhs.version > rhs.version: + elif (lhs.name, lhs.version) > (rhs.name, rhs.version): return 1 else: return 0 diff --git a/test/test_api_route.py b/test/test_api_route.py new file mode 100644 index 00000000..0649807d --- /dev/null +++ b/test/test_api_route.py @@ -0,0 +1,23 @@ +import unittest + +from stone.ir import ApiRoute + + +class TestApiRoute(unittest.TestCase): + def test_stable_sort(self): + """ + Tests API Route sorts according to name and then version + """ + routes = [ + ApiRoute("B", 1, None), + ApiRoute("A", 2, None), + ApiRoute("A", 1, None), + ApiRoute("B", 2, None), + ] + + expected = [("A", 1), ("A", 2), ("B", 1), ("B", 2)] + sorted_routes = list(map(lambda x: (x.name, x.version), sorted(routes))) + self.assertEqual(sorted_routes, expected) + + reversed_sorted_routes = list(map(lambda x: (x.name, x.version), sorted(reversed(routes)))) + self.assertEqual(reversed_sorted_routes, expected)