oai-statsig-python-core 0.29.0rc2__tar.gz → 0.30.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.

Potentially problematic release.


This version of oai-statsig-python-core might be problematic. Click here for more details.

Files changed (442) hide show
  1. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/Cargo.lock +8 -61
  2. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/Cargo.toml +3 -3
  3. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/PKG-INFO +1 -3
  4. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-grpc/README.md +0 -2
  5. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-pyo3/Cargo.toml +1 -0
  6. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-pyo3/README.md +0 -2
  7. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-pyo3/src/statsig_options_py.rs +2 -0
  8. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-pyo3/tests/test_bulk_evaluate_gcir_parity.py +3 -3
  9. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-pyo3/tests/test_data_store.py +2 -2
  10. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-pyo3/tests/test_evaluation_cache_integration.py +2 -2
  11. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-pyo3/tests/test_evaluation_cache_pyo3.py +1 -1
  12. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-pyo3/tests/test_event_logging_adapter.py +1 -1
  13. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-pyo3/tests/test_experiment_serialization.py +1 -1
  14. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-pyo3/tests/test_exposure_logging.py +3 -3
  15. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-pyo3/tests/test_feature_gate_serialization.py +1 -1
  16. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-pyo3/tests/test_forking.py +1 -1
  17. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-pyo3/tests/test_get_dynamic_config.py +1 -1
  18. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-pyo3/tests/test_initialize_with_details.py +1 -1
  19. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-pyo3/tests/test_interned_store_preload.py +26 -2
  20. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-pyo3/tests/test_layer_param_exposure_sampling.py +1 -1
  21. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-pyo3/tests/test_layer_serialization.py +1 -1
  22. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-pyo3/tests/test_observability_client.py +10 -4
  23. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-pyo3/tests/test_override_adapter.py +1 -1
  24. oai_statsig_python_core-0.30.0/statsig-pyo3/tests/test_partial_rollout_boost.py +136 -0
  25. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-pyo3/tests/test_performance.py +2 -2
  26. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-pyo3/tests/test_sdk_event_emitter.py +5 -5
  27. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-pyo3/tests/test_sec_expo_as_primary.py +1 -1
  28. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-pyo3/tests/test_shared_statsig.py +1 -1
  29. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-pyo3/tests/test_shutdown.py +2 -2
  30. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-pyo3/tests/test_statsig.py +1 -1
  31. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-pyo3/tests/test_statsig_options.py +6 -0
  32. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-pyo3/tests/test_statsig_user.py +1 -1
  33. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-pyo3/tests/test_user_exposure_e2e.py +1 -1
  34. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/Cargo.toml +4 -1
  35. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/__tests__/spec_store_tests.rs +499 -5
  36. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/compression/compression_helper.rs +9 -2
  37. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/data_store_interface.rs +9 -0
  38. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/dcs_str.rs +0 -1
  39. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/evaluation/country_lookup.rs +112 -8
  40. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/evaluation/evaluation_data.rs +8 -1
  41. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/evaluation/evaluation_types.rs +16 -0
  42. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/evaluation/evaluator.rs +108 -23
  43. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/evaluation/evaluator_context.rs +12 -7
  44. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/evaluation/evaluator_result.rs +19 -2
  45. oai_statsig_python_core-0.30.0/statsig-rust/src/evaluation_fixture_client.rs +127 -0
  46. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/event_logging/delayed_exposure_store.rs +37 -11
  47. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/event_logging/event_logger.rs +31 -7
  48. oai_statsig_python_core-0.30.0/statsig-rust/src/event_logging/event_queue/batch.rs +1126 -0
  49. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/event_logging/event_queue/queued_event.rs +4 -0
  50. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/event_logging/event_queue/queued_expo.rs +112 -8
  51. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/event_logging/event_queue/queued_gate_expo.rs +4 -0
  52. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/event_logging/event_queue/queued_layer_param_expo.rs +157 -5
  53. oai_statsig_python_core-0.30.0/statsig-rust/src/event_logging/exposure_sampling.rs +1363 -0
  54. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/event_logging/exposure_utils.rs +12 -0
  55. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/event_logging/statsig_event_internal.rs +35 -1
  56. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/event_logging_adapter/event_logging_adapter_trait.rs +84 -3
  57. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/event_logging_adapter/log_event_payload.rs +8 -0
  58. oai_statsig_python_core-0.30.0/statsig-rust/src/event_logging_adapter/statsig_http_event_logging_adapter.rs +453 -0
  59. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/gcir/gcir_formatter.rs +130 -8
  60. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/gcir/gcir_options.rs +1 -1
  61. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/gcir/gcir_process_iter.rs +16 -2
  62. oai_statsig_python_core-0.30.0/statsig-rust/src/global_configs.rs +530 -0
  63. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/id_lists_adapter/statsig_http_id_lists_adapter.rs +30 -47
  64. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/initialize_evaluations_response.rs +3 -1
  65. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/initialize_response.rs +7 -1
  66. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/interned_values/__tests__/interned_store_mmap_fetch_tests.rs +157 -64
  67. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/interned_values/__tests__/interned_store_mmap_v2_tests.rs +77 -4
  68. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/interned_values/__tests__/interned_store_returnable_tests.rs +3 -2
  69. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/interned_values/__tests__/interned_store_string_tests.rs +3 -2
  70. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/interned_values/interned_store/mmap_reader/materialize.rs +1 -0
  71. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/interned_values/interned_store/mmap_reader.rs +10 -2
  72. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/interned_values/interned_store/mmap_writer.rs +27 -11
  73. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/interned_values/interned_store.rs +164 -22
  74. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/interned_values/mmap_data_v2/spec_content_hash.rs +7 -0
  75. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/interned_values/mmap_data_v2.rs +0 -2
  76. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/interned_values/mmap_sync.rs +151 -65
  77. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/lib.rs +15 -0
  78. oai_statsig_python_core-0.30.0/statsig-rust/src/networking/http_types.rs +439 -0
  79. oai_statsig_python_core-0.30.0/statsig-rust/src/networking/mod.rs +22 -0
  80. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/networking/network_client.rs +253 -105
  81. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/networking/providers/mod.rs +3 -0
  82. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/networking/providers/net_provider_noop.rs +0 -1
  83. oai_statsig_python_core-0.30.0/statsig-rust/src/networking/providers/net_provider_reqwest.rs +788 -0
  84. oai_statsig_python_core-0.30.0/statsig-rust/src/networking/statsig_url.rs +492 -0
  85. oai_statsig_python_core-0.30.0/statsig-rust/src/observability/ops_stats.rs +656 -0
  86. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/persistent_storage/persistent_values_manager.rs +4 -0
  87. oai_statsig_python_core-0.30.0/statsig-rust/src/scoped_evaluation_request.rs +1893 -0
  88. oai_statsig_python_core-0.30.0/statsig-rust/src/scoped_id_list_membership_service.rs +1196 -0
  89. oai_statsig_python_core-0.30.0/statsig-rust/src/scoped_snapshot_registry.rs +3123 -0
  90. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/sdk_event_emitter/event_emitter.rs +79 -15
  91. oai_statsig_python_core-0.30.0/statsig-rust/src/snapshot_evaluation_session.rs +1300 -0
  92. oai_statsig_python_core-0.30.0/statsig-rust/src/spec_store.rs +2123 -0
  93. oai_statsig_python_core-0.30.0/statsig-rust/src/specs_adapter/__tests__/remote_config_value_hydrator_tests.rs +3174 -0
  94. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/specs_adapter/config_spec_background_sync_metrics.rs +3 -3
  95. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/specs_adapter/mod.rs +5 -0
  96. oai_statsig_python_core-0.30.0/statsig-rust/src/specs_adapter/remote_config_value_hydrator/json.rs +535 -0
  97. oai_statsig_python_core-0.30.0/statsig-rust/src/specs_adapter/remote_config_value_hydrator/mod.rs +1013 -0
  98. oai_statsig_python_core-0.30.0/statsig-rust/src/specs_adapter/remote_config_value_hydrator/protobuf.rs +1098 -0
  99. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/specs_adapter/response_format.rs +25 -8
  100. oai_statsig_python_core-0.30.0/statsig-rust/src/specs_adapter/scoped_source_specs_adapter.rs +1656 -0
  101. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/specs_adapter/specs_adapter_trait.rs +56 -0
  102. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/specs_adapter/statsig_customized_specs_adapter.rs +18 -2
  103. oai_statsig_python_core-0.30.0/statsig-rust/src/specs_adapter/statsig_data_store_specs_adapter.rs +1177 -0
  104. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/specs_adapter/statsig_grpc_specs_adapter.rs +321 -14
  105. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/specs_adapter/statsig_http_specs_adapter.rs +483 -56
  106. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/specs_adapter/statsig_local_file_specs_adapter.rs +117 -40
  107. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/specs_response/__tests__/proto_stream_reader_tests.rs +72 -0
  108. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/specs_response/mod.rs +1 -0
  109. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/specs_response/parse_options.rs +2 -3
  110. oai_statsig_python_core-0.30.0/statsig-rust/src/specs_response/proto_compression.rs +106 -0
  111. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/specs_response/proto_specs.rs +1268 -50
  112. oai_statsig_python_core-0.30.0/statsig-rust/src/specs_response/proto_stream_reader.rs +202 -0
  113. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/specs_response/spec_types.rs +51 -2
  114. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/specs_response/specs_hash_map.rs +61 -0
  115. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/specs_response/statsig_config_specs.rs +34 -0
  116. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/statsig.rs +324 -33
  117. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/statsig_options.rs +54 -1
  118. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/statsig_runtime.rs +27 -1
  119. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/statsig_type_factories.rs +1 -0
  120. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/statsig_types.rs +19 -2
  121. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/statsig_types_raw.rs +8 -1
  122. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/user/fast_statsig_user.rs +1 -1
  123. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/user/user_data.rs +1 -1
  124. oai_statsig_python_core-0.30.0/statsig-rust/src/utils/mod.rs +35 -0
  125. oai_statsig_python_core-0.30.0/statsig-rust/tests/data/experiment_group_condition.pb.br +0 -0
  126. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/tests/data_store_bytes_adapter_tests.rs +94 -1
  127. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/tests/direct_gcir_tests.rs +2 -4
  128. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/tests/event_logger_flush_tests.rs +49 -0
  129. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/tests/event_logger_usage_tests.rs +293 -0
  130. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/tests/exposure_tests.rs +411 -1
  131. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/tests/gcir_plan_expansion_bench.rs +2 -3
  132. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/tests/gcir_tests.rs +439 -2
  133. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/tests/http_specs_adapter_tests.rs +2 -6
  134. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/tests/layer_serialization_tests.rs +10 -1
  135. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/tests/observability_client_usage_tests.rs +49 -3
  136. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/tests/proto_specs_usage_tests.rs +31 -1
  137. oai_statsig_python_core-0.30.0/statsig-rust/tests/remote_config_value_hydration_tests.rs +910 -0
  138. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/tests/statsig_local_file_event_logging_adapter_tests.rs +1 -0
  139. oai_statsig_python_core-0.30.0/statsig-rust/tests/statsig_local_file_specs_adapter_tests.rs +400 -0
  140. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/tests/utils/mock_data_store.rs +37 -8
  141. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/tests/utils/mock_event_logging_adapter.rs +7 -1
  142. oai_statsig_python_core-0.29.0rc2/statsig-rust/src/event_logging/event_queue/batch.rs +0 -149
  143. oai_statsig_python_core-0.29.0rc2/statsig-rust/src/event_logging/exposure_sampling.rs +0 -361
  144. oai_statsig_python_core-0.29.0rc2/statsig-rust/src/event_logging_adapter/statsig_http_event_logging_adapter.rs +0 -196
  145. oai_statsig_python_core-0.29.0rc2/statsig-rust/src/global_configs.rs +0 -154
  146. oai_statsig_python_core-0.29.0rc2/statsig-rust/src/networking/http_types.rs +0 -212
  147. oai_statsig_python_core-0.29.0rc2/statsig-rust/src/networking/mod.rs +0 -12
  148. oai_statsig_python_core-0.29.0rc2/statsig-rust/src/networking/providers/net_provider_reqwest.rs +0 -344
  149. oai_statsig_python_core-0.29.0rc2/statsig-rust/src/observability/ops_stats.rs +0 -237
  150. oai_statsig_python_core-0.29.0rc2/statsig-rust/src/spec_store.rs +0 -1114
  151. oai_statsig_python_core-0.29.0rc2/statsig-rust/src/specs_adapter/statsig_data_store_specs_adapter.rs +0 -414
  152. oai_statsig_python_core-0.29.0rc2/statsig-rust/src/specs_response/proto_stream_reader.rs +0 -113
  153. oai_statsig_python_core-0.29.0rc2/statsig-rust/src/utils/mod.rs +0 -227
  154. oai_statsig_python_core-0.29.0rc2/statsig-rust/tests/statsig_local_file_specs_adapter_tests.rs +0 -151
  155. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/py_src/statsig_python_core/__init__.py +0 -0
  156. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/py_src/statsig_python_core/_frozen_json.py +0 -0
  157. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/py_src/statsig_python_core/data_store.py +0 -0
  158. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/py_src/statsig_python_core/error_boundary.py +0 -0
  159. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/py_src/statsig_python_core/evaluation_cache.py +0 -0
  160. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/py_src/statsig_python_core/event_logging_adapter.py +0 -0
  161. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/py_src/statsig_python_core/observability_client.py +0 -0
  162. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/py_src/statsig_python_core/output_logger_provider.py +0 -0
  163. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/py_src/statsig_python_core/persistent_storage.py +0 -0
  164. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/py_src/statsig_python_core/py.typed +0 -0
  165. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/py_src/statsig_python_core/requirements.txt +0 -0
  166. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/py_src/statsig_python_core/statsig.py +0 -0
  167. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/py_src/statsig_python_core/statsig_python_core.pyi +0 -0
  168. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/py_src/statsig_python_core/statsig_types.py +0 -0
  169. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/pyproject.toml +0 -0
  170. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-grpc/Cargo.toml +0 -0
  171. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-grpc/build.rs +0 -0
  172. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-grpc/src/lib.rs +0 -0
  173. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-grpc/src/mock_forward_proxy.rs +0 -0
  174. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-grpc/src/protos/statsig_forward_proxy.proto +0 -0
  175. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-grpc/src/statsig_forward_proxy.rs +0 -0
  176. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-grpc/src/statsig_grpc_client.rs +0 -0
  177. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-grpc/src/statsig_grpc_err.rs +0 -0
  178. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-pyo3/.github/workflows/CI.yml +0 -0
  179. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-pyo3/.gitignore +0 -0
  180. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-pyo3/benchmarks/dynamic_config_value_cache_benchmark.py +0 -0
  181. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-pyo3/benchmarks/user_creation_benchmark.py +0 -0
  182. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-pyo3/benchmarks/user_memory_benchmark.py +0 -0
  183. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-pyo3/src/bin/stub_gen.rs +0 -0
  184. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-pyo3/src/data_store_base_py.rs +0 -0
  185. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-pyo3/src/event_logging_adapter_base_py.rs +0 -0
  186. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-pyo3/src/interned_store_py.rs +0 -0
  187. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-pyo3/src/lib.rs +0 -0
  188. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-pyo3/src/observability_client_base_py.rs +0 -0
  189. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-pyo3/src/output_logger_provider_base_py.rs +0 -0
  190. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-pyo3/src/pyo_utils.rs +0 -0
  191. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-pyo3/src/raw_evaluation_compat_py.rs +0 -0
  192. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-pyo3/src/safe_gil.rs +0 -0
  193. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-pyo3/src/statsig_base_py.rs +0 -0
  194. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-pyo3/src/statsig_metadata_py.rs +0 -0
  195. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-pyo3/src/statsig_persistent_storage_override_adapter_py.rs +0 -0
  196. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-pyo3/src/statsig_types_py.rs +0 -0
  197. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-pyo3/src/statsig_user_py.rs +0 -0
  198. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-pyo3/src/unit_id_py.rs +0 -0
  199. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-pyo3/src/valid_primitives_py.rs +0 -0
  200. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-pyo3/tests/event_listener_reentrancy_subprocess.py +0 -0
  201. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-pyo3/tests/fork_runner.py +0 -0
  202. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-pyo3/tests/mock_output_logger.py +0 -0
  203. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-pyo3/tests/mock_scrapi.py +0 -0
  204. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-pyo3/tests/profile_util.py +0 -0
  205. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-pyo3/tests/shutdown_sub_proc.py +0 -0
  206. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-pyo3/tests/test_error_boundary.py +0 -0
  207. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-pyo3/tests/test_evaluation_cache.py +0 -0
  208. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-pyo3/tests/test_frozen_json.py +0 -0
  209. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-pyo3/tests/test_output_logger_provider.py +0 -0
  210. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-pyo3/tests/test_statsig_user_json_serialization.py +0 -0
  211. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-pyo3/tests/test_statsig_user_none_fields.py +0 -0
  212. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-pyo3/tests/test_statsig_user_pickle.py +0 -0
  213. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-pyo3/tests/utils.py +0 -0
  214. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/build.rs +0 -0
  215. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/resources/ip_supalite.table +0 -0
  216. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/resources/ua_parser_regex.yaml +0 -0
  217. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/resources/ua_parser_regex_lite.yaml +0 -0
  218. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/__tests__/interned_string_tests.rs +0 -0
  219. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/__tests__/mod.rs +0 -0
  220. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/__tests__/statsig_options_tests.rs +0 -0
  221. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/__tests__/user_value_tests.rs +0 -0
  222. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/compression/mod.rs +0 -0
  223. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/console_capture/console_capture_handler.rs +0 -0
  224. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/console_capture/console_capture_instances.rs +0 -0
  225. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/console_capture/console_capture_options.rs +0 -0
  226. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/console_capture/console_log_line_levels.rs +0 -0
  227. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/console_capture/mod.rs +0 -0
  228. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/evaluation/__tests__/dynamic_returnable_tests.rs +0 -0
  229. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/evaluation/__tests__/mod.rs +0 -0
  230. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/evaluation/__tests__/rkyv_value_tests.rs +0 -0
  231. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/evaluation/cmab_evaluator.rs +0 -0
  232. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/evaluation/comparisons/compare_arrays.rs +0 -0
  233. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/evaluation/comparisons/compare_numbers.rs +0 -0
  234. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/evaluation/comparisons/compare_str_with_regex.rs +0 -0
  235. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/evaluation/comparisons/compare_strings_in_array.rs +0 -0
  236. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/evaluation/comparisons/compare_time.rs +0 -0
  237. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/evaluation/comparisons/compare_versions.rs +0 -0
  238. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/evaluation/comparisons/mod.rs +0 -0
  239. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/evaluation/dynamic_returnable.rs +0 -0
  240. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/evaluation/dynamic_string.rs +0 -0
  241. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/evaluation/dynamic_value.rs +0 -0
  242. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/evaluation/evaluation_details.rs +0 -0
  243. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/evaluation/evaluation_types_initialize_v2.rs +0 -0
  244. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/evaluation/evaluation_types_v2.rs +0 -0
  245. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/evaluation/evaluator_value.rs +0 -0
  246. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/evaluation/get_unit_id.rs +0 -0
  247. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/evaluation/mod.rs +0 -0
  248. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/evaluation/rkyv_value.rs +0 -0
  249. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/evaluation/secondary_exposure_key.rs +0 -0
  250. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/evaluation/user_agent_parsing/first_party_ua_parser.rs +0 -0
  251. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/evaluation/user_agent_parsing/mod.rs +0 -0
  252. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/evaluation/user_agent_parsing/statsig_uaparser/__tests__/mod.rs +0 -0
  253. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/evaluation/user_agent_parsing/statsig_uaparser/__tests__/test_helpers.rs +0 -0
  254. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/evaluation/user_agent_parsing/statsig_uaparser/__tests__/test_tokenizer.rs +0 -0
  255. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/evaluation/user_agent_parsing/statsig_uaparser/__tests__/test_tokenizer_performance.rs +0 -0
  256. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/evaluation/user_agent_parsing/statsig_uaparser/__tests__/test_ua_parser_browser.rs +0 -0
  257. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/evaluation/user_agent_parsing/statsig_uaparser/__tests__/test_ua_parser_os.rs +0 -0
  258. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/evaluation/user_agent_parsing/statsig_uaparser/mod.rs +0 -0
  259. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/evaluation/user_agent_parsing/statsig_uaparser/tokenizer.rs +0 -0
  260. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/evaluation/user_agent_parsing/statsig_uaparser/ua_parser.rs +0 -0
  261. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/evaluation/user_agent_parsing/statsig_uaparser/window_iter.rs +0 -0
  262. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/evaluation/user_agent_parsing/third_party_ua_parser.rs +0 -0
  263. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/evaluation/user_agent_parsing/ua_parser.rs +0 -0
  264. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/event_emitter/statsig_event_emitter_tests.rs +0 -0
  265. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/event_logging/event_logger_constants.rs +0 -0
  266. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/event_logging/event_logger_ops_stats.rs +0 -0
  267. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/event_logging/event_queue/mod.rs +0 -0
  268. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/event_logging/event_queue/queue.rs +0 -0
  269. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/event_logging/event_queue/queued_config_expo.rs +0 -0
  270. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/event_logging/event_queue/queued_experiment_expo.rs +0 -0
  271. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/event_logging/event_queue/queued_passthrough.rs +0 -0
  272. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/event_logging/event_queue/queued_secondary_expo.rs +0 -0
  273. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/event_logging/flush_interval.rs +0 -0
  274. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/event_logging/flush_type.rs +0 -0
  275. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/event_logging/mod.rs +0 -0
  276. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/event_logging/sec_expo_as_primary_experiment.rs +0 -0
  277. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/event_logging/statsig_event.rs +0 -0
  278. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/event_logging_adapter/mod.rs +0 -0
  279. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/event_logging_adapter/statsig_local_file_event_logging_adapter.rs +0 -0
  280. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/gcir/dynamic_configs_processor.rs +0 -0
  281. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/gcir/evaluation_plan.rs +0 -0
  282. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/gcir/feature_gates_processor.rs +0 -0
  283. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/gcir/layer_configs_processor.rs +0 -0
  284. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/gcir/mod.rs +0 -0
  285. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/gcir/param_stores_processor.rs +0 -0
  286. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/gcir/secondary_exposure_hashing.rs +0 -0
  287. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/gcir/stringify_sec_exposures.rs +0 -0
  288. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/gcir/target_app_id_utils.rs +0 -0
  289. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/gcir/timing.rs +0 -0
  290. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/hashing/ahash.rs +0 -0
  291. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/hashing/djb2.rs +0 -0
  292. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/hashing/hash_util.rs +0 -0
  293. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/hashing/memo_sha_256.rs +0 -0
  294. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/hashing/mod.rs +0 -0
  295. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/id_lists_adapter/id_list.rs +0 -0
  296. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/id_lists_adapter/id_lists_adapter_trait.rs +0 -0
  297. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/id_lists_adapter/mod.rs +0 -0
  298. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/init_details.rs +0 -0
  299. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/initialize_v2_response.rs +0 -0
  300. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/instance_registry.rs +0 -0
  301. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/interned_string.rs +0 -0
  302. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/interned_values/__tests__/interned_store_eval_value_tests.rs +0 -0
  303. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/interned_values/__tests__/mod.rs +0 -0
  304. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/interned_values/interned_store/mmap_artifact.rs +0 -0
  305. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/interned_values/interned_store/mmap_manifest.rs +0 -0
  306. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/interned_values/interned_store/mmap_reader/memory.rs +0 -0
  307. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/interned_values/mmap_data_v2/evaluator_value.rs +0 -0
  308. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/interned_values/mmap_data_v2/spec.rs +0 -0
  309. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/interned_values/mod.rs +0 -0
  310. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/logging_utils.rs +0 -0
  311. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/macros.rs +0 -0
  312. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/networking/__tests__/mod.rs +0 -0
  313. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/networking/__tests__/response_data_tests.rs +0 -0
  314. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/networking/network_error.rs +0 -0
  315. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/networking/providers/net_provider_global.rs +0 -0
  316. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/networking/proxy_config.rs +0 -0
  317. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/observability/console_capture_observer.rs +0 -0
  318. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/observability/diagnostics_observer.rs +0 -0
  319. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/observability/mod.rs +0 -0
  320. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/observability/observability_client_adapter.rs +0 -0
  321. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/observability/sdk_errors_observer.rs +0 -0
  322. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/output_logger.rs +0 -0
  323. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/override_adapter/mod.rs +0 -0
  324. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/override_adapter/override_adapter_trait.rs +0 -0
  325. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/override_adapter/statsig_local_override_adapter.rs +0 -0
  326. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/persistent_storage/__tests__/mod.rs +0 -0
  327. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/persistent_storage/__tests__/sticky_values_serialization_tests.rs +0 -0
  328. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/persistent_storage/mod.rs +0 -0
  329. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/persistent_storage/persistent_storage_trait.rs +0 -0
  330. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/sdk_diagnostics/diagnostics.rs +0 -0
  331. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/sdk_diagnostics/diagnostics_utils.rs +0 -0
  332. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/sdk_diagnostics/marker.rs +0 -0
  333. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/sdk_diagnostics/mod.rs +0 -0
  334. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/sdk_event_emitter/event_emitter_tests.rs +0 -0
  335. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/sdk_event_emitter/event_types.rs +0 -0
  336. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/sdk_event_emitter/mod.rs +0 -0
  337. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/specs_adapter/statsig_bootstrap_specs_adapter.rs +0 -0
  338. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/specs_response/__tests__/mod.rs +0 -0
  339. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/specs_response/__tests__/proto_specs_syncing_tests.rs +0 -0
  340. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/specs_response/__tests__/proto_specs_unknown_tests.rs +0 -0
  341. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/specs_response/__tests__/proto_specs_vs_json_tests.rs +0 -0
  342. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/specs_response/cmab_types.rs +0 -0
  343. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/specs_response/explicit_params.rs +0 -0
  344. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/specs_response/param_store_types.rs +0 -0
  345. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/statsig_core_api_options.rs +0 -0
  346. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/statsig_err.rs +0 -0
  347. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/statsig_global.rs +0 -0
  348. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/statsig_metadata.rs +0 -0
  349. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/user/into_optional.rs +0 -0
  350. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/user/mod.rs +0 -0
  351. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/user/statsig_user.rs +0 -0
  352. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/user/statsig_user_builder.rs +0 -0
  353. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/user/statsig_user_internal.rs +0 -0
  354. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/user/statsig_user_loggable.rs +0 -0
  355. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/user/unit_id.rs +0 -0
  356. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/user/user_value.rs +0 -0
  357. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/src/value_parsing.rs +0 -0
  358. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/tests/check_gate_tests.rs +0 -0
  359. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/tests/customized_specs_adapter_tests.rs +0 -0
  360. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/tests/data/big_number_dcs.json +0 -0
  361. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/tests/data/check_gate_perf_dcs.json +0 -0
  362. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/tests/data/company_id_list +0 -0
  363. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/tests/data/dcs_error.json +0 -0
  364. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/tests/data/dcs_missing_gates.json +0 -0
  365. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/tests/data/dcs_non_case_sensitive.json +0 -0
  366. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/tests/data/dcs_user_agent_versions.json +0 -0
  367. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/tests/data/dcs_with_analytical_exposure_sampling.json +0 -0
  368. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/tests/data/dcs_with_checksum.json +0 -0
  369. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/tests/data/dcs_with_sampling.json +0 -0
  370. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/tests/data/dcs_with_sdk_configs.json +0 -0
  371. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/tests/data/demo_proj_dcs.json +0 -0
  372. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/tests/data/demo_proj_dcs.pb.br +0 -0
  373. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/tests/data/eval_proj_dcs.json +0 -0
  374. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/tests/data/eval_proj_dcs.pb.br +0 -0
  375. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/tests/data/get_id_lists.json +0 -0
  376. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/tests/data/perf_proj_dcs.json +0 -0
  377. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/tests/data/perf_proj_dcs.pb.br +0 -0
  378. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/tests/data/shared_dict_dict_only.json +0 -0
  379. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/tests/data/shared_dict_original_dcs.json +0 -0
  380. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/tests/data/shared_dict_response_uncompressed.json +0 -0
  381. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/tests/data/shared_dict_response_with_dict.json +0 -0
  382. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/tests/data/shared_dict_response_without_dict.json +0 -0
  383. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/tests/data/test_must_pass_user_agents.txt +0 -0
  384. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/tests/data/test_user_agents.txt +0 -0
  385. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/tests/data/ua_string_cases.json +0 -0
  386. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/tests/data/unknown_enum.pb.br +0 -0
  387. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/tests/data_store_json_bytes_tests.rs +0 -0
  388. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/tests/data_store_json_only_no_bytes_methods_tests.rs +0 -0
  389. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/tests/data_store_lock_tests.rs +0 -0
  390. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/tests/data_store_proto_bytes_tests.rs +0 -0
  391. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/tests/delayed_exposure_bench.rs +0 -0
  392. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/tests/dynamic_string_tests.rs +0 -0
  393. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/tests/dynamic_value_tests.rs +0 -0
  394. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/tests/evaluation_details_tests.rs +0 -0
  395. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/tests/evaluator_value_tests.rs +0 -0
  396. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/tests/event_logger_failing_flush_tests.rs +0 -0
  397. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/tests/event_logger_high_qps_tests.rs +0 -0
  398. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/tests/expected_evaluation_tests.rs +0 -0
  399. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/tests/exposure_sampling_key_tests.rs +0 -0
  400. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/tests/flushing_tests.rs +0 -0
  401. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/tests/gate_inversion_eval_tests.rs +0 -0
  402. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/tests/global_configs_test.rs +0 -0
  403. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/tests/grpc_specs_adapter_tests.rs +0 -0
  404. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/tests/hash_util_evaluation_hash_tests.rs +0 -0
  405. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/tests/initialize_timeout_test.rs +0 -0
  406. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/tests/instance_registry_tests.rs +0 -0
  407. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/tests/interner_contention_bench.rs +0 -0
  408. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/tests/list_methods_tests.rs +0 -0
  409. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/tests/network_client_streaming_tests.rs +0 -0
  410. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/tests/network_client_tests.rs +0 -0
  411. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/tests/network_failure_tests.rs +0 -0
  412. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/tests/output_logger_tests.rs +0 -0
  413. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/tests/override_adapter_tests.rs +0 -0
  414. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/tests/perf_tests.rs +0 -0
  415. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/tests/spec_store_lock_tests.rs +0 -0
  416. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/tests/spec_types_tests.rs +0 -0
  417. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/tests/statsig_disable_network_tests.rs +0 -0
  418. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/tests/statsig_environment_tests.rs +0 -0
  419. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/tests/statsig_event_emitter_usage_test.rs +0 -0
  420. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/tests/statsig_global_tests.rs +0 -0
  421. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/tests/statsig_options_tests.rs +0 -0
  422. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/tests/statsig_shared_tests.rs +0 -0
  423. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/tests/statsig_tests.rs +0 -0
  424. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/tests/statsig_user_builder_tests.rs +0 -0
  425. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/tests/statsig_user_field_accessor_tests.rs +0 -0
  426. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/tests/statsig_user_internal_tests.rs +0 -0
  427. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/tests/statsig_user_loggable_tests.rs +0 -0
  428. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/tests/statsig_user_tests.rs +0 -0
  429. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/tests/substring_search_bench.rs +0 -0
  430. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/tests/syncing_network_failure_tests.rs +0 -0
  431. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/tests/typed_getters_tests.rs +0 -0
  432. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/tests/ua_parser_util_test.rs +0 -0
  433. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/tests/user_agent_tests_first_party.rs +0 -0
  434. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/tests/user_json_tests.rs +0 -0
  435. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/tests/utils/env_var_guard.rs +0 -0
  436. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/tests/utils/helpers.rs +0 -0
  437. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/tests/utils/mock_log_provider.rs +0 -0
  438. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/tests/utils/mock_observability_client.rs +0 -0
  439. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/tests/utils/mock_scrapi.rs +0 -0
  440. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/tests/utils/mock_specs_adapter.rs +0 -0
  441. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/tests/utils/mock_specs_listener.rs +0 -0
  442. {oai_statsig_python_core-0.29.0rc2 → oai_statsig_python_core-0.30.0}/statsig-rust/tests/utils/mod.rs +0 -0
