oai-statsig-python-core 0.25.0rc2__tar.gz → 0.25.0rc4__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 (388) hide show
  1. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/Cargo.lock +6 -6
  2. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/Cargo.toml +1 -2
  3. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/PKG-INFO +1 -1
  4. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/Cargo.toml +1 -1
  5. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/evaluation/evaluator_result.rs +16 -6
  6. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/gcir/gcir_process_iter.rs +52 -0
  7. oai_statsig_python_core-0.25.0rc4/statsig-rust/src/interned_values/__tests__/interned_store_mmap_fetch_tests.rs +257 -0
  8. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/interned_values/interned_store.rs +11 -0
  9. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/tests/gcir_tests.rs +124 -0
  10. oai_statsig_python_core-0.25.0rc2/statsig-rust/src/interned_values/__tests__/interned_store_mmap_fetch_tests.rs +0 -111
  11. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/py_src/statsig_python_core/__init__.py +0 -0
  12. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/py_src/statsig_python_core/data_store.py +0 -0
  13. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/py_src/statsig_python_core/error_boundary.py +0 -0
  14. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/py_src/statsig_python_core/event_logging_adapter.py +0 -0
  15. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/py_src/statsig_python_core/observability_client.py +0 -0
  16. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/py_src/statsig_python_core/output_logger_provider.py +0 -0
  17. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/py_src/statsig_python_core/persistent_storage.py +0 -0
  18. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/py_src/statsig_python_core/py.typed +0 -0
  19. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/py_src/statsig_python_core/requirements.txt +0 -0
  20. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/py_src/statsig_python_core/statsig.py +0 -0
  21. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/py_src/statsig_python_core/statsig_python_core.pyi +0 -0
  22. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/py_src/statsig_python_core/statsig_types.py +0 -0
  23. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/pyproject.toml +0 -0
  24. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-grpc/Cargo.toml +0 -0
  25. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-grpc/README.md +0 -0
  26. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-grpc/build.rs +0 -0
  27. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-grpc/src/lib.rs +0 -0
  28. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-grpc/src/mock_forward_proxy.rs +0 -0
  29. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-grpc/src/protos/statsig_forward_proxy.proto +0 -0
  30. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-grpc/src/statsig_forward_proxy.rs +0 -0
  31. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-grpc/src/statsig_grpc_client.rs +0 -0
  32. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-grpc/src/statsig_grpc_err.rs +0 -0
  33. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-pyo3/.github/workflows/CI.yml +0 -0
  34. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-pyo3/.gitignore +0 -0
  35. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-pyo3/Cargo.toml +0 -0
  36. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-pyo3/README.md +0 -0
  37. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-pyo3/benchmarks/user_creation_benchmark.py +0 -0
  38. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-pyo3/benchmarks/user_memory_benchmark.py +0 -0
  39. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-pyo3/src/bin/stub_gen.rs +0 -0
  40. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-pyo3/src/data_store_base_py.rs +0 -0
  41. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-pyo3/src/event_logging_adapter_base_py.rs +0 -0
  42. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-pyo3/src/interned_store_py.rs +0 -0
  43. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-pyo3/src/lib.rs +0 -0
  44. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-pyo3/src/observability_client_base_py.rs +0 -0
  45. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-pyo3/src/output_logger_provider_base_py.rs +0 -0
  46. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-pyo3/src/pyo_utils.rs +0 -0
  47. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-pyo3/src/raw_evaluation_compat_py.rs +0 -0
  48. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-pyo3/src/safe_gil.rs +0 -0
  49. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-pyo3/src/statsig_base_py.rs +0 -0
  50. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-pyo3/src/statsig_metadata_py.rs +0 -0
  51. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-pyo3/src/statsig_options_py.rs +0 -0
  52. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-pyo3/src/statsig_persistent_storage_override_adapter_py.rs +0 -0
  53. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-pyo3/src/statsig_types_py.rs +0 -0
  54. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-pyo3/src/statsig_user_py.rs +0 -0
  55. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-pyo3/src/unit_id_py.rs +0 -0
  56. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-pyo3/src/valid_primitives_py.rs +0 -0
  57. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-pyo3/tests/event_listener_reentrancy_subprocess.py +0 -0
  58. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-pyo3/tests/fork_runner.py +0 -0
  59. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-pyo3/tests/mock_output_logger.py +0 -0
  60. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-pyo3/tests/mock_scrapi.py +0 -0
  61. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-pyo3/tests/profile_util.py +0 -0
  62. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-pyo3/tests/shutdown_sub_proc.py +0 -0
  63. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-pyo3/tests/test_bulk_evaluate_gcir_parity.py +0 -0
  64. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-pyo3/tests/test_data_store.py +0 -0
  65. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-pyo3/tests/test_error_boundary.py +0 -0
  66. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-pyo3/tests/test_event_logging_adapter.py +0 -0
  67. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-pyo3/tests/test_experiment_serialization.py +0 -0
  68. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-pyo3/tests/test_exposure_logging.py +0 -0
  69. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-pyo3/tests/test_feature_gate_serialization.py +0 -0
  70. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-pyo3/tests/test_forking.py +0 -0
  71. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-pyo3/tests/test_get_dynamic_config.py +0 -0
  72. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-pyo3/tests/test_initialize_with_details.py +0 -0
  73. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-pyo3/tests/test_interned_store_preload.py +0 -0
  74. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-pyo3/tests/test_layer_param_exposure_sampling.py +0 -0
  75. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-pyo3/tests/test_layer_serialization.py +0 -0
  76. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-pyo3/tests/test_observability_client.py +0 -0
  77. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-pyo3/tests/test_output_logger_provider.py +0 -0
  78. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-pyo3/tests/test_override_adapter.py +0 -0
  79. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-pyo3/tests/test_performance.py +0 -0
  80. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-pyo3/tests/test_sdk_event_emitter.py +0 -0
  81. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-pyo3/tests/test_sec_expo_as_primary.py +0 -0
  82. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-pyo3/tests/test_shared_statsig.py +0 -0
  83. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-pyo3/tests/test_shutdown.py +0 -0
  84. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-pyo3/tests/test_statsig.py +0 -0
  85. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-pyo3/tests/test_statsig_options.py +0 -0
  86. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-pyo3/tests/test_statsig_user.py +0 -0
  87. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-pyo3/tests/test_statsig_user_json_serialization.py +0 -0
  88. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-pyo3/tests/test_statsig_user_none_fields.py +0 -0
  89. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-pyo3/tests/test_statsig_user_pickle.py +0 -0
  90. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-pyo3/tests/test_user_exposure_e2e.py +0 -0
  91. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-pyo3/tests/utils.py +0 -0
  92. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/build.rs +0 -0
  93. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/resources/ip_supalite.table +0 -0
  94. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/resources/ua_parser_regex.yaml +0 -0
  95. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/resources/ua_parser_regex_lite.yaml +0 -0
  96. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/__tests__/interned_string_tests.rs +0 -0
  97. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/__tests__/mod.rs +0 -0
  98. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/__tests__/spec_store_tests.rs +0 -0
  99. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/__tests__/statsig_options_tests.rs +0 -0
  100. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/__tests__/user_value_tests.rs +0 -0
  101. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/compression/compression_helper.rs +0 -0
  102. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/compression/mod.rs +0 -0
  103. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/console_capture/console_capture_handler.rs +0 -0
  104. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/console_capture/console_capture_instances.rs +0 -0
  105. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/console_capture/console_capture_options.rs +0 -0
  106. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/console_capture/console_log_line_levels.rs +0 -0
  107. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/console_capture/mod.rs +0 -0
  108. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/data_store_interface.rs +0 -0
  109. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/dcs_str.rs +0 -0
  110. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/evaluation/__tests__/dynamic_returnable_tests.rs +0 -0
  111. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/evaluation/__tests__/mod.rs +0 -0
  112. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/evaluation/__tests__/rkyv_value_tests.rs +0 -0
  113. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/evaluation/cmab_evaluator.rs +0 -0
  114. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/evaluation/comparisons/compare_arrays.rs +0 -0
  115. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/evaluation/comparisons/compare_numbers.rs +0 -0
  116. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/evaluation/comparisons/compare_str_with_regex.rs +0 -0
  117. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/evaluation/comparisons/compare_strings_in_array.rs +0 -0
  118. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/evaluation/comparisons/compare_time.rs +0 -0
  119. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/evaluation/comparisons/compare_versions.rs +0 -0
  120. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/evaluation/comparisons/mod.rs +0 -0
  121. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/evaluation/country_lookup.rs +0 -0
  122. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/evaluation/dynamic_returnable.rs +0 -0
  123. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/evaluation/dynamic_string.rs +0 -0
  124. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/evaluation/dynamic_value.rs +0 -0
  125. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/evaluation/evaluation_details.rs +0 -0
  126. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/evaluation/evaluation_types.rs +0 -0
  127. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/evaluation/evaluation_types_initialize_v2.rs +0 -0
  128. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/evaluation/evaluation_types_v2.rs +0 -0
  129. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/evaluation/evaluator.rs +0 -0
  130. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/evaluation/evaluator_context.rs +0 -0
  131. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/evaluation/evaluator_value.rs +0 -0
  132. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/evaluation/get_unit_id.rs +0 -0
  133. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/evaluation/mod.rs +0 -0
  134. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/evaluation/rkyv_value.rs +0 -0
  135. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/evaluation/secondary_exposure_key.rs +0 -0
  136. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/evaluation/user_agent_parsing/first_party_ua_parser.rs +0 -0
  137. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/evaluation/user_agent_parsing/mod.rs +0 -0
  138. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/evaluation/user_agent_parsing/statsig_uaparser/__tests__/mod.rs +0 -0
  139. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/evaluation/user_agent_parsing/statsig_uaparser/__tests__/test_helpers.rs +0 -0
  140. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/evaluation/user_agent_parsing/statsig_uaparser/__tests__/test_tokenizer.rs +0 -0
  141. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/evaluation/user_agent_parsing/statsig_uaparser/__tests__/test_ua_parser_browser.rs +0 -0
  142. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/evaluation/user_agent_parsing/statsig_uaparser/__tests__/test_ua_parser_os.rs +0 -0
  143. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/evaluation/user_agent_parsing/statsig_uaparser/mod.rs +0 -0
  144. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/evaluation/user_agent_parsing/statsig_uaparser/tokenizer.rs +0 -0
  145. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/evaluation/user_agent_parsing/statsig_uaparser/ua_parser.rs +0 -0
  146. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/evaluation/user_agent_parsing/statsig_uaparser/window_iter.rs +0 -0
  147. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/evaluation/user_agent_parsing/third_party_ua_parser.rs +0 -0
  148. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/evaluation/user_agent_parsing/ua_parser.rs +0 -0
  149. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/event_emitter/statsig_event_emitter_tests.rs +0 -0
  150. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/event_logging/delayed_exposure_store.rs +0 -0
  151. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/event_logging/event_logger.rs +0 -0
  152. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/event_logging/event_logger_constants.rs +0 -0
  153. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/event_logging/event_logger_ops_stats.rs +0 -0
  154. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/event_logging/event_queue/batch.rs +0 -0
  155. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/event_logging/event_queue/mod.rs +0 -0
  156. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/event_logging/event_queue/queue.rs +0 -0
  157. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/event_logging/event_queue/queued_config_expo.rs +0 -0
  158. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/event_logging/event_queue/queued_event.rs +0 -0
  159. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/event_logging/event_queue/queued_experiment_expo.rs +0 -0
  160. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/event_logging/event_queue/queued_expo.rs +0 -0
  161. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/event_logging/event_queue/queued_gate_expo.rs +0 -0
  162. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/event_logging/event_queue/queued_layer_param_expo.rs +0 -0
  163. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/event_logging/event_queue/queued_passthrough.rs +0 -0
  164. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/event_logging/event_queue/queued_secondary_expo.rs +0 -0
  165. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/event_logging/exposure_sampling.rs +0 -0
  166. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/event_logging/exposure_utils.rs +0 -0
  167. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/event_logging/flush_interval.rs +0 -0
  168. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/event_logging/flush_type.rs +0 -0
  169. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/event_logging/mod.rs +0 -0
  170. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/event_logging/sec_expo_as_primary_experiment.rs +0 -0
  171. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/event_logging/statsig_event.rs +0 -0
  172. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/event_logging/statsig_event_internal.rs +0 -0
  173. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/event_logging_adapter/event_logging_adapter_trait.rs +0 -0
  174. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/event_logging_adapter/log_event_payload.rs +0 -0
  175. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/event_logging_adapter/mod.rs +0 -0
  176. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/event_logging_adapter/statsig_http_event_logging_adapter.rs +0 -0
  177. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/event_logging_adapter/statsig_local_file_event_logging_adapter.rs +0 -0
  178. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/gcir/dynamic_configs_processor.rs +0 -0
  179. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/gcir/feature_gates_processor.rs +0 -0
  180. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/gcir/gcir_formatter.rs +0 -0
  181. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/gcir/gcir_options.rs +0 -0
  182. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/gcir/layer_configs_processor.rs +0 -0
  183. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/gcir/mod.rs +0 -0
  184. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/gcir/param_stores_processor.rs +0 -0
  185. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/gcir/stringify_sec_exposures.rs +0 -0
  186. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/gcir/target_app_id_utils.rs +0 -0
  187. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/global_configs.rs +0 -0
  188. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/hashing/ahash.rs +0 -0
  189. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/hashing/djb2.rs +0 -0
  190. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/hashing/hash_util.rs +0 -0
  191. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/hashing/memo_sha_256.rs +0 -0
  192. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/hashing/mod.rs +0 -0
  193. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/id_lists_adapter/id_list.rs +0 -0
  194. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/id_lists_adapter/id_lists_adapter_trait.rs +0 -0
  195. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/id_lists_adapter/mod.rs +0 -0
  196. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/id_lists_adapter/statsig_http_id_lists_adapter.rs +0 -0
  197. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/init_details.rs +0 -0
  198. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/initialize_evaluations_response.rs +0 -0
  199. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/initialize_response.rs +0 -0
  200. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/initialize_v2_response.rs +0 -0
  201. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/instance_registry.rs +0 -0
  202. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/interned_string.rs +0 -0
  203. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/interned_values/__tests__/fixtures/interned_store_v1.mmap +0 -0
  204. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/interned_values/__tests__/interned_store_eval_value_tests.rs +0 -0
  205. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/interned_values/__tests__/interned_store_returnable_tests.rs +0 -0
  206. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/interned_values/__tests__/interned_store_string_tests.rs +0 -0
  207. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/interned_values/__tests__/mod.rs +0 -0
  208. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/interned_values/mod.rs +0 -0
  209. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/lib.rs +0 -0
  210. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/logging_utils.rs +0 -0
  211. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/macros.rs +0 -0
  212. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/networking/__tests__/mod.rs +0 -0
  213. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/networking/__tests__/response_data_tests.rs +0 -0
  214. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/networking/http_types.rs +0 -0
  215. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/networking/mod.rs +0 -0
  216. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/networking/network_client.rs +0 -0
  217. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/networking/network_error.rs +0 -0
  218. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/networking/providers/mod.rs +0 -0
  219. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/networking/providers/net_provider_global.rs +0 -0
  220. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/networking/providers/net_provider_noop.rs +0 -0
  221. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/networking/providers/net_provider_reqwest.rs +0 -0
  222. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/networking/proxy_config.rs +0 -0
  223. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/observability/console_capture_observer.rs +0 -0
  224. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/observability/diagnostics_observer.rs +0 -0
  225. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/observability/mod.rs +0 -0
  226. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/observability/observability_client_adapter.rs +0 -0
  227. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/observability/ops_stats.rs +0 -0
  228. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/observability/sdk_errors_observer.rs +0 -0
  229. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/output_logger.rs +0 -0
  230. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/override_adapter/mod.rs +0 -0
  231. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/override_adapter/override_adapter_trait.rs +0 -0
  232. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/override_adapter/statsig_local_override_adapter.rs +0 -0
  233. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/persistent_storage/__tests__/mod.rs +0 -0
  234. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/persistent_storage/__tests__/sticky_values_serialization_tests.rs +0 -0
  235. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/persistent_storage/mod.rs +0 -0
  236. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/persistent_storage/persistent_storage_trait.rs +0 -0
  237. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/persistent_storage/persistent_values_manager.rs +0 -0
  238. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/sdk_diagnostics/diagnostics.rs +0 -0
  239. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/sdk_diagnostics/diagnostics_utils.rs +0 -0
  240. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/sdk_diagnostics/marker.rs +0 -0
  241. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/sdk_diagnostics/mod.rs +0 -0
  242. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/sdk_event_emitter/event_emitter.rs +0 -0
  243. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/sdk_event_emitter/event_emitter_tests.rs +0 -0
  244. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/sdk_event_emitter/event_types.rs +0 -0
  245. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/sdk_event_emitter/mod.rs +0 -0
  246. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/spec_store.rs +0 -0
  247. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/specs_adapter/config_spec_background_sync_metrics.rs +0 -0
  248. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/specs_adapter/mod.rs +0 -0
  249. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/specs_adapter/response_format.rs +0 -0
  250. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/specs_adapter/specs_adapter_trait.rs +0 -0
  251. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/specs_adapter/statsig_bootstrap_specs_adapter.rs +0 -0
  252. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/specs_adapter/statsig_customized_specs_adapter.rs +0 -0
  253. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/specs_adapter/statsig_data_store_specs_adapter.rs +0 -0
  254. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/specs_adapter/statsig_grpc_specs_adapter.rs +0 -0
  255. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/specs_adapter/statsig_http_specs_adapter.rs +0 -0
  256. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/specs_adapter/statsig_local_file_specs_adapter.rs +0 -0
  257. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/specs_response/__tests__/mod.rs +0 -0
  258. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/specs_response/__tests__/proto_specs_syncing_tests.rs +0 -0
  259. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/specs_response/__tests__/proto_specs_unknown_tests.rs +0 -0
  260. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/specs_response/__tests__/proto_specs_vs_json_tests.rs +0 -0
  261. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/specs_response/__tests__/proto_stream_reader_tests.rs +0 -0
  262. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/specs_response/cmab_types.rs +0 -0
  263. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/specs_response/explicit_params.rs +0 -0
  264. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/specs_response/mod.rs +0 -0
  265. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/specs_response/param_store_types.rs +0 -0
  266. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/specs_response/proto_specs.rs +0 -0
  267. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/specs_response/proto_stream_reader.rs +0 -0
  268. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/specs_response/spec_types.rs +0 -0
  269. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/specs_response/specs_hash_map.rs +0 -0
  270. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/specs_response/statsig_config_specs.rs +0 -0
  271. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/statsig.rs +0 -0
  272. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/statsig_core_api_options.rs +0 -0
  273. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/statsig_err.rs +0 -0
  274. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/statsig_global.rs +0 -0
  275. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/statsig_metadata.rs +0 -0
  276. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/statsig_options.rs +0 -0
  277. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/statsig_runtime.rs +0 -0
  278. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/statsig_type_factories.rs +0 -0
  279. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/statsig_types.rs +0 -0
  280. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/statsig_types_raw.rs +0 -0
  281. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/user/fast_statsig_user.rs +0 -0
  282. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/user/into_optional.rs +0 -0
  283. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/user/mod.rs +0 -0
  284. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/user/statsig_user.rs +0 -0
  285. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/user/statsig_user_builder.rs +0 -0
  286. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/user/statsig_user_internal.rs +0 -0
  287. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/user/statsig_user_loggable.rs +0 -0
  288. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/user/unit_id.rs +0 -0
  289. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/user/user_data.rs +0 -0
  290. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/user/user_value.rs +0 -0
  291. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/utils/mod.rs +0 -0
  292. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/src/value_parsing.rs +0 -0
  293. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/tests/check_gate_tests.rs +0 -0
  294. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/tests/customized_specs_adapter_tests.rs +0 -0
  295. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/tests/data/big_number_dcs.json +0 -0
  296. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/tests/data/check_gate_perf_dcs.json +0 -0
  297. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/tests/data/company_id_list +0 -0
  298. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/tests/data/dcs_error.json +0 -0
  299. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/tests/data/dcs_missing_gates.json +0 -0
  300. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/tests/data/dcs_non_case_sensitive.json +0 -0
  301. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/tests/data/dcs_user_agent_versions.json +0 -0
  302. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/tests/data/dcs_with_analytical_exposure_sampling.json +0 -0
  303. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/tests/data/dcs_with_checksum.json +0 -0
  304. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/tests/data/dcs_with_sampling.json +0 -0
  305. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/tests/data/dcs_with_sdk_configs.json +0 -0
  306. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/tests/data/demo_proj_dcs.json +0 -0
  307. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/tests/data/demo_proj_dcs.pb.br +0 -0
  308. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/tests/data/eval_proj_dcs.json +0 -0
  309. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/tests/data/eval_proj_dcs.pb.br +0 -0
  310. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/tests/data/get_id_lists.json +0 -0
  311. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/tests/data/perf_proj_dcs.json +0 -0
  312. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/tests/data/perf_proj_dcs.pb.br +0 -0
  313. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/tests/data/shared_dict_dict_only.json +0 -0
  314. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/tests/data/shared_dict_original_dcs.json +0 -0
  315. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/tests/data/shared_dict_response_uncompressed.json +0 -0
  316. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/tests/data/shared_dict_response_with_dict.json +0 -0
  317. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/tests/data/shared_dict_response_without_dict.json +0 -0
  318. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/tests/data/test_must_pass_user_agents.txt +0 -0
  319. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/tests/data/test_user_agents.txt +0 -0
  320. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/tests/data/ua_string_cases.json +0 -0
  321. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/tests/data/unknown_enum.pb.br +0 -0
  322. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/tests/data_store_bytes_adapter_tests.rs +0 -0
  323. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/tests/data_store_json_bytes_tests.rs +0 -0
  324. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/tests/data_store_json_only_no_bytes_methods_tests.rs +0 -0
  325. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/tests/data_store_lock_tests.rs +0 -0
  326. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/tests/data_store_proto_bytes_tests.rs +0 -0
  327. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/tests/delayed_exposure_bench.rs +0 -0
  328. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/tests/direct_gcir_tests.rs +0 -0
  329. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/tests/dynamic_string_tests.rs +0 -0
  330. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/tests/dynamic_value_tests.rs +0 -0
  331. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/tests/evaluation_details_tests.rs +0 -0
  332. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/tests/evaluator_value_tests.rs +0 -0
  333. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/tests/event_logger_failing_flush_tests.rs +0 -0
  334. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/tests/event_logger_flush_tests.rs +0 -0
  335. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/tests/event_logger_high_qps_tests.rs +0 -0
  336. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/tests/event_logger_usage_tests.rs +0 -0
  337. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/tests/expected_evaluation_tests.rs +0 -0
  338. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/tests/exposure_sampling_key_tests.rs +0 -0
  339. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/tests/exposure_tests.rs +0 -0
  340. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/tests/flushing_tests.rs +0 -0
  341. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/tests/gate_inversion_eval_tests.rs +0 -0
  342. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/tests/global_configs_test.rs +0 -0
  343. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/tests/grpc_specs_adapter_tests.rs +0 -0
  344. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/tests/hash_util_evaluation_hash_tests.rs +0 -0
  345. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/tests/http_specs_adapter_tests.rs +0 -0
  346. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/tests/initialize_timeout_test.rs +0 -0
  347. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/tests/instance_registry_tests.rs +0 -0
  348. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/tests/layer_serialization_tests.rs +0 -0
  349. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/tests/list_methods_tests.rs +0 -0
  350. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/tests/network_client_streaming_tests.rs +0 -0
  351. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/tests/network_client_tests.rs +0 -0
  352. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/tests/network_failure_tests.rs +0 -0
  353. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/tests/observability_client_usage_tests.rs +0 -0
  354. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/tests/output_logger_tests.rs +0 -0
  355. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/tests/override_adapter_tests.rs +0 -0
  356. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/tests/perf_tests.rs +0 -0
  357. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/tests/proto_specs_usage_tests.rs +0 -0
  358. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/tests/spec_store_lock_tests.rs +0 -0
  359. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/tests/spec_types_tests.rs +0 -0
  360. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/tests/statsig_disable_network_tests.rs +0 -0
  361. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/tests/statsig_environment_tests.rs +0 -0
  362. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/tests/statsig_event_emitter_usage_test.rs +0 -0
  363. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/tests/statsig_global_tests.rs +0 -0
  364. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/tests/statsig_local_file_event_logging_adapter_tests.rs +0 -0
  365. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/tests/statsig_local_file_specs_adapter_tests.rs +0 -0
  366. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/tests/statsig_options_tests.rs +0 -0
  367. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/tests/statsig_shared_tests.rs +0 -0
  368. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/tests/statsig_tests.rs +0 -0
  369. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/tests/statsig_user_builder_tests.rs +0 -0
  370. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/tests/statsig_user_field_accessor_tests.rs +0 -0
  371. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/tests/statsig_user_internal_tests.rs +0 -0
  372. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/tests/statsig_user_loggable_tests.rs +0 -0
  373. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/tests/statsig_user_tests.rs +0 -0
  374. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/tests/syncing_network_failure_tests.rs +0 -0
  375. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/tests/typed_getters_tests.rs +0 -0
  376. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/tests/ua_parser_util_test.rs +0 -0
  377. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/tests/user_agent_tests_first_party.rs +0 -0
  378. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/tests/user_json_tests.rs +0 -0
  379. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/tests/utils/env_var_guard.rs +0 -0
  380. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/tests/utils/helpers.rs +0 -0
  381. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/tests/utils/mock_data_store.rs +0 -0
  382. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/tests/utils/mock_event_logging_adapter.rs +0 -0
  383. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/tests/utils/mock_log_provider.rs +0 -0
  384. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/tests/utils/mock_observability_client.rs +0 -0
  385. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/tests/utils/mock_scrapi.rs +0 -0
  386. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/tests/utils/mock_specs_adapter.rs +0 -0
  387. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/statsig-rust/tests/utils/mock_specs_listener.rs +0 -0
  388. {oai_statsig_python_core-0.25.0rc2 → oai_statsig_python_core-0.25.0rc4}/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.25.0-rc.2"
