kameleoon-client-python 3.5.0__tar.gz → 3.6.1__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 (170) hide show
  1. {kameleoon-client-python-3.5.0 → kameleoon-client-python-3.6.1}/PKG-INFO +1 -1
  2. {kameleoon-client-python-3.5.0 → kameleoon-client-python-3.6.1}/kameleoon/data/manager/page_view_visit.py +9 -2
  3. {kameleoon-client-python-3.5.0 → kameleoon-client-python-3.6.1}/kameleoon/data/manager/visitor.py +6 -1
  4. {kameleoon-client-python-3.5.0 → kameleoon-client-python-3.6.1}/kameleoon/helpers/domain.py +6 -3
  5. {kameleoon-client-python-3.5.0 → kameleoon-client-python-3.6.1}/kameleoon/managers/remote_data/remote_data_manager.py +13 -13
  6. {kameleoon-client-python-3.5.0 → kameleoon-client-python-3.6.1}/kameleoon/managers/remote_data/remote_visitor_data.py +8 -0
  7. {kameleoon-client-python-3.5.0 → kameleoon-client-python-3.6.1}/kameleoon/sdk_version.py +1 -1
  8. {kameleoon-client-python-3.5.0 → kameleoon-client-python-3.6.1}/kameleoon/targeting/conditions/page_title_condition.py +3 -5
  9. {kameleoon-client-python-3.5.0 → kameleoon-client-python-3.6.1}/kameleoon/targeting/conditions/page_url_condition.py +3 -7
  10. {kameleoon-client-python-3.5.0 → kameleoon-client-python-3.6.1}/kameleoon/types/remote_visitor_data_filter.py +8 -1
  11. {kameleoon-client-python-3.5.0 → kameleoon-client-python-3.6.1}/kameleoon_client_python.egg-info/PKG-INFO +1 -1
  12. {kameleoon-client-python-3.5.0 → kameleoon-client-python-3.6.1}/MANIFEST.in +0 -0
  13. {kameleoon-client-python-3.5.0 → kameleoon-client-python-3.6.1}/README.md +0 -0
  14. {kameleoon-client-python-3.5.0 → kameleoon-client-python-3.6.1}/kameleoon/__init__.py +0 -0
  15. {kameleoon-client-python-3.5.0 → kameleoon-client-python-3.6.1}/kameleoon/client_readiness/__init__.py +0 -0
  16. {kameleoon-client-python-3.5.0 → kameleoon-client-python-3.6.1}/kameleoon/client_readiness/async_readiness.py +0 -0
  17. {kameleoon-client-python-3.5.0 → kameleoon-client-python-3.6.1}/kameleoon/client_readiness/threading_readiness.py +0 -0
  18. {kameleoon-client-python-3.5.0 → kameleoon-client-python-3.6.1}/kameleoon/configuration/__init__.py +0 -0
  19. {kameleoon-client-python-3.5.0 → kameleoon-client-python-3.6.1}/kameleoon/configuration/custom_data_info.py +0 -0
  20. {kameleoon-client-python-3.5.0 → kameleoon-client-python-3.6.1}/kameleoon/configuration/data_file.py +0 -0
  21. {kameleoon-client-python-3.5.0 → kameleoon-client-python-3.6.1}/kameleoon/configuration/feature_flag.py +0 -0
  22. {kameleoon-client-python-3.5.0 → kameleoon-client-python-3.6.1}/kameleoon/configuration/rule.py +0 -0
  23. {kameleoon-client-python-3.5.0 → kameleoon-client-python-3.6.1}/kameleoon/configuration/rule_type.py +0 -0
  24. {kameleoon-client-python-3.5.0 → kameleoon-client-python-3.6.1}/kameleoon/configuration/settings.py +0 -0
  25. {kameleoon-client-python-3.5.0 → kameleoon-client-python-3.6.1}/kameleoon/configuration/variable.py +0 -0
  26. {kameleoon-client-python-3.5.0 → kameleoon-client-python-3.6.1}/kameleoon/configuration/variation.py +0 -0
  27. {kameleoon-client-python-3.5.0 → kameleoon-client-python-3.6.1}/kameleoon/configuration/variation_by_exposition.py +0 -0
  28. {kameleoon-client-python-3.5.0 → kameleoon-client-python-3.6.1}/kameleoon/data/__init__.py +0 -0
  29. {kameleoon-client-python-3.5.0 → kameleoon-client-python-3.6.1}/kameleoon/data/browser.py +0 -0
  30. {kameleoon-client-python-3.5.0 → kameleoon-client-python-3.6.1}/kameleoon/data/conversion.py +0 -0
  31. {kameleoon-client-python-3.5.0 → kameleoon-client-python-3.6.1}/kameleoon/data/cookie.py +0 -0
  32. {kameleoon-client-python-3.5.0 → kameleoon-client-python-3.6.1}/kameleoon/data/custom_data.py +0 -0
  33. {kameleoon-client-python-3.5.0 → kameleoon-client-python-3.6.1}/kameleoon/data/data.py +0 -0
  34. {kameleoon-client-python-3.5.0 → kameleoon-client-python-3.6.1}/kameleoon/data/device.py +0 -0
  35. {kameleoon-client-python-3.5.0 → kameleoon-client-python-3.6.1}/kameleoon/data/geolocation.py +0 -0
  36. {kameleoon-client-python-3.5.0 → kameleoon-client-python-3.6.1}/kameleoon/data/kcs_heat.py +0 -0
  37. {kameleoon-client-python-3.5.0 → kameleoon-client-python-3.6.1}/kameleoon/data/manager/__init__.py +0 -0
  38. {kameleoon-client-python-3.5.0 → kameleoon-client-python-3.6.1}/kameleoon/data/manager/assigned_variation.py +0 -0
  39. {kameleoon-client-python-3.5.0 → kameleoon-client-python-3.6.1}/kameleoon/data/manager/visitor_manager.py +0 -0
  40. {kameleoon-client-python-3.5.0 → kameleoon-client-python-3.6.1}/kameleoon/data/manager/visitor_slot.py +0 -0
  41. {kameleoon-client-python-3.5.0 → kameleoon-client-python-3.6.1}/kameleoon/data/mapping_identifier.py +0 -0
  42. {kameleoon-client-python-3.5.0 → kameleoon-client-python-3.6.1}/kameleoon/data/operating_system.py +0 -0
  43. {kameleoon-client-python-3.5.0 → kameleoon-client-python-3.6.1}/kameleoon/data/page_view.py +0 -0
  44. {kameleoon-client-python-3.5.0 → kameleoon-client-python-3.6.1}/kameleoon/data/unique_identifier.py +0 -0
  45. {kameleoon-client-python-3.5.0 → kameleoon-client-python-3.6.1}/kameleoon/data/user_agent.py +0 -0
  46. {kameleoon-client-python-3.5.0 → kameleoon-client-python-3.6.1}/kameleoon/data/visitor_visits.py +0 -0
  47. {kameleoon-client-python-3.5.0 → kameleoon-client-python-3.6.1}/kameleoon/defaults.py +0 -0
  48. {kameleoon-client-python-3.5.0 → kameleoon-client-python-3.6.1}/kameleoon/exceptions.py +0 -0
  49. {kameleoon-client-python-3.5.0 → kameleoon-client-python-3.6.1}/kameleoon/helpers/__init__.py +0 -0
  50. {kameleoon-client-python-3.5.0 → kameleoon-client-python-3.6.1}/kameleoon/helpers/functions.py +0 -0
  51. {kameleoon-client-python-3.5.0 → kameleoon-client-python-3.6.1}/kameleoon/helpers/logger.py +0 -0
  52. {kameleoon-client-python-3.5.0 → kameleoon-client-python-3.6.1}/kameleoon/helpers/multi_threading.py +0 -0
  53. {kameleoon-client-python-3.5.0 → kameleoon-client-python-3.6.1}/kameleoon/helpers/nonce.py +0 -0
  54. {kameleoon-client-python-3.5.0 → kameleoon-client-python-3.6.1}/kameleoon/helpers/repeat_timer.py +0 -0
  55. {kameleoon-client-python-3.5.0 → kameleoon-client-python-3.6.1}/kameleoon/helpers/scheduler.py +0 -0
  56. {kameleoon-client-python-3.5.0 → kameleoon-client-python-3.6.1}/kameleoon/helpers/string_utils.py +0 -0
  57. {kameleoon-client-python-3.5.0 → kameleoon-client-python-3.6.1}/kameleoon/helpers/visitor_code.py +0 -0
  58. {kameleoon-client-python-3.5.0 → kameleoon-client-python-3.6.1}/kameleoon/hybrid/__init__.py +0 -0
  59. {kameleoon-client-python-3.5.0 → kameleoon-client-python-3.6.1}/kameleoon/hybrid/hybrid_manager.py +0 -0
  60. {kameleoon-client-python-3.5.0 → kameleoon-client-python-3.6.1}/kameleoon/hybrid/hybrid_manager_impl.py +0 -0
  61. {kameleoon-client-python-3.5.0 → kameleoon-client-python-3.6.1}/kameleoon/kameleoon_client.py +0 -0
  62. {kameleoon-client-python-3.5.0 → kameleoon-client-python-3.6.1}/kameleoon/kameleoon_client_config.py +0 -0
  63. {kameleoon-client-python-3.5.0 → kameleoon-client-python-3.6.1}/kameleoon/kameleoon_client_factory.py +0 -0
  64. {kameleoon-client-python-3.5.0 → kameleoon-client-python-3.6.1}/kameleoon/logging/__init__.py +0 -0
  65. {kameleoon-client-python-3.5.0 → kameleoon-client-python-3.6.1}/kameleoon/logging/kameleoon_logger.py +0 -0
  66. {kameleoon-client-python-3.5.0 → kameleoon-client-python-3.6.1}/kameleoon/logging/log_level.py +0 -0
  67. {kameleoon-client-python-3.5.0 → kameleoon-client-python-3.6.1}/kameleoon/logging/logger.py +0 -0
  68. {kameleoon-client-python-3.5.0 → kameleoon-client-python-3.6.1}/kameleoon/managers/__init__.py +0 -0
  69. {kameleoon-client-python-3.5.0 → kameleoon-client-python-3.6.1}/kameleoon/managers/asyncexec/__init__.py +0 -0
  70. {kameleoon-client-python-3.5.0 → kameleoon-client-python-3.6.1}/kameleoon/managers/asyncexec/async_executor.py +0 -0
  71. {kameleoon-client-python-3.5.0 → kameleoon-client-python-3.6.1}/kameleoon/managers/data/__init__.py +0 -0
  72. {kameleoon-client-python-3.5.0 → kameleoon-client-python-3.6.1}/kameleoon/managers/data/data_manager.py +0 -0
  73. {kameleoon-client-python-3.5.0 → kameleoon-client-python-3.6.1}/kameleoon/managers/remote_data/__init__.py +0 -0
  74. {kameleoon-client-python-3.5.0 → kameleoon-client-python-3.6.1}/kameleoon/managers/tracking/__init__.py +0 -0
  75. {kameleoon-client-python-3.5.0 → kameleoon-client-python-3.6.1}/kameleoon/managers/tracking/tracking_builder.py +0 -0
  76. {kameleoon-client-python-3.5.0 → kameleoon-client-python-3.6.1}/kameleoon/managers/tracking/tracking_manager.py +0 -0
  77. {kameleoon-client-python-3.5.0 → kameleoon-client-python-3.6.1}/kameleoon/managers/tracking/visitor_tracking_registry.py +0 -0
  78. {kameleoon-client-python-3.5.0 → kameleoon-client-python-3.6.1}/kameleoon/managers/warehouse/__init__.py +0 -0
  79. {kameleoon-client-python-3.5.0 → kameleoon-client-python-3.6.1}/kameleoon/managers/warehouse/warehouse_manager.py +0 -0
  80. {kameleoon-client-python-3.5.0 → kameleoon-client-python-3.6.1}/kameleoon/middleware.py +0 -0
  81. {kameleoon-client-python-3.5.0 → kameleoon-client-python-3.6.1}/kameleoon/network/__init__.py +0 -0
  82. {kameleoon-client-python-3.5.0 → kameleoon-client-python-3.6.1}/kameleoon/network/access_token_source.py +0 -0
  83. {kameleoon-client-python-3.5.0 → kameleoon-client-python-3.6.1}/kameleoon/network/access_token_source_factory.py +0 -0
  84. {kameleoon-client-python-3.5.0 → kameleoon-client-python-3.6.1}/kameleoon/network/activity_event.py +0 -0
  85. {kameleoon-client-python-3.5.0 → kameleoon-client-python-3.6.1}/kameleoon/network/cookie/__init__.py +0 -0
  86. {kameleoon-client-python-3.5.0 → kameleoon-client-python-3.6.1}/kameleoon/network/cookie/cookie_manager.py +0 -0
  87. {kameleoon-client-python-3.5.0 → kameleoon-client-python-3.6.1}/kameleoon/network/net_provider.py +0 -0
  88. {kameleoon-client-python-3.5.0 → kameleoon-client-python-3.6.1}/kameleoon/network/net_provider_impl.py +0 -0
  89. {kameleoon-client-python-3.5.0 → kameleoon-client-python-3.6.1}/kameleoon/network/network_manager.py +0 -0
  90. {kameleoon-client-python-3.5.0 → kameleoon-client-python-3.6.1}/kameleoon/network/network_manager_factory.py +0 -0
  91. {kameleoon-client-python-3.5.0 → kameleoon-client-python-3.6.1}/kameleoon/network/network_manager_factory_impl.py +0 -0
  92. {kameleoon-client-python-3.5.0 → kameleoon-client-python-3.6.1}/kameleoon/network/network_manager_impl.py +0 -0
  93. {kameleoon-client-python-3.5.0 → kameleoon-client-python-3.6.1}/kameleoon/network/query_builder.py +0 -0
  94. {kameleoon-client-python-3.5.0 → kameleoon-client-python-3.6.1}/kameleoon/network/query_encodable.py +0 -0
  95. {kameleoon-client-python-3.5.0 → kameleoon-client-python-3.6.1}/kameleoon/network/sendable.py +0 -0
  96. {kameleoon-client-python-3.5.0 → kameleoon-client-python-3.6.1}/kameleoon/network/service_initialize_context.py +0 -0
  97. {kameleoon-client-python-3.5.0 → kameleoon-client-python-3.6.1}/kameleoon/network/service_initialize_context_impl.py +0 -0
  98. {kameleoon-client-python-3.5.0 → kameleoon-client-python-3.6.1}/kameleoon/network/services/__init__.py +0 -0
  99. {kameleoon-client-python-3.5.0 → kameleoon-client-python-3.6.1}/kameleoon/network/services/automation_service.py +0 -0
  100. {kameleoon-client-python-3.5.0 → kameleoon-client-python-3.6.1}/kameleoon/network/services/automation_service_impl.py +0 -0
  101. {kameleoon-client-python-3.5.0 → kameleoon-client-python-3.6.1}/kameleoon/network/services/configuration_service.py +0 -0
  102. {kameleoon-client-python-3.5.0 → kameleoon-client-python-3.6.1}/kameleoon/network/services/configuration_service_impl.py +0 -0
  103. {kameleoon-client-python-3.5.0 → kameleoon-client-python-3.6.1}/kameleoon/network/services/data_service.py +0 -0
  104. {kameleoon-client-python-3.5.0 → kameleoon-client-python-3.6.1}/kameleoon/network/services/data_service_impl.py +0 -0
  105. {kameleoon-client-python-3.5.0 → kameleoon-client-python-3.6.1}/kameleoon/network/services/service.py +0 -0
  106. {kameleoon-client-python-3.5.0 → kameleoon-client-python-3.6.1}/kameleoon/network/services/service_impl.py +0 -0
  107. {kameleoon-client-python-3.5.0 → kameleoon-client-python-3.6.1}/kameleoon/network/uri_helper.py +0 -0
  108. {kameleoon-client-python-3.5.0 → kameleoon-client-python-3.6.1}/kameleoon/network/url_provider.py +0 -0
  109. {kameleoon-client-python-3.5.0 → kameleoon-client-python-3.6.1}/kameleoon/real_time/__init__.py +0 -0
  110. {kameleoon-client-python-3.5.0 → kameleoon-client-python-3.6.1}/kameleoon/real_time/real_time_configuration_service.py +0 -0
  111. {kameleoon-client-python-3.5.0 → kameleoon-client-python-3.6.1}/kameleoon/real_time/real_time_event.py +0 -0
  112. {kameleoon-client-python-3.5.0 → kameleoon-client-python-3.6.1}/kameleoon/storage/__init__.py +0 -0
  113. {kameleoon-client-python-3.5.0 → kameleoon-client-python-3.6.1}/kameleoon/storage/cache.py +0 -0
  114. {kameleoon-client-python-3.5.0 → kameleoon-client-python-3.6.1}/kameleoon/storage/cache_factory.py +0 -0
  115. {kameleoon-client-python-3.5.0 → kameleoon-client-python-3.6.1}/kameleoon/storage/cache_factory_impl.py +0 -0
  116. {kameleoon-client-python-3.5.0 → kameleoon-client-python-3.6.1}/kameleoon/storage/cache_impl.py +0 -0
  117. {kameleoon-client-python-3.5.0 → kameleoon-client-python-3.6.1}/kameleoon/targeting/__init__.py +0 -0
  118. {kameleoon-client-python-3.5.0 → kameleoon-client-python-3.6.1}/kameleoon/targeting/conditions/__init__.py +0 -0
  119. {kameleoon-client-python-3.5.0 → kameleoon-client-python-3.6.1}/kameleoon/targeting/conditions/browser_condition.py +0 -0
  120. {kameleoon-client-python-3.5.0 → kameleoon-client-python-3.6.1}/kameleoon/targeting/conditions/constants.py +0 -0
  121. {kameleoon-client-python-3.5.0 → kameleoon-client-python-3.6.1}/kameleoon/targeting/conditions/conversion_condition.py +0 -0
  122. {kameleoon-client-python-3.5.0 → kameleoon-client-python-3.6.1}/kameleoon/targeting/conditions/cookie_condition.py +0 -0
  123. {kameleoon-client-python-3.5.0 → kameleoon-client-python-3.6.1}/kameleoon/targeting/conditions/custom_datum.py +0 -0
  124. {kameleoon-client-python-3.5.0 → kameleoon-client-python-3.6.1}/kameleoon/targeting/conditions/device_condition.py +0 -0
  125. {kameleoon-client-python-3.5.0 → kameleoon-client-python-3.6.1}/kameleoon/targeting/conditions/exclusive_feature_flag_condition.py +0 -0
  126. {kameleoon-client-python-3.5.0 → kameleoon-client-python-3.6.1}/kameleoon/targeting/conditions/geolocation_condition.py +0 -0
  127. {kameleoon-client-python-3.5.0 → kameleoon-client-python-3.6.1}/kameleoon/targeting/conditions/kcs_heat_range_condition.py +0 -0
  128. {kameleoon-client-python-3.5.0 → kameleoon-client-python-3.6.1}/kameleoon/targeting/conditions/number_condition.py +0 -0
  129. {kameleoon-client-python-3.5.0 → kameleoon-client-python-3.6.1}/kameleoon/targeting/conditions/operating_system_condition.py +0 -0
  130. {kameleoon-client-python-3.5.0 → kameleoon-client-python-3.6.1}/kameleoon/targeting/conditions/page_view_number_condition.py +0 -0
  131. {kameleoon-client-python-3.5.0 → kameleoon-client-python-3.6.1}/kameleoon/targeting/conditions/previous_page_condition.py +0 -0
  132. {kameleoon-client-python-3.5.0 → kameleoon-client-python-3.6.1}/kameleoon/targeting/conditions/sdk_language_condition.py +0 -0
  133. {kameleoon-client-python-3.5.0 → kameleoon-client-python-3.6.1}/kameleoon/targeting/conditions/segment_condition.py +0 -0
  134. {kameleoon-client-python-3.5.0 → kameleoon-client-python-3.6.1}/kameleoon/targeting/conditions/string_value_condition.py +0 -0
  135. {kameleoon-client-python-3.5.0 → kameleoon-client-python-3.6.1}/kameleoon/targeting/conditions/target_feature_flag_condition.py +0 -0
  136. {kameleoon-client-python-3.5.0 → kameleoon-client-python-3.6.1}/kameleoon/targeting/conditions/targeting_condition.py +0 -0
  137. {kameleoon-client-python-3.5.0 → kameleoon-client-python-3.6.1}/kameleoon/targeting/conditions/time_elapsed_since_visit_condition.py +0 -0
  138. {kameleoon-client-python-3.5.0 → kameleoon-client-python-3.6.1}/kameleoon/targeting/conditions/unknown_condition.py +0 -0
  139. {kameleoon-client-python-3.5.0 → kameleoon-client-python-3.6.1}/kameleoon/targeting/conditions/visit_number_today_condition.py +0 -0
  140. {kameleoon-client-python-3.5.0 → kameleoon-client-python-3.6.1}/kameleoon/targeting/conditions/visit_number_total_condition.py +0 -0
  141. {kameleoon-client-python-3.5.0 → kameleoon-client-python-3.6.1}/kameleoon/targeting/conditions/visitor_code_condition.py +0 -0
  142. {kameleoon-client-python-3.5.0 → kameleoon-client-python-3.6.1}/kameleoon/targeting/conditions/visitor_new_return_condition.py +0 -0
  143. {kameleoon-client-python-3.5.0 → kameleoon-client-python-3.6.1}/kameleoon/targeting/models.py +0 -0
  144. {kameleoon-client-python-3.5.0 → kameleoon-client-python-3.6.1}/kameleoon/targeting/targeting_manager.py +0 -0
  145. {kameleoon-client-python-3.5.0 → kameleoon-client-python-3.6.1}/kameleoon/targeting/tree_builder.py +0 -0
  146. {kameleoon-client-python-3.5.0 → kameleoon-client-python-3.6.1}/kameleoon/targeting/tree_condition_factory.py +0 -0
  147. {kameleoon-client-python-3.5.0 → kameleoon-client-python-3.6.1}/kameleoon/types/__init__.py +0 -0
  148. {kameleoon-client-python-3.5.0 → kameleoon-client-python-3.6.1}/kameleoon/types/variable.py +0 -0
  149. {kameleoon-client-python-3.5.0 → kameleoon-client-python-3.6.1}/kameleoon/types/variation.py +0 -0
  150. {kameleoon-client-python-3.5.0 → kameleoon-client-python-3.6.1}/kameleoon_client_python.egg-info/SOURCES.txt +0 -0
  151. {kameleoon-client-python-3.5.0 → kameleoon-client-python-3.6.1}/kameleoon_client_python.egg-info/dependency_links.txt +0 -0
  152. {kameleoon-client-python-3.5.0 → kameleoon-client-python-3.6.1}/kameleoon_client_python.egg-info/requires.txt +14 -14
  153. {kameleoon-client-python-3.5.0 → kameleoon-client-python-3.6.1}/kameleoon_client_python.egg-info/top_level.txt +0 -0
  154. {kameleoon-client-python-3.5.0 → kameleoon-client-python-3.6.1}/setup.cfg +0 -0
  155. {kameleoon-client-python-3.5.0 → kameleoon-client-python-3.6.1}/setup.py +0 -0
  156. {kameleoon-client-python-3.5.0 → kameleoon-client-python-3.6.1}/tests/integration/proj/__init__.py +0 -0
  157. {kameleoon-client-python-3.5.0 → kameleoon-client-python-3.6.1}/tests/integration/proj/kameleoon_app/__init__.py +0 -0
  158. {kameleoon-client-python-3.5.0 → kameleoon-client-python-3.6.1}/tests/integration/proj/kameleoon_app/admin.py +0 -0
  159. {kameleoon-client-python-3.5.0 → kameleoon-client-python-3.6.1}/tests/integration/proj/kameleoon_app/apps.py +0 -0
  160. {kameleoon-client-python-3.5.0 → kameleoon-client-python-3.6.1}/tests/integration/proj/kameleoon_app/migrations/__init__.py +0 -0
  161. {kameleoon-client-python-3.5.0 → kameleoon-client-python-3.6.1}/tests/integration/proj/kameleoon_app/models.py +0 -0
  162. {kameleoon-client-python-3.5.0 → kameleoon-client-python-3.6.1}/tests/integration/proj/kameleoon_app/tests.py +0 -0
  163. {kameleoon-client-python-3.5.0 → kameleoon-client-python-3.6.1}/tests/integration/proj/kameleoon_app/views.py +0 -0
  164. {kameleoon-client-python-3.5.0 → kameleoon-client-python-3.6.1}/tests/integration/proj/manage.py +0 -0
  165. {kameleoon-client-python-3.5.0 → kameleoon-client-python-3.6.1}/tests/integration/proj/proj/__init__.py +0 -0
  166. {kameleoon-client-python-3.5.0 → kameleoon-client-python-3.6.1}/tests/integration/proj/proj/asgi.py +0 -0
  167. {kameleoon-client-python-3.5.0 → kameleoon-client-python-3.6.1}/tests/integration/proj/proj/settings.py +0 -0
  168. {kameleoon-client-python-3.5.0 → kameleoon-client-python-3.6.1}/tests/integration/proj/proj/urls.py +0 -0
  169. {kameleoon-client-python-3.5.0 → kameleoon-client-python-3.6.1}/tests/integration/proj/proj/wsgi.py +0 -0
  170. {kameleoon-client-python-3.5.0 → kameleoon-client-python-3.6.1}/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.5.0
