kameleoon-client-python 3.13.0__tar.gz → 3.14.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 (182) hide show
  1. {kameleoon-client-python-3.13.0/kameleoon_client_python.egg-info → kameleoon-client-python-3.14.0}/PKG-INFO +1 -1
  2. {kameleoon-client-python-3.13.0 → kameleoon-client-python-3.14.0}/kameleoon/configuration/custom_data_info.py +7 -0
  3. {kameleoon-client-python-3.13.0 → kameleoon-client-python-3.14.0}/kameleoon/configuration/data_file.py +19 -4
  4. {kameleoon-client-python-3.13.0 → kameleoon-client-python-3.14.0}/kameleoon/configuration/feature_flag.py +8 -8
  5. {kameleoon-client-python-3.13.0 → kameleoon-client-python-3.14.0}/kameleoon/configuration/rule.py +7 -10
  6. {kameleoon-client-python-3.13.0 → kameleoon-client-python-3.14.0}/kameleoon/kameleoon_client.py +29 -30
  7. {kameleoon-client-python-3.13.0 → kameleoon-client-python-3.14.0}/kameleoon/network/services/data_service_impl.py +1 -1
  8. {kameleoon-client-python-3.13.0 → kameleoon-client-python-3.14.0}/kameleoon/network/url_provider.py +1 -1
  9. {kameleoon-client-python-3.13.0 → kameleoon-client-python-3.14.0}/kameleoon/sdk_version.py +1 -1
  10. {kameleoon-client-python-3.13.0 → kameleoon-client-python-3.14.0/kameleoon_client_python.egg-info}/PKG-INFO +1 -1
  11. {kameleoon-client-python-3.13.0 → kameleoon-client-python-3.14.0}/MANIFEST.in +0 -0
  12. {kameleoon-client-python-3.13.0 → kameleoon-client-python-3.14.0}/README.md +0 -0
  13. {kameleoon-client-python-3.13.0 → kameleoon-client-python-3.14.0}/kameleoon/__init__.py +0 -0
  14. {kameleoon-client-python-3.13.0 → kameleoon-client-python-3.14.0}/kameleoon/client_readiness/__init__.py +0 -0
  15. {kameleoon-client-python-3.13.0 → kameleoon-client-python-3.14.0}/kameleoon/client_readiness/async_readiness.py +0 -0
  16. {kameleoon-client-python-3.13.0 → kameleoon-client-python-3.14.0}/kameleoon/client_readiness/threading_readiness.py +0 -0
  17. {kameleoon-client-python-3.13.0 → kameleoon-client-python-3.14.0}/kameleoon/configuration/__init__.py +0 -0
  18. {kameleoon-client-python-3.13.0 → kameleoon-client-python-3.14.0}/kameleoon/configuration/experiment.py +0 -0
  19. {kameleoon-client-python-3.13.0 → kameleoon-client-python-3.14.0}/kameleoon/configuration/me_group.py +0 -0
  20. {kameleoon-client-python-3.13.0 → kameleoon-client-python-3.14.0}/kameleoon/configuration/rule_type.py +0 -0
  21. {kameleoon-client-python-3.13.0 → kameleoon-client-python-3.14.0}/kameleoon/configuration/settings.py +0 -0
  22. {kameleoon-client-python-3.13.0 → kameleoon-client-python-3.14.0}/kameleoon/configuration/variable.py +0 -0
  23. {kameleoon-client-python-3.13.0 → kameleoon-client-python-3.14.0}/kameleoon/configuration/variation.py +0 -0
  24. {kameleoon-client-python-3.13.0 → kameleoon-client-python-3.14.0}/kameleoon/configuration/variation_by_exposition.py +0 -0
  25. {kameleoon-client-python-3.13.0 → kameleoon-client-python-3.14.0}/kameleoon/data/__init__.py +0 -0
  26. {kameleoon-client-python-3.13.0 → kameleoon-client-python-3.14.0}/kameleoon/data/browser.py +0 -0
  27. {kameleoon-client-python-3.13.0 → kameleoon-client-python-3.14.0}/kameleoon/data/cbscores.py +0 -0
  28. {kameleoon-client-python-3.13.0 → kameleoon-client-python-3.14.0}/kameleoon/data/conversion.py +0 -0
  29. {kameleoon-client-python-3.13.0 → kameleoon-client-python-3.14.0}/kameleoon/data/cookie.py +0 -0
  30. {kameleoon-client-python-3.13.0 → kameleoon-client-python-3.14.0}/kameleoon/data/custom_data.py +0 -0
  31. {kameleoon-client-python-3.13.0 → kameleoon-client-python-3.14.0}/kameleoon/data/data.py +0 -0
  32. {kameleoon-client-python-3.13.0 → kameleoon-client-python-3.14.0}/kameleoon/data/device.py +0 -0
  33. {kameleoon-client-python-3.13.0 → kameleoon-client-python-3.14.0}/kameleoon/data/geolocation.py +0 -0
  34. {kameleoon-client-python-3.13.0 → kameleoon-client-python-3.14.0}/kameleoon/data/kcs_heat.py +0 -0
  35. {kameleoon-client-python-3.13.0 → kameleoon-client-python-3.14.0}/kameleoon/data/manager/__init__.py +0 -0
  36. {kameleoon-client-python-3.13.0 → kameleoon-client-python-3.14.0}/kameleoon/data/manager/assigned_variation.py +0 -0
  37. {kameleoon-client-python-3.13.0 → kameleoon-client-python-3.14.0}/kameleoon/data/manager/forced_experiment_variation.py +0 -0
  38. {kameleoon-client-python-3.13.0 → kameleoon-client-python-3.14.0}/kameleoon/data/manager/forced_feature_variation.py +0 -0
  39. {kameleoon-client-python-3.13.0 → kameleoon-client-python-3.14.0}/kameleoon/data/manager/forced_variation.py +0 -0
  40. {kameleoon-client-python-3.13.0 → kameleoon-client-python-3.14.0}/kameleoon/data/manager/page_view_visit.py +0 -0
  41. {kameleoon-client-python-3.13.0 → kameleoon-client-python-3.14.0}/kameleoon/data/manager/visitor.py +0 -0
  42. {kameleoon-client-python-3.13.0 → kameleoon-client-python-3.14.0}/kameleoon/data/manager/visitor_manager.py +0 -0
  43. {kameleoon-client-python-3.13.0 → kameleoon-client-python-3.14.0}/kameleoon/data/manager/visitor_slot.py +0 -0
  44. {kameleoon-client-python-3.13.0 → kameleoon-client-python-3.14.0}/kameleoon/data/mapping_identifier.py +0 -0
  45. {kameleoon-client-python-3.13.0 → kameleoon-client-python-3.14.0}/kameleoon/data/operating_system.py +0 -0
  46. {kameleoon-client-python-3.13.0 → kameleoon-client-python-3.14.0}/kameleoon/data/page_view.py +0 -0
  47. {kameleoon-client-python-3.13.0 → kameleoon-client-python-3.14.0}/kameleoon/data/personalization.py +0 -0
  48. {kameleoon-client-python-3.13.0 → kameleoon-client-python-3.14.0}/kameleoon/data/unique_identifier.py +0 -0
  49. {kameleoon-client-python-3.13.0 → kameleoon-client-python-3.14.0}/kameleoon/data/user_agent.py +0 -0
  50. {kameleoon-client-python-3.13.0 → kameleoon-client-python-3.14.0}/kameleoon/data/visitor_visits.py +0 -0
  51. {kameleoon-client-python-3.13.0 → kameleoon-client-python-3.14.0}/kameleoon/defaults.py +0 -0
  52. {kameleoon-client-python-3.13.0 → kameleoon-client-python-3.14.0}/kameleoon/exceptions.py +0 -0
  53. {kameleoon-client-python-3.13.0 → kameleoon-client-python-3.14.0}/kameleoon/helpers/__init__.py +0 -0
  54. {kameleoon-client-python-3.13.0 → kameleoon-client-python-3.14.0}/kameleoon/helpers/domain.py +0 -0
  55. {kameleoon-client-python-3.13.0 → kameleoon-client-python-3.14.0}/kameleoon/helpers/functions.py +0 -0
  56. {kameleoon-client-python-3.13.0 → kameleoon-client-python-3.14.0}/kameleoon/helpers/hasher.py +0 -0
  57. {kameleoon-client-python-3.13.0 → kameleoon-client-python-3.14.0}/kameleoon/helpers/logger.py +0 -0
  58. {kameleoon-client-python-3.13.0 → kameleoon-client-python-3.14.0}/kameleoon/helpers/multi_threading.py +0 -0
  59. {kameleoon-client-python-3.13.0 → kameleoon-client-python-3.14.0}/kameleoon/helpers/nonce.py +0 -0
  60. {kameleoon-client-python-3.13.0 → kameleoon-client-python-3.14.0}/kameleoon/helpers/repeat_timer.py +0 -0
  61. {kameleoon-client-python-3.13.0 → kameleoon-client-python-3.14.0}/kameleoon/helpers/scheduler.py +0 -0
  62. {kameleoon-client-python-3.13.0 → kameleoon-client-python-3.14.0}/kameleoon/helpers/string_utils.py +0 -0
  63. {kameleoon-client-python-3.13.0 → kameleoon-client-python-3.14.0}/kameleoon/helpers/visitor_code.py +0 -0
  64. {kameleoon-client-python-3.13.0 → kameleoon-client-python-3.14.0}/kameleoon/hybrid/__init__.py +0 -0
  65. {kameleoon-client-python-3.13.0 → kameleoon-client-python-3.14.0}/kameleoon/hybrid/hybrid_manager.py +0 -0
  66. {kameleoon-client-python-3.13.0 → kameleoon-client-python-3.14.0}/kameleoon/hybrid/hybrid_manager_impl.py +0 -0
  67. {kameleoon-client-python-3.13.0 → kameleoon-client-python-3.14.0}/kameleoon/kameleoon_client_config.py +0 -0
  68. {kameleoon-client-python-3.13.0 → kameleoon-client-python-3.14.0}/kameleoon/kameleoon_client_factory.py +0 -0
  69. {kameleoon-client-python-3.13.0 → kameleoon-client-python-3.14.0}/kameleoon/logging/__init__.py +0 -0
  70. {kameleoon-client-python-3.13.0 → kameleoon-client-python-3.14.0}/kameleoon/logging/kameleoon_logger.py +0 -0
  71. {kameleoon-client-python-3.13.0 → kameleoon-client-python-3.14.0}/kameleoon/logging/log_level.py +0 -0
  72. {kameleoon-client-python-3.13.0 → kameleoon-client-python-3.14.0}/kameleoon/logging/logger.py +0 -0
  73. {kameleoon-client-python-3.13.0 → kameleoon-client-python-3.14.0}/kameleoon/managers/__init__.py +0 -0
  74. {kameleoon-client-python-3.13.0 → kameleoon-client-python-3.14.0}/kameleoon/managers/asyncexec/__init__.py +0 -0
  75. {kameleoon-client-python-3.13.0 → kameleoon-client-python-3.14.0}/kameleoon/managers/asyncexec/async_executor.py +0 -0
  76. {kameleoon-client-python-3.13.0 → kameleoon-client-python-3.14.0}/kameleoon/managers/data/__init__.py +0 -0
  77. {kameleoon-client-python-3.13.0 → kameleoon-client-python-3.14.0}/kameleoon/managers/data/data_manager.py +0 -0
  78. {kameleoon-client-python-3.13.0 → kameleoon-client-python-3.14.0}/kameleoon/managers/evaluation/__init__.py +0 -0
  79. {kameleoon-client-python-3.13.0 → kameleoon-client-python-3.14.0}/kameleoon/managers/evaluation/evaluated_experiment.py +0 -0
  80. {kameleoon-client-python-3.13.0 → kameleoon-client-python-3.14.0}/kameleoon/managers/remote_data/__init__.py +0 -0
  81. {kameleoon-client-python-3.13.0 → kameleoon-client-python-3.14.0}/kameleoon/managers/remote_data/remote_data_manager.py +0 -0
  82. {kameleoon-client-python-3.13.0 → kameleoon-client-python-3.14.0}/kameleoon/managers/remote_data/remote_visitor_data.py +0 -0
  83. {kameleoon-client-python-3.13.0 → kameleoon-client-python-3.14.0}/kameleoon/managers/tracking/__init__.py +0 -0
  84. {kameleoon-client-python-3.13.0 → kameleoon-client-python-3.14.0}/kameleoon/managers/tracking/tracking_builder.py +0 -0
  85. {kameleoon-client-python-3.13.0 → kameleoon-client-python-3.14.0}/kameleoon/managers/tracking/tracking_manager.py +0 -0
  86. {kameleoon-client-python-3.13.0 → kameleoon-client-python-3.14.0}/kameleoon/managers/tracking/visitor_tracking_registry.py +0 -0
  87. {kameleoon-client-python-3.13.0 → kameleoon-client-python-3.14.0}/kameleoon/managers/warehouse/__init__.py +0 -0
  88. {kameleoon-client-python-3.13.0 → kameleoon-client-python-3.14.0}/kameleoon/managers/warehouse/warehouse_manager.py +0 -0
  89. {kameleoon-client-python-3.13.0 → kameleoon-client-python-3.14.0}/kameleoon/middleware.py +0 -0
  90. {kameleoon-client-python-3.13.0 → kameleoon-client-python-3.14.0}/kameleoon/network/__init__.py +0 -0
  91. {kameleoon-client-python-3.13.0 → kameleoon-client-python-3.14.0}/kameleoon/network/access_token_source.py +0 -0
  92. {kameleoon-client-python-3.13.0 → kameleoon-client-python-3.14.0}/kameleoon/network/access_token_source_factory.py +0 -0
  93. {kameleoon-client-python-3.13.0 → kameleoon-client-python-3.14.0}/kameleoon/network/activity_event.py +0 -0
  94. {kameleoon-client-python-3.13.0 → kameleoon-client-python-3.14.0}/kameleoon/network/cookie/__init__.py +0 -0
  95. {kameleoon-client-python-3.13.0 → kameleoon-client-python-3.14.0}/kameleoon/network/cookie/cookie_manager.py +0 -0
  96. {kameleoon-client-python-3.13.0 → kameleoon-client-python-3.14.0}/kameleoon/network/net_provider.py +0 -0
  97. {kameleoon-client-python-3.13.0 → kameleoon-client-python-3.14.0}/kameleoon/network/net_provider_impl.py +0 -0
  98. {kameleoon-client-python-3.13.0 → kameleoon-client-python-3.14.0}/kameleoon/network/network_manager.py +0 -0
  99. {kameleoon-client-python-3.13.0 → kameleoon-client-python-3.14.0}/kameleoon/network/network_manager_factory.py +0 -0
  100. {kameleoon-client-python-3.13.0 → kameleoon-client-python-3.14.0}/kameleoon/network/network_manager_factory_impl.py +0 -0
  101. {kameleoon-client-python-3.13.0 → kameleoon-client-python-3.14.0}/kameleoon/network/network_manager_impl.py +0 -0
  102. {kameleoon-client-python-3.13.0 → kameleoon-client-python-3.14.0}/kameleoon/network/query_builder.py +0 -0
  103. {kameleoon-client-python-3.13.0 → kameleoon-client-python-3.14.0}/kameleoon/network/query_encodable.py +0 -0
  104. {kameleoon-client-python-3.13.0 → kameleoon-client-python-3.14.0}/kameleoon/network/sendable.py +0 -0
  105. {kameleoon-client-python-3.13.0 → kameleoon-client-python-3.14.0}/kameleoon/network/service_initialize_context.py +0 -0
  106. {kameleoon-client-python-3.13.0 → kameleoon-client-python-3.14.0}/kameleoon/network/service_initialize_context_impl.py +0 -0
  107. {kameleoon-client-python-3.13.0 → kameleoon-client-python-3.14.0}/kameleoon/network/services/__init__.py +0 -0
  108. {kameleoon-client-python-3.13.0 → kameleoon-client-python-3.14.0}/kameleoon/network/services/automation_service.py +0 -0
  109. {kameleoon-client-python-3.13.0 → kameleoon-client-python-3.14.0}/kameleoon/network/services/automation_service_impl.py +0 -0
  110. {kameleoon-client-python-3.13.0 → kameleoon-client-python-3.14.0}/kameleoon/network/services/configuration_service.py +0 -0
  111. {kameleoon-client-python-3.13.0 → kameleoon-client-python-3.14.0}/kameleoon/network/services/configuration_service_impl.py +0 -0
  112. {kameleoon-client-python-3.13.0 → kameleoon-client-python-3.14.0}/kameleoon/network/services/data_service.py +0 -0
  113. {kameleoon-client-python-3.13.0 → kameleoon-client-python-3.14.0}/kameleoon/network/services/service.py +0 -0
  114. {kameleoon-client-python-3.13.0 → kameleoon-client-python-3.14.0}/kameleoon/network/services/service_impl.py +0 -0
  115. {kameleoon-client-python-3.13.0 → kameleoon-client-python-3.14.0}/kameleoon/network/uri_helper.py +0 -0
  116. {kameleoon-client-python-3.13.0 → kameleoon-client-python-3.14.0}/kameleoon/real_time/__init__.py +0 -0
  117. {kameleoon-client-python-3.13.0 → kameleoon-client-python-3.14.0}/kameleoon/real_time/real_time_configuration_service.py +0 -0
  118. {kameleoon-client-python-3.13.0 → kameleoon-client-python-3.14.0}/kameleoon/real_time/real_time_event.py +0 -0
  119. {kameleoon-client-python-3.13.0 → kameleoon-client-python-3.14.0}/kameleoon/storage/__init__.py +0 -0
  120. {kameleoon-client-python-3.13.0 → kameleoon-client-python-3.14.0}/kameleoon/storage/cache.py +0 -0
  121. {kameleoon-client-python-3.13.0 → kameleoon-client-python-3.14.0}/kameleoon/storage/cache_factory.py +0 -0
  122. {kameleoon-client-python-3.13.0 → kameleoon-client-python-3.14.0}/kameleoon/storage/cache_factory_impl.py +0 -0
  123. {kameleoon-client-python-3.13.0 → kameleoon-client-python-3.14.0}/kameleoon/storage/cache_impl.py +0 -0
  124. {kameleoon-client-python-3.13.0 → kameleoon-client-python-3.14.0}/kameleoon/targeting/__init__.py +0 -0
  125. {kameleoon-client-python-3.13.0 → kameleoon-client-python-3.14.0}/kameleoon/targeting/conditions/__init__.py +0 -0
  126. {kameleoon-client-python-3.13.0 → kameleoon-client-python-3.14.0}/kameleoon/targeting/conditions/browser_condition.py +0 -0
  127. {kameleoon-client-python-3.13.0 → kameleoon-client-python-3.14.0}/kameleoon/targeting/conditions/constants.py +0 -0
  128. {kameleoon-client-python-3.13.0 → kameleoon-client-python-3.14.0}/kameleoon/targeting/conditions/conversion_condition.py +0 -0
  129. {kameleoon-client-python-3.13.0 → kameleoon-client-python-3.14.0}/kameleoon/targeting/conditions/cookie_condition.py +0 -0
  130. {kameleoon-client-python-3.13.0 → kameleoon-client-python-3.14.0}/kameleoon/targeting/conditions/custom_datum.py +0 -0
  131. {kameleoon-client-python-3.13.0 → kameleoon-client-python-3.14.0}/kameleoon/targeting/conditions/device_condition.py +0 -0
  132. {kameleoon-client-python-3.13.0 → kameleoon-client-python-3.14.0}/kameleoon/targeting/conditions/exclusive_experiment_condition.py +0 -0
  133. {kameleoon-client-python-3.13.0 → kameleoon-client-python-3.14.0}/kameleoon/targeting/conditions/geolocation_condition.py +0 -0
  134. {kameleoon-client-python-3.13.0 → kameleoon-client-python-3.14.0}/kameleoon/targeting/conditions/kcs_heat_range_condition.py +0 -0
  135. {kameleoon-client-python-3.13.0 → kameleoon-client-python-3.14.0}/kameleoon/targeting/conditions/number_condition.py +0 -0
  136. {kameleoon-client-python-3.13.0 → kameleoon-client-python-3.14.0}/kameleoon/targeting/conditions/operating_system_condition.py +0 -0
  137. {kameleoon-client-python-3.13.0 → kameleoon-client-python-3.14.0}/kameleoon/targeting/conditions/page_title_condition.py +0 -0
  138. {kameleoon-client-python-3.13.0 → kameleoon-client-python-3.14.0}/kameleoon/targeting/conditions/page_url_condition.py +0 -0
  139. {kameleoon-client-python-3.13.0 → kameleoon-client-python-3.14.0}/kameleoon/targeting/conditions/page_view_number_condition.py +0 -0
  140. {kameleoon-client-python-3.13.0 → kameleoon-client-python-3.14.0}/kameleoon/targeting/conditions/previous_page_condition.py +0 -0
  141. {kameleoon-client-python-3.13.0 → kameleoon-client-python-3.14.0}/kameleoon/targeting/conditions/sdk_language_condition.py +0 -0
  142. {kameleoon-client-python-3.13.0 → kameleoon-client-python-3.14.0}/kameleoon/targeting/conditions/segment_condition.py +0 -0
  143. {kameleoon-client-python-3.13.0 → kameleoon-client-python-3.14.0}/kameleoon/targeting/conditions/string_value_condition.py +0 -0
  144. {kameleoon-client-python-3.13.0 → kameleoon-client-python-3.14.0}/kameleoon/targeting/conditions/target_experiment_condition.py +0 -0
  145. {kameleoon-client-python-3.13.0 → kameleoon-client-python-3.14.0}/kameleoon/targeting/conditions/target_feature_flag_condition.py +0 -0
  146. {kameleoon-client-python-3.13.0 → kameleoon-client-python-3.14.0}/kameleoon/targeting/conditions/target_personalization_condition.py +0 -0
  147. {kameleoon-client-python-3.13.0 → kameleoon-client-python-3.14.0}/kameleoon/targeting/conditions/targeting_condition.py +0 -0
  148. {kameleoon-client-python-3.13.0 → kameleoon-client-python-3.14.0}/kameleoon/targeting/conditions/time_elapsed_since_visit_condition.py +0 -0
  149. {kameleoon-client-python-3.13.0 → kameleoon-client-python-3.14.0}/kameleoon/targeting/conditions/unknown_condition.py +0 -0
  150. {kameleoon-client-python-3.13.0 → kameleoon-client-python-3.14.0}/kameleoon/targeting/conditions/visit_number_today_condition.py +0 -0
  151. {kameleoon-client-python-3.13.0 → kameleoon-client-python-3.14.0}/kameleoon/targeting/conditions/visit_number_total_condition.py +0 -0
  152. {kameleoon-client-python-3.13.0 → kameleoon-client-python-3.14.0}/kameleoon/targeting/conditions/visitor_code_condition.py +0 -0
  153. {kameleoon-client-python-3.13.0 → kameleoon-client-python-3.14.0}/kameleoon/targeting/conditions/visitor_new_return_condition.py +0 -0
  154. {kameleoon-client-python-3.13.0 → kameleoon-client-python-3.14.0}/kameleoon/targeting/models.py +0 -0
  155. {kameleoon-client-python-3.13.0 → kameleoon-client-python-3.14.0}/kameleoon/targeting/targeting_manager.py +0 -0
  156. {kameleoon-client-python-3.13.0 → kameleoon-client-python-3.14.0}/kameleoon/targeting/tree_builder.py +0 -0
  157. {kameleoon-client-python-3.13.0 → kameleoon-client-python-3.14.0}/kameleoon/targeting/tree_condition_factory.py +0 -0
  158. {kameleoon-client-python-3.13.0 → kameleoon-client-python-3.14.0}/kameleoon/types/__init__.py +0 -0
  159. {kameleoon-client-python-3.13.0 → kameleoon-client-python-3.14.0}/kameleoon/types/remote_visitor_data_filter.py +0 -0
  160. {kameleoon-client-python-3.13.0 → kameleoon-client-python-3.14.0}/kameleoon/types/variable.py +0 -0
  161. {kameleoon-client-python-3.13.0 → kameleoon-client-python-3.14.0}/kameleoon/types/variation.py +0 -0
  162. {kameleoon-client-python-3.13.0 → kameleoon-client-python-3.14.0}/kameleoon_client_python.egg-info/SOURCES.txt +0 -0
  163. {kameleoon-client-python-3.13.0 → kameleoon-client-python-3.14.0}/kameleoon_client_python.egg-info/dependency_links.txt +0 -0
  164. {kameleoon-client-python-3.13.0 → kameleoon-client-python-3.14.0}/kameleoon_client_python.egg-info/requires.txt +14 -14
  165. {kameleoon-client-python-3.13.0 → kameleoon-client-python-3.14.0}/kameleoon_client_python.egg-info/top_level.txt +0 -0
  166. {kameleoon-client-python-3.13.0 → kameleoon-client-python-3.14.0}/setup.cfg +0 -0
  167. {kameleoon-client-python-3.13.0 → kameleoon-client-python-3.14.0}/setup.py +0 -0
  168. {kameleoon-client-python-3.13.0 → kameleoon-client-python-3.14.0}/tests/integration/proj/__init__.py +0 -0
  169. {kameleoon-client-python-3.13.0 → kameleoon-client-python-3.14.0}/tests/integration/proj/kameleoon_app/__init__.py +0 -0
  170. {kameleoon-client-python-3.13.0 → kameleoon-client-python-3.14.0}/tests/integration/proj/kameleoon_app/admin.py +0 -0
  171. {kameleoon-client-python-3.13.0 → kameleoon-client-python-3.14.0}/tests/integration/proj/kameleoon_app/apps.py +0 -0
  172. {kameleoon-client-python-3.13.0 → kameleoon-client-python-3.14.0}/tests/integration/proj/kameleoon_app/migrations/__init__.py +0 -0
  173. {kameleoon-client-python-3.13.0 → kameleoon-client-python-3.14.0}/tests/integration/proj/kameleoon_app/models.py +0 -0
  174. {kameleoon-client-python-3.13.0 → kameleoon-client-python-3.14.0}/tests/integration/proj/kameleoon_app/tests.py +0 -0
  175. {kameleoon-client-python-3.13.0 → kameleoon-client-python-3.14.0}/tests/integration/proj/kameleoon_app/views.py +0 -0
  176. {kameleoon-client-python-3.13.0 → kameleoon-client-python-3.14.0}/tests/integration/proj/manage.py +0 -0
  177. {kameleoon-client-python-3.13.0 → kameleoon-client-python-3.14.0}/tests/integration/proj/proj/__init__.py +0 -0
  178. {kameleoon-client-python-3.13.0 → kameleoon-client-python-3.14.0}/tests/integration/proj/proj/asgi.py +0 -0
  179. {kameleoon-client-python-3.13.0 → kameleoon-client-python-3.14.0}/tests/integration/proj/proj/settings.py +0 -0
  180. {kameleoon-client-python-3.13.0 → kameleoon-client-python-3.14.0}/tests/integration/proj/proj/urls.py +0 -0
  181. {kameleoon-client-python-3.13.0 → kameleoon-client-python-3.14.0}/tests/integration/proj/proj/wsgi.py +0 -0
  182. {kameleoon-client-python-3.13.0 → kameleoon-client-python-3.14.0}/tests/resources/config.yml +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: kameleoon-client-python
