python-sdk: Fix issues raised in code review to match a more pythonic style

This commit is contained in:
Andrew Helsby 2022-05-30 15:13:10 +04:00
parent 029801f8df
commit d15c141cd0
11 changed files with 120 additions and 110 deletions

View File

@ -25,13 +25,3 @@ repos:
hooks: hooks:
- id: flake8 - id: flake8
additional_dependencies: [ "flake8-print", "flake8-builtins", "flake8-functions==0.0.4" ] 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 ]

View File

@ -1,7 +1,7 @@
# Open Feature Python SDK # Open Feature Python SDK
## Requirements ## Requirements
- Python 3.8 - Python 3.8+
## Installation ## Installation

View File

@ -1,3 +1,4 @@
import typing
from numbers import Number from numbers import Number
from open_feature import OpenFeature from open_feature import OpenFeature
@ -10,79 +11,103 @@ class OpenFeatureClient:
self.version = version self.version = version
self.context = context self.context = context
self.hooks = hooks self.hooks = hooks
self.provider = OpenFeature.get_provider()
def get_boolean_value( 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: ) -> bool:
return self.evaluate_flag( return self.evaluate_flag(
FlagType.BOOLEAN, FlagType.BOOLEAN,
key, key,
defaultValue, default_value,
evaluationContext, evaluation_context,
flagEvaluationOptions, flag_evaluation_options,
) )
def get_boolean_details( 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( return self.provider.get_boolean_details(
key, defaultValue, evaluationContext, flagEvaluationOptions key, default_value, evaluation_context, flag_evaluation_options
) )
def get_string_value( 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: ) -> str:
return self.evaluate_flag( return self.evaluate_flag(
FlagType.BOOLEAN, FlagType.STRING,
key, key,
defaultValue, default_value,
evaluationContext, evaluation_context,
flagEvaluationOptions, flag_evaluation_options,
) )
def get_string_details( 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( return self.provider.get_string_details(
key, defaultValue, evaluationContext, flagEvaluationOptions key, default_value, evaluation_context, flag_evaluation_options
) )
def get_number_value( 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: ) -> Number:
return self.evaluate_flag( return self.evaluate_flag(
FlagType.BOOLEAN, FlagType.NUMBER,
key, key,
defaultValue, default_value,
evaluationContext, evaluation_context,
flagEvaluationOptions, flag_evaluation_options,
) )
def get_number_details( 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( return self.provider.get_number_details(
key, defaultValue, evaluationContext, flagEvaluationOptions key, default_value, evaluation_context, flag_evaluation_options
) )
def evaluate_flag( def evaluate_flag(
self, self,
flag_type: FlagType, flag_type: FlagType,
key: str, key: str,
defaultValue: bool, default_value: bool,
evaluationContext, evaluation_context: typing.Any = None,
flagEvaluationOptions, flag_evaluation_options: typing.Any = None,
): ):
provider = OpenFeature.get_provider()
if flag_type is FlagType.BOOLEAN: if flag_type is FlagType.BOOLEAN:
return provider.getBooleanEvaluation( return self.provider.get_boolean_value(
key, defaultValue, evaluationContext, flagEvaluationOptions key, default_value, evaluation_context, flag_evaluation_options
) )
if flag_type is FlagType.NUMBER: if flag_type is FlagType.NUMBER:
return provider.getNumberEvaluation( return self.provider.get_number_value(
key, defaultValue, evaluationContext, flagEvaluationOptions key, default_value, evaluation_context, flag_evaluation_options
) )
if flag_type is FlagType.STRING: if flag_type is FlagType.STRING:
return provider.getStringEvaluation( return self.provider.get_string_value(
key, defaultValue, evaluationContext, flagEvaluationOptions key, default_value, evaluation_context, flag_evaluation_options
) )

View File

@ -10,7 +10,7 @@ class OpenFeature:
@staticmethod @staticmethod
def set_provider(provider_type: AbstractProvider): def set_provider(provider_type: AbstractProvider):
if provider_type is None: if provider_type is None:
print("No provider") raise TypeError("No provider")
global provider global provider
provider = provider_type provider = provider_type

View File

@ -1,3 +1,4 @@
import typing
from numbers import Number from numbers import Number
from os import environ from os import environ
@ -15,29 +16,50 @@ class FlagsmithProvider(AbstractProvider):
else: else:
self.flagsmith_provider = flagsmith 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) value = self.flagsmith_provider.get_value(key)
if not isinstance(value, bool): if not isinstance(value, bool):
raise Exception() raise Exception()
return value return value
def get_boolean_details(self, key: str, defaultValue: bool): def get_boolean_details(self, key: str, default_value: bool):
pass 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) value = self.flagsmith_provider.get_value(key)
if not isinstance(value, str): if not isinstance(value, str):
raise Exception() raise Exception()
return value return value
def get_string_details(self, key: str, defaultValue: str): def get_string_details(self, key: str, default_value: str):
pass 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) value = self.flagsmith_provider.get_value(key)
if not isinstance(value, Number): if not isinstance(value, Number):
raise Exception() raise Exception()
return value return value
def get_number_details(self, key: str, defaultValue: Number): def get_number_details(self, key: str, default_value: Number):
pass pass

View File

@ -1,92 +1,65 @@
import typing
from abc import abstractmethod from abc import abstractmethod
from numbers import Number from numbers import Number
class AbstractProvider: class AbstractProvider:
@abstractmethod
def get_boolean_value(self, key: str, defaultValue: bool) -> bool:
pass
@abstractmethod @abstractmethod
def get_boolean_value( 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: ) -> bool:
pass 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 @abstractmethod
def get_boolean_details( 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 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 @abstractmethod
def get_string_value( 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: ) -> str:
pass 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 @abstractmethod
def get_string_details( 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 pass
@abstractmethod
def get_number_value(self, key: str, defaultValue: bool) -> Number:
pass
@abstractmethod @abstractmethod
def get_number_value( 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: ) -> Number:
pass 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 @abstractmethod
def get_number_details( 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 pass