diff --git a/api/environments/sdk/services.py b/api/environments/sdk/services.py index c7341e93e187..b80f1ee1ff76 100644 --- a/api/environments/sdk/services.py +++ b/api/environments/sdk/services.py @@ -95,7 +95,7 @@ def get_transient_identifier(sdk_trait_data: list[SDKTraitData]) -> str: if sdk_trait_data: return hashlib.sha256( "".join( - f"{trait['trait_key']}{trait_value['value']}" + f"{trait['trait_key']}{trait_value['value']}" # type: ignore[index] for trait in sorted(sdk_trait_data, key=itemgetter("trait_key")) if (trait_value := trait["trait_value"]) is not None ).encode(), diff --git a/api/environments/sdk/types.py b/api/environments/sdk/types.py index 0cb29a3df9c1..e74606766497 100644 --- a/api/environments/sdk/types.py +++ b/api/environments/sdk/types.py @@ -5,10 +5,17 @@ class SDKTraitValueData(typing.TypedDict): type: str - value: str + value: str | int | bool | float + + +# Trait value can be either: +# 1. A structured SDKTraitValueData (from serializer validation via TraitValueField) +# 2. A raw primitive value (str, int, bool, float) when called directly +# 3. None (to delete the trait) +TraitValue: typing.TypeAlias = SDKTraitValueData | str | int | bool | float | None class SDKTraitData(typing.TypedDict): trait_key: str - trait_value: SDKTraitValueData | None + trait_value: TraitValue transient: NotRequired[bool] diff --git a/api/integrations/launch_darkly/services.py b/api/integrations/launch_darkly/services.py index 84de934cdd2d..ab8db75bcd97 100644 --- a/api/integrations/launch_darkly/services.py +++ b/api/integrations/launch_darkly/services.py @@ -479,7 +479,7 @@ def _import_targets( [ { "trait_key": "key", - "trait_value": identifier, # type: ignore[typeddict-item] + "trait_value": identifier, } ] ) @@ -1029,7 +1029,7 @@ def _create_segments_from_ld( [ { "trait_key": "key", - "trait_value": identifier, # type: ignore[typeddict-item] + "trait_value": identifier, } ] ) diff --git a/api/tests/unit/environments/identities/helpers.py b/api/tests/unit/environments/identities/helpers.py index 6d9d1cd0625f..23506fdd98aa 100644 --- a/api/tests/unit/environments/identities/helpers.py +++ b/api/tests/unit/environments/identities/helpers.py @@ -2,13 +2,14 @@ from environments.identities.models import Identity from environments.identities.traits.models import Trait +from environments.sdk.types import SDKTraitData, TraitValue -def generate_trait_data_item( # type: ignore[no-untyped-def] +def generate_trait_data_item( trait_key: str = "trait_key", - trait_value: typing.Any = "trait_value", + trait_value: TraitValue = "trait_value", transient: bool = False, -): +) -> SDKTraitData: return { "trait_key": trait_key, "trait_value": trait_value,