1
+ import logging
2
+ import sys
3
+
1
4
from . import bucketer
2
5
from . import event_builder
3
6
from . import exceptions
@@ -27,14 +30,33 @@ def __init__(self, datafile, event_dispatcher=None, logger=None, error_handler=N
27
30
By default JSON schema validation will be performed.
28
31
"""
29
32
33
+ self .is_valid = True
30
34
self .event_dispatcher = event_dispatcher or default_event_dispatcher
31
35
self .logger = logger or noop_logger
32
36
self .error_handler = error_handler or noop_error_handler
33
- self ._validate_inputs (datafile , skip_json_validation )
34
37
35
- self .config = project_config .ProjectConfig (datafile , self .logger , self .error_handler )
38
+ try :
39
+ self ._validate_inputs (datafile , skip_json_validation )
40
+ except exceptions .InvalidInputException as error :
41
+ self .is_valid = False
42
+ logging .error (str (error ))
43
+ return
44
+
45
+ try :
46
+ self .config = project_config .ProjectConfig (datafile , self .logger , self .error_handler )
47
+ except :
48
+ self .is_valid = False
49
+ self .config = None
50
+ logging .error (enums .Errors .INVALID_INPUT_ERROR .format ('datafile' ))
51
+ return
52
+
36
53
self .bucketer = bucketer .Bucketer (self .config )
37
- self .event_builder = event_builder .get_event_builder (self .config , self .bucketer )
54
+
55
+ try :
56
+ self .event_builder = event_builder .get_event_builder (self .config , self .bucketer )
57
+ except :
58
+ self .is_valid = False
59
+ logging .error (enums .Errors .UNSUPPORTED_DATAFILE_VERSION )
38
60
39
61
def _validate_inputs (self , datafile , skip_json_validation ):
40
62
""" Helper method to validate all input parameters.
@@ -48,16 +70,16 @@ def _validate_inputs(self, datafile, skip_json_validation):
48
70
"""
49
71
50
72
if not skip_json_validation and not validator .is_datafile_valid (datafile ):
51
- raise Exception (enums .Errors .INVALID_INPUT_ERROR .format ('datafile' ))
73
+ raise exceptions . InvalidInputException (enums .Errors .INVALID_INPUT_ERROR .format ('datafile' ))
52
74
53
75
if not validator .is_event_dispatcher_valid (self .event_dispatcher ):
54
- raise Exception (enums .Errors .INVALID_INPUT_ERROR .format ('event_dispatcher' ))
76
+ raise exceptions . InvalidInputException (enums .Errors .INVALID_INPUT_ERROR .format ('event_dispatcher' ))
55
77
56
78
if not validator .is_logger_valid (self .logger ):
57
- raise Exception (enums .Errors .INVALID_INPUT_ERROR .format ('logger' ))
79
+ raise exceptions . InvalidInputException (enums .Errors .INVALID_INPUT_ERROR .format ('logger' ))
58
80
59
81
if not validator .is_error_handler_valid (self .error_handler ):
60
- raise Exception (enums .Errors .INVALID_INPUT_ERROR .format ('error_handler' ))
82
+ raise exceptions . InvalidInputException (enums .Errors .INVALID_INPUT_ERROR .format ('error_handler' ))
61
83
62
84
def _validate_preconditions (self , experiment , user_id , attributes ):
63
85
""" Helper method to validate all pre-conditions before we go ahead to bucket user.
@@ -105,6 +127,10 @@ def activate(self, experiment_key, user_id, attributes=None):
105
127
None if user is not in experiment or if experiment is not Running.
106
128
"""
107
129
130
+ if not self .is_valid :
131
+ logging .error (enums .Errors .INVALID_DATAFILE .format ('activate' ))
132
+ return None
133
+
108
134
experiment = self .config .get_experiment_from_key (experiment_key )
109
135
if not experiment :
110
136
self .logger .log (enums .LogLevels .INFO , 'Not activating user "%s".' % user_id )
@@ -126,7 +152,11 @@ def activate(self, experiment_key, user_id, attributes=None):
126
152
self .logger .log (enums .LogLevels .DEBUG ,
127
153
'Dispatching impression event to URL %s with params %s.' % (impression_event .url ,
128
154
impression_event .params ))
129
- self .event_dispatcher .dispatch_event (impression_event )
155
+ try :
156
+ self .event_dispatcher .dispatch_event (impression_event )
157
+ except :
158
+ error = sys .exc_info ()[1 ]
159
+ self .logger .log (enums .LogLevels .ERROR , 'Unable to dispatch impression event. Error: %s' % str (error ))
130
160
131
161
return variation .key
132
162
@@ -140,13 +170,17 @@ def track(self, event_key, user_id, attributes=None, event_value=None):
140
170
event_value: Value associated with the event. Can be used to represent revenue in cents.
141
171
"""
142
172
173
+ if not self .is_valid :
174
+ logging .error (enums .Errors .INVALID_DATAFILE .format ('track' ))
175
+ return
176
+
143
177
if attributes and not validator .are_attributes_valid (attributes ):
144
178
self .logger .log (enums .LogLevels .ERROR , 'Provided attributes are in an invalid format.' )
145
179
self .error_handler .handle_error (exceptions .InvalidAttributeException (enums .Errors .INVALID_ATTRIBUTE_FORMAT ))
146
180
return
147
181
148
182
event = self .config .get_event (event_key )
149
- if not event . experimentIds :
183
+ if not event :
150
184
self .logger .log (enums .LogLevels .INFO , 'Not tracking user "%s" for event "%s".' % (user_id , event_key ))
151
185
return
152
186
@@ -167,7 +201,14 @@ def track(self, event_key, user_id, attributes=None, event_value=None):
167
201
self .logger .log (enums .LogLevels .DEBUG ,
168
202
'Dispatching conversion event to URL %s with params %s.' % (conversion_event .url ,
169
203
conversion_event .params ))
170
- self .event_dispatcher .dispatch_event (conversion_event )
204
+ try :
205
+ self .event_dispatcher .dispatch_event (conversion_event )
206
+ except :
207
+ error = sys .exc_info ()[1 ]
208
+ self .logger .log (enums .LogLevels .ERROR , 'Unable to dispatch conversion event. Error: %s' % str (error ))
209
+
210
+ else :
211
+ self .logger .log (enums .LogLevels .INFO , 'There are no valid experiments for event "%s" to track.' % event_key )
171
212
172
213
def get_variation (self , experiment_key , user_id , attributes = None ):
173
214
""" Gets variation where user will be bucketed.
@@ -182,6 +223,10 @@ def get_variation(self, experiment_key, user_id, attributes=None):
182
223
None if user is not in experiment or if experiment is not Running.
183
224
"""
184
225
226
+ if not self .is_valid :
227
+ logging .error (enums .Errors .INVALID_DATAFILE .format ('get_variation' ))
228
+ return None
229
+
185
230
experiment = self .config .get_experiment_from_key (experiment_key )
186
231
if not experiment :
187
232
return None
@@ -194,4 +239,3 @@ def get_variation(self, experiment_key, user_id, attributes=None):
194
239
return variation .key
195
240
196
241
return None
197
-
0 commit comments