oai-statsig-python-core 0.25.0rc8__tar.gz → 0.26.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 (401) hide show
  1. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/Cargo.lock +7 -6
  2. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/Cargo.toml +1 -1
  3. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/PKG-INFO +1 -1
  4. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-pyo3/tests/test_data_store.py +6 -0
  5. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/Cargo.toml +2 -1
  6. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/evaluation/comparisons/compare_strings_in_array.rs +65 -1
  7. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/evaluation/evaluation_types.rs +4 -18
  8. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/evaluation/evaluation_types_initialize_v2.rs +17 -23
  9. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/evaluation/evaluation_types_v2.rs +59 -39
  10. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/evaluation/evaluator.rs +16 -9
  11. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/evaluation/evaluator_context.rs +1 -1
  12. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/evaluation/evaluator_result.rs +103 -0
  13. oai_statsig_python_core-0.26.0/statsig-rust/src/evaluation/user_agent_parsing/statsig_uaparser/__tests__/test_tokenizer_performance.rs +399 -0
  14. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/evaluation/user_agent_parsing/statsig_uaparser/tokenizer.rs +46 -2
  15. oai_statsig_python_core-0.26.0/statsig-rust/src/evaluation/user_agent_parsing/statsig_uaparser/window_iter.rs +65 -0
  16. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/gcir/dynamic_configs_processor.rs +1 -2
  17. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/gcir/evaluation_plan.rs +12 -1
  18. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/gcir/feature_gates_processor.rs +0 -1
  19. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/gcir/gcir_formatter.rs +91 -23
  20. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/gcir/gcir_process_iter.rs +173 -85
  21. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/gcir/layer_configs_processor.rs +0 -1
  22. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/gcir/mod.rs +1 -0
  23. oai_statsig_python_core-0.26.0/statsig-rust/src/gcir/secondary_exposure_hashing.rs +280 -0
  24. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/interned_string.rs +2 -2
  25. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/interned_values/interned_store.rs +295 -7
  26. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/tests/gcir_plan_expansion_bench.rs +13 -2
  27. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/tests/gcir_tests.rs +66 -1
  28. oai_statsig_python_core-0.26.0/statsig-rust/tests/substring_search_bench.rs +268 -0
  29. oai_statsig_python_core-0.25.0rc8/statsig-rust/src/evaluation/user_agent_parsing/statsig_uaparser/window_iter.rs +0 -51
  30. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/py_src/statsig_python_core/__init__.py +0 -0
  31. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/py_src/statsig_python_core/_frozen_json.py +0 -0
  32. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/py_src/statsig_python_core/data_store.py +0 -0
  33. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/py_src/statsig_python_core/error_boundary.py +0 -0
  34. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/py_src/statsig_python_core/evaluation_cache.py +0 -0
  35. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/py_src/statsig_python_core/event_logging_adapter.py +0 -0
  36. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/py_src/statsig_python_core/observability_client.py +0 -0
  37. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/py_src/statsig_python_core/output_logger_provider.py +0 -0
  38. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/py_src/statsig_python_core/persistent_storage.py +0 -0
  39. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/py_src/statsig_python_core/py.typed +0 -0
  40. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/py_src/statsig_python_core/requirements.txt +0 -0
  41. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/py_src/statsig_python_core/statsig.py +0 -0
  42. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/py_src/statsig_python_core/statsig_python_core.pyi +0 -0
  43. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/py_src/statsig_python_core/statsig_types.py +0 -0
  44. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/pyproject.toml +0 -0
  45. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-grpc/Cargo.toml +0 -0
  46. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-grpc/README.md +0 -0
  47. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-grpc/build.rs +0 -0
  48. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-grpc/src/lib.rs +0 -0
  49. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-grpc/src/mock_forward_proxy.rs +0 -0
  50. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-grpc/src/protos/statsig_forward_proxy.proto +0 -0
  51. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-grpc/src/statsig_forward_proxy.rs +0 -0
  52. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-grpc/src/statsig_grpc_client.rs +0 -0
  53. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-grpc/src/statsig_grpc_err.rs +0 -0
  54. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-pyo3/.github/workflows/CI.yml +0 -0
  55. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-pyo3/.gitignore +0 -0
  56. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-pyo3/Cargo.toml +0 -0
  57. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-pyo3/README.md +0 -0
  58. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-pyo3/benchmarks/dynamic_config_value_cache_benchmark.py +0 -0
  59. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-pyo3/benchmarks/user_creation_benchmark.py +0 -0
  60. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-pyo3/benchmarks/user_memory_benchmark.py +0 -0
  61. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-pyo3/src/bin/stub_gen.rs +0 -0
  62. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-pyo3/src/data_store_base_py.rs +0 -0
  63. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-pyo3/src/event_logging_adapter_base_py.rs +0 -0
  64. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-pyo3/src/interned_store_py.rs +0 -0
  65. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-pyo3/src/lib.rs +0 -0
  66. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-pyo3/src/observability_client_base_py.rs +0 -0
  67. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-pyo3/src/output_logger_provider_base_py.rs +0 -0
  68. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-pyo3/src/pyo_utils.rs +0 -0
  69. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-pyo3/src/raw_evaluation_compat_py.rs +0 -0
  70. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-pyo3/src/safe_gil.rs +0 -0
  71. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-pyo3/src/statsig_base_py.rs +0 -0
  72. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-pyo3/src/statsig_metadata_py.rs +0 -0
  73. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-pyo3/src/statsig_options_py.rs +0 -0
  74. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-pyo3/src/statsig_persistent_storage_override_adapter_py.rs +0 -0
  75. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-pyo3/src/statsig_types_py.rs +0 -0
  76. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-pyo3/src/statsig_user_py.rs +0 -0
  77. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-pyo3/src/unit_id_py.rs +0 -0
  78. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-pyo3/src/valid_primitives_py.rs +0 -0
  79. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-pyo3/tests/event_listener_reentrancy_subprocess.py +0 -0
  80. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-pyo3/tests/fork_runner.py +0 -0
  81. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-pyo3/tests/mock_output_logger.py +0 -0
  82. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-pyo3/tests/mock_scrapi.py +0 -0
  83. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-pyo3/tests/profile_util.py +0 -0
  84. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-pyo3/tests/shutdown_sub_proc.py +0 -0
  85. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-pyo3/tests/test_bulk_evaluate_gcir_parity.py +0 -0
  86. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-pyo3/tests/test_error_boundary.py +0 -0
  87. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-pyo3/tests/test_evaluation_cache.py +0 -0
  88. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-pyo3/tests/test_evaluation_cache_integration.py +0 -0
  89. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-pyo3/tests/test_evaluation_cache_pyo3.py +0 -0
  90. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-pyo3/tests/test_event_logging_adapter.py +0 -0
  91. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-pyo3/tests/test_experiment_serialization.py +0 -0
  92. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-pyo3/tests/test_exposure_logging.py +0 -0
  93. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-pyo3/tests/test_feature_gate_serialization.py +0 -0
  94. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-pyo3/tests/test_forking.py +0 -0
  95. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-pyo3/tests/test_frozen_json.py +0 -0
  96. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-pyo3/tests/test_get_dynamic_config.py +0 -0
  97. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-pyo3/tests/test_initialize_with_details.py +0 -0
  98. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-pyo3/tests/test_interned_store_preload.py +0 -0
  99. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-pyo3/tests/test_layer_param_exposure_sampling.py +0 -0
  100. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-pyo3/tests/test_layer_serialization.py +0 -0
  101. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-pyo3/tests/test_observability_client.py +0 -0
  102. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-pyo3/tests/test_output_logger_provider.py +0 -0
  103. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-pyo3/tests/test_override_adapter.py +0 -0
  104. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-pyo3/tests/test_performance.py +0 -0
  105. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-pyo3/tests/test_sdk_event_emitter.py +0 -0
  106. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-pyo3/tests/test_sec_expo_as_primary.py +0 -0
  107. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-pyo3/tests/test_shared_statsig.py +0 -0
  108. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-pyo3/tests/test_shutdown.py +0 -0
  109. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-pyo3/tests/test_statsig.py +0 -0
  110. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-pyo3/tests/test_statsig_options.py +0 -0
  111. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-pyo3/tests/test_statsig_user.py +0 -0
  112. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-pyo3/tests/test_statsig_user_json_serialization.py +0 -0
  113. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-pyo3/tests/test_statsig_user_none_fields.py +0 -0
  114. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-pyo3/tests/test_statsig_user_pickle.py +0 -0
  115. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-pyo3/tests/test_user_exposure_e2e.py +0 -0
  116. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-pyo3/tests/utils.py +0 -0
  117. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/build.rs +0 -0
  118. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/resources/ip_supalite.table +0 -0
  119. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/resources/ua_parser_regex.yaml +0 -0
  120. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/resources/ua_parser_regex_lite.yaml +0 -0
  121. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/__tests__/interned_string_tests.rs +0 -0
  122. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/__tests__/mod.rs +0 -0
  123. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/__tests__/spec_store_tests.rs +0 -0
  124. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/__tests__/statsig_options_tests.rs +0 -0
  125. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/__tests__/user_value_tests.rs +0 -0
  126. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/compression/compression_helper.rs +0 -0
  127. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/compression/mod.rs +0 -0
  128. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/console_capture/console_capture_handler.rs +0 -0
  129. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/console_capture/console_capture_instances.rs +0 -0
  130. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/console_capture/console_capture_options.rs +0 -0
  131. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/console_capture/console_log_line_levels.rs +0 -0
  132. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/console_capture/mod.rs +0 -0
  133. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/data_store_interface.rs +0 -0
  134. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/dcs_str.rs +0 -0
  135. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/evaluation/__tests__/dynamic_returnable_tests.rs +0 -0
  136. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/evaluation/__tests__/mod.rs +0 -0
  137. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/evaluation/__tests__/rkyv_value_tests.rs +0 -0
  138. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/evaluation/cmab_evaluator.rs +0 -0
  139. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/evaluation/comparisons/compare_arrays.rs +0 -0
  140. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/evaluation/comparisons/compare_numbers.rs +0 -0
  141. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/evaluation/comparisons/compare_str_with_regex.rs +0 -0
  142. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/evaluation/comparisons/compare_time.rs +0 -0
  143. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/evaluation/comparisons/compare_versions.rs +0 -0
  144. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/evaluation/comparisons/mod.rs +0 -0
  145. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/evaluation/country_lookup.rs +0 -0
  146. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/evaluation/dynamic_returnable.rs +0 -0
  147. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/evaluation/dynamic_string.rs +0 -0
  148. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/evaluation/dynamic_value.rs +0 -0
  149. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/evaluation/evaluation_details.rs +0 -0
  150. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/evaluation/evaluator_value.rs +0 -0
  151. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/evaluation/get_unit_id.rs +0 -0
  152. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/evaluation/mod.rs +0 -0
  153. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/evaluation/rkyv_value.rs +0 -0
  154. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/evaluation/secondary_exposure_key.rs +0 -0
  155. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/evaluation/user_agent_parsing/first_party_ua_parser.rs +0 -0
  156. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/evaluation/user_agent_parsing/mod.rs +0 -0
  157. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/evaluation/user_agent_parsing/statsig_uaparser/__tests__/mod.rs +0 -0
  158. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/evaluation/user_agent_parsing/statsig_uaparser/__tests__/test_helpers.rs +0 -0
  159. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/evaluation/user_agent_parsing/statsig_uaparser/__tests__/test_tokenizer.rs +0 -0
  160. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/evaluation/user_agent_parsing/statsig_uaparser/__tests__/test_ua_parser_browser.rs +0 -0
  161. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/evaluation/user_agent_parsing/statsig_uaparser/__tests__/test_ua_parser_os.rs +0 -0
  162. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/evaluation/user_agent_parsing/statsig_uaparser/mod.rs +0 -0
  163. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/evaluation/user_agent_parsing/statsig_uaparser/ua_parser.rs +0 -0
  164. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/evaluation/user_agent_parsing/third_party_ua_parser.rs +0 -0
  165. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/evaluation/user_agent_parsing/ua_parser.rs +0 -0
  166. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/event_emitter/statsig_event_emitter_tests.rs +0 -0
  167. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/event_logging/delayed_exposure_store.rs +0 -0
  168. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/event_logging/event_logger.rs +0 -0
  169. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/event_logging/event_logger_constants.rs +0 -0
  170. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/event_logging/event_logger_ops_stats.rs +0 -0
  171. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/event_logging/event_queue/batch.rs +0 -0
  172. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/event_logging/event_queue/mod.rs +0 -0
  173. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/event_logging/event_queue/queue.rs +0 -0
  174. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/event_logging/event_queue/queued_config_expo.rs +0 -0
  175. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/event_logging/event_queue/queued_event.rs +0 -0
  176. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/event_logging/event_queue/queued_experiment_expo.rs +0 -0
  177. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/event_logging/event_queue/queued_expo.rs +0 -0
  178. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/event_logging/event_queue/queued_gate_expo.rs +0 -0
  179. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/event_logging/event_queue/queued_layer_param_expo.rs +0 -0
  180. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/event_logging/event_queue/queued_passthrough.rs +0 -0
  181. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/event_logging/event_queue/queued_secondary_expo.rs +0 -0
  182. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/event_logging/exposure_sampling.rs +0 -0
  183. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/event_logging/exposure_utils.rs +0 -0
  184. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/event_logging/flush_interval.rs +0 -0
  185. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/event_logging/flush_type.rs +0 -0
  186. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/event_logging/mod.rs +0 -0
  187. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/event_logging/sec_expo_as_primary_experiment.rs +0 -0
  188. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/event_logging/statsig_event.rs +0 -0
  189. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/event_logging/statsig_event_internal.rs +0 -0
  190. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/event_logging_adapter/event_logging_adapter_trait.rs +0 -0
  191. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/event_logging_adapter/log_event_payload.rs +0 -0
  192. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/event_logging_adapter/mod.rs +0 -0
  193. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/event_logging_adapter/statsig_http_event_logging_adapter.rs +0 -0
  194. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/event_logging_adapter/statsig_local_file_event_logging_adapter.rs +0 -0
  195. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/gcir/gcir_options.rs +0 -0
  196. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/gcir/param_stores_processor.rs +0 -0
  197. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/gcir/stringify_sec_exposures.rs +0 -0
  198. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/gcir/target_app_id_utils.rs +0 -0
  199. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/gcir/timing.rs +0 -0
  200. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/global_configs.rs +0 -0
  201. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/hashing/ahash.rs +0 -0
  202. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/hashing/djb2.rs +0 -0
  203. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/hashing/hash_util.rs +0 -0
  204. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/hashing/memo_sha_256.rs +0 -0
  205. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/hashing/mod.rs +0 -0
  206. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/id_lists_adapter/id_list.rs +0 -0
  207. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/id_lists_adapter/id_lists_adapter_trait.rs +0 -0
  208. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/id_lists_adapter/mod.rs +0 -0
  209. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/id_lists_adapter/statsig_http_id_lists_adapter.rs +0 -0
  210. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/init_details.rs +0 -0
  211. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/initialize_evaluations_response.rs +0 -0
  212. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/initialize_response.rs +0 -0
  213. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/initialize_v2_response.rs +0 -0
  214. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/instance_registry.rs +0 -0
  215. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/interned_values/__tests__/fixtures/interned_store_v1.mmap +0 -0
  216. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/interned_values/__tests__/interned_store_eval_value_tests.rs +0 -0
  217. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/interned_values/__tests__/interned_store_mmap_fetch_tests.rs +0 -0
  218. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/interned_values/__tests__/interned_store_returnable_tests.rs +0 -0
  219. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/interned_values/__tests__/interned_store_string_tests.rs +0 -0
  220. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/interned_values/__tests__/mod.rs +0 -0
  221. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/interned_values/mod.rs +0 -0
  222. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/lib.rs +0 -0
  223. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/logging_utils.rs +0 -0
  224. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/macros.rs +0 -0
  225. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/networking/__tests__/mod.rs +0 -0
  226. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/networking/__tests__/response_data_tests.rs +0 -0
  227. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/networking/http_types.rs +0 -0
  228. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/networking/mod.rs +0 -0
  229. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/networking/network_client.rs +0 -0
  230. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/networking/network_error.rs +0 -0
  231. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/networking/providers/mod.rs +0 -0
  232. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/networking/providers/net_provider_global.rs +0 -0
  233. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/networking/providers/net_provider_noop.rs +0 -0
  234. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/networking/providers/net_provider_reqwest.rs +0 -0
  235. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/networking/proxy_config.rs +0 -0
  236. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/observability/console_capture_observer.rs +0 -0
  237. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/observability/diagnostics_observer.rs +0 -0
  238. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/observability/mod.rs +0 -0
  239. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/observability/observability_client_adapter.rs +0 -0
  240. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/observability/ops_stats.rs +0 -0
  241. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/observability/sdk_errors_observer.rs +0 -0
  242. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/output_logger.rs +0 -0
  243. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/override_adapter/mod.rs +0 -0
  244. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/override_adapter/override_adapter_trait.rs +0 -0
  245. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/override_adapter/statsig_local_override_adapter.rs +0 -0
  246. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/persistent_storage/__tests__/mod.rs +0 -0
  247. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/persistent_storage/__tests__/sticky_values_serialization_tests.rs +0 -0
  248. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/persistent_storage/mod.rs +0 -0
  249. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/persistent_storage/persistent_storage_trait.rs +0 -0
  250. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/persistent_storage/persistent_values_manager.rs +0 -0
  251. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/sdk_diagnostics/diagnostics.rs +0 -0
  252. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/sdk_diagnostics/diagnostics_utils.rs +0 -0
  253. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/sdk_diagnostics/marker.rs +0 -0
  254. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/sdk_diagnostics/mod.rs +0 -0
  255. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/sdk_event_emitter/event_emitter.rs +0 -0
  256. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/sdk_event_emitter/event_emitter_tests.rs +0 -0
  257. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/sdk_event_emitter/event_types.rs +0 -0
  258. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/sdk_event_emitter/mod.rs +0 -0
  259. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/spec_store.rs +0 -0
  260. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/specs_adapter/config_spec_background_sync_metrics.rs +0 -0
  261. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/specs_adapter/mod.rs +0 -0
  262. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/specs_adapter/response_format.rs +0 -0
  263. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/specs_adapter/specs_adapter_trait.rs +0 -0
  264. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/specs_adapter/statsig_bootstrap_specs_adapter.rs +0 -0
  265. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/specs_adapter/statsig_customized_specs_adapter.rs +0 -0
  266. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/specs_adapter/statsig_data_store_specs_adapter.rs +0 -0
  267. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/specs_adapter/statsig_grpc_specs_adapter.rs +0 -0
  268. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/specs_adapter/statsig_http_specs_adapter.rs +0 -0
  269. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/specs_adapter/statsig_local_file_specs_adapter.rs +0 -0
  270. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/specs_response/__tests__/mod.rs +0 -0
  271. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/specs_response/__tests__/proto_specs_syncing_tests.rs +0 -0
  272. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/specs_response/__tests__/proto_specs_unknown_tests.rs +0 -0
  273. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/specs_response/__tests__/proto_specs_vs_json_tests.rs +0 -0
  274. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/specs_response/__tests__/proto_stream_reader_tests.rs +0 -0
  275. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/specs_response/cmab_types.rs +0 -0
  276. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/specs_response/explicit_params.rs +0 -0
  277. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/specs_response/mod.rs +0 -0
  278. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/specs_response/param_store_types.rs +0 -0
  279. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/specs_response/proto_specs.rs +0 -0
  280. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/specs_response/proto_stream_reader.rs +0 -0
  281. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/specs_response/spec_types.rs +0 -0
  282. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/specs_response/specs_hash_map.rs +0 -0
  283. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/specs_response/statsig_config_specs.rs +0 -0
  284. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/statsig.rs +0 -0
  285. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/statsig_core_api_options.rs +0 -0
  286. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/statsig_err.rs +0 -0
  287. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/statsig_global.rs +0 -0
  288. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/statsig_metadata.rs +0 -0
  289. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/statsig_options.rs +0 -0
  290. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/statsig_runtime.rs +0 -0
  291. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/statsig_type_factories.rs +0 -0
  292. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/statsig_types.rs +0 -0
  293. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/statsig_types_raw.rs +0 -0
  294. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/user/fast_statsig_user.rs +0 -0
  295. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/user/into_optional.rs +0 -0
  296. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/user/mod.rs +0 -0
  297. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/user/statsig_user.rs +0 -0
  298. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/user/statsig_user_builder.rs +0 -0
  299. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/user/statsig_user_internal.rs +0 -0
  300. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/user/statsig_user_loggable.rs +0 -0
  301. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/user/unit_id.rs +0 -0
  302. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/user/user_data.rs +0 -0
  303. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/user/user_value.rs +0 -0
  304. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/utils/mod.rs +0 -0
  305. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/src/value_parsing.rs +0 -0
  306. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/tests/check_gate_tests.rs +0 -0
  307. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/tests/customized_specs_adapter_tests.rs +0 -0
  308. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/tests/data/big_number_dcs.json +0 -0
  309. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/tests/data/check_gate_perf_dcs.json +0 -0
  310. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/tests/data/company_id_list +0 -0
  311. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/tests/data/dcs_error.json +0 -0
  312. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/tests/data/dcs_missing_gates.json +0 -0
  313. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/tests/data/dcs_non_case_sensitive.json +0 -0
  314. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/tests/data/dcs_user_agent_versions.json +0 -0
  315. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/tests/data/dcs_with_analytical_exposure_sampling.json +0 -0
  316. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/tests/data/dcs_with_checksum.json +0 -0
  317. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/tests/data/dcs_with_sampling.json +0 -0
  318. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/tests/data/dcs_with_sdk_configs.json +0 -0
  319. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/tests/data/demo_proj_dcs.json +0 -0
  320. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/tests/data/demo_proj_dcs.pb.br +0 -0
  321. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/tests/data/eval_proj_dcs.json +0 -0
  322. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/tests/data/eval_proj_dcs.pb.br +0 -0
  323. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/tests/data/get_id_lists.json +0 -0
  324. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/tests/data/perf_proj_dcs.json +0 -0
  325. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/tests/data/perf_proj_dcs.pb.br +0 -0
  326. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/tests/data/shared_dict_dict_only.json +0 -0
  327. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/tests/data/shared_dict_original_dcs.json +0 -0
  328. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/tests/data/shared_dict_response_uncompressed.json +0 -0
  329. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/tests/data/shared_dict_response_with_dict.json +0 -0
  330. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/tests/data/shared_dict_response_without_dict.json +0 -0
  331. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/tests/data/test_must_pass_user_agents.txt +0 -0
  332. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/tests/data/test_user_agents.txt +0 -0
  333. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/tests/data/ua_string_cases.json +0 -0
  334. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/tests/data/unknown_enum.pb.br +0 -0
  335. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/tests/data_store_bytes_adapter_tests.rs +0 -0
  336. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/tests/data_store_json_bytes_tests.rs +0 -0
  337. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/tests/data_store_json_only_no_bytes_methods_tests.rs +0 -0
  338. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/tests/data_store_lock_tests.rs +0 -0
  339. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/tests/data_store_proto_bytes_tests.rs +0 -0
  340. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/tests/delayed_exposure_bench.rs +0 -0
  341. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/tests/direct_gcir_tests.rs +0 -0
  342. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/tests/dynamic_string_tests.rs +0 -0
  343. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/tests/dynamic_value_tests.rs +0 -0
  344. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/tests/evaluation_details_tests.rs +0 -0
  345. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/tests/evaluator_value_tests.rs +0 -0
  346. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/tests/event_logger_failing_flush_tests.rs +0 -0
  347. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/tests/event_logger_flush_tests.rs +0 -0
  348. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/tests/event_logger_high_qps_tests.rs +0 -0
  349. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/tests/event_logger_usage_tests.rs +0 -0
  350. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/tests/expected_evaluation_tests.rs +0 -0
  351. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/tests/exposure_sampling_key_tests.rs +0 -0
  352. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/tests/exposure_tests.rs +0 -0
  353. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/tests/flushing_tests.rs +0 -0
  354. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/tests/gate_inversion_eval_tests.rs +0 -0
  355. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/tests/global_configs_test.rs +0 -0
  356. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/tests/grpc_specs_adapter_tests.rs +0 -0
  357. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/tests/hash_util_evaluation_hash_tests.rs +0 -0
  358. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/tests/http_specs_adapter_tests.rs +0 -0
  359. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/tests/initialize_timeout_test.rs +0 -0
  360. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/tests/instance_registry_tests.rs +0 -0
  361. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/tests/layer_serialization_tests.rs +0 -0
  362. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/tests/list_methods_tests.rs +0 -0
  363. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/tests/network_client_streaming_tests.rs +0 -0
  364. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/tests/network_client_tests.rs +0 -0
  365. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/tests/network_failure_tests.rs +0 -0
  366. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/tests/observability_client_usage_tests.rs +0 -0
  367. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/tests/output_logger_tests.rs +0 -0
  368. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/tests/override_adapter_tests.rs +0 -0
  369. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/tests/perf_tests.rs +0 -0
  370. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/tests/proto_specs_usage_tests.rs +0 -0
  371. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/tests/spec_store_lock_tests.rs +0 -0
  372. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/tests/spec_types_tests.rs +0 -0
  373. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/tests/statsig_disable_network_tests.rs +0 -0
  374. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/tests/statsig_environment_tests.rs +0 -0
  375. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/tests/statsig_event_emitter_usage_test.rs +0 -0
  376. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/tests/statsig_global_tests.rs +0 -0
  377. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/tests/statsig_local_file_event_logging_adapter_tests.rs +0 -0
  378. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/tests/statsig_local_file_specs_adapter_tests.rs +0 -0
  379. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/tests/statsig_options_tests.rs +0 -0
  380. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/tests/statsig_shared_tests.rs +0 -0
  381. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/tests/statsig_tests.rs +0 -0
  382. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/tests/statsig_user_builder_tests.rs +0 -0
  383. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/tests/statsig_user_field_accessor_tests.rs +0 -0
  384. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/tests/statsig_user_internal_tests.rs +0 -0
  385. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/tests/statsig_user_loggable_tests.rs +0 -0
  386. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/tests/statsig_user_tests.rs +0 -0
  387. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/tests/syncing_network_failure_tests.rs +0 -0
  388. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/tests/typed_getters_tests.rs +0 -0
  389. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/tests/ua_parser_util_test.rs +0 -0
  390. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/tests/user_agent_tests_first_party.rs +0 -0
  391. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/tests/user_json_tests.rs +0 -0
  392. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/tests/utils/env_var_guard.rs +0 -0
  393. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/tests/utils/helpers.rs +0 -0
  394. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/tests/utils/mock_data_store.rs +0 -0
  395. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/tests/utils/mock_event_logging_adapter.rs +0 -0
  396. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/tests/utils/mock_log_provider.rs +0 -0
  397. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/tests/utils/mock_observability_client.rs +0 -0
  398. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/tests/utils/mock_scrapi.rs +0 -0
  399. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/tests/utils/mock_specs_adapter.rs +0 -0
  400. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/tests/utils/mock_specs_listener.rs +0 -0
  401. {oai_statsig_python_core-0.25.0rc8 → oai_statsig_python_core-0.26.0}/statsig-rust/tests/utils/mod.rs +0 -0
