statsig-python-core 0.12.2rc2511190400__tar.gz → 0.13.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (339) hide show
  1. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/Cargo.lock +6 -6
  2. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/Cargo.toml +1 -1
  3. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/PKG-INFO +1 -1
  4. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-pyo3/src/statsig_persistent_storage_override_adapter_py.rs +8 -3
  5. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/Cargo.toml +1 -1
  6. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/src/evaluation/cmab_evaluator.rs +7 -7
  7. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/src/evaluation/evaluation_types.rs +4 -3
  8. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/src/evaluation/evaluation_types_initialize_v2.rs +2 -2
  9. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/src/evaluation/evaluation_types_v2.rs +5 -3
  10. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/src/evaluation/evaluator.rs +15 -14
  11. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/src/evaluation/evaluator_context.rs +5 -2
  12. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/src/evaluation/evaluator_result.rs +18 -17
  13. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/src/event_logging/event_queue/mod.rs +1 -0
  14. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/src/event_logging/event_queue/queued_config_expo.rs +6 -2
  15. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/src/event_logging/event_queue/queued_event.rs +8 -3
  16. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/src/event_logging/event_queue/queued_experiment_expo.rs +6 -2
  17. statsig_python_core-0.13.0/statsig-rust/src/event_logging/event_queue/queued_expo.rs +398 -0
  18. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/src/event_logging/event_queue/queued_gate_expo.rs +6 -3
  19. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/src/event_logging/event_queue/queued_layer_param_expo.rs +7 -7
  20. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/src/gcir/gcir_process_iter.rs +7 -11
  21. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/src/id_lists_adapter/statsig_http_id_lists_adapter.rs +5 -2
  22. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/src/lib.rs +1 -0
  23. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/src/output_logger.rs +0 -1
  24. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/src/override_adapter/override_adapter_trait.rs +4 -4
  25. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/src/override_adapter/statsig_local_override_adapter.rs +14 -14
  26. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/src/persistent_storage/__tests__/sticky_values_serialization_tests.rs +6 -3
  27. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/src/persistent_storage/persistent_storage_trait.rs +4 -12
  28. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/src/persistent_storage/persistent_values_manager.rs +6 -6
  29. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/src/sdk_event_emitter/event_emitter.rs +15 -7
  30. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/src/sdk_event_emitter/event_emitter_tests.rs +17 -15
  31. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/src/sdk_event_emitter/event_types.rs +36 -49
  32. statsig_python_core-0.13.0/statsig-rust/src/specs_response/explicit_params.rs +55 -0
  33. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/src/specs_response/mod.rs +1 -0
  34. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/src/specs_response/proto_specs.rs +2 -6
  35. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/src/specs_response/spec_types.rs +3 -2
  36. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/src/statsig.rs +91 -30
  37. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/src/statsig_metadata.rs +1 -1
  38. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/tests/statsig_event_emitter_usage_test.rs +21 -13
  39. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/py_src/statsig_python_core/__init__.py +0 -0
  40. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/py_src/statsig_python_core/data_store.py +0 -0
  41. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/py_src/statsig_python_core/error_boundary.py +0 -0
  42. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/py_src/statsig_python_core/observability_client.py +0 -0
  43. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/py_src/statsig_python_core/output_logger_provider.py +0 -0
  44. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/py_src/statsig_python_core/persistent_storage.py +0 -0
  45. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/py_src/statsig_python_core/py.typed +0 -0
  46. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/py_src/statsig_python_core/requirements.txt +0 -0
  47. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/py_src/statsig_python_core/statsig.py +0 -0
  48. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/py_src/statsig_python_core/statsig_python_core.pyi +0 -0
  49. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/pyproject.toml +0 -0
  50. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-grpc/Cargo.toml +0 -0
  51. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-grpc/README.md +0 -0
  52. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-grpc/build.rs +0 -0
  53. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-grpc/src/lib.rs +0 -0
  54. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-grpc/src/mock_forward_proxy.rs +0 -0
  55. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-grpc/src/statsig_forward_proxy.rs +0 -0
  56. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-grpc/src/statsig_grpc_client.rs +0 -0
  57. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-grpc/src/statsig_grpc_err.rs +0 -0
  58. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-pyo3/.github/workflows/CI.yml +0 -0
  59. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-pyo3/.gitignore +0 -0
  60. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-pyo3/Cargo.toml +0 -0
  61. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-pyo3/README.md +0 -0
  62. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-pyo3/py_src/statsig_python_core/__init__.py +0 -0
  63. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-pyo3/py_src/statsig_python_core/data_store.py +0 -0
  64. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-pyo3/py_src/statsig_python_core/error_boundary.py +0 -0
  65. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-pyo3/py_src/statsig_python_core/observability_client.py +0 -0
  66. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-pyo3/py_src/statsig_python_core/output_logger_provider.py +0 -0
  67. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-pyo3/py_src/statsig_python_core/persistent_storage.py +0 -0
  68. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-pyo3/py_src/statsig_python_core/py.typed +0 -0
  69. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-pyo3/py_src/statsig_python_core/requirements.txt +0 -0
  70. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-pyo3/py_src/statsig_python_core/statsig.py +0 -0
  71. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-pyo3/py_src/statsig_python_core/statsig_python_core.pyi +0 -0
  72. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-pyo3/src/bin/stub_gen.rs +0 -0
  73. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-pyo3/src/data_store_base_py.rs +0 -0
  74. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-pyo3/src/lib.rs +0 -0
  75. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-pyo3/src/observability_client_base_py.rs +0 -0
  76. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-pyo3/src/output_logger_provider_base_py.rs +0 -0
  77. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-pyo3/src/pyo_utils.rs +0 -0
  78. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-pyo3/src/safe_gil.rs +0 -0
  79. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-pyo3/src/statsig_base_py.rs +0 -0
  80. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-pyo3/src/statsig_metadata_py.rs +0 -0
  81. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-pyo3/src/statsig_options_py.rs +0 -0
  82. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-pyo3/src/statsig_types_py.rs +0 -0
  83. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-pyo3/src/statsig_user_py.rs +0 -0
  84. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-pyo3/src/unit_id_py.rs +0 -0
  85. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-pyo3/src/valid_primitives_py.rs +0 -0
  86. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-pyo3/tests/fork_runner.py +0 -0
  87. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-pyo3/tests/mock_scrapi.py +0 -0
  88. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-pyo3/tests/shutdown_sub_proc.py +0 -0
  89. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-pyo3/tests/test_data_store.py +0 -0
  90. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-pyo3/tests/test_error_boundary.py +0 -0
  91. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-pyo3/tests/test_exposure_logging.py +0 -0
  92. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-pyo3/tests/test_forking.py +0 -0
  93. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-pyo3/tests/test_initialize_with_details.py +0 -0
  94. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-pyo3/tests/test_observability_client.py +0 -0
  95. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-pyo3/tests/test_output_logger_provider.py +0 -0
  96. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-pyo3/tests/test_override_adapter.py +0 -0
  97. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-pyo3/tests/test_shared_statsig.py +0 -0
  98. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-pyo3/tests/test_shutdown.py +0 -0
  99. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-pyo3/tests/test_statsig.py +0 -0
  100. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-pyo3/tests/test_statsig_options.py +0 -0
  101. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-pyo3/tests/test_statsig_user.py +0 -0
  102. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-pyo3/tests/test_statsig_user_pickle.py +0 -0
  103. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-pyo3/tests/utils.py +0 -0
  104. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/build.rs +0 -0
  105. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/resources/ip_supalite.table +0 -0
  106. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/resources/ua_parser_regex.yaml +0 -0
  107. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/resources/ua_parser_regex_lite.yaml +0 -0
  108. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/src/__tests__/interned_string_tests.rs +0 -0
  109. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/src/__tests__/mod.rs +0 -0
  110. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/src/__tests__/spec_store_tests.rs +0 -0
  111. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/src/compression/compression_helper.rs +0 -0
  112. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/src/compression/mod.rs +0 -0
  113. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/src/console_capture/console_capture_handler.rs +0 -0
  114. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/src/console_capture/console_capture_instances.rs +0 -0
  115. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/src/console_capture/console_capture_options.rs +0 -0
  116. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/src/console_capture/console_log_line_levels.rs +0 -0
  117. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/src/console_capture/mod.rs +0 -0
  118. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/src/data_store_interface.rs +0 -0
  119. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/src/dcs_str.rs +0 -0
  120. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/src/evaluation/__tests__/dynamic_returnable_tests.rs +0 -0
  121. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/src/evaluation/__tests__/mod.rs +0 -0
  122. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/src/evaluation/comparisons/compare_arrays.rs +0 -0
  123. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/src/evaluation/comparisons/compare_numbers.rs +0 -0
  124. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/src/evaluation/comparisons/compare_str_with_regex.rs +0 -0
  125. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/src/evaluation/comparisons/compare_strings_in_array.rs +0 -0
  126. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/src/evaluation/comparisons/compare_time.rs +0 -0
  127. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/src/evaluation/comparisons/compare_versions.rs +0 -0
  128. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/src/evaluation/comparisons/mod.rs +0 -0
  129. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/src/evaluation/country_lookup.rs +0 -0
  130. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/src/evaluation/dynamic_returnable.rs +0 -0
  131. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/src/evaluation/dynamic_string.rs +0 -0
  132. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/src/evaluation/dynamic_value.rs +0 -0
  133. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/src/evaluation/evaluation_details.rs +0 -0
  134. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/src/evaluation/evaluator_value.rs +0 -0
  135. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/src/evaluation/get_unit_id.rs +0 -0
  136. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/src/evaluation/mod.rs +0 -0
  137. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/src/evaluation/secondary_exposure_key.rs +0 -0
  138. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/src/evaluation/user_agent_parsing/first_party_ua_parser.rs +0 -0
  139. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/src/evaluation/user_agent_parsing/mod.rs +0 -0
  140. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/src/evaluation/user_agent_parsing/statsig_uaparser/__tests__/mod.rs +0 -0
  141. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/src/evaluation/user_agent_parsing/statsig_uaparser/__tests__/test_helpers.rs +0 -0
  142. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/src/evaluation/user_agent_parsing/statsig_uaparser/__tests__/test_tokenizer.rs +0 -0
  143. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/src/evaluation/user_agent_parsing/statsig_uaparser/__tests__/test_ua_parser_browser.rs +0 -0
  144. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/src/evaluation/user_agent_parsing/statsig_uaparser/__tests__/test_ua_parser_os.rs +0 -0
  145. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/src/evaluation/user_agent_parsing/statsig_uaparser/mod.rs +0 -0
  146. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/src/evaluation/user_agent_parsing/statsig_uaparser/tokenizer.rs +0 -0
  147. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/src/evaluation/user_agent_parsing/statsig_uaparser/ua_parser.rs +0 -0
  148. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/src/evaluation/user_agent_parsing/statsig_uaparser/window_iter.rs +0 -0
  149. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/src/evaluation/user_agent_parsing/third_party_ua_parser.rs +0 -0
  150. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/src/evaluation/user_agent_parsing/ua_parser.rs +0 -0
  151. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/src/event_emitter/statsig_event_emitter_tests.rs +0 -0
  152. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/src/event_logging/event_logger.rs +0 -0
  153. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/src/event_logging/event_logger_constants.rs +0 -0
  154. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/src/event_logging/event_logger_ops_stats.rs +0 -0
  155. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/src/event_logging/event_queue/batch.rs +0 -0
  156. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/src/event_logging/event_queue/queue.rs +0 -0
  157. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/src/event_logging/event_queue/queued_passthrough.rs +0 -0
  158. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/src/event_logging/exposure_sampling.rs +0 -0
  159. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/src/event_logging/exposure_utils.rs +0 -0
  160. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/src/event_logging/flush_interval.rs +0 -0
  161. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/src/event_logging/flush_type.rs +0 -0
  162. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/src/event_logging/mod.rs +0 -0
  163. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/src/event_logging/statsig_event.rs +0 -0
  164. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/src/event_logging/statsig_event_internal.rs +0 -0
  165. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/src/event_logging_adapter/event_logging_adapter_trait.rs +0 -0
  166. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/src/event_logging_adapter/log_event_payload.rs +0 -0
  167. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/src/event_logging_adapter/mod.rs +0 -0
  168. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/src/event_logging_adapter/statsig_http_event_logging_adapter.rs +0 -0
  169. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/src/event_logging_adapter/statsig_local_file_event_logging_adapter.rs +0 -0
  170. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/src/gcir/dynamic_configs_processor.rs +0 -0
  171. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/src/gcir/feature_gates_processor.rs +0 -0
  172. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/src/gcir/gcir_formatter.rs +0 -0
  173. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/src/gcir/gcir_options.rs +0 -0
  174. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/src/gcir/layer_configs_processor.rs +0 -0
  175. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/src/gcir/mod.rs +0 -0
  176. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/src/gcir/param_stores_processor.rs +0 -0
  177. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/src/gcir/stringify_sec_exposures.rs +0 -0
  178. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/src/gcir/target_app_id_utils.rs +0 -0
  179. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/src/global_configs.rs +0 -0
  180. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/src/hashing/ahash.rs +0 -0
  181. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/src/hashing/djb2.rs +0 -0
  182. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/src/hashing/hash_util.rs +0 -0
  183. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/src/hashing/memo_sha_256.rs +0 -0
  184. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/src/hashing/mod.rs +0 -0
  185. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/src/id_lists_adapter/id_list.rs +0 -0
  186. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/src/id_lists_adapter/id_lists_adapter_trait.rs +0 -0
  187. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/src/id_lists_adapter/mod.rs +0 -0
  188. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/src/init_details.rs +0 -0
  189. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/src/initialize_evaluations_response.rs +0 -0
  190. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/src/initialize_response.rs +0 -0
  191. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/src/initialize_v2_response.rs +0 -0
  192. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/src/instance_registry.rs +0 -0
  193. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/src/interned_string.rs +0 -0
  194. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/src/interned_value_store.rs +0 -0
  195. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/src/macros.rs +0 -0
  196. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/src/networking/__tests__/mod.rs +0 -0
  197. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/src/networking/__tests__/response_data_tests.rs +0 -0
  198. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/src/networking/http_types.rs +0 -0
  199. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/src/networking/mod.rs +0 -0
  200. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/src/networking/network_client.rs +0 -0
  201. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/src/networking/network_error.rs +0 -0
  202. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/src/networking/providers/mod.rs +0 -0
  203. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/src/networking/providers/net_provider_global.rs +0 -0
  204. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/src/networking/providers/net_provider_noop.rs +0 -0
  205. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/src/networking/providers/net_provider_reqwest.rs +0 -0
  206. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/src/networking/proxy_config.rs +0 -0
  207. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/src/observability/console_capture_observer.rs +0 -0
  208. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/src/observability/diagnostics_observer.rs +0 -0
  209. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/src/observability/mod.rs +0 -0
  210. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/src/observability/observability_client_adapter.rs +0 -0
  211. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/src/observability/ops_stats.rs +0 -0
  212. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/src/observability/sdk_errors_observer.rs +0 -0
  213. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/src/override_adapter/mod.rs +0 -0
  214. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/src/persistent_storage/__tests__/mod.rs +0 -0
  215. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/src/persistent_storage/mod.rs +0 -0
  216. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/src/sdk_diagnostics/diagnostics.rs +0 -0
  217. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/src/sdk_diagnostics/diagnostics_utils.rs +0 -0
  218. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/src/sdk_diagnostics/marker.rs +0 -0
  219. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/src/sdk_diagnostics/mod.rs +0 -0
  220. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/src/sdk_event_emitter/mod.rs +0 -0
  221. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/src/spec_store.rs +0 -0
  222. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/src/specs_adapter/mod.rs +0 -0
  223. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/src/specs_adapter/specs_adapter_trait.rs +0 -0
  224. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/src/specs_adapter/statsig_bootstrap_specs_adapter.rs +0 -0
  225. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/src/specs_adapter/statsig_customized_specs_adapter.rs +0 -0
  226. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/src/specs_adapter/statsig_data_store_specs_adapter.rs +0 -0
  227. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/src/specs_adapter/statsig_grpc_specs_adapter.rs +0 -0
  228. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/src/specs_adapter/statsig_http_specs_adapter.rs +0 -0
  229. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/src/specs_adapter/statsig_local_file_specs_adapter.rs +0 -0
  230. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/src/specs_response/__tests__/mod.rs +0 -0
  231. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/src/specs_response/__tests__/proto_specs_syncing_tests.rs +0 -0
  232. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/src/specs_response/__tests__/proto_specs_vs_json_tests.rs +0 -0
  233. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/src/specs_response/__tests__/proto_stream_reader_tests.rs +0 -0
  234. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/src/specs_response/cmab_types.rs +0 -0
  235. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/src/specs_response/param_store_types.rs +0 -0
  236. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/src/specs_response/proto_stream_reader.rs +0 -0
  237. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/src/specs_response/specs_hash_map.rs +0 -0
  238. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/src/specs_response/statsig_config_specs.rs +0 -0
  239. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/src/statsig_core_api_options.rs +0 -0
  240. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/src/statsig_err.rs +0 -0
  241. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/src/statsig_global.rs +0 -0
  242. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/src/statsig_options.rs +0 -0
  243. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/src/statsig_runtime.rs +0 -0
  244. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/src/statsig_type_factories.rs +0 -0
  245. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/src/statsig_types.rs +0 -0
  246. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/src/user/into_optional.rs +0 -0
  247. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/src/user/mod.rs +0 -0
  248. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/src/user/statsig_user.rs +0 -0
  249. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/src/user/statsig_user_builder.rs +0 -0
  250. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/src/user/statsig_user_internal.rs +0 -0
  251. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/src/user/statsig_user_loggable.rs +0 -0
  252. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/src/user/unit_id.rs +0 -0
  253. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/src/user/user_data.rs +0 -0
  254. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/src/utils/mod.rs +0 -0
  255. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/tests/check_gate_tests.rs +0 -0
  256. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/tests/customized_specs_adapter_tests.rs +0 -0
  257. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/tests/data/big_number_dcs.json +0 -0
  258. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/tests/data/check_gate_perf_dcs.json +0 -0
  259. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/tests/data/company_id_list +0 -0
  260. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/tests/data/dcs_missing_gates.json +0 -0
  261. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/tests/data/dcs_with_checksum.json +0 -0
  262. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/tests/data/dcs_with_sampling.json +0 -0
  263. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/tests/data/dcs_with_sdk_configs.json +0 -0
  264. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/tests/data/demo_proj_dcs.json +0 -0
  265. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/tests/data/demo_proj_dcs.pb.br +0 -0
  266. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/tests/data/eval_proj_dcs.json +0 -0
  267. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/tests/data/eval_proj_dcs.pb.br +0 -0
  268. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/tests/data/get_id_lists.json +0 -0
  269. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/tests/data/perf_proj_dcs.json +0 -0
  270. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/tests/data/perf_proj_dcs.pb.br +0 -0
  271. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/tests/data/shared_dict_dict_only.json +0 -0
  272. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/tests/data/shared_dict_original_dcs.json +0 -0
  273. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/tests/data/shared_dict_response_uncompressed.json +0 -0
  274. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/tests/data/shared_dict_response_with_dict.json +0 -0
  275. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/tests/data/shared_dict_response_without_dict.json +0 -0
  276. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/tests/data/test_must_pass_user_agents.txt +0 -0
  277. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/tests/data/test_user_agents.txt +0 -0
  278. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/tests/data/ua_string_cases.json +0 -0
  279. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/tests/data_store_lock_tests.rs +0 -0
  280. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/tests/direct_gcir_tests.rs +0 -0
  281. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/tests/dynamic_string_tests.rs +0 -0
  282. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/tests/dynamic_value_tests.rs +0 -0
  283. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/tests/evaluation_details_tests.rs +0 -0
  284. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/tests/evaluator_value_tests.rs +0 -0
  285. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/tests/event_logger_failing_flush_tests.rs +0 -0
  286. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/tests/event_logger_flush_tests.rs +0 -0
  287. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/tests/event_logger_high_qps_tests.rs +0 -0
  288. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/tests/event_logger_usage_tests.rs +0 -0
  289. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/tests/expected_evaluation_tests.rs +0 -0
  290. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/tests/exposure_sampling_key_tests.rs +0 -0
  291. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/tests/exposure_tests.rs +0 -0
  292. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/tests/flushing_tests.rs +0 -0
  293. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/tests/gate_inversion_eval_tests.rs +0 -0
  294. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/tests/gcir_tests.rs +0 -0
  295. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/tests/global_configs_test.rs +0 -0
  296. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/tests/grpc_specs_adapter_tests.rs +0 -0
  297. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/tests/hash_util_evaluation_hash_tests.rs +0 -0
  298. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/tests/http_specs_adapter_tests.rs +0 -0
  299. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/tests/initialize_timeout_test.rs +0 -0
  300. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/tests/instance_registry_tests.rs +0 -0
  301. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/tests/layer_serialization_tests.rs +0 -0
  302. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/tests/list_methods_tests.rs +0 -0
  303. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/tests/network_client_streaming_tests.rs +0 -0
  304. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/tests/network_client_tests.rs +0 -0
  305. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/tests/network_failure_tests.rs +0 -0
  306. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/tests/observability_client_usage_tests.rs +0 -0
  307. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/tests/output_logger_tests.rs +0 -0
  308. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/tests/override_adapter_tests.rs +0 -0
  309. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/tests/perf_tests.rs +0 -0
  310. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/tests/proto_specs_usage_tests.rs +0 -0
  311. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/tests/spec_types_tests.rs +0 -0
  312. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/tests/statsig_disable_network_tests.rs +0 -0
  313. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/tests/statsig_environment_tests.rs +0 -0
  314. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/tests/statsig_global_tests.rs +0 -0
  315. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/tests/statsig_local_file_event_logging_adapter_tests.rs +0 -0
  316. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/tests/statsig_local_file_specs_adapter_tests.rs +0 -0
  317. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/tests/statsig_options_tests.rs +0 -0
  318. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/tests/statsig_shared_tests.rs +0 -0
  319. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/tests/statsig_tests.rs +0 -0
  320. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/tests/statsig_user_builder_tests.rs +0 -0
  321. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/tests/statsig_user_field_accessor_tests.rs +0 -0
  322. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/tests/statsig_user_internal_tests.rs +0 -0
  323. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/tests/statsig_user_loggable_tests.rs +0 -0
  324. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/tests/statsig_user_tests.rs +0 -0
  325. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/tests/syncing_network_failure_tests.rs +0 -0
  326. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/tests/typed_getters_tests.rs +0 -0
  327. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/tests/ua_parser_util_test.rs +0 -0
  328. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/tests/user_agent_tests_first_party.rs +0 -0
  329. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/tests/user_agent_tests_third_party.rs +0 -0
  330. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/tests/user_json_tests.rs +0 -0
  331. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/tests/utils/helpers.rs +0 -0
  332. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/tests/utils/mock_data_store.rs +0 -0
  333. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/tests/utils/mock_event_logging_adapter.rs +0 -0
  334. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/tests/utils/mock_log_provider.rs +0 -0
  335. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/tests/utils/mock_observability_client.rs +0 -0
  336. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/tests/utils/mock_scrapi.rs +0 -0
  337. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/tests/utils/mock_specs_adapter.rs +0 -0
  338. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/tests/utils/mock_specs_listener.rs +0 -0
  339. {statsig_python_core-0.12.2rc2511190400 → statsig_python_core-0.13.0}/statsig-rust/tests/utils/mod.rs +0 -0
