devcycle-python-server-sdk 3.11.4__py3-none-any.whl → 3.13.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (34) hide show
  1. devcycle_python_sdk/VERSION.txt +1 -1
  2. devcycle_python_sdk/api/bucketing_client.py +12 -0
  3. devcycle_python_sdk/api/local_bucketing.py +19 -12
  4. devcycle_python_sdk/bucketing-lib.release.wasm +0 -0
  5. devcycle_python_sdk/cloud_client.py +14 -5
  6. devcycle_python_sdk/local_client.py +41 -18
  7. devcycle_python_sdk/managers/config_manager.py +4 -0
  8. devcycle_python_sdk/managers/eval_hooks_manager.py +15 -4
  9. devcycle_python_sdk/managers/event_queue_manager.py +0 -1
  10. devcycle_python_sdk/managers/sse_manager.py +1 -1
  11. devcycle_python_sdk/models/config_metadata.py +40 -0
  12. devcycle_python_sdk/models/environment_metadata.py +26 -0
  13. devcycle_python_sdk/models/eval_hook.py +5 -2
  14. devcycle_python_sdk/models/eval_hook_context.py +23 -5
  15. devcycle_python_sdk/models/eval_reason.py +39 -0
  16. devcycle_python_sdk/models/project_metadata.py +24 -0
  17. devcycle_python_sdk/models/variable.py +44 -6
  18. devcycle_python_sdk/models/variable_metadata.py +22 -0
  19. devcycle_python_sdk/open_feature_provider/provider.py +10 -5
  20. devcycle_python_sdk/options.py +1 -1
  21. devcycle_python_sdk/protobuf/utils.py +27 -3
  22. devcycle_python_sdk/protobuf/variableForUserParams_pb2.py +36 -31
  23. devcycle_python_sdk/protobuf/variableForUserParams_pb2.pyi +99 -77
  24. {devcycle_python_server_sdk-3.11.4.dist-info → devcycle_python_server_sdk-3.13.0.dist-info}/METADATA +2 -2
  25. {devcycle_python_server_sdk-3.11.4.dist-info → devcycle_python_server_sdk-3.13.0.dist-info}/RECORD +34 -29
  26. test/api/test_local_bucketing.py +17 -3
  27. test/models/test_user.py +0 -1
  28. test/openfeature_test/test_provider.py +79 -3
  29. test/openfeature_test/test_provider_local_sdk.py +25 -0
  30. test/test_cloud_client.py +46 -4
  31. test/test_local_client.py +69 -5
  32. {devcycle_python_server_sdk-3.11.4.dist-info → devcycle_python_server_sdk-3.13.0.dist-info}/WHEEL +0 -0
  33. {devcycle_python_server_sdk-3.11.4.dist-info → devcycle_python_server_sdk-3.13.0.dist-info}/licenses/LICENSE +0 -0
  34. {devcycle_python_server_sdk-3.11.4.dist-info → devcycle_python_server_sdk-3.13.0.dist-info}/top_level.txt +0 -0
@@ -80,13 +80,18 @@ class DevCycleProvider(AbstractProvider):
80
80
  reason=Reason.DEFAULT,
81
81
  )
82
82
  else:
83
+ # TODO: once eval enabled from cloud bucketing, eval reason won't be null unless defaulted
84
+ if variable.eval and variable.eval.reason:
85
+ reason = variable.eval.reason
86
+ elif variable.isDefaulted:
87
+ reason = Reason.DEFAULT
88
+ else:
89
+ reason = Reason.TARGETING_MATCH
90
+
83
91
  return FlagResolutionDetails(
84
92
  value=variable.value,
85
- reason=(
86
- Reason.DEFAULT
87
- if variable.isDefaulted
88
- else Reason.TARGETING_MATCH
89
- ),
93
+ reason=reason,
94
+ flag_metadata=variable.get_flag_meta_data(),
90
95
  )
91
96
  except ValueError as e:
92
97
  # occurs if the key or default value is None
@@ -90,7 +90,7 @@ class DevCycleLocalOptions:
90
90
 
91
91
  if self.event_request_chunk_size > self.max_event_queue_size:
92
92
  logger.warning(
93
- f"DevCycle: event_request_chunk_size: {self.event_request_chunk_size} must be smaller than max_event_queue_size: { self.max_event_queue_size}"
93
+ f"DevCycle: event_request_chunk_size: {self.event_request_chunk_size} must be smaller than max_event_queue_size: {self.max_event_queue_size}"
94
94
  )
95
95
  self.event_request_chunk_size = 100
96
96
 
@@ -5,6 +5,7 @@ import math
5
5
  from typing import Any, Optional
6
6
 
7
7
  from devcycle_python_sdk.models.variable import TypeEnum, Variable
8
+ from devcycle_python_sdk.models.eval_reason import EvalReason
8
9
  from devcycle_python_sdk.models.user import DevCycleUser
9
10
 
10
11
  import devcycle_python_sdk.protobuf.variableForUserParams_pb2 as pb2
@@ -33,11 +34,17 @@ def create_nullable_custom_data(val: Optional[dict]) -> pb2.NullableCustomData:
33
34
  if value is None:
34
35
  values[key] = pb2.CustomDataValue(type=pb2.CustomDataType.Null) # type: ignore
35
36
  elif isinstance(value, bool):
36
- values[key] = pb2.CustomDataValue(type=pb2.CustomDataType.Bool, boolValue=value) # type: ignore
37
+ values[key] = pb2.CustomDataValue(
38
+ type=pb2.CustomDataType.Bool, boolValue=value
39
+ ) # type: ignore
37
40
  elif isinstance(value, str):
38
- values[key] = pb2.CustomDataValue(type=pb2.CustomDataType.Str, stringValue=value) # type: ignore
41
+ values[key] = pb2.CustomDataValue(
42
+ type=pb2.CustomDataType.Str, stringValue=value
43
+ ) # type: ignore
39
44
  elif isinstance(value, (int, float)):
40
- values[key] = pb2.CustomDataValue(type=pb2.CustomDataType.Num, doubleValue=value) # type: ignore
45
+ values[key] = pb2.CustomDataValue(
46
+ type=pb2.CustomDataType.Num, doubleValue=value
47
+ ) # type: ignore
41
48
  else:
42
49
  logger.warning(
43
50
  f"Custom Data contains data type that can't be written, will be ignored. Key: {key}, Type: {str(type(value))}"
@@ -82,7 +89,20 @@ def create_dvcuser_pb(user: DevCycleUser) -> pb2.DVCUser_PB: # type: ignore
82
89
  )
83
90
 
84
91
 
