oai-statsig-python-core 0.24.2rc4__tar.gz → 0.25.0__tar.gz

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 (403) hide show
  1. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/Cargo.lock +6 -6
  2. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/Cargo.toml +8 -2
  3. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/PKG-INFO +1 -1
  4. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/py_src/statsig_python_core/__init__.py +1 -0
  5. oai_statsig_python_core-0.25.0/py_src/statsig_python_core/_frozen_json.py +120 -0
  6. oai_statsig_python_core-0.25.0/py_src/statsig_python_core/evaluation_cache.py +349 -0
  7. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/py_src/statsig_python_core/statsig.py +68 -7
  8. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/py_src/statsig_python_core/statsig_python_core.pyi +19 -4
  9. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/py_src/statsig_python_core/statsig_types.py +12 -3
  10. oai_statsig_python_core-0.25.0/statsig-pyo3/benchmarks/dynamic_config_value_cache_benchmark.py +113 -0
  11. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-pyo3/src/raw_evaluation_compat_py.rs +87 -19
  12. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-pyo3/src/statsig_base_py.rs +84 -20
  13. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-pyo3/src/statsig_options_py.rs +84 -0
  14. oai_statsig_python_core-0.25.0/statsig-pyo3/tests/test_evaluation_cache.py +356 -0
  15. oai_statsig_python_core-0.25.0/statsig-pyo3/tests/test_evaluation_cache_integration.py +773 -0
  16. oai_statsig_python_core-0.25.0/statsig-pyo3/tests/test_evaluation_cache_pyo3.py +301 -0
  17. oai_statsig_python_core-0.25.0/statsig-pyo3/tests/test_frozen_json.py +127 -0
  18. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-pyo3/tests/test_interned_store_preload.py +3 -0
  19. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-pyo3/tests/test_performance.py +46 -1
  20. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-pyo3/tests/test_statsig.py +29 -1
  21. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-pyo3/tests/test_statsig_options.py +29 -1
  22. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/Cargo.toml +5 -1
  23. oai_statsig_python_core-0.25.0/statsig-rust/src/__tests__/spec_store_tests.rs +1198 -0
  24. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/evaluation/comparisons/compare_arrays.rs +11 -7
  25. oai_statsig_python_core-0.25.0/statsig-rust/src/evaluation/comparisons/compare_numbers.rs +107 -0
  26. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/evaluation/comparisons/compare_strings_in_array.rs +39 -37
  27. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/evaluation/comparisons/compare_time.rs +29 -15
  28. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/evaluation/comparisons/compare_versions.rs +13 -11
  29. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/evaluation/evaluation_types.rs +76 -52
  30. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/evaluation/evaluator.rs +63 -48
  31. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/evaluation/evaluator_result.rs +61 -12
  32. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/evaluation/rkyv_value.rs +47 -8
  33. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/event_logging/delayed_exposure_store.rs +138 -6
  34. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/event_logging/statsig_event_internal.rs +68 -27
  35. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/gcir/dynamic_configs_processor.rs +93 -3
  36. oai_statsig_python_core-0.25.0/statsig-rust/src/gcir/evaluation_plan.rs +174 -0
  37. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/gcir/feature_gates_processor.rs +29 -1
  38. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/gcir/gcir_formatter.rs +262 -41
  39. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/gcir/gcir_options.rs +2 -0
  40. oai_statsig_python_core-0.25.0/statsig-rust/src/gcir/gcir_process_iter.rs +322 -0
  41. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/gcir/layer_configs_processor.rs +36 -1
  42. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/gcir/mod.rs +3 -0
  43. oai_statsig_python_core-0.25.0/statsig-rust/src/gcir/timing.rs +125 -0
  44. oai_statsig_python_core-0.25.0/statsig-rust/src/hashing/ahash.rs +160 -0
  45. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/id_lists_adapter/id_list.rs +45 -6
  46. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/initialize_response.rs +4 -3
  47. oai_statsig_python_core-0.25.0/statsig-rust/src/interned_values/__tests__/interned_store_mmap_fetch_tests.rs +337 -0
  48. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/interned_values/interned_store.rs +176 -23
  49. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/lib.rs +14 -0
  50. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/observability/ops_stats.rs +5 -0
  51. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/persistent_storage/persistent_values_manager.rs +11 -28
  52. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/spec_store.rs +372 -165
  53. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/specs_response/explicit_params.rs +4 -0
  54. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/specs_response/proto_specs.rs +46 -21
  55. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/specs_response/spec_types.rs +196 -0
  56. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/statsig.rs +76 -122
  57. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/statsig_metadata.rs +1 -1
  58. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/statsig_options.rs +40 -1
  59. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/statsig_runtime.rs +138 -16
  60. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/tests/direct_gcir_tests.rs +3 -2
  61. oai_statsig_python_core-0.25.0/statsig-rust/tests/gcir_plan_expansion_bench.rs +103 -0
  62. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/tests/gcir_tests.rs +126 -0
  63. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/tests/proto_specs_usage_tests.rs +17 -8
  64. oai_statsig_python_core-0.25.0/statsig-rust/tests/spec_store_lock_tests.rs +113 -0
  65. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/tests/statsig_tests.rs +5 -4
  66. oai_statsig_python_core-0.24.2rc4/statsig-rust/src/__tests__/spec_store_tests.rs +0 -425
  67. oai_statsig_python_core-0.24.2rc4/statsig-rust/src/evaluation/comparisons/compare_numbers.rs +0 -77
  68. oai_statsig_python_core-0.24.2rc4/statsig-rust/src/gcir/gcir_process_iter.rs +0 -168
  69. oai_statsig_python_core-0.24.2rc4/statsig-rust/src/hashing/ahash.rs +0 -53
  70. oai_statsig_python_core-0.24.2rc4/statsig-rust/src/interned_values/__tests__/interned_store_mmap_fetch_tests.rs +0 -111
  71. oai_statsig_python_core-0.24.2rc4/statsig-rust/tests/spec_store_lock_tests.rs +0 -103
  72. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/py_src/statsig_python_core/data_store.py +0 -0
  73. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/py_src/statsig_python_core/error_boundary.py +0 -0
  74. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/py_src/statsig_python_core/event_logging_adapter.py +0 -0
  75. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/py_src/statsig_python_core/observability_client.py +0 -0
  76. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/py_src/statsig_python_core/output_logger_provider.py +0 -0
  77. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/py_src/statsig_python_core/persistent_storage.py +0 -0
  78. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/py_src/statsig_python_core/py.typed +0 -0
  79. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/py_src/statsig_python_core/requirements.txt +0 -0
  80. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/pyproject.toml +0 -0
  81. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-grpc/Cargo.toml +0 -0
  82. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-grpc/README.md +0 -0
  83. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-grpc/build.rs +0 -0
  84. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-grpc/src/lib.rs +0 -0
  85. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-grpc/src/mock_forward_proxy.rs +0 -0
  86. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-grpc/src/protos/statsig_forward_proxy.proto +0 -0
  87. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-grpc/src/statsig_forward_proxy.rs +0 -0
  88. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-grpc/src/statsig_grpc_client.rs +0 -0
  89. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-grpc/src/statsig_grpc_err.rs +0 -0
  90. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-pyo3/.github/workflows/CI.yml +0 -0
  91. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-pyo3/.gitignore +0 -0
  92. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-pyo3/Cargo.toml +0 -0
  93. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-pyo3/README.md +0 -0
  94. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-pyo3/benchmarks/user_creation_benchmark.py +0 -0
  95. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-pyo3/benchmarks/user_memory_benchmark.py +0 -0
  96. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-pyo3/src/bin/stub_gen.rs +0 -0
  97. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-pyo3/src/data_store_base_py.rs +0 -0
  98. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-pyo3/src/event_logging_adapter_base_py.rs +0 -0
  99. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-pyo3/src/interned_store_py.rs +0 -0
  100. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-pyo3/src/lib.rs +0 -0
  101. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-pyo3/src/observability_client_base_py.rs +0 -0
  102. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-pyo3/src/output_logger_provider_base_py.rs +0 -0
  103. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-pyo3/src/pyo_utils.rs +0 -0
  104. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-pyo3/src/safe_gil.rs +0 -0
  105. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-pyo3/src/statsig_metadata_py.rs +0 -0
  106. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-pyo3/src/statsig_persistent_storage_override_adapter_py.rs +0 -0
  107. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-pyo3/src/statsig_types_py.rs +0 -0
  108. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-pyo3/src/statsig_user_py.rs +0 -0
  109. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-pyo3/src/unit_id_py.rs +0 -0
  110. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-pyo3/src/valid_primitives_py.rs +0 -0
  111. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-pyo3/tests/event_listener_reentrancy_subprocess.py +0 -0
  112. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-pyo3/tests/fork_runner.py +0 -0
  113. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-pyo3/tests/mock_output_logger.py +0 -0
  114. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-pyo3/tests/mock_scrapi.py +0 -0
  115. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-pyo3/tests/profile_util.py +0 -0
  116. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-pyo3/tests/shutdown_sub_proc.py +0 -0
  117. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-pyo3/tests/test_bulk_evaluate_gcir_parity.py +0 -0
  118. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-pyo3/tests/test_data_store.py +0 -0
  119. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-pyo3/tests/test_error_boundary.py +0 -0
  120. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-pyo3/tests/test_event_logging_adapter.py +0 -0
  121. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-pyo3/tests/test_experiment_serialization.py +0 -0
  122. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-pyo3/tests/test_exposure_logging.py +0 -0
  123. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-pyo3/tests/test_feature_gate_serialization.py +0 -0
  124. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-pyo3/tests/test_forking.py +0 -0
  125. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-pyo3/tests/test_get_dynamic_config.py +0 -0
  126. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-pyo3/tests/test_initialize_with_details.py +0 -0
  127. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-pyo3/tests/test_layer_param_exposure_sampling.py +0 -0
  128. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-pyo3/tests/test_layer_serialization.py +0 -0
  129. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-pyo3/tests/test_observability_client.py +0 -0
  130. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-pyo3/tests/test_output_logger_provider.py +0 -0
  131. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-pyo3/tests/test_override_adapter.py +0 -0
  132. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-pyo3/tests/test_sdk_event_emitter.py +0 -0
  133. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-pyo3/tests/test_sec_expo_as_primary.py +0 -0
  134. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-pyo3/tests/test_shared_statsig.py +0 -0
  135. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-pyo3/tests/test_shutdown.py +0 -0
  136. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-pyo3/tests/test_statsig_user.py +0 -0
  137. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-pyo3/tests/test_statsig_user_json_serialization.py +0 -0
  138. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-pyo3/tests/test_statsig_user_none_fields.py +0 -0
  139. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-pyo3/tests/test_statsig_user_pickle.py +0 -0
  140. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-pyo3/tests/test_user_exposure_e2e.py +0 -0
  141. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-pyo3/tests/utils.py +0 -0
  142. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/build.rs +0 -0
  143. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/resources/ip_supalite.table +0 -0
  144. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/resources/ua_parser_regex.yaml +0 -0
  145. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/resources/ua_parser_regex_lite.yaml +0 -0
  146. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/__tests__/interned_string_tests.rs +0 -0
  147. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/__tests__/mod.rs +0 -0
  148. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/__tests__/statsig_options_tests.rs +0 -0
  149. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/__tests__/user_value_tests.rs +0 -0
  150. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/compression/compression_helper.rs +0 -0
  151. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/compression/mod.rs +0 -0
  152. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/console_capture/console_capture_handler.rs +0 -0
  153. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/console_capture/console_capture_instances.rs +0 -0
  154. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/console_capture/console_capture_options.rs +0 -0
  155. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/console_capture/console_log_line_levels.rs +0 -0
  156. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/console_capture/mod.rs +0 -0
  157. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/data_store_interface.rs +0 -0
  158. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/dcs_str.rs +0 -0
  159. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/evaluation/__tests__/dynamic_returnable_tests.rs +0 -0
  160. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/evaluation/__tests__/mod.rs +0 -0
  161. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/evaluation/__tests__/rkyv_value_tests.rs +0 -0
  162. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/evaluation/cmab_evaluator.rs +0 -0
  163. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/evaluation/comparisons/compare_str_with_regex.rs +0 -0
  164. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/evaluation/comparisons/mod.rs +0 -0
  165. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/evaluation/country_lookup.rs +0 -0
  166. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/evaluation/dynamic_returnable.rs +0 -0
  167. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/evaluation/dynamic_string.rs +0 -0
  168. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/evaluation/dynamic_value.rs +0 -0
  169. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/evaluation/evaluation_details.rs +0 -0
  170. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/evaluation/evaluation_types_initialize_v2.rs +0 -0
  171. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/evaluation/evaluation_types_v2.rs +0 -0
  172. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/evaluation/evaluator_context.rs +0 -0
  173. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/evaluation/evaluator_value.rs +0 -0
  174. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/evaluation/get_unit_id.rs +0 -0
  175. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/evaluation/mod.rs +0 -0
  176. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/evaluation/secondary_exposure_key.rs +0 -0
  177. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/evaluation/user_agent_parsing/first_party_ua_parser.rs +0 -0
  178. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/evaluation/user_agent_parsing/mod.rs +0 -0
  179. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/evaluation/user_agent_parsing/statsig_uaparser/__tests__/mod.rs +0 -0
  180. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/evaluation/user_agent_parsing/statsig_uaparser/__tests__/test_helpers.rs +0 -0
  181. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/evaluation/user_agent_parsing/statsig_uaparser/__tests__/test_tokenizer.rs +0 -0
  182. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/evaluation/user_agent_parsing/statsig_uaparser/__tests__/test_ua_parser_browser.rs +0 -0
  183. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/evaluation/user_agent_parsing/statsig_uaparser/__tests__/test_ua_parser_os.rs +0 -0
  184. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/evaluation/user_agent_parsing/statsig_uaparser/mod.rs +0 -0
  185. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/evaluation/user_agent_parsing/statsig_uaparser/tokenizer.rs +0 -0
  186. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/evaluation/user_agent_parsing/statsig_uaparser/ua_parser.rs +0 -0
  187. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/evaluation/user_agent_parsing/statsig_uaparser/window_iter.rs +0 -0
  188. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/evaluation/user_agent_parsing/third_party_ua_parser.rs +0 -0
  189. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/evaluation/user_agent_parsing/ua_parser.rs +0 -0
  190. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/event_emitter/statsig_event_emitter_tests.rs +0 -0
  191. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/event_logging/event_logger.rs +0 -0
  192. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/event_logging/event_logger_constants.rs +0 -0
  193. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/event_logging/event_logger_ops_stats.rs +0 -0
  194. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/event_logging/event_queue/batch.rs +0 -0
  195. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/event_logging/event_queue/mod.rs +0 -0
  196. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/event_logging/event_queue/queue.rs +0 -0
  197. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/event_logging/event_queue/queued_config_expo.rs +0 -0
  198. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/event_logging/event_queue/queued_event.rs +0 -0
  199. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/event_logging/event_queue/queued_experiment_expo.rs +0 -0
  200. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/event_logging/event_queue/queued_expo.rs +0 -0
  201. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/event_logging/event_queue/queued_gate_expo.rs +0 -0
  202. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/event_logging/event_queue/queued_layer_param_expo.rs +0 -0
  203. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/event_logging/event_queue/queued_passthrough.rs +0 -0
  204. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/event_logging/event_queue/queued_secondary_expo.rs +0 -0
  205. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/event_logging/exposure_sampling.rs +0 -0
  206. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/event_logging/exposure_utils.rs +0 -0
  207. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/event_logging/flush_interval.rs +0 -0
  208. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/event_logging/flush_type.rs +0 -0
  209. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/event_logging/mod.rs +0 -0
  210. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/event_logging/sec_expo_as_primary_experiment.rs +0 -0
  211. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/event_logging/statsig_event.rs +0 -0
  212. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/event_logging_adapter/event_logging_adapter_trait.rs +0 -0
  213. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/event_logging_adapter/log_event_payload.rs +0 -0
  214. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/event_logging_adapter/mod.rs +0 -0
  215. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/event_logging_adapter/statsig_http_event_logging_adapter.rs +0 -0
  216. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/event_logging_adapter/statsig_local_file_event_logging_adapter.rs +0 -0
  217. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/gcir/param_stores_processor.rs +0 -0
  218. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/gcir/stringify_sec_exposures.rs +0 -0
  219. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/gcir/target_app_id_utils.rs +0 -0
  220. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/global_configs.rs +0 -0
  221. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/hashing/djb2.rs +0 -0
  222. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/hashing/hash_util.rs +0 -0
  223. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/hashing/memo_sha_256.rs +0 -0
  224. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/hashing/mod.rs +0 -0
  225. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/id_lists_adapter/id_lists_adapter_trait.rs +0 -0
  226. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/id_lists_adapter/mod.rs +0 -0
  227. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/id_lists_adapter/statsig_http_id_lists_adapter.rs +0 -0
  228. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/init_details.rs +0 -0
  229. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/initialize_evaluations_response.rs +0 -0
  230. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/initialize_v2_response.rs +0 -0
  231. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/instance_registry.rs +0 -0
  232. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/interned_string.rs +0 -0
  233. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/interned_values/__tests__/fixtures/interned_store_v1.mmap +0 -0
  234. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/interned_values/__tests__/interned_store_eval_value_tests.rs +0 -0
  235. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/interned_values/__tests__/interned_store_returnable_tests.rs +0 -0
  236. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/interned_values/__tests__/interned_store_string_tests.rs +0 -0
  237. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/interned_values/__tests__/mod.rs +0 -0
  238. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/interned_values/mod.rs +0 -0
  239. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/logging_utils.rs +0 -0
  240. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/macros.rs +0 -0
  241. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/networking/__tests__/mod.rs +0 -0
  242. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/networking/__tests__/response_data_tests.rs +0 -0
  243. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/networking/http_types.rs +0 -0
  244. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/networking/mod.rs +0 -0
  245. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/networking/network_client.rs +0 -0
  246. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/networking/network_error.rs +0 -0
  247. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/networking/providers/mod.rs +0 -0
  248. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/networking/providers/net_provider_global.rs +0 -0
  249. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/networking/providers/net_provider_noop.rs +0 -0
  250. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/networking/providers/net_provider_reqwest.rs +0 -0
  251. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/networking/proxy_config.rs +0 -0
  252. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/observability/console_capture_observer.rs +0 -0
  253. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/observability/diagnostics_observer.rs +0 -0
  254. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/observability/mod.rs +0 -0
  255. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/observability/observability_client_adapter.rs +0 -0
  256. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/observability/sdk_errors_observer.rs +0 -0
  257. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/output_logger.rs +0 -0
  258. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/override_adapter/mod.rs +0 -0
  259. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/override_adapter/override_adapter_trait.rs +0 -0
  260. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/override_adapter/statsig_local_override_adapter.rs +0 -0
  261. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/persistent_storage/__tests__/mod.rs +0 -0
  262. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/persistent_storage/__tests__/sticky_values_serialization_tests.rs +0 -0
  263. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/persistent_storage/mod.rs +0 -0
  264. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/persistent_storage/persistent_storage_trait.rs +0 -0
  265. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/sdk_diagnostics/diagnostics.rs +0 -0
  266. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/sdk_diagnostics/diagnostics_utils.rs +0 -0
  267. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/sdk_diagnostics/marker.rs +0 -0
  268. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/sdk_diagnostics/mod.rs +0 -0
  269. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/sdk_event_emitter/event_emitter.rs +0 -0
  270. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/sdk_event_emitter/event_emitter_tests.rs +0 -0
  271. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/sdk_event_emitter/event_types.rs +0 -0
  272. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/sdk_event_emitter/mod.rs +0 -0
  273. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/specs_adapter/config_spec_background_sync_metrics.rs +0 -0
  274. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/specs_adapter/mod.rs +0 -0
  275. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/specs_adapter/response_format.rs +0 -0
  276. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/specs_adapter/specs_adapter_trait.rs +0 -0
  277. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/specs_adapter/statsig_bootstrap_specs_adapter.rs +0 -0
  278. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/specs_adapter/statsig_customized_specs_adapter.rs +0 -0
  279. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/specs_adapter/statsig_data_store_specs_adapter.rs +0 -0
  280. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/specs_adapter/statsig_grpc_specs_adapter.rs +0 -0
  281. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/specs_adapter/statsig_http_specs_adapter.rs +0 -0
  282. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/specs_adapter/statsig_local_file_specs_adapter.rs +0 -0
  283. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/specs_response/__tests__/mod.rs +0 -0
  284. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/specs_response/__tests__/proto_specs_syncing_tests.rs +0 -0
  285. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/specs_response/__tests__/proto_specs_unknown_tests.rs +0 -0
  286. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/specs_response/__tests__/proto_specs_vs_json_tests.rs +0 -0
  287. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/specs_response/__tests__/proto_stream_reader_tests.rs +0 -0
  288. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/specs_response/cmab_types.rs +0 -0
  289. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/specs_response/mod.rs +0 -0
  290. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/specs_response/param_store_types.rs +0 -0
  291. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/specs_response/proto_stream_reader.rs +0 -0
  292. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/specs_response/specs_hash_map.rs +0 -0
  293. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/specs_response/statsig_config_specs.rs +0 -0
  294. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/statsig_core_api_options.rs +0 -0
  295. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/statsig_err.rs +0 -0
  296. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/statsig_global.rs +0 -0
  297. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/statsig_type_factories.rs +0 -0
  298. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/statsig_types.rs +0 -0
  299. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/statsig_types_raw.rs +0 -0
  300. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/user/fast_statsig_user.rs +0 -0
  301. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/user/into_optional.rs +0 -0
  302. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/user/mod.rs +0 -0
  303. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/user/statsig_user.rs +0 -0
  304. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/user/statsig_user_builder.rs +0 -0
  305. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/user/statsig_user_internal.rs +0 -0
  306. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/user/statsig_user_loggable.rs +0 -0
  307. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/user/unit_id.rs +0 -0
  308. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/user/user_data.rs +0 -0
  309. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/user/user_value.rs +0 -0
  310. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/utils/mod.rs +0 -0
  311. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/src/value_parsing.rs +0 -0
  312. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/tests/check_gate_tests.rs +0 -0
  313. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/tests/customized_specs_adapter_tests.rs +0 -0
  314. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/tests/data/big_number_dcs.json +0 -0
  315. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/tests/data/check_gate_perf_dcs.json +0 -0
  316. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/tests/data/company_id_list +0 -0
  317. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/tests/data/dcs_error.json +0 -0
  318. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/tests/data/dcs_missing_gates.json +0 -0
  319. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/tests/data/dcs_non_case_sensitive.json +0 -0
  320. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/tests/data/dcs_user_agent_versions.json +0 -0
  321. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/tests/data/dcs_with_analytical_exposure_sampling.json +0 -0
  322. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/tests/data/dcs_with_checksum.json +0 -0
  323. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/tests/data/dcs_with_sampling.json +0 -0
  324. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/tests/data/dcs_with_sdk_configs.json +0 -0
  325. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/tests/data/demo_proj_dcs.json +0 -0
  326. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/tests/data/demo_proj_dcs.pb.br +0 -0
  327. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/tests/data/eval_proj_dcs.json +0 -0
  328. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/tests/data/eval_proj_dcs.pb.br +0 -0
  329. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/tests/data/get_id_lists.json +0 -0
  330. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/tests/data/perf_proj_dcs.json +0 -0
  331. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/tests/data/perf_proj_dcs.pb.br +0 -0
  332. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/tests/data/shared_dict_dict_only.json +0 -0
  333. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/tests/data/shared_dict_original_dcs.json +0 -0
  334. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/tests/data/shared_dict_response_uncompressed.json +0 -0
  335. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/tests/data/shared_dict_response_with_dict.json +0 -0
  336. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/tests/data/shared_dict_response_without_dict.json +0 -0
  337. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/tests/data/test_must_pass_user_agents.txt +0 -0
  338. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/tests/data/test_user_agents.txt +0 -0
  339. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/tests/data/ua_string_cases.json +0 -0
  340. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/tests/data/unknown_enum.pb.br +0 -0
  341. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/tests/data_store_bytes_adapter_tests.rs +0 -0
  342. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/tests/data_store_json_bytes_tests.rs +0 -0
  343. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/tests/data_store_json_only_no_bytes_methods_tests.rs +0 -0
  344. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/tests/data_store_lock_tests.rs +0 -0
  345. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/tests/data_store_proto_bytes_tests.rs +0 -0
  346. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/tests/delayed_exposure_bench.rs +0 -0
  347. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/tests/dynamic_string_tests.rs +0 -0
  348. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/tests/dynamic_value_tests.rs +0 -0
  349. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/tests/evaluation_details_tests.rs +0 -0
  350. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/tests/evaluator_value_tests.rs +0 -0
  351. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/tests/event_logger_failing_flush_tests.rs +0 -0
  352. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/tests/event_logger_flush_tests.rs +0 -0
  353. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/tests/event_logger_high_qps_tests.rs +0 -0
  354. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/tests/event_logger_usage_tests.rs +0 -0
  355. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/tests/expected_evaluation_tests.rs +0 -0
  356. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/tests/exposure_sampling_key_tests.rs +0 -0
  357. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/tests/exposure_tests.rs +0 -0
  358. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/tests/flushing_tests.rs +0 -0
  359. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/tests/gate_inversion_eval_tests.rs +0 -0
  360. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/tests/global_configs_test.rs +0 -0
  361. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/tests/grpc_specs_adapter_tests.rs +0 -0
  362. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/tests/hash_util_evaluation_hash_tests.rs +0 -0
  363. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/tests/http_specs_adapter_tests.rs +0 -0
  364. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/tests/initialize_timeout_test.rs +0 -0
  365. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/tests/instance_registry_tests.rs +0 -0
  366. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/tests/layer_serialization_tests.rs +0 -0
  367. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/tests/list_methods_tests.rs +0 -0
  368. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/tests/network_client_streaming_tests.rs +0 -0
  369. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/tests/network_client_tests.rs +0 -0
  370. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/tests/network_failure_tests.rs +0 -0
  371. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/tests/observability_client_usage_tests.rs +0 -0
  372. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/tests/output_logger_tests.rs +0 -0
  373. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/tests/override_adapter_tests.rs +0 -0
  374. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/tests/perf_tests.rs +0 -0
  375. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/tests/spec_types_tests.rs +0 -0
  376. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/tests/statsig_disable_network_tests.rs +0 -0
  377. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/tests/statsig_environment_tests.rs +0 -0
  378. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/tests/statsig_event_emitter_usage_test.rs +0 -0
  379. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/tests/statsig_global_tests.rs +0 -0
  380. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/tests/statsig_local_file_event_logging_adapter_tests.rs +0 -0
  381. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/tests/statsig_local_file_specs_adapter_tests.rs +0 -0
  382. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/tests/statsig_options_tests.rs +0 -0
  383. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/tests/statsig_shared_tests.rs +0 -0
  384. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/tests/statsig_user_builder_tests.rs +0 -0
  385. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/tests/statsig_user_field_accessor_tests.rs +0 -0
  386. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/tests/statsig_user_internal_tests.rs +0 -0
  387. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/tests/statsig_user_loggable_tests.rs +0 -0
  388. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/tests/statsig_user_tests.rs +0 -0
  389. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/tests/syncing_network_failure_tests.rs +0 -0
  390. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/tests/typed_getters_tests.rs +0 -0
  391. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/tests/ua_parser_util_test.rs +0 -0
  392. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/tests/user_agent_tests_first_party.rs +0 -0
  393. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/tests/user_json_tests.rs +0 -0
  394. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/tests/utils/env_var_guard.rs +0 -0
  395. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/tests/utils/helpers.rs +0 -0
  396. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/tests/utils/mock_data_store.rs +0 -0
  397. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/tests/utils/mock_event_logging_adapter.rs +0 -0
  398. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/tests/utils/mock_log_provider.rs +0 -0
  399. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/tests/utils/mock_observability_client.rs +0 -0
  400. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/tests/utils/mock_scrapi.rs +0 -0
  401. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/tests/utils/mock_specs_adapter.rs +0 -0
  402. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/tests/utils/mock_specs_listener.rs +0 -0
  403. {oai_statsig_python_core-0.24.2rc4 → oai_statsig_python_core-0.25.0}/statsig-rust/tests/utils/mod.rs +0 -0