3
+ Version: 3.6.1
4
4
  Summary: Kameleoon Client Python Software Development Kit.
5
5
  Home-page: https://developers.kameleoon.com/python-sdk.html
6
6
  Author: Kameleoon
@@ -1,4 +1,5 @@
1
1
  """Page view visit"""
2
+
2
3
  import time
3
4
  from typing import Optional
4
5
  from kameleoon.data import DataType
@@ -8,6 +9,7 @@ from kameleoon.data.page_view import PageView
8
9
 
9
10
  class PageViewVisit(BaseData):
10
11
  """Page view visit"""
12
+
11
13
  def __init__(self, page_view: PageView, count=1, last_timestamp: Optional[int] = None) -> None:
12
14
  super().__init__()
13
15
  self.page_view = page_view
@@ -18,6 +20,7 @@ class PageViewVisit(BaseData):
18
20
  """Overwrites the current PageView with a new PageView and increments the visit count."""
19
21
  self.page_view = new_page_view
20
22
  self.count += 1
23
+ self.last_timestamp = int(time.time() * 1000)
21
24
 
22
25
  def merge(self, page_view_visit) -> None:
23
26
  """Merges the visit data from another PageViewVisit instance into this one."""
@@ -33,8 +36,12 @@ class PageViewVisit(BaseData):
33
36
  return DataType.PAGE_VIEW_VISIT