92
+ def create_eval_reason_from_pb(eval_reason_pb: pb2.EvalReason_PB) -> EvalReason: # type: ignore
93
+ """Convert EvalReason_PB protobuf message to EvalReason object"""
94
+ return EvalReason(
95
+ reason=eval_reason_pb.reason,
96
+ details=eval_reason_pb.details if eval_reason_pb.details else None,
97
+ target_id=eval_reason_pb.target_id if eval_reason_pb.target_id else None,
98
+ )
99
+
100
+
85
101
  def create_variable(sdk_variable: pb2.SDKVariable_PB, default_value: Any) -> Variable: # type: ignore
102
+ eval_reason_obj = None
103
+ if sdk_variable.HasField("eval"):
104
+ eval_reason_obj = create_eval_reason_from_pb(sdk_variable.eval)
105
+
86
106
  if sdk_variable.type == pb2.VariableType_PB.Boolean: # type: ignore
87
107
  return Variable(
88
108
  _id=None,
@@ -91,6 +111,7 @@ def create_variable(sdk_variable: pb2.SDKVariable_PB, default_value: Any) -> Var
91
111
  type=TypeEnum.BOOLEAN,
92
112
  isDefaulted=False,
93
113
  defaultValue=default_value,
114
+ eval=eval_reason_obj,
94
115
  )
95
116
 
96
117
  elif sdk_variable.type == pb2.VariableType_PB.String: # type: ignore
@@ -101,6 +122,7 @@ def create_variable(sdk_variable: pb2.SDKVariable_PB, default_value: Any) -> Var
101
122
  type=TypeEnum.STRING,
102
123
  isDefaulted=False,
103
124
  defaultValue=default_value,
125
+ eval=eval_reason_obj,
104
126
  )
105
127
 
106
128
  elif sdk_variable.type == pb2.VariableType_PB.Number: # type: ignore
@@ -111,6 +133,7 @@ def create_variable(sdk_variable: pb2.SDKVariable_PB, default_value: Any) -> Var
111
133
  type=TypeEnum.NUMBER,
112
134
  isDefaulted=False,
113
135
  defaultValue=default_value,
136
+ eval=eval_reason_obj,
114
137
  )
115
138
 
116
139
  elif sdk_variable.type == pb2.VariableType_PB.JSON: # type: ignore
@@ -123,6 +146,7 @@ def create_variable(sdk_variable: pb2.SDKVariable_PB, default_value: Any) -> Var
123
146
  type=TypeEnum.JSON,
124
147
  isDefaulted=False,
125
148
  defaultValue=default_value,
149
+ eval=eval_reason_obj,
126
150
  )
127
151
 
128
152
  else:
@@ -2,45 +2,50 @@
2
2
  # Generated by the protocol buffer compiler. DO NOT EDIT!
3
3
  # source: variableForUserParams.proto
4
4
  """Generated protocol buffer code."""
5
- from google.protobuf.internal import builder as _builder
5
+
6
6
  from google.protobuf import descriptor as _descriptor
7
7
  from google.protobuf import descriptor_pool as _descriptor_pool
8
8
  from google.protobuf import symbol_database as _symbol_database
9
+ from google.protobuf.internal import builder as _builder
9
10
  # @@protoc_insertion_point(imports)
10
11
 
11
12
  _sym_db = _symbol_database.Default()
12
13
 
13
14
 
15
+ DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(
16
+ b'\n\x1bvariableForUserParams.proto"/\n\x0eNullableString\x12\r\n\x05value\x18\x01 \x01(\t\x12\x0e\n\x06isNull\x18\x02 \x01(\x08"/\n\x0eNullableDouble\x12\r\n\x05value\x18\x01 \x01(\x01\x12\x0e\n\x06isNull\x18\x02 \x01(\x08"m\n\x0f\x43ustomDataValue\x12\x1d\n\x04type\x18\x01 \x01(\x0e\x32\x0f.CustomDataType\x12\x11\n\tboolValue\x18\x02 \x01(\x08\x12\x13\n\x0b\x64oubleValue\x18\x03 \x01(\x01\x12\x13\n\x0bstringValue\x18\x04 \x01(\t"\x93\x01\n\x12NullableCustomData\x12-\n\x05value\x18\x01 \x03(\x0b\x32\x1e.NullableCustomData.ValueEntry\x12\x0e\n\x06isNull\x18\x02 \x01(\x08\x1a>\n\nValueEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x1f\n\x05value\x18\x02 \x01(\x0b\x32\x10.CustomDataValue:\x02\x38\x01"\x9c\x01\n\x18VariableForUserParams_PB\x12\x0e\n\x06sdkKey\x18\x01 \x01(\t\x12\x13\n\x0bvariableKey\x18\x02 \x01(\t\x12&\n\x0cvariableType\x18\x03 \x01(\x0e\x32\x10.VariableType_PB\x12\x19\n\x04user\x18\x04 \x01(\x0b\x32\x0b.DVCUser_PB\x12\x18\n\x10shouldTrackEvent\x18\x05 \x01(\x08"\xe8\x02\n\nDVCUser_PB\x12\x0f\n\x07user_id\x18\x01 \x01(\t\x12\x1e\n\x05\x65mail\x18\x02 \x01(\x0b\x32\x0f.NullableString\x12\x1d\n\x04name\x18\x03 \x01(\x0b\x32\x0f.NullableString\x12!\n\x08language\x18\x04 \x01(\x0b\x32\x0f.NullableString\x12 \n\x07\x63ountry\x18\x05 \x01(\x0b\x32\x0f.NullableString\x12!\n\x08\x61ppBuild\x18\x06 \x01(\x0b\x32\x0f.NullableDouble\x12#\n\nappVersion\x18\x07 \x01(\x0b\x32\x0f.NullableString\x12$\n\x0b\x64\x65viceModel\x18\x08 \x01(\x0b\x32\x0f.NullableString\x12\'\n\ncustomData\x18\t \x01(\x0b\x32\x13.NullableCustomData\x12.\n\x11privateCustomData\x18\n \x01(\x0b\x32\x13.NullableCustomData"\xed\x01\n\x0eSDKVariable_PB\x12\x0b\n\x03_id\x18\x01 \x01(\t\x12\x1e\n\x04type\x18\x02 \x01(\x0e\x32\x10.VariableType_PB\x12\x0b\n\x03key\x18\x03 \x01(\t\x12\x11\n\tboolValue\x18\x04 \x01(\x08\x12\x13\n\x0b\x64oubleValue\x18\x05 \x01(\x01\x12\x13\n\x0bstringValue\x18\x06 \x01(\t\x12#\n\nevalReason\x18\x07 \x01(\x0b\x32\x0f.NullableString\x12!\n\x08_feature\x18\x08 \x01(\x0b\x32\x0f.NullableString\x12\x1c\n\x04\x65val\x18\t \x01(\x0b\x32\x0e.EvalReason_PB"C\n\rEvalReason_PB\x12\x0e\n\x06reason\x18\x01 \x01(\t\x12\x0f\n\x07\x64\x65tails\x18\x02 \x01(\t\x12\x11\n\ttarget_id\x18\x03 \x01(\t*@\n\x0fVariableType_PB\x12\x0b\n\x07\x42oolean\x10\x00\x12\n\n\x06Number\x10\x01\x12\n\n\x06String\x10\x02\x12\x08\n\x04JSON\x10\x03*6\n\x0e\x43ustomDataType\x12\x08\n\x04\x42ool\x10\x00\x12\x07\n\x03Num\x10\x01\x12\x07\n\x03Str\x10\x02\x12\x08\n\x04Null\x10\x03\x42X\n&com.devcycle.sdk.server.local.protobufP\x01Z\x07./proto\xaa\x02"DevCycle.SDK.Server.Local.Protobufb\x06proto3'
17
+ )
14
18
 
