wingify-fme-python-sdk 1.62.0__tar.gz → 1.66.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 (158) hide show
  1. {wingify_fme_python_sdk-1.62.0 → wingify_fme_python_sdk-1.66.0}/PKG-INFO +686 -15
  2. wingify_fme_python_sdk-1.62.0/wingify_fme_python_sdk.egg-info/PKG-INFO → wingify_fme_python_sdk-1.66.0/README.md +668 -39
  3. wingify_fme_python_sdk-1.66.0/requirements.txt +4 -0
  4. {wingify_fme_python_sdk-1.62.0 → wingify_fme_python_sdk-1.66.0}/setup.py +7 -3
  5. {wingify_fme_python_sdk-1.62.0 → wingify_fme_python_sdk-1.66.0}/wingify/constants/Constants.py +1 -1
  6. {wingify_fme_python_sdk-1.62.0 → wingify_fme_python_sdk-1.66.0}/wingify/utils/event_util.py +19 -8
  7. {wingify_fme_python_sdk-1.62.0 → wingify_fme_python_sdk-1.66.0}/wingify/utils/network_util.py +21 -15
  8. {wingify_fme_python_sdk-1.62.0 → wingify_fme_python_sdk-1.66.0}/wingify/wingify.py +8 -2
  9. wingify_fme_python_sdk-1.62.0/README.md → wingify_fme_python_sdk-1.66.0/wingify_fme_python_sdk.egg-info/PKG-INFO +710 -12
  10. wingify_fme_python_sdk-1.66.0/wingify_fme_python_sdk.egg-info/requires.txt +8 -0
  11. wingify_fme_python_sdk-1.62.0/requirements.txt +0 -3
  12. wingify_fme_python_sdk-1.62.0/wingify_fme_python_sdk.egg-info/requires.txt +0 -3
  13. {wingify_fme_python_sdk-1.62.0 → wingify_fme_python_sdk-1.66.0}/LICENSE +0 -0
  14. {wingify_fme_python_sdk-1.62.0 → wingify_fme_python_sdk-1.66.0}/MANIFEST.in +0 -0
  15. {wingify_fme_python_sdk-1.62.0 → wingify_fme_python_sdk-1.66.0}/NOTICE +0 -0
  16. {wingify_fme_python_sdk-1.62.0 → wingify_fme_python_sdk-1.66.0}/requirements-dev.txt +0 -0
  17. {wingify_fme_python_sdk-1.62.0 → wingify_fme_python_sdk-1.66.0}/setup.cfg +0 -0
  18. {wingify_fme_python_sdk-1.62.0 → wingify_fme_python_sdk-1.66.0}/vwo/__init__.py +0 -0
  19. {wingify_fme_python_sdk-1.62.0 → wingify_fme_python_sdk-1.66.0}/vwo/vwo.py +0 -0
  20. {wingify_fme_python_sdk-1.62.0 → wingify_fme_python_sdk-1.66.0}/vwo/vwo_builder.py +0 -0
  21. {wingify_fme_python_sdk-1.62.0 → wingify_fme_python_sdk-1.66.0}/vwo/vwo_client.py +0 -0
  22. {wingify_fme_python_sdk-1.62.0 → wingify_fme_python_sdk-1.66.0}/wingify/__init__.py +0 -0
  23. {wingify_fme_python_sdk-1.62.0 → wingify_fme_python_sdk-1.66.0}/wingify/api/__init__.py +0 -0
  24. {wingify_fme_python_sdk-1.62.0 → wingify_fme_python_sdk-1.66.0}/wingify/api/get_flag_api.py +0 -0
  25. {wingify_fme_python_sdk-1.62.0 → wingify_fme_python_sdk-1.66.0}/wingify/api/set_attribute_api.py +0 -0
  26. {wingify_fme_python_sdk-1.62.0 → wingify_fme_python_sdk-1.66.0}/wingify/api/track_api.py +0 -0
  27. {wingify_fme_python_sdk-1.62.0 → wingify_fme_python_sdk-1.66.0}/wingify/constants/__init__.py +0 -0
  28. {wingify_fme_python_sdk-1.62.0 → wingify_fme_python_sdk-1.66.0}/wingify/constants/sampled_debug_error_template_keys.py +0 -0
  29. {wingify_fme_python_sdk-1.62.0 → wingify_fme_python_sdk-1.66.0}/wingify/decorators/__init__.py +0 -0
  30. {wingify_fme_python_sdk-1.62.0 → wingify_fme_python_sdk-1.66.0}/wingify/decorators/storage_decorator.py +0 -0
  31. {wingify_fme_python_sdk-1.62.0 → wingify_fme_python_sdk-1.66.0}/wingify/enums/__init__.py +0 -0
  32. {wingify_fme_python_sdk-1.62.0 → wingify_fme_python_sdk-1.66.0}/wingify/enums/api_enum.py +0 -0
  33. {wingify_fme_python_sdk-1.62.0 → wingify_fme_python_sdk-1.66.0}/wingify/enums/campaign_type_enum.py +0 -0
  34. {wingify_fme_python_sdk-1.62.0 → wingify_fme_python_sdk-1.66.0}/wingify/enums/debug_category_enum.py +0 -0
  35. {wingify_fme_python_sdk-1.62.0 → wingify_fme_python_sdk-1.66.0}/wingify/enums/event_enum.py +0 -0
  36. {wingify_fme_python_sdk-1.62.0 → wingify_fme_python_sdk-1.66.0}/wingify/enums/headers_enum.py +0 -0
  37. {wingify_fme_python_sdk-1.62.0 → wingify_fme_python_sdk-1.66.0}/wingify/enums/hooks_enum.py +0 -0
  38. {wingify_fme_python_sdk-1.62.0 → wingify_fme_python_sdk-1.66.0}/wingify/enums/status_enum.py +0 -0
  39. {wingify_fme_python_sdk-1.62.0 → wingify_fme_python_sdk-1.66.0}/wingify/enums/storage_enum.py +0 -0
  40. {wingify_fme_python_sdk-1.62.0 → wingify_fme_python_sdk-1.66.0}/wingify/enums/url_enum.py +0 -0
  41. {wingify_fme_python_sdk-1.62.0 → wingify_fme_python_sdk-1.66.0}/wingify/models/Alias.py +0 -0
  42. {wingify_fme_python_sdk-1.62.0 → wingify_fme_python_sdk-1.66.0}/wingify/models/AliasSetResponse.py +0 -0
  43. {wingify_fme_python_sdk-1.62.0 → wingify_fme_python_sdk-1.66.0}/wingify/models/__init__.py +0 -0
  44. {wingify_fme_python_sdk-1.62.0 → wingify_fme_python_sdk-1.66.0}/wingify/models/batch_event_data.py +0 -0
  45. {wingify_fme_python_sdk-1.62.0 → wingify_fme_python_sdk-1.66.0}/wingify/models/campaign/__init__.py +0 -0
  46. {wingify_fme_python_sdk-1.62.0 → wingify_fme_python_sdk-1.66.0}/wingify/models/campaign/campaign_model.py +0 -0
  47. {wingify_fme_python_sdk-1.62.0 → wingify_fme_python_sdk-1.66.0}/wingify/models/campaign/feature_model.py +0 -0
  48. {wingify_fme_python_sdk-1.62.0 → wingify_fme_python_sdk-1.66.0}/wingify/models/campaign/holdout_model.py +0 -0
  49. {wingify_fme_python_sdk-1.62.0 → wingify_fme_python_sdk-1.66.0}/wingify/models/campaign/impact_campaign_model.py +0 -0
  50. {wingify_fme_python_sdk-1.62.0 → wingify_fme_python_sdk-1.66.0}/wingify/models/campaign/metric_model.py +0 -0
  51. {wingify_fme_python_sdk-1.62.0 → wingify_fme_python_sdk-1.66.0}/wingify/models/campaign/rule_model.py +0 -0
  52. {wingify_fme_python_sdk-1.62.0 → wingify_fme_python_sdk-1.66.0}/wingify/models/campaign/variable_model.py +0 -0
  53. {wingify_fme_python_sdk-1.62.0 → wingify_fme_python_sdk-1.66.0}/wingify/models/campaign/variation_model.py +0 -0
  54. {wingify_fme_python_sdk-1.62.0 → wingify_fme_python_sdk-1.66.0}/wingify/models/gateway_service_model.py +0 -0
  55. {wingify_fme_python_sdk-1.62.0 → wingify_fme_python_sdk-1.66.0}/wingify/models/schemas/__init__.py +0 -0
  56. {wingify_fme_python_sdk-1.62.0 → wingify_fme_python_sdk-1.66.0}/wingify/models/schemas/campaign_group_schema.py +0 -0
  57. {wingify_fme_python_sdk-1.62.0 → wingify_fme_python_sdk-1.66.0}/wingify/models/schemas/campaign_metric_schema.py +0 -0
  58. {wingify_fme_python_sdk-1.62.0 → wingify_fme_python_sdk-1.66.0}/wingify/models/schemas/campaign_schema.py +0 -0
  59. {wingify_fme_python_sdk-1.62.0 → wingify_fme_python_sdk-1.66.0}/wingify/models/schemas/campaign_variation_schema.py +0 -0
  60. {wingify_fme_python_sdk-1.62.0 → wingify_fme_python_sdk-1.66.0}/wingify/models/schemas/empty_object_schema.py +0 -0
  61. {wingify_fme_python_sdk-1.62.0 → wingify_fme_python_sdk-1.66.0}/wingify/models/schemas/feature_schema.py +0 -0
  62. {wingify_fme_python_sdk-1.62.0 → wingify_fme_python_sdk-1.66.0}/wingify/models/schemas/group_schema.py +0 -0
  63. {wingify_fme_python_sdk-1.62.0 → wingify_fme_python_sdk-1.66.0}/wingify/models/schemas/holdout_schema.py +0 -0
  64. {wingify_fme_python_sdk-1.62.0 → wingify_fme_python_sdk-1.66.0}/wingify/models/schemas/rule_schema.py +0 -0
  65. {wingify_fme_python_sdk-1.62.0 → wingify_fme_python_sdk-1.66.0}/wingify/models/schemas/settings_schema.py +0 -0
  66. {wingify_fme_python_sdk-1.62.0 → wingify_fme_python_sdk-1.66.0}/wingify/models/schemas/variable_schema.py +0 -0
  67. {wingify_fme_python_sdk-1.62.0 → wingify_fme_python_sdk-1.66.0}/wingify/models/settings/__init__.py +0 -0
  68. {wingify_fme_python_sdk-1.62.0 → wingify_fme_python_sdk-1.66.0}/wingify/models/settings/internal_event_sampling_settings_model.py +0 -0
  69. {wingify_fme_python_sdk-1.62.0 → wingify_fme_python_sdk-1.66.0}/wingify/models/settings/settings_model.py +0 -0
  70. {wingify_fme_python_sdk-1.62.0 → wingify_fme_python_sdk-1.66.0}/wingify/models/storage/__init__.py +0 -0
  71. {wingify_fme_python_sdk-1.62.0 → wingify_fme_python_sdk-1.66.0}/wingify/models/storage/storage_model.py +0 -0
  72. {wingify_fme_python_sdk-1.62.0 → wingify_fme_python_sdk-1.66.0}/wingify/models/user/__init__.py +0 -0
  73. {wingify_fme_python_sdk-1.62.0 → wingify_fme_python_sdk-1.66.0}/wingify/models/user/context_model.py +0 -0
  74. {wingify_fme_python_sdk-1.62.0 → wingify_fme_python_sdk-1.66.0}/wingify/models/user/context_vwo_model.py +0 -0
  75. {wingify_fme_python_sdk-1.62.0 → wingify_fme_python_sdk-1.66.0}/wingify/models/user/get_flag.py +0 -0
  76. {wingify_fme_python_sdk-1.62.0 → wingify_fme_python_sdk-1.66.0}/wingify/models/vwo_options_model.py +0 -0
  77. {wingify_fme_python_sdk-1.62.0 → wingify_fme_python_sdk-1.66.0}/wingify/models/wingify_options_model.py +0 -0
  78. {wingify_fme_python_sdk-1.62.0 → wingify_fme_python_sdk-1.66.0}/wingify/packages/__init__.py +0 -0
  79. {wingify_fme_python_sdk-1.62.0 → wingify_fme_python_sdk-1.66.0}/wingify/packages/decision_maker/__init__.py +0 -0
  80. {wingify_fme_python_sdk-1.62.0 → wingify_fme_python_sdk-1.66.0}/wingify/packages/decision_maker/decision_maker.py +0 -0
  81. {wingify_fme_python_sdk-1.62.0 → wingify_fme_python_sdk-1.66.0}/wingify/packages/logger/__init__.py +0 -0
  82. {wingify_fme_python_sdk-1.62.0 → wingify_fme_python_sdk-1.66.0}/wingify/packages/logger/core/__init__.py +0 -0
  83. {wingify_fme_python_sdk-1.62.0 → wingify_fme_python_sdk-1.66.0}/wingify/packages/logger/core/log_manager.py +0 -0
  84. {wingify_fme_python_sdk-1.62.0 → wingify_fme_python_sdk-1.66.0}/wingify/packages/logger/core/log_transport_manager.py +0 -0
  85. {wingify_fme_python_sdk-1.62.0 → wingify_fme_python_sdk-1.66.0}/wingify/packages/logger/enums/__init__.py +0 -0
  86. {wingify_fme_python_sdk-1.62.0 → wingify_fme_python_sdk-1.66.0}/wingify/packages/logger/enums/log_level_enum.py +0 -0
  87. {wingify_fme_python_sdk-1.62.0 → wingify_fme_python_sdk-1.66.0}/wingify/packages/logger/enums/log_level_number_enum.py +0 -0
  88. {wingify_fme_python_sdk-1.62.0 → wingify_fme_python_sdk-1.66.0}/wingify/packages/logger/log_message_builder.py +0 -0
  89. {wingify_fme_python_sdk-1.62.0 → wingify_fme_python_sdk-1.66.0}/wingify/packages/logger/logger.py +0 -0
  90. {wingify_fme_python_sdk-1.62.0 → wingify_fme_python_sdk-1.66.0}/wingify/packages/logger/transports/__init__.py +0 -0
  91. {wingify_fme_python_sdk-1.62.0 → wingify_fme_python_sdk-1.66.0}/wingify/packages/logger/transports/console_transport.py +0 -0
  92. {wingify_fme_python_sdk-1.62.0 → wingify_fme_python_sdk-1.66.0}/wingify/packages/network_layer/__init__.py +0 -0
  93. {wingify_fme_python_sdk-1.62.0 → wingify_fme_python_sdk-1.66.0}/wingify/packages/network_layer/client/__init__.py +0 -0
  94. {wingify_fme_python_sdk-1.62.0 → wingify_fme_python_sdk-1.66.0}/wingify/packages/network_layer/client/network_client.py +0 -0
  95. {wingify_fme_python_sdk-1.62.0 → wingify_fme_python_sdk-1.66.0}/wingify/packages/network_layer/handlers/__init__.py +0 -0
  96. {wingify_fme_python_sdk-1.62.0 → wingify_fme_python_sdk-1.66.0}/wingify/packages/network_layer/handlers/request_handler.py +0 -0
  97. {wingify_fme_python_sdk-1.62.0 → wingify_fme_python_sdk-1.66.0}/wingify/packages/network_layer/manager/__init__.py +0 -0
  98. {wingify_fme_python_sdk-1.62.0 → wingify_fme_python_sdk-1.66.0}/wingify/packages/network_layer/manager/network_manager.py +0 -0
  99. {wingify_fme_python_sdk-1.62.0 → wingify_fme_python_sdk-1.66.0}/wingify/packages/network_layer/models/__init__.py +0 -0
  100. {wingify_fme_python_sdk-1.62.0 → wingify_fme_python_sdk-1.66.0}/wingify/packages/network_layer/models/global_request_model.py +0 -0
  101. {wingify_fme_python_sdk-1.62.0 → wingify_fme_python_sdk-1.66.0}/wingify/packages/network_layer/models/request_model.py +0 -0
  102. {wingify_fme_python_sdk-1.62.0 → wingify_fme_python_sdk-1.66.0}/wingify/packages/network_layer/models/response_model.py +0 -0
  103. {wingify_fme_python_sdk-1.62.0 → wingify_fme_python_sdk-1.66.0}/wingify/packages/segmentation_evaluator/__init__.py +0 -0
  104. {wingify_fme_python_sdk-1.62.0 → wingify_fme_python_sdk-1.66.0}/wingify/packages/segmentation_evaluator/core/__init__.py +0 -0
  105. {wingify_fme_python_sdk-1.62.0 → wingify_fme_python_sdk-1.66.0}/wingify/packages/segmentation_evaluator/core/segmentation_manager.py +0 -0
  106. {wingify_fme_python_sdk-1.62.0 → wingify_fme_python_sdk-1.66.0}/wingify/packages/segmentation_evaluator/enums/__init__.py +0 -0
  107. {wingify_fme_python_sdk-1.62.0 → wingify_fme_python_sdk-1.66.0}/wingify/packages/segmentation_evaluator/enums/segment_operand_regex_enum.py +0 -0
  108. {wingify_fme_python_sdk-1.62.0 → wingify_fme_python_sdk-1.66.0}/wingify/packages/segmentation_evaluator/enums/segment_operand_value_enum.py +0 -0
  109. {wingify_fme_python_sdk-1.62.0 → wingify_fme_python_sdk-1.66.0}/wingify/packages/segmentation_evaluator/enums/segment_operator_value_enum.py +0 -0
  110. {wingify_fme_python_sdk-1.62.0 → wingify_fme_python_sdk-1.66.0}/wingify/packages/segmentation_evaluator/evaluators/__init__.py +0 -0
  111. {wingify_fme_python_sdk-1.62.0 → wingify_fme_python_sdk-1.66.0}/wingify/packages/segmentation_evaluator/evaluators/segment_evaluator.py +0 -0
  112. {wingify_fme_python_sdk-1.62.0 → wingify_fme_python_sdk-1.66.0}/wingify/packages/segmentation_evaluator/evaluators/segment_operand_evaluator.py +0 -0
  113. {wingify_fme_python_sdk-1.62.0 → wingify_fme_python_sdk-1.66.0}/wingify/packages/segmentation_evaluator/utils/__init__.py +0 -0
  114. {wingify_fme_python_sdk-1.62.0 → wingify_fme_python_sdk-1.66.0}/wingify/packages/segmentation_evaluator/utils/segment_util.py +0 -0
  115. {wingify_fme_python_sdk-1.62.0 → wingify_fme_python_sdk-1.66.0}/wingify/packages/segmentation_evaluator/utils/web_testing_segment_util.py +0 -0
  116. {wingify_fme_python_sdk-1.62.0 → wingify_fme_python_sdk-1.66.0}/wingify/packages/storage/__init__.py +0 -0
  117. {wingify_fme_python_sdk-1.62.0 → wingify_fme_python_sdk-1.66.0}/wingify/packages/storage/connector.py +0 -0
  118. {wingify_fme_python_sdk-1.62.0 → wingify_fme_python_sdk-1.66.0}/wingify/packages/storage/storage.py +0 -0
  119. {wingify_fme_python_sdk-1.62.0 → wingify_fme_python_sdk-1.66.0}/wingify/resources/__init__.py +0 -0
  120. {wingify_fme_python_sdk-1.62.0 → wingify_fme_python_sdk-1.66.0}/wingify/resources/debug-messages.json +0 -0
  121. {wingify_fme_python_sdk-1.62.0 → wingify_fme_python_sdk-1.66.0}/wingify/resources/error-messages.json +0 -0
  122. {wingify_fme_python_sdk-1.62.0 → wingify_fme_python_sdk-1.66.0}/wingify/resources/info-message.json +0 -0
  123. {wingify_fme_python_sdk-1.62.0 → wingify_fme_python_sdk-1.66.0}/wingify/resources/trace-messages.json +0 -0
  124. {wingify_fme_python_sdk-1.62.0 → wingify_fme_python_sdk-1.66.0}/wingify/resources/warn-messages.json +0 -0
  125. {wingify_fme_python_sdk-1.62.0 → wingify_fme_python_sdk-1.66.0}/wingify/services/__init__.py +0 -0
  126. {wingify_fme_python_sdk-1.62.0 → wingify_fme_python_sdk-1.66.0}/wingify/services/batch_event_queue.py +0 -0
  127. {wingify_fme_python_sdk-1.62.0 → wingify_fme_python_sdk-1.66.0}/wingify/services/campaign_decision_service.py +0 -0
  128. {wingify_fme_python_sdk-1.62.0 → wingify_fme_python_sdk-1.66.0}/wingify/services/hooks_manager.py +0 -0
  129. {wingify_fme_python_sdk-1.62.0 → wingify_fme_python_sdk-1.66.0}/wingify/services/internal_events_sampling_service.py +0 -0
  130. {wingify_fme_python_sdk-1.62.0 → wingify_fme_python_sdk-1.66.0}/wingify/services/settings_manager.py +0 -0
  131. {wingify_fme_python_sdk-1.62.0 → wingify_fme_python_sdk-1.66.0}/wingify/services/storage_service.py +0 -0
  132. {wingify_fme_python_sdk-1.62.0 → wingify_fme_python_sdk-1.66.0}/wingify/services/url_service.py +0 -0
  133. {wingify_fme_python_sdk-1.62.0 → wingify_fme_python_sdk-1.66.0}/wingify/utils/__init__.py +0 -0
  134. {wingify_fme_python_sdk-1.62.0 → wingify_fme_python_sdk-1.66.0}/wingify/utils/aliasing_util.py +0 -0
  135. {wingify_fme_python_sdk-1.62.0 → wingify_fme_python_sdk-1.66.0}/wingify/utils/brand_context.py +0 -0
  136. {wingify_fme_python_sdk-1.62.0 → wingify_fme_python_sdk-1.66.0}/wingify/utils/brand_util.py +0 -0
  137. {wingify_fme_python_sdk-1.62.0 → wingify_fme_python_sdk-1.66.0}/wingify/utils/campaign_util.py +0 -0
  138. {wingify_fme_python_sdk-1.62.0 → wingify_fme_python_sdk-1.66.0}/wingify/utils/data_type_util.py +0 -0
  139. {wingify_fme_python_sdk-1.62.0 → wingify_fme_python_sdk-1.66.0}/wingify/utils/debugger_service_util.py +0 -0
  140. {wingify_fme_python_sdk-1.62.0 → wingify_fme_python_sdk-1.66.0}/wingify/utils/decision_util.py +0 -0
  141. {wingify_fme_python_sdk-1.62.0 → wingify_fme_python_sdk-1.66.0}/wingify/utils/function_util.py +0 -0
  142. {wingify_fme_python_sdk-1.62.0 → wingify_fme_python_sdk-1.66.0}/wingify/utils/gateway_service_util.py +0 -0
  143. {wingify_fme_python_sdk-1.62.0 → wingify_fme_python_sdk-1.66.0}/wingify/utils/holdout_util.py +0 -0
  144. {wingify_fme_python_sdk-1.62.0 → wingify_fme_python_sdk-1.66.0}/wingify/utils/impression_util.py +0 -0
  145. {wingify_fme_python_sdk-1.62.0 → wingify_fme_python_sdk-1.66.0}/wingify/utils/internal_events_sampling_util.py +0 -0
  146. {wingify_fme_python_sdk-1.62.0 → wingify_fme_python_sdk-1.66.0}/wingify/utils/log_message_util.py +0 -0
  147. {wingify_fme_python_sdk-1.62.0 → wingify_fme_python_sdk-1.66.0}/wingify/utils/meg_util.py +0 -0
  148. {wingify_fme_python_sdk-1.62.0 → wingify_fme_python_sdk-1.66.0}/wingify/utils/model_utils.py +0 -0
  149. {wingify_fme_python_sdk-1.62.0 → wingify_fme_python_sdk-1.66.0}/wingify/utils/rule_evaluation_util.py +0 -0
  150. {wingify_fme_python_sdk-1.62.0 → wingify_fme_python_sdk-1.66.0}/wingify/utils/settings_util.py +0 -0
  151. {wingify_fme_python_sdk-1.62.0 → wingify_fme_python_sdk-1.66.0}/wingify/utils/usage_stats_util.py +0 -0
  152. {wingify_fme_python_sdk-1.62.0 → wingify_fme_python_sdk-1.66.0}/wingify/utils/uuid_util.py +0 -0
  153. {wingify_fme_python_sdk-1.62.0 → wingify_fme_python_sdk-1.66.0}/wingify/vwo_client.py +0 -0
  154. {wingify_fme_python_sdk-1.62.0 → wingify_fme_python_sdk-1.66.0}/wingify/wingify_builder.py +0 -0
  155. {wingify_fme_python_sdk-1.62.0 → wingify_fme_python_sdk-1.66.0}/wingify/wingify_client.py +0 -0
  156. {wingify_fme_python_sdk-1.62.0 → wingify_fme_python_sdk-1.66.0}/wingify_fme_python_sdk.egg-info/SOURCES.txt +0 -0
  157. {wingify_fme_python_sdk-1.62.0 → wingify_fme_python_sdk-1.66.0}/wingify_fme_python_sdk.egg-info/dependency_links.txt +0 -0
  158. {wingify_fme_python_sdk-1.62.0 → wingify_fme_python_sdk-1.66.0}/wingify_fme_python_sdk.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.1
