feat: populate provider and client metadata in HookContext (#302)

* feat: populate provider and client metadata in HookContext

Signed-off-by: Federico Bond <federicobond@gmail.com>

* fix: ensure provider consistency during flag evaluation

Signed-off-by: Federico Bond <federicobond@gmail.com>

---------

Signed-off-by: Federico Bond <federicobond@gmail.com>
This commit is contained in:
Federico Bond 2024-03-25 18:15:26 +11:00 committed by GitHub
parent 4a323b0f96
commit 78ea3b9914
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
1 changed files with 11 additions and 8 deletions

View File

@ -264,6 +264,7 @@ class OpenFeatureClient:
if flag_evaluation_options is None: if flag_evaluation_options is None:
flag_evaluation_options = FlagEvaluationOptions() flag_evaluation_options = FlagEvaluationOptions()
provider = self.provider # call this once to maintain a consistent reference
evaluation_hooks = flag_evaluation_options.hooks evaluation_hooks = flag_evaluation_options.hooks
hook_hints = flag_evaluation_options.hook_hints hook_hints = flag_evaluation_options.hook_hints
@ -272,8 +273,8 @@ class OpenFeatureClient:
flag_type=flag_type, flag_type=flag_type,
default_value=default_value, default_value=default_value,
evaluation_context=evaluation_context, evaluation_context=evaluation_context,
client_metadata=None, client_metadata=self.get_metadata(),
provider_metadata=None, provider_metadata=provider.get_metadata(),
) )
# Hooks need to be handled in different orders at different stages # Hooks need to be handled in different orders at different stages
# in the flag evaluation # in the flag evaluation
@ -282,7 +283,7 @@ class OpenFeatureClient:
api.get_hooks() api.get_hooks()
+ self.hooks + self.hooks
+ evaluation_hooks + evaluation_hooks
+ self.provider.get_provider_hooks() + provider.get_provider_hooks()
) )
# after, error, finally: Provider, Invocation, Client, API # after, error, finally: Provider, Invocation, Client, API
reversed_merged_hooks = merged_hooks[:] reversed_merged_hooks = merged_hooks[:]
@ -336,6 +337,7 @@ class OpenFeatureClient:
) )
flag_evaluation = self._create_provider_evaluation( flag_evaluation = self._create_provider_evaluation(
provider,
flag_type, flag_type,
flag_key, flag_key,
default_value, default_value,
@ -391,6 +393,7 @@ class OpenFeatureClient:
def _create_provider_evaluation( def _create_provider_evaluation(
self, self,
provider: FeatureProvider,
flag_type: FlagType, flag_type: FlagType,
flag_key: str, flag_key: str,
default_value: typing.Any, default_value: typing.Any,
@ -413,11 +416,11 @@ class OpenFeatureClient:
) )
get_details_callables: typing.Mapping[FlagType, GetDetailCallable] = { get_details_callables: typing.Mapping[FlagType, GetDetailCallable] = {
FlagType.BOOLEAN: self.provider.resolve_boolean_details, FlagType.BOOLEAN: provider.resolve_boolean_details,
FlagType.INTEGER: self.provider.resolve_integer_details, FlagType.INTEGER: provider.resolve_integer_details,
FlagType.FLOAT: self.provider.resolve_float_details, FlagType.FLOAT: provider.resolve_float_details,
FlagType.OBJECT: self.provider.resolve_object_details, FlagType.OBJECT: provider.resolve_object_details,
FlagType.STRING: self.provider.resolve_string_details, FlagType.STRING: provider.resolve_string_details,
} }
get_details_callable = get_details_callables.get(flag_type) get_details_callable = get_details_callables.get(flag_type)