15
-
16
- DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1bvariableForUserParams.proto\"/\n\x0eNullableString\x12\r\n\x05value\x18\x01 \x01(\t\x12\x0e\n\x06isNull\x18\x02 \x01(\x08\"/\n\x0eNullableDouble\x12\r\n\x05value\x18\x01 \x01(\x01\x12\x0e\n\x06isNull\x18\x02 \x01(\x08\"m\n\x0f\x43ustomDataValue\x12\x1d\n\x04type\x18\x01 \x01(\x0e\x32\x0f.CustomDataType\x12\x11\n\tboolValue\x18\x02 \x01(\x08\x12\x13\n\x0b\x64oubleValue\x18\x03 \x01(\x01\x12\x13\n\x0bstringValue\x18\x04 \x01(\t\"\x93\x01\n\x12NullableCustomData\x12-\n\x05value\x18\x01 \x03(\x0b\x32\x1e.NullableCustomData.ValueEntry\x12\x0e\n\x06isNull\x18\x02 \x01(\x08\x1a>\n\nValueEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x1f\n\x05value\x18\x02 \x01(\x0b\x32\x10.CustomDataValue:\x02\x38\x01\"\x9c\x01\n\x18VariableForUserParams_PB\x12\x0e\n\x06sdkKey\x18\x01 \x01(\t\x12\x13\n\x0bvariableKey\x18\x02 \x01(\t\x12&\n\x0cvariableType\x18\x03 \x01(\x0e\x32\x10.VariableType_PB\x12\x19\n\x04user\x18\x04 \x01(\x0b\x32\x0b.DVCUser_PB\x12\x18\n\x10shouldTrackEvent\x18\x05 \x01(\x08\"\xe8\x02\n\nDVCUser_PB\x12\x0f\n\x07user_id\x18\x01 \x01(\t\x12\x1e\n\x05\x65mail\x18\x02 \x01(\x0b\x32\x0f.NullableString\x12\x1d\n\x04name\x18\x03 \x01(\x0b\x32\x0f.NullableString\x12!\n\x08language\x18\x04 \x01(\x0b\x32\x0f.NullableString\x12 \n\x07\x63ountry\x18\x05 \x01(\x0b\x32\x0f.NullableString\x12!\n\x08\x61ppBuild\x18\x06 \x01(\x0b\x32\x0f.NullableDouble\x12#\n\nappVersion\x18\x07 \x01(\x0b\x32\x0f.NullableString\x12$\n\x0b\x64\x65viceModel\x18\x08 \x01(\x0b\x32\x0f.NullableString\x12\'\n\ncustomData\x18\t \x01(\x0b\x32\x13.NullableCustomData\x12.\n\x11privateCustomData\x18\n \x01(\x0b\x32\x13.NullableCustomData\"\xac\x01\n\x0eSDKVariable_PB\x12\x0b\n\x03_id\x18\x01 \x01(\t\x12\x1e\n\x04type\x18\x02 \x01(\x0e\x32\x10.VariableType_PB\x12\x0b\n\x03key\x18\x03 \x01(\t\x12\x11\n\tboolValue\x18\x04 \x01(\x08\x12\x13\n\x0b\x64oubleValue\x18\x05 \x01(\x01\x12\x13\n\x0bstringValue\x18\x06 \x01(\t\x12#\n\nevalReason\x18\x07 \x01(\x0b\x32\x0f.NullableString*@\n\x0fVariableType_PB\x12\x0b\n\x07\x42oolean\x10\x00\x12\n\n\x06Number\x10\x01\x12\n\n\x06String\x10\x02\x12\x08\n\x04JSON\x10\x03*6\n\x0e\x43ustomDataType\x12\x08\n\x04\x42ool\x10\x00\x12\x07\n\x03Num\x10\x01\x12\x07\n\x03Str\x10\x02\x12\x08\n\x04Null\x10\x03\x42X\n&com.devcycle.sdk.server.local.protobufP\x01Z\x07./proto\xaa\x02\"DevCycle.SDK.Server.Local.Protobufb\x06proto3')
17
-
18
- _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals())
19
- _builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'variableForUserParams_pb2', globals())
19
+ _globals = globals()
20
+ _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
21
+ _builder.BuildTopDescriptorsAndMessages(
22
+ DESCRIPTOR, "variableForUserParams_pb2", _globals
23
+ )
20
24
  if _descriptor._USE_C_DESCRIPTORS == False:
