1717from . import event_builder
1818from . import exceptions
1919from . import logger as _logging
20- from .config_manager import StaticConfigManager
2120from .config_manager import PollingConfigManager
21+ from .config_manager import StaticConfigManager
2222from .error_handler import NoOpErrorHandler as noop_error_handler
23+ from .event import event_factory , user_event_factory
24+ from .event .event_processor import ForwardingEventProcessor
2325from .event_dispatcher import EventDispatcher as default_event_dispatcher
24- from .helpers import enums
25- from .helpers import validator
26+ from .helpers import enums , validator
2627from .notification_center import NotificationCenter
2728
2829
@@ -38,7 +39,8 @@ def __init__(self,
3839 user_profile_service = None ,
3940 sdk_key = None ,
4041 config_manager = None ,
41- notification_center = None ):
42+ notification_center = None ,
43+ event_processor = None ):
4244 """ Optimizely init method for managing Custom projects.
4345
4446 Args:
@@ -56,6 +58,7 @@ def __init__(self,
5658 notification_center: Optional instance of notification_center.NotificationCenter. Useful when providing own
5759 config_manager.BaseConfigManager implementation which can be using the
5860 same NotificationCenter instance.
61+ event_processor: Processes the given event(s) by creating LogEvent(s) and then dispatching it.
5962 """
6063 self .logger_name = '.' .join ([__name__ , self .__class__ .__name__ ])
6164 self .is_valid = True
@@ -64,6 +67,9 @@ def __init__(self,
6467 self .error_handler = error_handler or noop_error_handler
6568 self .config_manager = config_manager
6669 self .notification_center = notification_center or NotificationCenter (self .logger )
70+ self .event_processor = event_processor or ForwardingEventProcessor (self .event_dispatcher ,
71+ self .logger ,
72+ self .notification_center )
6773
6874 try :
6975 self ._validate_instantiation_options ()
@@ -114,6 +120,9 @@ def _validate_instantiation_options(self):
114120 if not validator .is_notification_center_valid (self .notification_center ):
115121 raise exceptions .InvalidInputException (enums .Errors .INVALID_INPUT .format ('notification_center' ))
116122
123+ if not validator .is_event_processor_valid (self .event_processor ):
124+ raise exceptions .InvalidInputException (enums .Errors .INVALID_INPUT .format ('event_processor' ))
125+
117126 def _validate_user_inputs (self , attributes = None , event_tags = None ):
118127 """ Helper method to validate user inputs.
119128
@@ -149,26 +158,23 @@ def _send_impression_event(self, project_config, experiment, variation, user_id,
149158 attributes: Dict representing user attributes and values which need to be recorded.
150159 """
151160
152- impression_event = self . event_builder .create_impression_event (
161+ user_event = user_event_factory . UserEventFactory .create_impression_event (
153162 project_config ,
154163 experiment ,
155164 variation .id ,
156165 user_id ,
157166 attributes
158167 )
159168
160- self .logger .debug ('Dispatching impression event to URL %s with params %s.' % (
161- impression_event .url ,
162- impression_event .params
163- ))
164-
165- try :
166- self .event_dispatcher .dispatch_event (impression_event )
167- except :
168- self .logger .exception ('Unable to dispatch impression event!' )
169+ self .event_processor .process (user_event )
169170
170- self .notification_center .send_notifications (enums .NotificationTypes .ACTIVATE ,
171- experiment , user_id , attributes , variation , impression_event )
171+ # Kept for backward compatibility.
172+ # This notification is deprecated and new Decision notifications
173+ # are sent via their respective method calls.
174+ if len (self .notification_center .notification_listeners [enums .NotificationTypes .ACTIVATE ]) > 0 :
175+ log_event = event_factory .EventFactory .create_log_event (user_event , self .logger )
176+ self .notification_center .send_notifications (enums .NotificationTypes .ACTIVATE , experiment ,
177+ user_id , attributes , variation , log_event .__dict__ )
172178
173179 def _get_feature_variable_for_type (self ,
174180 project_config ,
@@ -359,24 +365,21 @@ def track(self, event_key, user_id, attributes=None, event_tags=None):
359365 self .logger .info ('Not tracking user "%s" for event "%s".' % (user_id , event_key ))
360366 return
361367
362- conversion_event = self . event_builder .create_conversion_event (
368+ user_event = user_event_factory . UserEventFactory .create_conversion_event (
363369 project_config ,
364370 event_key ,
365371 user_id ,
366372 attributes ,
367373 event_tags
368374 )
375+
376+ self .event_processor .process (user_event )
369377 self .logger .info ('Tracking event "%s" for user "%s".' % (event_key , user_id ))
370- self .logger .debug ('Dispatching conversion event to URL %s with params %s.' % (
371- conversion_event .url ,
372- conversion_event .params
373- ))
374- try :
375- self .event_dispatcher .dispatch_event (conversion_event )
376- except :
377- self .logger .exception ('Unable to dispatch conversion event!' )
378- self .notification_center .send_notifications (enums .NotificationTypes .TRACK , event_key , user_id ,
379- attributes , event_tags , conversion_event )
378+
379+ if len (self .notification_center .notification_listeners [enums .NotificationTypes .TRACK ]) > 0 :
380+ log_event = event_factory .EventFactory .create_log_event (user_event , self .logger )
381+ self .notification_center .send_notifications (enums .NotificationTypes .TRACK , event_key , user_id ,
382+ attributes , event_tags , log_event .__dict__ )
380383
381384 def get_variation (self , experiment_key , user_id , attributes = None ):
382385 """ Gets variation where user will be bucketed.
0 commit comments