devcycle-python-server-sdk 3.12.0__py3-none-any.whl → 3.13.1__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 (32) hide show
  1. devcycle_python_sdk/VERSION.txt +1 -1
  2. devcycle_python_sdk/api/local_bucketing.py +19 -4
  3. devcycle_python_sdk/bucketing-lib.release.wasm +0 -0
  4. devcycle_python_sdk/cloud_client.py +3 -3
  5. devcycle_python_sdk/local_client.py +13 -5
  6. devcycle_python_sdk/managers/config_manager.py +4 -0
  7. devcycle_python_sdk/managers/eval_hooks_manager.py +15 -4
  8. devcycle_python_sdk/managers/event_queue_manager.py +0 -1
  9. devcycle_python_sdk/models/config_metadata.py +40 -0
  10. devcycle_python_sdk/models/environment_metadata.py +26 -0
  11. devcycle_python_sdk/models/eval_hook.py +5 -2
  12. devcycle_python_sdk/models/eval_hook_context.py +23 -5
  13. devcycle_python_sdk/models/eval_reason.py +0 -1
  14. devcycle_python_sdk/models/project_metadata.py +24 -0
  15. devcycle_python_sdk/models/user.py +3 -3
  16. devcycle_python_sdk/models/variable_metadata.py +22 -0
  17. devcycle_python_sdk/open_feature_provider/provider.py +7 -5
  18. devcycle_python_sdk/options.py +1 -1
  19. devcycle_python_sdk/protobuf/utils.py +9 -3
  20. devcycle_python_sdk/protobuf/variableForUserParams_pb2.py +34 -42
  21. devcycle_python_sdk/protobuf/variableForUserParams_pb2.pyi +11 -11
  22. {devcycle_python_server_sdk-3.12.0.dist-info → devcycle_python_server_sdk-3.13.1.dist-info}/METADATA +2 -2
  23. {devcycle_python_server_sdk-3.12.0.dist-info → devcycle_python_server_sdk-3.13.1.dist-info}/RECORD +32 -28
  24. {devcycle_python_server_sdk-3.12.0.dist-info → devcycle_python_server_sdk-3.13.1.dist-info}/licenses/LICENSE +1 -1
  25. example/openfeature_example.py +175 -14
  26. test/api/test_local_bucketing.py +6 -3
  27. test/models/test_user.py +0 -1
  28. test/openfeature_test/test_provider.py +0 -1
  29. test/test_cloud_client.py +41 -6
  30. test/test_local_client.py +53 -4
  31. {devcycle_python_server_sdk-3.12.0.dist-info → devcycle_python_server_sdk-3.13.1.dist-info}/WHEEL +0 -0
  32. {devcycle_python_server_sdk-3.12.0.dist-info → devcycle_python_server_sdk-3.13.1.dist-info}/top_level.txt +0 -0
test/test_local_client.py CHANGED
@@ -392,10 +392,10 @@ class DevCycleLocalClientTest(unittest.TestCase):
392
392
  hook_called["before"] = True
393
393
  return context
394
394
 
395
- def after_hook(context, variable):
395
+ def after_hook(context, variable, variable_metadata):
396
396
  hook_called["after"] = True
397
397
 
398
- def finally_hook(context, variable):
398
+ def finally_hook(context, variable, variable_metadata):
399
399
  hook_called["finally"] = True
400
400
 
401
401
  def error_hook(context, error):
@@ -432,10 +432,10 @@ class DevCycleLocalClientTest(unittest.TestCase):
432
432
  hook_called["before"] = True
433
433
  raise Exception("Before hook failed")
434
434
 
435
- def after_hook(context, variable):
435
+ def after_hook(context, variable, variable_metadata):
436
436
  hook_called["after"] = True
437
437
 
438
- def finally_hook(context, variable):
438
+ def finally_hook(context, variable, variable_metadata):
439
439
  hook_called["finally"] = True
440
440
 
441
441
  def error_hook(context, error):
@@ -457,6 +457,55 @@ class DevCycleLocalClientTest(unittest.TestCase):
457
457
  self.assertTrue(hook_called["finally"])
458
458
  self.assertTrue(hook_called["error"])
459
459
 
460
+ @responses.activate
461
+ def test_context_has_config_metadata(self):
462
+ self.setup_client()
463
+
464
+ context_received = None
465
+
466
+ def before_hook(context):
467
+ nonlocal context_received
468
+ context_received = context
469
+ return context
470
+
471
+ def after_hook(context, variable, variable_metadata):
472
+ pass
473
+
474
+ def finally_hook(context, variable, variable_metadata):
475
+ pass
476
+
477
+ def error_hook(context, error):
478
+ pass
479
+
480
+ self.client.add_hook(
481
+ EvalHook(before_hook, after_hook, finally_hook, error_hook)
482
+ )
483
+
484
+ user = DevCycleUser(user_id="1234")
485
+
486
+ # Test that context has config_metadata field
487
+ variable = self.client.variable(user, "num-var", 42)
488
+
489
+ # Verify the variable evaluation worked
490
+ self.assertIsNotNone(variable)
491
+ self.assertIsNotNone(context_received)
492
+ self.assertTrue(hasattr(context_received, "config_metadata"))
493
+ # For local client, config_metadata should be populated
494
+ self.assertIsNotNone(context_received.config_metadata)
495
+ self.assertTrue(hasattr(context_received.config_metadata, "project"))
496
+ self.assertTrue(hasattr(context_received.config_metadata, "environment"))
497
+ # Verify the project and environment data
498
+ self.assertEqual(
499
+ context_received.config_metadata.project.id, "61f97628ff4afcb6d057dbf0"
500
+ )
501
+ self.assertEqual(context_received.config_metadata.project.key, "emma-project")
502
+ self.assertEqual(
503
+ context_received.config_metadata.environment.id, "61f97628ff4afcb6d057dbf2"
504
+ )
505
+ self.assertEqual(
506
+ context_received.config_metadata.environment.key, "development"
507
+ )
508
+
460
509
 
461
510
  def _benchmark_variable_call(client: DevCycleLocalClient, user: DevCycleUser, key: str):
462
511
  return client.variable(user, key, "default_value")