34
37
 
35
38
  def __eq__(self, other: object) -> bool:
36
- return isinstance(other, PageViewVisit) and (other.page_view == self.page_view) and (
37
- other.count == self.count) and (other.last_timestamp == self.last_timestamp)
39
+ return (
40
+ isinstance(other, PageViewVisit)
41
+ and (other.page_view == self.page_view)
42
+ and (other.count == self.count)
43
+ and (other.last_timestamp == self.last_timestamp)
44
+ )
38
45
 
39
46
  def __str__(self):
40
47
  return (
@@ -174,7 +174,12 @@ class Visitor:
174
174
  @mapping_identifier.setter
175
175
  def mapping_identifier(self, value: str):
176
176
  """Sets the mapping identifier for this Visitor."""
177
- self._data.mapping_identifier = value
177
+ if self._data.mapping_identifier:
178
+ return
179
+ with self._data.lock:
180
+ if self._data.mapping_identifier:
181
+ return
182
+ self._data.mapping_identifier = value
178
183
  KameleoonLogger.debug("CALL/RETURN: Visitor.mapping_identifier <- (mapping_identifier: %s)", value)
179
184
 
180
185
  @property
@@ -9,6 +9,7 @@ REGEX_DOMAIN = (
9
9
  r"^(\.?(([a-zA-Z\d][a-zA-Z\d-]*[a-zA-Z\d])|[a-zA-Z\d]))"
10
10
  r"(\.(([a-zA-Z\d][a-zA-Z\d-]*[a-zA-Z\d])|[a-zA-Z\d])){1,126}$"
11
11
  )
12
+ LOCALHOST = "localhost"
12
13
 
13
14
 
14
15
  def validate_top_level_domain(top_level_domain: str) -> str:
@@ -35,8 +36,10 @@ def validate_top_level_domain(top_level_domain: str) -> str:
35
36
  protocol, top_level_domain)