1
+ Metadata-Version: 2.4
2
2
  Name: wingify-fme-python-sdk
3
- Version: 1.62.0
3
+ Version: 1.66.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
@@ -18,12 +18,27 @@ Classifier: Programming Language :: Python :: 3.8
18
18
  Classifier: Programming Language :: Python :: 3.9
19
19
  Classifier: Programming Language :: Python :: 3.10
20
20
  Classifier: Programming Language :: Python :: 3.11
21
+ Classifier: Programming Language :: Python :: 3.12
22
+ Classifier: Programming Language :: Python :: 3.13
23
+ Classifier: Programming Language :: Python :: 3.14
24
+ Classifier: Programming Language :: Python :: 3.15
21
25
  Description-Content-Type: text/markdown
22
26
  License-File: LICENSE
23
27
  License-File: NOTICE
24
- Requires-Dist: murmurhash==1.0.10
28
+ Requires-Dist: murmurhash==1.0.10; python_version < "3.9"
29
+ Requires-Dist: murmurhash<1.1,>=1.0.10; python_version >= "3.9"
25
30
  Requires-Dist: requests>=2.27.1
26
31
  Requires-Dist: jsonschema>=3.2.0
32
+ Dynamic: author
33
+ Dynamic: author-email
34
+ Dynamic: classifier
35
+ Dynamic: description
36
+ Dynamic: description-content-type
37
+ Dynamic: home-page
38
+ Dynamic: license
39
+ Dynamic: license-file
40
+ Dynamic: requires-dist
41
+ Dynamic: summary
27
42
 
