|
1 | | -from __future__ import annotations |
2 | | - |
3 | 1 | import logging |
4 | 2 | import typing |
5 | 3 | from collections.abc import Awaitable, Mapping, Sequence |
@@ -77,24 +75,27 @@ class ClientMetadata: |
77 | 75 |
|
78 | 76 |
|
79 | 77 | class OpenFeatureClient: |
| 78 | + """Client for evaluating feature flags against a specific OpenFeatureAPI. |
| 79 | +
|
| 80 | + Clients should be obtained via ``OpenFeatureAPI.get_client()`` (or the |
| 81 | + module-level ``openfeature.api.get_client()`` for the default API); |
| 82 | + direct construction is supported only for advanced use cases and requires |
| 83 | + passing the owning ``OpenFeatureAPI`` instance. |
| 84 | + """ |
| 85 | + |
80 | 86 | def __init__( |
81 | 87 | self, |
82 | 88 | domain: str | None, |
83 | 89 | version: str | None, |
| 90 | + api: "OpenFeatureAPI", |
84 | 91 | context: EvaluationContext | None = None, |
85 | 92 | hooks: list[Hook] | None = None, |
86 | | - api: OpenFeatureAPI | None = None, |
87 | 93 | ) -> None: |
88 | 94 | self.domain = domain |
89 | 95 | self.version = version |
90 | 96 | self.context = context or EvaluationContext() |
91 | 97 | self.hooks = hooks or [] |
92 | | - if api is not None: |
93 | | - self._api = api |
94 | | - else: |
95 | | - from openfeature._api import _default_api # noqa: PLC0415 |
96 | | - |
97 | | - self._api = _default_api |
| 98 | + self._api = api |
98 | 99 |
|
99 | 100 | @property |
100 | 101 | def provider(self) -> FeatureProvider: |
@@ -549,20 +550,20 @@ async def evaluate_flag_details_async( |
549 | 550 | self, |
550 | 551 | flag_type: FlagType, |
551 | 552 | flag_key: str, |
552 | | - default_value: Sequence[FlagValueType], |
| 553 | + default_value: Sequence["FlagValueType"], |
553 | 554 | evaluation_context: EvaluationContext | None = None, |
554 | 555 | flag_evaluation_options: FlagEvaluationOptions | None = None, |
555 | | - ) -> FlagEvaluationDetails[Sequence[FlagValueType]]: ... |
| 556 | + ) -> FlagEvaluationDetails[Sequence["FlagValueType"]]: ... |
556 | 557 |
|
557 | 558 | @typing.overload |
558 | 559 | async def evaluate_flag_details_async( |
559 | 560 | self, |
560 | 561 | flag_type: FlagType, |
561 | 562 | flag_key: str, |
562 | | - default_value: Mapping[str, FlagValueType], |
| 563 | + default_value: Mapping[str, "FlagValueType"], |
563 | 564 | evaluation_context: EvaluationContext | None = None, |
564 | 565 | flag_evaluation_options: FlagEvaluationOptions | None = None, |
565 | | - ) -> FlagEvaluationDetails[Mapping[str, FlagValueType]]: ... |
| 566 | + ) -> FlagEvaluationDetails[Mapping[str, "FlagValueType"]]: ... |
566 | 567 |
|
567 | 568 | async def evaluate_flag_details_async( |
568 | 569 | self, |
@@ -725,20 +726,20 @@ def evaluate_flag_details( |
725 | 726 | self, |
726 | 727 | flag_type: FlagType, |
727 | 728 | flag_key: str, |
728 | | - default_value: Sequence[FlagValueType], |
| 729 | + default_value: Sequence["FlagValueType"], |
729 | 730 | evaluation_context: EvaluationContext | None = None, |
730 | 731 | flag_evaluation_options: FlagEvaluationOptions | None = None, |
731 | | - ) -> FlagEvaluationDetails[Sequence[FlagValueType]]: ... |
| 732 | + ) -> FlagEvaluationDetails[Sequence["FlagValueType"]]: ... |
732 | 733 |
|
733 | 734 | @typing.overload |
734 | 735 | def evaluate_flag_details( |
735 | 736 | self, |
736 | 737 | flag_type: FlagType, |
737 | 738 | flag_key: str, |
738 | | - default_value: Mapping[str, FlagValueType], |
| 739 | + default_value: Mapping[str, "FlagValueType"], |
739 | 740 | evaluation_context: EvaluationContext | None = None, |
740 | 741 | flag_evaluation_options: FlagEvaluationOptions | None = None, |
741 | | - ) -> FlagEvaluationDetails[Mapping[str, FlagValueType]]: ... |
| 742 | + ) -> FlagEvaluationDetails[Mapping[str, "FlagValueType"]]: ... |
742 | 743 |
|
743 | 744 | def evaluate_flag_details( |
744 | 745 | self, |
|
0 commit comments