36
37
  break
37
38
 
38
- if not re.match(REGEX_DOMAIN, top_level_domain):
39
- KameleoonLogger.error(f"The top-level domain '{top_level_domain}' is invalid.")
40
- return ""
39
+ if not re.match(REGEX_DOMAIN, top_level_domain) and top_level_domain != LOCALHOST:
40
+ KameleoonLogger.error(
41
+ f"The top-level domain '{top_level_domain}' is invalid. The value has been set as provided, but it does "
42
+ f"not meet the required format for proper SDK functionality. Please check the domain for correctness.")
43
+ return top_level_domain
41
44
 
42
45
  return top_level_domain
@@ -1,8 +1,6 @@
1
1
  """Remote data"""
2
2
  from typing import Optional, Any, List
3
- from kameleoon.configuration.custom_data_info import CustomDataInfo
4
3
  from kameleoon.data import Data
5
- from kameleoon.data.data import BaseData
6
4
  from kameleoon.data.manager.visitor_manager import VisitorManager
7
5
  from kameleoon.logging.kameleoon_logger import KameleoonLogger
8
6
  from kameleoon.managers.data.data_manager import DataManager
@@ -53,33 +51,35 @@ class RemoteDataManager:
53
51
  data_filter = RemoteVisitorDataFilter()