28
43
  ## VWO Feature Management and Experimentation SDK for Python
29
44
 
@@ -44,13 +59,35 @@ The **VWO Feature Management and Experimentation SDK** (VWO FME Python SDK) enab
44
59
 
45
60
  It's recommended you use [virtualenv](https://virtualenv.pypa.io/en/latest/) to create isolated Python environments.
46
61
 
62
+ If SDK version less than 1.50.0, use the VWO snippet. If SDK version 1.50.0 or later, we recommend switching to the Wingify snippet
63
+
64
+ <details>
65
+ <summary>VWO (SDK version &lt; 1.50.0)</summary>
66
+
47
67
  ```bash
48
68
  pip install vwo-fme-python-sdk
49
69
  ```
50
70
 
71
+ </details>
72
+
73
+ <details>
74
+ <summary>Wingify (SDK version &gt;= 1.50.0) — recommended</summary>
75
+
76
+ ```bash
77
+ pip install wingify-fme-python-sdk
78
+ ```
79
+
80
+ </details>
81
+
51
82
  ## Basic Usage Example
52
83
 
53
84
  The following example demonstrates initializing the SDK with a VWO account ID and SDK key, setting a user context, checking if a feature flag is enabled, and tracking a custom event.
85
+
86
+ If SDK version less than 1.50.0, use the VWO snippet. If SDK version 1.50.0 or later, we recommend switching to the Wingify snippet
87
+
88
+ <details>
89
+ <summary>VWO (SDK version &lt; 1.50.0)</summary>
90
+
54
91
  ```python
55
92
  from vwo import init
56
93
 
@@ -77,6 +114,39 @@ vwo_client.track_event('event_name', user_context, event_properties)
77
114
  vwo_client.set_attribute('attribute_key', 'attribute_value', user_context)
78
115
  ```