@@ -1722,7 +1722,7 @@ dependencies = [
1722
1722
 
1723
1723
  [[package]]
1724
1724
  name = "oai-statsig-grpc"
1725
- version = "0.24.2-rc.4"
1725
+ version = "0.25.0"
1726
1726
  dependencies = [
1727
1727
  "async-trait",
1728
1728
  "chrono",
@@ -1737,7 +1737,7 @@ dependencies = [
1737
1737
 
1738
1738
  [[package]]
1739
1739
  name = "oai-statsig-rust"
1740
- version = "0.24.2-rc.4"
1740
+ version = "0.25.0"
1741
1741
  dependencies = [
1742
1742
  "ahash",
1743
1743
  "arc-swap",
@@ -3011,7 +3011,7 @@ checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f"
3011
3011
 
3012
3012
  [[package]]
3013
3013
  name = "statsig-node"
3014
- version = "0.24.2-rc.4"
3014
+ version = "0.25.0"
3015
3015
  dependencies = [
3016
3016
  "async-trait",
3017
3017
  "napi",
@@ -3026,7 +3026,7 @@ dependencies = [
3026
3026
 
3027
3027
  [[package]]
3028
3028
  name = "statsig-pyo3"
3029
- version = "0.24.2-rc.4"
3029
+ version = "0.25.0"
3030
3030
  dependencies = [
3031
3031
  "async-trait",
3032
3032
  "lazy_static",
@@ -3041,7 +3041,7 @@ dependencies = [
3041
3041
 
3042
3042
  [[package]]
3043
3043
  name = "statsig_elixir"
3044
- version = "0.24.2-rc.4"
3044
+ version = "0.25.0"
3045
3045
  dependencies = [
3046
3046
  "async-trait",
3047
3047
  "oai-statsig-rust",
@@ -3054,7 +3054,7 @@ dependencies = [
3054
3054
 
3055
3055
  [[package]]
3056
3056
  name = "statsig_ffi"
3057
- version = "0.24.2-rc.4"
3057
+ version = "0.25.0"
3058
3058
  dependencies = [
3059
3059
  "async-trait",
3060
3060
  "cbindgen",
@@ -4,11 +4,17 @@ lto = true
4
4
  opt-level = "z"
5
5
  strip = true
6
6
 
7
+ # Keep native symbols in Python wheels so production profiles can resolve Rust
8
+ # frames while retaining the optimization settings used by release builds.
9
+ [profile.python-release]
10
+ inherits = "release"
11
+ debug = 1
12
+ strip = "none"
13
+
7
14
  [workspace]
8
15
  members = ["statsig-rust", "statsig-grpc", "statsig-pyo3"]
9
16
  resolver = "2"
10
17
  exclude = [
11
- "photon_rust",
12
18
  "examples/rust/sample-usage",
13
19
  "examples/rust/perf-monitor",
14
20
  "examples/rust/mem-bench",
@@ -20,7 +26,7 @@ exclude = [
20
26
  [workspace.package]
21
27
  edition = "2021"
22
28
  license = "ISC"
23
- version = "0.24.2-rc.4"
29
+ version = "0.25.0"
24
30
  homepage = "https://statsig.com/"
25
31
  authors = ["Statsig", "Daniel Loomb <daniel@statsig.com>"]
26
32
  readme = "README.md"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: oai_statsig_python_core
3
- Version: 0.24.2rc4
3
+ Version: 0.25.0
4
4
  Classifier: Programming Language :: Rust
5
5
  Classifier: Programming Language :: Python :: Implementation :: CPython
6
6
  Classifier: Programming Language :: Python :: Implementation :: PyPy
@@ -6,3 +6,4 @@ from statsig_python_core.data_store import *
6
6
  from statsig_python_core.persistent_storage import *
7
7
  from statsig_python_core.output_logger_provider import *
8
8
  from statsig_python_core.statsig_types import *
9
+ from statsig_python_core.evaluation_cache import EvaluationCache as EvaluationCache
@@ -0,0 +1,120 @@
1
+ import sys
2
+ from typing import Any
3
+
4
+
5
+ class _FrozenDict(dict):
6
+ """A JSON object that can be safely shared through ordinary Python APIs."""
7
+
8
+ __slots__ = ()
9
+
10
+ def __init__(self, *args, **kwargs):
11
+ if args or kwargs:
12
+ self._immutable()
13
+
14
+ def _immutable(self, *args, **kwargs):
15
+ raise TypeError("Statsig cached evaluation values are immutable")
16
+
17
+ __setitem__ = _immutable
18
+ __delitem__ = _immutable
19
+ __ior__ = _immutable
20
+ clear = _immutable
21
+ pop = _immutable
22
+ popitem = _immutable
23
+ setdefault = _immutable
24
+ update = _immutable
25
+
26
+ def __copy__(self):
27
+ return self
28
+
29
+ def __deepcopy__(self, memo):
30
+ return self
31
+
32
+ def __reduce_ex__(self, protocol):
33
+ return _restore_frozen_dict, (list(self.items()),)
34
+
35
+
36
+ class _FrozenList(list):
37
+ """A JSON array that can be safely shared through ordinary Python APIs."""
38
+
39
+ __slots__ = ()
40
+
41
+ def __init__(self, *args, **kwargs):
42
+ if args or kwargs:
43
+ self._immutable()
44
+
45
+ def _immutable(self, *args, **kwargs):
46
+ raise TypeError("Statsig cached evaluation values are immutable")
47
+
48
+ __setitem__ = _immutable
49
+ __delitem__ = _immutable
50
+ __iadd__ = _immutable
51
+ __imul__ = _immutable
52
+ append = _immutable
53
+ clear = _immutable
54
+ extend = _immutable
55
+ insert = _immutable
56
+ pop = _immutable
57
+ remove = _immutable
58
+ reverse = _immutable
59
+ sort = _immutable
60
+
61
+ def __copy__(self):
62
+ return self
63
+
64
+ def __deepcopy__(self, memo):
65
+ return self
66
+
67
+ def __reduce_ex__(self, protocol):
68
+ return _restore_frozen_list, (list(self),)
69
+
70
+
71
+ def _restore_frozen_dict(items: list[tuple[Any, Any]]) -> _FrozenDict:
72
+ frozen = _FrozenDict()
73
+ for key, value in items:
74
+ dict.__setitem__(frozen, key, value)
75
+ return frozen
76
+
77
+
78
+ def _restore_frozen_list(items: list[Any]) -> _FrozenList:
79
+ frozen = _FrozenList()
80
+ for item in items:
81
+ list.append(frozen, item)
82
+ return frozen
83
+
84
+
85
+ def _deep_freeze_and_measure(value: Any) -> tuple[Any, int]:
86
+ """Copy a JSON tree into read-only containers and measure retained bytes."""
87
+
88
+ seen_scalars: set[int] = set()
89
+
90
+ def freeze(item: Any) -> tuple[Any, int]:
91
+ if isinstance(item, dict):
92
+ frozen_dict = _FrozenDict()
93
+ size = 0
94
+ for key, child in item.items():
95
+ frozen_child, child_size = freeze(child)
96
+ dict.__setitem__(frozen_dict, key, frozen_child)
97
+ size += child_size
98
+
99
+ key_id = id(key)
100
+ if key_id not in seen_scalars:
101
+ seen_scalars.add(key_id)
102
+ size += sys.getsizeof(key)
103
+ return frozen_dict, size + sys.getsizeof(frozen_dict)
104
+
105
+ if isinstance(item, list):
106
+ frozen_list = _FrozenList()
107
+ size = 0
108
+ for child in item:
109
+ frozen_child, child_size = freeze(child)
110
+ list.append(frozen_list, frozen_child)
111
+ size += child_size
112
+ return frozen_list, size + sys.getsizeof(frozen_list)
113
+
114
+ item_id = id(item)
115
+ if item_id in seen_scalars:
116
+ return item, 0
117
+ seen_scalars.add(item_id)
118
+ return item, sys.getsizeof(item)
119
+
120
+ return freeze(value)
@@ -0,0 +1,349 @@
1
+ import math
2
+ import os
3
+ import sys
4
+ from collections import OrderedDict
5
+ from collections.abc import KeysView
6
+ from copy import deepcopy
7
+ from threading import RLock
8
+ from time import monotonic
9
+ from typing import Any, Optional
10
+ from weakref import WeakSet
11
+
12
+ from ._frozen_json import _FrozenDict, _deep_freeze_and_measure
13
+
14
+
15
+ _VALUE_CACHE_KEY_FIELD = "__statsig_dynamic_returnable_cache_key"
16
+ _VALUE_CACHE_HIT_FIELD = "__statsig_dynamic_returnable_cache_hit"
17
+ _CACHE_ENTRY_OVERHEAD_BYTES = 256
18
+
19
+
20
+ class _EvaluationCacheKeys(KeysView[int]):
21
+ """Live key view that retains only values observed as native cache hits."""
22
+
23
+ def __init__(self, cache: "EvaluationCache") -> None:
24
+ super().__init__(cache._values)
25
+ self._cache = cache
26
+ self._hit_values: dict[int, _FrozenDict] = {}
27
+
28
+ def __contains__(self, key: object) -> bool:
29
+ if isinstance(key, bool) or not isinstance(key, int):
30
+ return False
31
+
32
+ cache = self._cache
33
+ with cache._lock:
34
+ cache._evict_expired_locked()
35
+ value = cache._values.get(key)
36
+ if value is None or key not in cache._entries:
37
+ return False
38
+ self._hit_values[key] = value
39
+ return True
40
+
41
+ def _get_hit_value(self, key: int) -> Optional[_FrozenDict]:
42
+ return self._hit_values.get(key)
43
+
44
+
45
+ def _validate_positive_int(name: str, value: int) -> int:
46
+ if isinstance(value, bool) or not isinstance(value, int) or value <= 0:
47
+ raise ValueError(f"{name} must be a positive integer")
48
+ return value
49
+
50
+
51
+ def _validate_positive_float(name: str, value: float) -> float:
52
+ if isinstance(value, bool) or not isinstance(value, (int, float)):
53
+ raise ValueError(f"{name} must be a positive finite number")
54
+ result = float(value)
55
+ if not math.isfinite(result) or result <= 0:
56
+ raise ValueError(f"{name} must be a positive finite number")
57
+ return result
58
+
59
+
60
+ def _estimated_deep_size(value: Any, limit: int) -> int:
61
+ """Estimate retained bytes, stopping once the cacheable limit is exceeded."""
62
+
63
+ seen: set[int] = set()
64
+
65
+ def visit(item: Any) -> int:
66
+ item_id = id(item)
67
+ if item_id in seen:
68
+ return 0
69
+ seen.add(item_id)
70
+
71
+ size = sys.getsizeof(item)
72
+ if size > limit:
73
+ return size
74
+
75
+ if isinstance(item, dict):
76
+ for key, child in item.items():
77
+ size += visit(key)
78
+ if size > limit:
79
+ return size
80
+ size += visit(child)
81
+ if size > limit:
82
+ return size
83
+ elif isinstance(item, list):
84
+ for child in item:
85
+ size += visit(child)
86
+ if size > limit:
87
+ return size
88
+
89
+ return size
90
+
91
+ return visit(value)
92
+
93
+
94
+ class EvaluationCache:
95
+ """Bounded cache for immutable converted DynamicReturnable values.
96
+
97
+ Passing an instance through ``StatsigOptions(evaluation_cache=...)`` opts an
98
+ SDK instance into sharing immutable converted config, experiment, and layer
99
+ values across cache hits.
100
+ The byte budget is an estimate of retained Python object sizes and is backed
101
+ by independent entry-count, per-entry, and TTL limits.
102
+ Cache state is safe to share across concurrent SDK calls and instances.
103
+ """
104
+
105
+ def __init__(
106
+ self,
107
+ *,
108
+ max_bytes: int = 16 * 1024 * 1024,
109
+ max_entries: int = 1024,
110
+ max_entry_bytes: int = 1024 * 1024,
111
+ ttl_seconds: float = 300.0,
112
+ ) -> None:
113
+ self._max_bytes = _validate_positive_int("max_bytes", max_bytes)
114
+ self._max_entries = _validate_positive_int("max_entries", max_entries)
115
+ self._max_entry_bytes = _validate_positive_int(
116
+ "max_entry_bytes", max_entry_bytes
117
+ )
118
+ self._ttl_seconds = _validate_positive_float("ttl_seconds", ttl_seconds)
119
+
120
+ if self._max_entry_bytes > self._max_bytes:
121
+ raise ValueError("max_entry_bytes cannot exceed max_bytes")
122
+
123
+ self._lock = RLock()
124
+ self._values: dict[int, _FrozenDict] = {}
125
+ self._entries: OrderedDict[int, tuple[float, int]] = OrderedDict()
126
+ self._estimated_size_bytes = 0
127
+ self._hits = 0
128
+ self._misses = 0
129
+ self._evictions = 0
130
+ self._oversized_bypasses = 0
131
+ _EVALUATION_CACHES.add(self)
132
+
133
+ @property
134
+ def max_bytes(self) -> int:
135
+ return self._max_bytes
136
+
137
+ @property
138
+ def max_entries(self) -> int:
139
+ return self._max_entries
140
+
141
+ @property
142
+ def max_entry_bytes(self) -> int:
143
+ return self._max_entry_bytes
144
+
145
+ @property
146
+ def ttl_seconds(self) -> float:
147
+ return self._ttl_seconds
148
+
149
+ @property
150
+ def entry_count(self) -> int:
151
+ with self._lock:
152
+ return len(self._entries)
153
+
154
+ @property
155
+ def estimated_size_bytes(self) -> int:
156
+ with self._lock:
157
+ return self._estimated_size_bytes
158
+
159
+ @property
160
+ def hits(self) -> int:
161
+ with self._lock:
162
+ return self._hits
163
+
164
+ @property
165
+ def misses(self) -> int:
166
+ with self._lock:
167
+ return self._misses
168
+
169
+ @property
170
+ def evictions(self) -> int:
171
+ with self._lock:
172
+ return self._evictions
173
+
174
+ @property
175
+ def oversized_bypasses(self) -> int:
176
+ with self._lock:
177
+ return self._oversized_bypasses
178
+
179
+ def clear(self) -> None:
180
+ with self._lock:
181
+ self._values.clear()
182
+ self._entries.clear()
183
+ self._estimated_size_bytes = 0
184
+
185
+ def _values_for_call(self) -> dict[int, _FrozenDict]:
186
+ with self._lock:
187
+ self._evict_expired_locked()
188
+ return self._values
189
+
190
+ def _keys_for_call(self) -> _EvaluationCacheKeys:
191
+ with self._lock:
192
+ self._evict_expired_locked()
193
+ return _EvaluationCacheKeys(self)
194
+
195
+ def _consume_result(
196
+ self,
197
+ raw: dict,
198
+ call_keys: Optional[_EvaluationCacheKeys] = None,
199
+ ) -> None:
200
+ cache_key = raw.pop(_VALUE_CACHE_KEY_FIELD, None)
201
+ cache_hit = raw.pop(_VALUE_CACHE_HIT_FIELD, False)
202
+
203
+ if isinstance(cache_key, bool) or not isinstance(cache_key, int):
204
+ return
205
+
206
+ if cache_hit:
207
+ cached = call_keys._get_hit_value(cache_key) if call_keys else None
208
+ with self._lock:
209
+ if cached is None and cache_key in self._entries:
210
+ cached = self._values.get(cache_key)
211
+ if cached is not None and cache_key in self._entries:
212
+ self._touch_locked(cache_key)
213
+ if cached is not None:
214
+ self._hits += 1
215
+ if cached is not None:
216
+ raw["value"] = cached
217
+ return
218
+
219
+ with self._lock:
220
+ self._misses += 1
221
+ value = raw.get("value")
222
+ if not isinstance(value, dict):
223
+ return
224
+
225
+ graph_limit = max(0, self._max_entry_bytes - _CACHE_ENTRY_OVERHEAD_BYTES)
226
+ try:
227
+ if _estimated_deep_size(value, graph_limit) > graph_limit:
228
+ self._bypass_value(raw, value, cache_hit)
229
+ return
230
+
231
+ frozen_value, graph_size = _deep_freeze_and_measure(value)
232
+ except (MemoryError, RecursionError):
233
+ self._bypass_value(raw, value, cache_hit)
234
+ return
235
+
236
+ if not isinstance(frozen_value, _FrozenDict):
237
+ return
238
+
239
+ entry_size = graph_size + sys.getsizeof(cache_key) + _CACHE_ENTRY_OVERHEAD_BYTES
240
+ if entry_size > self._max_entry_bytes or entry_size > self._max_bytes:
241
+ self._bypass_value(raw, value, cache_hit)
242
+ return
243
+
244
+ with self._lock:
245
+ self._store_locked(cache_key, frozen_value, entry_size)
246
+ raw["value"] = frozen_value
247
+
248
+ def _bypass_value(self, raw: dict, value: dict, cache_hit: bool) -> None:
249
+ if cache_hit:
250
+ try:
251
+ raw["value"] = deepcopy(value)
252
+ except (MemoryError, RecursionError):
253
+ pass
254
+ self._record_oversized_bypass()
255
+
256
+ def _record_oversized_bypass(self) -> None:
257
+ with self._lock:
258
+ self._oversized_bypasses += 1
259
+
260
+ def _store_locked(self, key: int, value: _FrozenDict, entry_size: int) -> None:
261
+ self._remove_locked(key)
262
+
263
+ while self._entries and (
264
+ len(self._entries) >= self._max_entries
265
+ or self._estimated_size_bytes + entry_size > self._max_bytes
266
+ ):
267
+ self._evict_oldest_locked()
268
+
269
+ if (
270
+ len(self._entries) >= self._max_entries
271
+ or self._estimated_size_bytes + entry_size > self._max_bytes
272
+ ):
273
+ self._oversized_bypasses += 1
274
+ return
275
+
276
+ self._values[key] = value
277
+ self._entries[key] = (monotonic() + self._ttl_seconds, entry_size)
278
+ self._estimated_size_bytes += entry_size
279
+
280
+ def _touch_locked(self, key: int) -> None:
281
+ entry = self._entries.pop(key, None)
282
+ if entry is None:
283
+ self._values.pop(key, None)
284
+ return
285
+
286
+ _, entry_size = entry
287
+ self._entries[key] = (monotonic() + self._ttl_seconds, entry_size)
288
+
289
+ def _remove_locked(self, key: int) -> None:
290
+ entry = self._entries.pop(key, None)
291
+ self._values.pop(key, None)
292
+ if entry is not None:
293
+ self._estimated_size_bytes -= entry[1]
294
+
295
+ def _evict_oldest_locked(self) -> None:
296
+ key, (_, entry_size) = self._entries.popitem(last=False)
297
+ self._values.pop(key, None)
298
+ self._estimated_size_bytes -= entry_size
299
+ self._evictions += 1
300
+
301
+ def _evict_expired_locked(self) -> None:
302
+ now = monotonic()
303
+ while self._entries:
304
+ _, (expires_at, _) = next(iter(self._entries.items()))
305
+ if expires_at > now:
306
+ break
307
+ self._evict_oldest_locked()
308
+
309
+
310
+ _EVALUATION_CACHES: WeakSet[EvaluationCache] = WeakSet()
311
+ _FORK_LOCKED_EVALUATION_CACHES: list[EvaluationCache] = []
312
+
313
+
314
+ def _acquire_evaluation_cache_locks_before_fork() -> None:
315
+ _FORK_LOCKED_EVALUATION_CACHES.clear()
316
+ for cache in sorted(_EVALUATION_CACHES, key=id):
317
+ cache._lock.acquire()
318
+ _FORK_LOCKED_EVALUATION_CACHES.append(cache)
319
+
320
+
321
+ def _release_evaluation_cache_locks_after_fork() -> None:
322
+ while _FORK_LOCKED_EVALUATION_CACHES:
323
+ _FORK_LOCKED_EVALUATION_CACHES.pop()._lock.release()
324
+
325
+
326
+ def _reset_evaluation_cache_locks_after_fork() -> None:
327
+ for cache in _FORK_LOCKED_EVALUATION_CACHES:
328
+ cache._lock = RLock()
329
+ _FORK_LOCKED_EVALUATION_CACHES.clear()
330
+
331
+
332
+ if hasattr(os, "register_at_fork"):
333
+ os.register_at_fork(
334
+ before=_acquire_evaluation_cache_locks_before_fork,
335
+ after_in_parent=_release_evaluation_cache_locks_after_fork,
336
+ after_in_child=_reset_evaluation_cache_locks_after_fork,
337
+ )
338
+
339
+
340
+ def _get_evaluation_cache(options: Any) -> Optional[EvaluationCache]:
341
+ cache = getattr(options, "evaluation_cache", None) if options is not None else None
342
+ if cache is None:
343
+ return None
344
+ if not isinstance(cache, EvaluationCache):
345
+ raise TypeError("StatsigOptions.evaluation_cache must be an EvaluationCache")
346
+ return cache
347
+
348
+
349
+ __all__ = ["EvaluationCache"]