statsig-python-core 0.19.9rc2607010924__tar.gz → 0.20.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 (373) hide show
  1. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/Cargo.lock +6 -6
  2. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/Cargo.toml +1 -1
  3. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/PKG-INFO +1 -1
  4. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/py_src/statsig_python_core/statsig.py +20 -0
  5. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/py_src/statsig_python_core/statsig_python_core.pyi +8 -1
  6. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-pyo3/src/statsig_base_py.rs +42 -0
  7. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-pyo3/src/statsig_options_py.rs +7 -0
  8. statsig_python_core-0.20.0/statsig-pyo3/tests/test_experiment_group_targeting.py +90 -0
  9. statsig_python_core-0.20.0/statsig-pyo3/tests/test_get_autotune_list.py +45 -0
  10. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/Cargo.toml +1 -1
  11. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/id_lists_adapter/statsig_http_id_lists_adapter.rs +90 -16
  12. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/statsig_metadata.rs +1 -1
  13. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/statsig_options.rs +16 -1
  14. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/tests/list_methods_tests.rs +11 -0
  15. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/py_src/statsig_python_core/__init__.py +0 -0
  16. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/py_src/statsig_python_core/data_store.py +0 -0
  17. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/py_src/statsig_python_core/error_boundary.py +0 -0
  18. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/py_src/statsig_python_core/observability_client.py +0 -0
  19. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/py_src/statsig_python_core/output_logger_provider.py +0 -0
  20. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/py_src/statsig_python_core/persistent_storage.py +0 -0
  21. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/py_src/statsig_python_core/py.typed +0 -0
  22. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/py_src/statsig_python_core/requirements.txt +0 -0
  23. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/py_src/statsig_python_core/statsig_types.py +0 -0
  24. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/pyproject.toml +0 -0
  25. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-grpc/Cargo.toml +0 -0
  26. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-grpc/README.md +0 -0
  27. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-grpc/build.rs +0 -0
  28. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-grpc/src/lib.rs +0 -0
  29. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-grpc/src/mock_forward_proxy.rs +0 -0
  30. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-grpc/src/protos/statsig_forward_proxy.proto +0 -0
  31. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-grpc/src/statsig_forward_proxy.rs +0 -0
  32. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-grpc/src/statsig_grpc_client.rs +0 -0
  33. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-grpc/src/statsig_grpc_err.rs +0 -0
  34. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-pyo3/.github/workflows/CI.yml +0 -0
  35. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-pyo3/.gitignore +0 -0
  36. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-pyo3/Cargo.toml +0 -0
  37. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-pyo3/README.md +0 -0
  38. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-pyo3/src/bin/stub_gen.rs +0 -0
  39. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-pyo3/src/data_store_base_py.rs +0 -0
  40. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-pyo3/src/interned_store_py.rs +0 -0
  41. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-pyo3/src/lib.rs +0 -0
  42. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-pyo3/src/observability_client_base_py.rs +0 -0
  43. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-pyo3/src/output_logger_provider_base_py.rs +0 -0
  44. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-pyo3/src/pyo_utils.rs +0 -0
  45. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-pyo3/src/raw_evaluation_compat_py.rs +0 -0
  46. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-pyo3/src/safe_gil.rs +0 -0
  47. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-pyo3/src/statsig_metadata_py.rs +0 -0
  48. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-pyo3/src/statsig_persistent_storage_override_adapter_py.rs +0 -0
  49. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-pyo3/src/statsig_types_py.rs +0 -0
  50. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-pyo3/src/statsig_user_py.rs +0 -0
  51. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-pyo3/src/unit_id_py.rs +0 -0
  52. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-pyo3/src/valid_primitives_py.rs +0 -0
  53. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-pyo3/tests/fork_runner.py +0 -0
  54. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-pyo3/tests/mock_output_logger.py +0 -0
  55. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-pyo3/tests/mock_scrapi.py +0 -0
  56. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-pyo3/tests/profile_util.py +0 -0
  57. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-pyo3/tests/shutdown_sub_proc.py +0 -0
  58. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-pyo3/tests/test_data_store.py +0 -0
  59. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-pyo3/tests/test_error_boundary.py +0 -0
  60. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-pyo3/tests/test_experiment_serialization.py +0 -0
  61. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-pyo3/tests/test_exposure_logging.py +0 -0
  62. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-pyo3/tests/test_feature_gate_serialization.py +0 -0
  63. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-pyo3/tests/test_forking.py +0 -0
  64. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-pyo3/tests/test_get_dynamic_config.py +0 -0
  65. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-pyo3/tests/test_initialize_with_details.py +0 -0
  66. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-pyo3/tests/test_interned_store_preload.py +0 -0
  67. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-pyo3/tests/test_layer_param_exposure_sampling.py +0 -0
  68. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-pyo3/tests/test_layer_serialization.py +0 -0
  69. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-pyo3/tests/test_observability_client.py +0 -0
  70. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-pyo3/tests/test_output_logger_provider.py +0 -0
  71. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-pyo3/tests/test_override_adapter.py +0 -0
  72. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-pyo3/tests/test_performance.py +0 -0
  73. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-pyo3/tests/test_sec_expo_as_primary.py +0 -0
  74. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-pyo3/tests/test_shared_statsig.py +0 -0
  75. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-pyo3/tests/test_shutdown.py +0 -0
  76. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-pyo3/tests/test_statsig.py +0 -0
  77. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-pyo3/tests/test_statsig_options.py +0 -0
  78. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-pyo3/tests/test_statsig_user.py +0 -0
  79. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-pyo3/tests/test_statsig_user_json_serialization.py +0 -0
  80. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-pyo3/tests/test_statsig_user_none_fields.py +0 -0
  81. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-pyo3/tests/test_statsig_user_pickle.py +0 -0
  82. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-pyo3/tests/test_user_exposure_e2e.py +0 -0
  83. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-pyo3/tests/utils.py +0 -0
  84. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/build.rs +0 -0
  85. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/resources/ip_supalite.table +0 -0
  86. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/resources/ua_parser_regex.yaml +0 -0
  87. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/resources/ua_parser_regex_lite.yaml +0 -0
  88. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/__tests__/interned_string_tests.rs +0 -0
  89. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/__tests__/mod.rs +0 -0
  90. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/__tests__/spec_store_tests.rs +0 -0
  91. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/compression/compression_helper.rs +0 -0
  92. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/compression/mod.rs +0 -0
  93. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/console_capture/console_capture_handler.rs +0 -0
  94. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/console_capture/console_capture_instances.rs +0 -0
  95. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/console_capture/console_capture_options.rs +0 -0
  96. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/console_capture/console_log_line_levels.rs +0 -0
  97. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/console_capture/mod.rs +0 -0
  98. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/data_store_interface.rs +0 -0
  99. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/dcs_str.rs +0 -0
  100. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/evaluation/__tests__/dynamic_returnable_tests.rs +0 -0
  101. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/evaluation/__tests__/mod.rs +0 -0
  102. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/evaluation/__tests__/rkyv_value_tests.rs +0 -0
  103. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/evaluation/cmab_evaluator.rs +0 -0
  104. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/evaluation/comparisons/compare_arrays.rs +0 -0
  105. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/evaluation/comparisons/compare_numbers.rs +0 -0
  106. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/evaluation/comparisons/compare_str_with_regex.rs +0 -0
  107. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/evaluation/comparisons/compare_strings_in_array.rs +0 -0
  108. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/evaluation/comparisons/compare_time.rs +0 -0
  109. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/evaluation/comparisons/compare_versions.rs +0 -0
  110. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/evaluation/comparisons/mod.rs +0 -0
  111. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/evaluation/country_lookup.rs +0 -0
  112. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/evaluation/dynamic_returnable.rs +0 -0
  113. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/evaluation/dynamic_string.rs +0 -0
  114. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/evaluation/dynamic_value.rs +0 -0
  115. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/evaluation/evaluation_details.rs +0 -0
  116. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/evaluation/evaluation_types.rs +0 -0
  117. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/evaluation/evaluation_types_initialize_v2.rs +0 -0
  118. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/evaluation/evaluation_types_v2.rs +0 -0
  119. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/evaluation/evaluator.rs +0 -0
  120. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/evaluation/evaluator_context.rs +0 -0
  121. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/evaluation/evaluator_result.rs +0 -0
  122. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/evaluation/evaluator_value.rs +0 -0
  123. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/evaluation/get_unit_id.rs +0 -0
  124. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/evaluation/mod.rs +0 -0
  125. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/evaluation/rkyv_value.rs +0 -0
  126. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/evaluation/secondary_exposure_key.rs +0 -0
  127. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/evaluation/user_agent_parsing/first_party_ua_parser.rs +0 -0
  128. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/evaluation/user_agent_parsing/mod.rs +0 -0
  129. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/evaluation/user_agent_parsing/statsig_uaparser/__tests__/mod.rs +0 -0
  130. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/evaluation/user_agent_parsing/statsig_uaparser/__tests__/test_helpers.rs +0 -0
  131. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/evaluation/user_agent_parsing/statsig_uaparser/__tests__/test_tokenizer.rs +0 -0
  132. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/evaluation/user_agent_parsing/statsig_uaparser/__tests__/test_ua_parser_browser.rs +0 -0
  133. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/evaluation/user_agent_parsing/statsig_uaparser/__tests__/test_ua_parser_os.rs +0 -0
  134. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/evaluation/user_agent_parsing/statsig_uaparser/mod.rs +0 -0
  135. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/evaluation/user_agent_parsing/statsig_uaparser/tokenizer.rs +0 -0
  136. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/evaluation/user_agent_parsing/statsig_uaparser/ua_parser.rs +0 -0
  137. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/evaluation/user_agent_parsing/statsig_uaparser/window_iter.rs +0 -0
  138. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/evaluation/user_agent_parsing/third_party_ua_parser.rs +0 -0
  139. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/evaluation/user_agent_parsing/ua_parser.rs +0 -0
  140. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/event_emitter/statsig_event_emitter_tests.rs +0 -0
  141. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/event_logging/event_logger.rs +0 -0
  142. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/event_logging/event_logger_constants.rs +0 -0
  143. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/event_logging/event_logger_ops_stats.rs +0 -0
  144. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/event_logging/event_queue/batch.rs +0 -0
  145. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/event_logging/event_queue/mod.rs +0 -0
  146. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/event_logging/event_queue/queue.rs +0 -0
  147. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/event_logging/event_queue/queued_config_expo.rs +0 -0
  148. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/event_logging/event_queue/queued_event.rs +0 -0
  149. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/event_logging/event_queue/queued_experiment_expo.rs +0 -0
  150. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/event_logging/event_queue/queued_expo.rs +0 -0
  151. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/event_logging/event_queue/queued_gate_expo.rs +0 -0
  152. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/event_logging/event_queue/queued_layer_param_expo.rs +0 -0
  153. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/event_logging/event_queue/queued_passthrough.rs +0 -0
  154. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/event_logging/event_queue/queued_secondary_expo.rs +0 -0
  155. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/event_logging/exposure_sampling.rs +0 -0
  156. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/event_logging/exposure_utils.rs +0 -0
  157. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/event_logging/flush_interval.rs +0 -0
  158. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/event_logging/flush_type.rs +0 -0
  159. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/event_logging/mod.rs +0 -0
  160. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/event_logging/sec_expo_as_primary_experiment.rs +0 -0
  161. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/event_logging/statsig_event.rs +0 -0
  162. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/event_logging/statsig_event_internal.rs +0 -0
  163. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/event_logging_adapter/event_logging_adapter_trait.rs +0 -0
  164. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/event_logging_adapter/log_event_payload.rs +0 -0
  165. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/event_logging_adapter/mod.rs +0 -0
  166. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/event_logging_adapter/statsig_http_event_logging_adapter.rs +0 -0
  167. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/event_logging_adapter/statsig_local_file_event_logging_adapter.rs +0 -0
  168. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/gcir/dynamic_configs_processor.rs +0 -0
  169. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/gcir/feature_gates_processor.rs +0 -0
  170. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/gcir/gcir_formatter.rs +0 -0
  171. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/gcir/gcir_options.rs +0 -0
  172. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/gcir/gcir_process_iter.rs +0 -0
  173. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/gcir/layer_configs_processor.rs +0 -0
  174. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/gcir/mod.rs +0 -0
  175. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/gcir/param_stores_processor.rs +0 -0
  176. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/gcir/stringify_sec_exposures.rs +0 -0
  177. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/gcir/target_app_id_utils.rs +0 -0
  178. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/global_configs.rs +0 -0
  179. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/hashing/ahash.rs +0 -0
  180. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/hashing/djb2.rs +0 -0
  181. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/hashing/hash_util.rs +0 -0
  182. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/hashing/memo_sha_256.rs +0 -0
  183. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/hashing/mod.rs +0 -0
  184. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/id_lists_adapter/id_list.rs +0 -0
  185. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/id_lists_adapter/id_lists_adapter_trait.rs +0 -0
  186. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/id_lists_adapter/mod.rs +0 -0
  187. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/init_details.rs +0 -0
  188. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/initialize_evaluations_response.rs +0 -0
  189. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/initialize_response.rs +0 -0
  190. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/initialize_v2_response.rs +0 -0
  191. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/instance_registry.rs +0 -0
  192. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/interned_string.rs +0 -0
  193. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/interned_values/__tests__/interned_store_eval_value_tests.rs +0 -0
  194. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/interned_values/__tests__/interned_store_returnable_tests.rs +0 -0
  195. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/interned_values/__tests__/interned_store_string_tests.rs +0 -0
  196. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/interned_values/__tests__/mod.rs +0 -0
  197. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/interned_values/interned_store.rs +0 -0
  198. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/interned_values/mod.rs +0 -0
  199. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/lib.rs +0 -0
  200. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/logging_utils.rs +0 -0
  201. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/macros.rs +0 -0
  202. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/networking/__tests__/mod.rs +0 -0
  203. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/networking/__tests__/response_data_tests.rs +0 -0
  204. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/networking/http_types.rs +0 -0
  205. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/networking/mod.rs +0 -0
  206. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/networking/network_client.rs +0 -0
  207. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/networking/network_error.rs +0 -0
  208. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/networking/providers/mod.rs +0 -0
  209. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/networking/providers/net_provider_global.rs +0 -0
  210. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/networking/providers/net_provider_noop.rs +0 -0
  211. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/networking/providers/net_provider_reqwest.rs +0 -0
  212. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/networking/proxy_config.rs +0 -0
  213. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/observability/console_capture_observer.rs +0 -0
  214. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/observability/diagnostics_observer.rs +0 -0
  215. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/observability/mod.rs +0 -0
  216. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/observability/observability_client_adapter.rs +0 -0
  217. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/observability/ops_stats.rs +0 -0
  218. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/observability/sdk_errors_observer.rs +0 -0
  219. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/output_logger.rs +0 -0
  220. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/override_adapter/mod.rs +0 -0
  221. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/override_adapter/override_adapter_trait.rs +0 -0
  222. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/override_adapter/statsig_local_override_adapter.rs +0 -0
  223. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/persistent_storage/__tests__/mod.rs +0 -0
  224. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/persistent_storage/__tests__/sticky_values_serialization_tests.rs +0 -0
  225. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/persistent_storage/mod.rs +0 -0
  226. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/persistent_storage/persistent_storage_trait.rs +0 -0
  227. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/persistent_storage/persistent_values_manager.rs +0 -0
  228. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/sdk_diagnostics/diagnostics.rs +0 -0
  229. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/sdk_diagnostics/diagnostics_utils.rs +0 -0
  230. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/sdk_diagnostics/marker.rs +0 -0
  231. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/sdk_diagnostics/mod.rs +0 -0
  232. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/sdk_event_emitter/event_emitter.rs +0 -0
  233. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/sdk_event_emitter/event_emitter_tests.rs +0 -0
  234. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/sdk_event_emitter/event_types.rs +0 -0
  235. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/sdk_event_emitter/mod.rs +0 -0
  236. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/spec_store.rs +0 -0
  237. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/specs_adapter/config_spec_background_sync_metrics.rs +0 -0
  238. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/specs_adapter/mod.rs +0 -0
  239. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/specs_adapter/response_format.rs +0 -0
  240. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/specs_adapter/specs_adapter_trait.rs +0 -0
  241. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/specs_adapter/statsig_bootstrap_specs_adapter.rs +0 -0
  242. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/specs_adapter/statsig_customized_specs_adapter.rs +0 -0
  243. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/specs_adapter/statsig_data_store_specs_adapter.rs +0 -0
  244. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/specs_adapter/statsig_grpc_specs_adapter.rs +0 -0
  245. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/specs_adapter/statsig_http_specs_adapter.rs +0 -0
  246. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/specs_adapter/statsig_local_file_specs_adapter.rs +0 -0
  247. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/specs_response/__tests__/mod.rs +0 -0
  248. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/specs_response/__tests__/proto_specs_syncing_tests.rs +0 -0
  249. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/specs_response/__tests__/proto_specs_unknown_tests.rs +0 -0
  250. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/specs_response/__tests__/proto_specs_vs_json_tests.rs +0 -0
  251. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/specs_response/__tests__/proto_stream_reader_tests.rs +0 -0
  252. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/specs_response/cmab_types.rs +0 -0
  253. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/specs_response/explicit_params.rs +0 -0
  254. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/specs_response/mod.rs +0 -0
  255. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/specs_response/param_store_types.rs +0 -0
  256. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/specs_response/proto_specs.rs +0 -0
  257. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/specs_response/proto_stream_reader.rs +0 -0
  258. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/specs_response/spec_types.rs +0 -0
  259. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/specs_response/specs_hash_map.rs +0 -0
  260. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/specs_response/statsig_config_specs.rs +0 -0
  261. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/statsig.rs +0 -0
  262. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/statsig_core_api_options.rs +0 -0
  263. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/statsig_err.rs +0 -0
  264. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/statsig_global.rs +0 -0
  265. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/statsig_runtime.rs +0 -0
  266. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/statsig_type_factories.rs +0 -0
  267. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/statsig_types.rs +0 -0
  268. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/statsig_types_raw.rs +0 -0
  269. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/user/into_optional.rs +0 -0
  270. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/user/mod.rs +0 -0
  271. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/user/statsig_user.rs +0 -0
  272. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/user/statsig_user_builder.rs +0 -0
  273. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/user/statsig_user_internal.rs +0 -0
  274. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/user/statsig_user_loggable.rs +0 -0
  275. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/user/unit_id.rs +0 -0
  276. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/user/user_data.rs +0 -0
  277. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/src/utils/mod.rs +0 -0
  278. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/tests/check_gate_tests.rs +0 -0
  279. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/tests/customized_specs_adapter_tests.rs +0 -0
  280. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/tests/data/big_number_dcs.json +0 -0
  281. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/tests/data/check_gate_perf_dcs.json +0 -0
  282. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/tests/data/company_id_list +0 -0
  283. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/tests/data/dcs_error.json +0 -0
  284. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/tests/data/dcs_missing_gates.json +0 -0
  285. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/tests/data/dcs_non_case_sensitive.json +0 -0
  286. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/tests/data/dcs_user_agent_versions.json +0 -0
  287. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/tests/data/dcs_with_analytical_exposure_sampling.json +0 -0
  288. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/tests/data/dcs_with_checksum.json +0 -0
  289. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/tests/data/dcs_with_sampling.json +0 -0
  290. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/tests/data/dcs_with_sdk_configs.json +0 -0
  291. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/tests/data/demo_proj_dcs.json +0 -0
  292. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/tests/data/demo_proj_dcs.pb.br +0 -0
  293. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/tests/data/eval_proj_dcs.json +0 -0
  294. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/tests/data/eval_proj_dcs.pb.br +0 -0
  295. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/tests/data/get_id_lists.json +0 -0
  296. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/tests/data/perf_proj_dcs.json +0 -0
  297. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/tests/data/perf_proj_dcs.pb.br +0 -0
  298. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/tests/data/shared_dict_dict_only.json +0 -0
  299. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/tests/data/shared_dict_original_dcs.json +0 -0
  300. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/tests/data/shared_dict_response_uncompressed.json +0 -0
  301. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/tests/data/shared_dict_response_with_dict.json +0 -0
  302. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/tests/data/shared_dict_response_without_dict.json +0 -0
  303. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/tests/data/test_must_pass_user_agents.txt +0 -0
  304. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/tests/data/test_user_agents.txt +0 -0
  305. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/tests/data/ua_string_cases.json +0 -0
  306. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/tests/data/unknown_enum.pb.br +0 -0
  307. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/tests/data_store_bytes_adapter_tests.rs +0 -0
  308. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/tests/data_store_json_bytes_tests.rs +0 -0
  309. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/tests/data_store_json_only_no_bytes_methods_tests.rs +0 -0
  310. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/tests/data_store_lock_tests.rs +0 -0
  311. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/tests/data_store_proto_bytes_tests.rs +0 -0
  312. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/tests/direct_gcir_tests.rs +0 -0
  313. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/tests/dynamic_string_tests.rs +0 -0
  314. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/tests/dynamic_value_tests.rs +0 -0
  315. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/tests/evaluation_details_tests.rs +0 -0
  316. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/tests/evaluator_value_tests.rs +0 -0
  317. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/tests/event_logger_failing_flush_tests.rs +0 -0
  318. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/tests/event_logger_flush_tests.rs +0 -0
  319. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/tests/event_logger_high_qps_tests.rs +0 -0
  320. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/tests/event_logger_usage_tests.rs +0 -0
  321. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/tests/expected_evaluation_tests.rs +0 -0
  322. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/tests/exposure_sampling_key_tests.rs +0 -0
  323. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/tests/exposure_tests.rs +0 -0
  324. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/tests/flushing_tests.rs +0 -0
  325. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/tests/gate_inversion_eval_tests.rs +0 -0
  326. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/tests/gcir_tests.rs +0 -0
  327. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/tests/global_configs_test.rs +0 -0
  328. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/tests/grpc_specs_adapter_tests.rs +0 -0
  329. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/tests/hash_util_evaluation_hash_tests.rs +0 -0
  330. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/tests/http_specs_adapter_tests.rs +0 -0
  331. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/tests/initialize_timeout_test.rs +0 -0
  332. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/tests/instance_registry_tests.rs +0 -0
  333. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/tests/layer_serialization_tests.rs +0 -0
  334. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/tests/memory_leak_per_request_users_tests.rs +0 -0
  335. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/tests/network_client_streaming_tests.rs +0 -0
  336. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/tests/network_client_tests.rs +0 -0
  337. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/tests/network_failure_tests.rs +0 -0
  338. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/tests/observability_client_usage_tests.rs +0 -0
  339. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/tests/output_logger_tests.rs +0 -0
  340. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/tests/override_adapter_tests.rs +0 -0
  341. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/tests/perf_tests.rs +0 -0
  342. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/tests/proto_specs_usage_tests.rs +0 -0
  343. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/tests/spec_store_lock_tests.rs +0 -0
  344. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/tests/spec_types_tests.rs +0 -0
  345. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/tests/statsig_disable_network_tests.rs +0 -0
  346. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/tests/statsig_environment_tests.rs +0 -0
  347. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/tests/statsig_event_emitter_usage_test.rs +0 -0
  348. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/tests/statsig_global_tests.rs +0 -0
  349. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/tests/statsig_local_file_event_logging_adapter_tests.rs +0 -0
  350. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/tests/statsig_local_file_specs_adapter_tests.rs +0 -0
  351. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/tests/statsig_options_tests.rs +0 -0
  352. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/tests/statsig_shared_tests.rs +0 -0
  353. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/tests/statsig_tests.rs +0 -0
  354. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/tests/statsig_user_builder_tests.rs +0 -0
  355. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/tests/statsig_user_field_accessor_tests.rs +0 -0
  356. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/tests/statsig_user_internal_tests.rs +0 -0
  357. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/tests/statsig_user_loggable_tests.rs +0 -0
  358. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/tests/statsig_user_tests.rs +0 -0
  359. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/tests/syncing_network_failure_tests.rs +0 -0
  360. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/tests/typed_getters_tests.rs +0 -0
  361. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/tests/ua_parser_util_test.rs +0 -0
  362. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/tests/user_agent_tests_first_party.rs +0 -0
  363. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/tests/user_json_tests.rs +0 -0
  364. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/tests/utils/env_var_guard.rs +0 -0
  365. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/tests/utils/helpers.rs +0 -0
  366. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/tests/utils/mock_data_store.rs +0 -0
  367. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/tests/utils/mock_event_logging_adapter.rs +0 -0
  368. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/tests/utils/mock_log_provider.rs +0 -0
  369. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/tests/utils/mock_observability_client.rs +0 -0
  370. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/tests/utils/mock_scrapi.rs +0 -0
  371. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/tests/utils/mock_specs_adapter.rs +0 -0
  372. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/tests/utils/mock_specs_listener.rs +0 -0
  373. {statsig_python_core-0.19.9rc2607010924 → statsig_python_core-0.20.0}/statsig-rust/tests/utils/mod.rs +0 -0