54
52
  service: DataService = self._network_manager.get_service(DataService)
55
53
  response = await service.get_remote_visitor_data(visitor_code, data_filter, is_unique_identifier, timeout)
56
- visitor_data = self.__handle_remote_visitor_data_response(response, visitor_code, add_data)
54
+ visitor_data = self.__handle_remote_visitor_data_response(response, visitor_code, add_data, data_filter)
57
55
  KameleoonLogger.debug(
58
56
  "CALL: RemoteDataManager.get_visitor_data(visitor_code: %s, add_data: %s, data_filter: %s, timeout: %s) "
59
57
  "-> (visitor_data: %s)", visitor_code, add_data, data_filter, timeout, visitor_data)
60
58
  return visitor_data
61
59
 
62
60
  def __handle_remote_visitor_data_response(
63
- self, response: Response, visitor_code: str, add_data: bool
61
+ self, response: Response, visitor_code: str, add_data: bool, data_filter: RemoteVisitorDataFilter
64
62
  ) -> List[Data]:
65
63
  if response.content is None:
66
64
  return []
67
65
  custom_data_info = self._data_manager.data_file.custom_data_info
68
- data_to_add, data_to_return = RemoteDataManager.__parse_remote_visitor_data(custom_data_info, response.content)
66
+ remote_visitor_data = RemoteDataManager.__parse_remote_visitor_data(response.content)
67
+ remote_visitor_data.mark_data_as_sent(custom_data_info)
68
+ data_to_add = remote_visitor_data.collect_data_to_add()
69
69
  if add_data and data_to_add:
