wingify-fme-python-sdk 1.61.0__tar.gz → 1.62.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 (156) hide show
  1. {wingify_fme_python_sdk-1.61.0/wingify_fme_python_sdk.egg-info → wingify_fme_python_sdk-1.62.0}/PKG-INFO +1 -1
  2. {wingify_fme_python_sdk-1.61.0 → wingify_fme_python_sdk-1.62.0}/setup.py +1 -1
  3. {wingify_fme_python_sdk-1.61.0 → wingify_fme_python_sdk-1.62.0}/wingify/constants/Constants.py +4 -1
  4. wingify_fme_python_sdk-1.62.0/wingify/constants/sampled_debug_error_template_keys.py +34 -0
  5. wingify_fme_python_sdk-1.62.0/wingify/models/settings/internal_event_sampling_settings_model.py +53 -0
  6. {wingify_fme_python_sdk-1.61.0 → wingify_fme_python_sdk-1.62.0}/wingify/models/settings/settings_model.py +19 -2
  7. wingify_fme_python_sdk-1.62.0/wingify/services/internal_events_sampling_service.py +62 -0
  8. {wingify_fme_python_sdk-1.61.0 → wingify_fme_python_sdk-1.62.0}/wingify/utils/debugger_service_util.py +16 -0
  9. wingify_fme_python_sdk-1.62.0/wingify/utils/internal_events_sampling_util.py +106 -0
  10. {wingify_fme_python_sdk-1.61.0 → wingify_fme_python_sdk-1.62.0}/wingify/wingify.py +10 -9
  11. {wingify_fme_python_sdk-1.61.0 → wingify_fme_python_sdk-1.62.0/wingify_fme_python_sdk.egg-info}/PKG-INFO +1 -1
  12. {wingify_fme_python_sdk-1.61.0 → wingify_fme_python_sdk-1.62.0}/wingify_fme_python_sdk.egg-info/SOURCES.txt +4 -0
  13. {wingify_fme_python_sdk-1.61.0 → wingify_fme_python_sdk-1.62.0}/LICENSE +0 -0
  14. {wingify_fme_python_sdk-1.61.0 → wingify_fme_python_sdk-1.62.0}/MANIFEST.in +0 -0
  15. {wingify_fme_python_sdk-1.61.0 → wingify_fme_python_sdk-1.62.0}/NOTICE +0 -0
  16. {wingify_fme_python_sdk-1.61.0 → wingify_fme_python_sdk-1.62.0}/README.md +0 -0
  17. {wingify_fme_python_sdk-1.61.0 → wingify_fme_python_sdk-1.62.0}/requirements-dev.txt +0 -0
  18. {wingify_fme_python_sdk-1.61.0 → wingify_fme_python_sdk-1.62.0}/requirements.txt +0 -0
  19. {wingify_fme_python_sdk-1.61.0 → wingify_fme_python_sdk-1.62.0}/setup.cfg +0 -0
  20. {wingify_fme_python_sdk-1.61.0 → wingify_fme_python_sdk-1.62.0}/vwo/__init__.py +0 -0
  21. {wingify_fme_python_sdk-1.61.0 → wingify_fme_python_sdk-1.62.0}/vwo/vwo.py +0 -0
  22. {wingify_fme_python_sdk-1.61.0 → wingify_fme_python_sdk-1.62.0}/vwo/vwo_builder.py +0 -0
  23. {wingify_fme_python_sdk-1.61.0 → wingify_fme_python_sdk-1.62.0}/vwo/vwo_client.py +0 -0
  24. {wingify_fme_python_sdk-1.61.0 → wingify_fme_python_sdk-1.62.0}/wingify/__init__.py +0 -0
  25. {wingify_fme_python_sdk-1.61.0 → wingify_fme_python_sdk-1.62.0}/wingify/api/__init__.py +0 -0
  26. {wingify_fme_python_sdk-1.61.0 → wingify_fme_python_sdk-1.62.0}/wingify/api/get_flag_api.py +0 -0
  27. {wingify_fme_python_sdk-1.61.0 → wingify_fme_python_sdk-1.62.0}/wingify/api/set_attribute_api.py +0 -0
  28. {wingify_fme_python_sdk-1.61.0 → wingify_fme_python_sdk-1.62.0}/wingify/api/track_api.py +0 -0
  29. {wingify_fme_python_sdk-1.61.0 → wingify_fme_python_sdk-1.62.0}/wingify/constants/__init__.py +0 -0
  30. {wingify_fme_python_sdk-1.61.0 → wingify_fme_python_sdk-1.62.0}/wingify/decorators/__init__.py +0 -0
  31. {wingify_fme_python_sdk-1.61.0 → wingify_fme_python_sdk-1.62.0}/wingify/decorators/storage_decorator.py +0 -0
  32. {wingify_fme_python_sdk-1.61.0 → wingify_fme_python_sdk-1.62.0}/wingify/enums/__init__.py +0 -0
  33. {wingify_fme_python_sdk-1.61.0 → wingify_fme_python_sdk-1.62.0}/wingify/enums/api_enum.py +0 -0
  34. {wingify_fme_python_sdk-1.61.0 → wingify_fme_python_sdk-1.62.0}/wingify/enums/campaign_type_enum.py +0 -0
  35. {wingify_fme_python_sdk-1.61.0 → wingify_fme_python_sdk-1.62.0}/wingify/enums/debug_category_enum.py +0 -0
  36. {wingify_fme_python_sdk-1.61.0 → wingify_fme_python_sdk-1.62.0}/wingify/enums/event_enum.py +0 -0
  37. {wingify_fme_python_sdk-1.61.0 → wingify_fme_python_sdk-1.62.0}/wingify/enums/headers_enum.py +0 -0
  38. {wingify_fme_python_sdk-1.61.0 → wingify_fme_python_sdk-1.62.0}/wingify/enums/hooks_enum.py +0 -0
  39. {wingify_fme_python_sdk-1.61.0 → wingify_fme_python_sdk-1.62.0}/wingify/enums/status_enum.py +0 -0
  40. {wingify_fme_python_sdk-1.61.0 → wingify_fme_python_sdk-1.62.0}/wingify/enums/storage_enum.py +0 -0
  41. {wingify_fme_python_sdk-1.61.0 → wingify_fme_python_sdk-1.62.0}/wingify/enums/url_enum.py +0 -0
  42. {wingify_fme_python_sdk-1.61.0 → wingify_fme_python_sdk-1.62.0}/wingify/models/Alias.py +0 -0
  43. {wingify_fme_python_sdk-1.61.0 → wingify_fme_python_sdk-1.62.0}/wingify/models/AliasSetResponse.py +0 -0
  44. {wingify_fme_python_sdk-1.61.0 → wingify_fme_python_sdk-1.62.0}/wingify/models/__init__.py +0 -0
  45. {wingify_fme_python_sdk-1.61.0 → wingify_fme_python_sdk-1.62.0}/wingify/models/batch_event_data.py +0 -0
  46. {wingify_fme_python_sdk-1.61.0 → wingify_fme_python_sdk-1.62.0}/wingify/models/campaign/__init__.py +0 -0
  47. {wingify_fme_python_sdk-1.61.0 → wingify_fme_python_sdk-1.62.0}/wingify/models/campaign/campaign_model.py +0 -0
  48. {wingify_fme_python_sdk-1.61.0 → wingify_fme_python_sdk-1.62.0}/wingify/models/campaign/feature_model.py +0 -0
  49. {wingify_fme_python_sdk-1.61.0 → wingify_fme_python_sdk-1.62.0}/wingify/models/campaign/holdout_model.py +0 -0
  50. {wingify_fme_python_sdk-1.61.0 → wingify_fme_python_sdk-1.62.0}/wingify/models/campaign/impact_campaign_model.py +0 -0
  51. {wingify_fme_python_sdk-1.61.0 → wingify_fme_python_sdk-1.62.0}/wingify/models/campaign/metric_model.py +0 -0
  52. {wingify_fme_python_sdk-1.61.0 → wingify_fme_python_sdk-1.62.0}/wingify/models/campaign/rule_model.py +0 -0
  53. {wingify_fme_python_sdk-1.61.0 → wingify_fme_python_sdk-1.62.0}/wingify/models/campaign/variable_model.py +0 -0
  54. {wingify_fme_python_sdk-1.61.0 → wingify_fme_python_sdk-1.62.0}/wingify/models/campaign/variation_model.py +0 -0
  55. {wingify_fme_python_sdk-1.61.0 → wingify_fme_python_sdk-1.62.0}/wingify/models/gateway_service_model.py +0 -0
  56. {wingify_fme_python_sdk-1.61.0 → wingify_fme_python_sdk-1.62.0}/wingify/models/schemas/__init__.py +0 -0
  57. {wingify_fme_python_sdk-1.61.0 → wingify_fme_python_sdk-1.62.0}/wingify/models/schemas/campaign_group_schema.py +0 -0
  58. {wingify_fme_python_sdk-1.61.0 → wingify_fme_python_sdk-1.62.0}/wingify/models/schemas/campaign_metric_schema.py +0 -0
  59. {wingify_fme_python_sdk-1.61.0 → wingify_fme_python_sdk-1.62.0}/wingify/models/schemas/campaign_schema.py +0 -0
  60. {wingify_fme_python_sdk-1.61.0 → wingify_fme_python_sdk-1.62.0}/wingify/models/schemas/campaign_variation_schema.py +0 -0
  61. {wingify_fme_python_sdk-1.61.0 → wingify_fme_python_sdk-1.62.0}/wingify/models/schemas/empty_object_schema.py +0 -0
  62. {wingify_fme_python_sdk-1.61.0 → wingify_fme_python_sdk-1.62.0}/wingify/models/schemas/feature_schema.py +0 -0
  63. {wingify_fme_python_sdk-1.61.0 → wingify_fme_python_sdk-1.62.0}/wingify/models/schemas/group_schema.py +0 -0
  64. {wingify_fme_python_sdk-1.61.0 → wingify_fme_python_sdk-1.62.0}/wingify/models/schemas/holdout_schema.py +0 -0
  65. {wingify_fme_python_sdk-1.61.0 → wingify_fme_python_sdk-1.62.0}/wingify/models/schemas/rule_schema.py +0 -0
  66. {wingify_fme_python_sdk-1.61.0 → wingify_fme_python_sdk-1.62.0}/wingify/models/schemas/settings_schema.py +0 -0
  67. {wingify_fme_python_sdk-1.61.0 → wingify_fme_python_sdk-1.62.0}/wingify/models/schemas/variable_schema.py +0 -0
  68. {wingify_fme_python_sdk-1.61.0 → wingify_fme_python_sdk-1.62.0}/wingify/models/settings/__init__.py +0 -0
  69. {wingify_fme_python_sdk-1.61.0 → wingify_fme_python_sdk-1.62.0}/wingify/models/storage/__init__.py +0 -0
  70. {wingify_fme_python_sdk-1.61.0 → wingify_fme_python_sdk-1.62.0}/wingify/models/storage/storage_model.py +0 -0
  71. {wingify_fme_python_sdk-1.61.0 → wingify_fme_python_sdk-1.62.0}/wingify/models/user/__init__.py +0 -0
  72. {wingify_fme_python_sdk-1.61.0 → wingify_fme_python_sdk-1.62.0}/wingify/models/user/context_model.py +0 -0
  73. {wingify_fme_python_sdk-1.61.0 → wingify_fme_python_sdk-1.62.0}/wingify/models/user/context_vwo_model.py +0 -0
  74. {wingify_fme_python_sdk-1.61.0 → wingify_fme_python_sdk-1.62.0}/wingify/models/user/get_flag.py +0 -0
  75. {wingify_fme_python_sdk-1.61.0 → wingify_fme_python_sdk-1.62.0}/wingify/models/vwo_options_model.py +0 -0
  76. {wingify_fme_python_sdk-1.61.0 → wingify_fme_python_sdk-1.62.0}/wingify/models/wingify_options_model.py +0 -0
  77. {wingify_fme_python_sdk-1.61.0 → wingify_fme_python_sdk-1.62.0}/wingify/packages/__init__.py +0 -0
  78. {wingify_fme_python_sdk-1.61.0 → wingify_fme_python_sdk-1.62.0}/wingify/packages/decision_maker/__init__.py +0 -0
  79. {wingify_fme_python_sdk-1.61.0 → wingify_fme_python_sdk-1.62.0}/wingify/packages/decision_maker/decision_maker.py +0 -0
  80. {wingify_fme_python_sdk-1.61.0 → wingify_fme_python_sdk-1.62.0}/wingify/packages/logger/__init__.py +0 -0
  81. {wingify_fme_python_sdk-1.61.0 → wingify_fme_python_sdk-1.62.0}/wingify/packages/logger/core/__init__.py +0 -0
  82. {wingify_fme_python_sdk-1.61.0 → wingify_fme_python_sdk-1.62.0}/wingify/packages/logger/core/log_manager.py +0 -0
  83. {wingify_fme_python_sdk-1.61.0 → wingify_fme_python_sdk-1.62.0}/wingify/packages/logger/core/log_transport_manager.py +0 -0
  84. {wingify_fme_python_sdk-1.61.0 → wingify_fme_python_sdk-1.62.0}/wingify/packages/logger/enums/__init__.py +0 -0
  85. {wingify_fme_python_sdk-1.61.0 → wingify_fme_python_sdk-1.62.0}/wingify/packages/logger/enums/log_level_enum.py +0 -0
  86. {wingify_fme_python_sdk-1.61.0 → wingify_fme_python_sdk-1.62.0}/wingify/packages/logger/enums/log_level_number_enum.py +0 -0
  87. {wingify_fme_python_sdk-1.61.0 → wingify_fme_python_sdk-1.62.0}/wingify/packages/logger/log_message_builder.py +0 -0
  88. {wingify_fme_python_sdk-1.61.0 → wingify_fme_python_sdk-1.62.0}/wingify/packages/logger/logger.py +0 -0
  89. {wingify_fme_python_sdk-1.61.0 → wingify_fme_python_sdk-1.62.0}/wingify/packages/logger/transports/__init__.py +0 -0
  90. {wingify_fme_python_sdk-1.61.0 → wingify_fme_python_sdk-1.62.0}/wingify/packages/logger/transports/console_transport.py +0 -0
  91. {wingify_fme_python_sdk-1.61.0 → wingify_fme_python_sdk-1.62.0}/wingify/packages/network_layer/__init__.py +0 -0
  92. {wingify_fme_python_sdk-1.61.0 → wingify_fme_python_sdk-1.62.0}/wingify/packages/network_layer/client/__init__.py +0 -0
  93. {wingify_fme_python_sdk-1.61.0 → wingify_fme_python_sdk-1.62.0}/wingify/packages/network_layer/client/network_client.py +0 -0
  94. {wingify_fme_python_sdk-1.61.0 → wingify_fme_python_sdk-1.62.0}/wingify/packages/network_layer/handlers/__init__.py +0 -0
  95. {wingify_fme_python_sdk-1.61.0 → wingify_fme_python_sdk-1.62.0}/wingify/packages/network_layer/handlers/request_handler.py +0 -0
  96. {wingify_fme_python_sdk-1.61.0 → wingify_fme_python_sdk-1.62.0}/wingify/packages/network_layer/manager/__init__.py +0 -0
  97. {wingify_fme_python_sdk-1.61.0 → wingify_fme_python_sdk-1.62.0}/wingify/packages/network_layer/manager/network_manager.py +0 -0
  98. {wingify_fme_python_sdk-1.61.0 → wingify_fme_python_sdk-1.62.0}/wingify/packages/network_layer/models/__init__.py +0 -0
  99. {wingify_fme_python_sdk-1.61.0 → wingify_fme_python_sdk-1.62.0}/wingify/packages/network_layer/models/global_request_model.py +0 -0
  100. {wingify_fme_python_sdk-1.61.0 → wingify_fme_python_sdk-1.62.0}/wingify/packages/network_layer/models/request_model.py +0 -0
  101. {wingify_fme_python_sdk-1.61.0 → wingify_fme_python_sdk-1.62.0}/wingify/packages/network_layer/models/response_model.py +0 -0
  102. {wingify_fme_python_sdk-1.61.0 → wingify_fme_python_sdk-1.62.0}/wingify/packages/segmentation_evaluator/__init__.py +0 -0
  103. {wingify_fme_python_sdk-1.61.0 → wingify_fme_python_sdk-1.62.0}/wingify/packages/segmentation_evaluator/core/__init__.py +0 -0
  104. {wingify_fme_python_sdk-1.61.0 → wingify_fme_python_sdk-1.62.0}/wingify/packages/segmentation_evaluator/core/segmentation_manager.py +0 -0
  105. {wingify_fme_python_sdk-1.61.0 → wingify_fme_python_sdk-1.62.0}/wingify/packages/segmentation_evaluator/enums/__init__.py +0 -0
  106. {wingify_fme_python_sdk-1.61.0 → wingify_fme_python_sdk-1.62.0}/wingify/packages/segmentation_evaluator/enums/segment_operand_regex_enum.py +0 -0
  107. {wingify_fme_python_sdk-1.61.0 → wingify_fme_python_sdk-1.62.0}/wingify/packages/segmentation_evaluator/enums/segment_operand_value_enum.py +0 -0
  108. {wingify_fme_python_sdk-1.61.0 → wingify_fme_python_sdk-1.62.0}/wingify/packages/segmentation_evaluator/enums/segment_operator_value_enum.py +0 -0
  109. {wingify_fme_python_sdk-1.61.0 → wingify_fme_python_sdk-1.62.0}/wingify/packages/segmentation_evaluator/evaluators/__init__.py +0 -0
  110. {wingify_fme_python_sdk-1.61.0 → wingify_fme_python_sdk-1.62.0}/wingify/packages/segmentation_evaluator/evaluators/segment_evaluator.py +0 -0
  111. {wingify_fme_python_sdk-1.61.0 → wingify_fme_python_sdk-1.62.0}/wingify/packages/segmentation_evaluator/evaluators/segment_operand_evaluator.py +0 -0
  112. {wingify_fme_python_sdk-1.61.0 → wingify_fme_python_sdk-1.62.0}/wingify/packages/segmentation_evaluator/utils/__init__.py +0 -0
  113. {wingify_fme_python_sdk-1.61.0 → wingify_fme_python_sdk-1.62.0}/wingify/packages/segmentation_evaluator/utils/segment_util.py +0 -0
  114. {wingify_fme_python_sdk-1.61.0 → wingify_fme_python_sdk-1.62.0}/wingify/packages/segmentation_evaluator/utils/web_testing_segment_util.py +0 -0
  115. {wingify_fme_python_sdk-1.61.0 → wingify_fme_python_sdk-1.62.0}/wingify/packages/storage/__init__.py +0 -0
  116. {wingify_fme_python_sdk-1.61.0 → wingify_fme_python_sdk-1.62.0}/wingify/packages/storage/connector.py +0 -0
  117. {wingify_fme_python_sdk-1.61.0 → wingify_fme_python_sdk-1.62.0}/wingify/packages/storage/storage.py +0 -0
  118. {wingify_fme_python_sdk-1.61.0 → wingify_fme_python_sdk-1.62.0}/wingify/resources/__init__.py +0 -0
  119. {wingify_fme_python_sdk-1.61.0 → wingify_fme_python_sdk-1.62.0}/wingify/resources/debug-messages.json +0 -0
  120. {wingify_fme_python_sdk-1.61.0 → wingify_fme_python_sdk-1.62.0}/wingify/resources/error-messages.json +0 -0
  121. {wingify_fme_python_sdk-1.61.0 → wingify_fme_python_sdk-1.62.0}/wingify/resources/info-message.json +0 -0
  122. {wingify_fme_python_sdk-1.61.0 → wingify_fme_python_sdk-1.62.0}/wingify/resources/trace-messages.json +0 -0
  123. {wingify_fme_python_sdk-1.61.0 → wingify_fme_python_sdk-1.62.0}/wingify/resources/warn-messages.json +0 -0
  124. {wingify_fme_python_sdk-1.61.0 → wingify_fme_python_sdk-1.62.0}/wingify/services/__init__.py +0 -0
  125. {wingify_fme_python_sdk-1.61.0 → wingify_fme_python_sdk-1.62.0}/wingify/services/batch_event_queue.py +0 -0
  126. {wingify_fme_python_sdk-1.61.0 → wingify_fme_python_sdk-1.62.0}/wingify/services/campaign_decision_service.py +0 -0
  127. {wingify_fme_python_sdk-1.61.0 → wingify_fme_python_sdk-1.62.0}/wingify/services/hooks_manager.py +0 -0
  128. {wingify_fme_python_sdk-1.61.0 → wingify_fme_python_sdk-1.62.0}/wingify/services/settings_manager.py +0 -0
  129. {wingify_fme_python_sdk-1.61.0 → wingify_fme_python_sdk-1.62.0}/wingify/services/storage_service.py +0 -0
  130. {wingify_fme_python_sdk-1.61.0 → wingify_fme_python_sdk-1.62.0}/wingify/services/url_service.py +0 -0
  131. {wingify_fme_python_sdk-1.61.0 → wingify_fme_python_sdk-1.62.0}/wingify/utils/__init__.py +0 -0
  132. {wingify_fme_python_sdk-1.61.0 → wingify_fme_python_sdk-1.62.0}/wingify/utils/aliasing_util.py +0 -0
  133. {wingify_fme_python_sdk-1.61.0 → wingify_fme_python_sdk-1.62.0}/wingify/utils/brand_context.py +0 -0
  134. {wingify_fme_python_sdk-1.61.0 → wingify_fme_python_sdk-1.62.0}/wingify/utils/brand_util.py +0 -0
  135. {wingify_fme_python_sdk-1.61.0 → wingify_fme_python_sdk-1.62.0}/wingify/utils/campaign_util.py +0 -0
  136. {wingify_fme_python_sdk-1.61.0 → wingify_fme_python_sdk-1.62.0}/wingify/utils/data_type_util.py +0 -0
  137. {wingify_fme_python_sdk-1.61.0 → wingify_fme_python_sdk-1.62.0}/wingify/utils/decision_util.py +0 -0
  138. {wingify_fme_python_sdk-1.61.0 → wingify_fme_python_sdk-1.62.0}/wingify/utils/event_util.py +0 -0
  139. {wingify_fme_python_sdk-1.61.0 → wingify_fme_python_sdk-1.62.0}/wingify/utils/function_util.py +0 -0
  140. {wingify_fme_python_sdk-1.61.0 → wingify_fme_python_sdk-1.62.0}/wingify/utils/gateway_service_util.py +0 -0
  141. {wingify_fme_python_sdk-1.61.0 → wingify_fme_python_sdk-1.62.0}/wingify/utils/holdout_util.py +0 -0
  142. {wingify_fme_python_sdk-1.61.0 → wingify_fme_python_sdk-1.62.0}/wingify/utils/impression_util.py +0 -0
  143. {wingify_fme_python_sdk-1.61.0 → wingify_fme_python_sdk-1.62.0}/wingify/utils/log_message_util.py +0 -0
  144. {wingify_fme_python_sdk-1.61.0 → wingify_fme_python_sdk-1.62.0}/wingify/utils/meg_util.py +0 -0
  145. {wingify_fme_python_sdk-1.61.0 → wingify_fme_python_sdk-1.62.0}/wingify/utils/model_utils.py +0 -0
  146. {wingify_fme_python_sdk-1.61.0 → wingify_fme_python_sdk-1.62.0}/wingify/utils/network_util.py +0 -0
  147. {wingify_fme_python_sdk-1.61.0 → wingify_fme_python_sdk-1.62.0}/wingify/utils/rule_evaluation_util.py +0 -0
  148. {wingify_fme_python_sdk-1.61.0 → wingify_fme_python_sdk-1.62.0}/wingify/utils/settings_util.py +0 -0
  149. {wingify_fme_python_sdk-1.61.0 → wingify_fme_python_sdk-1.62.0}/wingify/utils/usage_stats_util.py +0 -0
  150. {wingify_fme_python_sdk-1.61.0 → wingify_fme_python_sdk-1.62.0}/wingify/utils/uuid_util.py +0 -0
  151. {wingify_fme_python_sdk-1.61.0 → wingify_fme_python_sdk-1.62.0}/wingify/vwo_client.py +0 -0
  152. {wingify_fme_python_sdk-1.61.0 → wingify_fme_python_sdk-1.62.0}/wingify/wingify_builder.py +0 -0
  153. {wingify_fme_python_sdk-1.61.0 → wingify_fme_python_sdk-1.62.0}/wingify/wingify_client.py +0 -0
  154. {wingify_fme_python_sdk-1.61.0 → wingify_fme_python_sdk-1.62.0}/wingify_fme_python_sdk.egg-info/dependency_links.txt +0 -0
  155. {wingify_fme_python_sdk-1.61.0 → wingify_fme_python_sdk-1.62.0}/wingify_fme_python_sdk.egg-info/requires.txt +0 -0
  156. {wingify_fme_python_sdk-1.61.0 → wingify_fme_python_sdk-1.62.0}/wingify_fme_python_sdk.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: wingify-fme-python-sdk