@@ -2902,7 +2902,7 @@ dependencies = [
2902
2902
 
2903
2903
  [[package]]
2904
2904
  name = "sigstat-grpc"
2905
- version = "0.19.9-rc.2607010924"
2905
+ version = "0.20.0"
2906
2906
  dependencies = [
2907
2907
  "async-trait",
2908
2908
  "chrono",
@@ -2994,7 +2994,7 @@ checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f"
2994
2994
 
2995
2995
  [[package]]
2996
2996
  name = "statsig-node"
2997
- version = "0.19.9-rc.2607010924"
2997
+ version = "0.20.0"
2998
2998
  dependencies = [
2999
2999
  "async-trait",
3000
3000
  "napi",
@@ -3009,7 +3009,7 @@ dependencies = [
3009
3009
 
3010
3010
  [[package]]
3011
3011
  name = "statsig-pyo3"
3012
- version = "0.19.9-rc.2607010924"
3012
+ version = "0.20.0"
3013
3013
  dependencies = [
3014
3014
  "async-trait",
3015
3015
  "lazy_static",
@@ -3024,7 +3024,7 @@ dependencies = [
3024
3024
 
3025
3025
  [[package]]
3026
3026
  name = "statsig-rust"
3027
- version = "0.19.9-rc.2607010924"
3027
+ version = "0.20.0"
3028
3028
  dependencies = [
3029
3029
  "ahash",
3030
3030
  "arc-swap",
@@ -3075,7 +3075,7 @@ dependencies = [
3075
3075
 
3076
3076
  [[package]]
3077
3077
  name = "statsig_elixir"
3078
- version = "0.19.9-rc.2607010924"
3078
+ version = "0.20.0"
3079
3079
  dependencies = [
3080
3080
  "async-trait",
3081
3081
  "parking_lot",
@@ -3088,7 +3088,7 @@ dependencies = [
3088
3088
 
3089
3089
  [[package]]
3090
3090
  name = "statsig_ffi"
3091
- version = "0.19.9-rc.2607010924"
3091
+ version = "0.20.0"
3092
3092
  dependencies = [
3093
3093
  "async-trait",
3094
3094
  "cbindgen",
@@ -19,7 +19,7 @@ exclude = [
19
19
  [workspace.package]
20
20
  edition = "2021"
21
21
  license = "ISC"
22
- version = "0.19.9-rc.2607010924"
22
+ version = "0.20.0"
23
23
  homepage = "https://statsig.com/"
24
24
  authors = ["Statsig", "Daniel Loomb <daniel@statsig.com>"]
25
25
  readme = "README.md"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: statsig_python_core
3
- Version: 0.19.9rc2607010924
3
+ Version: 0.20.0
4
4
  Classifier: Programming Language :: Rust
5
5
  Classifier: Programming Language :: Python :: Implementation :: CPython
6
6
  Classifier: Programming Language :: Python :: Implementation :: PyPy
@@ -106,6 +106,26 @@ class Statsig(StatsigBasePy):
106
106
  raw = super()._INTERNAL_get_experiment(user, name, options)
107
107
  return Experiment(name, raw)
108
108
 
109
+ def get_experiment_by_group_name(
110
+ self,
111
+ experiment_name: str,
112
+ group_name: str,
113
+ ) -> Experiment:
114
+ raw = super()._INTERNAL_get_experiment_by_group_name(
115
+ experiment_name, group_name
116
+ )
117
+ return Experiment(experiment_name, raw)
118
+
119
+ def get_experiment_by_group_id_advanced(
120
+ self,
121
+ experiment_name: str,
122
+ group_id: str,
123
+ ) -> Experiment:
124
+ raw = super()._INTERNAL_get_experiment_by_group_id_advanced(
125
+ experiment_name, group_id
126
+ )
127
+ return Experiment(experiment_name, raw)
128
+
109
129
  def get_layer(
110
130
  self,
111
131
  user: StatsigUser,
@@ -219,6 +219,8 @@ class StatsigBasePy:
219
219
  def _INTERNAL_get_dynamic_config(self, user: StatsigUser, name: builtins.str, options: typing.Optional[DynamicConfigEvaluationOptions] = None) -> dict: ...
220
220
  def manually_log_dynamic_config_exposure(self, user: StatsigUser, name: builtins.str) -> None: ...
221
221
  def _INTERNAL_get_experiment(self, user: StatsigUser, name: builtins.str, options: typing.Optional[ExperimentEvaluationOptions] = None) -> dict: ...
222
+ def _INTERNAL_get_experiment_by_group_name(self, experiment_name: builtins.str, group_name: builtins.str) -> dict: ...
223
+ def _INTERNAL_get_experiment_by_group_id_advanced(self, experiment_name: builtins.str, group_id: builtins.str) -> dict: ...
222
224
  def manually_log_experiment_exposure(self, user: StatsigUser, name: builtins.str) -> None: ...
223
225
  def _INTERNAL_get_layer(self, user: StatsigUser, name: builtins.str, options: typing.Optional[LayerEvaluationOptions] = None) -> dict: ...
224
226
  def _INTERNAL_log_layer_param_exposure(self, raw: LayerParamExposureData, param_name: builtins.str) -> None: ...
@@ -240,6 +242,7 @@ class StatsigBasePy:
240
242
  def get_feature_gate_list(self) -> builtins.list[builtins.str]: ...
241
243
  def get_dynamic_config_list(self) -> builtins.list[builtins.str]: ...
242
244
  def get_experiment_list(self) -> builtins.list[builtins.str]: ...
245
+ def get_autotune_list(self) -> builtins.list[builtins.str]: ...
243
246
  def get_parameter_store_list(self) -> builtins.list[builtins.str]: ...
244
247
  def identify(self, user: StatsigUser) -> None: ...
245
248
 
@@ -381,7 +384,11 @@ class StatsigOptions:
381
384
  def experimental_flags(self) -> typing.Optional[builtins.set[builtins.str]]: ...
382
385
  @experimental_flags.setter
383
386
  def experimental_flags(self, value: typing.Optional[builtins.set[builtins.str]]) -> None: ...
384
- def __new__(cls, specs_url: typing.Optional[builtins.str] = None, specs_sync_interval_ms: typing.Optional[builtins.int] = None, init_timeout_ms: typing.Optional[builtins.int] = None, log_event_url: typing.Optional[builtins.str] = None, disable_all_logging: typing.Optional[builtins.bool] = None, disable_network: typing.Optional[builtins.bool] = None, log_event_connection_reuse: typing.Optional[builtins.bool] = None, event_logging_flush_interval_ms: typing.Optional[builtins.int] = None, event_logging_max_queue_size: typing.Optional[builtins.int] = None, event_logging_max_pending_batch_queue_size: typing.Optional[builtins.int] = None, enable_id_lists: typing.Optional[builtins.bool] = None, enable_dcs_deltas: typing.Optional[builtins.bool] = None, wait_for_user_agent_init: typing.Optional[builtins.bool] = None, wait_for_country_lookup_init: typing.Optional[builtins.bool] = None, disable_country_lookup: typing.Optional[builtins.bool] = None, id_lists_url: typing.Optional[builtins.str] = None, download_id_list_file_api: typing.Optional[builtins.str] = None, id_lists_sync_interval_ms: typing.Optional[builtins.int] = None, fallback_to_statsig_api: typing.Optional[builtins.bool] = None, environment: typing.Optional[builtins.str] = None, service_name: typing.Optional[builtins.str] = None, output_log_level: typing.Optional[builtins.str] = None, global_custom_fields: typing.Optional[typing.Mapping[builtins.str, typing.Union[builtins.str, builtins.int, builtins.float, builtins.bool, typing.List[typing.Optional[typing.Union[builtins.str, builtins.int, builtins.float, builtins.bool]]]]]] = None, observability_client: typing.Optional[ObservabilityClientBase] = None, data_store: typing.Optional[DataStoreBase] = None, data_store_key_schema_version: typing.Optional[builtins.str] = None, persistent_storage: typing.Optional[PersistentStorageBaseClass] = None, config_compression_mode: typing.Optional[builtins.str] = None, proxy_config: typing.Optional[ProxyConfig] = None, output_logger_provider: typing.Optional[OutputLoggerProviderBase] = None, spec_adapter_configs: typing.Optional[list] = None, use_third_party_ua_parser: typing.Optional[builtins.bool] = None, disable_disk_access: typing.Optional[builtins.bool] = None, experimental_flags: typing.Optional[builtins.set[builtins.str]] = None) -> StatsigOptions: ...
387
+ @property
388
+ def id_lists_request_timeout_ms(self) -> typing.Optional[builtins.int]: ...
389
+ @id_lists_request_timeout_ms.setter
390
+ def id_lists_request_timeout_ms(self, value: typing.Optional[builtins.int]) -> None: ...
391
+ def __new__(cls, specs_url: typing.Optional[builtins.str] = None, specs_sync_interval_ms: typing.Optional[builtins.int] = None, init_timeout_ms: typing.Optional[builtins.int] = None, log_event_url: typing.Optional[builtins.str] = None, disable_all_logging: typing.Optional[builtins.bool] = None, disable_network: typing.Optional[builtins.bool] = None, log_event_connection_reuse: typing.Optional[builtins.bool] = None, event_logging_flush_interval_ms: typing.Optional[builtins.int] = None, event_logging_max_queue_size: typing.Optional[builtins.int] = None, event_logging_max_pending_batch_queue_size: typing.Optional[builtins.int] = None, enable_id_lists: typing.Optional[builtins.bool] = None, enable_dcs_deltas: typing.Optional[builtins.bool] = None, wait_for_user_agent_init: typing.Optional[builtins.bool] = None, wait_for_country_lookup_init: typing.Optional[builtins.bool] = None, disable_country_lookup: typing.Optional[builtins.bool] = None, id_lists_url: typing.Optional[builtins.str] = None, download_id_list_file_api: typing.Optional[builtins.str] = None, id_lists_sync_interval_ms: typing.Optional[builtins.int] = None, fallback_to_statsig_api: typing.Optional[builtins.bool] = None, environment: typing.Optional[builtins.str] = None, service_name: typing.Optional[builtins.str] = None, output_log_level: typing.Optional[builtins.str] = None, global_custom_fields: typing.Optional[typing.Mapping[builtins.str, typing.Union[builtins.str, builtins.int, builtins.float, builtins.bool, typing.List[typing.Optional[typing.Union[builtins.str, builtins.int, builtins.float, builtins.bool]]]]]] = None, observability_client: typing.Optional[ObservabilityClientBase] = None, data_store: typing.Optional[DataStoreBase] = None, data_store_key_schema_version: typing.Optional[builtins.str] = None, persistent_storage: typing.Optional[PersistentStorageBaseClass] = None, config_compression_mode: typing.Optional[builtins.str] = None, proxy_config: typing.Optional[ProxyConfig] = None, output_logger_provider: typing.Optional[OutputLoggerProviderBase] = None, spec_adapter_configs: typing.Optional[list] = None, use_third_party_ua_parser: typing.Optional[builtins.bool] = None, disable_disk_access: typing.Optional[builtins.bool] = None, experimental_flags: typing.Optional[builtins.set[builtins.str]] = None, id_lists_request_timeout_ms: typing.Optional[builtins.int] = None) -> StatsigOptions: ...
385
392
 
386
393
  @typing.final
387
394
  class StatsigUser:
@@ -315,6 +315,32 @@ impl StatsigBasePy {
315
315
  })
316
316
  }
317
317
 
318
+ #[pyo3(name="_INTERNAL_get_experiment_by_group_name", signature = (experiment_name, group_name))]
319
+ pub fn _internal_get_experiment_by_group_name(
320
+ &self,
321
+ experiment_name: &str,
322
+ group_name: &str,
323
+ py: Python,
324
+ ) -> PyResult<Py<PyDict>> {
325
+ let raw = self
326
+ .inner
327
+ .get_raw_experiment_by_group_name(experiment_name, group_name);
328
+ json_string_to_py_dict(py, &raw)
329
+ }
330
+
331
+ #[pyo3(name="_INTERNAL_get_experiment_by_group_id_advanced", signature = (experiment_name, group_id))]
332
+ pub fn _internal_get_experiment_by_group_id_advanced(
333
+ &self,
334
+ experiment_name: &str,
335
+ group_id: &str,
336
+ py: Python,
337
+ ) -> PyResult<Py<PyDict>> {
338
+ let raw = self
339
+ .inner
340
+ .get_raw_experiment_by_group_id_advanced(experiment_name, group_id);
341
+ json_string_to_py_dict(py, &raw)
342
+ }
343
+
318
344
  #[pyo3(signature = (user, name))]
319
345
  pub fn manually_log_experiment_exposure(
320
346
  &self,
@@ -543,6 +569,11 @@ impl StatsigBasePy {
543
569
  self.inner.get_experiment_list()
544
570
  }
545
571
 
572
+ #[pyo3(name = "get_autotune_list")]
573
+ pub fn get_autotune_list(&self) -> Vec<String> {
574
+ self.inner.get_autotune_list()
575
+ }
576
+
546
577
  #[pyo3(name = "get_parameter_store_list")]
547
578
  pub fn get_parameter_store_list(&self) -> Vec<String> {
548
579
  self.inner.get_parameter_store_list()
@@ -587,6 +618,17 @@ fn extract_event_metadata(metadata: Option<Bound<PyDict>>) -> Option<HashMap<Str
587
618
  metadata.map(|m| py_dict_to_json_value_map(&m))
588
619
  }
589
620
 
621
+ // The group-targeting experiment getters only expose a JSON-string core
622
+ // method (the camelCase ExperimentRaw shape), so parse it into a PyDict here
623
+ // via Python's json module. The resulting keys (ruleID, idType, groupName,
624
+ // value, details) match what the Python Experiment type reads.
625
+ fn json_string_to_py_dict(py: Python, json_str: &str) -> PyResult<Py<PyDict>> {
626
+ let json_module = PyModule::import(py, "json")?;
627
+ let parsed = json_module.call_method1("loads", (json_str,))?;
628
+ let dict = parsed.cast_into::<PyDict>()?;
629
+ Ok(dict.unbind())
630
+ }
631
+
590
632
  fn extract_user_persisted_values(
591
633
  py: Python,
592
634
  spec_name: &str,
@@ -227,6 +227,9 @@ pub struct StatsigOptionsPy {
227
227
  pub disable_disk_access: Option<bool>,
228
228
  #[pyo3(get, set)]
229
229
  pub experimental_flags: Option<HashSet<String>>,
230
+ // Kept last to preserve positional-argument compatibility for StatsigOptions(...).
231
+ #[pyo3(get, set)]
232
+ pub id_lists_request_timeout_ms: Option<u64>,
230
233
  }
231
234
 
232
235
  #[gen_stub_pymethods]
@@ -268,6 +271,7 @@ impl StatsigOptionsPy {
268
271
  use_third_party_ua_parser=None,
269
272
  disable_disk_access=None,
270
273
  experimental_flags=None,
274
+ id_lists_request_timeout_ms=None,
271
275
  ))]
272
276
  #[allow(clippy::too_many_arguments)]
273
277
  pub fn new(
@@ -305,6 +309,7 @@ impl StatsigOptionsPy {
305
309
  use_third_party_ua_parser: Option<bool>,
306
310
  disable_disk_access: Option<bool>,
307
311
  experimental_flags: Option<HashSet<String>>,
312
+ id_lists_request_timeout_ms: Option<u64>,
308
313
  ) -> Self {
309
314
  Self {
310
315
  specs_url,
@@ -341,6 +346,7 @@ impl StatsigOptionsPy {
341
346
  use_third_party_ua_parser,
342
347
  disable_disk_access,
343
348
  experimental_flags,
349
+ id_lists_request_timeout_ms,
344
350
  }
345
351
  }
346
352
  }
@@ -410,6 +416,7 @@ fn create_inner_statsig_options(
410
416
  id_lists_url: opts.id_lists_url.clone(),
411
417
  download_id_list_file_api: opts.download_id_list_file_api.clone(),
412
418
  id_lists_sync_interval_ms: opts.id_lists_sync_interval_ms,
419
+ id_lists_request_timeout_ms: opts.id_lists_request_timeout_ms,
413
420
  fallback_to_statsig_api: opts.fallback_to_statsig_api,
414
421
  environment: opts.environment.clone(),
415
422
  service_name: opts.service_name.clone(),
@@ -0,0 +1,90 @@
1
+ from statsig_python_core import Statsig, StatsigOptions
2
+ from pytest_httpserver import HTTPServer
3
+ import json
4
+ from utils import get_test_data_resource
5
+ import pytest
6
+
7
+
8
+ @pytest.fixture
9
+ def statsig_setup(httpserver: HTTPServer):
10
+ dcs_content = get_test_data_resource("eval_proj_dcs.json")
11
+ json_data = json.loads(dcs_content)
12
+
13
+ httpserver.expect_request(
14
+ "/v2/download_config_specs/secret-key.json"
15
+ ).respond_with_json(json_data)
16
+
17
+ httpserver.expect_request("/v1/log_event").respond_with_json({"success": True})
18
+
19
+ options = StatsigOptions(
20
+ specs_url=httpserver.url_for("/v2/download_config_specs"),
21
+ log_event_url=httpserver.url_for("/v1/log_event"),
22
+ output_log_level="debug",
23
+ )
24
+ statsig = Statsig("secret-key", options)
25
+
26
+ statsig.initialize().wait()
27
+
28
+ yield statsig
29
+
30
+ statsig.shutdown().wait()
31
+
32
+
33
+ def test_get_experiment_by_group_name(statsig_setup):
34
+ statsig = statsig_setup
35
+
36
+ control = statsig.get_experiment_by_group_name(
37
+ "test_experiment_no_targeting", "Control"
38
+ )
39
+ assert control.group_name == "Control"
40
+ assert control.rule_id == "54QJztEPRLXK7ZCvXeY9q4"
41
+ assert control.id_type == "userID"
42
+ assert control.get_string("value", "ERR") == "control"
43
+
44
+ test = statsig.get_experiment_by_group_name(
45
+ "test_experiment_no_targeting", "Test"
46
+ )
47
+ assert test.group_name == "Test"
48
+ assert test.get_string("value", "ERR") == "test_1"
49
+
50
+
51
+ def test_get_experiment_by_group_name_unrecognized(statsig_setup):
52
+ statsig = statsig_setup
53
+
54
+ experiment = statsig.get_experiment_by_group_name(
55
+ "not_an_experiment", "Control"
56
+ )
57
+ assert experiment.group_name is None
58
+ assert experiment.rule_id == ""
59
+
60
+
61
+ def test_get_experiment_by_group_id_advanced(statsig_setup):
62
+ statsig = statsig_setup
63
+
64
+ experiment = statsig.get_experiment_by_group_id_advanced(
65
+ "test_experiment_no_targeting", "54QJztEPRLXK7ZCvXeY9q4"
66
+ )
67
+ assert experiment.group_name == "Control"
68
+ assert experiment.rule_id == "54QJztEPRLXK7ZCvXeY9q4"
69
+ assert experiment.id_type == "userID"
70
+ assert experiment.get_string("value", "ERR") == "control"
71
+
72
+
73
+ def test_get_experiment_by_group_id_advanced_unrecognized(statsig_setup):
74
+ statsig = statsig_setup
75
+
76
+ experiment = statsig.get_experiment_by_group_id_advanced(
77
+ "test_experiment_no_targeting", "not_a_group_id"
78
+ )
79
+ assert experiment.group_name is None
80
+ assert experiment.rule_id == ""
81
+
82
+
83
+ def test_get_experiment_by_group_id_advanced_unknown_experiment(statsig_setup):
84
+ statsig = statsig_setup
85
+
86
+ experiment = statsig.get_experiment_by_group_id_advanced(
87
+ "not_an_experiment", "54QJztEPRLXK7ZCvXeY9q4"
88
+ )
89
+ assert experiment.group_name is None
90
+ assert experiment.rule_id == ""
@@ -0,0 +1,45 @@
1
+ """
2
+ Tests focused on the get_autotune_list API.
3
+ Verifies the configured autotune names are returned.
4
+ """
5
+
6
+ import json
7
+ import pytest
8
+ from statsig_python_core import Statsig, StatsigOptions
9
+ from pytest_httpserver import HTTPServer
10
+ from utils import get_test_data_resource
11
+
12
+
13
+ @pytest.fixture
14
+ def statsig_setup(httpserver: HTTPServer):
15
+ dcs_content = get_test_data_resource("eval_proj_dcs.json")
16
+ json_data = json.loads(dcs_content)
17
+
18
+ httpserver.expect_request(
19
+ "/v2/download_config_specs/secret-key.json"
20
+ ).respond_with_json(json_data)
21
+
22
+ httpserver.expect_request("/v1/log_event").respond_with_json({"success": True})
23
+
24
+ options = StatsigOptions(
25
+ specs_url=httpserver.url_for("/v2/download_config_specs"),
26
+ log_event_url=httpserver.url_for("/v1/log_event"),
27
+ )
28
+ statsig = Statsig("secret-key", options)
29
+
30
+ statsig.initialize().wait()
31
+
32
+ yield statsig
33
+
34
+ statsig.shutdown().wait()
35
+
36
+
37
+ def test_get_autotune_list_returns_configured_autotunes(statsig_setup):
38
+ statsig = statsig_setup
39
+ autotune_list = statsig.get_autotune_list()
40
+
41
+ assert isinstance(autotune_list, list)
42
+ assert "test_autotune" in autotune_list
43
+ assert "test_dub_autotune" in autotune_list
44
+ # Exactly the two fixture autotunes — catches a spurious extra slipping in.
45
+ assert len(autotune_list) == 2
@@ -41,7 +41,7 @@ serde_json = { version = "1.0.143", features = [
41
41
  ] }
42
42
  serde_with = "3.4.0"
43
43
  sha2 = "0.10.8"
44
- sigstat-grpc = { path = "../statsig-grpc", version = "0.19.9-rc.2607010924", optional = true }
44
+ sigstat-grpc = { path = "../statsig-grpc", version = "0.20.0", optional = true }
45
45
  simple_logger = { version = "5.0.0" }
46
46
  tempfile = "3.8.1"
47
47
  tokio = { version = "1.39.1", features = ["full"] }
@@ -39,6 +39,7 @@ pub struct StatsigHttpIdListsAdapter {
39
39
  listener: RwLock<Option<Arc<dyn IdListsUpdateListener>>>,
40
40
  network: NetworkClient,
41
41
  sync_interval_duration: Duration,
42
+ request_timeout_ms: u64,
42
43
  ops_stats: Arc<OpsStatsForInstance>,
43
44
  shutdown_notify: Arc<Notify>,
44
45
  }
@@ -80,6 +81,8 @@ impl StatsigHttpIdListsAdapter {
80
81
  listener: RwLock::new(None),
81
82
  network,
82
83
  sync_interval_duration,
84
+ // 0 means "use the network provider's default timeout".
85
+ request_timeout_ms: options.id_lists_request_timeout_ms.unwrap_or(0),
83
86
  ops_stats: OPS_STATS.get_for_instance(sdk_key),
84
87
  shutdown_notify: Arc::new(Notify::new()),
85
88
  }
@@ -89,13 +92,18 @@ impl StatsigHttpIdListsAdapter {
89
92
  self.shutdown_notify.notify_one();
90
93
  }
91
94
 
92
- async fn fetch_id_list_manifests_from_network(&self) -> Result<IdListsResponse, StatsigErr> {
93
- let request_args = RequestArgs {
95
+ fn build_manifest_request_args(&self) -> RequestArgs {
96
+ RequestArgs {
94
97
  url: self.id_lists_manifest_url.clone(),
95
98
  accept_gzip_response: true,
96
99
  diagnostics_key: Some(KeyType::GetIDListSources),
100
+ timeout_ms: self.request_timeout_ms,
97
101
  ..RequestArgs::new()
98
- };
102
+ }
103
+ }
104
+
105
+ async fn fetch_id_list_manifests_from_network(&self) -> Result<IdListsResponse, StatsigErr> {
106
+ let request_args = self.build_manifest_request_args();
99
107
 
100
108
  let result = if self.is_cdn_url() {
101
109
  self.network.get(request_args.clone()).await
@@ -126,13 +134,13 @@ impl StatsigHttpIdListsAdapter {
126
134
  result
127
135
  }
128
136
 
129
- async fn fetch_individual_id_list_changes_from_network(
137
+ fn build_id_list_download_request_args(
130
138
  &self,
131
139
  list_url: &str,
132
140
  start_index: u64,
133
141
  new_file_size: u64,
134
142
  id_list_file_id: Option<String>,
135
- ) -> Result<String, StatsigErr> {
143
+ ) -> RequestArgs {
136
144
  let list_url = self.get_override_id_list_download_url(list_url);
137
145
  let (headers, query_params) = if list_url.starts_with(STATSIG_CDN_URL) {
138
146
  (
@@ -148,17 +156,34 @@ impl StatsigHttpIdListsAdapter {
148
156
  (Some(headers), None)
149
157
  };
150
158
 
151
- let response = self
152
- .network
153
- .get(RequestArgs {
154
- url: list_url.clone(),
155
- headers,
156
- query_params,
157
- id_list_file_id,
158
- diagnostics_key: Some(KeyType::GetIDList),
159
- ..RequestArgs::new()
160
- })
161
- .await;
159
+ RequestArgs {
160
+ url: list_url,
161
+ headers,
162
+ query_params,
163
+ id_list_file_id,
164
+ diagnostics_key: Some(KeyType::GetIDList),
165
+ timeout_ms: self.request_timeout_ms,
166
+ ..RequestArgs::new()
167
+ }
168
+ }
169
+
170
+ async fn fetch_individual_id_list_changes_from_network(
171
+ &self,
172
+ list_url: &str,
173
+ start_index: u64,
174
+ new_file_size: u64,
175
+ id_list_file_id: Option<String>,
176
+ ) -> Result<String, StatsigErr> {
177
+ let request_args = self.build_id_list_download_request_args(
178
+ list_url,
179
+ start_index,
180
+ new_file_size,
181
+ id_list_file_id,
182
+ );
183
+ // Resolved (post-override) URL, reused below for diagnostics markers.
184
+ let list_url = request_args.url.clone();
185
+
186
+ let response = self.network.get(request_args).await;
162
187
 
163
188
  let response = match response {
164
189
  Ok(response) => response,
@@ -950,6 +975,55 @@ mod tests {
950
975
  );
951
976
  }
952
977
 
978
+ // Builds a download request against a non-CDN URL so we exercise the
979
+ // header/range branch while asserting the timeout is applied.
980
+ fn download_args(adapter: &StatsigHttpIdListsAdapter) -> RequestArgs {
981
+ adapter.build_id_list_download_request_args(
982
+ "https://fake-id-list-host/company_id_list",
983
+ 0,
984
+ 10,
985
+ None,
986
+ )
987
+ }
988
+
989
+ #[test]
990
+ fn test_request_timeout_defaults_to_zero_when_unset() {
991
+ // 0 is the "use the network provider's default timeout" sentinel, so an
992
+ // unset option must not override the existing default behavior.
993
+ let adapter = StatsigHttpIdListsAdapter::new("secret-key", &StatsigOptions::default());
994
+ assert_eq!(adapter.request_timeout_ms, 0);
995
+ assert_eq!(adapter.build_manifest_request_args().timeout_ms, 0);
996
+ assert_eq!(download_args(&adapter).timeout_ms, 0);
997
+ }
998
+
999
+ #[test]
1000
+ fn test_request_timeout_explicit_zero_uses_default() {
1001
+ // Some(0) is treated identically to unset: fall back to the default.
1002
+ let options = StatsigOptions {
1003
+ id_lists_request_timeout_ms: Some(0),
1004
+ ..StatsigOptions::default()
1005
+ };
1006
+
1007
+ let adapter = StatsigHttpIdListsAdapter::new("secret-key", &options);
1008
+ assert_eq!(adapter.request_timeout_ms, 0);
1009
+ }
1010
+
1011
+ #[test]
1012
+ fn test_request_timeout_uses_configured_option() {
1013
+ let options = StatsigOptions {
1014
+ id_lists_request_timeout_ms: Some(25_000),
1015
+ ..StatsigOptions::default()
1016
+ };
1017
+
1018
+ let adapter = StatsigHttpIdListsAdapter::new("secret-key", &options);
1019
+ assert_eq!(adapter.request_timeout_ms, 25_000);
1020
+
1021
+ // Both network request types (manifest fetch + per-file download) must
1022
+ // carry the configured timeout onto their RequestArgs.
1023
+ assert_eq!(adapter.build_manifest_request_args().timeout_ms, 25_000);
1024
+ assert_eq!(download_args(&adapter).timeout_ms, 25_000);
1025
+ }
1026
+
953
1027
  #[tokio::test]
954
1028
  async fn test_syncing_new_id_lists() {
955
1029
  let (_server, adapter, listener, _statsig_rt) = setup(None).await;
@@ -10,7 +10,7 @@ lazy_static! {
10
10
  static ref STATSIG_METADATA: RwLock<StatsigMetadata> = RwLock::new(StatsigMetadata::new());
11
11
  }
12
12
 
13
- pub const SDK_VERSION: &str = "0.19.9-rc.2607010924";
13
+ pub const SDK_VERSION: &str = "0.20.0";
14
14
 
15
15
  const TAG: &str = stringify!(StatsigMetadata);
16
16
 
@@ -54,6 +54,10 @@ pub struct StatsigOptions {
54
54
 
55
55
  pub id_lists_adapter: Option<Arc<dyn IdListsAdapter>>,
56
56
  pub id_lists_sync_interval_ms: Option<u32>,
57
+ /// Per-request timeout (in milliseconds) for ID list network requests (the
58
+ /// manifest fetch and each per-file download). When unset (or 0), requests
59
+ /// fall back to the network provider's default timeout.
60
+ pub id_lists_request_timeout_ms: Option<u64>,
57
61
  pub id_lists_url: Option<String>,
58
62
  pub download_id_list_file_api: Option<String>,
59
63
 
@@ -230,6 +234,12 @@ impl StatsigOptionsBuilder {
230
234
  self
231
235
  }
232
236
 
237
+ #[must_use]
238
+ pub fn id_lists_request_timeout_ms(mut self, id_lists_request_timeout_ms: Option<u64>) -> Self {
239
+ self.inner.id_lists_request_timeout_ms = id_lists_request_timeout_ms;
240
+ self
241
+ }
242
+
233
243
  #[must_use]
234
244
  pub fn download_id_list_file_api(mut self, download_id_list_file_api: Option<String>) -> Self {
235
245
  self.inner.download_id_list_file_api = download_id_list_file_api;
@@ -384,7 +394,7 @@ impl Serialize for StatsigOptions {
384
394
  where
385
395
  S: Serializer,
386
396
  {
387
- let mut state = serializer.serialize_struct("StatsigOptions", 22)?;
397
+ let mut state = serializer.serialize_struct("StatsigOptions", 24)?;
388
398
  serialize_if_not_none!(state, "spec_url", &self.specs_url);
389
399
  serialize_if_not_none!(
390
400
  state,
@@ -428,6 +438,11 @@ impl Serialize for StatsigOptions {
428
438
  "id_lists_sync_interval",
429
439
  &self.id_lists_sync_interval_ms
430
440
  );
441
+ serialize_if_not_none!(
442
+ state,
443
+ "id_lists_request_timeout_ms",
444
+ &self.id_lists_request_timeout_ms
445
+ );
431
446
  serialize_if_not_none!(state, "environment", &self.environment);
432
447
  serialize_if_not_none!(
433
448
  state,
@@ -52,3 +52,14 @@ async fn test_get_parameter_store_list() {
52
52
  "Parameter store list should not be empty"
53
53
  );
54
54
  }
55
+
56
+ #[tokio::test]
57
+ async fn test_get_autotune_list() {
58
+ let statsig = Statsig::new(&get_sdk_key(), None);
59
+ statsig.initialize().await.unwrap();
60
+
61
+ let autotune_list = statsig.get_autotune_list();
62
+
63
+ assert!(!autotune_list.is_empty());
64
+ assert!(autotune_list.contains(&"test_autotune".to_string()));
65
+ }