70
70
  # Cannot use `VisitorManager.add_data` because it could use remote visitor data for mapping.
71
71
  visitor = self._visitor_manager.get_or_create_visitor(visitor_code)
72
72
  visitor.add_data(*data_to_add, overwrite=False)
73
- return data_to_return
73
+ if data_filter.visitor_code and remote_visitor_data.visitor_code:
74
+ # We apply visitor code from the latest visit fetched from Data API
75
+ visitor = self._visitor_manager.get_or_create_visitor(visitor_code)
76
+ visitor.mapping_identifier = remote_visitor_data.visitor_code
77
+ return remote_visitor_data.collect_data_to_return()
74
78
 
75
79
  @staticmethod
76
- def __parse_remote_visitor_data(
77
- custom_data_info: CustomDataInfo, raw: Any
78
- ) -> tuple[List[BaseData], List[Data]]:
80
+ def __parse_remote_visitor_data(raw: Any) -> RemoteVisitorData:
79
81
  try:
80
- remote_visitor_data = RemoteVisitorData(raw)
81
- remote_visitor_data.mark_data_as_sent(custom_data_info)
82
- return remote_visitor_data.collect_data_to_add(), remote_visitor_data.collect_data_to_return()
82
+ return RemoteVisitorData(raw)
83
83
  except Exception as ex: # pylint: disable=W0703