3
- Version: 1.61.0
3
+ Version: 1.62.0
4
4
  Summary: Wingify Feature Management and Experimentation SDK for Python
5
5
  Home-page: https://github.com/wingify/vwo-fme-python-sdk
6
6
  Author: Wingify
@@ -143,7 +143,7 @@ class PostDevelopCommand(develop):
143
143
 
144
144
  setup(
145
145
  name=_brand["name"],
146
- version="1.61.0",
146
+ version="1.62.0",
147
147
  description=_brand["description"],
148
148
  long_description=long_description,
149
149
  long_description_content_type="text/markdown",
@@ -17,7 +17,7 @@ class Constants:
17
17
  # TODO: read from setup.py
18
18
  sdk_meta = {
19
19
  "name": "vwo-fme-python-sdk",
20
- "version": "1.61.0",
20
+ "version": "1.62.0",
21
21
  }
22
22
 
23
23
  SDK_VERSION = sdk_meta["version"]
@@ -87,3 +87,6 @@ class Constants:
87
87
 
88
88
  VARIATION_IS_PART_OF_HOLDOUT = 1
89
89
  VARIATION_NOT_PART_OF_HOLDOUT = 2
90
+
91
+ INTERNAL_EVENTS_DEFAULT_SAMPLING_PERCENT_SERVER = 10.0
92
+ INTERNAL_EVENTS_DEFAULT_ALWAYS_APPLY_SAMPLING = False
@@ -0,0 +1,34 @@
1
+ # Copyright 2024-2026 Wingify Software Pvt. Ltd.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ class SampledDebugErrorTemplateKeys:
16
+ """
17
+ Debug error template keys (`msg_t`) that are subject to sampling.
18
+ Keys not listed here always send and bypass sampling.
19
+ """
20
+ SAMPLED_KEYS = {
21
+ "EVENT_NOT_FOUND",
22
+ "FEATURE_NOT_FOUND",
23
+ "FEATURE_NOT_FOUND_WITH_ID"
24
+ }
25
+
26
+ @staticmethod
27
+ def contains(message_template_key: str) -> bool:
28
+ """
29
+ Checks whether a debug error template key should be sampled before sending.
30
+
31
+ :param message_template_key: The `msg_t` value from the debug event
32
+ :return: `True` if the key is in the sampled set; `False` otherwise
33
+ """
34
+ return message_template_key is not None and message_template_key in SampledDebugErrorTemplateKeys.SAMPLED_KEYS
@@ -0,0 +1,53 @@
1
+ # Copyright 2024-2026 Wingify Software Pvt. Ltd.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ from typing import Dict, Any, Optional
16
+
17
+ class PlatformSamplingRates:
18
+ """
19
+ Holds the sampling percentage for a specific platform (e.g., server).
20
+ Maps to the per-platform object inside `sampling.usage` or `sampling.debug`.
21
+ """
22
+ def __init__(self, data: Dict[str, Any]):
23
+ self._server = data.get("server")
24
+
25
+ def get_server(self) -> Optional[float]:
26
+ return self._server
27
+
28
+ class EventCategorySamplingRates:
29
+ """
30
+ Groups sampling rates by event category: `usage` and `debug`.
31
+ Maps to the top-level `sampling` object in the DaCDN settings.
32
+ """
33
+ def __init__(self, data: Dict[str, Any]):
34
+ self._usage = PlatformSamplingRates(data.get("usage", {})) if data.get("usage") else None
35
+ self._debug = PlatformSamplingRates(data.get("debug", {})) if data.get("debug") else None
36
+
37
+ def get_usage(self) -> Optional[PlatformSamplingRates]:
38
+ return self._usage
39
+
40
+ def get_debug(self) -> Optional[PlatformSamplingRates]:
41
+ return self._debug
42
+
43
+ class AlwaysApplySampling:
44
+ """
45
+ Controls whether sampling is enforced before sending an event.
46
+ Maps to `alwaysApplySampling` in DaCDN settings.
47
+ When `server` is False (the default), usage-stats and sampled debug events bypass sampling and are always sent.
48
+ """
49
+ def __init__(self, data: Dict[str, Any]):
50
+ self._server = data.get("server")
51
+
52
+ def get_server(self) -> Optional[bool]:
53
+ return self._server
@@ -13,13 +13,14 @@
13
13
  # limitations under the License.
14
14
 
15
15
 
16
- from typing import List, Dict, Optional
16
+ from typing import List, Dict, Optional, Any
17
17
  from ..campaign.campaign_model import CampaignModel
18
18
  from ..campaign.feature_model import FeatureModel
19
19
  from ...utils.model_utils import _parse_campaign, _parse_feature
20
20
  import json
21
21
  from ...constants.Constants import Constants
22
22
  from ..campaign.holdout_model import HoldoutModel
23
+ from .internal_event_sampling_settings_model import AlwaysApplySampling, EventCategorySamplingRates
23
24
 
24
25
 
25
26
  class SettingsModel:
@@ -37,6 +38,10 @@ class SettingsModel:
37
38
  self._is_web_connectivity_enabled = data.get("isWebConnectivityEnabled", True)
38
39
  self._holdouts = [HoldoutModel(h) for h in data.get("holdouts", [])]
39
40
  self._is_tracking_usage_enabled = data.get("isMAU", False)
41
+ self._sdk_meta_info = data.get("sdkMetaInfo", {})
42
+ self._usage_stats_account_id = data.get("usageStatsAccountId", None)
43
+ self._always_apply_sampling = AlwaysApplySampling(data.get("alwaysApplySampling", {})) if data.get("alwaysApplySampling") is not None else None
44
+ self._sampling = EventCategorySamplingRates(data.get("sampling", {})) if data.get("sampling") is not None else None
40
45
 
41
46
  # Getter methods for accessing private attributes
42
47
  def get_features(self) -> List[FeatureModel]:
@@ -107,4 +112,16 @@ class SettingsModel:
107
112
  return self._is_tracking_usage_enabled
108
113
 
109
114
  def set_is_tracking_usage_enabled(self, value: bool):
110
- self._is_tracking_usage_enabled = value
115
+ self._is_tracking_usage_enabled = value
116
+
117
+ def get_sdk_meta_info(self) -> Dict[str, Any]:
118
+ return self._sdk_meta_info
119
+
120
+ def get_usage_stats_account_id(self) -> Optional[int]:
121
+ return self._usage_stats_account_id
122
+
123
+ def get_always_apply_sampling(self) -> Optional[AlwaysApplySampling]:
124
+ return self._always_apply_sampling
125
+
126
+ def get_sampling(self) -> Optional[EventCategorySamplingRates]:
127
+ return self._sampling
@@ -0,0 +1,62 @@
1
+ # Copyright 2024-2026 Wingify Software Pvt. Ltd.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ import random
16
+ from typing import Callable, Optional
17
+ from ..models.settings.settings_model import SettingsModel
18
+ from ..utils.internal_events_sampling_util import (
19
+ should_apply_sampling,
20
+ get_usage_stats_sampling_percent,
21
+ get_debug_event_sampling_percent,
22
+ passes_sampling_percent,
23
+ )
24
+
25
+ class InternalEventsSamplingService:
26
+ """
27
+ Applies sampling rules for internal SDK events:
28
+ `vwo_sdkUsageStats` and sampled `vwo_sdkDebug`.
29
+ """
30
+
31
+ def __init__(self, random_value_provider: Optional[Callable[[], float]] = None):
32
+ """
33
+ Creates a sampling service.
34
+ :param random_value_provider: Optional supplier returning a value in [0, 1) for sampling checks; overridable in tests.
35
+ """
36
+ self._random_value_provider = random_value_provider if random_value_provider is not None else random.random
37
+
38
+ def should_send_usage_stats_event(self, settings: Optional[SettingsModel]) -> bool:
39
+ """
40
+ Determines whether the usage-stats event should be sent.
41
+ On server, always sends unless `alwaysApplySampling.server` is enabled.
42
+ :param settings: Parsed settings from the server
43
+ :return: `True` when the usage-stats event should be sent
44
+ """
45
+ if not should_apply_sampling(settings):
46
+ return True
47
+
48
+ usage_stats_sampling_percent = get_usage_stats_sampling_percent(settings)
49
+ return passes_sampling_percent(usage_stats_sampling_percent, self._random_value_provider())
50
+
51
+ def should_send_sampled_debug_event(self, settings: Optional[SettingsModel]) -> bool:
52
+ """
53
+ Determines whether a sampled debug event should be sent.
54
+ Only called for `msg_t` keys in the sampled set; always-send keys bypass this.
55
+ :param settings: Parsed settings from the server
56
+ :return: `True` when the sampled debug event should be sent
57
+ """
58
+ if not should_apply_sampling(settings):
59
+ return True
60
+
61
+ debug_sampling_percent = get_debug_event_sampling_percent(settings)
62
+ return passes_sampling_percent(debug_sampling_percent, self._random_value_provider())
@@ -30,6 +30,22 @@ def send_debug_event_to_vwo(debug_event_props: Dict[str, Any]):
30
30
  get_debugger_event_payload,
31
31
  send_event,
32
32
  )