3
- Version: 3.13.0
3
+ Version: 3.14.0
4
4
  Summary: Kameleoon Client Python Software Development Kit.
5
5
  Home-page: https://developers.kameleoon.com/python-sdk.html
6
6
  Author: Kameleoon
@@ -17,6 +17,7 @@ class CustomDataInfo:
17
17
  self.__mapping_identifier_index = None
18
18
  self.__local_only = set()
19
19
  self.__visitor_scope = set()
20
+ self.__custom_data_index_by_id = {}
20
21
  if custom_data is not None:
21
22
  for data in custom_data:
22
23
  index = data.get("index")
@@ -26,6 +27,8 @@ class CustomDataInfo:
26
27
  self.__local_only.add(index)
27
28
  if data.get("scope") == self.SCOPE_VISITOR:
28
29
  self.__visitor_scope.add(index)
30
+ if (id_ := data.get("id")) is not None:
31
+ self.__custom_data_index_by_id[id_] = index
29
32
  if data.get("isMappingIdentifier"):
30
33
  if bool(self.__mapping_identifier_index is not None):
31
34
  KameleoonLogger.warning(
@@ -50,3 +53,7 @@ class CustomDataInfo:
50
53
  def mapping_identifier_index(self) -> Optional[int]:
51
54
  """Take mapping identifier index"""
52
55
  return self.__mapping_identifier_index
56
+
57
+ def get_custom_data_index_by_id(self, custom_data_id: int) -> Optional[int]:
58
+ """Get corresponding custom data id by custom data index"""
59
+ return self.__custom_data_index_by_id.get(custom_data_id)
@@ -11,6 +11,7 @@ from kameleoon.configuration.settings import Settings
11
11
  from kameleoon.configuration.variation_by_exposition import VariationByExposition
12
12
  from kameleoon.exceptions import FeatureNotFound, FeatureEnvironmentDisabled
13
13
  from kameleoon.logging.kameleoon_logger import KameleoonLogger
14
+ from kameleoon.targeting.models import Segment
14
15
 
15
16
 
16
17
  class DataFile:
@@ -28,15 +29,29 @@ class DataFile:
28
29
  ) -> "DataFile":
