From 5e736f9abac200b156ccdc5c85cefe1ae736f98b Mon Sep 17 00:00:00 2001 From: Kerem Yilmaz Date: Mon, 8 Jul 2024 15:16:02 -0700 Subject: [PATCH] experimentation get_value for multiple variable for a feature (#566) --- .../forge/sdk/experimentation/providers.py | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/skyvern/forge/sdk/experimentation/providers.py b/skyvern/forge/sdk/experimentation/providers.py index a0ae40bf..bc2118f2 100644 --- a/skyvern/forge/sdk/experimentation/providers.py +++ b/skyvern/forge/sdk/experimentation/providers.py @@ -8,6 +8,7 @@ LOG = structlog.get_logger() class BaseExperimentationProvider(ABC): # feature_name -> distinct_id -> result result_map: dict[str, dict[str, bool]] = {} + variant_map: dict[str, dict[str, str | None]] = {} @abstractmethod def is_feature_enabled(self, feature_name: str, distinct_id: str, properties: dict | None = None) -> bool: @@ -24,7 +25,25 @@ class BaseExperimentationProvider(ABC): return self.result_map[feature_name][distinct_id] + @abstractmethod + def get_value(self, feature_name: str, distinct_id: str, properties: dict | None = None) -> str | None: + """Get the value of a feature.""" + + def get_value_cached(self, feature_name: str, distinct_id: str, properties: dict | None = None) -> str | None: + """Get the value of a feature.""" + if feature_name not in self.variant_map: + self.variant_map[feature_name] = {} + if distinct_id not in self.variant_map[feature_name]: + variant = self.get_value(feature_name, distinct_id, properties) + self.variant_map[feature_name][distinct_id] = variant + if variant: + LOG.info("Feature is found", flag=feature_name, distinct_id=distinct_id) + return self.variant_map[feature_name][distinct_id] + class NoOpExperimentationProvider(BaseExperimentationProvider): def is_feature_enabled(self, feature_name: str, distinct_id: str, properties: dict | None = None) -> bool: return False + + def get_value(self, feature_name: str, distinct_id: str, properties: dict | None = None) -> str | None: + return None