diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 85b1ed5..a08c768 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -25,13 +25,3 @@ repos: hooks: - id: flake8 additional_dependencies: [ "flake8-print", "flake8-builtins", "flake8-functions==0.0.4" ] - - - repo: local - hooks: - - id: tests - name: Unit Tests - entry: pipenv run tests - language: python - 'types': [ python ] - pass_filenames: false - stages: [ push ] diff --git a/readme.md b/readme.md index e2cdbbc..374d784 100644 --- a/readme.md +++ b/readme.md @@ -1,9 +1,9 @@ # Open Feature Python SDK ## Requirements -- Python 3.8 +- Python 3.8+ ## Installation -## How to use \ No newline at end of file +## How to use diff --git a/src/client.py b/src/client.py index 2cf17f1..8c11f8b 100644 --- a/src/client.py +++ b/src/client.py @@ -1,3 +1,4 @@ +import typing from numbers import Number from open_feature import OpenFeature @@ -10,79 +11,103 @@ class OpenFeatureClient: self.version = version self.context = context self.hooks = hooks + self.provider = OpenFeature.get_provider() def get_boolean_value( - self, key: str, defaultValue: bool, evaluationContext, flagEvaluationOptions + self, + key: str, + default_value: bool, + evaluation_context: typing.Any = None, + flag_evaluation_options: typing.Any = None, ) -> bool: return self.evaluate_flag( FlagType.BOOLEAN, key, - defaultValue, - evaluationContext, - flagEvaluationOptions, + default_value, + evaluation_context, + flag_evaluation_options, ) def get_boolean_details( - self, key: str, defaultValue: bool, evaluationContext, flagEvaluationOptions + self, + key: str, + default_value: bool, + evaluation_context: typing.Any = None, + flag_evaluation_options: typing.Any = None, ): - return self.get_boolean_details( - key, defaultValue, evaluationContext, flagEvaluationOptions + return self.provider.get_boolean_details( + key, default_value, evaluation_context, flag_evaluation_options ) def get_string_value( - self, key: str, defaultValue: bool, evaluationContext, flagEvaluationOptions + self, + key: str, + default_value: str, + evaluation_context: typing.Any = None, + flag_evaluation_options: typing.Any = None, ) -> str: return self.evaluate_flag( - FlagType.BOOLEAN, + FlagType.STRING, key, - defaultValue, - evaluationContext, - flagEvaluationOptions, + default_value, + evaluation_context, + flag_evaluation_options, ) def get_string_details( - self, key: str, defaultValue: bool, evaluationContext, flagEvaluationOptions + self, + key: str, + default_value: bool, + evaluation_context: typing.Any = None, + flag_evaluation_options: typing.Any = None, ): - return self.get_string_details( - key, defaultValue, evaluationContext, flagEvaluationOptions + return self.provider.get_string_details( + key, default_value, evaluation_context, flag_evaluation_options ) def get_number_value( - self, key: str, defaultValue: bool, evaluationContext, flagEvaluationOptions + self, + key: str, + default_value: Number, + evaluation_context: typing.Any = None, + flag_evaluation_options: typing.Any = None, ) -> Number: return self.evaluate_flag( - FlagType.BOOLEAN, + FlagType.NUMBER, key, - defaultValue, - evaluationContext, - flagEvaluationOptions, + default_value, + evaluation_context, + flag_evaluation_options, ) def get_number_details( - self, key: str, defaultValue: bool, evaluationContext, flagEvaluationOptions + self, + key: str, + default_value: bool, + evaluation_context: typing.Any = None, + flag_evaluation_options: typing.Any = None, ): - return self.get_number_details( - key, defaultValue, evaluationContext, flagEvaluationOptions + return self.provider.get_number_details( + key, default_value, evaluation_context, flag_evaluation_options ) def evaluate_flag( self, flag_type: FlagType, key: str, - defaultValue: bool, - evaluationContext, - flagEvaluationOptions, + default_value: bool, + evaluation_context: typing.Any = None, + flag_evaluation_options: typing.Any = None, ): - provider = OpenFeature.get_provider() if flag_type is FlagType.BOOLEAN: - return provider.getBooleanEvaluation( - key, defaultValue, evaluationContext, flagEvaluationOptions + return self.provider.get_boolean_value( + key, default_value, evaluation_context, flag_evaluation_options ) if flag_type is FlagType.NUMBER: - return provider.getNumberEvaluation( - key, defaultValue, evaluationContext, flagEvaluationOptions + return self.provider.get_number_value( + key, default_value, evaluation_context, flag_evaluation_options ) if flag_type is FlagType.STRING: - return provider.getStringEvaluation( - key, defaultValue, evaluationContext, flagEvaluationOptions + return self.provider.get_string_value( + key, default_value, evaluation_context, flag_evaluation_options ) diff --git a/src/evaluation-context/__init__.py b/src/evaluation_context/__init__.py similarity index 100% rename from src/evaluation-context/__init__.py rename to src/evaluation_context/__init__.py diff --git a/src/evaluation-context/evaluation_context.py b/src/evaluation_context/evaluation_context.py similarity index 100% rename from src/evaluation-context/evaluation_context.py rename to src/evaluation_context/evaluation_context.py diff --git a/src/flag-evaluation/__init__.py b/src/flag_evaluation/__init__.py similarity index 100% rename from src/flag-evaluation/__init__.py rename to src/flag_evaluation/__init__.py diff --git a/src/flag-evaluation/flag_evaluation.py b/src/flag_evaluation/flag_evaluation.py similarity index 100% rename from src/flag-evaluation/flag_evaluation.py rename to src/flag_evaluation/flag_evaluation.py diff --git a/src/flag-evaluation/hooks.py b/src/flag_evaluation/hooks.py similarity index 100% rename from src/flag-evaluation/hooks.py rename to src/flag_evaluation/hooks.py diff --git a/src/open_feature.py b/src/open_feature.py index 32dc2e3..5b40a50 100644 --- a/src/open_feature.py +++ b/src/open_feature.py @@ -10,7 +10,7 @@ class OpenFeature: @staticmethod def set_provider(provider_type: AbstractProvider): if provider_type is None: - print("No provider") + raise TypeError("No provider") global provider provider = provider_type diff --git a/src/provider/flagsmith/flagsmith_provider.py b/src/provider/flagsmith/flagsmith_provider.py index a939a01..0b7226c 100644 --- a/src/provider/flagsmith/flagsmith_provider.py +++ b/src/provider/flagsmith/flagsmith_provider.py @@ -1,3 +1,4 @@ +import typing from numbers import Number from os import environ @@ -15,29 +16,50 @@ class FlagsmithProvider(AbstractProvider): else: self.flagsmith_provider = flagsmith - def get_boolean_value(self, key: str, defaultValue: bool) -> bool: + def get_boolean_value( + self, + key: str, + default_value: bool, + evaluation_context: typing.Any = None, + flag_evaluation_options: typing.Any = None, + ) -> bool: + value = self.flagsmith_provider.get_value(key) if not isinstance(value, bool): raise Exception() return value - def get_boolean_details(self, key: str, defaultValue: bool): + def get_boolean_details(self, key: str, default_value: bool): pass - def get_string_value(self, key: str, defaultValue: str) -> str: + def get_string_value( + self, + key: str, + default_value: str, + evaluation_context: typing.Any = None, + flag_evaluation_options: typing.Any = None, + ) -> str: + value = self.flagsmith_provider.get_value(key) if not isinstance(value, str): raise Exception() return value - def get_string_details(self, key: str, defaultValue: str): + def get_string_details(self, key: str, default_value: str): pass - def get_number_value(self, key: str, defaultValue: Number) -> Number: + def get_number_value( + self, + key: str, + default_value: Number, + evaluation_context: typing.Any = None, + flag_evaluation_options: typing.Any = None, + ) -> Number: + value = self.flagsmith_provider.get_value(key) if not isinstance(value, Number): raise Exception() return value - def get_number_details(self, key: str, defaultValue: Number): + def get_number_details(self, key: str, default_value: Number): pass diff --git a/src/provider/provider.py b/src/provider/provider.py index 88c6726..0ccc14d 100644 --- a/src/provider/provider.py +++ b/src/provider/provider.py @@ -1,92 +1,65 @@ +import typing from abc import abstractmethod from numbers import Number class AbstractProvider: - @abstractmethod - def get_boolean_value(self, key: str, defaultValue: bool) -> bool: - pass - @abstractmethod def get_boolean_value( - self, key: str, defaultValue: bool, evaluationContext + self, + key: str, + default_value: bool, + evaluation_context: typing.Any = None, + flag_evaluation_options: typing.Any = None, ) -> bool: pass - @abstractmethod - def get_boolean_value( - self, key: str, defaultValue: bool, evaluationContext, flagEvaluationOptions - ) -> bool: - pass - - @abstractmethod - def get_boolean_details(self, key: str, defaultValue: bool): - pass - - @abstractmethod - def get_boolean_details(self, key: str, defaultValue: bool, evaluationContext): - pass - @abstractmethod def get_boolean_details( - self, key: str, defaultValue: bool, evaluationContext, flagEvaluationOptions + self, + key: str, + default_value: bool, + evaluation_context: typing.Any = None, + flag_evaluation_options: typing.Any = None, ): pass - @abstractmethod - def get_string_value(self, key: str, defaultValue: bool) -> str: - pass - - @abstractmethod - def get_string_value(self, key: str, defaultValue: bool, evaluationContext) -> str: - pass - @abstractmethod def get_string_value( - self, key: str, defaultValue: bool, evaluationContext, flagEvaluationOptions + self, + key: str, + default_value: str, + evaluation_context: typing.Any = None, + flag_evaluation_options: typing.Any = None, ) -> str: pass - @abstractmethod - def get_string_details(self, key: str, defaultValue: bool): - pass - - @abstractmethod - def get_string_details(self, key: str, defaultValue: bool, evaluationContext): - pass - @abstractmethod def get_string_details( - self, key: str, defaultValue: bool, evaluationContext, flagEvaluationOptions + self, + key: str, + default_value: str, + evaluation_context: typing.Any = None, + flag_evaluation_options: typing.Any = None, ): pass - @abstractmethod - def get_number_value(self, key: str, defaultValue: bool) -> Number: - pass - @abstractmethod def get_number_value( - self, key: str, defaultValue: bool, evaluationContext + self, + key: str, + default_value: Number, + evaluation_context: typing.Any = None, + flag_evaluation_options: typing.Any = None, ) -> Number: pass - @abstractmethod - def get_number_value( - self, key: str, defaultValue: bool, evaluationContext, flagEvaluationOptions - ) -> Number: - pass - - @abstractmethod - def get_number_details(self, key: str, defaultValue: bool): - pass - - @abstractmethod - def get_number_details(self, key: str, defaultValue: bool, evaluationContext): - pass - @abstractmethod def get_number_details( - self, key: str, defaultValue: bool, evaluationContext, flagEvaluationOptions + self, + key: str, + default_value: Number, + evaluation_context: typing.Any = None, + flag_evaluation_options: typing.Any = None, ): pass