21
-
22
- DESCRIPTOR._options = None
23
- DESCRIPTOR._serialized_options = b'\n&com.devcycle.sdk.server.local.protobufP\001Z\007./proto\252\002\"DevCycle.SDK.Server.Local.Protobuf'
24
- _NULLABLECUSTOMDATA_VALUEENTRY._options = None
25
- _NULLABLECUSTOMDATA_VALUEENTRY._serialized_options = b'8\001'
26
- _VARIABLETYPE_PB._serialized_start=1087
27
- _VARIABLETYPE_PB._serialized_end=1151
28
- _CUSTOMDATATYPE._serialized_start=1153
29
- _CUSTOMDATATYPE._serialized_end=1207
30
- _NULLABLESTRING._serialized_start=31
31
- _NULLABLESTRING._serialized_end=78
32
- _NULLABLEDOUBLE._serialized_start=80
33
- _NULLABLEDOUBLE._serialized_end=127
34
- _CUSTOMDATAVALUE._serialized_start=129
35
- _CUSTOMDATAVALUE._serialized_end=238
36
- _NULLABLECUSTOMDATA._serialized_start=241
37
- _NULLABLECUSTOMDATA._serialized_end=388
38
- _NULLABLECUSTOMDATA_VALUEENTRY._serialized_start=326
39
- _NULLABLECUSTOMDATA_VALUEENTRY._serialized_end=388
40
- _VARIABLEFORUSERPARAMS_PB._serialized_start=391
41
- _VARIABLEFORUSERPARAMS_PB._serialized_end=547
42
- _DVCUSER_PB._serialized_start=550
43
- _DVCUSER_PB._serialized_end=910
44
- _SDKVARIABLE_PB._serialized_start=913
45
- _SDKVARIABLE_PB._serialized_end=1085
25
+ DESCRIPTOR._options = None
26
+ DESCRIPTOR._serialized_options = b'\n&com.devcycle.sdk.server.local.protobufP\001Z\007./proto\252\002"DevCycle.SDK.Server.Local.Protobuf'
27
+ _NULLABLECUSTOMDATA_VALUEENTRY._options = None
28
+ _NULLABLECUSTOMDATA_VALUEENTRY._serialized_options = b"8\001"
29
+ _globals["_VARIABLETYPE_PB"]._serialized_start = 1221
30
+ _globals["_VARIABLETYPE_PB"]._serialized_end = 1285
31
+ _globals["_CUSTOMDATATYPE"]._serialized_start = 1287
32
+ _globals["_CUSTOMDATATYPE"]._serialized_end = 1341
33
+ _globals["_NULLABLESTRING"]._serialized_start = 31
34
+ _globals["_NULLABLESTRING"]._serialized_end = 78
35
+ _globals["_NULLABLEDOUBLE"]._serialized_start = 80
36
+ _globals["_NULLABLEDOUBLE"]._serialized_end = 127
37
+ _globals["_CUSTOMDATAVALUE"]._serialized_start = 129
38
+ _globals["_CUSTOMDATAVALUE"]._serialized_end = 238
39
+ _globals["_NULLABLECUSTOMDATA"]._serialized_start = 241
40
+ _globals["_NULLABLECUSTOMDATA"]._serialized_end = 388
41
+ _globals["_NULLABLECUSTOMDATA_VALUEENTRY"]._serialized_start = 326
42
+ _globals["_NULLABLECUSTOMDATA_VALUEENTRY"]._serialized_end = 388
43
+ _globals["_VARIABLEFORUSERPARAMS_PB"]._serialized_start = 391
44
+ _globals["_VARIABLEFORUSERPARAMS_PB"]._serialized_end = 547
45
+ _globals["_DVCUSER_PB"]._serialized_start = 550
46
+ _globals["_DVCUSER_PB"]._serialized_end = 910
47
+ _globals["_SDKVARIABLE_PB"]._serialized_start = 913
48
+ _globals["_SDKVARIABLE_PB"]._serialized_end = 1150
49
+ _globals["_EVALREASON_PB"]._serialized_start = 1152
50
+ _globals["_EVALREASON_PB"]._serialized_end = 1219
46
51
  # @@protoc_insertion_point(module_scope)
@@ -4,54 +4,60 @@ from google.protobuf import descriptor as _descriptor
4
4
  from google.protobuf import message as _message
5
5
  from typing import ClassVar as _ClassVar, Mapping as _Mapping, Optional as _Optional, Union as _Union
6
6
 
7
- Bool: CustomDataType
8
- Boolean: VariableType_PB
9
7
  DESCRIPTOR: _descriptor.FileDescriptor
