kameleoon-client-python 3.11.0__tar.gz → 3.12.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 (183) hide show
  1. {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/PKG-INFO +1 -1
  2. {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/data/data.py +1 -0
  3. {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/data/manager/visitor.py +18 -1
  4. kameleoon-client-python-3.12.0/kameleoon/data/personalization.py +30 -0
  5. {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/managers/remote_data/remote_visitor_data.py +24 -7
  6. {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/network/query_builder.py +1 -0
  7. {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/network/url_provider.py +1 -0
  8. {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/sdk_version.py +1 -1
  9. kameleoon-client-python-3.12.0/kameleoon/targeting/conditions/exclusive_experiment_condition.py +55 -0
  10. kameleoon-client-python-3.12.0/kameleoon/targeting/conditions/target_experiment_condition.py +35 -0
  11. kameleoon-client-python-3.12.0/kameleoon/targeting/conditions/target_personalization_condition.py +23 -0
  12. {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/targeting/conditions/targeting_condition.py +3 -0
  13. {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/targeting/targeting_manager.py +13 -0
  14. {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/targeting/tree_condition_factory.py +12 -0
  15. {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/types/remote_visitor_data_filter.py +9 -1
  16. {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon_client_python.egg-info/PKG-INFO +1 -1
  17. {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon_client_python.egg-info/SOURCES.txt +4 -0
  18. {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/MANIFEST.in +0 -0
  19. {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/README.md +0 -0
  20. {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/__init__.py +0 -0
  21. {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/client_readiness/__init__.py +0 -0
  22. {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/client_readiness/async_readiness.py +0 -0
  23. {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/client_readiness/threading_readiness.py +0 -0
  24. {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/configuration/__init__.py +0 -0
  25. {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/configuration/custom_data_info.py +0 -0
  26. {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/configuration/data_file.py +0 -0
  27. {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/configuration/experiment.py +0 -0
  28. {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/configuration/feature_flag.py +0 -0
  29. {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/configuration/me_group.py +0 -0
  30. {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/configuration/rule.py +0 -0
  31. {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/configuration/rule_type.py +0 -0
  32. {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/configuration/settings.py +0 -0
  33. {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/configuration/variable.py +0 -0
  34. {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/configuration/variation.py +0 -0
  35. {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/configuration/variation_by_exposition.py +0 -0
  36. {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/data/__init__.py +0 -0
  37. {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/data/browser.py +0 -0
  38. {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/data/cbscores.py +0 -0
  39. {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/data/conversion.py +0 -0
  40. {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/data/cookie.py +0 -0
  41. {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/data/custom_data.py +0 -0
  42. {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/data/device.py +0 -0
  43. {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/data/geolocation.py +0 -0
  44. {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/data/kcs_heat.py +0 -0
  45. {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/data/manager/__init__.py +0 -0
  46. {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/data/manager/assigned_variation.py +0 -0
  47. {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/data/manager/forced_experiment_variation.py +0 -0
  48. {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/data/manager/forced_feature_variation.py +0 -0
  49. {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/data/manager/forced_variation.py +0 -0
  50. {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/data/manager/page_view_visit.py +0 -0
  51. {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/data/manager/visitor_manager.py +0 -0
  52. {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/data/manager/visitor_slot.py +0 -0
  53. {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/data/mapping_identifier.py +0 -0
  54. {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/data/operating_system.py +0 -0
  55. {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/data/page_view.py +0 -0
  56. {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/data/unique_identifier.py +0 -0
  57. {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/data/user_agent.py +0 -0
  58. {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/data/visitor_visits.py +0 -0
  59. {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/defaults.py +0 -0
  60. {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/exceptions.py +0 -0
  61. {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/helpers/__init__.py +0 -0
  62. {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/helpers/domain.py +0 -0
  63. {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/helpers/functions.py +0 -0
  64. {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/helpers/hasher.py +0 -0
  65. {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/helpers/logger.py +0 -0
  66. {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/helpers/multi_threading.py +0 -0
  67. {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/helpers/nonce.py +0 -0
  68. {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/helpers/repeat_timer.py +0 -0
  69. {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/helpers/scheduler.py +0 -0
  70. {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/helpers/string_utils.py +0 -0
  71. {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/helpers/visitor_code.py +0 -0
  72. {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/hybrid/__init__.py +0 -0
  73. {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/hybrid/hybrid_manager.py +0 -0
  74. {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/hybrid/hybrid_manager_impl.py +0 -0
  75. {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/kameleoon_client.py +0 -0
  76. {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/kameleoon_client_config.py +0 -0
  77. {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/kameleoon_client_factory.py +0 -0
  78. {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/logging/__init__.py +0 -0
  79. {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/logging/kameleoon_logger.py +0 -0
  80. {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/logging/log_level.py +0 -0
  81. {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/logging/logger.py +0 -0
  82. {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/managers/__init__.py +0 -0
  83. {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/managers/asyncexec/__init__.py +0 -0
  84. {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/managers/asyncexec/async_executor.py +0 -0
  85. {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/managers/data/__init__.py +0 -0
  86. {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/managers/data/data_manager.py +0 -0
  87. {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/managers/evaluation/__init__.py +0 -0
  88. {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/managers/evaluation/evaluated_experiment.py +0 -0
  89. {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/managers/remote_data/__init__.py +0 -0
  90. {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/managers/remote_data/remote_data_manager.py +0 -0
  91. {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/managers/tracking/__init__.py +0 -0
  92. {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/managers/tracking/tracking_builder.py +0 -0
  93. {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/managers/tracking/tracking_manager.py +0 -0
  94. {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/managers/tracking/visitor_tracking_registry.py +0 -0
  95. {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/managers/warehouse/__init__.py +0 -0
  96. {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/managers/warehouse/warehouse_manager.py +0 -0
  97. {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/middleware.py +0 -0
  98. {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/network/__init__.py +0 -0
  99. {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/network/access_token_source.py +0 -0
  100. {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/network/access_token_source_factory.py +0 -0
  101. {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/network/activity_event.py +0 -0
  102. {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/network/cookie/__init__.py +0 -0
  103. {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/network/cookie/cookie_manager.py +0 -0
  104. {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/network/net_provider.py +0 -0
  105. {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/network/net_provider_impl.py +0 -0
  106. {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/network/network_manager.py +0 -0
  107. {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/network/network_manager_factory.py +0 -0
  108. {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/network/network_manager_factory_impl.py +0 -0
  109. {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/network/network_manager_impl.py +0 -0
  110. {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/network/query_encodable.py +0 -0
  111. {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/network/sendable.py +0 -0
  112. {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/network/service_initialize_context.py +0 -0
  113. {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/network/service_initialize_context_impl.py +0 -0
  114. {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/network/services/__init__.py +0 -0
  115. {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/network/services/automation_service.py +0 -0
  116. {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/network/services/automation_service_impl.py +0 -0
  117. {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/network/services/configuration_service.py +0 -0
  118. {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/network/services/configuration_service_impl.py +0 -0
  119. {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/network/services/data_service.py +0 -0
  120. {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/network/services/data_service_impl.py +0 -0
  121. {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/network/services/service.py +0 -0
  122. {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/network/services/service_impl.py +0 -0
  123. {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/network/uri_helper.py +0 -0
  124. {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/real_time/__init__.py +0 -0
  125. {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/real_time/real_time_configuration_service.py +0 -0
  126. {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/real_time/real_time_event.py +0 -0
  127. {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/storage/__init__.py +0 -0
  128. {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/storage/cache.py +0 -0
  129. {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/storage/cache_factory.py +0 -0
  130. {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/storage/cache_factory_impl.py +0 -0
  131. {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/storage/cache_impl.py +0 -0
  132. {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/targeting/__init__.py +0 -0
  133. {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/targeting/conditions/__init__.py +0 -0
  134. {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/targeting/conditions/browser_condition.py +0 -0
  135. {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/targeting/conditions/constants.py +0 -0
  136. {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/targeting/conditions/conversion_condition.py +0 -0
  137. {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/targeting/conditions/cookie_condition.py +0 -0
  138. {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/targeting/conditions/custom_datum.py +0 -0
  139. {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/targeting/conditions/device_condition.py +0 -0
  140. {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/targeting/conditions/exclusive_feature_flag_condition.py +0 -0
  141. {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/targeting/conditions/geolocation_condition.py +0 -0
  142. {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/targeting/conditions/kcs_heat_range_condition.py +0 -0
  143. {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/targeting/conditions/number_condition.py +0 -0
  144. {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/targeting/conditions/operating_system_condition.py +0 -0
  145. {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/targeting/conditions/page_title_condition.py +0 -0
  146. {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/targeting/conditions/page_url_condition.py +0 -0
  147. {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/targeting/conditions/page_view_number_condition.py +0 -0
  148. {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/targeting/conditions/previous_page_condition.py +0 -0
  149. {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/targeting/conditions/sdk_language_condition.py +0 -0
  150. {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/targeting/conditions/segment_condition.py +0 -0
  151. {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/targeting/conditions/string_value_condition.py +0 -0
  152. {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/targeting/conditions/target_feature_flag_condition.py +0 -0
  153. {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/targeting/conditions/time_elapsed_since_visit_condition.py +0 -0
  154. {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/targeting/conditions/unknown_condition.py +0 -0
  155. {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/targeting/conditions/visit_number_today_condition.py +0 -0
  156. {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/targeting/conditions/visit_number_total_condition.py +0 -0
  157. {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/targeting/conditions/visitor_code_condition.py +0 -0
  158. {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/targeting/conditions/visitor_new_return_condition.py +0 -0
  159. {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/targeting/models.py +0 -0
  160. {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/targeting/tree_builder.py +0 -0
  161. {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/types/__init__.py +0 -0
  162. {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/types/variable.py +0 -0
  163. {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/types/variation.py +0 -0
  164. {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon_client_python.egg-info/dependency_links.txt +0 -0
  165. {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon_client_python.egg-info/requires.txt +12 -12
  166. {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon_client_python.egg-info/top_level.txt +0 -0
  167. {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/setup.cfg +0 -0
  168. {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/setup.py +0 -0
  169. {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/tests/integration/proj/__init__.py +0 -0
  170. {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/tests/integration/proj/kameleoon_app/__init__.py +0 -0
  171. {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/tests/integration/proj/kameleoon_app/admin.py +0 -0
  172. {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/tests/integration/proj/kameleoon_app/apps.py +0 -0
  173. {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/tests/integration/proj/kameleoon_app/migrations/__init__.py +0 -0
  174. {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/tests/integration/proj/kameleoon_app/models.py +0 -0
  175. {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/tests/integration/proj/kameleoon_app/tests.py +0 -0
  176. {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/tests/integration/proj/kameleoon_app/views.py +0 -0
  177. {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/tests/integration/proj/manage.py +0 -0
  178. {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/tests/integration/proj/proj/__init__.py +0 -0
  179. {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/tests/integration/proj/proj/asgi.py +0 -0
  180. {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/tests/integration/proj/proj/settings.py +0 -0
  181. {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/tests/integration/proj/proj/urls.py +0 -0
  182. {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/tests/integration/proj/proj/wsgi.py +0 -0
  183. {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.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.11.0
3
+ Version: 3.12.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
@@ -23,6 +23,7 @@ class DataType(IntEnum):
23
23
  FORCED_EXPERIMENT_VARIATION = 14
24
24
  FORCED_FEATURE_VARIATION = 15
25
25
  CBS = 16
26
+ PERSONALIZATION = 17
26
27
 
27
28
 
28
29
  class BaseData:
@@ -15,6 +15,7 @@ from kameleoon.data.kcs_heat import KcsHeat
15
15
  from kameleoon.data.mapping_identifier import MappingIdentifier
16
16
  from kameleoon.data.operating_system import OperatingSystem
17
17
  from kameleoon.data.page_view import PageView
18
+ from kameleoon.data.personalization import Personalization
18
19
  from kameleoon.data.unique_identifier import UniqueIdentifier
19
20
  from kameleoon.data.user_agent import UserAgent
20
21
  from kameleoon.data.manager.assigned_variation import AssignedVariation
@@ -127,6 +128,13 @@ class Visitor: # pylint: disable=R0904
127
128
  KameleoonLogger.debug('CALL/RETURN: Visitor.variations -> (variations: %s)', variations)
128
129
  return variations
129
130
 
131
+ @property
132
+ def personalizations(self) -> Dict[int, Personalization]:
133
+ """Returns the personalizations associated with this Visitor."""
134
+ personalizations = EMPTY_DICT if self._data.personalizations is None else self._data.personalizations.copy()
135
+ KameleoonLogger.debug('CALL/RETURN: Visitor.personalizations -> (personalizations: %s)', personalizations)
136
+ return personalizations
137
+
130
138
  def get_forced_feature_variation(self, feature_key: str) -> Optional[ForcedFeatureVariation]:
131
139
  """
132
140
  Returns an associated forced feature variation by its feature key if it is present.
@@ -266,6 +274,7 @@ class Visitor: # pylint: disable=R0904
266
274
  self.page_view_visits: Optional[Dict[str, PageViewVisit]] = None
267
275
  self.conversions: Optional[List[Conversion]] = None
268
276
  self.variations: Optional[Dict[int, AssignedVariation]] = None
277
+ self.personalizations: Optional[Dict[int, Personalization]] = None
269
278
  self.forced_variations: Optional[Dict[int, ForcedExperimentVariation]] = None
270
279
  self.simulated_variations: Optional[Dict[str, ForcedFeatureVariation]] = None
271
280
  self.kcs_heat: Optional[KcsHeat] = None
@@ -343,9 +352,16 @@ class Visitor: # pylint: disable=R0904
343
352
  variation = cast(AssignedVariation, context.data)
344
353
  if self._data.variations is None:
345
354
  self._data.variations = {}
346
- if context.overwrite or variation.experiment_id not in self.variations:
355
+ if context.overwrite or variation.experiment_id not in self._data.variations:
347
356
  self._data.variations[variation.experiment_id] = variation
348
357
 
358
+ def _add_personalization(self, context: DataAddingContext) -> None:
359
+ personalization = cast(Personalization, context.data)
360
+ if self._data.personalizations is None:
361
+ self._data.personalizations = {}
362
+ if context.overwrite or personalization.id not in self._data.personalizations:
363
+ self._data.personalizations[personalization.id] = personalization
364
+
349
365
  def _add_forced_feature_variation(self, context: DataAddingContext) -> None:
350
366
  ffv = cast(ForcedFeatureVariation, context.data)
351
367
  if self._data.simulated_variations is None:
@@ -441,6 +457,7 @@ class Visitor: # pylint: disable=R0904
441
457
  CBScores: _set_cbscores,
442
458
  VisitorVisits: _set_visitor_visits,
443
459
  AssignedVariation: _add_variation,
460
+ Personalization: _add_personalization,
444
461
  ForcedFeatureVariation: _add_forced_feature_variation,
445
462
  ForcedExperimentVariation: _add_forced_experiment_variation,
446
463
  UniqueIdentifier: _set_is_unique_identifier,
@@ -0,0 +1,30 @@
1
+ """Personalization"""
2
+
3
+ from kameleoon.data import DataType
4
+ from kameleoon.data.data import BaseData
5
+
6
+
7
+ class Personalization(BaseData):
8
+ """Personalization"""
9
+
10
+ def __init__(self, id_: int, variation_id: int) -> None:
11
+ super().__init__()
12
+ self.__id = id_
13
+ self.__variation_id = variation_id
14
+
15
+ @property
16
+ def id(self) -> int: # pylint: disable=C0103
17
+ """Returns personalization ID"""
18
+ return self.__id
19
+
20
+ @property
21
+ def variation_id(self) -> int:
22
+ """Returns variation ID"""
23
+ return self.__variation_id
24
+
25
+ @property
26
+ def data_type(self) -> DataType:
27
+ return DataType.PERSONALIZATION
28
+
29
+ def __str__(self):
30
+ return f"Personalization{{id:{self.__id},variation_id:{self.__variation_id}}}"
@@ -12,6 +12,7 @@ from kameleoon.configuration.rule_type import RuleType
12
12
  from kameleoon.data.visitor_visits import VisitorVisits
13
13
  from kameleoon.data.kcs_heat import KcsHeat
14
14
  from kameleoon.data.cbscores import CBScores, ScoredVarId
15
+ from kameleoon.data.personalization import Personalization
15
16
  from kameleoon.data.manager.assigned_variation import AssignedVariation
16
17
  from kameleoon.data.manager.page_view_visit import PageViewVisit
17
18
  from kameleoon.data import (
@@ -40,6 +41,7 @@ class RemoteVisitorData:
40
41
  self.__page_view_visits: Optional[Dict[str, PageViewVisit]] = None
41
42
  self.__custom_data_dict: Optional[Dict[int, CustomData]] = None
42
43
  self.__experiments: Optional[Dict[int, AssignedVariation]] = None
44
+ self.__personalizations: Optional[Dict[int, Personalization]] = None
43
45
  self.__conversions: Optional[List[Conversion]] = None
44
46
  self.__previous_visitor_visits: Optional[VisitorVisits] = None
45
47
  self.__visitor_code: Optional[str] = None
@@ -71,6 +73,8 @@ class RemoteVisitorData:
71
73
  data_to_add += self.__page_view_visits.values()
72
74
  if self.__experiments:
73
75
  data_to_add += self.__experiments.values()
76
+ if self.__personalizations:
77
+ data_to_add += self.__personalizations.values()
74
78
  if self.__conversions:
75
79
  data_to_add += self.__conversions
76
80
  data_to_add += self.__single_data()
@@ -134,6 +138,9 @@ class RemoteVisitorData:
134
138
  static_data_event = json_visit.get("staticDataEvent")
135
139
  if static_data_event:
136
140
  self.__parse_static_data(static_data_event)
141
+ personalization_events = json_visit.get("personalizationEvents")
142
+ if personalization_events:
143
+ self.__parse_personalizations(personalization_events)
137
144
 
138
145
  def __parse_custom_data(self, custom_data_events: List[Dict[str, Any]]) -> None:
139
146
  if self.__custom_data_dict is None:
@@ -214,17 +221,27 @@ class RemoteVisitorData:
214
221
  if operating_system_type is not None:
215
222
  self.__operating_system = OperatingSystem(operating_system_type)
216
223
 
217
- def __single_data(self) -> List[Data]:
218
- objects: List[Data] = []
224
+ def __parse_personalizations(self, personalization_events: List[Dict[str, Any]]) -> None:
225
+ if self.__personalizations is None:
226
+ self.__personalizations = {}
227
+ for personalization_event in reversed(personalization_events):
228
+ data = personalization_event.get("data")
229
+ if data is not None:
230
+ index = data.get("id")
231
+ variation_id = data.get("variationId")
232
+ if index is not None and variation_id is not None:
233
+ if index not in self.__personalizations:
234
+ self.__personalizations[index] = Personalization(index, variation_id)
235
+
236
+ def __single_data(self) -> Iterable[Data]:
219
237
  if self.__device:
220
- objects.append(self.__device)
238
+ yield self.__device
221
239
  if self.__browser:
222
- objects.append(self.__browser)
240
+ yield self.__browser
223
241
  if self.__operating_system:
224
- objects.append(self.__operating_system)
242
+ yield self.__operating_system
225
243
  if self.__geolocation:
226
- objects.append(self.__geolocation)
227
- return objects
244
+ yield self.__geolocation
228
245
 
229
246
  @staticmethod
230
247
  def __parse_kcs_heat(kcs: Optional[Any]) -> Optional[KcsHeat]:
@@ -29,6 +29,7 @@ class QueryParams(str, Enum):
29
29
  NEGATIVE = "negative"
30
30
  NONCE = "nonce"
31
31
  OVERWRITE = "overwrite"
32
+ PERSONALIZATION = "personalization"
32
33
  REFERRERS_INDICES = "referrersIndices"
33
34
  REVENUE = "revenue"
34
35
  SDK_NAME = "sdkName"
@@ -99,6 +99,7 @@ class UrlProvider:
99
99
  QueryParams.STATIC_DATA,
100
100
  data_filter.device or data_filter.browser or data_filter.operating_system,
101
101
  )
102
+ self.__add_flag_param_if_required(query_builder, QueryParams.PERSONALIZATION, data_filter.personalization)
102
103
  self.__add_flag_param_if_required(query_builder, QueryParams.CBS, data_filter.cbs)
103
104
  return self._DATA_API_URL_FORMAT.format(self._data_api_domain, self._VISITOR_DATA_PATH, str(query_builder))
104
105
 
@@ -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, 11, 0)
7
+ version_info = (3, 12, 0)
8
8
  __version__ = ".".join(str(v) for v in version_info) # uses in scripts
9
9
 
10
10
 
@@ -0,0 +1,55 @@
1
+ """Exclusive experiment condition"""
2
+
3
+ from typing import Any, Union, Dict
4
+ from kameleoon.logging.kameleoon_logger import KameleoonLogger
5
+ from kameleoon.data.personalization import Personalization
6
+ from kameleoon.data.manager.assigned_variation import AssignedVariation
7
+ from kameleoon.targeting.conditions.targeting_condition import TargetingCondition
8
+
9
+
10
+ class ExclusiveExperimentCondition(TargetingCondition):
11
+ """Exclusive experiment condition"""
12
+
13
+ # pylint: disable=R0903
14
+ class TargetingData:
15
+ """Represents targeting data for ExclusiveExperimentCondition"""
16
+
17
+ def __init__(
18
+ self,
19
+ current_experiment_id: int,
20
+ variations: Dict[int, AssignedVariation],
21
+ personalizations: Dict[int, Personalization],
22
+ ) -> None:
23
+ self.current_experiment_id = current_experiment_id
24
+ self.variations = variations
25
+ self.personalizations = personalizations
26
+
27
+ # pylint: disable=R0903
28
+ class CampaignType:
29
+ """Aggregates campaign types"""
30
+ EXPERIMENT = "EXPERIMENT"
31
+ PERSONALIZATION = "PERSONALIZATION"
32
+ ANY = "ANY"
33
+
34
+ def __init__(self, json_condition: Dict[str, Union[str, int, Any]]) -> None:
35
+ super().__init__(json_condition)
36
+ self.__campaign_type = json_condition.get("campaignType")
37
+
38
+ def check(self, data: TargetingData) -> bool:
39
+ if self.__campaign_type == self.CampaignType.EXPERIMENT:
40
+ return self.__check_experiment(data)
41
+ if self.__campaign_type == self.CampaignType.PERSONALIZATION:
42
+ return self.__check_personalization(data)
43
+ if self.__campaign_type == self.CampaignType.ANY:
44
+ return self.__check_personalization(data) and self.__check_experiment(data)
45
+ KameleoonLogger.error("Unexpected campaign type for %s condition: %s", self.type, self.__campaign_type)
46
+ return False
47
+
48
+ @staticmethod
49
+ def __check_experiment(data: TargetingData) -> bool:
50
+ size = len(data.variations)
51
+ return (size == 0) or ((size == 1) and data.variations.get(data.current_experiment_id) is not None)
52
+
53
+ @staticmethod
54
+ def __check_personalization(data: TargetingData) -> bool:
55
+ return len(data.personalizations) == 0
@@ -0,0 +1,35 @@
1
+ """Target experiment condition"""
2
+
3
+ from typing import cast, Any, Union, Dict
4
+ from kameleoon.data.manager.assigned_variation import AssignedVariation
5
+ from kameleoon.logging.kameleoon_logger import KameleoonLogger
6
+ from kameleoon.targeting.conditions.constants import TargetingOperator
7
+ from kameleoon.targeting.conditions.targeting_condition import TargetingCondition
8
+
9
+
10
+ class TargetExperimentCondition(TargetingCondition):
11
+ """Target experiment condition"""
12
+
13
+ # pylint: disable=R0903
14
+ class TargetingData:
15
+ """Represents targeting data for TargetExperimentCondition"""
16
+
17
+ def __init__(self, variations: Dict[int, AssignedVariation]):
18
+ self.variations = variations
19
+
20
+ def __init__(self, json_condition: Dict[str, Union[str, int, Any]]):
21
+ super().__init__(json_condition)
22
+ self.__variation_id = json_condition.get("variationId", -1)
23
+ self.__experiment_id: int = cast(int, json_condition.get("experimentId", -1))
24
+ self.__variation_match_type = json_condition.get("variationMatchType")
25
+
26
+ def check(self, data: TargetingData) -> bool:
27
+ variation = data.variations.get(self.__experiment_id)
28
+ if self.__variation_match_type == TargetingOperator.ANY.value:
29
+ return variation is not None
30
+ if self.__variation_match_type == TargetingOperator.EXACT.value:
31
+ return (variation is not None) and (variation.variation_id == self.__variation_id)
32
+ KameleoonLogger.error(
33
+ "Unexpected variation match type for %s condition: %s", self.type, self.__variation_match_type
34
+ )
35
+ return False
@@ -0,0 +1,23 @@
1
+ """Target personalization condition"""
2
+
3
+ from typing import Any, Union, Dict
4
+ from kameleoon.data.personalization import Personalization
5
+ from kameleoon.targeting.conditions.targeting_condition import TargetingCondition
6
+
7
+
8
+ class TargetPersonalizationCondition(TargetingCondition):
9
+ """Target personalization condition"""
10
+
11
+ # pylint: disable=R0903
12
+ class TargetingData:
13
+ """Represents targeting data for TargetPersonalizationCondition"""
14
+
15
+ def __init__(self, personalizations: Dict[int, Personalization]):
16
+ self.personalizations = personalizations
17
+
18
+ def __init__(self, json_condition: Dict[str, Union[int, Any]]):
19
+ super().__init__(json_condition)
20
+ self.__personalization_id = json_condition.get("personalizationId", -1)
21
+
22
+ def check(self, data: TargetingData) -> bool:
23
+ return data.personalizations.get(self.__personalization_id) is not None
@@ -14,7 +14,10 @@ class TargetingConditionType(Enum):
14
14
 
15
15
  CUSTOM_DATUM = "CUSTOM_DATUM"
16
16
  TARGET_FEATURE_FLAG = "TARGET_FEATURE_FLAG"
17
+ TARGET_EXPERIMENT = "TARGET_EXPERIMENT"
18
+ TARGET_PERSONALIZATION = "TARGET_PERSONALIZATION"
17
19
  EXCLUSIVE_FEATURE_FLAG = "EXCLUSIVE_FEATURE_FLAG"
20
+ EXCLUSIVE_EXPERIMENT = "EXCLUSIVE_EXPERIMENT"
18
21
  DEVICE_TYPE = "DEVICE_TYPE"
19
22
  VISITOR_CODE = "VISITOR_CODE"
20
23
  PAGE_URL = "PAGE_URL"
@@ -9,9 +9,12 @@ from kameleoon.logging.kameleoon_logger import KameleoonLogger
9
9
  from kameleoon.managers.data.data_manager import DataManager
10
10
  from kameleoon.sdk_version import SdkVersion
11
11
  from kameleoon.targeting.conditions.exclusive_feature_flag_condition import ExclusiveFeatureFlagCondition
12
+ from kameleoon.targeting.conditions.exclusive_experiment_condition import ExclusiveExperimentCondition
12
13
  from kameleoon.targeting.conditions.sdk_language_condition import SdkLanguageCondition
13
14
  from kameleoon.targeting.conditions.segment_condition import SegmentCondition
14
15
  from kameleoon.targeting.conditions.target_feature_flag_condition import TargetFeatureFlagCondition
16
+ from kameleoon.targeting.conditions.target_experiment_condition import TargetExperimentCondition
17
+ from kameleoon.targeting.conditions.target_personalization_condition import TargetPersonalizationCondition
15
18
  from kameleoon.targeting.conditions.targeting_condition import TargetingConditionType
16
19
 
17
20
 
@@ -72,10 +75,20 @@ class TargetingManager:
72
75
  condition_data = ExclusiveFeatureFlagCondition.ExclusiveFeatureFlagInfo(
73
76
  campaign_id, {} if visitor is None else visitor.variations
74
77
  )
78
+ elif condition_type == TargetingConditionType.EXCLUSIVE_EXPERIMENT:
79
+ condition_data = ExclusiveExperimentCondition.TargetingData(
80
+ campaign_id, visitor.variations if visitor else {}, visitor.personalizations if visitor else {}
81
+ )
75
82
  elif condition_type == TargetingConditionType.VISITOR_CODE:
76
83
  condition_data = visitor_code
77
84
  elif condition_type == TargetingConditionType.SDK_LANGUAGE:
78
85
  condition_data = SdkLanguageCondition.SdkInfo(SdkVersion.NAME, SdkVersion.VERSION)
86
+ elif condition_type == TargetingConditionType.TARGET_EXPERIMENT:
87
+ condition_data = TargetExperimentCondition.TargetingData(visitor.variations if visitor else {})
88
+ elif condition_type == TargetingConditionType.TARGET_PERSONALIZATION:
89
+ condition_data = TargetPersonalizationCondition.TargetingData(
90
+ visitor.personalizations if visitor else {}
91
+ )
79
92
  KameleoonLogger.debug(
80
93
  "RETURN: TargetingManager.__get_condition_data(condition_type_literal: %s, visitor, visitor_code: %s,"
81
94
  " campaign_id: %s) -> (condition_data: %s)",
@@ -10,6 +10,7 @@ from kameleoon.targeting.conditions.unknown_condition import UnknownCondition
10
10
  from kameleoon.targeting.conditions.targeting_condition import TargetingCondition, TargetingConditionType
11
11
  from kameleoon.targeting.conditions.custom_datum import CustomDatum
12
12
  from kameleoon.targeting.conditions.exclusive_feature_flag_condition import ExclusiveFeatureFlagCondition
13
+ from kameleoon.targeting.conditions.exclusive_experiment_condition import ExclusiveExperimentCondition
13
14
  from kameleoon.targeting.conditions.visitor_code_condition import VisitorCodeCondition
14
15
  from kameleoon.targeting.conditions.cookie_condition import CookieCondition
15
16
  from kameleoon.targeting.conditions.geolocation_condition import GeolocationCondition
@@ -17,6 +18,8 @@ from kameleoon.targeting.conditions.kcs_heat_range_condition import KcsHeatRange
17
18
  from kameleoon.targeting.conditions.operating_system_condition import OperatingSystemCondition
18
19
  from kameleoon.targeting.conditions.segment_condition import SegmentCondition
19
20
  from kameleoon.targeting.conditions.target_feature_flag_condition import TargetFeatureFlagCondition
21
+ from kameleoon.targeting.conditions.target_experiment_condition import TargetExperimentCondition
22
+ from kameleoon.targeting.conditions.target_personalization_condition import TargetPersonalizationCondition
20
23
  from kameleoon.targeting.conditions.page_view_number_condition import PageViewNumberCondition
21
24
  from kameleoon.targeting.conditions.previous_page_condition import PreviousPageCondition
22
25
  from kameleoon.targeting.conditions.visit_number_today_condition import VisitNumberTodayCondition
@@ -40,9 +43,18 @@ class TreeConditionFactory:
40
43
  if condition_type == TargetingConditionType.TARGET_FEATURE_FLAG:
41
44
  return TargetFeatureFlagCondition(condition_json)
42
45
 
46
+ if condition_type == TargetingConditionType.TARGET_EXPERIMENT:
47
+ return TargetExperimentCondition(condition_json)
48
+
49
+ if condition_type == TargetingConditionType.TARGET_PERSONALIZATION:
50
+ return TargetPersonalizationCondition(condition_json)
51
+
43
52
  if condition_type == TargetingConditionType.EXCLUSIVE_FEATURE_FLAG:
44
53
  return ExclusiveFeatureFlagCondition(condition_json)
45
54
 
55
+ if condition_type == TargetingConditionType.EXCLUSIVE_EXPERIMENT:
56
+ return ExclusiveExperimentCondition(condition_json)
57
+
46
58
  if condition_type == TargetingConditionType.DEVICE_TYPE:
47
59
  return DeviceCondition(condition_json)
48
60
 
@@ -20,6 +20,7 @@ class RemoteVisitorDataFilter:
20
20
  kcs=False,
21
21
  visitor_code=True,
22
22
  cbs=False,
23
+ personalization=False,
23
24
  ) -> None:
24
25
  self._previous_visit_amount = previous_visit_amount
25
26
  self._current_visit = current_visit
@@ -34,6 +35,7 @@ class RemoteVisitorDataFilter:
34
35
  self._kcs = kcs
35
36
  self._visitor_code = visitor_code
36
37
  self._cbs = cbs
38
+ self._personalization = personalization
37
39
 
38
40
  @property
39
41
  def previous_visit_amount(self) -> int:
@@ -100,6 +102,11 @@ class RemoteVisitorDataFilter:
100
102
  """True if CBS data will be retrieved"""
101
103
  return self._cbs
102
104
 
105
+ @property
106
+ def personalization(self) -> bool:
107
+ """True if personalization data will be retrieved"""
108
+ return self._personalization
109
+
103
110
  def __str__(self) -> str:
104
111
  return (
105
112
  f"RemoteVisitorDataFilter{{previous_visit_amount:{self._previous_visit_amount},"
@@ -107,5 +114,6 @@ class RemoteVisitorDataFilter:
107
114
  f"page_views:{self._page_views}, geolocation:{self._geolocation},"
108
115
  f"device:{self._device},browser:{self._browser},"
109
116
  f"operating_system:{self._operating_system},conversions:{self._conversions},"
110
- f"experiments:{self._experiments},kcs:{self._kcs},visitor_code:{self._visitor_code}}},cbs:{self._cbs}"
117
+ f"experiments:{self._experiments},kcs:{self._kcs},visitor_code:{self._visitor_code}}},cbs:{self._cbs},"
118
+ f"personalization:{self._personalization}"
111
119
  )
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: kameleoon-client-python
3
- Version: 3.11.0
3
+ Version: 3.12.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
@@ -38,6 +38,7 @@ kameleoon/data/kcs_heat.py
38
38
  kameleoon/data/mapping_identifier.py
39
39
  kameleoon/data/operating_system.py
40
40
  kameleoon/data/page_view.py
41
+ kameleoon/data/personalization.py
41
42
  kameleoon/data/unique_identifier.py
42
43
  kameleoon/data/user_agent.py
43
44
  kameleoon/data/visitor_visits.py
@@ -132,6 +133,7 @@ kameleoon/targeting/conditions/conversion_condition.py
132
133
  kameleoon/targeting/conditions/cookie_condition.py
133
134
  kameleoon/targeting/conditions/custom_datum.py
134
135
  kameleoon/targeting/conditions/device_condition.py
136
+ kameleoon/targeting/conditions/exclusive_experiment_condition.py
135
137
  kameleoon/targeting/conditions/exclusive_feature_flag_condition.py
136
138
  kameleoon/targeting/conditions/geolocation_condition.py
137
139
  kameleoon/targeting/conditions/kcs_heat_range_condition.py
@@ -144,7 +146,9 @@ kameleoon/targeting/conditions/previous_page_condition.py
144
146
  kameleoon/targeting/conditions/sdk_language_condition.py
145
147
  kameleoon/targeting/conditions/segment_condition.py
146
148
  kameleoon/targeting/conditions/string_value_condition.py
149
+ kameleoon/targeting/conditions/target_experiment_condition.py
147
150
  kameleoon/targeting/conditions/target_feature_flag_condition.py
151
+ kameleoon/targeting/conditions/target_personalization_condition.py
148
152
  kameleoon/targeting/conditions/targeting_condition.py
149
153
  kameleoon/targeting/conditions/time_elapsed_since_visit_condition.py
150
154
  kameleoon/targeting/conditions/unknown_condition.py