79
116
 
117
+ </details>
118
+
119
+ <details>
120
+ <summary>Wingify (SDK version &gt;= 1.50.0) — recommended</summary>
121
+
122
+ ```python
123
+ from wingify import init
124
+
125
+ options = {
126
+ 'sdk_key': '32-alpha-numeric-sdk-key', # SDK Key
127
+ 'account_id': '123456' # Wingify Account ID
128
+ }
129
+
130
+ wingify_client = init(options)
131
+
132
+ # set user context
133
+ user_context = {'id': 'unique_user_id'}
134
+ # returns a flag object
135
+ get_flag = wingify_client.get_flag('feature_key', user_context)
136
+ # check if flag is enabled
137
+ is_enabled = get_flag.is_enabled()
138
+ # get varible
139
+ int_var = get_flag.get_variable('int_variable_key', 'default_value')
140
+
141
+ # track event
142
+ wingify_client.track_event('event_name', user_context, event_properties)
143
+
144
+ # set attribute
145
+ wingify_client.set_attribute('attribute_key', 'attribute_value', user_context)
146
+ ```
147
+
148
+ </details>
149
+
80
150
  ## Utility Functions
81
151
 
82
152
  ### getUUID
@@ -85,10 +155,26 @@ The `getUUID` function generates a deterministic UUID for a given user and accou
85
155
 
86
156
  #### Function Signature
87
157
 
158
+ If SDK version less than 1.50.0, use the VWO snippet. If SDK version 1.50.0 or later, we recommend switching to the Wingify snippet
159
+
160
+ <details>
161
+ <summary>VWO (SDK version &lt; 1.50.0)</summary>
162
+
88
163
  ```python
89
164
  vwo.getUUID(user_id: str, account_id: str) -> Optional[str]
90
165
  ```
91
166
 
167
+ </details>
168
+
169
+ <details>
170
+ <summary>Wingify (SDK version &gt;= 1.50.0) — recommended</summary>
171
+
172
+ ```python
173
+ wingify.getUUID(user_id: str, account_id: str) -> Optional[str]
174
+ ```
175
+
176
+ </details>
177
+
92
178
  #### Parameters
93
179
 
94
180
  | **Parameter** | **Description** | **Required** | **Type** |
@@ -103,6 +189,11 @@ vwo.getUUID(user_id: str, account_id: str) -> Optional[str]
103
189
 
104
190
  #### Example
105
191
 
192
+ If SDK version less than 1.50.0, use the VWO snippet. If SDK version 1.50.0 or later, we recommend switching to the Wingify snippet
193
+
194
+ <details>
195
+ <summary>VWO (SDK version &lt; 1.50.0)</summary>
196
+
106
197
  ```python
107
198
  import vwo
108
199
 
@@ -116,6 +207,26 @@ print('Generated UUID:', uuid)
116
207
  # Output: Generated UUID: CC25A368ADA0542699EAD62489811105
117
208
  ```
118
209
 
210
+ </details>
211
+
212
+ <details>
213
+ <summary>Wingify (SDK version &gt;= 1.50.0) — recommended</summary>
214
+
215
+ ```python
216
+ import wingify
217
+
218
+ # Generate UUID for a user
219
+ userId = 'user-123'
220
+ accountId = '123456'
221
+
222
+ uuid = wingify.getUUID(userId, accountId)
223
+
224
+ print('Generated UUID:', uuid)
225
+ # Output: Generated UUID: CC25A368ADA0542699EAD62489811105
226
+ ```
227
+
228
+ </details>
229
+
119
230
  #### Use Cases
120
231
 
121
232
  - Generate consistent UUIDs for users across different services
@@ -124,7 +235,7 @@ print('Generated UUID:', uuid)
124
235
 
125
236
  ## Advanced Configuration Options
126
237
 
127
- To customize the SDK further, additional parameters can be passed to the `init()` API. Here’s a table describing each option:
238
+ To customize the SDK further, additional parameters can be passed to the `init()` API. Here's a table describing each option:
128
239
 
129
240
  | **Parameter** | **Description** | **Required** | **Type** | **Example** |
130
241
  | ---------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------ | -------- | ------------------------------- |
@@ -167,13 +278,12 @@ context = {
167
278
  },
168
279
  'user_agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36',
169
280
  'ip_address': '1.1.1.1',
170
- 'session_id': 1697123456 # Optional: Custom session ID for web client integration
281
+ 'session_id': 1697123456, # Optional: Custom session ID for web client integration
171
282
  'platformVariables': {
172
283
  # Reference example only:.
173
284
  # In production, fetch campaign assignments using script run in frontend and pass that object to backend as webTestingCampaigns.
174
285
  'webTestingCampaigns': '{"122":"1","130":"2"}'
175
- },
176
- 'session_id': 1697123456 # Optional: Custom session ID for web client integration
286
+ }
177
287
  }