8
+
9
+ class VariableType_PB(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
10
+ __slots__ = []
11
+ Boolean: _ClassVar[VariableType_PB]
12
+ Number: _ClassVar[VariableType_PB]
13
+ String: _ClassVar[VariableType_PB]
14
+ JSON: _ClassVar[VariableType_PB]
15
+
16
+ class CustomDataType(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
17
+ __slots__ = []
18
+ Bool: _ClassVar[CustomDataType]
19
+ Num: _ClassVar[CustomDataType]
20
+ Str: _ClassVar[CustomDataType]
21
+ Null: _ClassVar[CustomDataType]
22
+ Boolean: VariableType_PB
23
+ Number: VariableType_PB
24
+ String: VariableType_PB
10
25
  JSON: VariableType_PB
11
- Null: CustomDataType
26
+ Bool: CustomDataType
12
27
  Num: CustomDataType
13
- Number: VariableType_PB
14
28
  Str: CustomDataType
15
- String: VariableType_PB
29
+ Null: CustomDataType
30
+
31
+ class NullableString(_message.Message):
32
+ __slots__ = ["value", "isNull"]
33
+ VALUE_FIELD_NUMBER: _ClassVar[int]
34
+ ISNULL_FIELD_NUMBER: _ClassVar[int]
35
+ value: str
36
+ isNull: bool
37
+ def __init__(self, value: _Optional[str] = ..., isNull: bool = ...) -> None: ...
38
+
39
+ class NullableDouble(_message.Message):
40
+ __slots__ = ["value", "isNull"]
41
+ VALUE_FIELD_NUMBER: _ClassVar[int]
42
+ ISNULL_FIELD_NUMBER: _ClassVar[int]
43
+ value: float
44
+ isNull: bool
45
+ def __init__(self, value: _Optional[float] = ..., isNull: bool = ...) -> None: ...
16
46
 
17
47
  class CustomDataValue(_message.Message):
18
- __slots__ = ["boolValue", "doubleValue", "stringValue", "type"]
48
+ __slots__ = ["type", "boolValue", "doubleValue", "stringValue"]
49
+ TYPE_FIELD_NUMBER: _ClassVar[int]
19
50
  BOOLVALUE_FIELD_NUMBER: _ClassVar[int]
20
51
  DOUBLEVALUE_FIELD_NUMBER: _ClassVar[int]
21
52
  STRINGVALUE_FIELD_NUMBER: _ClassVar[int]
22
- TYPE_FIELD_NUMBER: _ClassVar[int]
53
+ type: CustomDataType
23
54
  boolValue: bool
24
55
  doubleValue: float
25
56
  stringValue: str
26
- type: CustomDataType
27
57
  def __init__(self, type: _Optional[_Union[CustomDataType, str]] = ..., boolValue: bool = ..., doubleValue: _Optional[float] = ..., stringValue: _Optional[str] = ...) -> None: ...
28
58
 
29
- class DVCUser_PB(_message.Message):
30
- __slots__ = ["appBuild", "appVersion", "country", "customData", "deviceModel", "email", "language", "name", "privateCustomData", "user_id"]
31
- APPBUILD_FIELD_NUMBER: _ClassVar[int]
32
- APPVERSION_FIELD_NUMBER: _ClassVar[int]
33
- COUNTRY_FIELD_NUMBER: _ClassVar[int]
34
- CUSTOMDATA_FIELD_NUMBER: _ClassVar[int]
35
- DEVICEMODEL_FIELD_NUMBER: _ClassVar[int]
36
- EMAIL_FIELD_NUMBER: _ClassVar[int]
37
- LANGUAGE_FIELD_NUMBER: _ClassVar[int]
38
- NAME_FIELD_NUMBER: _ClassVar[int]
39
- PRIVATECUSTOMDATA_FIELD_NUMBER: _ClassVar[int]
40
- USER_ID_FIELD_NUMBER: _ClassVar[int]
41
- appBuild: NullableDouble
42
- appVersion: NullableString
43
- country: NullableString
44
- customData: NullableCustomData
45
- deviceModel: NullableString
46
- email: NullableString
47
- language: NullableString
48
- name: NullableString
49
- privateCustomData: NullableCustomData
50
- user_id: str
51
- def __init__(self, user_id: _Optional[str] = ..., email: _Optional[_Union[NullableString, _Mapping]] = ..., name: _Optional[_Union[NullableString, _Mapping]] = ..., language: _Optional[_Union[NullableString, _Mapping]] = ..., country: _Optional[_Union[NullableString, _Mapping]] = ..., appBuild: _Optional[_Union[NullableDouble, _Mapping]] = ..., appVersion: _Optional[_Union[NullableString, _Mapping]] = ..., deviceModel: _Optional[_Union[NullableString, _Mapping]] = ..., customData: _Optional[_Union[NullableCustomData, _Mapping]] = ..., privateCustomData: _Optional[_Union[NullableCustomData, _Mapping]] = ...) -> None: ...
52
-
53
59
  class NullableCustomData(_message.Message):
54
- __slots__ = ["isNull", "value"]
60
+ __slots__ = ["value", "isNull"]
55
61
  class ValueEntry(_message.Message):
56
62
  __slots__ = ["key", "value"]
57
63
  KEY_FIELD_NUMBER: _ClassVar[int]
@@ -59,62 +65,78 @@ class NullableCustomData(_message.Message):
59
65
  key: str
60
66
  value: CustomDataValue
61
67
  def __init__(self, key: _Optional[str] = ..., value: _Optional[_Union[CustomDataValue, _Mapping]] = ...) -> None: ...
62
- ISNULL_FIELD_NUMBER: _ClassVar[int]
63
68
  VALUE_FIELD_NUMBER: _ClassVar[int]
64
- isNull: bool
69
+ ISNULL_FIELD_NUMBER: _ClassVar[int]
65
70
  value: _containers.MessageMap[str, CustomDataValue]
71
+ isNull: bool
66
72
  def __init__(self, value: _Optional[_Mapping[str, CustomDataValue]] = ..., isNull: bool = ...) -> None: ...
67
73
 
68
- class NullableDouble(_message.Message):
69
- __slots__ = ["isNull", "value"]
70
- ISNULL_FIELD_NUMBER: _ClassVar[int]
71
- VALUE_FIELD_NUMBER: _ClassVar[int]
72
- isNull: bool
73
- value: float
74
- def __init__(self, value: _Optional[float] = ..., isNull: bool = ...) -> None: ...
74
+ class VariableForUserParams_PB(_message.Message):
75
+ __slots__ = ["sdkKey", "variableKey", "variableType", "user", "shouldTrackEvent"]
76
+ SDKKEY_FIELD_NUMBER: _ClassVar[int]
77
+ VARIABLEKEY_FIELD_NUMBER: _ClassVar[int]
78
+ VARIABLETYPE_FIELD_NUMBER: _ClassVar[int]
79
+ USER_FIELD_NUMBER: _ClassVar[int]
80
+ SHOULDTRACKEVENT_FIELD_NUMBER: _ClassVar[int]
81
+ sdkKey: str
82
+ variableKey: str
83
+ variableType: VariableType_PB
84
+ user: DVCUser_PB
85
+ shouldTrackEvent: bool
86
+ def __init__(self, sdkKey: _Optional[str] = ..., variableKey: _Optional[str] = ..., variableType: _Optional[_Union[VariableType_PB, str]] = ..., user: _Optional[_Union[DVCUser_PB, _Mapping]] = ..., shouldTrackEvent: bool = ...) -> None: ...
75
87
 
76
- class NullableString(_message.Message):
77
- __slots__ = ["isNull", "value"]
78
- ISNULL_FIELD_NUMBER: _ClassVar[int]
79
- VALUE_FIELD_NUMBER: _ClassVar[int]
80
- isNull: bool
81
- value: str
82
- def __init__(self, value: _Optional[str] = ..., isNull: bool = ...) -> None: ...
88
+ class DVCUser_PB(_message.Message):
89
+ __slots__ = ["user_id", "email", "name", "language", "country", "appBuild", "appVersion", "deviceModel", "customData", "privateCustomData"]
90
+ USER_ID_FIELD_NUMBER: _ClassVar[int]
91
+ EMAIL_FIELD_NUMBER: _ClassVar[int]
92
+ NAME_FIELD_NUMBER: _ClassVar[int]
93
+ LANGUAGE_FIELD_NUMBER: _ClassVar[int]
94
+ COUNTRY_FIELD_NUMBER: _ClassVar[int]
95
+ APPBUILD_FIELD_NUMBER: _ClassVar[int]
96
+ APPVERSION_FIELD_NUMBER: _ClassVar[int]
97
+ DEVICEMODEL_FIELD_NUMBER: _ClassVar[int]
98
+ CUSTOMDATA_FIELD_NUMBER: _ClassVar[int]
99
+ PRIVATECUSTOMDATA_FIELD_NUMBER: _ClassVar[int]
100
+ user_id: str
101
+ email: NullableString
102
+ name: NullableString
103
+ language: NullableString
104
+ country: NullableString
105
+ appBuild: NullableDouble
106
+ appVersion: NullableString
107
+ deviceModel: NullableString
108
+ customData: NullableCustomData
109
+ privateCustomData: NullableCustomData
110
+ def __init__(self, user_id: _Optional[str] = ..., email: _Optional[_Union[NullableString, _Mapping]] = ..., name: _Optional[_Union[NullableString, _Mapping]] = ..., language: _Optional[_Union[NullableString, _Mapping]] = ..., country: _Optional[_Union[NullableString, _Mapping]] = ..., appBuild: _Optional[_Union[NullableDouble, _Mapping]] = ..., appVersion: _Optional[_Union[NullableString, _Mapping]] = ..., deviceModel: _Optional[_Union[NullableString, _Mapping]] = ..., customData: _Optional[_Union[NullableCustomData, _Mapping]] = ..., privateCustomData: _Optional[_Union[NullableCustomData, _Mapping]] = ...) -> None: ...
83
111
 
84
112
  class SDKVariable_PB(_message.Message):
85
- __slots__ = ["_id", "boolValue", "doubleValue", "evalReason", "key", "stringValue", "type"]
113
+ __slots__ = ["_id", "type", "key", "boolValue", "doubleValue", "stringValue", "evalReason", "_feature", "eval"]
114
+ _ID_FIELD_NUMBER: _ClassVar[int]
115
+ TYPE_FIELD_NUMBER: _ClassVar[int]
116
+ KEY_FIELD_NUMBER: _ClassVar[int]
86
117
  BOOLVALUE_FIELD_NUMBER: _ClassVar[int]
87
118
  DOUBLEVALUE_FIELD_NUMBER: _ClassVar[int]
88
- EVALREASON_FIELD_NUMBER: _ClassVar[int]
89
- KEY_FIELD_NUMBER: _ClassVar[int]
90
119
  STRINGVALUE_FIELD_NUMBER: _ClassVar[int]
91
- TYPE_FIELD_NUMBER: _ClassVar[int]
92
- _ID_FIELD_NUMBER: _ClassVar[int]
120
+ EVALREASON_FIELD_NUMBER: _ClassVar[int]
121
+ _FEATURE_FIELD_NUMBER: _ClassVar[int]
122
+ EVAL_FIELD_NUMBER: _ClassVar[int]
93
123
  _id: str
124
+ type: VariableType_PB
125
+ key: str
94
126
  boolValue: bool
95
127
  doubleValue: float
96
- evalReason: NullableString
97
- key: str
98
128
  stringValue: str
99
- type: VariableType_PB
100
- def __init__(self, _id: _Optional[str] = ..., type: _Optional[_Union[VariableType_PB, str]] = ..., key: _Optional[str] = ..., boolValue: bool = ..., doubleValue: _Optional[float] = ..., stringValue: _Optional[str] = ..., evalReason: _Optional[_Union[NullableString, _Mapping]] = ...) -> None: ...
101
-
102
- class VariableForUserParams_PB(_message.Message):
103
- __slots__ = ["sdkKey", "shouldTrackEvent", "user", "variableKey", "variableType"]
104
- SDKKEY_FIELD_NUMBER: _ClassVar[int]
105
- SHOULDTRACKEVENT_FIELD_NUMBER: _ClassVar[int]
106
- USER_FIELD_NUMBER: _ClassVar[int]
107
- VARIABLEKEY_FIELD_NUMBER: _ClassVar[int]
108
- VARIABLETYPE_FIELD_NUMBER: _ClassVar[int]
109
- sdkKey: str
110
- shouldTrackEvent: bool
111
- user: DVCUser_PB
112
- variableKey: str
113
- variableType: VariableType_PB
114
- def __init__(self, sdkKey: _Optional[str] = ..., variableKey: _Optional[str] = ..., variableType: _Optional[_Union[VariableType_PB, str]] = ..., user: _Optional[_Union[DVCUser_PB, _Mapping]] = ..., shouldTrackEvent: bool = ...) -> None: ...
115
-
116
- class VariableType_PB(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
117
- __slots__ = []
129
+ evalReason: NullableString
130
+ _feature: NullableString
131
+ eval: EvalReason_PB
132
+ def __init__(self, _id: _Optional[str] = ..., type: _Optional[_Union[VariableType_PB, str]] = ..., key: _Optional[str] = ..., boolValue: bool = ..., doubleValue: _Optional[float] = ..., stringValue: _Optional[str] = ..., evalReason: _Optional[_Union[NullableString, _Mapping]] = ..., _feature: _Optional[_Union[NullableString, _Mapping]] = ..., eval: _Optional[_Union[EvalReason_PB, _Mapping]] = ...) -> None: ...
118
133
 
119
- class CustomDataType(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
120
- __slots__ = []
134
+ class EvalReason_PB(_message.Message):
135
+ __slots__ = ["reason", "details", "target_id"]
136
+ REASON_FIELD_NUMBER: _ClassVar[int]
137
+ DETAILS_FIELD_NUMBER: _ClassVar[int]
138
+ TARGET_ID_FIELD_NUMBER: _ClassVar[int]
139
+ reason: str
140
+ details: str
141
+ target_id: str
142
+ def __init__(self, reason: _Optional[str] = ..., details: _Optional[str] = ..., target_id: _Optional[str] = ...) -> None: ...
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: devcycle-python-server-sdk
3
- Version: 3.11.4
3
+ Version: 3.13.0
4
4
  Summary: DevCycle Python SDK
5
5
  Home-page: https://github.com/devcycleHQ/python-server-sdk
6
6
  Author-email:
@@ -12,7 +12,7 @@ Requires-Dist: urllib3>=1.15.1
12
12
  Requires-Dist: requests>=2.32
13
13
  Requires-Dist: wasmtime~=30.0.0
14
14
  Requires-Dist: protobuf>=4.23.3
15
- Requires-Dist: openfeature-sdk>=0.8.0
15
+ Requires-Dist: openfeature-sdk==0.8.0
16
16
  Requires-Dist: launchdarkly-eventsource>=1.2.1
17
17
  Requires-Dist: responses>=0.23.1
18
18
  Dynamic: description
@@ -1,55 +1,60 @@
1
- devcycle_python_sdk/VERSION.txt,sha256=GFGFHmpUHWFv2xS-M3W8EuUmBgBWdaseuXsFd5QicyE,7
1
+ devcycle_python_sdk/VERSION.txt,sha256=NxOs_9lT1XG8y-FjlRru-YinX5RcBJt_ulPwgDESZ_o,7
2
2
  devcycle_python_sdk/__init__.py,sha256=30TcYb9PbvVi97gwk16omCGG1UoUI9lmmU7xpvxNMvc,336
3
- devcycle_python_sdk/bucketing-lib.release.wasm,sha256=FGGO3YnZHVs-ZY4XJM6FWpQwnPwHzFhBjQmrKPwWbtU,215612
4
- devcycle_python_sdk/cloud_client.py,sha256=pNKWMS70TzvVnvh0aspvffUtO6C_qQK8z9xC237QW7M,9064
3
+ devcycle_python_sdk/bucketing-lib.release.wasm,sha256=6iooyHRR-GBfrBH0_mleWyaNHr9uM_nVPS-IXGROGCY,224670
4
+ devcycle_python_sdk/cloud_client.py,sha256=dR2ye29Up699hO1cdrAWeoXIOBPVoSvQ4aKe2gSBRno,9414
5
5
  devcycle_python_sdk/devcycle_client.py,sha256=OqNza7OXOSRmMQq2kmyivljmH1GyN4dTiz0EhvDvt8w,1069
6
6
  devcycle_python_sdk/exceptions.py,sha256=Et7fS8pEFbHkFY86T2pJoEUstwjh4_rzhJxVH8fzAns,1053
7
- devcycle_python_sdk/local_client.py,sha256=DWzC92DhoDhpteqvTMpc-6IuaSmJYG7e_zgGy-MuDSw,11282
8
- devcycle_python_sdk/options.py,sha256=W3vNZfV6QNnQyaOuRf6Z5cK6ut6fWtlGqlUfhzWX0_c,5253
7
+ devcycle_python_sdk/local_client.py,sha256=HbHIGLeIw9fHOSwp7RJ8ozIO_IqQ23bzSoGoGFLp0Kk,12083
8
+ devcycle_python_sdk/options.py,sha256=DRvr1IQRW3BDHl81TvORfCtt0qVW42c8PoYjMMPkzwQ,5252
9
9
  devcycle_python_sdk/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10
10
  devcycle_python_sdk/api/__init__.py,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
11
11
  devcycle_python_sdk/api/backoff.py,sha256=F6WYCloaZD9CjNu6mKBMq7K20S8-i2WVU6X05ZRoawE,303
12
- devcycle_python_sdk/api/bucketing_client.py,sha256=-S0y9uAffippCTfjYgxI5j4j7YNfMxQJYUba1219nps,5111
12
+ devcycle_python_sdk/api/bucketing_client.py,sha256=BRQWtTnIyLdWoFT7sPHPGg8kstDtW-jx1N4og3_SEgI,5565
13
13
  devcycle_python_sdk/api/config_client.py,sha256=73aQAq130rTHpQrVDX6n_DwFKz0WuKxRoLDiE3vSoAM,5077
14
14
  devcycle_python_sdk/api/event_client.py,sha256=WxkuV6geEC9MgG4FN36HeEQQa22ilq2mkOVMZkpiEk4,3356
15
- devcycle_python_sdk/api/local_bucketing.py,sha256=_MAMCHviIS1n4GiU-CnnLBeEVX8BUFRqwNbA1IQi84U,16470
15
+ devcycle_python_sdk/api/local_bucketing.py,sha256=kXggXhv2PDQxDoLseuJwWbge8EgeqL0FWTmEIn8TUQc,16704
16
16
  devcycle_python_sdk/managers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
17
- devcycle_python_sdk/managers/config_manager.py,sha256=AIGY9jXEhUzhEeaKIA1P5F2q6GaclrezAoGHgYU4dLQ,5634
18
- devcycle_python_sdk/managers/eval_hooks_manager.py,sha256=skOGK_hyZNpgkdeNXTTa-d1GVRITjoi8T6dO5I_Cqfk,2679
19
- devcycle_python_sdk/managers/event_queue_manager.py,sha256=uPy1vO6OAisZjUNAhWELE_g17alTiOcPv42z-WwkGck,8110
20
- devcycle_python_sdk/managers/sse_manager.py,sha256=PElIsmmjUvLDHABikLxUq6CVjIJDnmqkY3psPILCTS8,2590
17
+ devcycle_python_sdk/managers/config_manager.py,sha256=QsJPMnf0wgNND3Yqhv125ckta_YFOMUb8I8pFq64tOE,5827
18
+ devcycle_python_sdk/managers/eval_hooks_manager.py,sha256=YOLj0IvNFqDbWvPA2aOqT15yKkwsdnZT9MQ7MHTv6M4,2963
19
+ devcycle_python_sdk/managers/event_queue_manager.py,sha256=8tqPZDD0-AWmz_NcWJBb80OIMzNBpDgbafpFefiOOmk,8109
20
+ devcycle_python_sdk/managers/sse_manager.py,sha256=hSGpnZ6gNbQXGotqNxjogoB82znAyMMFhqdlqeCc5bI,2586
21
21
  devcycle_python_sdk/models/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
22
22
  devcycle_python_sdk/models/bucketed_config.py,sha256=qTfhIViX7m2WS2oDBBCmKKzPsJG6DEav3zCEXwP27nA,3980
23
+ devcycle_python_sdk/models/config_metadata.py,sha256=HHhw2ncHOUAC3SH-IokVP4GrNLbflcGE9p7a2ZSuksA,1413
24
+ devcycle_python_sdk/models/environment_metadata.py,sha256=Zal9Ly15GaMcUBcD7CujNvtl5w_qfL8TQtLSRBpTHMo,629
23
25
  devcycle_python_sdk/models/error_response.py,sha256=r_dRUDAbral9UGaMYcnBsZOr9Hmkyi1SQbhGmZilgpA,442
24
- devcycle_python_sdk/models/eval_hook.py,sha256=_mDoEa8gkzMq-XpFRZrcXu_ldtpUzv5tlh-PghLpMMI,590
25
- devcycle_python_sdk/models/eval_hook_context.py,sha256=uBa8t0XxbcPBYAewNPFC2902qCjGhVoqUzZOZbGZ3n0,267
26
+ devcycle_python_sdk/models/eval_hook.py,sha256=k9w-AafvR-X7i8uf5nVuNEbD_PRS8QQmxW_90KVgGHA,742
27
+ devcycle_python_sdk/models/eval_hook_context.py,sha256=FYfMfXgtlW1O70khIcWF87yie2SWW4iWH2ehPex9paM,928
28
+ devcycle_python_sdk/models/eval_reason.py,sha256=obBjIWt8ZUh6knpVGsmCfWOCj4c7DXdH7K-FY-pchsU,901
26
29
  devcycle_python_sdk/models/event.py,sha256=Sj3eEopuPp8QwQl_Oz8E6Y9Ph6nLG0HxU7eR7xSbA7g,3722
27
30
  devcycle_python_sdk/models/feature.py,sha256=m3wxxIjC5jxhKpPLI4RcsBaNLuy-zsMqoAgc8ySPe0I,852
28
31
  devcycle_python_sdk/models/platform_data.py,sha256=nyQsgI6pcTd1FL3Y2ACmpvTYb08R_UtWul25OWZstps,849
32
+ devcycle_python_sdk/models/project_metadata.py,sha256=zRoE_oy_N3isqfrA5hAZ7S-7i5QBTSu9OGigFAvTqi8,602
29
33
  devcycle_python_sdk/models/user.py,sha256=mhEk-mnKJRg_tydpBlAVhGDj9rDCacJ-jNwiGeSpZiE,7027
30
- devcycle_python_sdk/models/variable.py,sha256=qp00SyCNyfYiMlTwnDSDJ4ZetRF35JHTbYZQOBxFIqY,1711
34
+ devcycle_python_sdk/models/variable.py,sha256=NXubhYWXYRAUEh4kDe2Tu9T5QnZmQ3roYVPbP-u2H3s,3030
35
+ devcycle_python_sdk/models/variable_metadata.py,sha256=oeH5fxDFLgAyc_B1RuOYRp4w68lTaBxTPvNgnXz7alE,583
31
36
  devcycle_python_sdk/open_feature_provider/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
32
- devcycle_python_sdk/open_feature_provider/provider.py,sha256=nLqyW4n9_NrJqgaz6cUt3YHDoZQzorjTYPiyT4UjFdc,5255
37
+ devcycle_python_sdk/open_feature_provider/provider.py,sha256=l-psKU5m6jSBE53VwX3fBBas-TztekFDlfYTyTJQm6c,5558
33
38
  devcycle_python_sdk/protobuf/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
34
- devcycle_python_sdk/protobuf/utils.py,sha256=zi-kVx6yvgS2c04cUobLd2IDc_ZqKkWduay9YcpjoGc,4684
35
- devcycle_python_sdk/protobuf/variableForUserParams_pb2.py,sha256=Zf4-8n67UnulC0Sz90aqLYsXCFEgywOqfiSHuXZomLk,4244
36
- devcycle_python_sdk/protobuf/variableForUserParams_pb2.pyi,sha256=gjTD1KkBe5NaXixSq78eNTNbjdDjBQ0h5L4dUKKgDWQ,5659
39
+ devcycle_python_sdk/protobuf/utils.py,sha256=SwsXH5QGAfbSn1FvgwO3x4W8uTYLsL1r3E-P5nDD4Nw,5528
40
+ devcycle_python_sdk/protobuf/variableForUserParams_pb2.py,sha256=SIFCo4AbjtlWQh2DYxkrWCR85PQajA4PIofXoRe4Gds,4956
41
+ devcycle_python_sdk/protobuf/variableForUserParams_pb2.pyi,sha256=OU4ORhjnbXy0AqdkxyARxg4JXGTPDuDzBW2W9RGdcMs,6623
37
42
  devcycle_python_sdk/util/__init__.py,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
38
43
  devcycle_python_sdk/util/strings.py,sha256=gH0Xm3gIXNqn6hczKPk10Jn5_9knuD7OB5MrB7bqztw,252
39
44
  devcycle_python_sdk/util/version.py,sha256=Cz7Us_EuXP-T8GI47g2WHYdBJj_zKo-5y545IDHJAjI,253
40
- devcycle_python_server_sdk-3.11.4.dist-info/licenses/LICENSE,sha256=tHQMqu-Jic2UpMGqb-vNFbGygysl8IG4l1clnnh0OFo,1071
45
+ devcycle_python_server_sdk-3.13.0.dist-info/licenses/LICENSE,sha256=tHQMqu-Jic2UpMGqb-vNFbGygysl8IG4l1clnnh0OFo,1071
41
46
  example/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
42
47
  example/cloud_client_example.py,sha256=YD8ZsTv3dPYfbFUKraRpRT0VsJGrPwjm8ZCuA5H54yI,2463
43
48
  example/local_bucketing_client_example.py,sha256=TaIfy3VnW9fXii9NPYs5UOuP4fLKruXMjnZApveqzl4,2796
44
49
  example/openfeature_example.py,sha256=kO6F-Xk20l6CPiMfIxSRreshEGmHMFHRg3zbeLXa3AI,2410
45
50
  test/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
46
- test/test_cloud_client.py,sha256=WpcHAZ6_T3XLWXTwXzxgUne7vFH8Ts5rseTau1M7SzQ,14224
47
- test/test_local_client.py,sha256=IMaFajfCD5UFW7Ge0P21DaxUD6GeZily-OT_Tx8vgkQ,15500
51
+ test/test_cloud_client.py,sha256=CoK4xfHPMGyJ4hXrdI98e5f4zEL51vx31u_xmC3FEtc,15957
52
+ test/test_local_client.py,sha256=yg19ddGmg9t1TfjT-4EgHp0cjfxHjfJZOGIFM8mSNX8,18078
48
53
  test/api/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
49
54
  test/api/test_bucketing_client.py,sha256=M2mjACowLvbsIjXdP-w8-fwY02xqv1X1r_h9v-pXa7A,7739
50
55
  test/api/test_config_client.py,sha256=3BwMm4y-4NQcdW2DDGppoJLIF-ffgjlUJti2Qjw1D1M,5129
51
56
  test/api/test_event_client.py,sha256=v4Xoum-PdywfczrfMV1llM5vrIJoqHybzxPLVokh09g,3310
52
- test/api/test_local_bucketing.py,sha256=0mReZ4bsFUoJWPAIcQrWXDZ9UoC5mF9MuI-9BVB6qjM,15561
57
+ test/api/test_local_bucketing.py,sha256=ECouaWpgWrlfEBtTK5OavmYX87XiXKg-9epmzTOCMdE,16126
53
58
  test/fixture/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
54
59
  test/fixture/data.py,sha256=6ReLxWPMhCDbJ5Ex24_iR0PJNjKzPFV1I9j_v0FVbBU,1462
55
60
  test/managers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -57,15 +62,15 @@ test/managers/test_config_manager.py,sha256=2TUnt8501KM7UlJNH7srIhvC-izehD7nOfqZ
57
62
  test/managers/test_event_queue_manager.py,sha256=z850atk8zAlD7sYaA1OJwgCFcfC0ps4NEk4XUnNCq1U,11629
58
63
  test/models/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
59
64
  test/models/test_bucketed_config.py,sha256=8wCEyxaHxY21nl7ZbiFzp-IzZQBZIPIVPPzeREjumQk,858
60
- test/models/test_user.py,sha256=ZUbFUndYrnefyGl8rxZgG3HdHPZs4BosQWimkT7etJc,10540
65
+ test/models/test_user.py,sha256=nuGJvR2KHilRlx5DDEzh1F-lpZ7qT7H88kqPvfcFfM8,10539
61
66
  test/openfeature_test/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
62
- test/openfeature_test/test_provider.py,sha256=UPxAD5e7NvpIhmqNFCrTY_yrKrMyYxBc2xuMAgdSGvw,7653
63
- test/openfeature_test/test_provider_local_sdk.py,sha256=ad0QizKSS-lbqlIjiQvwtKHP7PCFfYam3OKHtvsFBkU,4426
67
+ test/openfeature_test/test_provider.py,sha256=vj8eKprkF-psRdy54AtitYoEqBJKhDpfEzEDdhM-3FE,10931
68
+ test/openfeature_test/test_provider_local_sdk.py,sha256=ExkA1LYLuvW-dD4Bw2BKggzDQ8GpnIp3WyNK4rUZgJQ,5696
64
69
  test/util/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
65
70
  test/util/test_strings.py,sha256=T5H5U0af7_ld1yJC8IdDmay_Mx-iJQ5Fi5fbvKcAc7A,862
66
71
  test/util/test_utils.py,sha256=tVBJm_qnqg-4PssLpXIxqlk0JehuiAIPs4zpi2oNVnY,6671
67
72
  test/util/test_version.py,sha256=3Xg0_84m0bdHXz6pxd2Z85Oz9DoUC1T0Ol_WqEH_jac,335
68
- devcycle_python_server_sdk-3.11.4.dist-info/METADATA,sha256=pUSIwKnOlmwgTToZ6p5H8v7DcOUHxHfh_tNEB-e82A0,723
69
- devcycle_python_server_sdk-3.11.4.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
70
- devcycle_python_server_sdk-3.11.4.dist-info/top_level.txt,sha256=34f8zDzihAHoH7siAFlmscyO_QLNWWq9HApFlwtYL4k,33
71
- devcycle_python_server_sdk-3.11.4.dist-info/RECORD,,
73
+ devcycle_python_server_sdk-3.13.0.dist-info/METADATA,sha256=4RisdQtReQqBoSXMquKU0Ui47Z5bbnmAVmrdOLt4hsI,723
74
+ devcycle_python_server_sdk-3.13.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
75
+ devcycle_python_server_sdk-3.13.0.dist-info/top_level.txt,sha256=34f8zDzihAHoH7siAFlmscyO_QLNWWq9HApFlwtYL4k,33
76
+ devcycle_python_server_sdk-3.13.0.dist-info/RECORD,,