1- """
2- Exports class Routes
3- """
4-
5- from aikido_zen .helpers .logging import logger
61from aikido_zen .api_discovery .update_route_info import update_route_info
7- from aikido_zen .api_discovery .get_api_info import get_api_info
82from .route_to_key import route_to_key
93
104
115class 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