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.
- {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/PKG-INFO +1 -1
- {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/data/data.py +1 -0
- {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/data/manager/visitor.py +18 -1
- kameleoon-client-python-3.12.0/kameleoon/data/personalization.py +30 -0
- {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/managers/remote_data/remote_visitor_data.py +24 -7
- {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/network/query_builder.py +1 -0
- {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/network/url_provider.py +1 -0
- {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/sdk_version.py +1 -1
- kameleoon-client-python-3.12.0/kameleoon/targeting/conditions/exclusive_experiment_condition.py +55 -0
- kameleoon-client-python-3.12.0/kameleoon/targeting/conditions/target_experiment_condition.py +35 -0
- kameleoon-client-python-3.12.0/kameleoon/targeting/conditions/target_personalization_condition.py +23 -0
- {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/targeting/conditions/targeting_condition.py +3 -0
- {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/targeting/targeting_manager.py +13 -0
- {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/targeting/tree_condition_factory.py +12 -0
- {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/types/remote_visitor_data_filter.py +9 -1
- {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon_client_python.egg-info/PKG-INFO +1 -1
- {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon_client_python.egg-info/SOURCES.txt +4 -0
- {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/MANIFEST.in +0 -0
- {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/README.md +0 -0
- {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/__init__.py +0 -0
- {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/client_readiness/__init__.py +0 -0
- {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/client_readiness/async_readiness.py +0 -0
- {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/client_readiness/threading_readiness.py +0 -0
- {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/configuration/__init__.py +0 -0
- {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/configuration/custom_data_info.py +0 -0
- {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/configuration/data_file.py +0 -0
- {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/configuration/experiment.py +0 -0
- {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/configuration/feature_flag.py +0 -0
- {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/configuration/me_group.py +0 -0
- {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/configuration/rule.py +0 -0
- {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/configuration/rule_type.py +0 -0
- {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/configuration/settings.py +0 -0
- {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/configuration/variable.py +0 -0
- {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/configuration/variation.py +0 -0
- {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/configuration/variation_by_exposition.py +0 -0
- {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/data/__init__.py +0 -0
- {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/data/browser.py +0 -0
- {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/data/cbscores.py +0 -0
- {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/data/conversion.py +0 -0
- {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/data/cookie.py +0 -0
- {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/data/custom_data.py +0 -0
- {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/data/device.py +0 -0
- {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/data/geolocation.py +0 -0
- {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/data/kcs_heat.py +0 -0
- {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/data/manager/__init__.py +0 -0
- {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/data/manager/assigned_variation.py +0 -0
- {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/data/manager/forced_experiment_variation.py +0 -0
- {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/data/manager/forced_feature_variation.py +0 -0
- {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/data/manager/forced_variation.py +0 -0
- {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/data/manager/page_view_visit.py +0 -0
- {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/data/manager/visitor_manager.py +0 -0
- {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/data/manager/visitor_slot.py +0 -0
- {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/data/mapping_identifier.py +0 -0
- {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/data/operating_system.py +0 -0
- {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/data/page_view.py +0 -0
- {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/data/unique_identifier.py +0 -0
- {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/data/user_agent.py +0 -0
- {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/data/visitor_visits.py +0 -0
- {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/defaults.py +0 -0
- {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/exceptions.py +0 -0
- {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/helpers/__init__.py +0 -0
- {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/helpers/domain.py +0 -0
- {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/helpers/functions.py +0 -0
- {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/helpers/hasher.py +0 -0
- {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/helpers/logger.py +0 -0
- {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/helpers/multi_threading.py +0 -0
- {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/helpers/nonce.py +0 -0
- {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/helpers/repeat_timer.py +0 -0
- {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/helpers/scheduler.py +0 -0
- {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/helpers/string_utils.py +0 -0
- {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/helpers/visitor_code.py +0 -0
- {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/hybrid/__init__.py +0 -0
- {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/hybrid/hybrid_manager.py +0 -0
- {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/hybrid/hybrid_manager_impl.py +0 -0
- {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/kameleoon_client.py +0 -0
- {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/kameleoon_client_config.py +0 -0
- {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/kameleoon_client_factory.py +0 -0
- {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/logging/__init__.py +0 -0
- {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/logging/kameleoon_logger.py +0 -0
- {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/logging/log_level.py +0 -0
- {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/logging/logger.py +0 -0
- {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/managers/__init__.py +0 -0
- {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/managers/asyncexec/__init__.py +0 -0
- {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/managers/asyncexec/async_executor.py +0 -0
- {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/managers/data/__init__.py +0 -0
- {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/managers/data/data_manager.py +0 -0
- {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/managers/evaluation/__init__.py +0 -0
- {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/managers/evaluation/evaluated_experiment.py +0 -0
- {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/managers/remote_data/__init__.py +0 -0
- {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/managers/remote_data/remote_data_manager.py +0 -0
- {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/managers/tracking/__init__.py +0 -0
- {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/managers/tracking/tracking_builder.py +0 -0
- {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/managers/tracking/tracking_manager.py +0 -0
- {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/managers/tracking/visitor_tracking_registry.py +0 -0
- {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/managers/warehouse/__init__.py +0 -0
- {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/managers/warehouse/warehouse_manager.py +0 -0
- {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/middleware.py +0 -0
- {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/network/__init__.py +0 -0
- {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/network/access_token_source.py +0 -0
- {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/network/access_token_source_factory.py +0 -0
- {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/network/activity_event.py +0 -0
- {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/network/cookie/__init__.py +0 -0
- {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/network/cookie/cookie_manager.py +0 -0
- {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/network/net_provider.py +0 -0
- {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/network/net_provider_impl.py +0 -0
- {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/network/network_manager.py +0 -0
- {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/network/network_manager_factory.py +0 -0
- {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/network/network_manager_factory_impl.py +0 -0
- {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/network/network_manager_impl.py +0 -0
- {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/network/query_encodable.py +0 -0
- {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/network/sendable.py +0 -0
- {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/network/service_initialize_context.py +0 -0
- {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/network/service_initialize_context_impl.py +0 -0
- {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/network/services/__init__.py +0 -0
- {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/network/services/automation_service.py +0 -0
- {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/network/services/automation_service_impl.py +0 -0
- {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/network/services/configuration_service.py +0 -0
- {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/network/services/configuration_service_impl.py +0 -0
- {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/network/services/data_service.py +0 -0
- {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/network/services/data_service_impl.py +0 -0
- {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/network/services/service.py +0 -0
- {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/network/services/service_impl.py +0 -0
- {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/network/uri_helper.py +0 -0
- {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/real_time/__init__.py +0 -0
- {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/real_time/real_time_configuration_service.py +0 -0
- {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/real_time/real_time_event.py +0 -0
- {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/storage/__init__.py +0 -0
- {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/storage/cache.py +0 -0
- {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/storage/cache_factory.py +0 -0
- {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/storage/cache_factory_impl.py +0 -0
- {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/storage/cache_impl.py +0 -0
- {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/targeting/__init__.py +0 -0
- {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/targeting/conditions/__init__.py +0 -0
- {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/targeting/conditions/browser_condition.py +0 -0
- {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/targeting/conditions/constants.py +0 -0
- {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/targeting/conditions/conversion_condition.py +0 -0
- {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/targeting/conditions/cookie_condition.py +0 -0
- {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/targeting/conditions/custom_datum.py +0 -0
- {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/targeting/conditions/device_condition.py +0 -0
- {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/targeting/conditions/exclusive_feature_flag_condition.py +0 -0
- {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/targeting/conditions/geolocation_condition.py +0 -0
- {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/targeting/conditions/kcs_heat_range_condition.py +0 -0
- {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/targeting/conditions/number_condition.py +0 -0
- {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/targeting/conditions/operating_system_condition.py +0 -0
- {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/targeting/conditions/page_title_condition.py +0 -0
- {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/targeting/conditions/page_url_condition.py +0 -0
- {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/targeting/conditions/page_view_number_condition.py +0 -0
- {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/targeting/conditions/previous_page_condition.py +0 -0
- {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/targeting/conditions/sdk_language_condition.py +0 -0
- {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/targeting/conditions/segment_condition.py +0 -0
- {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/targeting/conditions/string_value_condition.py +0 -0
- {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/targeting/conditions/target_feature_flag_condition.py +0 -0
- {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/targeting/conditions/time_elapsed_since_visit_condition.py +0 -0
- {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/targeting/conditions/unknown_condition.py +0 -0
- {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/targeting/conditions/visit_number_today_condition.py +0 -0
- {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/targeting/conditions/visit_number_total_condition.py +0 -0
- {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/targeting/conditions/visitor_code_condition.py +0 -0
- {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/targeting/conditions/visitor_new_return_condition.py +0 -0
- {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/targeting/models.py +0 -0
- {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/targeting/tree_builder.py +0 -0
- {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/types/__init__.py +0 -0
- {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/types/variable.py +0 -0
- {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/types/variation.py +0 -0
- {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon_client_python.egg-info/dependency_links.txt +0 -0
- {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon_client_python.egg-info/requires.txt +12 -12
- {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon_client_python.egg-info/top_level.txt +0 -0
- {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/setup.cfg +0 -0
- {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/setup.py +0 -0
- {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/tests/integration/proj/__init__.py +0 -0
- {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/tests/integration/proj/kameleoon_app/__init__.py +0 -0
- {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/tests/integration/proj/kameleoon_app/admin.py +0 -0
- {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/tests/integration/proj/kameleoon_app/apps.py +0 -0
- {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/tests/integration/proj/kameleoon_app/migrations/__init__.py +0 -0
- {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/tests/integration/proj/kameleoon_app/models.py +0 -0
- {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/tests/integration/proj/kameleoon_app/tests.py +0 -0
- {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/tests/integration/proj/kameleoon_app/views.py +0 -0
- {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/tests/integration/proj/manage.py +0 -0
- {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/tests/integration/proj/proj/__init__.py +0 -0
- {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/tests/integration/proj/proj/asgi.py +0 -0
- {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/tests/integration/proj/proj/settings.py +0 -0
- {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/tests/integration/proj/proj/urls.py +0 -0
- {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/tests/integration/proj/proj/wsgi.py +0 -0
- {kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/tests/resources/config.yml +0 -0
{kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/data/manager/visitor.py
RENAMED
|
@@ -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
|
|
218
|
-
|
|
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
|
-
|
|
238
|
+
yield self.__device
|
|
221
239
|
if self.__browser:
|
|
222
|
-
|
|
240
|
+
yield self.__browser
|
|
223
241
|
if self.__operating_system:
|
|
224
|
-
|
|
242
|
+
yield self.__operating_system
|
|
225
243
|
if self.__geolocation:
|
|
226
|
-
|
|
227
|
-
return objects
|
|
244
|
+
yield self.__geolocation
|
|
228
245
|
|
|
229
246
|
@staticmethod
|
|
230
247
|
def __parse_kcs_heat(kcs: Optional[Any]) -> Optional[KcsHeat]:
|
{kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/network/url_provider.py
RENAMED
|
@@ -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
|
|
kameleoon-client-python-3.12.0/kameleoon/targeting/conditions/exclusive_experiment_condition.py
ADDED
|
@@ -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
|
kameleoon-client-python-3.12.0/kameleoon/targeting/conditions/target_personalization_condition.py
ADDED
|
@@ -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
|
)
|
|
@@ -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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/configuration/rule.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/data/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
{kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/data/cbscores.py
RENAMED
|
File without changes
|
{kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/data/conversion.py
RENAMED
|
File without changes
|
|
File without changes
|
{kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/data/custom_data.py
RENAMED
|
File without changes
|
|
File without changes
|
{kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/data/geolocation.py
RENAMED
|
File without changes
|
{kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/data/kcs_heat.py
RENAMED
|
File without changes
|
{kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/data/manager/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/data/operating_system.py
RENAMED
|
File without changes
|
{kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/data/page_view.py
RENAMED
|
File without changes
|
|
File without changes
|
{kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/data/user_agent.py
RENAMED
|
File without changes
|
{kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/data/visitor_visits.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/helpers/__init__.py
RENAMED
|
File without changes
|
{kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/helpers/domain.py
RENAMED
|
File without changes
|
{kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/helpers/functions.py
RENAMED
|
File without changes
|
{kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/helpers/hasher.py
RENAMED
|
File without changes
|
{kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/helpers/logger.py
RENAMED
|
File without changes
|
|
File without changes
|
{kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/helpers/nonce.py
RENAMED
|
File without changes
|
{kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/helpers/repeat_timer.py
RENAMED
|
File without changes
|
{kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/helpers/scheduler.py
RENAMED
|
File without changes
|
{kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/helpers/string_utils.py
RENAMED
|
File without changes
|
{kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/helpers/visitor_code.py
RENAMED
|
File without changes
|
{kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/hybrid/__init__.py
RENAMED
|
File without changes
|
{kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/hybrid/hybrid_manager.py
RENAMED
|
File without changes
|
|
File without changes
|
{kameleoon-client-python-3.11.0 → kameleoon-client-python-3.12.0}/kameleoon/kameleoon_client.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|