@@ -103,6 +103,8 @@ dependencies = [
103
103
  "memchr",
104
104
  "pin-project-lite",
105
105
  "tokio",
106
+ "zstd",
107
+ "zstd-safe",
106
108
  ]
107
109
 
108
110
  [[package]]
@@ -558,16 +560,6 @@ dependencies = [
558
560
  "typenum",
559
561
  ]
560
562
 
561
- [[package]]
562
- name = "csbindgen"
563
- version = "1.9.3"
564
- source = "registry+https://github.com/rust-lang/crates.io-index"
565
- checksum = "c26b9831049b947d154bba920e4124053def72447be6fb106a96f483874b482a"
566
- dependencies = [
567
- "regex",
568
- "syn 2.0.117",
569
- ]
570
-
571
563
  [[package]]
572
564
  name = "ctor"
573
565
  version = "0.2.9"
@@ -1738,7 +1730,7 @@ dependencies = [
1738
1730
 
1739
1731
  [[package]]
1740
1732
  name = "oai-statsig-grpc"
1741
- version = "0.29.0-rc.2"
1733
+ version = "0.30.0"
1742
1734
  dependencies = [
1743
1735
  "async-trait",
1744
1736
  "chrono",
@@ -1753,7 +1745,7 @@ dependencies = [
1753
1745
 
1754
1746
  [[package]]
1755
1747
  name = "oai-statsig-rust"
1756
- version = "0.29.0-rc.2"
1748
+ version = "0.30.0"
1757
1749
  dependencies = [
1758
1750
  "ahash",
1759
1751
  "arc-swap",
@@ -1798,6 +1790,7 @@ dependencies = [
1798
1790
  "tonic 0.14.2",
1799
1791
  "tonic-prost-build",
1800
1792
  "uaparser",
1793
+ "url",
1801
1794
  "uuid",
1802
1795
  "windows-sys 0.61.2",
1803
1796
  "wiremock",
@@ -2455,12 +2448,6 @@ dependencies = [
2455
2448
  "regex-syntax",
2456
2449
  ]
2457
2450
 
2458
- [[package]]
2459
- name = "regex-lite"
2460
- version = "0.1.6"
2461
- source = "registry+https://github.com/rust-lang/crates.io-index"
2462
- checksum = "53a49587ad06b26609c52e423de037e7f57f20d53535d66e08c695f347df952a"
2463
-
2464
2451
  [[package]]
2465
2452
  name = "regex-syntax"
2466
2453
  version = "0.8.5"
@@ -2619,32 +2606,6 @@ dependencies = [
2619
2606
  "windows-sys 0.60.2",
2620
2607
  ]
2621
2608
 
2622
- [[package]]
2623
- name = "rustler"
2624
- version = "0.36.1"
2625
- source = "registry+https://github.com/rust-lang/crates.io-index"
2626
- checksum = "f04a7b61bf2db5495d6c0d2eb4b3f0f366864d47f2482834656e25d1b25fe290"
2627
- dependencies = [
2628
- "inventory",
2629
- "libloading",
2630
- "regex-lite",
2631
- "rustler_codegen",
2632
- "serde",
2633
- ]
2634
-
2635
- [[package]]
2636
- name = "rustler_codegen"
2637
- version = "0.36.1"
2638
- source = "registry+https://github.com/rust-lang/crates.io-index"
2639
- checksum = "bf9365a04e3a3a4d3136953d97c67fd0a9c036d36197917961551c2cc1ecb385"
2640
- dependencies = [
2641
- "heck 0.5.0",
2642
- "inventory",
2643
- "proc-macro2",
2644
- "quote",
2645
- "syn 2.0.117",
2646
- ]
2647
-
2648
2609
  [[package]]
2649
2610
  name = "rustls"
2650
2611
  version = "0.23.25"
@@ -3043,7 +3004,7 @@ checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f"
3043
3004
 
3044
3005
  [[package]]
3045
3006
  name = "statsig-node"
3046
- version = "0.29.0-rc.2"
3007
+ version = "0.30.0"
3047
3008
  dependencies = [
3048
3009
  "async-trait",
3049
3010
  "napi",
@@ -3058,7 +3019,7 @@ dependencies = [
3058
3019
 
3059
3020
  [[package]]
3060
3021
  name = "statsig-pyo3"
3061
- version = "0.29.0-rc.2"
3022
+ version = "0.30.0"
3062
3023
  dependencies = [
3063
3024
  "async-trait",
3064
3025
  "lazy_static",
@@ -3071,26 +3032,12 @@ dependencies = [
3071
3032
  "serde_json",
3072
3033
  ]
3073
3034
 
3074
- [[package]]
3075
- name = "statsig_elixir"
3076
- version = "0.29.0-rc.2"
3077
- dependencies = [
3078
- "async-trait",
3079
- "oai-statsig-rust",
3080
- "parking_lot",
3081
- "rustler",
3082
- "serde",
3083
- "serde_json",
3084
- "tokio",
3085
- ]
3086
-
3087
3035
  [[package]]
3088
3036
  name = "statsig_ffi"
3089
- version = "0.29.0-rc.2"
3037
+ version = "0.30.0"
3090
3038
  dependencies = [
3091
3039
  "async-trait",
3092
3040
  "cbindgen",
3093
- "csbindgen",
3094
3041
  "jni",
3095
3042
  "lazy_static",
3096
3043
  "log",
@@ -1,7 +1,7 @@
1
1
  [profile.release]
2
2
  codegen-units = 1
3
- lto = true
4
- opt-level = "z"
3
+ lto = "thin"
4
+ opt-level = 3
5
5
  strip = true
6
6
 
7
7
  # Keep native symbols in Python wheels so production profiles can resolve Rust
@@ -26,7 +26,7 @@ exclude = [
26
26
  [workspace.package]
27
27
  edition = "2021"
28
28
  license = "ISC"
29
- version = "0.29.0-rc.2"
29
+ version = "0.30.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.29.0rc2
3
+ Version: 0.30.0
4
4
  Classifier: Programming Language :: Rust
5
5
  Classifier: Programming Language :: Python :: Implementation :: CPython
6
6
  Classifier: Programming Language :: Python :: Implementation :: PyPy
@@ -53,13 +53,11 @@ Bindings
53
53
 
54
54
  - Python [[pypi](https://pypi.org/project/oai-statsig-python-core)] [[source](https://github.com/statsig-io/statsig-server-core/blob/main/statsig-pyo3)] [[docs](https://docs.statsig.com/server-core/python-core?ref=gh_server_core)]
55
55
 
56
- - PHP [[packagist](https://packagist.org/packages/statsig/statsig-php-core)] [[source](https://github.com/statsig-io/statsig-server-core/blob/main/statsig-php)] [[docs](https://docs.statsig.com/server-core/php-core?ref=gh_server_core)]
57
56
 
58
57
  - Java [[maven](https://central.sonatype.com/artifact/com.oaistatsig/javacore)] [[source](https://github.com/openai/statsig-priv-server-core/tree/main/statsig-java)] [[docs](https://docs.statsig.com/server-core/java-core?ref=gh_server_core)]
59
58
 
60
59
  - Rust [[crates.io](https://crates.io/crates/oai-statsig-rust)] [[source](https://github.com/statsig-io/statsig-server-core/tree/main/statsig-rust)] [[docs](https://docs.statsig.com/server-core/rust-core?ref=gh_server_core)]
61
60
 
62
- - Elixir [[hex](https://hex.pm/packages/statsig_elixir)] [[source](https://github.com/statsig-io/statsig-server-core/tree/main/statsig-elixir)] [[docs](https://docs.statsig.com/server-core/elixir-core?ref=gh_server_core)]
63
61
 
64
62
 
65
63
 
@@ -33,13 +33,11 @@ Bindings
33
33
 
34
34
  - Python [[pypi](https://pypi.org/project/oai-statsig-python-core)] [[source](https://github.com/statsig-io/statsig-server-core/blob/main/statsig-pyo3)] [[docs](https://docs.statsig.com/server-core/python-core?ref=gh_server_core)]
35
35
 
36
- - PHP [[packagist](https://packagist.org/packages/statsig/statsig-php-core)] [[source](https://github.com/statsig-io/statsig-server-core/blob/main/statsig-php)] [[docs](https://docs.statsig.com/server-core/php-core?ref=gh_server_core)]
37
36
 
38
37
  - Java [[maven](https://central.sonatype.com/artifact/com.oaistatsig/javacore)] [[source](https://github.com/openai/statsig-priv-server-core/tree/main/statsig-java)] [[docs](https://docs.statsig.com/server-core/java-core?ref=gh_server_core)]
39
38
 
40
39
  - Rust [[crates.io](https://crates.io/crates/oai-statsig-rust)] [[source](https://github.com/statsig-io/statsig-server-core/tree/main/statsig-rust)] [[docs](https://docs.statsig.com/server-core/rust-core?ref=gh_server_core)]
41
40
 
42
- - Elixir [[hex](https://hex.pm/packages/statsig_elixir)] [[source](https://github.com/statsig-io/statsig-server-core/tree/main/statsig-elixir)] [[docs](https://docs.statsig.com/server-core/elixir-core?ref=gh_server_core)]
43
41
 
44
42
 
45
43
 
@@ -22,6 +22,7 @@ statsig-rust = { package = "oai-statsig-rust", path = "../statsig-rust", feature
22
22
  "with_grpc",
23
23
  "ffi-support",
24
24
  "ordered_user_data_maps",
25
+ "pyo3_event_zstd",
25
26
  ] }
26
27
  async-trait = "0.1.81"
27
28
  serde = { version = "1.0.204", features = ["derive"] }
@@ -33,13 +33,11 @@ Bindings
33
33
 
34
34
  - Python [[pypi](https://pypi.org/project/oai-statsig-python-core)] [[source](https://github.com/statsig-io/statsig-server-core/blob/main/statsig-pyo3)] [[docs](https://docs.statsig.com/server-core/python-core?ref=gh_server_core)]
35
35
 
36
- - PHP [[packagist](https://packagist.org/packages/statsig/statsig-php-core)] [[source](https://github.com/statsig-io/statsig-server-core/blob/main/statsig-php)] [[docs](https://docs.statsig.com/server-core/php-core?ref=gh_server_core)]
37
36
 
38
37
  - Java [[maven](https://central.sonatype.com/artifact/com.oaistatsig/javacore)] [[source](https://github.com/openai/statsig-priv-server-core/tree/main/statsig-java)] [[docs](https://docs.statsig.com/server-core/java-core?ref=gh_server_core)]
39
38
 
40
39
  - Rust [[crates.io](https://crates.io/crates/oai-statsig-rust)] [[source](https://github.com/statsig-io/statsig-server-core/tree/main/statsig-rust)] [[docs](https://docs.statsig.com/server-core/rust-core?ref=gh_server_core)]
41
40
 
42
- - Elixir [[hex](https://hex.pm/packages/statsig_elixir)] [[source](https://github.com/statsig-io/statsig-server-core/tree/main/statsig-elixir)] [[docs](https://docs.statsig.com/server-core/elixir-core?ref=gh_server_core)]
43
41
 
44
42
 
45
43
 
@@ -426,6 +426,8 @@ fn create_inner_statsig_options(
426
426
 
427
427
  StatsigOptions {
428
428
  specs_url: opts.specs_url.clone(),
429
+ remote_config_value_source_url: None,
430
+ preserve_dcs_session_update_mode: None,
429
431
  specs_adapter: None,
430
432
  specs_sync_interval_ms: opts.specs_sync_interval_ms,
431
433
  init_timeout_ms: opts.init_timeout_ms,
@@ -64,7 +64,7 @@ def test_bulk_evaluate_all_entities_matches_gcir(httpserver: HTTPServer):
64
64
  dcs_content = get_test_data_resource("eval_proj_dcs.json")
65
65
  specs = json.loads(dcs_content)
66
66
  mock_scrapi.stub(
67
- "/v2/download_config_specs/secret-key.json", response=dcs_content, method="GET"
67
+ "/v2/download_config_specs", response=dcs_content, method="GET"
68
68
  )
69
69
  mock_scrapi.stub("/v1/log_event", response='{"success": true}', method="POST")
70
70
 
@@ -198,7 +198,7 @@ def test_bulk_evaluate_filter_semantics(httpserver: HTTPServer):
198
198
  mock_scrapi = MockScrapi(httpserver)
199
199
  dcs_content = get_test_data_resource("eval_proj_dcs.json")
200
200
  mock_scrapi.stub(
201
- "/v2/download_config_specs/secret-key.json", response=dcs_content, method="GET"
201
+ "/v2/download_config_specs", response=dcs_content, method="GET"
202
202
  )
203
203
  mock_scrapi.stub("/v1/log_event", response='{"success": true}', method="POST")
204
204
 
@@ -251,7 +251,7 @@ def test_bulk_evaluate_options_can_skip_local_overrides(httpserver: HTTPServer):
251
251
  mock_scrapi = MockScrapi(httpserver)
252
252
  dcs_content = get_test_data_resource("eval_proj_dcs.json")
253
253
  mock_scrapi.stub(
254
- "/v2/download_config_specs/secret-key.json", response=dcs_content, method="GET"
254
+ "/v2/download_config_specs", response=dcs_content, method="GET"
255
255
  )
256
256
  mock_scrapi.stub("/v1/log_event", response='{"success": true}', method="POST")
257
257
 
@@ -161,7 +161,7 @@ def statsig_setup(httpserver: HTTPServer):
161
161
  data_store = MockDataStore(test_param="test_param")
162
162
 
163
163
  httpserver.expect_request(
164
- "/v2/download_config_specs/secret-key.json"
164
+ "/v2/download_config_specs"
165
165
  ).respond_with_json(updated_dcs_json_data)
166
166
  httpserver.expect_request("/v1/log_event").respond_with_json({"success": True})
167
167
 
@@ -185,7 +185,7 @@ def statsig_bytes_setup(httpserver: HTTPServer):
185
185
  data_store = MockBytesDataStore(test_param="test_param")
186
186
 
187
187
  httpserver.expect_request(
188
- "/v2/download_config_specs/secret-key.json"
188
+ "/v2/download_config_specs"
189
189
  ).respond_with_json(updated_dcs_json_data)
190
190
  httpserver.expect_request("/v1/log_event").respond_with_json({"success": True})
191
191
 
@@ -91,7 +91,7 @@ def _create_statsig(
91
91
  rule["returnValue"] = {"shared": "across-rules"}
92
92
 
93
93
  httpserver.expect_request(
94
- "/v2/download_config_specs/secret-key.json"
94
+ "/v2/download_config_specs"
95
95
  ).respond_with_json(specs)
96
96
  httpserver.expect_request("/v1/log_event").respond_with_json({"success": True})
97
97
 
@@ -126,7 +126,7 @@ def cached_statsig(httpserver: HTTPServer):
126
126
  def cached_statsig_with_event_capture(httpserver: HTTPServer):
127
127
  mock_scrapi = MockScrapi(httpserver)
128
128
  mock_scrapi.stub(
129
- "/v2/download_config_specs/secret-key.json",
129
+ "/v2/download_config_specs",
130
130
  response=get_test_data_resource("eval_proj_dcs.json"),
131
131
  method="GET",
132
132
  )
@@ -23,7 +23,7 @@ def statsig(httpserver: HTTPServer):
23
23
  rule["returnValue"] = _shared_value()
24
24
 
25
25
  httpserver.expect_request(
26
- "/v2/download_config_specs/secret-key.json"
26
+ "/v2/download_config_specs"
27
27
  ).respond_with_json(specs)
28
28
  httpserver.expect_request("/v1/log_event").respond_with_json({"success": True})
29
29
 
@@ -25,7 +25,7 @@ def test_event_logging_adapter_receives_sdk_exposures(httpserver: HTTPServer):
25
25
  mock_scrapi = MockScrapi(httpserver)
26
26
  dcs_content = get_test_data_resource("eval_proj_dcs.json")
27
27
  mock_scrapi.stub(
28
- "/v2/download_config_specs/secret-key.json", response=dcs_content, method="GET"
28
+ "/v2/download_config_specs", response=dcs_content, method="GET"
29
29
  )
30
30
  mock_scrapi.stub("/v1/log_event", response='{"success": true}', method="POST")
31
31
 
@@ -10,7 +10,7 @@ def statsig_setup(httpserver: HTTPServer):
10
10
  json_data = json.loads(dcs_content)
11
11
 
12
12
  httpserver.expect_request(
13
- "/v2/download_config_specs/secret-key.json"
13
+ "/v2/download_config_specs"
14
14
  ).respond_with_json(json_data)
15
15
  httpserver.expect_request("/v1/log_event").respond_with_json({"success": True})
16
16
 
@@ -18,7 +18,7 @@ def statsig_setup(httpserver: HTTPServer):
18
18
  mock_scrapi = MockScrapi(httpserver)
19
19
  dcs_content = get_test_data_resource("eval_proj_dcs.json")
20
20
  mock_scrapi.stub(
21
- "/v2/download_config_specs/secret-key.json", response=dcs_content, method="GET"
21
+ "/v2/download_config_specs", response=dcs_content, method="GET"
22
22
  )
23
23
  mock_scrapi.stub("/v1/log_event", response='{"success": true}', method="POST")
24
24
 
@@ -44,7 +44,7 @@ def callsite_logging_setup(httpserver: HTTPServer):
44
44
  sdk_configs["expo_callsite_logging_experiment::test_experiment_no_targeting"] = 1
45
45
  sdk_configs["expo_callsite_logging_layer::layer_with_many_params"] = 1
46
46
  mock_scrapi.stub(
47
- "/v2/download_config_specs/secret-key.json",
47
+ "/v2/download_config_specs",
48
48
  response=json.dumps(specs),
49
49
  method="GET",
50
50
  )
@@ -340,7 +340,7 @@ def test_bulk_evaluate_disable_all_logging_returns_no_tokens(httpserver: HTTPSer
340
340
  mock_scrapi = MockScrapi(httpserver)
341
341
  dcs_content = get_test_data_resource("eval_proj_dcs.json")
342
342
  mock_scrapi.stub(
343
- "/v2/download_config_specs/secret-key.json", response=dcs_content, method="GET"
343
+ "/v2/download_config_specs", response=dcs_content, method="GET"
344
344
  )
345
345
  mock_scrapi.stub("/v1/log_event", response='{"success": true}', method="POST")
346
346
 
@@ -11,7 +11,7 @@ def statsig_setup(httpserver: HTTPServer):
11
11
  json_data = json.loads(dcs_content)
12
12
 
13
13
  httpserver.expect_request(
14
- "/v2/download_config_specs/secret-key.json"
14
+ "/v2/download_config_specs"
15
15
  ).respond_with_json(json_data)
16
16
  httpserver.expect_request("/v1/log_event").respond_with_json({"success": True})
17
17
 
@@ -20,7 +20,7 @@ def setup_server(httpserver: HTTPServer):
20
20
  mock_scrapi.stub("/v1/log_event", response='{"success": true}', method="POST")
21
21
  dcs_content = get_test_data_resource("eval_proj_dcs.json")
22
22
  mock_scrapi.stub(
23
- "/v2/download_config_specs/secret-forking-test.json",
23
+ "/v2/download_config_specs",
24
24
  response=dcs_content,
25
25
  method="GET",
26
26
  )
@@ -16,7 +16,7 @@ def statsig_setup(httpserver: HTTPServer):
16
16
  json_data = json.loads(dcs_content)
17
17
 
18
18
  httpserver.expect_request(
19
- "/v2/download_config_specs/secret-key.json"
19
+ "/v2/download_config_specs"
20
20
  ).respond_with_json(json_data)
21
21
 
22
22
  httpserver.expect_request("/v1/log_event").respond_with_json({"success": True})
@@ -15,7 +15,7 @@ def statsig_setup(httpserver: HTTPServer):
15
15
  id_lists_json_data = json.loads(id_lists_content)
16
16
 
17
17
  httpserver.expect_request(
18
- "/v2/download_config_specs/secret-key.json"
18
+ "/v2/download_config_specs"
19
19
  ).respond_with_json(json_data)
20
20
 
21
21
  httpserver.expect_request("/v1/log_event").respond_with_json({"success": True})
@@ -1,6 +1,8 @@
1
1
  import json
2
+ import subprocess
2
3
  import sys
3
4
  import uuid
5
+ from pathlib import Path
4
6
 
5
7
  import pytest
6
8
  from pytest_httpserver import HTTPServer
@@ -19,7 +21,10 @@ def server_setup(httpserver: HTTPServer):
19
21
  json_data = json.loads(dcs_content)
20
22
 
21
23
  httpserver.expect_request(
22
- "/v2/download_config_specs/secret-key.json"
24
+ "/v2/download_config_specs"
25
+ ).respond_with_json(json_data)
26
+ httpserver.expect_request(
27
+ "/v2/download_config_specs", headers={"STATSIG-API-KEY": "secret-key"}
23
28
  ).respond_with_json(json_data)
24
29
 
25
30
  httpserver.expect_request("/v1/log_event").respond_with_json({"success": True})
@@ -55,7 +60,26 @@ def test_interned_store_preload(server_setup):
55
60
 
56
61
 
57
62
  def test_interned_store_mmap_preload(server_setup):
58
- specs_url, log_event_url = server_setup
63
+ subprocess.run(
64
+ [
65
+ sys.executable,
66
+ "-c",
67
+ (
68
+ "import sys; "
69
+ "sys.path.insert(0, '.'); "
70
+ "from test_interned_store_preload import "
71
+ "_assert_interned_store_mmap_preload; "
72
+ "_assert_interned_store_mmap_preload(*sys.argv[1:])"
73
+ ),
74
+ *server_setup,
75
+ ],
76
+ cwd=Path(__file__).parent,
77
+ check=True,
78
+ timeout=30,
79
+ )
80
+
81
+
82
+ def _assert_interned_store_mmap_preload(specs_url, log_event_url):
59
83
  sdk_key = "secret-key"
60
84
 
61
85
  fetch_complete = InternedStore.fetch_and_write_mmap(sdk_key, specs_url)
@@ -11,7 +11,7 @@ def sampling_statsig_setup(httpserver: HTTPServer):
11
11
  mock_scrapi = MockScrapi(httpserver)
12
12
  dcs_content = get_test_data_resource("dcs_with_analytical_exposure_sampling.json")
13
13
  mock_scrapi.stub(
14
- "/v2/download_config_specs/secret-key.json",
14
+ "/v2/download_config_specs",
15
15
  response=dcs_content,
16
16
  method="GET",
17
17
  )
@@ -11,7 +11,7 @@ def statsig_setup(httpserver: HTTPServer):
11
11
  json_data = json.loads(dcs_content)
12
12
 
13
13
  httpserver.expect_request(
14
- "/v2/download_config_specs/secret-key.json"
14
+ "/v2/download_config_specs"
15
15
  ).respond_with_json(json_data)
16
16
  httpserver.expect_request("/v1/log_event").respond_with_json({"success": True})
17
17
 
@@ -71,11 +71,17 @@ class MockObservabilityClient(ObservabilityClient):
71
71
  def statsig_setup(httpserver: HTTPServer):
72
72
  dcs_content = get_test_data_resource("eval_proj_dcs.json")
73
73
  json_data = json.loads(dcs_content)
74
- json_data["time"] = json_data["time"]
75
74
  del json_data["checksum"]
76
- httpserver.expect_request(
77
- "/v2/download_config_specs/secret-key.json"
75
+
76
+ repaired_json_data = json_data.copy()
77
+ repaired_json_data["checksum"] = "equal-lcut-repair-checksum"
78
+
79
+ httpserver.expect_ordered_request(
80
+ "/v2/download_config_specs"
78
81
  ).respond_with_json(json_data)
82
+ httpserver.expect_request(
83
+ "/v2/download_config_specs"
84
+ ).respond_with_json(repaired_json_data)
79
85
 
80
86
  httpserver.expect_request("/v1/log_event").respond_with_json({"success": True})
81
87
 
@@ -85,7 +91,7 @@ def statsig_setup(httpserver: HTTPServer):
85
91
  options.specs_url = httpserver.url_for("/v2/download_config_specs")
86
92
  options.log_event_url = httpserver.url_for("/v1/log_event")
87
93
  options.observability_client = observability_client
88
- options.specs_sync_interval_ms = 1
94
+ options.specs_sync_interval_ms = 1000
89
95
  options.output_log_level = "error"
90
96
  statsig = Statsig("secret-key", options)
91
97
 
@@ -11,7 +11,7 @@ def statsig_setup(httpserver: HTTPServer):
11
11
  json_data = json.loads(dcs_content)
12
12
 
13
13
  httpserver.expect_request(
14
- "/v2/download_config_specs/secret-key.json"
14
+ "/v2/download_config_specs"
15
15
  ).respond_with_json(json_data)
16
16
 
17
17
  httpserver.expect_request("/v1/log_event").respond_with_json({"success": True})
@@ -0,0 +1,136 @@
1
+ import json
2
+ import time
3
+ from threading import Event
4
+
5
+ import pytest
6
+ from mock_scrapi import MockScrapi
7
+ from pytest_httpserver import HTTPServer
8
+ from statsig_python_core import Statsig, StatsigOptions, StatsigUser
9
+ from utils import get_test_data_resource
10
+ from werkzeug import Response
11
+
12
+
13
+ def _check_users(statsig, user_ids, gate_name="test_rule_sampling"):
14
+ for user_id in user_ids:
15
+ statsig.check_gate(
16
+ StatsigUser(f"normal-company-rate-user-{user_id}"), gate_name
17
+ )
18
+
19
+
20
+ def _gate_exposures(mock_scrapi, gate_name="test_rule_sampling"):
21
+ return [
22
+ event
23
+ for event in mock_scrapi.get_logged_events()
24
+ if event["eventName"] == "statsig::gate_exposure"
25
+ and event["metadata"]["gate"] == gate_name
26
+ ]
27
+
28
+
29
+ def _is_boosted(event):
30
+ return event.get("statsigMetadata", {}).get("samplingReason") == "rollout_boost"
31
+
32
+
33
+ @pytest.mark.parametrize("refresh_case", ("incomplete", "missing", "null"))
34
+ def test_partial_rollout_boost_fails_closed_after_incomplete_live_refresh(
35
+ httpserver: HTTPServer,
36
+ refresh_case: str,
37
+ ):
38
+ live_gate_name = f"test_rule_sampling_live_refresh_{refresh_case}"
39
+ initial_specs = json.loads(get_test_data_resource("dcs_with_sampling.json"))
40
+ rule = initial_specs["feature_gates"]["test_rule_sampling"]["rules"][0]
41
+ rule["passPercentage"] = 50
42
+ initial_specs.setdefault("sdk_configs", {}).update(
43
+ {
44
+ "sampling_mode": "on",
45
+ "rollout_boost_enabled": 1,
46
+ "rollout_boost_duration_seconds": 3_600,
47
+ "rollout_boost_window_seconds": 300,
48
+ "rollout_boost_per_rollout_limit": 8,
49
+ "rollout_boost_global_limit": 100,
50
+ "rollout_boost_max_rollouts": 1,
51
+ "rollout_boost_rules": json.dumps(
52
+ {
53
+ live_gate_name: {
54
+ rule["id"]: [
55
+ time.time_ns() // 1_000_000,
56
+ rule["passPercentage"],
57
+ ]
58
+ }
59
+ }
60
+ ),
61
+ }
62
+ )
63
+ initial_specs["feature_gates"][live_gate_name] = initial_specs["feature_gates"].pop(
64
+ "test_rule_sampling"
65
+ )
66
+ updated_specs = json.loads(json.dumps(initial_specs))
67
+ updated_specs["time"] = initial_specs["time"] + 1
68
+ if refresh_case == "missing":
69
+ updated_specs.pop("sdk_configs")
70
+ elif refresh_case == "null":
71
+ updated_specs["sdk_configs"] = None
72
+ else:
73
+ updated_specs["sdk_configs"].pop("rollout_boost_global_limit")
74
+
75
+ allow_background_refresh = Event()
76
+ incomplete_config_applied = Event()
77
+ specs_request_count = 0
78
+
79
+ def respond_with_specs(_request):
80
+ nonlocal specs_request_count
81
+ specs_request_count += 1
82
+ if specs_request_count == 1:
83
+ specs = initial_specs
84
+ else:
85
+ allow_background_refresh.wait(timeout=4.0)
86
+ specs = updated_specs
87
+ return Response(json.dumps(specs), content_type="application/json")
88
+
89
+ httpserver.expect_request(
90
+ "/v2/download_config_specs", method="GET"
91
+ ).respond_with_handler(respond_with_specs)
92
+
93
+ mock_scrapi = MockScrapi(httpserver)
94
+ mock_scrapi.stub("/v1/log_event", response='{"success": true}', method="POST")
95
+
96
+ options = StatsigOptions(
97
+ specs_url=httpserver.url_for("/v2/download_config_specs"),
98
+ log_event_url=httpserver.url_for("/v1/log_event"),
99
+ specs_sync_interval_ms=1000,
100
+ )
101
+ options.output_log_level = "none"
102
+ statsig = Statsig("secret-key", options)
103
+
104
+ def record_specs_update(event):
105
+ if event["data"]["values"]["time"] == updated_specs["time"]:
106
+ incomplete_config_applied.set()
107
+
108
+ statsig.subscribe("specs_updated", record_specs_update)
109
+
110
+ try:
111
+ statsig.initialize().wait()
112
+
113
+ _check_users(statsig, range(8), live_gate_name)
114
+ statsig.flush_events().wait()
115
+ initial_events = _gate_exposures(mock_scrapi, live_gate_name)
116
+ initial_boosted = [event for event in initial_events if _is_boosted(event)]
117
+ assert 0 < len(initial_boosted) < 8
118
+ assert any(not _is_boosted(event) for event in initial_events)
119
+ for event in initial_boosted:
120
+ assert event["statsigMetadata"]["samplingMode"] == "on"
121
+ assert event["statsigMetadata"]["samplingRate"] == 1
122
+ assert "rollout_start_time" not in event["statsigMetadata"]
123
+ assert event["metadata"]["gate"] == live_gate_name
124
+ assert event["metadata"]["ruleID"]
125
+
126
+ mock_scrapi.reset()
127
+ allow_background_refresh.set()
128
+ assert incomplete_config_applied.wait(timeout=4.0)
129
+ assert specs_request_count >= 2
130
+
131
+ _check_users(statsig, range(8, 72), live_gate_name)
132
+ statsig.flush_events().wait()
133
+ assert not any(_is_boosted(event) for event in mock_scrapi.get_logged_events())
134
+ finally:
135
+ allow_background_refresh.set()
136
+ statsig.shutdown().wait()