29
30
  """Creates new instance of `DataFile` initialized from the specified configuration JSON"""
30
31
  settings = Settings(configuration.get("configuration"))
31
- feature_flags = {
32
- (feature_flag := FeatureFlag(jobj)).feature_key: feature_flag
33
- for jobj in configuration.get("featureFlags") or []
34
- }
32
+ segments = DataFile.__parse_segments(configuration)
35
33
  custom_data_info = CustomDataInfo(configuration.get("customData"))
34
+ feature_flags = DataFile.__parse_feature_flags(configuration, segments, custom_data_info)
36
35
  holdout = Experiment.from_json(configuration["holdout"]) if "holdout" in configuration else None
37
36
  data_file = DataFile(environment, last_modified, settings, feature_flags, custom_data_info, holdout)
38
37
  return data_file
39
38
 
39
+ @staticmethod
40
+ def __parse_segments(configuration: Dict[str, Any]) -> Dict[int, Segment]:
41
+ return {
42
+ (seg := Segment(jobj)).id_: seg
43
+ for jobj in configuration.get("segments") or []
44
+ }
45
+
46
+ @staticmethod
47
+ def __parse_feature_flags(
48
+ configuration: Dict[str, Any], segments: Dict[int, Segment], cdi: CustomDataInfo
49
+ ) -> Dict[str, FeatureFlag]:
50
+ return {
51
+ (ff := FeatureFlag(jobj, segments, cdi)).feature_key: ff # pylint: disable=C0103
52
+ for jobj in configuration.get("featureFlags") or []
53
+ }
54
+
40
55
  # pylint: disable=R0913