178
288
  ```
179
289
 
@@ -209,6 +319,11 @@ You can access and manage session IDs through the following methods:
209
319
 
210
320
  ### Example Usage
211
321
 
322
+ If SDK version less than 1.50.0, use the VWO snippet. If SDK version 1.50.0 or later, we recommend switching to the Wingify snippet
323
+
324
+ <details>
325
+ <summary>VWO (SDK version &lt; 1.50.0)</summary>
326
+
212
327
  ```python
213
328
  from vwo import init
214
329
 
@@ -228,8 +343,39 @@ session_id = flag.get_session_id()
228
343
  print(f"Session ID for web client: {session_id}")
229
344
  ```
230
345
 
346
+ </details>
347
+
348
+ <details>
349
+ <summary>Wingify (SDK version &gt;= 1.50.0) — recommended</summary>
350
+
351
+ ```python
352
+ from wingify import init
353
+
354
+ options = {
355
+ 'sdk_key': '32-alpha-numeric-sdk-key',
356
+ 'account_id': '123456'
357
+ }
358
+
359
+ wingify_client = init(options)
360
+
361
+ # Session ID is automatically generated if not provided
362
+ context = {'id': 'user-123'}
363
+ flag = wingify_client.get_flag('feature-key', context)
364
+
365
+ # Access the session ID to pass to web client for session recording
366
+ session_id = flag.get_session_id()
367
+ print(f"Session ID for web client: {session_id}")
368
+ ```
369
+
370
+ </details>
371
+
231
372
  You can also explicitly set a session ID to match a web client session:
232
373
 
374
+ If SDK version less than 1.50.0, use the VWO snippet. If SDK version 1.50.0 or later, we recommend switching to the Wingify snippet
375
+
376
+ <details>
377
+ <summary>VWO (SDK version &lt; 1.50.0)</summary>
378
+
233
379
  ```python
234
380
  from vwo import init
235
381
 
