from dataclasses import dataclass from operator import itemgetter from typing import Tuple, Dict, List from cache.Cache import Cache from core.sheerka.services.sheerka_service import BaseService, ServiceObj @dataclass class FunctionParametersObj(ServiceObj): name: str params: Dict[int, List[Tuple[str, int]]] # # params = { # 1 : [('value 1', 1), ('value 2', 5)], # 3 : [('value 3', 5)] # # the key is the number of the parameter # the values are a tuple of (value seen, number of time this value is seen) class SheerkaFunctionsParametersHistory(BaseService): """ This service remembers the parameters expected by functions """ NAME = "FunctionsParametersHistory" FUNCTIONS_PARAMETERS_ENTRY = "FunctionsParametersHistory:Functions" def __init__(self, sheerka): super().__init__(sheerka) self.cache = Cache(max_size=1024, default=lambda k: self.sheerka.sdp.get(self.FUNCTIONS_PARAMETERS_ENTRY, k)) def initialize(self): self.sheerka.cache_manager.register_cache(self.FUNCTIONS_PARAMETERS_ENTRY, self.cache, True, True) return self def record_function_parameter(self, context, func_name: str, param_number: int, param_value: str): """ Declare a new value to the parameter and function :param context: :param func_name: :param param_number: :param param_value: :return: """ old = self.cache.get(func_name) if old is not None: if param_number in old.params: lst = old.params[param_number] for i, value in enumerate(lst): # value is a tuple (param_value, counter) if value[0] == param_value: lst[i] = (param_value, value[1] + 1) break else: lst.append((param_value, 1)) else: old.params[param_number] = [(param_value, 1)] self.cache.put(func_name, old) else: obj = FunctionParametersObj(context.event.get_digest(), func_name, {param_number: [(param_value, 1)]}) self.cache.put(func_name, obj) def get_function_parameters(self, func_name: str, param_number: int): """ Return the list of param :param func_name: :param param_number: :return: """ values = self.cache.get(func_name) if values is None: return [] if param_number not in values.params: return [] return [item[0] for item in sorted(values.params[param_number], key=itemgetter(1), reverse=True)]