11import copy
22import json
33from datetime import datetime , timedelta
4+ from typing import Any , Dict , List , Optional , Union
45
56from .metrics_shared import OpenPAYGOMetricsShared
7+ from .models import MetricsDataFormat
68
79
810class MetricsResponseHandler (object ):
911 def __init__ (
1012 self ,
11- received_metrics ,
12- data_format = None ,
13- secret_key = None ,
14- last_request_count = None ,
15- last_request_timestamp = None ,
16- ):
13+ received_metrics : str ,
14+ data_format : Optional [ Union [ Dict [ str , Any ], MetricsDataFormat ]] = None ,
15+ secret_key : Optional [ str ] = None ,
16+ last_request_count : Optional [ int ] = None ,
17+ last_request_timestamp : Optional [ int ] = None ,
18+ ) -> None :
1719 self .received_metrics = received_metrics
1820 self .request_dict = json .loads (received_metrics )
1921 # We convert the base variable names to simple
@@ -26,40 +28,45 @@ def __init__(
2628 self .timestamp = int (datetime .now ().timestamp ())
2729 else :
2830 self .timestamp = self .request_dict .get ("timestamp" )
29- self .response_dict = {}
31+ self .response_dict : Dict [ str , Any ] = {}
3032 self .secret_key = secret_key
31- self .data_format = data_format
3233 self .last_request_count = last_request_count
3334 self .last_request_timestamp = last_request_timestamp
35+
36+ if data_format is not None :
37+ self .data_format : Optional [Dict [str , Any ]] = dict (data_format )
38+ else :
39+ self .data_format = None
40+
3441 if not self .data_format and self .request_dict .get ("data_format" ):
3542 self .data_format = self .request_dict .get ("data_format" )
3643
37- def get_device_serial (self ):
44+ def get_device_serial (self ) -> str :
3845 return self .request_dict .get ("serial_number" )
3946
40- def get_data_format_id (self ):
47+ def get_data_format_id (self ) -> Optional [ int ] :
4148 return self .request_dict .get ("data_format_id" )
4249
43- def data_format_available (self ):
50+ def data_format_available (self ) -> bool :
4451 return self .data_format is not None
4552
4653 def set_device_parameters (
4754 self ,
48- secret_key = None ,
49- data_format = None ,
50- last_request_count = None ,
51- last_request_timestamp = None ,
52- ):
55+ secret_key : Optional [ str ] = None ,
56+ data_format : Optional [ Union [ Dict [ str , Any ], MetricsDataFormat ]] = None ,
57+ last_request_count : Optional [ int ] = None ,
58+ last_request_timestamp : Optional [ int ] = None ,
59+ ) -> None :
5360 if secret_key :
5461 self .secret_key = secret_key
55- if data_format :
56- self .data_format = data_format
62+ if data_format is not None :
63+ self .data_format = dict ( data_format )
5764 if last_request_count :
5865 self .last_request_count = last_request_count
5966 if last_request_timestamp :
6067 self .last_request_timestamp = last_request_timestamp
6168
62- def is_auth_valid (self ):
69+ def is_auth_valid (self ) -> bool :
6370 auth_string = self .request_dict .get ("auth" , None )
6471 if not auth_string :
6572 return False
@@ -89,7 +96,7 @@ def is_auth_valid(self):
8996 return True
9097 return False
9198
92- def get_simple_metrics (self ):
99+ def get_simple_metrics (self ) -> Dict [ str , Any ] :
93100 # We start the process by making a copy of the dict to work with
94101 simple_dict = copy .deepcopy (self .request_dict )
95102 simple_dict .pop ("auth" ) if "auth" in simple_dict else None # We remove the auth
@@ -103,40 +110,40 @@ def get_simple_metrics(self):
103110 )
104111 return simple_dict
105112
106- def get_data_timestamp (self ):
113+ def get_data_timestamp (self ) -> int :
107114 return self .request_dict .get ("data_collection_timestamp" , self .timestamp )
108115
109- def get_request_timestamp (self ):
116+ def get_request_timestamp (self ) -> Optional [ int ] :
110117 return self .request_timestamp
111118
112- def get_request_count (self ):
119+ def get_request_count (self ) -> Optional [ int ] :
113120 return self .request_dict .get ("request_count" )
114121
115- def get_token_count (self ):
122+ def get_token_count (self ) -> Optional [ int ] :
116123 data = self ._get_simple_data ()
117124 return data .get ("token_count" )
118125
119- def expects_token_answer (self ):
126+ def expects_token_answer (self ) -> bool :
120127 return self .get_token_count () is not None
121128
122- def add_tokens_to_answer (self , token_list ) :
129+ def add_tokens_to_answer (self , token_list : List [ str ]) -> None :
123130 self .response_dict ["token_list" ] = token_list
124131
125- def expects_time_answer (self ):
132+ def expects_time_answer (self ) -> bool :
126133 data = self ._get_simple_data ()
127134 if data .get ("active_until_timestamp_requested" , False ) or data .get (
128135 "active_seconds_left_requested" , False
129136 ):
130137 return True
131138 return False
132139
133- def add_time_to_answer (self , target_datetime ) :
140+ def add_time_to_answer (self , target_datetime : datetime ) -> None :
134141 data = self ._get_simple_data ()
135142 if data .get ("active_until_timestamp_requested" , False ):
136143 target_timestamp = 0
137144 if target_datetime :
138145 if target_datetime .year > 1970 :
139- target_timestamp = target_datetime .timestamp ()
146+ target_timestamp = int ( target_datetime .timestamp () )
140147 self .response_dict ["active_until_timestamp" ] = target_timestamp
141148 elif data .get ("active_seconds_left_requested" , False ):
142149 seconds_left = (
@@ -150,24 +157,24 @@ def add_time_to_answer(self, target_datetime):
150157 else :
151158 raise ValueError ("No time requested" )
152159
153- def add_new_base_url_to_answer (self , new_base_url ) :
160+ def add_new_base_url_to_answer (self , new_base_url : str ) -> None :
154161 self .add_settings_to_answer ({"base_url" : new_base_url })
155162
156- def add_settings_to_answer (self , settings_dict ) :
163+ def add_settings_to_answer (self , settings_dict : Dict [ str , Any ]) -> None :
157164 if not self .response_dict .get ("settings" ):
158165 self .response_dict ["settings" ] = {}
159166 self .response_dict ["settings" ].update (settings_dict )
160167
161- def add_extra_data_to_answer (self , extra_data_dict ) :
168+ def add_extra_data_to_answer (self , extra_data_dict : Dict [ str , Any ]) -> None :
162169 if not self .response_dict .get ("extra_data" ):
163170 self .response_dict ["extra_data" ] = {}
164171 self .response_dict ["extra_data" ].update (extra_data_dict )
165172
166- def get_answer_payload (self ):
173+ def get_answer_payload (self ) -> str :
167174 payload = self .get_answer_dict ()
168175 return OpenPAYGOMetricsShared .convert_to_metrics_json (payload )
169176
170- def get_answer_dict (self ):
177+ def get_answer_dict (self ) -> Dict [ str , Any ] :
171178 # If there is not data format, we just return the full response
172179 condensed_answer = copy .deepcopy (self .response_dict )
173180 if self .secret_key :
0 commit comments