1725
+ version = "0.25.0-rc.4"
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.25.0-rc.2"
1740
+ version = "0.25.0-rc.4"
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.25.0-rc.2"
3014
+ version = "0.25.0-rc.4"
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.25.0-rc.2"
3029
+ version = "0.25.0-rc.4"
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.25.0-rc.2"
3044
+ version = "0.25.0-rc.4"
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.25.0-rc.2"
3057
+ version = "0.25.0-rc.4"
3058
3058
  dependencies = [
3059
3059
  "async-trait",
3060
3060
  "cbindgen",
@@ -15,7 +15,6 @@ strip = "none"
15
15
  members = ["statsig-rust", "statsig-grpc", "statsig-pyo3"]
16
16
  resolver = "2"
17
17
  exclude = [
18
- "photon_rust",
19
18
  "examples/rust/sample-usage",
20
19
  "examples/rust/perf-monitor",
21
20
  "examples/rust/mem-bench",
@@ -27,7 +26,7 @@ exclude = [
27
26
  [workspace.package]
28
27
  edition = "2021"
29
28
  license = "ISC"
30
- version = "0.25.0-rc.2"
29
+ version = "0.25.0-rc.4"
31
30
  homepage = "https://statsig.com/"
32
31
  authors = ["Statsig", "Daniel Loomb <daniel@statsig.com>"]
33
32
  readme = "README.md"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: oai_statsig_python_core
3
- Version: 0.25.0rc2
3
+ Version: 0.25.0rc4
4
4
  Classifier: Programming Language :: Rust
5
5
  Classifier: Programming Language :: Python :: Implementation :: CPython
6
6
  Classifier: Programming Language :: Python :: Implementation :: PyPy
@@ -43,7 +43,7 @@ serde_json = { version = "1.0.143", features = [
43
43
  ] }
44
44
  serde_with = "3.4.0"
45
45
  sha2 = "0.10.8"
46
- oai-statsig-grpc = { path = "../statsig-grpc", version = "0.25.0-rc.2", optional = true }
46
+ oai-statsig-grpc = { path = "../statsig-grpc", version = "0.25.0-rc.4", optional = true }
47
47
  simple_logger = { version = "5.0.0" }
48
48
  tempfile = "3.8.1"
49
49
  tokio = { version = "1.39.1", features = ["full"] }
@@ -28,6 +28,8 @@ use crate::statsig_types_raw::{
28
28
  use crate::user::StatsigUserInternal;
29
29
  use crate::{EvaluationDetails, LayerEvaluationOptions};
30
30
 
31
+ const LAUNCHED_GROUP_RULE_ID: &str = "launchedGroup";
32
+
31
33
  #[derive(Default, Debug)]
32
34
  pub struct EvaluatorResult {
33
35
  pub name: Option<InternedString>,
@@ -54,6 +56,14 @@ pub struct EvaluatorResult {
54
56
  pub parameter_rule_ids: Option<HashMap<InternedString, InternedString>>,
55
57
  }
56
58
 
59
+ fn get_is_user_in_experiment(result: &EvaluatorResult) -> bool {
60
+ result.is_experiment_group
61
+ && result
62
+ .rule_id
63
+ .as_ref()
64
+ .is_none_or(|rule_id| rule_id.as_str() != LAUNCHED_GROUP_RULE_ID)
65
+ }
66
+
57
67
  pub fn result_to_gate_raw<'a>(
58
68
  gate_name: &'a str,
59
69
  eval_details: &'a EvaluationDetails,
@@ -163,7 +173,7 @@ pub fn result_to_experiment_eval(
163
173
 
164
174
  if spec_entity.is_none_or(|s| s == "experiment") {
165
175
  is_experiment_active = Some(result.is_experiment_active);
166
- is_user_in_experiment = Some(result.is_experiment_group);
176
+ is_user_in_experiment = Some(get_is_user_in_experiment(result));
167
177
  }
168
178
 
169
179
  ExperimentEvaluation {
@@ -196,7 +206,7 @@ pub fn result_to_experiment_eval_v2(
196
206
  if let Some(spec_entity) = spec_entity {
197
207
  if spec_entity == "experiment" {
198
208
  is_experiment_active = Some(result.is_experiment_active);
199
- is_user_in_experiment = Some(result.is_experiment_group);
209
+ is_user_in_experiment = Some(get_is_user_in_experiment(result));
200
210
  }
201
211
  }
202
212
 
@@ -232,7 +242,7 @@ pub fn result_to_experiment_eval_init_v2(
232
242
  if let Some(spec_entity) = spec_entity {
233
243
  if spec_entity == "experiment" {
234
244
  is_experiment_active = Some(result.is_experiment_active);
235
- is_user_in_experiment = Some(result.is_experiment_group);
245
+ is_user_in_experiment = Some(get_is_user_in_experiment(result));
236
246
  }
237
247
  }
238
248
 
@@ -308,7 +318,7 @@ pub fn result_to_layer_eval(layer_name: &str, result: &mut EvaluatorResult) -> L
308
318
  if !config_delegate.is_empty() {
309
319
  allocated_experiment_name = Some(config_delegate.clone());
310
320
  is_experiment_active = Some(result.is_experiment_active);
311
- is_user_in_experiment = Some(result.is_experiment_group);
321
+ is_user_in_experiment = Some(get_is_user_in_experiment(result));
312
322
  }
313
323
  }
314
324
 
@@ -358,7 +368,7 @@ pub fn result_to_layer_eval_v2(
358
368
  if !config_delegate.is_empty() {
359
369
  allocated_experiment_name = Some(config_delegate.clone());
360
370
  is_experiment_active = Some(result.is_experiment_active);
361
- is_user_in_experiment = Some(result.is_experiment_group);
371
+ is_user_in_experiment = Some(get_is_user_in_experiment(result));
362
372
  }
363
373
  }
364
374
 
@@ -395,7 +405,7 @@ pub fn result_to_layer_eval_init_v2(
395
405
  if !config_delegate.is_empty() {
396
406
  allocated_experiment_name = Some(config_delegate.clone());
397
407
  is_experiment_active = Some(result.is_experiment_active);
398
- is_user_in_experiment = Some(result.is_experiment_group);
408
+ is_user_in_experiment = Some(get_is_user_in_experiment(result));
399
409
  }
400
410
  }
401
411
 
@@ -23,6 +23,7 @@ pub(crate) fn gcir_process_iter<T: GCIRHashable>(
23
23
  ) -> Result<HashMap<String, T>, StatsigErr> {
24
24
  let mut results = HashMap::new();
25
25
  let mut hashes = Vec::new();
26
+ let pipeline_override_names = get_pipeline_override_names(context);
26
27
  let mut keys = specs_map.keys().cloned().collect::<Vec<_>>();
27
28
  if options.previous_response_hash.is_some() {
28
29
  keys.sort_by(|a, b| a.as_str().cmp(b.as_str()));
@@ -37,6 +38,10 @@ pub(crate) fn gcir_process_iter<T: GCIRHashable>(
37
38
  continue;
38
39
  }
39
40
 
41
+ if pipeline_override_names.contains(&name) {
42
+ continue;
43
+ }
44
+
40
45
  if should_filter_entity(spec, name.as_str(), options) {
41
46
  continue;
42
47
  }
@@ -91,6 +96,28 @@ pub(crate) fn gcir_process_iter<T: GCIRHashable>(
91
96
  Ok(results)
92
97
  }
93
98
 
99
+ fn get_pipeline_override_names(context: &EvaluatorContext) -> HashSet<InternedString> {
100
+ context
101
+ .specs_data
102
+ .overrides
103
+ .as_ref()
104
+ .map(get_pipeline_override_names_from_mappings)
105
+ .unwrap_or_default()
106
+ }
107
+
108
+ fn get_pipeline_override_names_from_mappings(
109
+ overrides: &HashMap<String, Vec<crate::specs_response::spec_types::ConfigMapping>>,
110
+ ) -> HashSet<InternedString> {
111
+ overrides
112
+ .values()
113
+ .flat_map(|mappings| {
114
+ mappings
115
+ .iter()
116
+ .map(|mapping| mapping.new_config_name.clone())
117
+ })
118
+ .collect()
119
+ }
120
+
94
121
  fn should_filter_entity(spec: &Spec, name: &str, options: &ClientInitResponseOptions) -> bool {
95
122
  match spec.entity.as_str() {
96
123
  "feature_gate" => options
@@ -166,3 +193,28 @@ pub fn hash_secondary_exposures(
166
193
  );
167
194
  }
168
195
  }
196
+
197
+ #[cfg(test)]
198
+ mod tests {
199
+ use super::*;
200
+ use crate::specs_response::spec_types::{ConfigMapping, OverrideRule};
201
+
202
+ #[test]
203
+ fn filters_only_names_from_pipeline_override_mappings() {
204
+ let override_names = get_pipeline_override_names_from_mappings(&HashMap::from([(
205
+ "base_config".to_string(),
206
+ vec![ConfigMapping {
207
+ new_config_name: InternedString::from_str_ref("base_config::trigger_id"),
208
+ rules: vec![OverrideRule {
209
+ rule_name: "phase_rule".to_string(),
210
+ start_time: Some(0),
211
+ }],
212
+ }],
213
+ )]));
214
+
215
+ assert!(override_names.contains(&InternedString::from_str_ref("base_config::trigger_id")));
216
+ assert!(!override_names.contains(&InternedString::from_str_ref(
217
+ "manual_config::not_a_pipeline_override"
218
+ )));
219
+ }
220
+ }
@@ -0,0 +1,257 @@
1
+ use crate::{
2
+ evaluation::rkyv_value::ArchivedRkyvValue,
3
+ hashing,
4
+ interned_values::{
5
+ interned_store::{mmap_path_for_sdk_key, ArchivedMmapDataV1, MmapDataV1},
6
+ InternedStore,
7
+ },
8
+ StatsigErr,
9
+ };
10
+ use memmap2::Mmap;
11
+ #[cfg(unix)]
12
+ use std::os::unix::fs::PermissionsExt;
13
+ #[cfg(target_os = "linux")]
14
+ use std::os::unix::{fs::MetadataExt, process::CommandExt};
15
+ use std::{fs, fs::File, io::Read};
16
+ use wiremock::{
17
+ matchers::{method, path},
18
+ Mock, MockServer, ResponseTemplate,
19
+ };
20
+
21
+ const MMAP_FETCH_SDK_KEY: &str = "interned-store-fetch-mmap";
22
+ const MMAP_REPLACE_SDK_KEY: &str = "interned-store-replace-mmap";
23
+ #[cfg(target_os = "linux")]
24
+ const MMAP_CROSS_UID_SDK_KEY: &str = "interned-store-cross-uid-mmap";
25
+ #[cfg(target_os = "linux")]
26
+ const CROSS_UID_TEST_NAME: &str = "interned_values::__tests__::interned_store_mmap_fetch_tests::uid_10001_can_preload_artifact_written_by_uid_1000";
27
+ const OTHER_MMAP_FETCH_SDK_KEY: &str = "interned-store-fetch-mmap-other";
28
+ const EVAL_PROJ_JSON: &str = include_str!("../../../tests/data/eval_proj_dcs.json");
29
+ const V1_COMPATIBILITY_FIXTURE: &[u8] = include_bytes!("fixtures/interned_store_v1.mmap");
30
+
31
+ #[test]
32
+ fn v1_compatibility_fixture_remains_readable() {
33
+ let mut fixture = rkyv::util::AlignedVec::<8>::new();
34
+ fixture.extend_from_slice(V1_COMPATIBILITY_FIXTURE);
35
+ let archived = rkyv::access::<ArchivedMmapDataV1, rkyv::rancor::Error>(&fixture).unwrap();
36
+
37
+ assert_eq!(archived.format_version(), MmapDataV1::FORMAT_VERSION);
38
+ assert_eq!(archived.string_for_test(7), Some("v1-string"));
39
+ assert!(matches!(
40
+ archived.returnable_for_test(11, "enabled"),
41
+ Some(ArchivedRkyvValue::Bool(true))
42
+ ));
43
+ }
44
+
45
+ #[tokio::test]
46
+ async fn fetch_and_write_mmap_uses_authoritative_sdk_key_path() {
47
+ let server = MockServer::start().await;
48
+ Mock::given(method("GET"))
49
+ .and(path(format!(
50
+ "/v2/download_config_specs/{MMAP_FETCH_SDK_KEY}.json"
51
+ )))
52
+ .respond_with(
53
+ ResponseTemplate::new(200)
54
+ .insert_header("content-type", "application/json")
55
+ .set_body_string(EVAL_PROJ_JSON),
56
+ )
57
+ .mount(&server)
58
+ .await;
59
+
60
+ InternedStore::fetch_and_write_mmap_with_specs_url(
61
+ MMAP_FETCH_SDK_KEY,
62
+ &format!("{}/v2/download_config_specs", server.uri()),
63
+ )
64
+ .await
65
+ .unwrap();
66
+
67
+ let path = mmap_path_for_sdk_key(MMAP_FETCH_SDK_KEY);
68
+ let expected_filename = format!(
69
+ "{}_v1_interned_store.mmap",
70
+ hashing::djb2(MMAP_FETCH_SDK_KEY)
71
+ );
72
+ assert!(path.exists());
73
+ assert_eq!(
74
+ path.file_name().and_then(|name| name.to_str()),
75
+ Some(expected_filename.as_str())
76
+ );
77
+
78
+ let file = File::open(&path).unwrap();
79
+ let mmap = unsafe { Mmap::map(&file).unwrap() };
80
+ let archived = rkyv::access::<ArchivedMmapDataV1, rkyv::rancor::Error>(&mmap).unwrap();
81
+ assert_eq!(archived.format_version(), MmapDataV1::FORMAT_VERSION);
82
+
83
+ #[cfg(unix)]
84
+ assert_eq!(
85
+ fs::metadata(&path).unwrap().permissions().mode() & 0o777,
86
+ 0o644
87
+ );
88
+ }
89
+
90
+ #[cfg(unix)]
91
+ #[tokio::test]
92
+ async fn fetch_and_write_mmap_atomically_replaces_existing_artifact() {
93
+ let server = MockServer::start().await;
94
+ Mock::given(method("GET"))
95
+ .and(path(format!(
96
+ "/v2/download_config_specs/{MMAP_REPLACE_SDK_KEY}.json"
97
+ )))
98
+ .respond_with(
99
+ ResponseTemplate::new(200)
100
+ .insert_header("content-type", "application/json")
101
+ .set_body_string(EVAL_PROJ_JSON),
102
+ )
103
+ .mount(&server)
104
+ .await;
105
+
106
+ let path = mmap_path_for_sdk_key(MMAP_REPLACE_SDK_KEY);
107
+ fs::create_dir_all(path.parent().unwrap()).unwrap();
108
+ fs::write(&path, b"previous artifact").unwrap();
109
+ let mut previous_artifact = File::open(&path).unwrap();
110
+
111
+ InternedStore::fetch_and_write_mmap_with_specs_url(
112
+ MMAP_REPLACE_SDK_KEY,
113
+ &format!("{}/v2/download_config_specs", server.uri()),
114
+ )
115
+ .await
116
+ .unwrap();
117
+
118
+ let mut previous_contents = Vec::new();
119
+ previous_artifact
120
+ .read_to_end(&mut previous_contents)
121
+ .unwrap();
122
+ assert_eq!(previous_contents, b"previous artifact");
123
+
124
+ let published = fs::read(&path).unwrap();
125
+ assert_ne!(published, b"previous artifact");
126
+ rkyv::access::<ArchivedMmapDataV1, rkyv::rancor::Error>(&published).unwrap();
127
+ assert_eq!(
128
+ fs::metadata(path).unwrap().permissions().mode() & 0o777,
129
+ 0o644
130
+ );
131
+ }
132
+
133
+ #[cfg(target_os = "linux")]
134
+ #[tokio::test(flavor = "multi_thread", worker_threads = 2)]
135
+ #[ignore = "requires root to run writer and reader subprocesses with distinct UIDs"]
136
+ async fn uid_10001_can_preload_artifact_written_by_uid_1000() {
137
+ match std::env::var("STATSIG_CROSS_UID_ROLE").as_deref() {
138
+ Ok("writer") => {
139
+ InternedStore::fetch_and_write_mmap_with_specs_url(
140
+ MMAP_CROSS_UID_SDK_KEY,
141
+ &std::env::var("STATSIG_CROSS_UID_SPECS_URL").unwrap(),
142
+ )
143
+ .await
144
+ .unwrap();
145
+ return;
146
+ }
147
+ Ok("reader") => {
148
+ InternedStore::preload_mmap(MMAP_CROSS_UID_SDK_KEY).unwrap();
149
+ return;
150
+ }
151
+ Ok(role) => panic!("unexpected cross-UID test role {role}"),
152
+ Err(_) => {}
153
+ }
154
+
155
+ assert_eq!(
156
+ unsafe { libc::geteuid() },
157
+ 0,
158
+ "cross-UID integration test must run as root"
159
+ );
160
+
161
+ let shared_mount = tempfile::tempdir().unwrap();
162
+ fs::set_permissions(shared_mount.path(), fs::Permissions::from_mode(0o755)).unwrap();
163
+ let mount_path_bytes = std::os::unix::ffi::OsStrExt::as_bytes(shared_mount.path().as_os_str());
164
+ let mount_path_c_string = std::ffi::CString::new(mount_path_bytes).unwrap();
165
+ assert_eq!(
166
+ unsafe { libc::chown(mount_path_c_string.as_ptr(), 1000, 1000) },
167
+ 0
168
+ );
169
+
170
+ let cross_uid_test_binary = shared_mount.path().join("cross_uid_test");
171
+ fs::copy(std::env::current_exe().unwrap(), &cross_uid_test_binary).unwrap();
172
+ fs::set_permissions(&cross_uid_test_binary, fs::Permissions::from_mode(0o755)).unwrap();
173
+
174
+ let server = MockServer::start().await;
175
+ Mock::given(method("GET"))
176
+ .and(path(format!(
177
+ "/v2/download_config_specs/{MMAP_CROSS_UID_SDK_KEY}.json"
178
+ )))
179
+ .respond_with(
180
+ ResponseTemplate::new(200)
181
+ .insert_header("content-type", "application/json")
182
+ .set_body_string(EVAL_PROJ_JSON),
183
+ )
184
+ .mount(&server)
185
+ .await;
186
+
187
+ let run_as = |role: &str, uid: u32| {
188
+ std::process::Command::new(&cross_uid_test_binary)
189
+ .arg("--ignored")
190
+ .arg("--exact")
191
+ .arg(CROSS_UID_TEST_NAME)
192
+ .arg("--nocapture")
193
+ .env("STATSIG_CROSS_UID_ROLE", role)
194
+ .env(
195
+ "STATSIG_CROSS_UID_SPECS_URL",
196
+ format!("{}/v2/download_config_specs", server.uri()),
197
+ )
198
+ .env("TMPDIR", shared_mount.path())
199
+ .uid(uid)
200
+ .gid(uid)
201
+ .status()
202
+ .unwrap()
203
+ };
204
+
205
+ assert!(run_as("writer", 1000).success());
206
+
207
+ let artifact_path = shared_mount
208
+ .path()
209
+ .join("statsig-interned-store")
210
+ .join(format!(
211
+ "{}_v1_interned_store.mmap",
212
+ hashing::djb2(MMAP_CROSS_UID_SDK_KEY)
213
+ ));
214
+ let metadata = fs::metadata(&artifact_path).unwrap();
215
+ assert_eq!(metadata.uid(), 1000);
216
+ assert_eq!(metadata.permissions().mode() & 0o777, 0o644);
217
+
218
+ assert!(run_as("reader", 10001).success());
219
+ }
220
+
221
+ #[test]
222
+ fn mmap_paths_are_scoped_by_sdk_key() {
223
+ assert_ne!(
224
+ mmap_path_for_sdk_key(MMAP_FETCH_SDK_KEY),
225
+ mmap_path_for_sdk_key(OTHER_MMAP_FETCH_SDK_KEY)
226
+ );
227
+ }
228
+
229
+ #[test]
230
+ fn preload_mmap_rejects_malformed_archive() {
231
+ let sdk_key = "interned-store-malformed-mmap";
232
+ let path = mmap_path_for_sdk_key(sdk_key);
233
+ fs::create_dir_all(path.parent().unwrap()).unwrap();
234
+ fs::write(&path, b"not an rkyv archive").unwrap();
235
+
236
+ assert!(matches!(
237
+ InternedStore::preload_mmap(sdk_key),
238
+ Err(StatsigErr::SerializationError(_))
239
+ ));
240
+ }
241
+
242
+ #[test]
243
+ fn preload_mmap_rejects_unsupported_format_version() {
244
+ let sdk_key = "interned-store-unsupported-version-mmap";
245
+ let path = mmap_path_for_sdk_key(sdk_key);
246
+ fs::create_dir_all(path.parent().unwrap()).unwrap();
247
+
248
+ let mmap_data = MmapDataV1::empty_with_format_version(2);
249
+ let archived = rkyv::to_bytes::<rkyv::rancor::Error>(&mmap_data).unwrap();
250
+ fs::write(&path, archived).unwrap();
251
+
252
+ assert!(matches!(
253
+ InternedStore::preload_mmap(sdk_key),
254
+ Err(StatsigErr::SerializationError(message))
255
+ if message == "Unsupported interned mmap format version 2; expected 1"
256
+ ));
257
+ }
@@ -8,6 +8,9 @@ use std::{
8
8
  time::{Duration, Instant},
9
9
  };
10
10
 
11
+ #[cfg(unix)]
12
+ use std::os::unix::fs::PermissionsExt;
13
+
11
14
  use ahash::AHashMap;
12
15
  use lazy_static::lazy_static;
13
16
  use memmap2::Mmap;
@@ -176,6 +179,10 @@ impl InternedStore {
176
179
  Ok(())
177
180
  }
178
181
 
182
+ /// Publishes an mmap artifact selected by `sdk_key`.
183
+ ///
184
+ /// On Unix, the finalized artifact is atomically published with mode `0644`
185
+ /// so readers with unrelated UIDs can consume a read-only shared mount.
179
186
  pub async fn fetch_and_write_mmap(sdk_key: &str) -> Result<(), StatsigErr> {
180
187
  Self::fetch_and_write_mmap_with_options(sdk_key, None).await
181
188
  }
@@ -231,6 +238,10 @@ fn write_mmap_specs(
231
238
 
232
239
  file.write_all(&archived)
233
240
  .map_err(|e| StatsigErr::FileError(e.to_string()))?;
241
+ #[cfg(unix)]
242
+ file.as_file()
243
+ .set_permissions(std::fs::Permissions::from_mode(0o644))
244
+ .map_err(|e| StatsigErr::FileError(e.to_string()))?;
234
245
  file.as_file()
235
246
  .sync_all()
236
247
  .map_err(|e| StatsigErr::FileError(e.to_string()))?;
@@ -119,6 +119,88 @@ fn eval_proj_dcs_with_nullable_versions() -> String {
119
119
  serde_json::to_string(&json).expect("Unable to serialize fixture")
120
120
  }
121
121
 
122
+ fn eval_proj_dcs_with_launched_group_marked_experiment_group() -> String {
123
+ let mut path = PathBuf::from(env!("CARGO_MANIFEST_DIR"));
124
+ path.push("tests/data/eval_proj_dcs.json");
125
+
126
+ let data = fs::read_to_string(path).expect("Unable to read fixture");
127
+ let mut json: Value = serde_json::from_str(&data).expect("Unable to parse fixture");
128
+
129
+ json.get_mut("dynamic_configs")
130
+ .unwrap()
131
+ .get_mut("test_decision_made")
132
+ .unwrap()
133
+ .get_mut("rules")
134
+ .unwrap()
135
+ .as_array_mut()
136
+ .unwrap()[0]
137
+ .as_object_mut()
138
+ .unwrap()
139
+ .insert("isExperimentGroup".to_string(), json!(true));
140
+
141
+ serde_json::to_string(&json).expect("Unable to serialize fixture")
142
+ }
143
+
144
+ fn eval_proj_dcs_with_pipeline_override() -> String {
145
+ let mut path = PathBuf::from(env!("CARGO_MANIFEST_DIR"));
146
+ path.push("tests/data/eval_proj_dcs.json");
147
+
148
+ let data = fs::read_to_string(path).expect("Unable to read fixture");
149
+ let mut json: Value = serde_json::from_str(&data).expect("Unable to parse fixture");
150
+
151
+ let synthetic_name = "test_custom_config::pipeline_trigger";
152
+ let mut synthetic_config = json
153
+ .get("dynamic_configs")
154
+ .unwrap()
155
+ .get("test_custom_config")
156
+ .unwrap()
157
+ .clone();
158
+ synthetic_config["defaultValue"] = json!({
159
+ "header_text": "pipeline override"
160
+ });
161
+ synthetic_config["rules"] = json!([]);
162
+ synthetic_config["version"] = json!(999);
163
+
164
+ json.get_mut("dynamic_configs")
165
+ .unwrap()
166
+ .as_object_mut()
167
+ .unwrap()
168
+ .insert(synthetic_name.to_string(), synthetic_config);
169
+
170
+ json.as_object_mut().unwrap().insert(
171
+ "override_rules".to_string(),
172
+ json!({
173
+ "statsig::everyone": {
174
+ "name": "statsig::everyone",
175
+ "passPercentage": 100,
176
+ "conditions": ["1828919350"],
177
+ "returnValue": true,
178
+ "id": "statsig::everyone",
179
+ "salt": "statsig::everyone",
180
+ "idType": "userID"
181
+ }
182
+ }),
183
+ );
184
+ json.as_object_mut().unwrap().insert(
185
+ "overrides".to_string(),
186
+ json!({
187
+ "test_custom_config": [
188
+ {
189
+ "new_config_name": synthetic_name,
190
+ "rules": [
191
+ {
192
+ "rule_name": "statsig::everyone",
193
+ "start_time": 0
194
+ }
195
+ ]
196
+ }
197
+ ]
198
+ }),
199
+ );
200
+
201
+ serde_json::to_string(&json).expect("Unable to serialize fixture")
202
+ }
203
+
122
204
  #[tokio::test]
123
205
  async fn test_feature_gate_filter() {
124
206
  let response_options = ClientInitResponseOptions {
@@ -171,6 +253,48 @@ async fn test_nullable_config_versions() {
171
253
  assert!(layer.get("version").unwrap().is_null());
172
254
  }
173
255
 
256
+ #[tokio::test]
257
+ async fn test_launched_group_is_not_user_in_experiment() {
258
+ let json_obj = setup_with_specs_data(
259
+ eval_proj_dcs_with_launched_group_marked_experiment_group(),
260
+ HashAlgorithm::None,
261
+ )
262
+ .await;
263
+
264
+ let experiment = json_obj
265
+ .get("dynamic_configs")
266
+ .unwrap()
267
+ .get("test_decision_made")
268
+ .unwrap();
269
+
270
+ assert_eq!(experiment.get("rule_id").unwrap(), "launchedGroup");
271
+ assert_eq!(experiment.get("is_user_in_experiment").unwrap(), false);
272
+ }
273
+
274
+ #[tokio::test]
275
+ async fn test_pipeline_override_specs_are_not_returned_in_initialize() {
276
+ let json_obj =
277
+ setup_with_specs_data(eval_proj_dcs_with_pipeline_override(), HashAlgorithm::None).await;
278
+
279
+ let configs = json_obj
280
+ .get("dynamic_configs")
281
+ .unwrap()
282
+ .as_object()
283
+ .unwrap();
284
+ assert!(configs.contains_key("test_custom_config"));
285
+ assert!(!configs.contains_key("test_custom_config::pipeline_trigger"));
286
+ assert_json_eq!(
287
+ configs
288
+ .get("test_custom_config")
289
+ .unwrap()
290
+ .get("value")
291
+ .unwrap(),
292
+ &json!({
293
+ "header_text": "pipeline override"
294
+ })
295
+ );
296
+ }
297
+
174
298
  #[tokio::test]
175
299
  async fn test_public_gate() {
176
300
  let json_obj = setup(HashAlgorithm::None).await;