statsig-python-core 0.15.1rc2601270136__tar.gz → 0.15.2rc2602030138__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 (359) hide show
  1. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/Cargo.lock +6 -6
  2. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/Cargo.toml +1 -1
  3. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/PKG-INFO +1 -1
  4. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/Cargo.toml +1 -1
  5. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/src/evaluation/cmab_evaluator.rs +8 -6
  6. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/src/evaluation/comparisons/compare_str_with_regex.rs +17 -6
  7. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/src/evaluation/evaluator.rs +22 -3
  8. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/src/evaluation/evaluator_context.rs +4 -3
  9. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/src/event_logging/event_logger.rs +8 -3
  10. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/src/gcir/param_stores_processor.rs +13 -3
  11. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/src/id_lists_adapter/id_lists_adapter_trait.rs +1 -0
  12. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/src/id_lists_adapter/statsig_http_id_lists_adapter.rs +141 -43
  13. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/src/override_adapter/statsig_local_override_adapter.rs +1 -0
  14. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/src/spec_store.rs +8 -2
  15. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/src/specs_response/__tests__/proto_specs_vs_json_tests.rs +28 -6
  16. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/src/specs_response/param_store_types.rs +11 -0
  17. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/src/specs_response/proto_specs.rs +7 -1
  18. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/src/specs_response/spec_types.rs +14 -1
  19. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/src/statsig_err.rs +3 -3
  20. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/src/statsig_metadata.rs +1 -1
  21. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/src/statsig_options.rs +39 -0
  22. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/tests/gate_inversion_eval_tests.rs +4 -28
  23. statsig_python_core-0.15.2rc2602030138/statsig-rust/tests/statsig_options_tests.rs +80 -0
  24. statsig_python_core-0.15.1rc2601270136/statsig-rust/tests/statsig_options_tests.rs +0 -22
  25. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/py_src/statsig_python_core/__init__.py +0 -0
  26. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/py_src/statsig_python_core/data_store.py +0 -0
  27. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/py_src/statsig_python_core/error_boundary.py +0 -0
  28. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/py_src/statsig_python_core/observability_client.py +0 -0
  29. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/py_src/statsig_python_core/output_logger_provider.py +0 -0
  30. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/py_src/statsig_python_core/persistent_storage.py +0 -0
  31. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/py_src/statsig_python_core/py.typed +0 -0
  32. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/py_src/statsig_python_core/requirements.txt +0 -0
  33. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/py_src/statsig_python_core/statsig.py +0 -0
  34. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/py_src/statsig_python_core/statsig_python_core.pyi +0 -0
  35. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/py_src/statsig_python_core/statsig_types.py +0 -0
  36. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/pyproject.toml +0 -0
  37. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-grpc/Cargo.toml +0 -0
  38. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-grpc/README.md +0 -0
  39. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-grpc/build.rs +0 -0
  40. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-grpc/src/lib.rs +0 -0
  41. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-grpc/src/mock_forward_proxy.rs +0 -0
  42. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-grpc/src/protos/statsig_forward_proxy.proto +0 -0
  43. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-grpc/src/statsig_forward_proxy.rs +0 -0
  44. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-grpc/src/statsig_grpc_client.rs +0 -0
  45. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-grpc/src/statsig_grpc_err.rs +0 -0
  46. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-pyo3/.github/workflows/CI.yml +0 -0
  47. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-pyo3/.gitignore +0 -0
  48. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-pyo3/Cargo.toml +0 -0
  49. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-pyo3/README.md +0 -0
  50. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-pyo3/py_src/statsig_python_core/__init__.py +0 -0
  51. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-pyo3/py_src/statsig_python_core/data_store.py +0 -0
  52. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-pyo3/py_src/statsig_python_core/error_boundary.py +0 -0
  53. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-pyo3/py_src/statsig_python_core/observability_client.py +0 -0
  54. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-pyo3/py_src/statsig_python_core/output_logger_provider.py +0 -0
  55. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-pyo3/py_src/statsig_python_core/persistent_storage.py +0 -0
  56. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-pyo3/py_src/statsig_python_core/py.typed +0 -0
  57. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-pyo3/py_src/statsig_python_core/requirements.txt +0 -0
  58. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-pyo3/py_src/statsig_python_core/statsig.py +0 -0
  59. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-pyo3/py_src/statsig_python_core/statsig_python_core.pyi +0 -0
  60. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-pyo3/py_src/statsig_python_core/statsig_types.py +0 -0
  61. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-pyo3/src/bin/stub_gen.rs +0 -0
  62. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-pyo3/src/data_store_base_py.rs +0 -0
  63. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-pyo3/src/interned_store_py.rs +0 -0
  64. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-pyo3/src/lib.rs +0 -0
  65. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-pyo3/src/observability_client_base_py.rs +0 -0
  66. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-pyo3/src/output_logger_provider_base_py.rs +0 -0
  67. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-pyo3/src/pyo_utils.rs +0 -0
  68. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-pyo3/src/safe_gil.rs +0 -0
  69. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-pyo3/src/statsig_base_py.rs +0 -0
  70. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-pyo3/src/statsig_metadata_py.rs +0 -0
  71. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-pyo3/src/statsig_options_py.rs +0 -0
  72. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-pyo3/src/statsig_persistent_storage_override_adapter_py.rs +0 -0
  73. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-pyo3/src/statsig_types_py.rs +0 -0
  74. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-pyo3/src/statsig_user_py.rs +0 -0
  75. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-pyo3/src/unit_id_py.rs +0 -0
  76. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-pyo3/src/valid_primitives_py.rs +0 -0
  77. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-pyo3/tests/fork_runner.py +0 -0
  78. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-pyo3/tests/mock_scrapi.py +0 -0
  79. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-pyo3/tests/shutdown_sub_proc.py +0 -0
  80. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-pyo3/tests/test_data_store.py +0 -0
  81. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-pyo3/tests/test_error_boundary.py +0 -0
  82. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-pyo3/tests/test_experiment_serialization.py +0 -0
  83. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-pyo3/tests/test_exposure_logging.py +0 -0
  84. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-pyo3/tests/test_feature_gate_serialization.py +0 -0
  85. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-pyo3/tests/test_forking.py +0 -0
  86. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-pyo3/tests/test_get_dynamic_config.py +0 -0
  87. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-pyo3/tests/test_initialize_with_details.py +0 -0
  88. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-pyo3/tests/test_layer_serialization.py +0 -0
  89. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-pyo3/tests/test_observability_client.py +0 -0
  90. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-pyo3/tests/test_output_logger_provider.py +0 -0
  91. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-pyo3/tests/test_override_adapter.py +0 -0
  92. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-pyo3/tests/test_performance.py +0 -0
  93. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-pyo3/tests/test_shared_statsig.py +0 -0
  94. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-pyo3/tests/test_shutdown.py +0 -0
  95. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-pyo3/tests/test_statsig.py +0 -0
  96. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-pyo3/tests/test_statsig_options.py +0 -0
  97. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-pyo3/tests/test_statsig_user.py +0 -0
  98. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-pyo3/tests/test_statsig_user_json_serialization.py +0 -0
  99. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-pyo3/tests/test_statsig_user_pickle.py +0 -0
  100. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-pyo3/tests/test_user_exposure_e2e.py +0 -0
  101. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-pyo3/tests/utils.py +0 -0
  102. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/build.rs +0 -0
  103. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/resources/ip_supalite.table +0 -0
  104. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/resources/ua_parser_regex.yaml +0 -0
  105. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/resources/ua_parser_regex_lite.yaml +0 -0
  106. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/src/__tests__/interned_string_tests.rs +0 -0
  107. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/src/__tests__/mod.rs +0 -0
  108. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/src/__tests__/spec_store_tests.rs +0 -0
  109. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/src/compression/compression_helper.rs +0 -0
  110. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/src/compression/mod.rs +0 -0
  111. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/src/console_capture/console_capture_handler.rs +0 -0
  112. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/src/console_capture/console_capture_instances.rs +0 -0
  113. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/src/console_capture/console_capture_options.rs +0 -0
  114. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/src/console_capture/console_log_line_levels.rs +0 -0
  115. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/src/console_capture/mod.rs +0 -0
  116. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/src/data_store_interface.rs +0 -0
  117. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/src/dcs_str.rs +0 -0
  118. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/src/evaluation/__tests__/dynamic_returnable_tests.rs +0 -0
  119. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/src/evaluation/__tests__/mod.rs +0 -0
  120. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/src/evaluation/comparisons/compare_arrays.rs +0 -0
  121. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/src/evaluation/comparisons/compare_numbers.rs +0 -0
  122. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/src/evaluation/comparisons/compare_strings_in_array.rs +0 -0
  123. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/src/evaluation/comparisons/compare_time.rs +0 -0
  124. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/src/evaluation/comparisons/compare_versions.rs +0 -0
  125. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/src/evaluation/comparisons/mod.rs +0 -0
  126. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/src/evaluation/country_lookup.rs +0 -0
  127. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/src/evaluation/dynamic_returnable.rs +0 -0
  128. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/src/evaluation/dynamic_string.rs +0 -0
  129. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/src/evaluation/dynamic_value.rs +0 -0
  130. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/src/evaluation/evaluation_details.rs +0 -0
  131. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/src/evaluation/evaluation_types.rs +0 -0
  132. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/src/evaluation/evaluation_types_initialize_v2.rs +0 -0
  133. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/src/evaluation/evaluation_types_v2.rs +0 -0
  134. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/src/evaluation/evaluator_result.rs +0 -0
  135. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/src/evaluation/evaluator_value.rs +0 -0
  136. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/src/evaluation/get_unit_id.rs +0 -0
  137. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/src/evaluation/mod.rs +0 -0
  138. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/src/evaluation/secondary_exposure_key.rs +0 -0
  139. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/src/evaluation/user_agent_parsing/first_party_ua_parser.rs +0 -0
  140. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/src/evaluation/user_agent_parsing/mod.rs +0 -0
  141. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/src/evaluation/user_agent_parsing/statsig_uaparser/__tests__/mod.rs +0 -0
  142. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/src/evaluation/user_agent_parsing/statsig_uaparser/__tests__/test_helpers.rs +0 -0
  143. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/src/evaluation/user_agent_parsing/statsig_uaparser/__tests__/test_tokenizer.rs +0 -0
  144. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/src/evaluation/user_agent_parsing/statsig_uaparser/__tests__/test_ua_parser_browser.rs +0 -0
  145. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/src/evaluation/user_agent_parsing/statsig_uaparser/__tests__/test_ua_parser_os.rs +0 -0
  146. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/src/evaluation/user_agent_parsing/statsig_uaparser/mod.rs +0 -0
  147. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/src/evaluation/user_agent_parsing/statsig_uaparser/tokenizer.rs +0 -0
  148. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/src/evaluation/user_agent_parsing/statsig_uaparser/ua_parser.rs +0 -0
  149. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/src/evaluation/user_agent_parsing/statsig_uaparser/window_iter.rs +0 -0
  150. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/src/evaluation/user_agent_parsing/third_party_ua_parser.rs +0 -0
  151. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/src/evaluation/user_agent_parsing/ua_parser.rs +0 -0
  152. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/src/event_emitter/statsig_event_emitter_tests.rs +0 -0
  153. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/src/event_logging/event_logger_constants.rs +0 -0
  154. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/src/event_logging/event_logger_ops_stats.rs +0 -0
  155. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/src/event_logging/event_queue/batch.rs +0 -0
  156. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/src/event_logging/event_queue/mod.rs +0 -0
  157. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/src/event_logging/event_queue/queue.rs +0 -0
  158. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/src/event_logging/event_queue/queued_config_expo.rs +0 -0
  159. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/src/event_logging/event_queue/queued_event.rs +0 -0
  160. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/src/event_logging/event_queue/queued_experiment_expo.rs +0 -0
  161. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/src/event_logging/event_queue/queued_expo.rs +0 -0
  162. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/src/event_logging/event_queue/queued_gate_expo.rs +0 -0
  163. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/src/event_logging/event_queue/queued_layer_param_expo.rs +0 -0
  164. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/src/event_logging/event_queue/queued_passthrough.rs +0 -0
  165. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/src/event_logging/exposure_sampling.rs +0 -0
  166. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/src/event_logging/exposure_utils.rs +0 -0
  167. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/src/event_logging/flush_interval.rs +0 -0
  168. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/src/event_logging/flush_type.rs +0 -0
  169. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/src/event_logging/mod.rs +0 -0
  170. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/src/event_logging/statsig_event.rs +0 -0
  171. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/src/event_logging/statsig_event_internal.rs +0 -0
  172. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/src/event_logging_adapter/event_logging_adapter_trait.rs +0 -0
  173. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/src/event_logging_adapter/log_event_payload.rs +0 -0
  174. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/src/event_logging_adapter/mod.rs +0 -0
  175. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/src/event_logging_adapter/statsig_http_event_logging_adapter.rs +0 -0
  176. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/src/event_logging_adapter/statsig_local_file_event_logging_adapter.rs +0 -0
  177. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/src/gcir/dynamic_configs_processor.rs +0 -0
  178. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/src/gcir/feature_gates_processor.rs +0 -0
  179. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/src/gcir/gcir_formatter.rs +0 -0
  180. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/src/gcir/gcir_options.rs +0 -0
  181. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/src/gcir/gcir_process_iter.rs +0 -0
  182. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/src/gcir/layer_configs_processor.rs +0 -0
  183. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/src/gcir/mod.rs +0 -0
  184. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/src/gcir/stringify_sec_exposures.rs +0 -0
  185. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/src/gcir/target_app_id_utils.rs +0 -0
  186. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/src/global_configs.rs +0 -0
  187. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/src/hashing/ahash.rs +0 -0
  188. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/src/hashing/djb2.rs +0 -0
  189. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/src/hashing/hash_util.rs +0 -0
  190. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/src/hashing/memo_sha_256.rs +0 -0
  191. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/src/hashing/mod.rs +0 -0
  192. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/src/id_lists_adapter/id_list.rs +0 -0
  193. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/src/id_lists_adapter/mod.rs +0 -0
  194. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/src/init_details.rs +0 -0
  195. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/src/initialize_evaluations_response.rs +0 -0
  196. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/src/initialize_response.rs +0 -0
  197. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/src/initialize_v2_response.rs +0 -0
  198. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/src/instance_registry.rs +0 -0
  199. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/src/interned_string.rs +0 -0
  200. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/src/interned_values/__tests__/interned_store_eval_value_tests.rs +0 -0
  201. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/src/interned_values/__tests__/interned_store_returnable_tests.rs +0 -0
  202. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/src/interned_values/__tests__/interned_store_string_tests.rs +0 -0
  203. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/src/interned_values/__tests__/mod.rs +0 -0
  204. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/src/interned_values/interned_store.rs +0 -0
  205. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/src/interned_values/mod.rs +0 -0
  206. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/src/lib.rs +0 -0
  207. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/src/logging_utils.rs +0 -0
  208. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/src/macros.rs +0 -0
  209. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/src/networking/__tests__/mod.rs +0 -0
  210. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/src/networking/__tests__/response_data_tests.rs +0 -0
  211. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/src/networking/http_types.rs +0 -0
  212. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/src/networking/mod.rs +0 -0
  213. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/src/networking/network_client.rs +0 -0
  214. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/src/networking/network_error.rs +0 -0
  215. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/src/networking/providers/mod.rs +0 -0
  216. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/src/networking/providers/net_provider_global.rs +0 -0
  217. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/src/networking/providers/net_provider_noop.rs +0 -0
  218. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/src/networking/providers/net_provider_reqwest.rs +0 -0
  219. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/src/networking/proxy_config.rs +0 -0
  220. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/src/observability/console_capture_observer.rs +0 -0
  221. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/src/observability/diagnostics_observer.rs +0 -0
  222. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/src/observability/mod.rs +0 -0
  223. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/src/observability/observability_client_adapter.rs +0 -0
  224. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/src/observability/ops_stats.rs +0 -0
  225. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/src/observability/sdk_errors_observer.rs +0 -0
  226. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/src/output_logger.rs +0 -0
  227. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/src/override_adapter/mod.rs +0 -0
  228. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/src/override_adapter/override_adapter_trait.rs +0 -0
  229. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/src/persistent_storage/__tests__/mod.rs +0 -0
  230. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/src/persistent_storage/__tests__/sticky_values_serialization_tests.rs +0 -0
  231. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/src/persistent_storage/mod.rs +0 -0
  232. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/src/persistent_storage/persistent_storage_trait.rs +0 -0
  233. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/src/persistent_storage/persistent_values_manager.rs +0 -0
  234. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/src/sdk_diagnostics/diagnostics.rs +0 -0
  235. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/src/sdk_diagnostics/diagnostics_utils.rs +0 -0
  236. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/src/sdk_diagnostics/marker.rs +0 -0
  237. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/src/sdk_diagnostics/mod.rs +0 -0
  238. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/src/sdk_event_emitter/event_emitter.rs +0 -0
  239. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/src/sdk_event_emitter/event_emitter_tests.rs +0 -0
  240. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/src/sdk_event_emitter/event_types.rs +0 -0
  241. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/src/sdk_event_emitter/mod.rs +0 -0
  242. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/src/specs_adapter/mod.rs +0 -0
  243. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/src/specs_adapter/specs_adapter_trait.rs +0 -0
  244. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/src/specs_adapter/statsig_bootstrap_specs_adapter.rs +0 -0
  245. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/src/specs_adapter/statsig_customized_specs_adapter.rs +0 -0
  246. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/src/specs_adapter/statsig_data_store_specs_adapter.rs +0 -0
  247. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/src/specs_adapter/statsig_grpc_specs_adapter.rs +0 -0
  248. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/src/specs_adapter/statsig_http_specs_adapter.rs +0 -0
  249. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/src/specs_adapter/statsig_local_file_specs_adapter.rs +0 -0
  250. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/src/specs_response/__tests__/mod.rs +0 -0
  251. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/src/specs_response/__tests__/proto_specs_syncing_tests.rs +0 -0
  252. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/src/specs_response/__tests__/proto_specs_unknown_tests.rs +0 -0
  253. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/src/specs_response/__tests__/proto_stream_reader_tests.rs +0 -0
  254. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/src/specs_response/cmab_types.rs +0 -0
  255. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/src/specs_response/explicit_params.rs +0 -0
  256. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/src/specs_response/mod.rs +0 -0
  257. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/src/specs_response/proto_stream_reader.rs +0 -0
  258. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/src/specs_response/specs_hash_map.rs +0 -0
  259. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/src/specs_response/statsig_config_specs.rs +0 -0
  260. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/src/statsig.rs +0 -0
  261. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/src/statsig_core_api_options.rs +0 -0
  262. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/src/statsig_global.rs +0 -0
  263. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/src/statsig_runtime.rs +0 -0
  264. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/src/statsig_type_factories.rs +0 -0
  265. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/src/statsig_types.rs +0 -0
  266. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/src/statsig_types_raw.rs +0 -0
  267. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/src/user/into_optional.rs +0 -0
  268. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/src/user/mod.rs +0 -0
  269. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/src/user/statsig_user.rs +0 -0
  270. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/src/user/statsig_user_builder.rs +0 -0
  271. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/src/user/statsig_user_internal.rs +0 -0
  272. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/src/user/statsig_user_loggable.rs +0 -0
  273. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/src/user/unit_id.rs +0 -0
  274. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/src/user/user_data.rs +0 -0
  275. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/src/utils/mod.rs +0 -0
  276. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/tests/check_gate_tests.rs +0 -0
  277. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/tests/customized_specs_adapter_tests.rs +0 -0
  278. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/tests/data/big_number_dcs.json +0 -0
  279. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/tests/data/check_gate_perf_dcs.json +0 -0
  280. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/tests/data/company_id_list +0 -0
  281. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/tests/data/dcs_missing_gates.json +0 -0
  282. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/tests/data/dcs_with_checksum.json +0 -0
  283. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/tests/data/dcs_with_sampling.json +0 -0
  284. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/tests/data/dcs_with_sdk_configs.json +0 -0
  285. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/tests/data/demo_proj_dcs.json +0 -0
  286. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/tests/data/demo_proj_dcs.pb.br +0 -0
  287. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/tests/data/eval_proj_dcs.json +0 -0
  288. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/tests/data/eval_proj_dcs.pb.br +0 -0
  289. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/tests/data/get_id_lists.json +0 -0
  290. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/tests/data/perf_proj_dcs.json +0 -0
  291. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/tests/data/perf_proj_dcs.pb.br +0 -0
  292. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/tests/data/shared_dict_dict_only.json +0 -0
  293. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/tests/data/shared_dict_original_dcs.json +0 -0
  294. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/tests/data/shared_dict_response_uncompressed.json +0 -0
  295. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/tests/data/shared_dict_response_with_dict.json +0 -0
  296. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/tests/data/shared_dict_response_without_dict.json +0 -0
  297. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/tests/data/test_must_pass_user_agents.txt +0 -0
  298. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/tests/data/test_user_agents.txt +0 -0
  299. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/tests/data/ua_string_cases.json +0 -0
  300. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/tests/data/unknown_enum.pb.br +0 -0
  301. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/tests/data_store_lock_tests.rs +0 -0
  302. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/tests/direct_gcir_tests.rs +0 -0
  303. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/tests/dynamic_string_tests.rs +0 -0
  304. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/tests/dynamic_value_tests.rs +0 -0
  305. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/tests/evaluation_details_tests.rs +0 -0
  306. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/tests/evaluator_value_tests.rs +0 -0
  307. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/tests/event_logger_failing_flush_tests.rs +0 -0
  308. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/tests/event_logger_flush_tests.rs +0 -0
  309. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/tests/event_logger_high_qps_tests.rs +0 -0
  310. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/tests/event_logger_usage_tests.rs +0 -0
  311. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/tests/expected_evaluation_tests.rs +0 -0
  312. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/tests/exposure_sampling_key_tests.rs +0 -0
  313. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/tests/exposure_tests.rs +0 -0
  314. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/tests/flushing_tests.rs +0 -0
  315. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/tests/gcir_tests.rs +0 -0
  316. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/tests/global_configs_test.rs +0 -0
  317. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/tests/grpc_specs_adapter_tests.rs +0 -0
  318. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/tests/hash_util_evaluation_hash_tests.rs +0 -0
  319. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/tests/http_specs_adapter_tests.rs +0 -0
  320. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/tests/initialize_timeout_test.rs +0 -0
  321. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/tests/instance_registry_tests.rs +0 -0
  322. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/tests/layer_serialization_tests.rs +0 -0
  323. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/tests/list_methods_tests.rs +0 -0
  324. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/tests/network_client_streaming_tests.rs +0 -0
  325. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/tests/network_client_tests.rs +0 -0
  326. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/tests/network_failure_tests.rs +0 -0
  327. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/tests/observability_client_usage_tests.rs +0 -0
  328. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/tests/output_logger_tests.rs +0 -0
  329. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/tests/override_adapter_tests.rs +0 -0
  330. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/tests/perf_tests.rs +0 -0
  331. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/tests/proto_specs_usage_tests.rs +0 -0
  332. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/tests/spec_types_tests.rs +0 -0
  333. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/tests/statsig_disable_network_tests.rs +0 -0
  334. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/tests/statsig_environment_tests.rs +0 -0
  335. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/tests/statsig_event_emitter_usage_test.rs +0 -0
  336. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/tests/statsig_global_tests.rs +0 -0
  337. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/tests/statsig_local_file_event_logging_adapter_tests.rs +0 -0
  338. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/tests/statsig_local_file_specs_adapter_tests.rs +0 -0
  339. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/tests/statsig_shared_tests.rs +0 -0
  340. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/tests/statsig_tests.rs +0 -0
  341. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/tests/statsig_user_builder_tests.rs +0 -0
  342. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/tests/statsig_user_field_accessor_tests.rs +0 -0
  343. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/tests/statsig_user_internal_tests.rs +0 -0
  344. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/tests/statsig_user_loggable_tests.rs +0 -0
  345. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/tests/statsig_user_tests.rs +0 -0
  346. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/tests/syncing_network_failure_tests.rs +0 -0
  347. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/tests/typed_getters_tests.rs +0 -0
  348. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/tests/ua_parser_util_test.rs +0 -0
  349. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/tests/user_agent_tests_first_party.rs +0 -0
  350. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/tests/user_json_tests.rs +0 -0
  351. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/tests/utils/helpers.rs +0 -0
  352. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/tests/utils/mock_data_store.rs +0 -0
  353. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/tests/utils/mock_event_logging_adapter.rs +0 -0
  354. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/tests/utils/mock_log_provider.rs +0 -0
  355. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/tests/utils/mock_observability_client.rs +0 -0
  356. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/tests/utils/mock_scrapi.rs +0 -0
  357. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/tests/utils/mock_specs_adapter.rs +0 -0
  358. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/tests/utils/mock_specs_listener.rs +0 -0
  359. {statsig_python_core-0.15.1rc2601270136 → statsig_python_core-0.15.2rc2602030138}/statsig-rust/tests/utils/mod.rs +0 -0