@@ -243,6 +389,26 @@ context_with_session = {
243
389
  flag = vwo_client.get_flag('feature-key', context_with_session)
244
390
  ```
245
391
 
392
+ </details>
393
+
394
+ <details>
395
+ <summary>Wingify (SDK version &gt;= 1.50.0) — recommended</summary>
396
+
397
+ ```python
398
+ from wingify import init
399
+
400
+ wingify_client = init(options)
401
+
402
+ context_with_session = {
403
+ 'id': 'user-123',
404
+ 'session_id': 1697123456 # Custom session ID matching web client
405
+ }
406
+
407
+ flag = wingify_client.get_flag('feature-key', context_with_session)
408
+ ```
409
+
410
+ </details>
411
+
246
412
  This enhancement enables seamless integration between server-side feature flag decisions and client-side session recording, allowing for comprehensive user behavior analysis across both server and client environments.
247
413
 
248
414
  ### Basic Feature Flagging
@@ -258,6 +424,11 @@ The `get_flag()` method provides a simple way to check if a feature is enabled f
258
424
 
259
425
  Example usage:
260
426
 
427
+ If SDK version less than 1.50.0, use the VWO snippet. If SDK version 1.50.0 or later, we recommend switching to the Wingify snippet
428
+
429
+ <details>
430
+ <summary>VWO (SDK version &lt; 1.50.0)</summary>
431
+
261
432
  ```python
262
433
  feature_flag = vwo_client.get_flag("feature_key", context)
263
434
  is_enabled = feature_flag.is_enabled()
@@ -272,6 +443,27 @@ else:
272
443
  print("Feature is not enabled!")
273
444
  ```
274
445
 
446
+ </details>
447
+
448
+ <details>
449
+ <summary>Wingify (SDK version &gt;= 1.50.0) — recommended</summary>
450
+
451
+ ```python
452
+ feature_flag = wingify_client.get_flag("feature_key", context)
453
+ is_enabled = feature_flag.is_enabled()
454
+
455
+ if is_enabled:
456
+ print("Feature is enabled!")
457
+
458
+ # Get and use feature variable with type safety
459
+ variable_value = feature_flag.get_variable('feature_variable', 'default_value')
460
+ print("Variable value: " + variable_value)
461
+ else:
462
+ print("Feature is not enabled!")
463
+ ```
464
+
465
+ </details>
466
+
275
467
  ### Custom Event Tracking
276
468
 
277
469
  Feature flags can be enhanced with connected metrics to track key performance indicators (KPIs) for your features. These metrics help measure the effectiveness of your testing rules by comparing control versus variation performance, and evaluate the impact of personalization and rollout campaigns. Use the `track_event()` method to track custom events like conversions, user interactions, and other important metrics:
@@ -284,10 +476,26 @@ Feature flags can be enhanced with connected metrics to track key performance in
284
476
 
285
477
  Example usage:
286
478
 
479
+ If SDK version less than 1.50.0, use the VWO snippet. If SDK version 1.50.0 or later, we recommend switching to the Wingify snippet
480
+
481
+ <details>
482
+ <summary>VWO (SDK version &lt; 1.50.0)</summary>
483
+
287
484
  ```python
288
485
  vwo_client.track_event('event_name', context, event_properties)
289
486
  ```
290
487
 
488
+ </details>
489
+
490
+ <details>
491
+ <summary>Wingify (SDK version &gt;= 1.50.0) — recommended</summary>
492
+
493
+ ```python
494
+ wingify_client.track_event('event_name', context, event_properties)
495
+ ```
496
+
497
+ </details>
498
+
291
499
  ### Pushing Attributes
292
500
 
293
501
  User attributes provide rich contextual information about users, enabling powerful personalization. The `set_attribute()` method in VWOClient provides a simple way to associate these attributes with users in VWO for advanced segmentation. The method accepts an attribute key, value, and dictionary containing the user information. Here's what you need to know about the method parameters:
@@ -300,10 +508,26 @@ User attributes provide rich contextual information about users, enabling powerf
300
508
 
301
509
  Example usage:
302
510
 
511
+ If SDK version less than 1.50.0, use the VWO snippet. If SDK version 1.50.0 or later, we recommend switching to the Wingify snippet
512
+
513
+ <details>
514
+ <summary>VWO (SDK version &lt; 1.50.0)</summary>
515
+
303
516
  ```python
304
517
  vwo_client.set_attribute('attribute_key', 'attribute_value', context)
305
518
  ```
306
519
 
520
+ </details>
521
+
522
+ <details>
523
+ <summary>Wingify (SDK version &gt;= 1.50.0) — recommended</summary>
524
+
525
+ ```python
526
+ wingify_client.set_attribute('attribute_key', 'attribute_value', context)
527
+ ```
528
+
529
+ </details>
530
+
307
531
  ### Polling Interval Adjustment
308
532
 
309
533
  The `poll_interval` is an optional parameter that allows the SDK to automatically fetch and update settings from the VWO server at specified intervals. The polling interval can be configured in three ways:
@@ -314,6 +538,11 @@ The `poll_interval` is an optional parameter that allows the SDK to automaticall
314
538
 
315
539
  Setting this parameter ensures your application always uses the latest configuration by periodically checking for and applying any updates.
316
540
 
541
+ If SDK version less than 1.50.0, use the VWO snippet. If SDK version 1.50.0 or later, we recommend switching to the Wingify snippet
542
+
543
+ <details>
544
+ <summary>VWO (SDK version &lt; 1.50.0)</summary>
545
+
317
546
  ```python
318
547
  options = {
319
548
  'sdk_key': '32-alpha-numeric-sdk-key', # SDK Key
@@ -324,6 +553,23 @@ options = {
324
553
  vwo_client = init(options)
325
554
  ```
326
555
 
556
+ </details>
557
+
558
+ <details>
559
+ <summary>Wingify (SDK version &gt;= 1.50.0) — recommended</summary>
560
+
561
+ ```python
562
+ options = {
563
+ 'sdk_key': '32-alpha-numeric-sdk-key', # SDK Key
564
+ 'account_id': '123456', # Wingify Account ID
565
+ 'poll_interval': 60000 # Set the poll interval to 60 seconds
566
+ }
567
+
568
+ wingify_client = init(options)
569
+ ```
570
+
571
+ </details>
572
+
327
573
  ### Gateway
328
574
 
329
575
  The VWO FME Gateway Service is an optional but powerful component that enhances VWO's Feature Management and Experimentation (FME) SDKs. It acts as a critical intermediary for pre-segmentation capabilities based on user location and user agent (UA). By deploying this service within your infrastructure, you benefit from minimal latency and strengthened security for all FME operations.
@@ -340,6 +586,11 @@ The Gateway Service is required in the following scenarios:
340
586
 
341
587
  The gateway can be customized by passing the `gateway_service` parameter in the `init` configuration.
342
588
 
589
+ If SDK version less than 1.50.0, use the VWO snippet. If SDK version 1.50.0 or later, we recommend switching to the Wingify snippet
590
+
591
+ <details>
592
+ <summary>VWO (SDK version &lt; 1.50.0)</summary>
593
+
343
594
  ```python
344
595
  options = {
345
596
  'sdk_key': '32-alpha-numeric-sdk-key', # SDK Key
@@ -351,6 +602,24 @@ options = {
351
602
  vwo_client = init(options)
352
603
  ```
353
604
 
605
+ </details>
606
+
607
+ <details>
608
+ <summary>Wingify (SDK version &gt;= 1.50.0) — recommended</summary>
609
+
610
+ ```python
611
+ options = {
612
+ 'sdk_key': '32-alpha-numeric-sdk-key', # SDK Key
613
+ 'account_id': '123456', # Wingify Account ID
614
+ 'gateway_service': {
615
+ 'url': 'http://custom.gateway.com'
616
+ }
617
+ }
618
+ wingify_client = init(options)
619
+ ```
620
+
621
+ </details>
622
+
354
623
  ### User Aliasing
355
624
 
356
625
  User aliasing allows you to create consistent user experiences across different user identifiers. This is useful when users can be identified by multiple IDs (e.g., anonymous ID, authenticated ID, email), and you want to maintain consistent feature flag decisions across these identifiers.
@@ -366,6 +635,11 @@ User aliasing requires:
366
635
 
367
636
  To enable user aliasing, configure both the gateway service and the aliasing flag:
368
637
 
638
+ If SDK version less than 1.50.0, use the VWO snippet. If SDK version 1.50.0 or later, we recommend switching to the Wingify snippet
639
+
640
+ <details>
641
+ <summary>VWO (SDK version &lt; 1.50.0)</summary>
642
+
369
643
  ```python
370
644
  from vwo import init
371
645
 
@@ -383,10 +657,39 @@ options = {
383
657
  vwo_client = init(options)
384
658
  ```
385
659
 
660
+ </details>
661
+
662
+ <details>
663
+ <summary>Wingify (SDK version &gt;= 1.50.0) — recommended</summary>
664
+
665
+ ```python
666
+ from wingify import init
667
+
668
+ options = {
669
+ 'sdk_key': '32-alpha-numeric-sdk-key', # SDK Key
670
+ 'account_id': '123456', # Wingify Account ID
671
+ # set gateway service
672
+ 'gateway_service': {
673
+ 'url': 'http://custom.gateway.com'
674
+ },
675
+ # enable aliasing
676
+ 'is_aliasing_enabled': True,
677
+ }
678
+
679
+ wingify_client = init(options)
680
+ ```
681
+
682
+ </details>
683
+
386
684
  #### Setting User Alias
387
685
 
388
686
  Use the `set_alias()` method to create an alias relationship between a user ID and an alias ID:
389
687
 
688
+ If SDK version less than 1.50.0, use the VWO snippet. If SDK version 1.50.0 or later, we recommend switching to the Wingify snippet
689
+
690
+ <details>
691
+ <summary>VWO (SDK version &lt; 1.50.0)</summary>
692
+
390
693
  ```python
391
694
  # Method 1: Using user ID and alias ID directly
392
695
  is_alias_set = vwo_client.set_alias('user-123', 'alias-456')
@@ -396,6 +699,22 @@ context = {'id': 'user-123'}
396
699
  is_alias_set = vwo_client.set_alias(context, 'alias-456')
397
700
  ```
398
701
 
702
+ </details>
703
+
704
+ <details>
705
+ <summary>Wingify (SDK version &gt;= 1.50.0) — recommended</summary>
706
+
707
+ ```python
708
+ # Method 1: Using user ID and alias ID directly
709
+ is_alias_set = wingify_client.set_alias('user-123', 'alias-456')
710
+
711
+ # Method 2: Using context dict and alias ID
712
+ context = {'id': 'user-123'}
713
+ is_alias_set = wingify_client.set_alias(context, 'alias-456')
714
+ ```
715
+
716
+ </details>
717
+
399
718
  ### Proxy URL
400
719
 
401
720
  The `proxy_url` parameter allows you to redirect all SDK network calls through a custom proxy server. This feature enables you to route all SDK network requests (settings, tracking, etc.) through your own proxy server, providing better control over network traffic and security.
@@ -404,6 +723,11 @@ The `proxy_url` parameter allows you to redirect all SDK network calls through a
404
723
 
405
724
  The proxy URL can be configured by passing the `proxy_url` parameter in the `init` configuration.
406
725
 
726
+ If SDK version less than 1.50.0, use the VWO snippet. If SDK version 1.50.0 or later, we recommend switching to the Wingify snippet
727
+
728
+ <details>
729
+ <summary>VWO (SDK version &lt; 1.50.0)</summary>
730
+
407
731
  ```python
408
732
  options = {
409
733
  'sdk_key': '32-alpha-numeric-sdk-key', # SDK Key
@@ -413,6 +737,24 @@ options = {
413
737
 
414
738
  vwo_client = init(options)
415
739
  ```
740
+
741
+ </details>
742
+
743
+ <details>
744
+ <summary>Wingify (SDK version &gt;= 1.50.0) — recommended</summary>
745
+
746
+ ```python
747
+ options = {
748
+ 'sdk_key': '32-alpha-numeric-sdk-key', # SDK Key
749
+ 'account_id': '123456', # Wingify Account ID
750
+ 'proxy_url': 'http://custom.proxy.com'
751
+ }
752
+
753
+ wingify_client = init(options)
754
+ ```
755
+
756
+ </details>
757
+
416
758
  **Note:** If both `gateway_service` and `proxy_url` are provided, the SDK will give preference to the `gateway_service` for all network requests.
417
759
 
418
760
  ### Storage
@@ -429,6 +771,11 @@ Key benefits of implementing storage:
429
771
 
430
772
  The storage mechanism ensures that once a decision is made for a user, it remains consistent even if campaign settings are modified in the VWO Application. This is particularly useful for maintaining a stable user experience during A/B tests and feature rollouts.
431
773
 
774
+ If SDK version less than 1.50.0, use the VWO snippet. If SDK version 1.50.0 or later, we recommend switching to the Wingify snippet
775
+
776
+ <details>
777
+ <summary>VWO (SDK version &lt; 1.50.0)</summary>
778
+
432
779
  ```python
433
780
  from vwo import StorageConnector
434
781
  class UserStorage(StorageConnector):
@@ -456,9 +803,48 @@ options = {
456
803
  vwo_client = init(options)
457
804
  ```
458
805
 
806
+ </details>
807
+
808
+ <details>
809
+ <summary>Wingify (SDK version &gt;= 1.50.0) — recommended</summary>
810
+
811
+ ```python
812
+ from wingify import StorageConnector
813
+ class UserStorage(StorageConnector):
814
+ def get(self, key: str, user_id: str):
815
+ return client_db.get(f"{key}_{user_id}")
816
+
817
+ def set(self, value: dict):
818
+ key = f"{value.get('featureKey')}_{value.get('userId')}"
819
+ client_db[key] = {
820
+ 'rolloutKey': value.get('rolloutKey'),
821
+ 'rolloutVariationId': value.get('rolloutVariationId'),
822
+ 'rolloutId': value.get('rolloutId'),
823
+ 'experimentKey': value.get('experimentKey'),
824
+ 'experimentVariationId': value.get('experimentVariationId'),
825
+ 'experimentId': value.get('experimentId'),
826
+ }
827
+ return True
828
+
829
+ options = {
830
+ 'sdk_key': '32-alpha-numeric-sdk-key', # SDK Key
831
+ 'account_id': '123456', # Wingify Account ID
832
+ 'storage': UserStorage()
833
+ }
834
+
835
+ wingify_client = init(options)
836
+ ```
837
+
838
+ </details>
839
+
459
840
  ### Integrations
460
841
  VWO FME SDKs provide seamless integration with third-party tools like analytics platforms, monitoring services, customer data platforms (CDPs), and messaging systems. This is achieved through a simple yet powerful callback mechanism that receives VWO-specific properties and can forward them to any third-party tool of your choice.
461
842
 
843
+ If SDK version less than 1.50.0, use the VWO snippet. If SDK version 1.50.0 or later, we recommend switching to the Wingify snippet
844
+
845
+ <details>
846
+ <summary>VWO (SDK version &lt; 1.50.0)</summary>
847
+
462
848
  ```python
463
849
  def callback(properties):
464
850
  # properties will contain all the required VWO specific information
@@ -474,6 +860,28 @@ options = {
474
860
  vwo_client = init(options)
475
861
  ```
476
862
 
863
+ </details>
864
+
865
+ <details>
866
+ <summary>Wingify (SDK version &gt;= 1.50.0) — recommended</summary>
867
+
868
+ ```python
869
+ def callback(properties):
870
+ # properties will contain all the required Wingify specific information
871
+ print(properties)
872
+
873
+ options = {
874
+ 'sdk_key': '32-alpha-numeric-sdk-key', # SDK Key
875
+ 'account_id': '12345', # Wingify Account ID
876
+ 'integrations': {
877
+ 'callback': callback
878
+ }
879
+ }
880
+ wingify_client = init(options)
881
+ ```
882
+
883
+ </details>
884
+
477
885
  ### Logger
478
886
 
479
887
  VWO by default logs all `ERROR` level messages to your server console.
@@ -487,6 +895,11 @@ To gain more control over VWO's logging behaviour, you can use the `logger` para
487
895
 
488
896
  #### Example 1: Set log level to control verbosity of logs
489
897
 
898
+ If SDK version less than 1.50.0, use the VWO snippet. If SDK version 1.50.0 or later, we recommend switching to the Wingify snippet
899
+
900
+ <details>
901
+ <summary>VWO (SDK version &lt; 1.50.0)</summary>
902
+
490
903
  ```python
491
904
  options = {
492
905
  'account_id': '123456', # VWO Account ID
@@ -498,8 +911,31 @@ options = {
498
911
  vwo_client = init(options)
499
912
  ```
500
913
 
914
+ </details>
915
+
916
+ <details>
917
+ <summary>Wingify (SDK version &gt;= 1.50.0) — recommended</summary>
918
+
919
+ ```python
920
+ options = {
921
+ 'account_id': '123456', # Wingify Account ID
922
+ 'sdk_key': '32-alpha-numeric-sdk-key', # SDK Key
923
+ 'logger': {
924
+ 'level': 'DEBUG'
925
+ }
926
+ }
927
+ wingify_client = init(options)
928
+ ```
929
+
930
+ </details>
931
+
501
932
  #### Example 2: Add custom prefix to log messages for easier identification
502
933
 
934
+ If SDK version less than 1.50.0, use the VWO snippet. If SDK version 1.50.0 or later, we recommend switching to the Wingify snippet
935
+
936
+ <details>
937
+ <summary>VWO (SDK version &lt; 1.50.0)</summary>
938
+
503
939
  ```python
504
940
  options = {
505
941
  'account_id': '123456', # VWO Account ID
@@ -512,6 +948,25 @@ options = {
512
948
  vwo_client = init(options)
513
949
  ```
514
950
 
951
+ </details>
952
+
953
+ <details>
954
+ <summary>Wingify (SDK version &gt;= 1.50.0) — recommended</summary>
955
+
956
+ ```python
957
+ options = {
958
+ 'account_id': '123456', # Wingify Account ID
959
+ 'sdk_key': '32-alpha-numeric-sdk-key', # SDK Key
960
+ 'logger': {
961
+ 'level': 'DEBUG',
962
+ 'prefix': 'CUSTOM LOG PREFIX'
963
+ }
964
+ }
965
+ wingify_client = init(options)
966
+ ```
967
+
968
+ </details>
969
+
515
970
  #### Example 3: Implement custom transport to handle logs your way
516
971
 
517
972
  The `transport` parameter allows you to implement custom logging behavior by providing your own logging functions. You can define handlers for different log levels (`debug`, `info`, `warn`, `error`, `trace`) to process log messages according to your needs.
@@ -527,6 +982,12 @@ For example, you could:
527
982
  The transport object should implement handlers for the log levels you want to customize. Each handler receives the log message as a parameter.
528
983
 
529
984
  For single transport you can use the `transport` parameter. For example:
985
+
986
+ If SDK version less than 1.50.0, use the VWO snippet. If SDK version 1.50.0 or later, we recommend switching to the Wingify snippet
987
+
988
+ <details>
989
+ <summary>VWO (SDK version &lt; 1.50.0)</summary>
990
+
530
991
  ```python
531
992
  from vwo import init
532
993
 
@@ -541,7 +1002,7 @@ class CustomTransport:
541
1002
  options = {
542
1003
  'sdk_key': '32-alpha-numeric-sdk-key', # SDK Key
543
1004
  'account_id': '123456', # VWO Account ID
544
- 'logger' {
1005
+ 'logger': {
545
1006
  'transport': CustomTransport({'level': 'INFO'})
546
1007
  }
547
1008
  }
@@ -549,7 +1010,42 @@ options = {
549
1010
  vwo_client = init(options)
550
1011
  ```
551
1012
 
1013
+ </details>
1014
+
1015
+ <details>
1016
+ <summary>Wingify (SDK version &gt;= 1.50.0) — recommended</summary>
1017
+
1018
+ ```python
1019
+ from wingify import init
1020
+
1021
+ class CustomTransport:
1022
+ def __init__(self, config):
1023
+ self.level = config.get('level', "ERROR")
1024
+ self.config = config
1025
+
1026
+ def log(self, level, message):
1027
+ # your custom implementation here
1028
+
1029
+ options = {
1030
+ 'sdk_key': '32-alpha-numeric-sdk-key', # SDK Key
1031
+ 'account_id': '123456', # Wingify Account ID
1032
+ 'logger': {
1033
+ 'transport': CustomTransport({'level': 'INFO'})
1034
+ }
1035
+ }
1036
+
1037
+ wingify_client = init(options)
1038
+ ```
1039
+
1040
+ </details>
1041
+
552
1042
  For multiple transports you can use the `transports` parameter. For example:
1043
+
1044
+ If SDK version less than 1.50.0, use the VWO snippet. If SDK version 1.50.0 or later, we recommend switching to the Wingify snippet
1045
+
1046
+ <details>
1047
+ <summary>VWO (SDK version &lt; 1.50.0)</summary>
1048
+
553
1049
  ```python
554
1050
  from vwo import init
555
1051
 
@@ -572,7 +1068,7 @@ class CustomTransportForError:
572
1068
  options = {
573
1069
  'sdk_key': '32-alpha-numeric-sdk-key', # SDK Key
574
1070
  'account_id': '123456', # VWO Account ID
575
- 'logger' {
1071
+ 'logger': {
576
1072
  'transports': [
577
1073
  CustomTransportForInfo({'level': 'INFO'}),
578
1074
  CustomTransportForError({'level': 'ERROR'})
@@ -583,6 +1079,46 @@ options = {
583
1079
  vwo_client = init(options)
584
1080
  ```
585
1081
 
1082
+ </details>
1083
+
1084
+ <details>
1085
+ <summary>Wingify (SDK version &gt;= 1.50.0) — recommended</summary>
1086
+
1087
+ ```python
1088
+ from wingify import init
1089
+
1090
+ class CustomTransportForInfo:
1091
+ def __init__(self, config):
1092
+ self.level = config.get('level', "INFO")
1093
+ self.config = config
1094
+
1095
+ def log(self, level, message):
1096
+ # your custom implementation here
1097
+
1098
+ class CustomTransportForError:
1099
+ def __init__(self, config):
1100
+ self.level = config.get('level', "ERROR")
1101
+ self.config = config
1102
+
1103
+ def log(self, level, message):
1104
+ # your custom implementation here
1105
+
1106
+ options = {
1107
+ 'sdk_key': '32-alpha-numeric-sdk-key', # SDK Key
1108
+ 'account_id': '123456', # Wingify Account ID
1109
+ 'logger': {
1110
+ 'transports': [
1111
+ CustomTransportForInfo({'level': 'INFO'}),
1112
+ CustomTransportForError({'level': 'ERROR'})
1113
+ ]
1114
+ }
1115
+ }
1116
+
1117
+ wingify_client = init(options)
1118
+ ```
1119
+
1120
+ </details>
1121
+
586
1122
  ### Threading
587
1123
 
588
1124
  The SDK leverages threading to efficiently manage concurrent operations. Threading is enabled by default, but can be disabled by configuring the `threading` parameter during initialization. This gives you control over the SDK's concurrency behavior based on your application's needs.
@@ -598,6 +1134,11 @@ When threading is disabled, all tracking calls will block the main execution thr
598
1134
 
599
1135
  Example showing blocking behavior:
600
1136
 
1137
+ If SDK version less than 1.50.0, use the VWO snippet. If SDK version 1.50.0 or later, we recommend switching to the Wingify snippet
1138
+
1139
+ <details>
1140
+ <summary>VWO (SDK version &lt; 1.50.0)</summary>
1141
+
601
1142
  ```python
602
1143
  # By disabling threading, the SDK will wait for the response from the server for each tracking call.
603
1144
  from vwo import init
@@ -608,11 +1149,33 @@ options = {
608
1149
  'threading': {
609
1150
  'enabled': False
610
1151
  }
611
- }
1152
+ }
1153
+
1154
+ vwo_client = init(options)
1155
+ ```
1156
+
1157
+ </details>
1158
+
1159
+ <details>
1160
+ <summary>Wingify (SDK version &gt;= 1.50.0) — recommended</summary>
1161
+
1162
+ ```python
1163
+ # By disabling threading, the SDK will wait for the response from the server for each tracking call.
1164
+ from wingify import init
1165
+
1166
+ options = {
1167
+ 'sdk_key': '32-alpha-numeric-sdk-key', # SDK Key
1168
+ 'account_id': '123456', # Wingify Account ID
1169
+ 'threading': {
1170
+ 'enabled': False
1171
+ }
1172
+ }
612
1173
 
613
- vwo_client = init(options)
1174
+ wingify_client = init(options)
614
1175
  ```
615
1176
 
1177
+ </details>
1178
+
616
1179
  #### Enable Threading (Default)
617
1180
 
618
1181
  Threading in the VWO SDK provides several important benefits:
@@ -627,6 +1190,11 @@ Example of how threading improves performance:
627
1190
 
628
1191
  The SDK uses a thread pool to manage these concurrent operations efficiently. The default pool size of 5 threads is suitable for most applications, but you can adjust it based on your needs:
629
1192
 
1193
+ If SDK version less than 1.50.0, use the VWO snippet. If SDK version 1.50.0 or later, we recommend switching to the Wingify snippet
1194
+
1195
+ <details>
1196
+ <summary>VWO (SDK version &lt; 1.50.0)</summary>
1197
+
630
1198
  ```python
631
1199
  # By default, threading is enabled and the max_workers is set to 5.
632
1200
  # you can customize the max_workers by passing the max_workers parameter in the threading configuration.
@@ -639,11 +1207,35 @@ options = {
639
1207
  'enabled': True,
640
1208
  'max_workers': 10
641
1209
  }
642
- }
1210
+ }
643
1211
 
644
- vwo_client = init(options)
1212
+ vwo_client = init(options)
645
1213
  ```
646
1214
 
1215
+ </details>
1216
+
1217
+ <details>
1218
+ <summary>Wingify (SDK version &gt;= 1.50.0) — recommended</summary>
1219
+
1220
+ ```python
1221
+ # By default, threading is enabled and the max_workers is set to 5.
1222
+ # you can customize the max_workers by passing the max_workers parameter in the threading configuration.
1223
+ from wingify import init
1224
+
1225
+ options = {
1226
+ 'sdk_key': '32-alpha-numeric-sdk-key', # SDK Key
1227
+ 'account_id': '123456', # Wingify Account ID
1228
+ 'threading': {
1229
+ 'enabled': True,
1230
+ 'max_workers': 10
1231
+ }
1232
+ }
1233
+
1234
+ wingify_client = init(options)
1235
+ ```
1236
+
1237
+ </details>
1238
+
647
1239
  ### Batch Events
648
1240
 
649
1241
  The `batch_event_data` configuration allows you to optimize network requests by batching multiple events together. This is particularly useful for high-traffic applications where you want to reduce the number of API calls.
@@ -656,6 +1248,11 @@ The `batch_event_data` configuration allows you to optimize network requests by
656
1248
 
657
1249
  Example usage:
658
1250
 
1251
+ If SDK version less than 1.50.0, use the VWO snippet. If SDK version 1.50.0 or later, we recommend switching to the Wingify snippet
1252
+
1253
+ <details>
1254
+ <summary>VWO (SDK version &lt; 1.50.0)</summary>
1255
+
659
1256
  ```python
660
1257
  from vwo import init
661
1258
 
@@ -666,8 +1263,8 @@ options = {
666
1263
  'sdk_key': '32-alpha-numeric-sdk-key', # SDK Key
667
1264
  'account_id': '123456', # VWO Account ID
668
1265
  'batch_event_data': {
669
- 'events_per_request': 60, # Send up to 100 events per request
670
- 'request_time_interval': 100, # Flush events every 60 seconds
1266
+ 'events_per_request': 100, # Send up to 100 events per request
1267
+ 'request_time_interval': 60, # Flush events every 60 seconds
671
1268
  'flush_callback': event_flush_callback
672
1269
  }
673
1270
  }
@@ -675,12 +1272,54 @@ options = {
675
1272
  vwo_client = init(options)
676
1273
  ```
677
1274
 
1275
+ </details>
1276
+
1277
+ <details>
1278
+ <summary>Wingify (SDK version &gt;= 1.50.0) — recommended</summary>
1279
+
1280
+ ```python
1281
+ from wingify import init
1282
+
1283
+ def event_flush_callback(error, payload):
1284
+ # your implementation here
1285
+
1286
+ options = {
1287
+ 'sdk_key': '32-alpha-numeric-sdk-key', # SDK Key
1288
+ 'account_id': '123456', # Wingify Account ID
1289
+ 'batch_event_data': {
1290
+ 'events_per_request': 100, # Send up to 100 events per request
1291
+ 'request_time_interval': 60, # Flush events every 60 seconds
1292
+ 'flush_callback': event_flush_callback
1293
+ }
1294
+ }
1295
+
1296
+ wingify_client = init(options)
1297
+ ```
1298
+
1299
+ </details>
1300
+
678
1301
  You can also manually flush events using the `flush_events()` method:
679
1302
 
1303
+ If SDK version less than 1.50.0, use the VWO snippet. If SDK version 1.50.0 or later, we recommend switching to the Wingify snippet
1304
+
1305
+ <details>
1306
+ <summary>VWO (SDK version &lt; 1.50.0)</summary>
1307
+
680
1308
  ```python
681
1309
  vwo_client.flush_events()
682
1310
  ```
683
1311
 
1312
+ </details>
1313
+
1314
+ <details>
1315
+ <summary>Wingify (SDK version &gt;= 1.50.0) — recommended</summary>
1316
+
1317
+ ```python
1318
+ wingify_client.flush_events()
1319
+ ```
1320
+
1321
+ </details>
1322
+
684
1323
 
685
1324
  ### Custom Bucketing Seed
686
1325
 
@@ -688,6 +1327,11 @@ This option allows you to override the default bucketing behavior (which uses `u
688
1327
 
689
1328
  To use this feature, provide the `bucketingSeed` in the user context.
690
1329
 
1330
+ If SDK version less than 1.50.0, use the VWO snippet. If SDK version 1.50.0 or later, we recommend switching to the Wingify snippet
1331
+
1332
+ <details>
1333
+ <summary>VWO (SDK version &lt; 1.50.0)</summary>
1334
+
691
1335
  ```python
692
1336
  from vwo import init
693
1337
 
@@ -708,6 +1352,33 @@ user_context = {
708
1352
  get_flag = vwo_client.get_flag('feature_key', user_context)
709
1353
  ```
710
1354
 
1355
+ </details>
1356
+
1357
+ <details>
1358
+ <summary>Wingify (SDK version &gt;= 1.50.0) — recommended</summary>
1359
+
1360
+ ```python
1361
+ from wingify import init
1362
+
1363
+ options = {
1364
+ 'sdk_key': '32-alpha-numeric-sdk-key', # SDK Key
1365
+ 'account_id': '123456', # Wingify Account ID
1366
+ }
1367
+
1368
+ wingify_client = init(options)
1369
+
1370
+ # Pass bucketingSeed in context
1371
+ user_context = {
1372
+ 'id': 'unique_user_id',
1373
+ 'bucketingSeed': 'group_id_123' # This value will be used for bucketing
1374
+ }
1375
+
1376
+ # The user will be bucketed based on 'group_id_123' instead of 'unique_user_id'
1377
+ get_flag = wingify_client.get_flag('feature_key', user_context)
1378
+ ```
1379
+
1380
+ </details>
1381
+
711
1382
  ## Local development
712
1383
 
713
1384
  ```bash