@@ -1722,7 +1722,7 @@ dependencies = [
1722
1722
 
1723
1723
  [[package]]
1724
1724
  name = "oai-statsig-grpc"
1725
- version = "0.25.0-rc.8"
1725
+ version = "0.26.0"
1726
1726
  dependencies = [
1727
1727
  "async-trait",
1728
1728
  "chrono",
@@ -1737,7 +1737,7 @@ dependencies = [
1737
1737
 
1738
1738
  [[package]]
1739
1739
  name = "oai-statsig-rust"
1740
- version = "0.25.0-rc.8"
1740
+ version = "0.26.0"
1741
1741
  dependencies = [
1742
1742
  "ahash",
1743
1743
  "arc-swap",
@@ -1756,6 +1756,7 @@ dependencies = [
1756
1756
  "lazy_static",
1757
1757
  "libc",
1758
1758
  "log",
1759
+ "memchr",
1759
1760
  "memmap2",
1760
1761
  "mockito",
1761
1762
  "more-asserts",
@@ -3011,7 +3012,7 @@ checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f"
3011
3012
 
3012
3013
  [[package]]
3013
3014
  name = "statsig-node"
3014
- version = "0.25.0-rc.8"
3015
+ version = "0.26.0"
3015
3016
  dependencies = [
3016
3017
  "async-trait",
3017
3018
  "napi",
@@ -3026,7 +3027,7 @@ dependencies = [
3026
3027
 
3027
3028
  [[package]]
3028
3029
  name = "statsig-pyo3"
3029
- version = "0.25.0-rc.8"
3030
+ version = "0.26.0"
3030
3031
  dependencies = [
3031
3032
  "async-trait",
3032
3033
  "lazy_static",
@@ -3041,7 +3042,7 @@ dependencies = [
3041
3042
 
3042
3043
  [[package]]
3043
3044
  name = "statsig_elixir"
3044
- version = "0.25.0-rc.8"
3045
+ version = "0.26.0"
3045
3046
  dependencies = [
3046
3047
  "async-trait",
3047
3048
  "oai-statsig-rust",
@@ -3054,7 +3055,7 @@ dependencies = [
3054
3055
 
3055
3056
  [[package]]
3056
3057
  name = "statsig_ffi"
3057
- version = "0.25.0-rc.8"
3058
+ version = "0.26.0"
3058
3059
  dependencies = [
3059
3060
  "async-trait",
3060
3061
  "cbindgen",
@@ -26,7 +26,7 @@ exclude = [
26
26
  [workspace.package]
27
27
  edition = "2021"
28
28
  license = "ISC"
29
- version = "0.25.0-rc.8"
29
+ version = "0.26.0"
30
30
  homepage = "https://statsig.com/"
31
31
  authors = ["Statsig", "Daniel Loomb <daniel@statsig.com>"]
32
32
  readme = "README.md"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: oai_statsig_python_core
3
- Version: 0.25.0rc8
3
+ Version: 0.26.0
4
4
  Classifier: Programming Language :: Rust
5
5
  Classifier: Programming Language :: Python :: Implementation :: CPython
6
6
  Classifier: Programming Language :: Python :: Implementation :: PyPy
@@ -222,6 +222,12 @@ def test_data_store_usage_get(statsig_setup):
222
222
  assert gate.details.reason == "Adapter(DataStore):Recognized"
223
223
  assert gate.value == True
224
224
  assert gate.details.lcut == known_lcut
225
+
226
+ for _ in range(100):
227
+ if data_store.get_called_count >= 2:
228
+ break
229
+ sleep(0.05)
230
+
225
231
  assert data_store.get_called_count > 1
226
232
 
227
233
 
@@ -23,6 +23,7 @@ futures = "0.3.30"
23
23
  indexmap = { version = "2.13.0", features = ["serde"], optional = true }
24
24
  lazy_static = "1.5.0"
25
25
  log = "0.4.22"
26
+ memchr = "2.7.4"
26
27
  parking_lot = "0.12.1"
27
28
  percent-encoding = "2.3.1"
28
29
  rand = "0.8.4"
@@ -43,7 +44,7 @@ serde_json = { version = "1.0.143", features = [
43
44
  ] }
44
45
  serde_with = "3.4.0"
45
46
  sha2 = "0.10.8"
46
- oai-statsig-grpc = { path = "../statsig-grpc", version = "0.25.0-rc.8", optional = true }
47
+ oai-statsig-grpc = { path = "../statsig-grpc", version = "0.26.0", optional = true }
47
48
  simple_logger = { version = "5.0.0" }
48
49
  tempfile = "3.8.1"
49
50
  tokio = { version = "1.39.1", features = ["full"] }
@@ -88,7 +88,7 @@ fn compare_strings_in_array_impl(
88
88
  ConditionOperator::StrStartsWithAny => left.starts_with(right.as_str()),
89
89
  ConditionOperator::StrEndsWithAny => left.ends_with(right.as_str()),
90
90
  ConditionOperator::StrContainsAny | ConditionOperator::StrContainsNone => {
91
- left.contains(right.as_str())
91
+ contains_substring(left, right.as_str())
92
92
  }
93
93
  _ => false, // todo: unsupported?
94
94
  };
@@ -101,6 +101,15 @@ fn compare_strings_in_array_impl(
101
101
  comparison_result
102
102
  }
103
103
 
104
+ #[inline]
105
+ fn contains_substring(haystack: &str, needle: &str) -> bool {
106
+ if needle.len() <= 1 {
107
+ return haystack.contains(needle);
108
+ }
109
+
110
+ memchr::memmem::find(haystack.as_bytes(), needle.as_bytes()).is_some()
111
+ }
112
+
104
113
  #[cfg(test)]
105
114
  mod tests {
106
115
  use serde_json::json;
@@ -180,6 +189,61 @@ mod tests {
180
189
  ));
181
190
  }
182
191
 
192
+ #[test]
193
+ fn test_str_contains_none() {
194
+ let value = dyn_value!("daniel@statsig.io");
195
+ let matching_targets = test_only_make_eval_value!(vec!["@example.com", "@statsig.io"]);
196
+ let missing_targets = test_only_make_eval_value!(vec!["@example.com", "@statsig.com"]);
197
+
198
+ assert!(!compare_strings_in_array(
199
+ (&value).into(),
200
+ &matching_targets,
201
+ ConditionOperator::StrContainsNone
202
+ ));
203
+ assert!(compare_strings_in_array(
204
+ (&value).into(),
205
+ &missing_targets,
206
+ ConditionOperator::StrContainsNone
207
+ ));
208
+ }
209
+
210
+ #[test]
211
+ fn test_substring_search_matches_std_for_utf8_and_edge_cases() {
212
+ let haystacks = [
213
+ "",
214
+ "a",
215
+ "daniel@statsig.io",
216
+ "café au lait",
217
+ "東京都",
218
+ "a💖b",
219
+ "Straße",
220
+ "embedded\0null",
221
+ ];
222
+ let needles = [
223
+ "",
224
+ "a",
225
+ "@statsig.io",
226
+ "@example.com",
227
+ "é",
228
+ "京",
229
+ "💖",
230
+ "ss",
231
+ "ß",
232
+ "\0",
233
+ "null",
234
+ ];
235
+
236
+ for haystack in haystacks {
237
+ for needle in needles {
238
+ assert_eq!(
239
+ super::contains_substring(haystack, needle),
240
+ haystack.contains(needle),
241
+ "haystack={haystack:?}, needle={needle:?}"
242
+ );
243
+ }
244
+ }
245
+ }
246
+
183
247
  #[test]
184
248
  fn test_str_none_case_sensitive() {
185
249
  let haystack = test_only_make_eval_value!(vec!["HELLO", "WORLD"]);
@@ -342,32 +342,18 @@ fn hash_parameter_rule_ids(parameter_rule_ids: &HashMap<InternedString, Interned
342
342
  param_rule_ids_hash.finish()
343
343
  }
344
344
 
345
- pub(crate) fn push_optional_version_hash_values(hash_array: &mut Vec<u64>, version: &Option<u32>) {
346
- hash_array.push(version.is_some() as u64);
347
- hash_array.push(version.map_or(0, u64::from));
348
- }
349
-
350
345
  fn optional_version_hash_values(version: &Option<u32>) -> [u64; 2] {
351
346
  [version.is_some() as u64, version.map_or(0, u64::from)]
352
347
  }
353
348
 
354
349
  #[cfg(test)]
355
350
  mod tests {
356
- use super::push_optional_version_hash_values;
351
+ use super::optional_version_hash_values;
357
352
 
358
353
  #[test]
359
354
  fn optional_version_hash_values_distinguish_missing_from_zero() {
360
- let mut missing = Vec::new();
361
- push_optional_version_hash_values(&mut missing, &None);
362
-
363
- let mut zero = Vec::new();
364
- push_optional_version_hash_values(&mut zero, &Some(0));
365
-
366
- let mut one = Vec::new();
367
- push_optional_version_hash_values(&mut one, &Some(1));
368
-
369
- assert_eq!(missing, vec![0, 0]);
370
- assert_eq!(zero, vec![1, 0]);
371
- assert_eq!(one, vec![1, 1]);
355
+ assert_eq!(optional_version_hash_values(&None), [0, 0]);
356
+ assert_eq!(optional_version_hash_values(&Some(0)), [1, 0]);
357
+ assert_eq!(optional_version_hash_values(&Some(1)), [1, 1]);
372
358
  }
373
359
  }
@@ -30,7 +30,7 @@ pub struct GateEvaluationInitV2 {
30
30
 
31
31
  impl GCIRHashable for GateEvaluationInitV2 {
32
32
  fn create_hash(&self, name: &InternedString) -> u64 {
33
- let hash_array = vec![
33
+ let hash_array = [
34
34
  name.hash,
35
35
  match self.value {
36
36
  Some(true) => 1,
@@ -42,7 +42,7 @@ impl GCIRHashable for GateEvaluationInitV2 {
42
42
  },
43
43
  hash_secondary_exposures(&self.base.secondary_exposures),
44
44
  ];
45
- hashing::hash_one(hash_array)
45
+ hashing::hash_u64_slice(&hash_array)
46
46
  }
47
47
  }
48
48
 
@@ -62,7 +62,7 @@ pub struct DynamicConfigEvaluationInitV2 {
62
62
 
63
63
  impl GCIRHashable for DynamicConfigEvaluationInitV2 {
64
64
  fn create_hash(&self, name: &InternedString) -> u64 {
65
- let hash_array = vec![
65
+ let hash_array = [
66
66
  name.hash,
67
67
  self.value.hash,
68
68
  match self.base.rule_id {
@@ -72,7 +72,7 @@ impl GCIRHashable for DynamicConfigEvaluationInitV2 {
72
72
  hash_secondary_exposures(&self.base.secondary_exposures),
73
73
  if self.passed { 1 } else { 0 },
74
74
  ];
75
- hashing::hash_one(hash_array)
75
+ hashing::hash_u64_slice(&hash_array)
76
76
  }
77
77
  }
78
78
 
@@ -99,7 +99,7 @@ pub struct ExperimentEvaluationInitV2 {
99
99
 
100
100
  impl GCIRHashable for ExperimentEvaluationInitV2 {
101
101
  fn create_hash(&self, name: &InternedString) -> u64 {
102
- let hash_array = vec![
102
+ let hash_array = [
103
103
  name.hash,
104
104
  self.value.hash,
105
105
  match self.base.rule_id {
@@ -112,7 +112,7 @@ impl GCIRHashable for ExperimentEvaluationInitV2 {
112
112
  opt_bool_to_hashable(&self.is_user_in_experiment),
113
113
  ];
114
114
 
115
- hashing::hash_one(hash_array)
115
+ hashing::hash_u64_slice(&hash_array)
116
116
  }
117
117
  }
118
118
 
@@ -163,7 +163,7 @@ pub struct LayerEvaluationInitV2 {
163
163
 
164
164
  impl GCIRHashable for LayerEvaluationInitV2 {
165
165
  fn create_hash(&self, name: &InternedString) -> u64 {
166
- let mut hash_array = vec![
166
+ let hash_array = [
167
167
  name.hash,
168
168
  self.value.hash,
169
169
  match self.base.rule_id {
@@ -177,27 +177,21 @@ impl GCIRHashable for LayerEvaluationInitV2 {
177
177
  self.allocated_experiment_name
178
178
  .as_ref()
179
179
  .map_or(0, |n| n.hash),
180
+ hash_secondary_exposures(&self.undelegated_secondary_exposures),
180
181
  ];
181
- let mut explicit_params_hashes = Vec::new();
182
- if let Some(explicit_parameters) = &self.explicit_parameters {
183
- for value in explicit_parameters.to_vec_interned() {
184
- explicit_params_hashes.push(value.hash);
185
- }
186
- }
187
- hash_array.push(hash_secondary_exposures(
188
- &self.undelegated_secondary_exposures,
189
- ));
190
182
 
191
- hashing::hash_one(hash_array)
183
+ hashing::hash_u64_slice(&hash_array)
192
184
  }
193
185
  }
194
186
 
195
187
  fn hash_secondary_exposures(exposures: &Option<Vec<InternedString>>) -> u64 {
196
- let mut secondary_exposure_hashes = Vec::new();
197
- if let Some(exposures) = exposures {
198
- for exposure in exposures {
199
- secondary_exposure_hashes.push(exposure.hash);
200
- }
188
+ let Some(exposures) = exposures else {
189
+ return hashing::hash_u64_slice(&[]);
190
+ };
191
+
192
+ let mut secondary_exposure_hashes = hashing::U64HashBuilder::with_capacity(exposures.len());
193
+ for exposure in exposures {
194
+ secondary_exposure_hashes.push(exposure.hash);
201
195
  }
202
- hashing::hash_one(secondary_exposure_hashes)
196
+ secondary_exposure_hashes.finish()
203
197
  }
@@ -3,8 +3,7 @@ use crate::gcir::gcir_formatter::GCIRHashable;
3
3
  use crate::hashing::opt_bool_to_hashable;
4
4
  use crate::interned_string::InternedString;
5
5
  use crate::{
6
- evaluation::evaluation_types::{is_false, push_optional_version_hash_values},
7
- specs_response::explicit_params::ExplicitParameters,
6
+ evaluation::evaluation_types::is_false, specs_response::explicit_params::ExplicitParameters,
8
7
  };
9
8
  use crate::{hashing, SecondaryExposure};
10
9
  use serde::{Deserialize, Serialize};
@@ -29,14 +28,16 @@ pub struct GateEvaluationV2 {
29
28
 
30
29
  impl GCIRHashable for GateEvaluationV2 {
31
30
  fn create_hash(&self, name: &InternedString) -> u64 {
32
- let mut hash_array = vec![
31
+ let version_hashes = optional_version_hash_values(&self.base.version);
32
+ let hash_array = [
33
33
  name.hash,
34
34
  self.value as u64,
35
35
  self.base.rule_id.hash,
36
36
  hash_secondary_exposures(&self.base.secondary_exposures),
37
+ version_hashes[0],
38
+ version_hashes[1],
37
39
  ];
38
- push_optional_version_hash_values(&mut hash_array, &self.base.version);
39
- hashing::hash_one(hash_array)
40
+ hashing::hash_u64_slice(&hash_array)
40
41
  }
41
42
  }
42
43
 
@@ -56,15 +57,17 @@ pub struct DynamicConfigEvaluationV2 {
56
57
 
57
58
  impl GCIRHashable for DynamicConfigEvaluationV2 {
58
59
  fn create_hash(&self, name: &InternedString) -> u64 {
59
- let mut hash_array = vec![
60
+ let version_hashes = optional_version_hash_values(&self.base.version);
61
+ let hash_array = [
60
62
  name.hash,
61
63
  self.value.get_hash(),
62
64
  self.base.rule_id.hash,
63
65
  hash_secondary_exposures(&self.base.secondary_exposures),
64
66
  self.passed as u64,
67
+ version_hashes[0],
68
+ version_hashes[1],
65
69
  ];
66
- push_optional_version_hash_values(&mut hash_array, &self.base.version);
67
- hashing::hash_one(hash_array)
70
+ hashing::hash_u64_slice(&hash_array)
68
71
  }
69
72
  }
70
73
 
@@ -99,26 +102,22 @@ pub struct ExperimentEvaluationV2 {
99
102
 
100
103
  impl GCIRHashable for ExperimentEvaluationV2 {
101
104
  fn create_hash(&self, name: &InternedString) -> u64 {
102
- let mut hash_array = vec![
105
+ let version_hashes = optional_version_hash_values(&self.base.version);
106
+ let hash_array = [
103
107
  name.hash,
104
108
  self.value.get_hash(),
105
109
  self.base.rule_id.hash,
106
110
  hash_secondary_exposures(&self.base.secondary_exposures),
107
111
  self.is_in_layer as u64,
112
+ version_hashes[0],
113
+ version_hashes[1],
114
+ hash_explicit_parameters(self.explicit_parameters.as_ref()),
115
+ self.group_name.as_ref().map_or(0, |g| g.hash),
116
+ opt_bool_to_hashable(&self.is_experiment_active),
117
+ opt_bool_to_hashable(&self.is_user_in_experiment),
108
118
  ];
109
- push_optional_version_hash_values(&mut hash_array, &self.base.version);
110
- let mut explicit_params_hashes = Vec::new();
111
- if let Some(explicit_parameters) = &self.explicit_parameters {
112
- for value in explicit_parameters.to_vec_interned() {
113
- explicit_params_hashes.push(value.hash);
114
- }
115
- }
116
- hash_array.push(hashing::hash_one(explicit_params_hashes));
117
- hash_array.push(self.group_name.as_ref().map_or(0, |g| g.hash));
118
- hash_array.push(opt_bool_to_hashable(&self.is_experiment_active));
119
- hash_array.push(opt_bool_to_hashable(&self.is_user_in_experiment));
120
119
 
121
- hashing::hash_one(hash_array)
120
+ hashing::hash_u64_slice(&hash_array)
122
121
  }
123
122
  }
124
123
 
@@ -168,7 +167,8 @@ pub struct LayerEvaluationV2 {
168
167
 
169
168
  impl GCIRHashable for LayerEvaluationV2 {
170
169
  fn create_hash(&self, name: &InternedString) -> u64 {
171
- let mut hash_array = vec![
170
+ let version_hashes = optional_version_hash_values(&self.base.version);
171
+ let hash_array = [
172
172
  name.hash,
173
173
  self.value.get_hash(),
174
174
  self.base.rule_id.hash,
@@ -179,29 +179,49 @@ impl GCIRHashable for LayerEvaluationV2 {
179
179
  self.allocated_experiment_name
180
180
  .as_ref()
181
181
  .map_or(0, |n| n.hash),
182
+ version_hashes[0],
183
+ version_hashes[1],
184
+ hash_explicit_parameters(Some(&self.explicit_parameters)),
185
+ hash_optional_interned_string_exposures(self.undelegated_secondary_exposures.as_ref()),
182
186
  ];
183
- push_optional_version_hash_values(&mut hash_array, &self.base.version);
184
- let mut explicit_params_hashes = Vec::new();
185
- for value in self.explicit_parameters.to_vec_interned() {
186
- explicit_params_hashes.push(value.hash);
187
- }
188
- hash_array.push(hashing::hash_one(explicit_params_hashes));
189
- let mut undelegated_secondary_exposure_hashes = Vec::new();
190
- if let Some(undelegated_secondary_exposures) = &self.undelegated_secondary_exposures {
191
- for exposure in undelegated_secondary_exposures {
192
- undelegated_secondary_exposure_hashes.push(exposure.hash);
193
- }
194
- }
195
- hash_array.push(hashing::hash_one(undelegated_secondary_exposure_hashes));
196
187
 
197
- hashing::hash_one(hash_array)
188
+ hashing::hash_u64_slice(&hash_array)
198
189
  }
199
190
  }
200
191
 
201
- fn hash_secondary_exposures(exposures: &Vec<String>) -> u64 {
202
- let mut secondary_exposure_hashes = Vec::new();
192
+ fn hash_secondary_exposures(exposures: &[String]) -> u64 {
193
+ let mut secondary_exposure_hashes = hashing::U64HashBuilder::with_capacity(exposures.len());
203
194
  for exposure in exposures {
204
195
  secondary_exposure_hashes.push(hashing::ahash_str(exposure));
205
196
  }
206
- hashing::hash_one(secondary_exposure_hashes)
197
+ secondary_exposure_hashes.finish()
198
+ }
199
+
200
+ fn hash_optional_interned_string_exposures(exposures: Option<&Vec<InternedString>>) -> u64 {
201
+ let Some(exposures) = exposures else {
202
+ return hashing::hash_u64_slice(&[]);
203
+ };
204
+
205
+ let mut exposure_hashes = hashing::U64HashBuilder::with_capacity(exposures.len());
206
+ for exposure in exposures {
207
+ exposure_hashes.push(exposure.hash);
208
+ }
209
+ exposure_hashes.finish()
210
+ }
211
+
212
+ fn hash_explicit_parameters(explicit_parameters: Option<&ExplicitParameters>) -> u64 {
213
+ let Some(explicit_parameters) = explicit_parameters else {
214
+ return hashing::hash_u64_slice(&[]);
215
+ };
216
+
217
+ let mut explicit_params_hashes =
218
+ hashing::U64HashBuilder::with_capacity(explicit_parameters.as_slice().len());
219
+ for value in explicit_parameters.as_slice() {
220
+ explicit_params_hashes.push(value.hash);
221
+ }
222
+ explicit_params_hashes.finish()
223
+ }
224
+
225
+ fn optional_version_hash_values(version: &Option<u32>) -> [u64; 2] {
226
+ [version.is_some() as u64, version.map_or(0, u64::from)]
207
227
  }
@@ -166,21 +166,22 @@ fn new_layer_eval<'a>(
166
166
  ) -> Result<Recognition, StatsigErr> {
167
167
  let mut has_passed_rule = false;
168
168
  let mut passed = false;
169
- let mut rule_id: Option<&'a InternedString> = Some(InternedString::default_rule_id_ref());
169
+ let mut rule_id = Some(InternedString::default_rule_id());
170
170
  let mut delegate_name: Option<InternedString> = None;
171
171
  let mut rule_ids: HashMap<InternedString, InternedString> = HashMap::new();
172
172
  let mut value: HashMap<String, Value> = HashMap::new();
173
173
  let mut group_name: Option<InternedString> = None;
174
174
  let mut is_experiment_group = false;
175
+ let mut is_experiment_active = false;
175
176
  let mut explicit_parameters: Option<ExplicitParameters> = None;
176
177
  let mut secondary_exposures: Vec<SecondaryExposure> = Vec::new();
177
178
  let mut undelegated_secondary_exposures: Vec<SecondaryExposure> = Vec::new();
178
179
 
179
180
  for rule in &spec.rules {
180
181
  evaluate_rule(ctx, rule)?;
181
- secondary_exposures.append(&mut ctx.result.secondary_exposures);
182
- undelegated_secondary_exposures.append(&mut ctx.result.secondary_exposures);
183
- ctx.result.secondary_exposures.clear();
182
+ let rule_secondary_exposures = std::mem::take(&mut ctx.result.secondary_exposures);
183
+ secondary_exposures.extend(rule_secondary_exposures.iter().cloned());
184
+ undelegated_secondary_exposures.extend(rule_secondary_exposures);
184
185
 
185
186
  if ctx.result.unsupported {
186
187
  return Ok(Recognition::Recognized);
@@ -217,15 +218,21 @@ fn new_layer_eval<'a>(
217
218
  continue;
218
219
  }
219
220
 
220
- update_parameter_values(&mut value, &mut rule_ids, delegate_value, &rule.id);
221
+ let delegate_rule_id = ctx
222
+ .result
223
+ .rule_id
224
+ .clone()
225
+ .unwrap_or_else(InternedString::default_rule_id);
226
+ update_parameter_values(&mut value, &mut rule_ids, delegate_value, &delegate_rule_id);
221
227
 
222
228
  secondary_exposures.append(&mut ctx.result.secondary_exposures);
223
229
  ctx.result.secondary_exposures.clear();
224
230
  passed = ctx.result.bool_value;
225
231
  delegate_name = ctx.result.config_delegate.clone();
226
232
  group_name = ctx.result.group_name.clone();
227
- rule_id = Some(&rule.id);
228
- is_experiment_group = rule.is_experiment_group.unwrap_or(false);
233
+ rule_id = Some(delegate_rule_id);
234
+ is_experiment_group = ctx.result.is_experiment_group;
235
+ is_experiment_active = ctx.result.is_experiment_active;
229
236
  explicit_parameters = ctx.result.explicit_parameters.clone();
230
237
  } else {
231
238
  passed = ctx.result.bool_value;
@@ -247,10 +254,10 @@ fn new_layer_eval<'a>(
247
254
  ctx.result.bool_value = passed;
248
255
  ctx.result.config_delegate = delegate_name;
249
256
  ctx.result.group_name = group_name;
250
- ctx.result.rule_id = rule_id.cloned();
257
+ ctx.result.rule_id = rule_id;
251
258
  ctx.result.json_value = Some(DynamicReturnable::from_map(value));
252
259
  ctx.result.is_experiment_group = is_experiment_group;
253
- ctx.result.is_experiment_active = spec.is_active.unwrap_or(false);
260
+ ctx.result.is_experiment_active = is_experiment_active;
254
261
  ctx.result.explicit_parameters = explicit_parameters;
255
262
  ctx.result.secondary_exposures = secondary_exposures;
256
263
  ctx.result.undelegated_secondary_exposures = Some(undelegated_secondary_exposures);
@@ -72,7 +72,7 @@ impl<'a> EvaluatorContext<'a> {
72
72
 
73
73
  pub fn reset_result(&mut self) {
74
74
  self.nested_count = 0;
75
- self.result = EvaluatorResult::default();
75
+ self.result.clear_for_reuse();
76
76
  }
77
77
 
78
78
  pub fn finalize_evaluation(&mut self, spec: &Spec, rule: Option<&Rule>) {