@@ -2528,7 +2528,7 @@ dependencies = [
2528
2528
 
2529
2529
  [[package]]
2530
2530
  name = "sigstat-grpc"
2531
- version = "0.12.2-rc.2511190400"
2531
+ version = "0.13.0"
2532
2532
  dependencies = [
2533
2533
  "async-trait",
2534
2534
  "chrono",
@@ -2602,7 +2602,7 @@ checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3"
2602
2602
 
2603
2603
  [[package]]
2604
2604
  name = "statsig-node"
2605
- version = "0.12.2-rc.2511190400"
2605
+ version = "0.13.0"
2606
2606
  dependencies = [
2607
2607
  "async-trait",
2608
2608
  "napi",
@@ -2616,7 +2616,7 @@ dependencies = [
2616
2616
 
2617
2617
  [[package]]
2618
2618
  name = "statsig-pyo3"
2619
- version = "0.12.2-rc.2511190400"
2619
+ version = "0.13.0"
2620
2620
  dependencies = [
2621
2621
  "async-trait",
2622
2622
  "lazy_static",
@@ -2630,7 +2630,7 @@ dependencies = [
2630
2630
 
2631
2631
  [[package]]
2632
2632
  name = "statsig-rust"
2633
- version = "0.12.2-rc.2511190400"
2633
+ version = "0.13.0"
2634
2634
  dependencies = [
2635
2635
  "ahash",
2636
2636
  "arc-swap",
@@ -2676,7 +2676,7 @@ dependencies = [
2676
2676
 
2677
2677
  [[package]]
2678
2678
  name = "statsig_elixir"
2679
- version = "0.12.2-rc.2511190400"
2679
+ version = "0.13.0"
2680
2680
  dependencies = [
2681
2681
  "parking_lot",
2682
2682
  "rustler",
@@ -2688,7 +2688,7 @@ dependencies = [
2688
2688
 
2689
2689
  [[package]]
2690
2690
  name = "statsig_ffi"
2691
- version = "0.12.2-rc.2511190400"
2691
+ version = "0.13.0"
2692
2692
  dependencies = [
2693
2693
  "async-trait",
2694
2694
  "cbindgen",
@@ -18,7 +18,7 @@ exclude = [
18
18
  [workspace.package]
19
19
  edition = "2021"
20
20
  license = "ISC"
21
- version = "0.12.2-rc.2511190400"
21
+ version = "0.13.0"
22
22
  homepage = "https://statsig.com/"
23
23
  authors = ["Statsig", "Daniel Loomb <daniel@statsig.com>"]
24
24
  readme = "README.md"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: statsig_python_core
3
- Version: 0.12.2rc2511190400
3
+ Version: 0.13.0
4
4
  Classifier: Programming Language :: Rust
5
5
  Classifier: Programming Language :: Python :: Implementation :: CPython
6
6
  Classifier: Programming Language :: Python :: Implementation :: PyPy
@@ -4,7 +4,8 @@ use pyo3::{
4
4
  };
5
5
  use pyo3_stub_gen::derive::*;
6
6
  use statsig_rust::{
7
- interned_string::InternedString, log_d, log_e, log_w, PersistentStorage, SecondaryExposure,
7
+ interned_string::InternedString, log_d, log_e, log_w,
8
+ specs_response::explicit_params::ExplicitParameters, PersistentStorage, SecondaryExposure,
8
9
  StickyValues as StickyValuesActual, UserPersistedValues as UserPersistedValuesActual,
9
10
  };
10
11
  use std::collections::HashMap;
@@ -72,7 +73,8 @@ pub fn convert_dict_to_user_persisted_values(
72
73
  undelegated_secondary_exposures: Some(convert_py_lists_to_secondary_exposures(
73
74
  &undelegated_secondary_exposures,
74
75
  )?),
75
- explicit_parameters: converted_explicit_parameters,
76
+ explicit_parameters: converted_explicit_parameters
77
+ .map(ExplicitParameters::from_vec),
76
78
  config_version,
77
79
  };
78
80
  user_persisted_value.insert(config_name.to_string(), sticky_value);
@@ -108,7 +110,10 @@ fn convert_stick_value_to_py_obj(
108
110
  py_dict.set_item("secondary_exposures", secondary_exposures)?;
109
111
  py_dict.set_item(
110
112
  "explicit_parameters",
111
- sticky_values.explicit_parameters.clone(),
113
+ sticky_values
114
+ .explicit_parameters
115
+ .as_ref()
116
+ .map(|p| p.unperformant_to_vec()),
112
117
  )?;
113
118
  py_dict.set_item("config_delegate", sticky_values.config_delegate.clone())?;
114
119
  let undelegated_secondary_exposures = match sticky_values.undelegated_secondary_exposures {
@@ -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.12.2-rc.2511190400", optional = true }
41
+ sigstat-grpc = { path = "../statsig-grpc", version = "0.13.0", 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"] }
@@ -123,7 +123,7 @@ pub(crate) fn evaluate_cmab(
123
123
  ctx.result.version = Some(cmab.version);
124
124
  ctx.result.is_experiment_active = cmab.enabled;
125
125
  ctx.result.bool_value = false;
126
- ctx.result.rule_id = Some(&NOT_STARTED_RULE);
126
+ ctx.result.rule_id = Some(NOT_STARTED_RULE.clone());
127
127
  ctx.result.json_value = Some(cmab.default_value.clone());
128
128
  return true;
129
129
  }
@@ -133,7 +133,7 @@ pub(crate) fn evaluate_cmab(
133
133
  ctx.result.version = Some(cmab.version);
134
134
  ctx.result.is_experiment_active = cmab.enabled;
135
135
  ctx.result.bool_value = false;
136
- ctx.result.rule_id = Some(&FAILS_TARGETING);
136
+ ctx.result.rule_id = Some(FAILS_TARGETING.clone());
137
137
  ctx.result.json_value = Some(cmab.default_value.clone());
138
138
  return true;
139
139
  }
@@ -175,7 +175,7 @@ fn get_passes_targeting<'a>(ctx: &mut EvaluatorContext<'a>, cmab: &'a CMABConfig
175
175
  Ok(_) => {}
176
176
  Err(_) => {
177
177
  ctx.result.bool_value = false;
178
- ctx.result.rule_id = Some(&FAILS_TARGETING);
178
+ ctx.result.rule_id = Some(FAILS_TARGETING.clone());
179
179
  return false;
180
180
  }
181
181
  }
@@ -188,7 +188,7 @@ fn get_passes_targeting<'a>(ctx: &mut EvaluatorContext<'a>, cmab: &'a CMABConfig
188
188
  let expo = SecondaryExposure {
189
189
  gate: targeting_gate_name.clone(),
190
190
  gate_value: InternedString::from_bool(result),
191
- rule_id: ctx.result.rule_id.cloned().unwrap_or_default(),
191
+ rule_id: ctx.result.rule_id.clone().unwrap_or_default(),
192
192
  };
193
193
 
194
194
  ctx.result.secondary_exposures.push(expo);
@@ -218,7 +218,7 @@ fn apply_random_group<'a>(
218
218
  None => &cmab.groups[0],
219
219
  };
220
220
  ctx.result.bool_value = true;
221
- ctx.result.rule_id = Some(&group.id);
221
+ ctx.result.rule_id = Some(group.id.clone());
222
222
  ctx.result.rule_id_suffix = Some(EXPLORE_RULE_ID_SUFFIX);
223
223
  ctx.result.group_name = Some(InternedString::from_str_ref(&group.name));
224
224
  ctx.result.json_value = Some(group.parameter_values.clone());
@@ -248,7 +248,7 @@ fn apply_sampling_group<'a>(
248
248
  };
249
249
  sum += 1.0 / (cur_count as f64) / total_records;
250
250
  if value < sum {
251
- ctx.result.rule_id = Some(&group.id);
251
+ ctx.result.rule_id = Some(group.id.clone());
252
252
  ctx.result.rule_id_suffix = Some(EXPLORE_RULE_ID_SUFFIX);
253
253
  ctx.result.bool_value = true;
254
254
  ctx.result.group_name = Some(InternedString::from_str_ref(&group.name));
@@ -291,7 +291,7 @@ fn apply_best_group<'a>(
291
291
  best_group = &cmab.groups[(random * cmab.groups.len() as f64).floor() as usize];
292
292
  }
293
293
  ctx.result.bool_value = true;
294
- ctx.result.rule_id = Some(&best_group.id);
294
+ ctx.result.rule_id = Some(best_group.id.clone());
295
295
  ctx.result.group_name = Some(InternedString::from_str_ref(&best_group.name));
296
296
  ctx.result.json_value = Some(best_group.parameter_values.clone());
297
297
  }
@@ -3,6 +3,7 @@ use std::collections::HashMap;
3
3
  use super::dynamic_returnable::DynamicReturnable;
4
4
  use crate::{
5
5
  evaluation::secondary_exposure_key::SecondaryExposureKey, interned_string::InternedString,
6
+ specs_response::explicit_params::ExplicitParameters,
6
7
  };
7
8
 
8
9
  use serde::{Deserialize, Serialize};
@@ -47,7 +48,7 @@ pub struct ExtraExposureInfo {
47
48
  pub sampling_rate: Option<u64>,
48
49
  pub forward_all_exposures: Option<bool>,
49
50
  pub has_seen_analytical_gates: Option<bool>,
50
- pub override_config_name: Option<String>,
51
+ pub override_config_name: Option<InternedString>,
51
52
  pub version: Option<u32>,
52
53
  }
53
54
 
@@ -149,7 +150,7 @@ pub struct ExperimentEvaluation {
149
150
  pub is_in_layer: bool,
150
151
 
151
152
  #[serde(skip_serializing_if = "Option::is_none")]
152
- pub explicit_parameters: Option<Vec<InternedString>>,
153
+ pub explicit_parameters: Option<ExplicitParameters>,
153
154
 
154
155
  #[serde(skip_serializing_if = "Option::is_none")]
155
156
  pub group_name: Option<InternedString>,
@@ -193,7 +194,7 @@ pub struct LayerEvaluation {
193
194
 
194
195
  #[serde(skip_serializing_if = "Option::is_none")]
195
196
  pub allocated_experiment_name: Option<InternedString>,
196
- pub explicit_parameters: Vec<InternedString>,
197
+ pub explicit_parameters: ExplicitParameters,
197
198
  #[serde(skip_serializing_if = "Option::is_none")]
198
199
  pub undelegated_secondary_exposures: Option<Vec<SecondaryExposure>>,
199
200
 
@@ -1,4 +1,4 @@
1
- use crate::interned_string::InternedString;
1
+ use crate::{interned_string::InternedString, specs_response::explicit_params::ExplicitParameters};
2
2
  use serde::{Deserialize, Serialize};
3
3
  use serde_with::skip_serializing_none;
4
4
 
@@ -89,7 +89,7 @@ pub struct LayerEvaluationInitV2 {
89
89
  #[serde(rename = "ae")]
90
90
  pub allocated_experiment_name: Option<InternedString>,
91
91
  #[serde(rename = "ep")]
92
- pub explicit_parameters: Option<Vec<InternedString>>,
92
+ pub explicit_parameters: Option<ExplicitParameters>,
93
93
  #[serde(rename = "us")]
94
94
  pub undelegated_secondary_exposures: Option<Vec<InternedString>>,
95
95
  }
@@ -1,7 +1,9 @@
1
1
  use super::dynamic_returnable::DynamicReturnable;
2
- use crate::evaluation::evaluation_types::is_false;
3
2
  use crate::interned_string::InternedString;
4
3
  use crate::SecondaryExposure;
4
+ use crate::{
5
+ evaluation::evaluation_types::is_false, specs_response::explicit_params::ExplicitParameters,
6
+ };
5
7
  use serde::{Deserialize, Serialize};
6
8
 
7
9
  #[derive(Serialize, Deserialize, Clone)]
@@ -50,7 +52,7 @@ pub struct ExperimentEvaluationV2 {
50
52
  pub is_in_layer: bool,
51
53
 
52
54
  #[serde(skip_serializing_if = "Option::is_none")]
53
- pub explicit_parameters: Option<Vec<InternedString>>,
55
+ pub explicit_parameters: Option<ExplicitParameters>,
54
56
 
55
57
  #[serde(skip_serializing_if = "Option::is_none")]
56
58
  pub group_name: Option<InternedString>,
@@ -94,7 +96,7 @@ pub struct LayerEvaluationV2 {
94
96
 
95
97
  #[serde(skip_serializing_if = "Option::is_none")]
96
98
  pub allocated_experiment_name: Option<InternedString>,
97
- pub explicit_parameters: Vec<InternedString>,
99
+ pub explicit_parameters: ExplicitParameters,
98
100
  #[serde(skip_serializing_if = "Option::is_none")]
99
101
  pub undelegated_secondary_exposures: Option<Vec<InternedString>>,
100
102
  }
@@ -18,6 +18,7 @@ use crate::evaluation::evaluator_value::{EvaluatorValue, MemoizedEvaluatorValue}
18
18
  use crate::evaluation::get_unit_id::get_unit_id;
19
19
  use crate::evaluation::user_agent_parsing::UserAgentParser;
20
20
  use crate::interned_string::InternedString;
21
+ use crate::specs_response::explicit_params::ExplicitParameters;
21
22
  use crate::specs_response::spec_types::{Condition, Rule, Spec};
22
23
  use crate::{dyn_value, log_w, unwrap_or_return, ExperimentEvaluationOptions, StatsigErr};
23
24
 
@@ -102,7 +103,7 @@ impl Evaluator {
102
103
  }
103
104
 
104
105
  if let Some(explicit_params) = &spec.explicit_parameters {
105
- ctx.result.explicit_parameters = Some(explicit_params);
106
+ ctx.result.explicit_parameters = Some(explicit_params.clone());
106
107
  }
107
108
 
108
109
  if spec.use_new_layer_eval == Some(true) && matches!(spec_type, SpecType::Layer) {
@@ -135,7 +136,7 @@ impl Evaluator {
135
136
  ctx.result.json_value = Some(spec.default_value.clone());
136
137
  }
137
138
 
138
- ctx.result.rule_id = Some(&rule.id);
139
+ ctx.result.rule_id = Some(rule.id.clone());
139
140
  ctx.result.group_name = rule.group_name.clone();
140
141
  ctx.result.is_experiment_group = rule.is_experiment_group.unwrap_or(false);
141
142
  ctx.result.is_experiment_active = spec.is_active.unwrap_or(false);
@@ -146,8 +147,8 @@ impl Evaluator {
146
147
  ctx.result.bool_value = spec.default_value.get_bool() == Some(true);
147
148
  ctx.result.json_value = Some(spec.default_value.clone());
148
149
  ctx.result.rule_id = match spec.enabled {
149
- true => Some(&DEFAULT_RULE),
150
- false => Some(&DISABLED_RULE),
150
+ true => Some(DEFAULT_RULE.clone()),
151
+ false => Some(DISABLED_RULE.clone()),
151
152
  };
152
153
  ctx.finalize_evaluation(spec, None);
153
154
 
@@ -167,7 +168,7 @@ fn new_layer_eval<'a>(
167
168
  let mut value: HashMap<String, Value> = HashMap::new();
168
169
  let mut group_name: Option<InternedString> = None;
169
170
  let mut is_experiment_group = false;
170
- let mut explicit_parameters: Option<&Vec<InternedString>> = None;
171
+ let mut explicit_parameters: Option<ExplicitParameters> = None;
171
172
  let mut secondary_exposures: Vec<SecondaryExposure> = Vec::new();
172
173
  let mut undelegated_secondary_exposures: Vec<SecondaryExposure> = Vec::new();
173
174
 
@@ -223,7 +224,7 @@ fn new_layer_eval<'a>(
223
224
  group_name = ctx.result.group_name.clone();
224
225
  rule_id = Some(&rule.id);
225
226
  is_experiment_group = rule.is_experiment_group.unwrap_or(false);
226
- explicit_parameters = ctx.result.explicit_parameters;
227
+ explicit_parameters = ctx.result.explicit_parameters.clone();
227
228
  } else {
228
229
  update_parameter_values(
229
230
  &mut value,
@@ -242,7 +243,7 @@ fn new_layer_eval<'a>(
242
243
  ctx.result.bool_value = passed;
243
244
  ctx.result.config_delegate = delegate_name;
244
245
  ctx.result.group_name = group_name;
245
- ctx.result.rule_id = rule_id;
246
+ ctx.result.rule_id = rule_id.cloned();
246
247
  ctx.result.json_value = Some(DynamicReturnable::from_map(value));
247
248
  ctx.result.is_experiment_group = is_experiment_group;
248
249
  ctx.result.is_experiment_active = spec.is_active.unwrap_or(false);
@@ -326,7 +327,7 @@ fn try_apply_config_mapping(
326
327
  ctx.reset_result();
327
328
  let pass = evaluate_pass_percentage(ctx, rule, spec_salt);
328
329
  if pass {
329
- ctx.result.override_config_name = Some(&mapping.new_config_name);
330
+ ctx.result.override_config_name = Some(mapping.new_config_name.clone());
330
331
  match Evaluator::evaluate(ctx, mapping.new_config_name.as_str(), spec_type) {
331
332
  Ok(Recognition::Recognized) => {
332
333
  return true;
@@ -610,10 +611,10 @@ fn evaluate_nested_gate<'a>(
610
611
  .map(|name| &name.value)
611
612
  .unwrap_or(InternedString::empty_ref());
612
613
 
613
- match ctx.nested_gate_memo.get(gate_name.as_str()) {
614
+ match ctx.nested_gate_memo.get(gate_name) {
614
615
  Some((previous_bool, previous_rule_id)) => {
615
616
  ctx.result.bool_value = *previous_bool;
616
- ctx.result.rule_id = *previous_rule_id;
617
+ ctx.result.rule_id = previous_rule_id.clone();
617
618
  }
618
619
  None => {
619
620
  ctx.prep_for_nested_evaluation()?;
@@ -626,8 +627,8 @@ fn evaluate_nested_gate<'a>(
626
627
 
627
628
  if !gate_name.as_str().is_empty() {
628
629
  ctx.nested_gate_memo.insert(
629
- gate_name.as_str(),
630
- (ctx.result.bool_value, ctx.result.rule_id),
630
+ gate_name.clone(),
631
+ (ctx.result.bool_value, ctx.result.rule_id.clone()),
631
632
  );
632
633
  }
633
634
  }
@@ -638,7 +639,7 @@ fn evaluate_nested_gate<'a>(
638
639
  let expo = SecondaryExposure {
639
640
  gate: gate_name.clone(),
640
641
  gate_value: InternedString::from_bool(res.bool_value),
641
- rule_id: res.rule_id.unwrap_or(InternedString::empty_ref()).clone(),
642
+ rule_id: res.rule_id.clone().unwrap_or_default(),
642
643
  };
643
644
 
644
645
  if res.sampling_rate.is_none() {
@@ -670,7 +671,7 @@ fn evaluate_config_delegate<'a>(
670
671
  return Ok(false);
671
672
  }
672
673
 
673
- ctx.result.explicit_parameters = delegate_spec.inner.explicit_parameters.as_ref();
674
+ ctx.result.explicit_parameters = delegate_spec.inner.explicit_parameters.clone();
674
675
  ctx.result.config_delegate = rule.config_delegate.clone();
675
676
 
676
677
  Ok(true)
@@ -13,6 +13,9 @@ use crate::{OverrideAdapter, 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>)>;
18
+
16
19
  pub enum IdListResolution<'a> {
17
20
  MapLookup(&'a HashMap<String, IdList>),
18
21
  Callback(&'a dyn Fn(&str, &str) -> bool),
@@ -23,11 +26,11 @@ pub struct EvaluatorContext<'a> {
23
26
  pub specs_data: &'a SpecsResponseFull,
24
27
  pub id_list_resolver: IdListResolution<'a>,
25
28
  pub hashing: &'a HashUtil,
26
- pub result: EvaluatorResult<'a>,
29
+ pub result: EvaluatorResult,
27
30
  pub nested_count: u16,
28
31
  pub app_id: Option<&'a DynamicValue>,
29
32
  pub override_adapter: Option<&'a Arc<dyn OverrideAdapter>>,
30
- pub nested_gate_memo: HashMap<&'a str, (bool, Option<&'a InternedString>)>,
33
+ pub nested_gate_memo: NestedGateMemo,
31
34
  pub should_user_third_party_parser: bool,
32
35
  pub statsig: Option<&'a Statsig>,
33
36
  pub disable_exposure_logging: bool,
@@ -19,9 +19,10 @@ use crate::evaluation::evaluation_types_initialize_v2::{
19
19
  use crate::evaluation::secondary_exposure_key::SecondaryExposureKey;
20
20
  use crate::hashing::{HashAlgorithm, HashUtil};
21
21
  use crate::interned_string::InternedString;
22
+ use crate::specs_response::explicit_params::ExplicitParameters;
22
23
 
23
24
  #[derive(Default, Debug)]
24
- pub struct EvaluatorResult<'a> {
25
+ pub struct EvaluatorResult {
25
26
  pub name: Option<InternedString>,
26
27
  pub bool_value: bool,
27
28
  pub unsupported: bool,
@@ -31,18 +32,18 @@ pub struct EvaluatorResult<'a> {
31
32
  pub is_in_experiment: bool,
32
33
  pub id_type: Option<InternedString>,
33
34
  pub json_value: Option<DynamicReturnable>,
34
- pub rule_id: Option<&'a InternedString>,
35
+ pub rule_id: Option<InternedString>,
35
36
  pub rule_id_suffix: Option<&'static str>,
36
37
  pub group_name: Option<InternedString>,
37
- pub explicit_parameters: Option<&'a Vec<InternedString>>,
38
+ pub explicit_parameters: Option<ExplicitParameters>,
38
39
  pub config_delegate: Option<InternedString>,
39
40
  pub secondary_exposures: Vec<SecondaryExposure>,
40
41
  pub undelegated_secondary_exposures: Option<Vec<SecondaryExposure>>,
41
- pub override_reason: Option<&'a str>,
42
+ pub override_reason: Option<&'static str>,
42
43
  pub version: Option<u32>,
43
44
  pub sampling_rate: Option<u64>,
44
45
  pub forward_all_exposures: Option<bool>,
45
- pub override_config_name: Option<&'a str>,
46
+ pub override_config_name: Option<InternedString>,
46
47
  pub has_seen_analytical_gates: Option<bool>,
47
48
  pub parameter_rule_ids: Option<HashMap<InternedString, InternedString>>,
48
49
  }
@@ -105,7 +106,7 @@ pub fn result_to_experiment_eval(
105
106
  value: get_json_value(result),
106
107
  is_in_layer: result.is_in_layer,
107
108
  group_name: result.group_name.take(),
108
- explicit_parameters: result.explicit_parameters.cloned(),
109
+ explicit_parameters: result.explicit_parameters.clone(),
109
110
  is_experiment_active,
110
111
  is_user_in_experiment,
111
112
  undelegated_secondary_exposures: std::mem::take(
@@ -139,7 +140,7 @@ pub fn result_to_experiment_eval_v2(
139
140
  value: get_json_value(result),
140
141
  is_in_layer: result.is_in_layer,
141
142
  group_name: result.group_name.take(),
142
- explicit_parameters: result.explicit_parameters.cloned(),
143
+ explicit_parameters: result.explicit_parameters.clone(),
143
144
  is_experiment_active,
144
145
  is_user_in_experiment,
145
146
  undelegated_secondary_exposures: result.undelegated_secondary_exposures.clone(),
@@ -193,7 +194,7 @@ pub fn eval_result_to_experiment_eval(
193
194
  value: get_json_value(result),
194
195
  is_in_layer: result.is_in_layer,
195
196
  group_name: result.group_name.take(),
196
- explicit_parameters: result.explicit_parameters.cloned(),
197
+ explicit_parameters: result.explicit_parameters.clone(),
197
198
  is_experiment_active: Some(result.is_experiment_active),
198
199
  is_user_in_experiment: Some(result.is_experiment_group),
199
200
  undelegated_secondary_exposures: std::mem::take(
@@ -226,7 +227,7 @@ pub fn result_to_layer_eval(layer_name: &str, result: &mut EvaluatorResult) -> L
226
227
  is_experiment_active,
227
228
  is_user_in_experiment,
228
229
  allocated_experiment_name,
229
- explicit_parameters: result.explicit_parameters.cloned().unwrap_or_default(),
230
+ explicit_parameters: result.explicit_parameters.clone().unwrap_or_default(),
230
231
  undelegated_secondary_exposures: Some(undelegated_sec_expos.unwrap_or_default()),
231
232
  id_type: Some(id_type),
232
233
  parameter_rule_ids: result.parameter_rule_ids.clone(),
@@ -275,7 +276,7 @@ pub fn result_to_layer_eval_v2(
275
276
  is_experiment_active,
276
277
  is_user_in_experiment,
277
278
  allocated_experiment_name,
278
- explicit_parameters: result.explicit_parameters.cloned().unwrap_or_default(),
279
+ explicit_parameters: result.explicit_parameters.clone().unwrap_or_default(),
279
280
  undelegated_secondary_exposures: Some(undelegated_secondary_exposures),
280
281
  id_type: Some(id_type),
281
282
  }
@@ -328,7 +329,7 @@ pub fn result_to_layer_eval_init_v2(
328
329
  is_experiment_active,
329
330
  is_user_in_experiment,
330
331
  allocated_experiment_name,
331
- explicit_parameters: result.explicit_parameters.cloned(),
332
+ explicit_parameters: result.explicit_parameters.clone(),
332
333
  undelegated_secondary_exposures: mapped_exposures,
333
334
  }
334
335
  }
@@ -436,13 +437,13 @@ fn get_exposure_name_if_not_hashed(
436
437
  }
437
438
 
438
439
  fn result_to_base_eval(spec_name: &str, result: &mut EvaluatorResult) -> BaseEvaluation {
439
- let rule_id = create_suffixed_rule_id(result.rule_id, result.rule_id_suffix);
440
+ let rule_id = create_suffixed_rule_id(result.rule_id.as_ref(), result.rule_id_suffix);
440
441
 
441
442
  let exposure_info = ExtraExposureInfo {
442
443
  sampling_rate: result.sampling_rate,
443
444
  forward_all_exposures: result.forward_all_exposures,
444
445
  has_seen_analytical_gates: result.has_seen_analytical_gates,
445
- override_config_name: result.override_config_name.map(|s| s.to_string()),
446
+ override_config_name: result.override_config_name.clone(),
446
447
  version: result.version,
447
448
  };
448
449
 
@@ -474,7 +475,7 @@ fn result_to_base_eval_v2(
474
475
  exposures.push(hash.clone());
475
476
  }
476
477
 
477
- let rule_id = create_suffixed_rule_id(result.rule_id, result.rule_id_suffix);
478
+ let rule_id = create_suffixed_rule_id(result.rule_id.as_ref(), result.rule_id_suffix);
478
479
 
479
480
  BaseEvaluationV2 {
480
481
  name: spec_name.to_string(),
@@ -488,7 +489,7 @@ fn result_to_base_eval_init_v2(
488
489
  expo_id_to_exposure_map: &mut HashMap<InternedString, SecondaryExposure>,
489
490
  expo_key_to_expo_id_map: &mut AHashMap<SecondaryExposureKey, InternedString>,
490
491
  ) -> BaseEvaluationInitV2 {
491
- let rule_id = create_suffixed_rule_id(result.rule_id, result.rule_id_suffix);
492
+ let rule_id = create_suffixed_rule_id(result.rule_id.as_ref(), result.rule_id_suffix);
492
493
  let opt_rule_id = match rule_id.as_str() {
493
494
  "default" => None,
494
495
  _ => Some(rule_id),
@@ -542,13 +543,13 @@ fn create_suffixed_rule_id(
542
543
  rule_id: Option<&InternedString>,
543
544
  suffix: Option<&str>,
544
545
  ) -> InternedString {
545
- let id_arc = match &rule_id {
546
+ let rule_id_str = match rule_id {
546
547
  Some(rule_id) => rule_id.as_str(),
547
548
  None => "",
548
549
  };
549
550
 
550
551
  match &suffix {
551
- Some(suffix) => InternedString::from_str_parts(&[id_arc, ":", suffix]),
552
+ Some(suffix) => InternedString::from_str_parts(&[rule_id_str, ":", suffix]),
552
553
  None => rule_id.cloned().unwrap_or_default(),
553
554
  }
554
555
  }
@@ -3,6 +3,7 @@ pub mod queue;
3
3
  pub mod queued_config_expo;
4
4
  pub mod queued_event;
5
5
  pub mod queued_experiment_expo;
6
+ pub mod queued_expo;
6
7
  pub mod queued_gate_expo;
7
8
  pub mod queued_layer_param_expo;
8
9
  pub mod queued_passthrough;
@@ -7,6 +7,7 @@ use crate::{
7
7
  statsig_event::StatsigEvent,
8
8
  statsig_event_internal::{StatsigEventInternal, CONFIG_EXPOSURE_EVENT_NAME},
9
9
  },
10
+ interned_string::InternedString,
10
11
  statsig_types::DynamicConfig,
11
12
  user::{StatsigUserInternal, StatsigUserLoggable},
12
13
  EvaluationDetails, SecondaryExposure,
@@ -83,7 +84,7 @@ pub struct QueuedConfigExposureEvent {
83
84
  pub version: Option<u32>,
84
85
  pub exposure_trigger: ExposureTrigger,
85
86
  pub sampling_decision: EvtSamplingDecision,
86
- pub override_config_name: Option<String>,
87
+ pub override_config_name: Option<InternedString>,
87
88
  pub exposure_time: u64,
88
89
  }
89
90
 
@@ -106,7 +107,10 @@ impl QueuedConfigExposureEvent {
106
107
  }
107
108
 
108
109
  if let Some(override_config_name) = self.override_config_name {
109
- metadata.insert("overrideConfigName".into(), override_config_name);
110
+ metadata.insert(
111
+ "overrideConfigName".into(),
112
+ override_config_name.unperformant_to_string(),
113
+ );
110
114
  }
111
115
 
112
116
  let statsig_metadata = get_statsig_metadata_with_sampling_decision(self.sampling_decision);
@@ -1,6 +1,6 @@
1
1
  use super::{
2
2
  queued_config_expo::QueuedConfigExposureEvent,
3
- queued_experiment_expo::QueuedExperimentExposureEvent,
3
+ queued_experiment_expo::QueuedExperimentExposureEvent, queued_expo::QueuedExposureEvent,
4
4
  queued_gate_expo::QueuedGateExposureEvent,
5
5
  queued_layer_param_expo::QueuedLayerParamExposureEvent,
6
6
  };
@@ -24,21 +24,26 @@ pub trait QueuedExposure<'a> {
24
24
  }
25
25
 
26
26
  pub enum QueuedEvent {
27
+ Exposure(QueuedExposureEvent),
28
+ Passthrough(StatsigEventInternal),
29
+
30
+ // Deprecated - Remove when rolled into QueuedExposureEvent
27
31
  GateExposure(QueuedGateExposureEvent),
28
32
  ConfigExposure(QueuedConfigExposureEvent),
29
33
  ExperimentExposure(QueuedExperimentExposureEvent),
30
34
  LayerParamExposure(QueuedLayerParamExposureEvent),
31
- Passthrough(StatsigEventInternal),
32
35
  }
33
36
 
34
37
  impl QueuedEvent {
35
38
  pub fn into_statsig_event_internal(self) -> StatsigEventInternal {
36
39
  match self {
40
+ QueuedEvent::Exposure(event) => event.into_statsig_event_internal(),
41
+ QueuedEvent::Passthrough(event) => event,
42
+
37
43
  QueuedEvent::GateExposure(event) => event.into_statsig_event_internal(),
38
44
  QueuedEvent::ConfigExposure(event) => event.into_statsig_event_internal(),
39
45
  QueuedEvent::ExperimentExposure(event) => event.into_statsig_event_internal(),
40
46
  QueuedEvent::LayerParamExposure(event) => event.into_statsig_event_internal(),
41
- QueuedEvent::Passthrough(event) => event,
42
47
  }
43
48
  }
44
49
  }
@@ -7,6 +7,7 @@ use crate::{
7
7
  statsig_event::StatsigEvent,
8
8
  statsig_event_internal::{StatsigEventInternal, CONFIG_EXPOSURE_EVENT_NAME},
9
9
  },
10
+ interned_string::InternedString,
10
11
  statsig_types::Experiment,
11
12
  user::{StatsigUserInternal, StatsigUserLoggable},
12
13
  EvaluationDetails, SecondaryExposure,
@@ -86,7 +87,7 @@ pub struct QueuedExperimentExposureEvent {
86
87
  pub version: Option<u32>,
87
88
  pub exposure_trigger: ExposureTrigger,
88
89
  pub sampling_decision: EvtSamplingDecision,
89
- pub override_config_name: Option<String>,
90
+ pub override_config_name: Option<InternedString>,
90
91
  pub exposure_time: u64,
91
92
  }
92
93
 
@@ -105,7 +106,10 @@ impl QueuedExperimentExposureEvent {
105
106
  }
106
107
 
107
108
  if let Some(override_config_name) = self.override_config_name {
108
- metadata.insert("overrideConfigName".into(), override_config_name);
109
+ metadata.insert(
110
+ "overrideConfigName".into(),
111
+ override_config_name.unperformant_to_string(),
112
+ );
109
113
  }
110
114
 
111
115
  let statsig_metadata = get_statsig_metadata_with_sampling_decision(self.sampling_decision);