oai-statsig-python-core 0.27.0rc2__tar.gz → 0.28.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 (415) hide show
  1. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/Cargo.lock +6 -6
  2. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/Cargo.toml +1 -1
  3. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/PKG-INFO +2 -2
  4. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/py_src/statsig_python_core/statsig_python_core.pyi +22 -0
  5. {oai_statsig_python_core-0.27.0rc2/statsig-pyo3 → oai_statsig_python_core-0.28.0/statsig-grpc}/README.md +1 -1
  6. {oai_statsig_python_core-0.27.0rc2/statsig-grpc → oai_statsig_python_core-0.28.0/statsig-pyo3}/README.md +1 -1
  7. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-pyo3/src/interned_store_py.rs +52 -1
  8. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-pyo3/src/lib.rs +1 -0
  9. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-pyo3/src/pyo_utils.rs +1 -4
  10. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-pyo3/src/statsig_persistent_storage_override_adapter_py.rs +2 -6
  11. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-pyo3/tests/test_interned_store_preload.py +25 -4
  12. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/Cargo.toml +1 -1
  13. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/__tests__/spec_store_tests.rs +127 -0
  14. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/evaluation/dynamic_returnable.rs +19 -6
  15. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/gcir/dynamic_configs_processor.rs +3 -2
  16. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/instance_registry.rs +48 -29
  17. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/interned_values/__tests__/interned_store_mmap_fetch_tests.rs +263 -110
  18. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/interned_values/__tests__/interned_store_mmap_v2_tests.rs +208 -5
  19. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/interned_values/__tests__/interned_store_returnable_tests.rs +39 -3
  20. oai_statsig_python_core-0.28.0/statsig-rust/src/interned_values/interned_store/mmap_artifact.rs +191 -0
  21. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/interned_values/interned_store/mmap_manifest.rs +62 -15
  22. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/interned_values/interned_store/mmap_reader/materialize.rs +5 -6
  23. oai_statsig_python_core-0.28.0/statsig-rust/src/interned_values/interned_store/mmap_reader/memory.rs +361 -0
  24. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/interned_values/interned_store/mmap_reader.rs +61 -74
  25. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/interned_values/interned_store/mmap_writer.rs +58 -228
  26. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/interned_values/interned_store.rs +71 -74
  27. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/interned_values/mmap_data_v2.rs +12 -0
  28. oai_statsig_python_core-0.28.0/statsig-rust/src/interned_values/mod.rs +18 -0
  29. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/spec_store.rs +109 -45
  30. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/specs_response/proto_specs.rs +33 -6
  31. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/specs_response/spec_types.rs +1 -0
  32. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/specs_response/specs_hash_map.rs +100 -6
  33. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/specs_response/statsig_config_specs.rs +2 -0
  34. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/statsig_types.rs +1 -4
  35. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/tests/instance_registry_tests.rs +91 -0
  36. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/tests/spec_types_tests.rs +21 -1
  37. oai_statsig_python_core-0.27.0rc2/statsig-rust/src/interned_values/__tests__/fixtures/interned_store_v1.mmap +0 -0
  38. oai_statsig_python_core-0.27.0rc2/statsig-rust/src/interned_values/mod.rs +0 -8
  39. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/py_src/statsig_python_core/__init__.py +0 -0
  40. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/py_src/statsig_python_core/_frozen_json.py +0 -0
  41. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/py_src/statsig_python_core/data_store.py +0 -0
  42. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/py_src/statsig_python_core/error_boundary.py +0 -0
  43. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/py_src/statsig_python_core/evaluation_cache.py +0 -0
  44. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/py_src/statsig_python_core/event_logging_adapter.py +0 -0
  45. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/py_src/statsig_python_core/observability_client.py +0 -0
  46. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/py_src/statsig_python_core/output_logger_provider.py +0 -0
  47. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/py_src/statsig_python_core/persistent_storage.py +0 -0
  48. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/py_src/statsig_python_core/py.typed +0 -0
  49. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/py_src/statsig_python_core/requirements.txt +0 -0
  50. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/py_src/statsig_python_core/statsig.py +0 -0
  51. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/py_src/statsig_python_core/statsig_types.py +0 -0
  52. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/pyproject.toml +0 -0
  53. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-grpc/Cargo.toml +0 -0
  54. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-grpc/build.rs +0 -0
  55. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-grpc/src/lib.rs +0 -0
  56. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-grpc/src/mock_forward_proxy.rs +0 -0
  57. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-grpc/src/protos/statsig_forward_proxy.proto +0 -0
  58. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-grpc/src/statsig_forward_proxy.rs +0 -0
  59. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-grpc/src/statsig_grpc_client.rs +0 -0
  60. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-grpc/src/statsig_grpc_err.rs +0 -0
  61. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-pyo3/.github/workflows/CI.yml +0 -0
  62. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-pyo3/.gitignore +0 -0
  63. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-pyo3/Cargo.toml +0 -0
  64. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-pyo3/benchmarks/dynamic_config_value_cache_benchmark.py +0 -0
  65. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-pyo3/benchmarks/user_creation_benchmark.py +0 -0
  66. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-pyo3/benchmarks/user_memory_benchmark.py +0 -0
  67. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-pyo3/src/bin/stub_gen.rs +0 -0
  68. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-pyo3/src/data_store_base_py.rs +0 -0
  69. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-pyo3/src/event_logging_adapter_base_py.rs +0 -0
  70. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-pyo3/src/observability_client_base_py.rs +0 -0
  71. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-pyo3/src/output_logger_provider_base_py.rs +0 -0
  72. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-pyo3/src/raw_evaluation_compat_py.rs +0 -0
  73. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-pyo3/src/safe_gil.rs +0 -0
  74. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-pyo3/src/statsig_base_py.rs +0 -0
  75. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-pyo3/src/statsig_metadata_py.rs +0 -0
  76. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-pyo3/src/statsig_options_py.rs +0 -0
  77. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-pyo3/src/statsig_types_py.rs +0 -0
  78. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-pyo3/src/statsig_user_py.rs +0 -0
  79. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-pyo3/src/unit_id_py.rs +0 -0
  80. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-pyo3/src/valid_primitives_py.rs +0 -0
  81. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-pyo3/tests/event_listener_reentrancy_subprocess.py +0 -0
  82. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-pyo3/tests/fork_runner.py +0 -0
  83. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-pyo3/tests/mock_output_logger.py +0 -0
  84. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-pyo3/tests/mock_scrapi.py +0 -0
  85. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-pyo3/tests/profile_util.py +0 -0
  86. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-pyo3/tests/shutdown_sub_proc.py +0 -0
  87. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-pyo3/tests/test_bulk_evaluate_gcir_parity.py +0 -0
  88. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-pyo3/tests/test_data_store.py +0 -0
  89. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-pyo3/tests/test_error_boundary.py +0 -0
  90. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-pyo3/tests/test_evaluation_cache.py +0 -0
  91. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-pyo3/tests/test_evaluation_cache_integration.py +0 -0
  92. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-pyo3/tests/test_evaluation_cache_pyo3.py +0 -0
  93. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-pyo3/tests/test_event_logging_adapter.py +0 -0
  94. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-pyo3/tests/test_experiment_serialization.py +0 -0
  95. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-pyo3/tests/test_exposure_logging.py +0 -0
  96. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-pyo3/tests/test_feature_gate_serialization.py +0 -0
  97. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-pyo3/tests/test_forking.py +0 -0
  98. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-pyo3/tests/test_frozen_json.py +0 -0
  99. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-pyo3/tests/test_get_dynamic_config.py +0 -0
  100. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-pyo3/tests/test_initialize_with_details.py +0 -0
  101. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-pyo3/tests/test_layer_param_exposure_sampling.py +0 -0
  102. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-pyo3/tests/test_layer_serialization.py +0 -0
  103. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-pyo3/tests/test_observability_client.py +0 -0
  104. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-pyo3/tests/test_output_logger_provider.py +0 -0
  105. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-pyo3/tests/test_override_adapter.py +0 -0
  106. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-pyo3/tests/test_performance.py +0 -0
  107. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-pyo3/tests/test_sdk_event_emitter.py +0 -0
  108. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-pyo3/tests/test_sec_expo_as_primary.py +0 -0
  109. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-pyo3/tests/test_shared_statsig.py +0 -0
  110. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-pyo3/tests/test_shutdown.py +0 -0
  111. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-pyo3/tests/test_statsig.py +0 -0
  112. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-pyo3/tests/test_statsig_options.py +0 -0
  113. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-pyo3/tests/test_statsig_user.py +0 -0
  114. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-pyo3/tests/test_statsig_user_json_serialization.py +0 -0
  115. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-pyo3/tests/test_statsig_user_none_fields.py +0 -0
  116. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-pyo3/tests/test_statsig_user_pickle.py +0 -0
  117. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-pyo3/tests/test_user_exposure_e2e.py +0 -0
  118. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-pyo3/tests/utils.py +0 -0
  119. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/build.rs +0 -0
  120. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/resources/ip_supalite.table +0 -0
  121. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/resources/ua_parser_regex.yaml +0 -0
  122. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/resources/ua_parser_regex_lite.yaml +0 -0
  123. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/__tests__/interned_string_tests.rs +0 -0
  124. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/__tests__/mod.rs +0 -0
  125. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/__tests__/statsig_options_tests.rs +0 -0
  126. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/__tests__/user_value_tests.rs +0 -0
  127. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/compression/compression_helper.rs +0 -0
  128. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/compression/mod.rs +0 -0
  129. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/console_capture/console_capture_handler.rs +0 -0
  130. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/console_capture/console_capture_instances.rs +0 -0
  131. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/console_capture/console_capture_options.rs +0 -0
  132. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/console_capture/console_log_line_levels.rs +0 -0
  133. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/console_capture/mod.rs +0 -0
  134. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/data_store_interface.rs +0 -0
  135. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/dcs_str.rs +0 -0
  136. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/evaluation/__tests__/dynamic_returnable_tests.rs +0 -0
  137. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/evaluation/__tests__/mod.rs +0 -0
  138. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/evaluation/__tests__/rkyv_value_tests.rs +0 -0
  139. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/evaluation/cmab_evaluator.rs +0 -0
  140. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/evaluation/comparisons/compare_arrays.rs +0 -0
  141. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/evaluation/comparisons/compare_numbers.rs +0 -0
  142. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/evaluation/comparisons/compare_str_with_regex.rs +0 -0
  143. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/evaluation/comparisons/compare_strings_in_array.rs +0 -0
  144. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/evaluation/comparisons/compare_time.rs +0 -0
  145. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/evaluation/comparisons/compare_versions.rs +0 -0
  146. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/evaluation/comparisons/mod.rs +0 -0
  147. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/evaluation/country_lookup.rs +0 -0
  148. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/evaluation/dynamic_string.rs +0 -0
  149. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/evaluation/dynamic_value.rs +0 -0
  150. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/evaluation/evaluation_data.rs +0 -0
  151. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/evaluation/evaluation_details.rs +0 -0
  152. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/evaluation/evaluation_types.rs +0 -0
  153. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/evaluation/evaluation_types_initialize_v2.rs +0 -0
  154. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/evaluation/evaluation_types_v2.rs +0 -0
  155. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/evaluation/evaluator.rs +0 -0
  156. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/evaluation/evaluator_context.rs +0 -0
  157. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/evaluation/evaluator_result.rs +0 -0
  158. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/evaluation/evaluator_value.rs +0 -0
  159. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/evaluation/get_unit_id.rs +0 -0
  160. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/evaluation/mod.rs +0 -0
  161. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/evaluation/rkyv_value.rs +0 -0
  162. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/evaluation/secondary_exposure_key.rs +0 -0
  163. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/evaluation/user_agent_parsing/first_party_ua_parser.rs +0 -0
  164. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/evaluation/user_agent_parsing/mod.rs +0 -0
  165. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/evaluation/user_agent_parsing/statsig_uaparser/__tests__/mod.rs +0 -0
  166. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/evaluation/user_agent_parsing/statsig_uaparser/__tests__/test_helpers.rs +0 -0
  167. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/evaluation/user_agent_parsing/statsig_uaparser/__tests__/test_tokenizer.rs +0 -0
  168. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/evaluation/user_agent_parsing/statsig_uaparser/__tests__/test_tokenizer_performance.rs +0 -0
  169. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/evaluation/user_agent_parsing/statsig_uaparser/__tests__/test_ua_parser_browser.rs +0 -0
  170. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/evaluation/user_agent_parsing/statsig_uaparser/__tests__/test_ua_parser_os.rs +0 -0
  171. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/evaluation/user_agent_parsing/statsig_uaparser/mod.rs +0 -0
  172. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/evaluation/user_agent_parsing/statsig_uaparser/tokenizer.rs +0 -0
  173. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/evaluation/user_agent_parsing/statsig_uaparser/ua_parser.rs +0 -0
  174. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/evaluation/user_agent_parsing/statsig_uaparser/window_iter.rs +0 -0
  175. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/evaluation/user_agent_parsing/third_party_ua_parser.rs +0 -0
  176. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/evaluation/user_agent_parsing/ua_parser.rs +0 -0
  177. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/event_emitter/statsig_event_emitter_tests.rs +0 -0
  178. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/event_logging/delayed_exposure_store.rs +0 -0
  179. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/event_logging/event_logger.rs +0 -0
  180. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/event_logging/event_logger_constants.rs +0 -0
  181. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/event_logging/event_logger_ops_stats.rs +0 -0
  182. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/event_logging/event_queue/batch.rs +0 -0
  183. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/event_logging/event_queue/mod.rs +0 -0
  184. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/event_logging/event_queue/queue.rs +0 -0
  185. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/event_logging/event_queue/queued_config_expo.rs +0 -0
  186. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/event_logging/event_queue/queued_event.rs +0 -0
  187. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/event_logging/event_queue/queued_experiment_expo.rs +0 -0
  188. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/event_logging/event_queue/queued_expo.rs +0 -0
  189. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/event_logging/event_queue/queued_gate_expo.rs +0 -0
  190. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/event_logging/event_queue/queued_layer_param_expo.rs +0 -0
  191. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/event_logging/event_queue/queued_passthrough.rs +0 -0
  192. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/event_logging/event_queue/queued_secondary_expo.rs +0 -0
  193. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/event_logging/exposure_sampling.rs +0 -0
  194. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/event_logging/exposure_utils.rs +0 -0
  195. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/event_logging/flush_interval.rs +0 -0
  196. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/event_logging/flush_type.rs +0 -0
  197. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/event_logging/mod.rs +0 -0
  198. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/event_logging/sec_expo_as_primary_experiment.rs +0 -0
  199. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/event_logging/statsig_event.rs +0 -0
  200. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/event_logging/statsig_event_internal.rs +0 -0
  201. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/event_logging_adapter/event_logging_adapter_trait.rs +0 -0
  202. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/event_logging_adapter/log_event_payload.rs +0 -0
  203. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/event_logging_adapter/mod.rs +0 -0
  204. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/event_logging_adapter/statsig_http_event_logging_adapter.rs +0 -0
  205. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/event_logging_adapter/statsig_local_file_event_logging_adapter.rs +0 -0
  206. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/gcir/evaluation_plan.rs +0 -0
  207. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/gcir/feature_gates_processor.rs +0 -0
  208. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/gcir/gcir_formatter.rs +0 -0
  209. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/gcir/gcir_options.rs +0 -0
  210. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/gcir/gcir_process_iter.rs +0 -0
  211. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/gcir/layer_configs_processor.rs +0 -0
  212. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/gcir/mod.rs +0 -0
  213. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/gcir/param_stores_processor.rs +0 -0
  214. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/gcir/secondary_exposure_hashing.rs +0 -0
  215. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/gcir/stringify_sec_exposures.rs +0 -0
  216. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/gcir/target_app_id_utils.rs +0 -0
  217. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/gcir/timing.rs +0 -0
  218. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/global_configs.rs +0 -0
  219. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/hashing/ahash.rs +0 -0
  220. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/hashing/djb2.rs +0 -0
  221. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/hashing/hash_util.rs +0 -0
  222. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/hashing/memo_sha_256.rs +0 -0
  223. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/hashing/mod.rs +0 -0
  224. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/id_lists_adapter/id_list.rs +0 -0
  225. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/id_lists_adapter/id_lists_adapter_trait.rs +0 -0
  226. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/id_lists_adapter/mod.rs +0 -0
  227. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/id_lists_adapter/statsig_http_id_lists_adapter.rs +0 -0
  228. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/init_details.rs +0 -0
  229. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/initialize_evaluations_response.rs +0 -0
  230. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/initialize_response.rs +0 -0
  231. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/initialize_v2_response.rs +0 -0
  232. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/interned_string.rs +0 -0
  233. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/interned_values/__tests__/interned_store_eval_value_tests.rs +0 -0
  234. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/interned_values/__tests__/interned_store_string_tests.rs +0 -0
  235. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/interned_values/__tests__/mod.rs +0 -0
  236. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/interned_values/mmap_data_v2/evaluator_value.rs +0 -0
  237. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/interned_values/mmap_data_v2/spec.rs +0 -0
  238. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/interned_values/mmap_data_v2/spec_content_hash.rs +0 -0
  239. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/interned_values/mmap_sync.rs +0 -0
  240. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/lib.rs +0 -0
  241. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/logging_utils.rs +0 -0
  242. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/macros.rs +0 -0
  243. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/networking/__tests__/mod.rs +0 -0
  244. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/networking/__tests__/response_data_tests.rs +0 -0
  245. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/networking/http_types.rs +0 -0
  246. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/networking/mod.rs +0 -0
  247. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/networking/network_client.rs +0 -0
  248. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/networking/network_error.rs +0 -0
  249. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/networking/providers/mod.rs +0 -0
  250. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/networking/providers/net_provider_global.rs +0 -0
  251. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/networking/providers/net_provider_noop.rs +0 -0
  252. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/networking/providers/net_provider_reqwest.rs +0 -0
  253. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/networking/proxy_config.rs +0 -0
  254. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/observability/console_capture_observer.rs +0 -0
  255. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/observability/diagnostics_observer.rs +0 -0
  256. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/observability/mod.rs +0 -0
  257. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/observability/observability_client_adapter.rs +0 -0
  258. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/observability/ops_stats.rs +0 -0
  259. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/observability/sdk_errors_observer.rs +0 -0
  260. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/output_logger.rs +0 -0
  261. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/override_adapter/mod.rs +0 -0
  262. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/override_adapter/override_adapter_trait.rs +0 -0
  263. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/override_adapter/statsig_local_override_adapter.rs +0 -0
  264. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/persistent_storage/__tests__/mod.rs +0 -0
  265. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/persistent_storage/__tests__/sticky_values_serialization_tests.rs +0 -0
  266. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/persistent_storage/mod.rs +0 -0
  267. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/persistent_storage/persistent_storage_trait.rs +0 -0
  268. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/persistent_storage/persistent_values_manager.rs +0 -0
  269. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/sdk_diagnostics/diagnostics.rs +0 -0
  270. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/sdk_diagnostics/diagnostics_utils.rs +0 -0
  271. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/sdk_diagnostics/marker.rs +0 -0
  272. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/sdk_diagnostics/mod.rs +0 -0
  273. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/sdk_event_emitter/event_emitter.rs +0 -0
  274. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/sdk_event_emitter/event_emitter_tests.rs +0 -0
  275. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/sdk_event_emitter/event_types.rs +0 -0
  276. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/sdk_event_emitter/mod.rs +0 -0
  277. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/specs_adapter/config_spec_background_sync_metrics.rs +0 -0
  278. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/specs_adapter/mod.rs +0 -0
  279. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/specs_adapter/response_format.rs +0 -0
  280. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/specs_adapter/specs_adapter_trait.rs +0 -0
  281. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/specs_adapter/statsig_bootstrap_specs_adapter.rs +0 -0
  282. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/specs_adapter/statsig_customized_specs_adapter.rs +0 -0
  283. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/specs_adapter/statsig_data_store_specs_adapter.rs +0 -0
  284. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/specs_adapter/statsig_grpc_specs_adapter.rs +0 -0
  285. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/specs_adapter/statsig_http_specs_adapter.rs +0 -0
  286. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/specs_adapter/statsig_local_file_specs_adapter.rs +0 -0
  287. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/specs_response/__tests__/mod.rs +0 -0
  288. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/specs_response/__tests__/proto_specs_syncing_tests.rs +0 -0
  289. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/specs_response/__tests__/proto_specs_unknown_tests.rs +0 -0
  290. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/specs_response/__tests__/proto_specs_vs_json_tests.rs +0 -0
  291. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/specs_response/__tests__/proto_stream_reader_tests.rs +0 -0
  292. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/specs_response/cmab_types.rs +0 -0
  293. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/specs_response/explicit_params.rs +0 -0
  294. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/specs_response/mod.rs +0 -0
  295. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/specs_response/param_store_types.rs +0 -0
  296. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/specs_response/proto_stream_reader.rs +0 -0
  297. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/statsig.rs +0 -0
  298. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/statsig_core_api_options.rs +0 -0
  299. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/statsig_err.rs +0 -0
  300. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/statsig_global.rs +0 -0
  301. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/statsig_metadata.rs +0 -0
  302. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/statsig_options.rs +0 -0
  303. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/statsig_runtime.rs +0 -0
  304. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/statsig_type_factories.rs +0 -0
  305. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/statsig_types_raw.rs +0 -0
  306. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/user/fast_statsig_user.rs +0 -0
  307. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/user/into_optional.rs +0 -0
  308. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/user/mod.rs +0 -0
  309. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/user/statsig_user.rs +0 -0
  310. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/user/statsig_user_builder.rs +0 -0
  311. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/user/statsig_user_internal.rs +0 -0
  312. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/user/statsig_user_loggable.rs +0 -0
  313. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/user/unit_id.rs +0 -0
  314. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/user/user_data.rs +0 -0
  315. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/user/user_value.rs +0 -0
  316. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/utils/mod.rs +0 -0
  317. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/src/value_parsing.rs +0 -0
  318. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/tests/check_gate_tests.rs +0 -0
  319. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/tests/customized_specs_adapter_tests.rs +0 -0
  320. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/tests/data/big_number_dcs.json +0 -0
  321. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/tests/data/check_gate_perf_dcs.json +0 -0
  322. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/tests/data/company_id_list +0 -0
  323. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/tests/data/dcs_error.json +0 -0
  324. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/tests/data/dcs_missing_gates.json +0 -0
  325. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/tests/data/dcs_non_case_sensitive.json +0 -0
  326. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/tests/data/dcs_user_agent_versions.json +0 -0
  327. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/tests/data/dcs_with_analytical_exposure_sampling.json +0 -0
  328. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/tests/data/dcs_with_checksum.json +0 -0
  329. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/tests/data/dcs_with_sampling.json +0 -0
  330. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/tests/data/dcs_with_sdk_configs.json +0 -0
  331. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/tests/data/demo_proj_dcs.json +0 -0
  332. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/tests/data/demo_proj_dcs.pb.br +0 -0
  333. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/tests/data/eval_proj_dcs.json +0 -0
  334. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/tests/data/eval_proj_dcs.pb.br +0 -0
  335. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/tests/data/get_id_lists.json +0 -0
  336. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/tests/data/perf_proj_dcs.json +0 -0
  337. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/tests/data/perf_proj_dcs.pb.br +0 -0
  338. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/tests/data/shared_dict_dict_only.json +0 -0
  339. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/tests/data/shared_dict_original_dcs.json +0 -0
  340. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/tests/data/shared_dict_response_uncompressed.json +0 -0
  341. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/tests/data/shared_dict_response_with_dict.json +0 -0
  342. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/tests/data/shared_dict_response_without_dict.json +0 -0
  343. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/tests/data/test_must_pass_user_agents.txt +0 -0
  344. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/tests/data/test_user_agents.txt +0 -0
  345. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/tests/data/ua_string_cases.json +0 -0
  346. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/tests/data/unknown_enum.pb.br +0 -0
  347. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/tests/data_store_bytes_adapter_tests.rs +0 -0
  348. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/tests/data_store_json_bytes_tests.rs +0 -0
  349. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/tests/data_store_json_only_no_bytes_methods_tests.rs +0 -0
  350. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/tests/data_store_lock_tests.rs +0 -0
  351. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/tests/data_store_proto_bytes_tests.rs +0 -0
  352. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/tests/delayed_exposure_bench.rs +0 -0
  353. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/tests/direct_gcir_tests.rs +0 -0
  354. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/tests/dynamic_string_tests.rs +0 -0
  355. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/tests/dynamic_value_tests.rs +0 -0
  356. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/tests/evaluation_details_tests.rs +0 -0
  357. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/tests/evaluator_value_tests.rs +0 -0
  358. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/tests/event_logger_failing_flush_tests.rs +0 -0
  359. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/tests/event_logger_flush_tests.rs +0 -0
  360. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/tests/event_logger_high_qps_tests.rs +0 -0
  361. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/tests/event_logger_usage_tests.rs +0 -0
  362. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/tests/expected_evaluation_tests.rs +0 -0
  363. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/tests/exposure_sampling_key_tests.rs +0 -0
  364. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/tests/exposure_tests.rs +0 -0
  365. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/tests/flushing_tests.rs +0 -0
  366. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/tests/gate_inversion_eval_tests.rs +0 -0
  367. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/tests/gcir_plan_expansion_bench.rs +0 -0
  368. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/tests/gcir_tests.rs +0 -0
  369. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/tests/global_configs_test.rs +0 -0
  370. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/tests/grpc_specs_adapter_tests.rs +0 -0
  371. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/tests/hash_util_evaluation_hash_tests.rs +0 -0
  372. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/tests/http_specs_adapter_tests.rs +0 -0
  373. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/tests/initialize_timeout_test.rs +0 -0
  374. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/tests/interner_contention_bench.rs +0 -0
  375. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/tests/layer_serialization_tests.rs +0 -0
  376. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/tests/list_methods_tests.rs +0 -0
  377. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/tests/network_client_streaming_tests.rs +0 -0
  378. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/tests/network_client_tests.rs +0 -0
  379. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/tests/network_failure_tests.rs +0 -0
  380. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/tests/observability_client_usage_tests.rs +0 -0
  381. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/tests/output_logger_tests.rs +0 -0
  382. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/tests/override_adapter_tests.rs +0 -0
  383. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/tests/perf_tests.rs +0 -0
  384. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/tests/proto_specs_usage_tests.rs +0 -0
  385. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/tests/spec_store_lock_tests.rs +0 -0
  386. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/tests/statsig_disable_network_tests.rs +0 -0
  387. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/tests/statsig_environment_tests.rs +0 -0
  388. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/tests/statsig_event_emitter_usage_test.rs +0 -0
  389. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/tests/statsig_global_tests.rs +0 -0
  390. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/tests/statsig_local_file_event_logging_adapter_tests.rs +0 -0
  391. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/tests/statsig_local_file_specs_adapter_tests.rs +0 -0
  392. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/tests/statsig_options_tests.rs +0 -0
  393. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/tests/statsig_shared_tests.rs +0 -0
  394. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/tests/statsig_tests.rs +0 -0
  395. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/tests/statsig_user_builder_tests.rs +0 -0
  396. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/tests/statsig_user_field_accessor_tests.rs +0 -0
  397. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/tests/statsig_user_internal_tests.rs +0 -0
  398. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/tests/statsig_user_loggable_tests.rs +0 -0
  399. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/tests/statsig_user_tests.rs +0 -0
  400. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/tests/substring_search_bench.rs +0 -0
  401. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/tests/syncing_network_failure_tests.rs +0 -0
  402. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/tests/typed_getters_tests.rs +0 -0
  403. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/tests/ua_parser_util_test.rs +0 -0
  404. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/tests/user_agent_tests_first_party.rs +0 -0
  405. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/tests/user_json_tests.rs +0 -0
  406. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/tests/utils/env_var_guard.rs +0 -0
  407. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/tests/utils/helpers.rs +0 -0
  408. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/tests/utils/mock_data_store.rs +0 -0
  409. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/tests/utils/mock_event_logging_adapter.rs +0 -0
  410. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/tests/utils/mock_log_provider.rs +0 -0
  411. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/tests/utils/mock_observability_client.rs +0 -0
  412. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/tests/utils/mock_scrapi.rs +0 -0
  413. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/tests/utils/mock_specs_adapter.rs +0 -0
  414. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/tests/utils/mock_specs_listener.rs +0 -0
  415. {oai_statsig_python_core-0.27.0rc2 → oai_statsig_python_core-0.28.0}/statsig-rust/tests/utils/mod.rs +0 -0