41
56
  def __init__(
42
57
  self,
@@ -2,9 +2,11 @@
2
2
 
3
3
  from typing import Any, List, Dict, Optional
4
4
 
5
+ from kameleoon.configuration.custom_data_info import CustomDataInfo
5
6
  from kameleoon.configuration.rule import Rule
6
7
  from kameleoon.configuration.variation import Variation
7
8
  from kameleoon.helpers.string_utils import StringUtils
9
+ from kameleoon.targeting.models import Segment
8
10
 
9
11
 
10
12
  class FeatureFlag:
@@ -12,12 +14,7 @@ class FeatureFlag:
12
14
  FeatureFlag is used for operating feature flags with rules
13
15
  """
14
16
 
15
- @staticmethod
16
- def from_array(array: List[Dict[str, Any]]) -> List["FeatureFlag"]:
17
- """Create a list of FeatureFlags from the json array"""
18
- return [FeatureFlag(item) for item in array]
19
-
20
- def __init__(self, dict_json: Dict[str, Any]) -> None:
17
+ def __init__(self, dict_json: Dict[str, Any], segments: Dict[int, Segment], cdi: CustomDataInfo) -> None:
21
18
  self.id_: int = dict_json.get("id", 0)
22
19
  self.feature_key: str = dict_json.get("featureKey", "")
23
20
  self.default_variation_key: str = dict_json.get("defaultVariationKey", "")
@@ -26,7 +23,9 @@ class FeatureFlag:
26
23
  dict_json.get("variations", [])
27
24
  )
28
25
  self.environment_enabled = dict_json.get("environmentEnabled", False)
29
- self.rules: List[Rule] = Rule.from_array(dict_json.get("rules", []))
26
+ self.rules: List[Rule] = Rule.from_array(dict_json.get("rules", []), segments)
27
+ bucketing_cd_id = dict_json.get("bucketingCustomDataId")
28
+ self.bucketing_custom_data_index = cdi.get_custom_data_index_by_id(bucketing_cd_id) if bucketing_cd_id else None
30
29
 
31
30
  def get_variation(self, key: str) -> Optional[Variation]:
32
31
  """Retrun a variation for the given key"""
@@ -41,6 +40,7 @@ class FeatureFlag:
41
40
  f"variations:{StringUtils.object_to_string(self.variations)},"
42
41
  f"default_variation_key:'{self.default_variation_key}',"
43
42
  f"me_group_name:'{self.me_group_name}',"
44
- f"rules:{len(self.rules)}"
43
+ f"rules:{len(self.rules)},"
44
+ f"bucketing_custom_data_index:{self.bucketing_custom_data_index}"
45
45
  f"}}"
46
46
  )
@@ -12,12 +12,11 @@ class Rule:
12
12
  """
13
13
 
14
14
  @staticmethod
15
- def from_array(array: List[Dict[str, Any]]) -> List["Rule"]:
15
+ def from_array(array: List[Dict[str, Any]], segments: Dict[int, Segment]) -> List["Rule"]:
16
16
  """Create a list of Rules from the json array"""
17
+ return [Rule(item, segments) for item in array]
17
18
 
18
- return [Rule(item) for item in array]
19
-
20
- def __init__(self, dict_json: Dict[str, Any]):
19
+ def __init__(self, dict_json: Dict[str, Any], segments: Dict[int, Segment]) -> None:
21
20
  self.id_: int = dict_json["id"]
22
21
  self.order: int = dict_json.get("order", 0)
23
22
  type_literal: str = dict_json.get("type", "")
@@ -25,21 +24,19 @@ class Rule:
25
24
  self.exposition: float = dict_json.get("exposition", 0.0)
26
25
  self.experiment = Experiment.from_json(dict_json)
27
26
  self.respool_time: Optional[int] = dict_json.get("respoolTime", None)
28
- segment = dict_json.get("segment")
29
- self.targeting_segment: Optional[Segment] = Segment(segment) if segment else None
30
- self.segment_id: int = self.targeting_segment.id_ if self.targeting_segment else -1
27
+ segment_id = dict_json.get("segmentId")
28
+ self.segment_id: int = segment_id or -1
29
+ self.targeting_segment: Optional[Segment] = segments.get(segment_id) if segment_id else None
31
30
 
32
31
  @property
33
32
  def is_experimentation(self) -> bool:
34
33
  """Return `true` if rule is `experimentation` type"""
35
-
36
34
  return self.type == RuleType.EXPERIMENTATION
37
35
 
38
36
  @property
39
37
  def is_targeted_delivery(self) -> bool:
40
38
  """Return `true` if rule is `targeted delivery` type"""
41
-
42
39
  return self.type == RuleType.TARGETED_DELIVERY
43
40
 
44
- def __str__(self):
41
+ def __str__(self) -> str:
45
42
  return f"Rule{{id:{self.id_}}}"
@@ -674,7 +674,7 @@ class KameleoonClient:
674
674
  if forced_variation:
675
675
  eval_exp = EvaluatedExperiment.from_forced_variation(forced_variation)
676
676
  elif self.__is_visitor_not_in_holdout(
677
- visitor, visitor_code, track, save
677
+ visitor, visitor_code, track, save, feature_flag.bucketing_custom_data_index
678
678
  ) and self.__is_ff_unrestricted_by_me_group(visitor, visitor_code, feature_flag):
679
679
  eval_exp = self.__calculate_variation_rule_for_feature(visitor_code, feature_flag)
680
680
  if save and not (forced_variation and forced_variation.simulated):
@@ -703,7 +703,7 @@ class KameleoonClient:
703
703
  unrestricted = True
704
704
  me_group = self._data_manager.data_file.me_groups.get(feature_flag.me_group_name)
705
705
  if me_group:
706
- code_for_hash = self.__get_code_for_hash(visitor, visitor_code)
706
+ code_for_hash = self.__get_code_for_hash(visitor, visitor_code, feature_flag.bucketing_custom_data_index)
707
707
  me_group_hash = Hasher.obtain_hash_for_me_group(code_for_hash, feature_flag.me_group_name)
708
708
  KameleoonLogger.debug(
709
709
  "Calculated ME group hash %s for code: %s, meGroup: %s",
@@ -722,20 +722,18 @@ class KameleoonClient:
722
722
  return unrestricted
723
723
 
724
724
  def __is_visitor_not_in_holdout(
725
- self, visitor: Optional[Visitor], visitor_code: str, track: bool, save: bool
725
+ self, visitor: Optional[Visitor], visitor_code: str, track: bool, save: bool, bucketing_cd_index: Optional[int]
726
726
  ) -> bool:
727
727
  holdout = self._data_manager.data_file.holdout
728
728
  if holdout is None:
729
729
  return True
730
730
  in_holdout_variation_key = "in-holdout"
731
731
  KameleoonLogger.debug(
732
- "CALL: KameleoonClient.__is_visitor_not_in_holdout(visitor, visitor_code: %s, track: %s, save: %s)",
733
- visitor_code,
734
- track,
735
- save,
732
+ "CALL: KameleoonClient.__is_visitor_not_in_holdout(visitor, visitor_code: %s, track: %s, save: %s, "
733
+ "bucketing_cd_index: %s)", visitor_code, track, save, bucketing_cd_index
736
734
  )
737
735
  is_not_in_holdout = True
738
- code_for_hash = self.__get_code_for_hash(visitor, visitor_code)
736
+ code_for_hash = self.__get_code_for_hash(visitor, visitor_code, bucketing_cd_index)
739
737
  variation_hash = Hasher.obtain(code_for_hash, holdout.id_)
740
738
  KameleoonLogger.debug("Calculated holdout hash %s for code %s", variation_hash, code_for_hash)
741
739
  var_by_exp = holdout.get_variation(variation_hash)
@@ -745,12 +743,9 @@ class KameleoonClient:
745
743
  eval_exp = EvaluatedExperiment(var_by_exp, holdout, RuleType.EXPERIMENTATION)
746
744
  self.__save_variation(visitor_code, eval_exp)
747
745
  KameleoonLogger.debug(
748
- "RETURN: KameleoonClient.__is_visitor_not_in_holdout(visitor, visitor_code: %s, track: %s, save: %s)"
749
- " -> (is_not_in_holdout: %s)",
750
- visitor_code,
751
- track,
752
- save,
753
- is_not_in_holdout,
746
+ "RETURN: KameleoonClient.__is_visitor_not_in_holdout(visitor, visitor_code: %s, track: %s, save: %s, "
747
+ "bucketing_cd_index: %s) -> (is_not_in_holdout: %s)",
748
+ visitor_code, track, save, bucketing_cd_index, is_not_in_holdout
754
749
  )
755
750
  return is_not_in_holdout
756
751
 
@@ -1601,21 +1596,25 @@ class KameleoonClient:
1601
1596
  )
1602
1597
 
1603
1598
  @staticmethod
1604
- def __get_code_for_hash(visitor: Optional[Visitor], visitor_code: str) -> str:
1605
- # use mapping_identifier instead of visitor_code if it was set up
1606
- return (
1607
- visitor.mapping_identifier
1608
- if visitor is not None and visitor.mapping_identifier is not None
1609
- else visitor_code
1610
- )
1599
+ def __get_code_for_hash(visitor: Optional[Visitor], visitor_code: str, bucketing_cd_index: Optional[int]) -> str:
1600
+ if visitor is None:
1601
+ return visitor_code
1602
+ # 1. Try to use the bucketing custom data's value if bucketingCustomDataId is defined
1603
+ if bucketing_cd_index:
1604
+ bucketing_custom_data = visitor.custom_data.get(bucketing_cd_index)
1605
+ if bucketing_custom_data and (len(bucketing_custom_data.values) > 0):
1606
+ return bucketing_custom_data.values[0]
1607
+ # 2. Use mappingIdentifier instead of visitorCode if it was set up
1608
+ return visitor.mapping_identifier or visitor_code
1611
1609
 
1612
1610
  def __evaluate_cbscores(
1613
- self, visitor: Optional[Visitor], visitor_code: str, rule: Rule
1611
+ self, visitor: Optional[Visitor], visitor_code: str, rule: Rule, bucketing_cd_index: Optional[int]
1614
1612
  ) -> Optional[EvaluatedExperiment]:
1615
1613
  if (visitor is None) or (visitor.cbscores is None):
1616
1614
  return None
1617
1615
  KameleoonLogger.debug(
1618
- "CALL: KameleoonClient.__evaluate_cbscores(visitor, visitor_code: %s, rule: %s)", visitor_code, rule
1616
+ "CALL: KameleoonClient.__evaluate_cbscores(visitor, visitor_code: %s, rule: %s, bucketing_cd_index: %s)",
1617
+ visitor_code, rule, bucketing_cd_index
1619
1618
  )
1620
1619
  eval_exp = None
1621
1620
  var_id_group_by_scores = visitor.cbscores.values.get(rule.experiment.id_)
@@ -1633,16 +1632,14 @@ class KameleoonClient:
1633
1632
  size = len(var_by_exp_in_cbs)
1634
1633
  idx = 0
1635
1634
  if size > 1:
1636
- code_for_hash = self.__get_code_for_hash(visitor, visitor_code)
1635
+ code_for_hash = self.__get_code_for_hash(visitor, visitor_code, bucketing_cd_index)
1637
1636
  variation_hash = Hasher.obtain(code_for_hash, rule.experiment.id_, rule.respool_time)
1638
1637
  KameleoonLogger.debug("Calculated CBS hash %s for code %s", variation_hash, code_for_hash)
1639
1638
  idx = min(int(variation_hash * size), size - 1)
1640
1639
  eval_exp = EvaluatedExperiment.from_var_by_exp_rule(var_by_exp_in_cbs[idx], rule)
1641
1640
  KameleoonLogger.debug(
1642
- "RETURN: KameleoonClient.__evaluate_cbscores(visitor, visitor_code: %s, rule: %s) -> (eval_exp: %s)",
1643
- visitor_code,
1644
- rule,
1645
- eval_exp,
1641
+ "RETURN: KameleoonClient.__evaluate_cbscores(visitor, visitor_code: %s, rule: %s, bucketing_cd_index: %s)"
1642
+ " -> (eval_exp: %s)", visitor_code, rule, bucketing_cd_index, eval_exp
1646
1643
  )
1647
1644
  return eval_exp
1648
1645
 
@@ -1656,7 +1653,7 @@ class KameleoonClient:
1656
1653
  feature_flag,
1657
1654
  )