84
84
  KameleoonLogger.error("Parsing of remote visitor data failed: %s", ex)
85
- return [], []
85
+ return RemoteVisitorData({})
@@ -38,6 +38,7 @@ class RemoteVisitorData:
38
38
  self.__experiments: Optional[Dict[int, AssignedVariation]] = None
39
39
  self.__conversions: Optional[List[Conversion]] = None
40
40
  self.__previous_visitor_visits: Optional[VisitorVisits] = None
41
+ self.__visitor_code: Optional[str] = None
41
42
  current_visit = json.get("currentVisit")
42
43
  if current_visit is not None:
43
44
  self.__parse_visit(current_visit)
@@ -100,7 +101,14 @@ class RemoteVisitorData:
100
101
  for conversion in self.__conversions:
101
102
  conversion.mark_as_sent()
102
103
 
104
+ @property
105
+ def visitor_code(self) -> Optional[str]:
106
+ """Returns the `visitorCode` from the most recent visit"""
107
+ return self.__visitor_code
108
+
103
109
  def __parse_visit(self, json_visit: Dict[str, Any]) -> None:
110
+ if (self.__visitor_code is None) and isinstance(visitor_code := json_visit.get("visitorCode"), str):
111
+ self.__visitor_code = visitor_code
104
112
  custom_data_events = json_visit.get("customDataEvents")
105
113
  if custom_data_events:
106
114
  self.__parse_custom_data(custom_data_events)
@@ -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, 5, 0)
7
+ version_info = (3, 6, 1)
8
8
  __version__ = ".".join(str(v) for v in version_info) # uses in scripts
9
9
 
10
10
 
@@ -1,4 +1,5 @@
1
1
  """ condition"""
2
+
2
3
  from typing import Any, Union, Dict
3
4
  from kameleoon.data.manager.page_view_visit import PageViewVisit