33
+ from ..utils.internal_events_sampling_util import is_sampled_debug_error_template_key
34
+ from ..services.internal_events_sampling_service import InternalEventsSamplingService
35
+ from ..wingify import Wingify
36
+
37
+ # Sampled keys: apply sampling only when alwaysApplySampling.server is true; others are ALWAYS_SEND
38
+ msg_t = debug_event_props.get("msg_t")
39
+ is_sampled_debug_event = isinstance(msg_t, str) and is_sampled_debug_error_template_key(msg_t)
40
+
41
+ instance = Wingify.getInstance()
42
+ settings = getattr(instance, '_settings', None) if instance else None
43
+ # if the event is present in the sampled debug events keys list, then apply sampling
44
+ if is_sampled_debug_event:
45
+ sampling_service = InternalEventsSamplingService()
46
+ if not sampling_service.should_send_sampled_debug_event(settings):
47
+ return
48
+
33
49
  # Create the query parameters
34
50
  properties = get_events_base_properties(EventEnum.DEBUGGER_EVENT.value)
35
51
  # Create the payload with required fields
@@ -0,0 +1,106 @@
1
+ # Copyright 2024-2026 Wingify Software Pvt. Ltd.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ import math
16
+ from typing import Optional
17
+ from ..constants.Constants import Constants
18
+ from ..constants.sampled_debug_error_template_keys import SampledDebugErrorTemplateKeys
19
+ from ..models.settings.settings_model import SettingsModel
20
+ from ..models.settings.internal_event_sampling_settings_model import PlatformSamplingRates
21
+
22
+ def get_default_sampling_percent() -> float:
23
+ """
24
+ Returns the default server sampling percentage when settings omit the value.
25
+ :return: Default sampling percentage (10.0)
26
+ """
27
+ return Constants.INTERNAL_EVENTS_DEFAULT_SAMPLING_PERCENT_SERVER
28
+
29
+ def normalize_sampling_percent(sampling_value: Optional[float]) -> float:
30
+ """
31
+ Normalizes a sampling value to a valid percentage in the range [0, 100].
32
+ Falls back to the server default when the value is missing or invalid.
33
+ :param sampling_value: Raw value from settings
34
+ :return: Valid sampling percentage between 0 and 100
35
+ """
36
+ if sampling_value is not None and 0 <= sampling_value <= 100:
37
+ return float(sampling_value)
38
+
39
+ return get_default_sampling_percent()
40
+
41
+ def get_runtime_sampling_percent(runtime_sampling_config: Optional[PlatformSamplingRates]) -> float:
42
+ """
43
+ Reads the server sampling percentage from a runtime sampling config object.
44
+ :param runtime_sampling_config: Nested config (e.g. `sampling.usage`)
45
+ :return: Sampling percentage for the server runtime
46
+ """
47
+ if runtime_sampling_config is None:
48
+ return get_default_sampling_percent()
49
+
50
+ return normalize_sampling_percent(runtime_sampling_config.get_server())
51
+
52
+ def get_usage_stats_sampling_percent(settings: Optional[SettingsModel]) -> float:
53
+ """
54
+ Reads the usage-stats sampling percentage for the server runtime from settings.
55
+ :param settings: Parsed settings from the server
56
+ :return: Configured usage-stats sampling percentage (0-100)
57
+ """
58
+ sampling = settings.get_sampling() if settings else None
59
+ usage_sampling = sampling.get_usage() if sampling else None
60
+ return get_runtime_sampling_percent(usage_sampling)
61
+
62
+ def get_debug_event_sampling_percent(settings: Optional[SettingsModel]) -> float:
63
+ """
64
+ Reads the debug-event sampling percentage for the server runtime from settings.
65
+ :param settings: Parsed settings from the server
66
+ :return: Configured debug sampling percentage (0-100)
67
+ """
68
+ sampling = settings.get_sampling() if settings else None
69
+ debug_sampling = sampling.get_debug() if sampling else None
70
+ return get_runtime_sampling_percent(debug_sampling)
71
+
72
+ def should_apply_sampling(settings: Optional[SettingsModel]) -> bool:
73
+ """
74
+ Determines whether sampling should be evaluated before send.
75
+ Controlled by `alwaysApplySampling.server`; defaults to `False`.
76
+ When `False`, usage-stats and sampled debug events are always sent.
77
+ :param settings: Parsed settings from the server
78
+ :return: `True` when a sampling check is required before sending
79
+ """
80
+ if settings is None:
81
+ return Constants.INTERNAL_EVENTS_DEFAULT_ALWAYS_APPLY_SAMPLING
82
+
83
+ always_apply_sampling = settings.get_always_apply_sampling()
84
+ if always_apply_sampling is None or always_apply_sampling.get_server() is None:
85
+ return Constants.INTERNAL_EVENTS_DEFAULT_ALWAYS_APPLY_SAMPLING
86
+
87
+ return always_apply_sampling.get_server()
88
+
89
+ def passes_sampling_percent(sampling_percent: float, random_value: float) -> bool:
90
+ """
91
+ Evaluates whether an event qualifies under the configured sampling percentage.
92
+ :param sampling_percent: Configured sampling percentage (0-100)
93
+ :param random_value: Random value in the range [0, 1)
94
+ :return: `True` when the random draw falls within the sampling threshold
95
+ """
96
+ # Map random [0,1) to integer percent bucket [0,100]
97
+ normalized_random_percent = int(math.floor(random_value * 101))
98
+ return normalized_random_percent <= sampling_percent
99
+
100
+ def is_sampled_debug_error_template_key(message_template_key: str) -> bool:
101
+ """
102
+ Checks whether a debug error template key is in the sampled set.
103
+ :param message_template_key: The `msg_t` value from the debug event
104
+ :return: `True` when the key requires sampling before send
105
+ """
106
+ return SampledDebugErrorTemplateKeys.contains(message_template_key)
@@ -25,6 +25,7 @@ from wingify.utils.brand_context import set_is_via_vwo
25
25
  from wingify.utils.brand_util import get_brand
