|
1 | 1 | """ |
2 | | -Wrapper module for the flagsmith client to implement singleton behaviour and provide some |
3 | | -additional logic by wrapping the client. |
| 2 | +OpenFeature client wrapper for Flagsmith on Flagsmith feature evaluation. |
4 | 3 |
|
5 | 4 | Usage: |
6 | 5 |
|
7 | 6 | ``` |
8 | | -environment_flags = get_client().get_environment_flags() |
9 | | -identity_flags = get_client().get_identity_flags() |
| 7 | +from integrations.flagsmith.client import get_openfeature_client |
| 8 | +
|
| 9 | +client = get_openfeature_client() |
| 10 | +enabled = client.get_boolean_value( |
| 11 | + "flag_name", default_value=False, evaluation_context=ctx |
| 12 | +) |
10 | 13 | ``` |
11 | 14 | """ |
12 | 15 |
|
13 | 16 | import typing |
14 | 17 |
|
| 18 | +import openfeature.api as openfeature_api |
15 | 19 | from django.conf import settings |
16 | 20 | from flagsmith import Flagsmith |
17 | 21 | from flagsmith.offline_handlers import LocalFileHandler |
| 22 | +from openfeature.client import OpenFeatureClient |
| 23 | +from openfeature.provider import ProviderStatus |
| 24 | +from openfeature_flagsmith.provider import FlagsmithProvider |
18 | 25 |
|
19 | 26 | from integrations.flagsmith.exceptions import FlagsmithIntegrationError |
20 | 27 | from integrations.flagsmith.flagsmith_service import ENVIRONMENT_JSON_PATH |
21 | 28 |
|
22 | | -_flagsmith_clients: dict[str, Flagsmith] = {} |
| 29 | +DEFAULT_OPENFEATURE_DOMAIN = "flagsmith-api" |
23 | 30 |
|
24 | 31 |
|
25 | | -def get_client(name: str = "default", local_eval: bool = False) -> Flagsmith: |
26 | | - global _flagsmith_clients |
| 32 | +def get_openfeature_client( |
| 33 | + domain: str = DEFAULT_OPENFEATURE_DOMAIN, |
| 34 | +) -> OpenFeatureClient: |
| 35 | + openfeature_client = openfeature_api.get_client(domain=domain) |
| 36 | + if openfeature_client.get_provider_status() != ProviderStatus.READY: |
| 37 | + initialise_provider(domain, **get_provider_kwargs()) |
| 38 | + return openfeature_client |
27 | 39 |
|
28 | | - try: |
29 | | - _flagsmith_client = _flagsmith_clients[name] |
30 | | - except (KeyError, TypeError): |
31 | | - kwargs = _get_client_kwargs() |
32 | | - kwargs["enable_local_evaluation"] = local_eval |
33 | | - _flagsmith_client = Flagsmith(**kwargs) |
34 | | - _flagsmith_clients[name] = _flagsmith_client |
35 | 40 |
|
36 | | - return _flagsmith_client |
| 41 | +def initialise_provider( |
| 42 | + domain: str = DEFAULT_OPENFEATURE_DOMAIN, |
| 43 | + **kwargs: typing.Any, |
| 44 | +) -> None: |
| 45 | + flagsmith_client = Flagsmith(**kwargs) |
| 46 | + provider = FlagsmithProvider(client=flagsmith_client) |
| 47 | + openfeature_api.set_provider(provider, domain=domain) |
37 | 48 |
|
38 | 49 |
|
39 | | -def _get_client_kwargs() -> dict[str, typing.Any]: |
40 | | - _default_kwargs = {"offline_handler": LocalFileHandler(ENVIRONMENT_JSON_PATH)} |
| 50 | +def get_provider_kwargs() -> dict[str, typing.Any]: |
| 51 | + common_kwargs: dict[str, typing.Any] = { |
| 52 | + "offline_handler": LocalFileHandler(ENVIRONMENT_JSON_PATH), |
| 53 | + "enable_local_evaluation": True, |
| 54 | + } |
41 | 55 |
|
42 | 56 | if settings.FLAGSMITH_ON_FLAGSMITH_SERVER_OFFLINE_MODE: |
43 | | - return {"offline_mode": True, **_default_kwargs} |
| 57 | + return {"offline_mode": True, **common_kwargs} |
44 | 58 | elif ( |
45 | 59 | settings.FLAGSMITH_ON_FLAGSMITH_SERVER_KEY |
46 | 60 | and settings.FLAGSMITH_ON_FLAGSMITH_SERVER_API_URL |
47 | 61 | ): |
48 | 62 | return { |
49 | 63 | "environment_key": settings.FLAGSMITH_ON_FLAGSMITH_SERVER_KEY, |
50 | 64 | "api_url": settings.FLAGSMITH_ON_FLAGSMITH_SERVER_API_URL, |
51 | | - **_default_kwargs, |
| 65 | + **common_kwargs, |
52 | 66 | } |
53 | 67 |
|
54 | 68 | raise FlagsmithIntegrationError( |
|
0 commit comments