@@ -1738,7 +1738,7 @@ dependencies = [
1738
1738
 
1739
1739
  [[package]]
1740
1740
  name = "oai-statsig-grpc"
1741
- version = "0.27.0-rc.2"
1741
+ version = "0.28.0"
1742
1742
  dependencies = [
1743
1743
  "async-trait",
1744
1744
  "chrono",
@@ -1753,7 +1753,7 @@ dependencies = [
1753
1753
 
1754
1754
  [[package]]
1755
1755
  name = "oai-statsig-rust"
1756
- version = "0.27.0-rc.2"
1756
+ version = "0.28.0"
1757
1757
  dependencies = [
1758
1758
  "ahash",
1759
1759
  "arc-swap",
@@ -3043,7 +3043,7 @@ checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f"
3043
3043
 
3044
3044
  [[package]]
3045
3045
  name = "statsig-node"
3046
- version = "0.27.0-rc.2"
3046
+ version = "0.28.0"
3047
3047
  dependencies = [
3048
3048
  "async-trait",
3049
3049
  "napi",
@@ -3058,7 +3058,7 @@ dependencies = [
3058
3058
 
3059
3059
  [[package]]
3060
3060
  name = "statsig-pyo3"
3061
- version = "0.27.0-rc.2"
3061
+ version = "0.28.0"
3062
3062
  dependencies = [
3063
3063
  "async-trait",
3064
3064
  "lazy_static",
@@ -3073,7 +3073,7 @@ dependencies = [
3073
3073
 
3074
3074
  [[package]]
3075
3075
  name = "statsig_elixir"
3076
- version = "0.27.0-rc.2"
3076
+ version = "0.28.0"
3077
3077
  dependencies = [
3078
3078
  "async-trait",
3079
3079
  "oai-statsig-rust",
@@ -3086,7 +3086,7 @@ dependencies = [
3086
3086
 
3087
3087
  [[package]]
3088
3088
  name = "statsig_ffi"
3089
- version = "0.27.0-rc.2"
3089
+ version = "0.28.0"
3090
3090
  dependencies = [
3091
3091
  "async-trait",
3092
3092
  "cbindgen",
@@ -26,7 +26,7 @@ exclude = [
26
26
  [workspace.package]
27
27
  edition = "2021"
28
28
  license = "ISC"
29
- version = "0.27.0-rc.2"
29
+ version = "0.28.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.27.0rc2
3
+ Version: 0.28.0
4
4
  Classifier: Programming Language :: Rust
5
5
  Classifier: Programming Language :: Python :: Implementation :: CPython
6
6
  Classifier: Programming Language :: Python :: Implementation :: PyPy
@@ -55,7 +55,7 @@ Bindings
55
55
 
56
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
57
 
58
- - Java [[maven](https://search.maven.org/artifact/com.statsig/javacore)] [[source](https://github.com/statsig-io/statsig-server-core/tree/main/statsig-java)] [[docs](https://docs.statsig.com/server-core/java-core?ref=gh_server_core)]
58
+ - 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
59
 
60
60
  - 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
61
 
@@ -22,6 +22,7 @@ __all__ = [
22
22
  "LayerEvaluationOptions",
23
23
  "LayerParamExposureData",
24
24
  "LogEventRequest",
25
+ "MmapReaderMemorySnapshot",
25
26
  "ObservabilityClientBase",
26
27
  "OutputLoggerProviderBase",
27
28
  "ParameterStore",
@@ -119,6 +120,8 @@ class InternedStore:
119
120
  def fetch_and_write_mmap(cls, sdk_key: builtins.str, specs_url: typing.Optional[builtins.str] = None) -> typing.Any: ...
120
121
  @classmethod
121
122
  def preload_mmap(cls, sdk_key: builtins.str) -> None: ...
123
+ @classmethod
124
+ def mmap_reader_memory_snapshot(cls) -> typing.Optional[MmapReaderMemorySnapshot]: ...
122
125
 
123
126
  @typing.final
124
127
  class LayerEvaluationOptions:
@@ -144,6 +147,25 @@ class LogEventRequest:
144
147
  def retries(self) -> builtins.int: ...
145
148
  def __new__(cls, payload: typing.Any, event_count: builtins.int, retries: builtins.int) -> LogEventRequest: ...
146
149
 
150
+ @typing.final
151
+ class MmapReaderMemorySnapshot:
152
+ @property
153
+ def format_version(self) -> builtins.int: ...
154
+ @property
155
+ def mapped_bytes(self) -> builtins.int: ...
156
+ @property
157
+ def resident_bytes(self) -> typing.Optional[builtins.int]: ...
158
+ @property
159
+ def proportional_set_bytes(self) -> typing.Optional[builtins.int]: ...
160
+ @property
161
+ def private_dirty_bytes(self) -> typing.Optional[builtins.int]: ...
162
+ @property
163
+ def deleted_mapped_bytes(self) -> typing.Optional[builtins.int]: ...
164
+ @property
165
+ def loaded_generation_count(self) -> builtins.int: ...
166
+ @property
167
+ def vma_segment_count(self) -> typing.Optional[builtins.int]: ...
168
+
147
169
  class ObservabilityClientBase:
148
170
  def __new__(cls) -> ObservabilityClientBase: ...
149
171
 
@@ -35,7 +35,7 @@ Bindings
35
35
 
36
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
37
 
38
- - Java [[maven](https://search.maven.org/artifact/com.statsig/javacore)] [[source](https://github.com/statsig-io/statsig-server-core/tree/main/statsig-java)] [[docs](https://docs.statsig.com/server-core/java-core?ref=gh_server_core)]
38
+ - 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
39
 
40
40
  - 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
41
 
@@ -35,7 +35,7 @@ Bindings
35
35
 
36
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
37
 
38
- - Java [[maven](https://search.maven.org/artifact/com.statsig/javacore)] [[source](https://github.com/statsig-io/statsig-server-core/tree/main/statsig-java)] [[docs](https://docs.statsig.com/server-core/java-core?ref=gh_server_core)]
38
+ - 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
39
 
40
40
  - 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
41
 
@@ -8,12 +8,48 @@ use pyo3::types::PyModule;
8
8
  use pyo3::types::PyType;
9
9
  use pyo3_stub_gen::derive::*;
10
10
 
11
- use statsig_rust::interned_values::InternedStore;
11
+ use statsig_rust::interned_values::{InternedStore, MmapReaderMemorySnapshot};
12
12
  use statsig_rust::log_e;
13
13
  use statsig_rust::StatsigRuntime;
14
14
 
15
15
  const TAG: &str = stringify!(InternStorePy);
16
16
 
17
+ #[gen_stub_pyclass]
18
+ #[pyclass(name = "MmapReaderMemorySnapshot", module = "statsig_python_core")]
19
+ pub struct MmapReaderMemorySnapshotPy {
20
+ #[pyo3(get)]
21
+ pub format_version: u32,
22
+ #[pyo3(get)]
23
+ pub mapped_bytes: u64,
24
+ #[pyo3(get)]
25
+ pub resident_bytes: Option<u64>,
26
+ #[pyo3(get)]
27
+ pub proportional_set_bytes: Option<u64>,
28
+ #[pyo3(get)]
29
+ pub private_dirty_bytes: Option<u64>,
30
+ #[pyo3(get)]
31
+ pub deleted_mapped_bytes: Option<u64>,
32
+ #[pyo3(get)]
33
+ pub loaded_generation_count: u64,
34
+ #[pyo3(get)]
35
+ pub vma_segment_count: Option<u64>,
36
+ }
37
+
38
+ impl From<MmapReaderMemorySnapshot> for MmapReaderMemorySnapshotPy {
39
+ fn from(snapshot: MmapReaderMemorySnapshot) -> Self {
40
+ Self {
41
+ format_version: snapshot.format_version,
42
+ mapped_bytes: snapshot.mapped_bytes,
43
+ resident_bytes: snapshot.resident_bytes,
44
+ proportional_set_bytes: snapshot.proportional_set_bytes,
45
+ private_dirty_bytes: snapshot.private_dirty_bytes,
46
+ deleted_mapped_bytes: snapshot.deleted_mapped_bytes,
47
+ loaded_generation_count: snapshot.loaded_generation_count,
48
+ vma_segment_count: snapshot.vma_segment_count,
49
+ }
50
+ }
51
+ }
52
+
17
53
  #[gen_stub_pyclass]
18
54
  #[pyclass(name = "InternedStore", module = "statsig_python_core")]
19
55
  #[derive(Default)]
@@ -99,6 +135,21 @@ impl InternedStorePy {
99
135
 
100
136
  Ok(())
101
137
  }
138
+
139
+ #[classmethod]
140
+ pub fn mmap_reader_memory_snapshot(
141
+ _cls: &Bound<'_, PyType>,
142
+ py: Python<'_>,
143
+ ) -> PyResult<Option<MmapReaderMemorySnapshotPy>> {
144
+ py.detach(|| {
145
+ InternedStore::mmap_reader_memory_snapshot().map_err(|error| error.to_string())
146
+ })
147
+ .map(|snapshot| snapshot.map(Into::into))
148
+ .map_err(|error| {
149
+ log_e!(TAG, "Failed to inspect mmap reader memory: {error}");
150
+ PyRuntimeError::new_err(error)
151
+ })
152
+ }
102
153
  }
103
154
 
104
155
  fn get_completion_event(py: Python) -> PyResult<(Py<PyAny>, Py<PyAny>)> {
@@ -43,6 +43,7 @@ fn statsig_python_core(m: &Bound<'_, PyModule>) -> PyResult<()> {
43
43
  m.add_class::<statsig_persistent_storage_override_adapter_py::PersistentStorageBasePy>()?;
44
44
  m.add_class::<output_logger_provider_base_py::OutputLoggerProviderBasePy>()?;
45
45
  m.add_class::<statsig_options_py::SpecAdapterConfigPy>()?;
46
+ m.add_class::<interned_store_py::MmapReaderMemorySnapshotPy>()?;
46
47
  m.add_class::<interned_store_py::InternedStorePy>()?;
47
48
  m.add_function(wrap_pyfunction!(notify_python_shutdown, m)?)?;
48
49
  m.add_function(wrap_pyfunction!(notify_python_fork, m)?)?;
@@ -103,10 +103,7 @@ pub fn json_value_to_py_object(py: Python<'_>, value: &Value) -> PyResult<Py<PyA
103
103
  pub fn py_list_to_list(py_list: &Bound<PyList>) -> PyResult<Vec<String>> {
104
104
  let mut converted_list = Vec::new();
105
105
  for value in py_list {
106
- match value.extract::<String>() {
107
- Ok(s) => converted_list.push(s),
108
- Err(e) => return Err(e),
109
- }
106
+ converted_list.push(value.extract::<String>()?);
110
107
  }
111
108
  Ok(converted_list)
112
109
  }
@@ -169,12 +169,8 @@ fn convert_py_lists_to_secondary_exposures(
169
169
  ) -> PyResult<Vec<SecondaryExposure>> {
170
170
  let mut exposures = Vec::new();
171
171
  for item in py_list {
172
- match item.extract::<Bound<PyDict>>() {
173
- Ok(e) => {
174
- exposures.push(convert_py_dict_to_secondary_exposure(&e)?);
175
- }
176
- Err(e) => return Err(e.into()),
177
- }
172
+ let exposure = item.extract::<Bound<PyDict>>()?;
173
+ exposures.push(convert_py_dict_to_secondary_exposure(&exposure)?);
178
174
  }
179
175
 
180
176
  Ok(exposures)
@@ -1,9 +1,12 @@
1
- from utils import get_test_data_resource_bytes, get_test_data_resource
2
- from pytest_httpserver import HTTPServer
3
- import pytest
4
1
  import json
5
- from statsig_python_core import InternedStore, Statsig, StatsigOptions, StatsigUser
2
+ import sys
3
+
4
+ import pytest
5
+ from pytest_httpserver import HTTPServer
6
+
6
7
  from mock_output_logger import MockOutputLoggerProvider
8
+ from statsig_python_core import InternedStore, Statsig, StatsigOptions, StatsigUser
9
+ from utils import get_test_data_resource, get_test_data_resource_bytes
7
10
 
8
11
  EVAL_PROJ_JSON = get_test_data_resource_bytes("eval_proj_dcs.json")
9
12
  DEMO_PROJ_PROTO = get_test_data_resource_bytes("demo_proj_dcs.pb.br")
@@ -57,6 +60,24 @@ def test_interned_store_mmap_preload(server_setup):
57
60
  fetch_complete = InternedStore.fetch_and_write_mmap(sdk_key, specs_url)
58
61
  assert fetch_complete.wait(5)
59
62
  InternedStore.preload_mmap(sdk_key)
63
+ memory = InternedStore.mmap_reader_memory_snapshot()
64
+ assert memory is not None
65
+ assert memory.format_version == 2
66
+ assert memory.mapped_bytes > 0
67
+ assert memory.loaded_generation_count == 1
68
+ if sys.platform == "linux":
69
+ assert memory.resident_bytes is not None
70
+ assert memory.proportional_set_bytes is not None
71
+ assert memory.private_dirty_bytes is not None
72
+ assert memory.deleted_mapped_bytes == 0
73
+ assert memory.vma_segment_count is not None
74
+ assert memory.vma_segment_count >= 1
75
+ else:
76
+ assert memory.resident_bytes is None
77
+ assert memory.proportional_set_bytes is None
78
+ assert memory.private_dirty_bytes is None
79
+ assert memory.deleted_mapped_bytes is None
80
+ assert memory.vma_segment_count is None
60
81
 
61
82
  log_provider = MockOutputLoggerProvider()
62
83
  log_provider.logs = []
@@ -45,7 +45,7 @@ serde_json = { version = "1.0.143", features = [
45
45
  ] }
46
46
  serde_with = "3.4.0"
47
47
  sha2 = "0.10.8"
48
- oai-statsig-grpc = { path = "../statsig-grpc", version = "0.27.0-rc.2", optional = true }
48
+ oai-statsig-grpc = { path = "../statsig-grpc", version = "0.28.0", optional = true }
49
49
  simple_logger = { version = "5.0.0" }
50
50
  tempfile = "3.8.1"
51
51
  tokio = { version = "1.39.1", features = ["full"] }
@@ -361,6 +361,124 @@ async fn receive_proto_latency(
361
361
  .flatten()
362
362
  }
363
363
 
364
+ async fn receive_spec_decode_tags(
365
+ receiver: &mut tokio::sync::broadcast::Receiver<OpsStatsEvent>,
366
+ timeout: Duration,
367
+ ) -> Option<HashMap<String, String>> {
368
+ tokio::time::timeout(timeout, async {
369
+ loop {
370
+ let OpsStatsEvent::Observability(event) = receiver.recv().await.ok()? else {
371
+ continue;
372
+ };
373
+ if event.metric_name == "interned_mmap.spec_decode.count" {
374
+ assert!(matches!(&event.metric_type, MetricType::Increment));
375
+ return event.tags;
376
+ }
377
+ }
378
+ })
379
+ .await
380
+ .ok()
381
+ .flatten()
382
+ }
383
+
384
+ #[tokio::test]
385
+ #[serial]
386
+ async fn test_spec_decode_metric_reports_owned_materialized_updates_only() {
387
+ let sdk_key = "secret-owned-metric-test";
388
+ let ops_stats = OPS_STATS.get_for_instance(sdk_key);
389
+ let mut receiver = ops_stats.subscribe_for_test();
390
+ let store = SpecStore::new(
391
+ sdk_key,
392
+ sdk_key.to_string(),
393
+ StatsigRuntime::get_runtime(),
394
+ Arc::new(SdkEventEmitter::default()),
395
+ None,
396
+ );
397
+
398
+ store
399
+ .set_values(SpecsUpdate {
400
+ data: ResponseData::from_bytes(
401
+ br#"{
402
+ "experiment_to_layer": {},
403
+ "condition_map": {},
404
+ "dynamic_configs": {},
405
+ "feature_gates": {
406
+ "owned_metric_gate": {
407
+ "type": "feature_gate",
408
+ "salt": "owned-metric-salt",
409
+ "defaultValue": false,
410
+ "enabled": true,
411
+ "rules": [],
412
+ "idType": "userID",
413
+ "entity": "feature_gate"
414
+ }
415
+ },
416
+ "layer_configs": {},
417
+ "has_updates": true,
418
+ "time": 1
419
+ }"#
420
+ .to_vec(),
421
+ ),
422
+ source: SpecsSource::Network,
423
+ received_at: 2_000,
424
+ source_api: None,
425
+ has_updates: None,
426
+ })
427
+ .unwrap();
428
+
429
+ let tags = receive_spec_decode_tags(&mut receiver, Duration::from_millis(100))
430
+ .await
431
+ .expect("materialized update should emit spec decode telemetry");
432
+ assert_eq!(tags.get("source").map(String::as_str), Some("owned"));
433
+ assert_eq!(
434
+ tags.get("reason").map(String::as_str),
435
+ Some("spec_preload_unavailable")
436
+ );
437
+ assert_eq!(
438
+ tags.get("sdk_key").map(String::as_str),
439
+ Some("secret-owned-")
440
+ );
441
+
442
+ store
443
+ .set_values(SpecsUpdate {
444
+ data: ResponseData::from_bytes(
445
+ br#"{
446
+ "experiment_to_layer": {},
447
+ "condition_map": {},
448
+ "dynamic_configs": {},
449
+ "feature_gates": {},
450
+ "layer_configs": {},
451
+ "has_updates": true,
452
+ "time": 2
453
+ }"#
454
+ .to_vec(),
455
+ ),
456
+ source: SpecsSource::Network,
457
+ received_at: 2_001,
458
+ source_api: None,
459
+ has_updates: None,
460
+ })
461
+ .unwrap();
462
+ assert_eq!(
463
+ receive_spec_decode_tags(&mut receiver, Duration::from_millis(100)).await,
464
+ None
465
+ );
466
+
467
+ store
468
+ .set_values(SpecsUpdate {
469
+ data: ResponseData::from_bytes(br#"{"has_updates":false}"#.to_vec()),
470
+ source: SpecsSource::Network,
471
+ received_at: 2_002,
472
+ source_api: None,
473
+ has_updates: Some(false),
474
+ })
475
+ .unwrap();
476
+ assert_eq!(
477
+ receive_spec_decode_tags(&mut receiver, Duration::from_millis(100)).await,
478
+ None
479
+ );
480
+ }
481
+
364
482
  #[tokio::test]
365
483
  async fn test_spec_store_data_store_updates_forwarded_to_data_store() {
366
484
  let data_store = Arc::new(TestDataStore::new(true));
@@ -864,6 +982,7 @@ async fn test_proto_metrics_classify_processing_and_duplicates() {
864
982
  None,
865
983
  );
866
984
  apply_eval_project(&delta_store);
985
+ let mut spec_decode_receiver = ops_stats.subscribe_for_test();
867
986
  let before = delta_store.load_data();
868
987
  let deleted_name = before
869
988
  .snapshot
@@ -891,6 +1010,14 @@ async fn test_proto_metrics_classify_processing_and_duplicates() {
891
1010
  "metric-api",
892
1011
  )
893
1012
  .unwrap();
1013
+ let spec_decode_tags =
1014
+ receive_spec_decode_tags(&mut spec_decode_receiver, Duration::from_secs(1))
1015
+ .await
1016
+ .expect("materialized delta should emit spec decode telemetry");
1017
+ assert_eq!(
1018
+ spec_decode_tags.get("source").map(String::as_str),
1019
+ Some("owned")
1020
+ );
894
1021
  let materialized = delta_store.load_data();
895
1022
  apply_delta(
896
1023
  &delta_store,
@@ -113,8 +113,17 @@ impl DynamicReturnable {
113
113
  }
114
114
 
115
115
  pub(crate) fn get_stable_hash(&self) -> u64 {
116
- self.stable_hash
117
- .map_or_else(|| stable_hash(&self.value), NonZeroU64::get)
116
+ if let Some(hash) = self.stable_hash {
117
+ return hash.get();
118
+ }
119
+
120
+ if matches!(&self.value, DynamicReturnableValue::JsonArchived(_)) {
121
+ if let Some(hash) = InternedStore::get_mmap_returnable_stable_hash(self.hash) {
122
+ return hash;
123
+ }
124
+ }
125
+
126
+ stable_hash(&self.value)
118
127
  }
119
128
 
120
129
  pub(crate) fn from_interned_value(hash: u64, value: DynamicReturnableValue) -> Self {
@@ -137,7 +146,7 @@ impl DynamicReturnable {
137
146
  }
138
147
 
139
148
  #[cfg(test)]
140
- pub(crate) fn has_precomputed_stable_hash(&self) -> bool {
149
+ pub(crate) fn has_inline_stable_hash(&self) -> bool {
141
150
  self.stable_hash.is_some()
142
151
  }
143
152
  }
@@ -158,12 +167,16 @@ fn stable_hash(value: &DynamicReturnableValue) -> u64 {
158
167
  DynamicReturnableValue::JsonStatic(value) => {
159
168
  stable_object_hash(value.iter().map(|(key, value)| (key.as_str(), value)))
160
169
  }
161
- DynamicReturnableValue::JsonArchived(value) => {
162
- stable_object_hash(value.iter().map(|(key, value)| (key.as_str(), value)))
163
- }
170
+ DynamicReturnableValue::JsonArchived(value) => archived_returnable_stable_hash(value),
164
171
  }
165
172
  }
166
173
 
174
+ pub(crate) fn archived_returnable_stable_hash(
175
+ value: &ArchivedHashMap<ArchivedString, ArchivedRkyvValue>,
176
+ ) -> u64 {
177
+ stable_object_hash(value.iter().map(|(key, value)| (key.as_str(), value)))
178
+ }
179
+
167
180
  impl<'de> Deserialize<'de> for DynamicReturnable {
168
181
  fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
169
182
  where
@@ -146,7 +146,7 @@ pub(crate) fn get_dynamic_config_evaluations_with_plan(
146
146
  };
147
147
 
148
148
  for planned in &plan.cmab_configs {
149
- if gcir_time!("cmab.filtering", {
149
+ let should_filter = gcir_time!("cmab.filtering", {
150
150
  let is_filtered_by_experiment = options
151
151
  .experiment_filter
152
152
  .as_ref()
@@ -162,7 +162,8 @@ pub(crate) fn get_dynamic_config_evaluations_with_plan(
162
162
  &options.client_sdk_key,
163
163
  )
164
164
  }
165
- }) {
165
+ });
166
+ if should_filter {
166
167
  continue;
167
168
  }
168
169
 
@@ -26,8 +26,15 @@ impl InstanceRegistry {
26
26
  let id_tuple = (short_type_name, Uuid::new_v4());
27
27
  let id_hash = hash_one(id_tuple);
28
28
 
29
- let mut registry = Self::get_write_lock()?;
30
- registry.insert(id_hash, instance);
29
+ let replaced = {
30
+ let mut registry = Self::get_write_lock()?;
31
+ registry.insert(id_hash, instance)
32
+ };
33
+
34
+ // Registered instances may run arbitrary shutdown logic when dropped.
35
+ // Keep that work outside the global registry lock in the unlikely event
36
+ // of an ID collision.
37
+ drop(replaced);
31
38
 
32
39
  Some(id_hash)
33
40
  }
@@ -41,27 +48,29 @@ impl InstanceRegistry {
41
48
  }
42
49
 
43
50
  pub fn get<T: Send + Sync + 'static>(id: &u64) -> Option<Arc<T>> {
44
- let registry = match REGISTRY.try_read_for(Duration::from_secs(5)) {
45
- Some(guard) => guard,
46
- None => {
47
- log_e!(TAG, "Failed to acquire read lock: Failed to lock REGISTRY");
48
- return None;
49
- }
51
+ let instance = {
52
+ let registry = match REGISTRY.try_read_for(Duration::from_secs(5)) {
53
+ Some(guard) => guard,
54
+ None => {
55
+ log_e!(TAG, "Failed to acquire read lock: Failed to lock REGISTRY");
56
+ return None;
57
+ }
58
+ };
59
+
60
+ registry.get(id).cloned()
50
61
  };
51
62
 
52
- registry
53
- .get(id)
54
- .and_then(|any_arc| match any_arc.clone().downcast::<T>() {
55
- Ok(t) => Some(t),
56
- Err(_) => {
57
- log_e!(
58
- TAG,
59
- "Failed to downcast instance with ref '{}' to generic type",
60
- id
61
- );
62
- None
63
- }
64
- })
63
+ instance.and_then(|any_arc| match any_arc.downcast::<T>() {
64
+ Ok(t) => Some(t),
65
+ Err(_) => {
66
+ log_e!(
67
+ TAG,
68
+ "Failed to downcast instance with ref '{}' to generic type",
69
+ id
70
+ );
71
+ None
72
+ }
73
+ })
65
74
  }
66
75
 
67
76
  pub fn get_raw(id: &u64) -> Option<Arc<dyn Any + Send + Sync>> {
@@ -77,19 +86,29 @@ impl InstanceRegistry {
77
86
  }
78
87
 
79
88
  pub fn remove(id: &u64) {
80
- let mut registry = match Self::get_write_lock() {
81
- Some(registry) => registry,
82
- None => return,
89
+ let removed = {
90
+ let mut registry = match Self::get_write_lock() {
91
+ Some(registry) => registry,
92
+ None => return,
93
+ };
94
+ registry.remove(id)
83
95
  };
84
- registry.remove(id);
96
+
97
+ // Instance destructors can run shutdown hooks and callbacks.
98
+ drop(removed);
85
99
  }
86
100
 
87
101
  pub fn remove_all() {
88
- let mut registry = match Self::get_write_lock() {
89
- Some(registry) => registry,
90
- None => return,
102
+ let removed = {
103
+ let mut registry = match Self::get_write_lock() {
104
+ Some(registry) => registry,
105
+ None => return,
106
+ };
107
+ std::mem::take(&mut *registry)
91
108
  };
92
- registry.clear();
109
+
110
+ // Drop all instances after the registry is available to other callers.
111
+ drop(removed);
93
112
  }
94
113
 
95
114
  fn get_write_lock() -> Option<RwLockWriteGuard<'static, AHashMap<u64, AnyInstance>>> {