26
26
  from wingify.utils.log_message_util import refresh_log_messages
27
27
  from wingify.packages.logger.core.log_manager import LogManager
28
+ from wingify.services.internal_events_sampling_service import InternalEventsSamplingService
28
29
 
29
30
 
30
31
  class Wingify:
@@ -103,22 +104,22 @@ def init(options: Dict[str, Any]) -> Optional["WingifyClient"]:
103
104
  sdk_init_time = int((time.time() * 1000) - start_time_for_init)
104
105
 
105
106
  was_initialized = False
106
- if instance.original_settings is not None:
107
- was_initialized = instance.original_settings.get("sdkMetaInfo", {}).get(
108
- "wasInitializedEarlier"
109
- )
107
+ if getattr(instance, '_settings', None) is not None:
108
+ sdk_meta_info = instance._settings.get_sdk_meta_info()
109
+ if sdk_meta_info:
110
+ was_initialized = sdk_meta_info.get("wasInitializedEarlier", False)
110
111
 
111
112
  if instance.is_settings_valid_on_init and not was_initialized:
112
113
  send_sdk_init_event(instance.settings_fetch_time, sdk_init_time)
113
114
 
114
115
  usage_stats_account_id = None
115
- if instance.original_settings is not None:
116
- usage_stats_account_id = instance.original_settings.get(
117
- "usageStatsAccountId"
118
- )
116
+ if getattr(instance, '_settings', None) is not None:
117
+ usage_stats_account_id = instance._settings.get_usage_stats_account_id()
119
118
 