1658
1655
  visitor = self._visitor_manager.get_visitor(visitor_code)
1659
- code_for_hash = self.__get_code_for_hash(visitor, visitor_code)
1656
+ code_for_hash = self.__get_code_for_hash(visitor, visitor_code, feature_flag.bucketing_custom_data_index)
1660
1657
  eval_exp = None
1661
1658
  for rule in feature_flag.rules:
1662
1659
  forced_variation = visitor.get_forced_experiment_variation(rule.experiment.id_) if visitor else None
@@ -1676,7 +1673,9 @@ class KameleoonClient:
1676
1673
  KameleoonLogger.debug("Calculated rule hash %s for code %s", hash_rule, code_for_hash)
1677
1674
  # check main expostion for rule with hashRule
1678
1675
  if hash_rule <= rule.exposition:
1679
- eval_exp = self.__evaluate_cbscores(visitor, visitor_code, rule)
1676
+ eval_exp = self.__evaluate_cbscores(
1677
+ visitor, visitor_code, rule, feature_flag.bucketing_custom_data_index
1678
+ )
1680
1679
  if eval_exp:
1681
1680
  break
1682
1681
  if rule.is_targeted_delivery:
@@ -23,7 +23,7 @@ class DataServiceImpl(DataService, ServiceImpl):
23
23
  if timeout is None:
