Skip to content

Commit 8a89c52

Browse files
committed
Improve Routes class
1 parent 8fbb54a commit 8a89c52

1 file changed

Lines changed: 24 additions & 51 deletions

File tree

Lines changed: 24 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -1,72 +1,51 @@
1-
"""
2-
Exports class Routes
3-
"""
4-
5-
from aikido_zen.helpers.logging import logger
61
from aikido_zen.api_discovery.update_route_info import update_route_info
7-
from aikido_zen.api_discovery.get_api_info import get_api_info
82
from .route_to_key import route_to_key
93

104

115
class Routes:
126
"""
13-
Stores all routes
7+
Stores: method & path for a given route, hit counts, the generated api spec.
148
"""
159

1610
def __init__(self, max_size=1000):
1711
self.max_size = max_size
1812
self.routes = {}
1913

20-
def initialize_route(self, route_metadata):
21-
"""
22-
Initializes a route for the first time. `hits_delta_since_sync` counts delta between syncs.
23-
"""
24-
self.manage_routes_size()
14+
def get(self, route_metadata):
2515
key = route_to_key(route_metadata)
16+
return self.routes[key]
17+
18+
def ensure_route(self, route_metadata=None, key=None):
19+
if self.get(route_metadata):
20+
return # A route already exists
21+
if key is None:
22+
key = route_to_key(route_metadata)
2623
self.routes[key] = {
2724
"method": route_metadata.get("method"),
2825
"path": route_metadata.get("route"),
2926
"hits": 0,
30-
"hits_delta_since_sync": 0,
3127
"apispec": {},
3228
}
29+
self.manage_routes_size()
3330

3431
def increment_route(self, route_metadata):
35-
"""
36-
Adds a hit to the route (if it exists) specified in route_metadata.
37-
route_metadata object includes route, url and method
38-
"""
39-
key = route_to_key(route_metadata)
40-
if not self.routes.get(key):
41-
self.initialize_route(route_metadata)
42-
# Add hits to
43-
route = self.routes.get(key)
44-
route["hits"] += 1
45-
route["hits_delta_since_sync"] += 1
32+
self.ensure_route(route_metadata)
33+
self.get(route_metadata)["hits"] += 1
4634

4735
def update_route_with_apispec(self, route_metadata, apispec):
48-
"""
49-
Updates apispec of a given route (or creates it).
50-
route_metadata object includes route, url and method
51-
"""
52-
key = route_to_key(route_metadata)
53-
if not self.routes.get(key):
54-
return
55-
update_route_info(apispec, self.routes[key])
36+
self.ensure_route(route_metadata)
37+
update_route_info(apispec, self.get(route_metadata))
5638

57-
def get(self, route_metadata):
58-
"""Gets you the route entry if it exists using route metadata"""
59-
key = route_to_key(route_metadata)
60-
return self.routes.get(key)
39+
def export(self):
40+
return dict(self.routes)
6141

62-
def get_routes_with_hits(self):
63-
"""Gets you all routes with a positive hits delta"""
64-
result = dict()
65-
for key, route in self.routes.items():
66-
if route["hits_delta_since_sync"] <= 0:
67-
continue # do not add routes without a hit delta
68-
result[key] = route
69-
return result
42+
def import_from_record(self, new_routes):
43+
for key, route in new_routes:
44+
self.ensure_route(key=key)
45+
existing_route = self.routes.get(key)
46+
# merge
47+
existing_route["hits"] += route.get("hits", 0)
48+
update_route_info(route.get("apispec", {}), existing_route)
7049

7150
def clear(self):
7251
"""Deletes all routes"""
@@ -76,16 +55,10 @@ def manage_routes_size(self):
7655
"""
7756
Evicts LRU routes if the size is too large
7857
"""
79-
if len(self.routes) >= self.max_size:
58+
if len(self.routes) > self.max_size:
8059
least_used = [None, float("inf")]
8160
for key, route in self.routes.items():
8261
if route.get("hits") < least_used[1]:
8362
least_used = [key, route.get("hits")]
8463
if least_used[0]:
8564
del self.routes[least_used[0]]
86-
87-
def __iter__(self):
88-
return iter(self.routes.values())
89-
90-
def __len__(self):
91-
return len(self.routes)

0 commit comments

Comments
 (0)