120
119
  if usage_stats_account_id:
121
- send_sdk_usage_stats_event(usage_stats_account_id)
120
+ sampling_service = InternalEventsSamplingService()
121
+ if sampling_service.should_send_usage_stats_event(instance._settings):
122
+ send_sdk_usage_stats_event(usage_stats_account_id)
122
123
 
123
124
  return instance
124
125
  except Exception as e:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: wingify-fme-python-sdk
3
- Version: 1.61.0
3
+ Version: 1.62.0
4
4
  Summary: Wingify Feature Management and Experimentation SDK for Python
5
5
  Home-page: https://github.com/wingify/vwo-fme-python-sdk
6
6
  Author: Wingify
@@ -20,6 +20,7 @@ wingify/api/set_attribute_api.py
20
20
  wingify/api/track_api.py
21
21
  wingify/constants/Constants.py
22
22
  wingify/constants/__init__.py
23
+ wingify/constants/sampled_debug_error_template_keys.py
23
24
  wingify/decorators/__init__.py
24
25
  wingify/decorators/storage_decorator.py
25
26
  wingify/enums/__init__.py
@@ -61,6 +62,7 @@ wingify/models/schemas/rule_schema.py
61
62
  wingify/models/schemas/settings_schema.py
62
63
  wingify/models/schemas/variable_schema.py
63
64
  wingify/models/settings/__init__.py
65
+ wingify/models/settings/internal_event_sampling_settings_model.py
64
66
  wingify/models/settings/settings_model.py
65
67
  wingify/models/storage/__init__.py
66
68
  wingify/models/storage/storage_model.py
@@ -119,6 +121,7 @@ wingify/services/__init__.py
119
121
  wingify/services/batch_event_queue.py
120
122
  wingify/services/campaign_decision_service.py
121
123
  wingify/services/hooks_manager.py
124
+ wingify/services/internal_events_sampling_service.py
122
125
  wingify/services/settings_manager.py
123
126
  wingify/services/storage_service.py
124
127
  wingify/services/url_service.py
@@ -135,6 +138,7 @@ wingify/utils/function_util.py
135
138
  wingify/utils/gateway_service_util.py
136
139
  wingify/utils/holdout_util.py
137
140
  wingify/utils/impression_util.py
141
+ wingify/utils/internal_events_sampling_util.py
138
142
  wingify/utils/log_message_util.py
139
143
  wingify/utils/meg_util.py
140
144
  wingify/utils/model_utils.py