24
24
  timeout = self.network_manager.call_timeout
25
25
  url = self.network_manager.url_provider.make_tracking_url()
26
- request = Request(HttpMethod.POST, url, timeout, body=lines)
26
+ request = Request(HttpMethod.POST, url, timeout, body=lines, headers={"Content-Type": "*/*"})
27
27
  response = self._make_call(
28
28
  request, True, self.NUMBER_OF_RECONNECTION_ON_FAILURE_UNCRITICAL, self._TRACKING_CALL_RETRY_DELAY
29
29
  )
@@ -14,7 +14,7 @@ class UrlProvider:
14
14
  _EXPERIMENTS_CONFIGURATIONS_PATH = "/visit/experimentsConfigurations"
15
15
  _GET_DATA_PATH = "/map/map"
16
16
  _POST_DATA_PATH = "/map/maps"
17
- _CONFIGURATION_API_URL_FORMAT = "https://{0}/{1}"
17
+ _CONFIGURATION_API_URL_FORMAT = "https://{0}/v3/{1}"
18
18
  _RT_CONFIGURATION_URL_FORMAT = "https://{0}:8110/sse?{1}"
19
19
  _ACCESS_TOKEN_URL_FORMAT = "https://{0}/oauth/token"
20
20
  _DATA_API_URL_FORMAT = "https://{0}{1}?{2}"