@@ -2553,7 +2553,7 @@ dependencies = [
2553
2553
 
2554
2554
  [[package]]
2555
2555
  name = "sigstat-grpc"
2556
- version = "0.15.1-rc.2601270136"
2556
+ version = "0.15.2-rc.2602030138"
2557
2557
  dependencies = [
2558
2558
  "async-trait",
2559
2559
  "chrono",
@@ -2627,7 +2627,7 @@ checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3"
2627
2627
 
2628
2628
  [[package]]
2629
2629
  name = "statsig-node"
2630
- version = "0.15.1-rc.2601270136"
2630
+ version = "0.15.2-rc.2602030138"
2631
2631
  dependencies = [
2632
2632
  "async-trait",
2633
2633
  "napi",
@@ -2641,7 +2641,7 @@ dependencies = [
2641
2641
 
2642
2642
  [[package]]
2643
2643
  name = "statsig-pyo3"
2644
- version = "0.15.1-rc.2601270136"
2644
+ version = "0.15.2-rc.2602030138"
2645
2645
  dependencies = [
2646
2646
  "async-trait",
2647
2647
  "lazy_static",
@@ -2655,7 +2655,7 @@ dependencies = [
2655
2655
 
2656
2656
  [[package]]
2657
2657
  name = "statsig-rust"
2658
- version = "0.15.1-rc.2601270136"
2658
+ version = "0.15.2-rc.2602030138"
2659
2659
  dependencies = [
2660
2660
  "ahash",
2661
2661
  "arc-swap",
@@ -2701,7 +2701,7 @@ dependencies = [
2701
2701
 
2702
2702
  [[package]]
2703
2703
  name = "statsig_elixir"
2704
- version = "0.15.1-rc.2601270136"
2704
+ version = "0.15.2-rc.2602030138"
2705
2705
  dependencies = [
2706
2706
  "async-trait",
2707
2707
  "parking_lot",
@@ -2714,7 +2714,7 @@ dependencies = [
2714
2714
 
2715
2715
  [[package]]
2716
2716
  name = "statsig_ffi"
2717
- version = "0.15.1-rc.2601270136"
2717
+ version = "0.15.2-rc.2602030138"
2718
2718
  dependencies = [
2719
2719
  "async-trait",
2720
2720
  "cbindgen",
@@ -19,7 +19,7 @@ exclude = [
19
19
  [workspace.package]
20
20
  edition = "2021"
21
21
  license = "ISC"
22
- version = "0.15.1-rc.2601270136"
22
+ version = "0.15.2-rc.2602030138"
23
23
  homepage = "https://statsig.com/"
24
24
  authors = ["Statsig", "Daniel Loomb <daniel@statsig.com>"]
25
25
  readme = "README.md"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: statsig_python_core
3
- Version: 0.15.1rc2601270136
3
+ Version: 0.15.2rc2602030138
4
4
  Classifier: Programming Language :: Rust
5
5
  Classifier: Programming Language :: Python :: Implementation :: CPython
6
6
  Classifier: Programming Language :: Python :: Implementation :: PyPy
@@ -38,7 +38,7 @@ serde_json = { version = "1.0.143", features = [
38
38
  ] }
39
39
  serde_with = "3.4.0"
40
40
  sha2 = "0.10.8"
41
- sigstat-grpc = { path = "../statsig-grpc", version = "0.15.1-rc.2601270136", optional = true }
41
+ sigstat-grpc = { path = "../statsig-grpc", version = "0.15.2-rc.2602030138", optional = true }
42
42
  simple_logger = { version = "5.0.0" }
43
43
  tempfile = "3.8.1"
44
44
  tokio = { version = "1.39.1", features = ["full"] }
@@ -185,13 +185,15 @@ fn get_passes_targeting<'a>(ctx: &mut EvaluatorContext<'a>, cmab: &'a CMABConfig
185
185
  Err(_) => false,
186
186
  };
187
187
 
188
- let expo = SecondaryExposure {
189
- gate: targeting_gate_name.clone(),
190
- gate_value: InternedString::from_bool(result),
191
- rule_id: ctx.result.rule_id.clone().unwrap_or_default(),
192
- };
188
+ if !&targeting_gate_name.starts_with("segment:") {
189
+ let expo = SecondaryExposure {
190
+ gate: targeting_gate_name.clone(),
191
+ gate_value: InternedString::from_bool(result),
192
+ rule_id: ctx.result.rule_id.clone().unwrap_or_default(),
193
+ };
193
194
 
194
- ctx.result.secondary_exposures.push(expo);
195
+ ctx.result.secondary_exposures.push(expo);
196
+ }
195
197
 
196
198
  result
197
199
  }
@@ -1,15 +1,26 @@
1
- use crate::{evaluation::evaluator_value::MemoizedEvaluatorValue, unwrap_or_return, DynamicValue};
1
+ use crate::{
2
+ evaluation::evaluator_value::MemoizedEvaluatorValue, log_w, unwrap_or_return, DynamicValue,
3
+ };
4
+
5
+ const TAG: &str = "CompareStrWithRegex";
2
6
 
3
7
  pub(crate) fn compare_str_with_regex(
4
8
  value: &DynamicValue,
5
9
  regex_value: &MemoizedEvaluatorValue,
6
10
  ) -> bool {
7
11
  let value_str = unwrap_or_return!(&value.string_value, false);
8
- if let Some(regex) = &regex_value.regex_value {
9
- return regex.is_match(&value_str.value).unwrap_or(false);
10
- }
11
-
12
- false
12
+ let regex = match &regex_value.regex_value {
13
+ Some(regex) => regex,
14
+ None => {
15
+ log_w!(
16
+ TAG,
17
+ "No regex value found. 'str_matches' operators require a call to EvaluatorValue::compile_regex() on the target value."
18
+ );
19
+ return false;
20
+ }
21
+ };
22
+
23
+ regex.is_match(&value_str.value).unwrap_or(false)
13
24
  }
14
25
 
15
26
  #[cfg(test)]
@@ -619,13 +619,18 @@ fn evaluate_nested_gate<'a>(
619
619
  .unwrap_or(InternedString::empty_ref());
620
620
 
621
621
  match ctx.nested_gate_memo.get(gate_name) {
622
- Some((previous_bool, previous_rule_id)) => {
622
+ Some((previous_bool, previous_rule_id, previous_secondary_exposures)) => {
623
623
  ctx.result.bool_value = *previous_bool;
624
624
  ctx.result.rule_id = previous_rule_id.clone();
625
+ ctx.result
626
+ .secondary_exposures
627
+ .extend_from_slice(previous_secondary_exposures);
625
628
  }
626
629
  None => {
627
630
  ctx.prep_for_nested_evaluation()?;
628
631
 
632
+ let mut current_exposures = std::mem::take(&mut ctx.result.secondary_exposures);
633
+
629
634
  let _ = Evaluator::evaluate(ctx, gate_name.as_str(), &SpecType::Gate)?;
630
635
 
631
636
  if ctx.result.unsupported {
@@ -635,13 +640,27 @@ fn evaluate_nested_gate<'a>(
635
640
  if !gate_name.as_str().is_empty() {
636
641
  ctx.nested_gate_memo.insert(
637
642
  gate_name.clone(),
638
- (ctx.result.bool_value, ctx.result.rule_id.clone()),
643
+ (
644
+ ctx.result.bool_value,
645
+ ctx.result.rule_id.clone(),
646
+ ctx.result.secondary_exposures.clone(),
647
+ ),
639
648
  );
640
649
  }
650
+
651
+ std::mem::swap(&mut ctx.result.secondary_exposures, &mut current_exposures);
652
+ ctx.result
653
+ .secondary_exposures
654
+ .extend_from_slice(&current_exposures);
641
655
  }
642
656
  }
643
657
 
644
- if !&gate_name.starts_with("segment:") {
658
+ let is_empty_rule_id = match &ctx.result.rule_id {
659
+ Some(id) => id.as_str().is_empty(),
660
+ None => true,
661
+ };
662
+
663
+ if !&gate_name.starts_with("segment:") && !is_empty_rule_id {
645
664
  let res = &ctx.result;
646
665
  let expo = SecondaryExposure {
647
666
  gate: gate_name.clone(),
@@ -9,12 +9,13 @@ use crate::interned_string::InternedString;
9
9
  use crate::specs_response::spec_types::{Rule, Spec, SpecsResponseFull};
10
10
  use crate::user::StatsigUserInternal;
11
11
  use crate::StatsigErr::StackOverflowError;
12
- use crate::{OverrideAdapter, Statsig, StatsigErr};
12
+ use crate::{OverrideAdapter, SecondaryExposure, Statsig, StatsigErr};
13
13
 
14
14
  const MAX_RECURSIVE_DEPTH: u16 = 300;
15
15
 
16
- // (gate_name, (bool_value, rule_id))
17
- type NestedGateMemo = HashMap<InternedString, (bool, Option<InternedString>)>;
16
+ // (gate_name, (bool_value, rule_id, secondary_exposures))
17
+ type NestedGateMemo =
18
+ HashMap<InternedString, (bool, Option<InternedString>, Vec<SecondaryExposure>)>;
18
19
 
19
20
  pub enum IdListResolution<'a> {
20
21
  MapLookup(&'a HashMap<String, IdList>),
@@ -27,10 +27,15 @@ use std::{
27
27
  };
28
28
  use tokio::sync::{Notify, Semaphore};
29
29
 
30
+ pub const MIN_BATCH_SIZE: u32 = 10;
31
+ pub const MAX_BATCH_SIZE: u32 = 2000;
32
+
33
+ pub const MIN_PENDING_BATCH_COUNT: u32 = 1;
34
+ pub const DEFAULT_PENDING_BATCH_COUNT_MAX: u32 = 100;
35
+
30
36
  const BG_LOOP_TAG: &str = "EVT_LOG_BG_LOOP";
31
37
  const LIMIT_FLUSH_TAG: &str = "EVT_LOG_LIMIT_FLUSH";
32
- const DEFAULT_BATCH_SIZE: u32 = 2000;
33
- const DEFAULT_PENDING_BATCH_MAX: u32 = 100;
38
+ const DEFAULT_BATCH_SIZE: u32 = MAX_BATCH_SIZE;
34
39
  const MAX_LIMIT_FLUSH_TASKS: usize = 5;
35
40
 
36
41
  #[derive(Debug, PartialEq, Eq, Clone, Copy)]
@@ -69,7 +74,7 @@ impl EventLogger {
69
74
  .unwrap_or(DEFAULT_BATCH_SIZE),
70
75
  options
71
76
  .event_logging_max_pending_batch_queue_size
72
- .unwrap_or(DEFAULT_PENDING_BATCH_MAX),
77
+ .unwrap_or(DEFAULT_PENDING_BATCH_COUNT_MAX),
73
78
  ),
74
79
  event_sampler: ExposureSampling::new(sdk_key),
75
80
  flush_interval: FlushInterval::new(),
@@ -6,7 +6,7 @@ use crate::{
6
6
  hashing,
7
7
  specs_response::param_store_types::{
8
8
  DynamicConfigParameter, ExperimentParameter, GateParameter, LayerParameter, Parameter,
9
- ParameterStore,
9
+ ParameterStore, StaticValueParameter,
10
10
  },
11
11
  ClientInitResponseOptions, HashAlgorithm,
12
12
  };
@@ -73,12 +73,19 @@ fn get_parameters_from_store(
73
73
  let mut parameters: HashMap<String, Parameter> = HashMap::new();
74
74
  for (param_name, param) in &store.parameters {
75
75
  match param {
76
- Parameter::StaticValue(_static_value) => {
77
- parameters.insert(param_name.clone(), param.clone());
76
+ Parameter::StaticValue(static_value) => {
77
+ let new_param = StaticValueParameter {
78
+ name: param_name.clone().into(),
79
+ param_type: static_value.param_type.clone(),
80
+ ref_type: static_value.ref_type.clone(),
81
+ value: static_value.value.clone(),
82
+ };
83
+ parameters.insert(param_name.clone(), Parameter::StaticValue(new_param));
78
84
  }
79
85
 
80
86
  Parameter::Gate(gate) => {
81
87
  let new_param = GateParameter {
88
+ name: param_name.clone().into(),
82
89
  ref_type: gate.ref_type.clone(),
83
90
  param_type: gate.param_type.clone(),
84
91
  gate_name: context.hashing.hash(&gate.gate_name, hash_used),
@@ -90,6 +97,7 @@ fn get_parameters_from_store(
90
97
 
91
98
  Parameter::DynamicConfig(dynamic_config) => {
92
99
  let new_param = DynamicConfigParameter {
100
+ name: param_name.clone().into(),
93
101
  ref_type: dynamic_config.ref_type.clone(),
94
102
  param_type: dynamic_config.param_type.clone(),
95
103
  config_name: context.hashing.hash(&dynamic_config.config_name, hash_used),
@@ -100,6 +108,7 @@ fn get_parameters_from_store(
100
108
 
101
109
  Parameter::Experiment(experiment) => {
102
110
  let new_param = ExperimentParameter {
111
+ name: param_name.clone().into(),
103
112
  ref_type: experiment.ref_type.clone(),
104
113
  param_type: experiment.param_type.clone(),
105
114
  experiment_name: context.hashing.hash(&experiment.experiment_name, hash_used),
@@ -110,6 +119,7 @@ fn get_parameters_from_store(
110
119
 
111
120
  Parameter::Layer(layer) => {
112
121
  let new_param = LayerParameter {
122
+ name: param_name.clone().into(),
113
123
  ref_type: layer.ref_type.clone(),
114
124
  param_type: layer.param_type.clone(),
115
125
  layer_name: context.hashing.hash(&layer.layer_name, hash_used),
@@ -9,6 +9,7 @@ use serde::{Deserialize, Serialize};
9
9
  #[derive(Serialize, Deserialize, Debug, Clone)]
10
10
  #[serde(rename_all = "camelCase")]
11
11
  pub struct IdListMetadata {
12
+ #[serde(alias = "key")]
12
13
  pub name: String,
13
14
  pub url: String,
14
15
 
@@ -1,6 +1,7 @@
1
1
  use super::IdListMetadata;
2
2
  use crate::id_lists_adapter::{IdListUpdate, IdListsAdapter, IdListsUpdateListener};
3
3
  use crate::networking::{NetworkClient, NetworkError, RequestArgs, Response, ResponseData};
4
+ use crate::observability::observability_client_adapter::{MetricType, ObservabilityEvent};
4
5
  use crate::observability::ops_stats::{OpsStatsForInstance, OPS_STATS};
5
6
  use crate::observability::sdk_errors_observer::ErrorBoundaryEvent;
6
7
  use crate::sdk_diagnostics::diagnostics::ContextType;
@@ -85,35 +86,33 @@ impl StatsigHttpIdListsAdapter {
85
86
  ..RequestArgs::new()
86
87
  };
87
88
 
88
- let initial_err = if self.is_cdn_url() {
89
- match self.network.get(request_args.clone()).await {
90
- Ok(response) => return self.parse_response(response.data),
91
- Err(e) => e,
92
- }
89
+ let result = if self.is_cdn_url() {
90
+ self.network.get(request_args.clone()).await
93
91
  } else {
94
- match self.network.post(request_args.clone(), None).await {
95
- Ok(response) => return self.parse_response(response.data),
96
- Err(e) => e,
97
- }
92
+ self.network.post(request_args.clone(), None).await
98
93
  };
99
94
 
100
- if !matches!(initial_err, NetworkError::RetriesExhausted(_, _, _, _)) {
101
- return Err(StatsigErr::NetworkError(initial_err));
102
- }
95
+ let result = match result {
96
+ Ok(response) => self.parse_response(response.data),
97
+ Err(initial_err) => {
98
+ self.handle_manifest_network_error(request_args, initial_err)
99
+ .await
100
+ }
101
+ };
103
102
 
104
- // attempt fallback
105
- let mut fallback_err = None;
106
- if let Some(fallback_url) = &self.fallback_url {
107
- fallback_err = match self
108
- .handle_fallback_request(fallback_url, request_args)
109
- .await
110
- {
111
- Ok(response) => return self.parse_response(response.data),
112
- Err(e) => Some(e),
113
- };
114
- }
103
+ let (metric_name, metric_value) = if result.is_ok() {
104
+ ("id_list_manifest_download_success", 1.0)
105
+ } else {
106
+ ("id_list_manifest_download_failure", 1.0)
107
+ };
108
+ self.ops_stats.log(ObservabilityEvent::new_event(
109
+ MetricType::Increment,
110
+ metric_name.to_string(),
111
+ metric_value,
112
+ None,
113
+ ));
115
114
 
116
- Err(fallback_err.unwrap_or(StatsigErr::NetworkError(initial_err)))
115
+ result
117
116
  }
118
117
 
119
118
  async fn fetch_individual_id_list_changes_from_network(
@@ -142,23 +141,54 @@ impl StatsigHttpIdListsAdapter {
142
141
  url: list_url.to_string(),
143
142
  headers,
144
143
  query_params,
144
+ diagnostics_key: Some(KeyType::GetIDList),
145
145
  ..RequestArgs::new()
146
146
  })
147
- .await
148
- .map_err(StatsigErr::NetworkError)?;
147
+ .await;
148
+
149
+ let response = match response {
150
+ Ok(response) => response,
151
+ Err(err) => {
152
+ return Err(StatsigErr::NetworkError(err));
153
+ }
154
+ };
155
+
156
+ self.add_diagnostics_start_marker(
157
+ KeyType::GetIDList,
158
+ StepType::Process,
159
+ None,
160
+ Some(list_url.to_string()),
161
+ );
149
162
 
150
163
  let mut response_body = match response.data {
151
164
  Some(data) => data,
152
165
  None => {
153
166
  let msg = "No ID List changes from network".to_string();
167
+ self.add_diagnostics_end_marker(
168
+ KeyType::GetIDList,
169
+ StepType::Process,
170
+ false,
171
+ None,
172
+ Some(list_url.to_string()),
173
+ );
154
174
  return Err(StatsigErr::JsonParseError("IdList".to_string(), msg));
155
175
  }
156
176
  };
157
177
 
158
- response_body.read_to_string().map_err(|err| {
178
+ let result = response_body.read_to_string().map_err(|err| {
159
179
  let msg = format!("Failed to parse ID List changes: {err:?}");
160
180
  StatsigErr::JsonParseError("IdList".to_string(), msg)
161
- })
181
+ });
182
+
183
+ self.add_diagnostics_end_marker(
184
+ KeyType::GetIDList,
185
+ StepType::Process,
186
+ result.is_ok(),
187
+ None,
188
+ Some(list_url.to_string()),
189
+ );
190
+
191
+ result
162
192
  }
163
193
 
164
194
  async fn handle_fallback_request(
@@ -177,6 +207,28 @@ impl StatsigHttpIdListsAdapter {
177
207
  }
178
208
  }
179
209
 
210
+ async fn handle_manifest_network_error(
211
+ &self,
212
+ request_args: RequestArgs,
213
+ initial_err: NetworkError,
214
+ ) -> Result<IdListsResponse, StatsigErr> {
215
+ if !matches!(initial_err, NetworkError::RetriesExhausted(_, _, _, _)) {
216
+ return Err(StatsigErr::NetworkError(initial_err));
217
+ }
218
+
219
+ if let Some(fallback_url) = &self.fallback_url {
220
+ return match self
221
+ .handle_fallback_request(fallback_url, request_args)
222
+ .await
223
+ {
224
+ Ok(response) => self.parse_response(response.data),
225
+ Err(e) => Err(e),
226
+ };
227
+ }
228
+
229
+ Err(StatsigErr::NetworkError(initial_err))
230
+ }
231
+
180
232
  async fn run_background_sync(weak_self: &Weak<Self>) {
181
233
  let strong_self = match weak_self.upgrade() {
182
234
  Some(s) => s,
@@ -268,13 +320,10 @@ impl StatsigHttpIdListsAdapter {
268
320
 
269
321
  let mut changes = HashMap::new();
270
322
 
271
- self.ops_stats.add_marker(
272
- Marker::new(
273
- KeyType::GetIDListSources,
274
- ActionType::Start,
275
- Some(StepType::Process),
276
- )
277
- .with_id_list_count(new_manifest.len()),
323
+ self.add_diagnostics_start_marker(
324
+ KeyType::GetIDListSources,
325
+ StepType::Process,
326
+ Some(new_manifest.len()),
278
327
  None,
279
328
  );
280
329
 
@@ -356,18 +405,64 @@ impl StatsigHttpIdListsAdapter {
356
405
  }
357
406
  };
358
407
 
359
- self.ops_stats.add_marker(
360
- Marker::new(
361
- KeyType::GetIDListSources,
362
- ActionType::End,
363
- Some(StepType::Process),
364
- )
365
- .with_is_success(result.is_ok()),
408
+ self.add_diagnostics_end_marker(
409
+ KeyType::GetIDListSources,
410
+ StepType::Process,
411
+ result.is_ok(),
412
+ None,
366
413
  None,
367
414
  );
368
415
 
416
+ let (metric_name, metric_value) = if result.is_ok() {
417
+ ("individual_id_list_download_success", 1.0)
418
+ } else {
419
+ ("individual_id_list_download_failure", 1.0)
420
+ };
421
+ self.ops_stats.log(ObservabilityEvent::new_event(
422
+ MetricType::Increment,
423
+ metric_name.to_string(),
424
+ metric_value,
425
+ None,
426
+ ));
427
+
369
428
  result
370
429
  }
430
+
431
+ // ---- Helper functions for monioring ID List ----
432
+ fn add_diagnostics_start_marker(
433
+ &self,
434
+ key: KeyType,
435
+ step: StepType,
436
+ id_list_count: Option<usize>,
437
+ url: Option<String>,
438
+ ) {
439
+ let mut marker = Marker::new(key, ActionType::Start, Some(step));
440
+ if let Some(count) = id_list_count {
441
+ marker = marker.with_id_list_count(count);
442
+ }
443
+ if let Some(url) = url {
444
+ marker = marker.with_url(url);
445
+ }
446
+ self.ops_stats.add_marker(marker, None);
447
+ }
448
+
449
+ fn add_diagnostics_end_marker(
450
+ &self,
451
+ key: KeyType,
452
+ step: StepType,
453
+ success: bool,
454
+ status_code: Option<u16>,
455
+ url: Option<String>,
456
+ ) {
457
+ let mut marker = Marker::new(key, ActionType::End, Some(step)).with_is_success(success);
458
+ if let Some(status_code) = status_code {
459
+ marker = marker.with_status_code(status_code);
460
+ }
461
+ if let Some(url) = url {
462
+ marker = marker.with_url(url);
463
+ }
464
+ self.ops_stats.add_marker(marker, None);
465
+ }
371
466
  }
372
467
 
373
468
  struct IdListChangeSet {
@@ -384,7 +479,10 @@ impl IdListsAdapter for StatsigHttpIdListsAdapter {
384
479
  listener: Arc<dyn IdListsUpdateListener + Send + Sync>,
385
480
  ) -> Result<(), StatsigErr> {
386
481
  self.set_listener(listener);
387
- self.sync_id_lists().await?;
482
+ self.ops_stats
483
+ .set_diagnostics_context(ContextType::Initialize);
484
+ let result = self.sync_id_lists().await;
485
+ result?;
388
486
  Ok(())
389
487
  }
390
488
 
@@ -232,6 +232,7 @@ impl OverrideAdapter for StatsigLocalOverrideAdapter {
232
232
  ref_type: "static".to_string(),
233
233
  param_type: infer_param_type(&param_value).to_string(),
234
234
  value: param_value,
235
+ name: None,
235
236
  }),
236
237
  };
237
238
  parameters.insert(param_name, parameter);
@@ -506,7 +506,10 @@ impl IdListsUpdateListener for SpecStore {
506
506
  .map(|(key, list)| (key.clone(), list.metadata.clone()))
507
507
  .collect(),
508
508
  None => {
509
- log_e!(TAG, "Failed to acquire read lock: Failed to lock data");
509
+ let err = StatsigErr::LockFailure(
510
+ "Failed to acquire read lock for id list metadata".to_string(),
511
+ );
512
+ log_error_to_statsig_and_console!(self.ops_stats, TAG, err);
510
513
  HashMap::new()
511
514
  }
512
515
  }
@@ -519,7 +522,10 @@ impl IdListsUpdateListener for SpecStore {
519
522
  let mut data = match self.data.try_write_for(Duration::from_secs(5)) {
520
523
  Some(data) => data,
521
524
  None => {
522
- log_e!(TAG, "Failed to acquire write lock: Failed to lock data");
525
+ let err = StatsigErr::LockFailure(
526
+ "Failed to acquire write lock for id list updates".to_string(),
527
+ );
528
+ log_error_to_statsig_and_console!(self.ops_stats, TAG, err);
523
529
  return;
524
530
  }
525
531
  };
@@ -4,6 +4,7 @@ use assert_json_diff::{CompareMode, Config, NumericMode};
4
4
  use serde_json::{json, Value};
5
5
 
6
6
  use crate::{
7
+ interned_str,
7
8
  interned_string::InternedString,
8
9
  networking::ResponseData,
9
10
  observability::ops_stats::OpsStatsForInstance,
@@ -222,15 +223,36 @@ fn test_a_param_store_json_vs_proto() {
222
223
  let mut proto_spec = get_proto_spec_param_store("test_parameter_store");
223
224
  proto_spec.remove("checksum");
224
225
 
225
- let mut json_spec = get_json_spec("param_stores", "test_parameter_store").clone();
226
+ let json_spec = get_json_spec("param_stores", "test_parameter_store").clone();
226
227
 
227
- // the 'name' field is redundant, so we didn't include it in the Protobuf schema
228
- json_spec["parameters"]["bool_param"]
229
- .as_object_mut()
228
+ assert_json_diff::assert_json_matches!(proto_spec, json_spec, get_json_compare_config());
229
+ }
230
+
231
+ #[test]
232
+ fn test_regex_compilation() {
233
+ let proto_specs = get_deserialized_specs(EVAL_PROJ_PROTO_BYTES);
234
+ let json_specs = serde_json::from_slice::<SpecsResponseFull>(EVAL_PROJ_JSON_BYTES).unwrap();
235
+
236
+ // str_matches condition for test_string_comparisons gate
237
+ let key = interned_str!("998446160");
238
+ let proto_condition = proto_specs.condition_map.get(&key).unwrap();
239
+ let json_condition = json_specs.condition_map.get(&key).unwrap();
240
+
241
+ assert!(proto_condition
242
+ .target_value
243
+ .as_ref()
230
244
  .unwrap()
231
- .remove("name");
245
+ .as_ref()
246
+ .regex_value
247
+ .is_some());
232
248
 
233
- assert_json_diff::assert_json_matches!(proto_spec, json_spec, get_json_compare_config());
249
+ assert!(json_condition
250
+ .target_value
251
+ .as_ref()
252
+ .unwrap()
253
+ .as_ref()
254
+ .regex_value
255
+ .is_some());
234
256
  }
235
257
 
236
258
  fn deserialize_from(