4
5
  from kameleoon.targeting.conditions.string_value_condition import StringValueCondition
@@ -14,8 +15,5 @@ class PageTitleCondition(StringValueCondition):
14
15
  return isinstance(data, dict) and self.__check(data)
15
16
 
16
17
  def __check(self, page_view_visits: Dict[str, PageViewVisit]) -> bool:
17
- return any(
18
- isinstance(visit, PageViewVisit) and visit.page_view.title is not None and self._check(
19
- visit.page_view.title)
20
- for visit in page_view_visits.values()
21
- )
18
+ latest = max(page_view_visits.values(), key=lambda visit: visit.last_timestamp, default=None)
19
+ return latest is not None and latest.page_view.title is not None and self._check(latest.page_view.title)
@@ -1,7 +1,7 @@
1
1
  """ condition"""
2
+
2
3
  from typing import Any, Union, Dict
3
4
  from kameleoon.data.manager.page_view_visit import PageViewVisit
4
- from kameleoon.targeting.conditions.constants import TargetingOperator
5
5
  from kameleoon.targeting.conditions.string_value_condition import StringValueCondition
6
6
 
7
7
 
@@ -15,9 +15,5 @@ class PageUrlCondition(StringValueCondition):
15
15
  return isinstance(data, dict) and self.__check(data)
16
16
 
17
17
  def __check(self, page_view_visits: Dict[str, PageViewVisit]) -> bool:
18
- if self._operator == TargetingOperator.EXACT:
19
- return self._condition_value in page_view_visits
20
- return any(
21
- isinstance(visit, PageViewVisit) and self._check(visit.page_view.url)
22
- for visit in page_view_visits.values()
23
- )
18
+ latest = max(page_view_visits.values(), key=lambda visit: visit.last_timestamp, default=None)
19
+ return latest is not None and self._check(latest.page_view.url)
@@ -18,6 +18,7 @@ class RemoteVisitorDataFilter:
18
18
  conversions=False,
19
19
  experiments=False,
20
20
  kcs=False,
21
+ visitor_code=True,
21
22
  ) -> None:
22
23
  self._previous_visit_amount = previous_visit_amount
23
24
  self._current_visit = current_visit
@@ -30,6 +31,7 @@ class RemoteVisitorDataFilter:
30
31
  self._conversions = conversions
31
32
  self._experiments = experiments
32
33
  self._kcs = kcs
34
+ self._visitor_code = visitor_code
33
35
 
34
36
  @property
35
37
  def previous_visit_amount(self) -> int:
@@ -86,10 +88,15 @@ class RemoteVisitorDataFilter:
86
88
  """True if KCS heat data will be retrieved"""
87
89
  return self._kcs
88
90
 
91
+ @property
92
+ def visitor_code(self) -> bool:
93
+ """True if the `visitorCode` from the most recent visit will be retrieved and used for the current visit"""
94
+ return self._visitor_code
95
+
89
96
  def __str__(self):
90
97
  return (f"RemoteVisitorDataFilter{{previous_visit_amount:{self._previous_visit_amount},"
91
98
  f"current_visit:{self._current_visit},custom_data:{self._custom_data},"
92
99
  f"page_views:{self._page_views}, geolocation:{self._geolocation},"
93
100
  f"device:{self._device},browser:{self._browser},"
94
101
  f"operating_system:{self._operating_system},conversions:{self._conversions},"
95
- f"experiments:{self._experiments},kcs:{self._kcs}}}")
102
+ f"experiments:{self._experiments},kcs:{self._kcs},visitor_code:{self._visitor_code}}}")
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: kameleoon-client-python
3
- Version: 3.5.0
3
+ Version: 3.6.1
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
- freezegun==1.1.0
8
- pytest-ordering==0.6
9
- pytest-django==4.4.0
10
- requests<3.0.0,>=2.25
11
7
  Django==3.2.4
12
- pylint==2.12.*
13
- Werkzeug==2.0.1
14
- mypy==0.991
15
- flake8==4.0.1
8
+ types-PyYAML==5.4.3
9
+ wheel==0.36.2
16
10
  pyyaml<6.1.0,>=5.4.0
11
+ freezegun==1.1.0
17
12
  pytest-cov==2.12.1
18
- wheel==0.36.2
19
- types-PyYAML==5.4.3
20
13
  aiohttp<4.0.0,>=3.8.0
21
- pytest-asyncio==0.21.*
22
- pytest-pythonpath==0.7.3
23
- types-python-dateutil==2.8.2
14
+ aioresponses==0.7.*
24
15
  twine==3.4.1
16
+ flake8==4.0.1
17
+ pytest-ordering==0.6
25
18
  sseclient-py<1.9.0,>=1.7.0
26
- aioresponses==0.7.*
19
+ pytest-asyncio==0.21.*
20
+ types-python-dateutil==2.8.2
21
+ pytest-pythonpath==0.7.3
22
+ requests<3.0.0,>=2.25
23
+ pytest-django==4.4.0
24
+ pylint==2.12.*
25
+ Werkzeug==2.0.1
27
26
  types-requests==2.25.0
27
+ mypy==0.991