@@ -4,7 +4,7 @@ from typing import Optional, Tuple
4
4
 
5
5
  from kameleoon.logging.kameleoon_logger import KameleoonLogger
6
6
 
7
- version_info = (3, 13, 0)
7
+ version_info = (3, 14, 0)
8
8
  __version__ = ".".join(str(v) for v in version_info) # uses in scripts
9
9
 
10
10
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: kameleoon-client-python
3
- Version: 3.13.0
3
+ Version: 3.14.0
4
4
  Summary: Kameleoon Client Python Software Development Kit.
5
5
  Home-page: https://developers.kameleoon.com/python-sdk.html
6
6
  Author: Kameleoon
@@ -4,24 +4,24 @@ sseclient-py<1.9.0,>=1.7.0
4
4
  aiohttp<4.0.0,>=3.8.0
5
5
 
6
6
  [test]
7
- pytest-asyncio==0.21.*
8
- pylint==2.12.*
9
- flake8==4.0.1
10
- aioresponses==0.7.*
11
- types-python-dateutil==2.8.2
12
- mypy==0.991
13
- sseclient-py<1.9.0,>=1.7.0
14
- types-PyYAML==5.4.3
15
7
  twine==3.4.1
16
8
  Django==3.2.4
17
- freezegun==1.1.0
18
9
  requests<3.0.0,>=2.25
10
+ types-requests==2.25.0
11
+ flake8==4.0.1
12
+ sseclient-py<1.9.0,>=1.7.0
13
+ pytest-django==4.4.0
14
+ pyyaml<6.1.0,>=5.4.0
15
+ pytest-asyncio==0.21.*
16
+ types-python-dateutil==2.8.2
17
+ aioresponses==0.7.*
18
+ pylint==2.12.*
19
+ pytest-cov==2.12.1
20
+ types-PyYAML==5.4.3
19
21
  wheel==0.36.2
20
- aiohttp<4.0.0,>=3.8.0
21
22
  pytest-pythonpath==0.7.3
22
23
  Werkzeug==2.0.1
23
24
  pytest-ordering==0.6
24
- pytest-cov==2.12.1
25
- types-requests==2.25.0
26
- pytest-django==4.4.0
27
- pyyaml<6.1.0,>=5.4.0
25
+ freezegun==1.1.0
26
+ mypy==0.991
27
+ aiohttp<4.0.0,>=3.8.0