Skip to content

Commit 73b7a38

Browse files
chore: Release 3.7.1 (#308)
1 parent edf5528 commit 73b7a38

11 files changed

+76
-42
lines changed

Diff for: CHANGELOG.md

+6
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,11 @@
11
# Optimizely Python SDK Changelog
22

3+
## 3.7.1
4+
November 19th, 2020
5+
6+
### Bug Fixes:
7+
* Added "enabled" field to decision metadata structure. [#306](https://github.com/optimizely/python-sdk/pull/306)
8+
39
## 3.7.0
410
November 2nd, 2020
511

Diff for: optimizely/event/event_factory.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ def _create_visitor(cls, event, logger):
9999
experiment_layerId = event.experiment.layerId
100100
experiment_id = event.experiment.id
101101

102-
metadata = payload.Metadata(event.flag_key, event.rule_key, event.rule_type, variation_key)
102+
metadata = payload.Metadata(event.flag_key, event.rule_key, event.rule_type, variation_key, event.enabled)
103103
decision = payload.Decision(experiment_layerId, experiment_id, variation_id, metadata)
104104
snapshot_event = payload.SnapshotEvent(
105105
experiment_layerId, event.uuid, cls.ACTIVATE_EVENT_KEY, event.timestamp,

Diff for: optimizely/event/payload.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -71,11 +71,12 @@ def __init__(self, campaign_id, experiment_id, variation_id, metadata):
7171
class Metadata(object):
7272
""" Class respresenting Metadata. """
7373

74-
def __init__(self, flag_key, rule_key, rule_type, variation_key):
74+
def __init__(self, flag_key, rule_key, rule_type, variation_key, enabled):
7575
self.flag_key = flag_key
7676
self.rule_key = rule_key
7777
self.rule_type = rule_type
7878
self.variation_key = variation_key
79+
self.enabled = enabled
7980

8081

8182
class Snapshot(object):

Diff for: optimizely/event/user_event.py

+3-2
Original file line numberDiff line numberDiff line change
@@ -41,15 +41,16 @@ class ImpressionEvent(UserEvent):
4141
""" Class representing Impression Event. """
4242

4343
def __init__(
44-
self, event_context, user_id, experiment, visitor_attributes, variation, flag_key, rule_key, rule_type,
45-
bot_filtering=None,
44+
self, event_context, user_id, experiment, visitor_attributes, variation, flag_key,
45+
rule_key, rule_type, enabled, bot_filtering=None
4646
):
4747
super(ImpressionEvent, self).__init__(event_context, user_id, visitor_attributes, bot_filtering)
4848
self.experiment = experiment
4949
self.variation = variation
5050
self.flag_key = flag_key
5151
self.rule_key = rule_key
5252
self.rule_type = rule_type
53+
self.enabled = enabled
5354

5455

5556
class ConversionEvent(UserEvent):

Diff for: optimizely/event/user_event_factory.py

+4-1
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,8 @@ class UserEventFactory(object):
2121

2222
@classmethod
2323
def create_impression_event(
24-
cls, project_config, activated_experiment, variation_id, flag_key, rule_key, rule_type, user_id, user_attributes
24+
cls, project_config, activated_experiment, variation_id, flag_key, rule_key, rule_type,
25+
enabled, user_id, user_attributes
2526
):
2627
""" Create impression Event to be sent to the logging endpoint.
2728
@@ -32,6 +33,7 @@ def create_impression_event(
3233
flag_key: key for a feature flag.
3334
rule_key: key for an experiment.
3435
rule_type: type for the source.
36+
enabled: boolean representing if feature is enabled
3537
user_id: ID for user.
3638
attributes: Dict representing user attributes and values which need to be recorded.
3739
@@ -62,6 +64,7 @@ def create_impression_event(
6264
flag_key,
6365
rule_key,
6466
rule_type,
67+
enabled,
6568
project_config.get_bot_filtering_value(),
6669
)
6770

Diff for: optimizely/optimizely.py

+20-18
Original file line numberDiff line numberDiff line change
@@ -160,8 +160,8 @@ def _validate_user_inputs(self, attributes=None, event_tags=None):
160160

161161
return True
162162

163-
def _send_impression_event(self, project_config, experiment, variation, flag_key, rule_key, rule_type, user_id,
164-
attributes):
163+
def _send_impression_event(self, project_config, experiment, variation, flag_key, rule_key, rule_type, enabled,
164+
user_id, attributes):
165165
""" Helper method to send impression event.
166166
167167
Args:
@@ -171,12 +171,13 @@ def _send_impression_event(self, project_config, experiment, variation, flag_key
171171
flag_key: key for a feature flag.
172172
rule_key: key for an experiment.
173173
rule_type: type for the source.
174+
enabled: boolean representing if feature is enabled
174175
user_id: ID for user.
175176
attributes: Dict representing user attributes and values which need to be recorded.
176177
"""
177178
variation_id = variation.id if variation is not None else None
178179
user_event = user_event_factory.UserEventFactory.create_impression_event(
179-
project_config, experiment, variation_id, flag_key, rule_key, rule_type, user_id, attributes
180+
project_config, experiment, variation_id, flag_key, rule_key, rule_type, enabled, user_id, attributes
180181
)
181182

182183
self.event_processor.process(user_event)
@@ -427,7 +428,7 @@ def activate(self, experiment_key, user_id, attributes=None):
427428
# Create and dispatch impression event
428429
self.logger.info('Activating user "%s" in experiment "%s".' % (user_id, experiment.key))
429430
self._send_impression_event(project_config, experiment, variation, '', experiment.key,
430-
enums.DecisionSources.EXPERIMENT, user_id, attributes)
431+
enums.DecisionSources.EXPERIMENT, True, user_id, attributes)
431432

432433
return variation.key
433434

@@ -580,25 +581,26 @@ def is_feature_enabled(self, feature_key, user_id, attributes=None):
580581
is_source_experiment = decision.source == enums.DecisionSources.FEATURE_TEST
581582
is_source_rollout = decision.source == enums.DecisionSources.ROLLOUT
582583

584+
if decision.variation:
585+
if decision.variation.featureEnabled is True:
586+
feature_enabled = True
587+
583588
if (is_source_rollout or not decision.variation) and project_config.get_send_flag_decisions_value():
584589
self._send_impression_event(
585590
project_config, decision.experiment, decision.variation, feature.key, decision.experiment.key if
586-
decision.experiment else '', decision.source, user_id, attributes
591+
decision.experiment else '', decision.source, feature_enabled, user_id, attributes
587592
)
588593

589-
if decision.variation:
590-
if decision.variation.featureEnabled is True:
591-
feature_enabled = True
592-
# Send event if Decision came from an experiment.
593-
if is_source_experiment:
594-
source_info = {
595-
'experiment_key': decision.experiment.key,
596-
'variation_key': decision.variation.key,
597-
}
598-
self._send_impression_event(
599-
project_config, decision.experiment, decision.variation, feature.key, decision.experiment.key,
600-
decision.source, user_id, attributes
601-
)
594+
# Send event if Decision came from an experiment.
595+
if is_source_experiment and decision.variation:
596+
source_info = {
597+
'experiment_key': decision.experiment.key,
598+
'variation_key': decision.variation.key,
599+
}
600+
self._send_impression_event(
601+
project_config, decision.experiment, decision.variation, feature.key, decision.experiment.key,
602+
decision.source, feature_enabled, user_id, attributes
603+
)
602604

603605
if feature_enabled:
604606
self.logger.info('Feature "%s" is enabled for user "%s".' % (feature_key, user_id))

Diff for: optimizely/version.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -11,5 +11,5 @@
1111
# See the License for the specific language governing permissions and
1212
# limitations under the License.
1313

14-
version_info = (3, 7, 0)
14+
version_info = (3, 7, 1)
1515
__version__ = '.'.join(str(v) for v in version_info)

Diff for: tests/test_event_factory.py

+18-6
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,8 @@ def test_create_impression_event(self):
7878
'metadata': {'flag_key': 'flag_key',
7979
'rule_key': 'rule_key',
8080
'rule_type': 'experiment',
81-
'variation_key': 'variation'}}
81+
'variation_key': 'variation',
82+
'enabled': False}}
8283
],
8384
'events': [
8485
{
@@ -109,6 +110,7 @@ def test_create_impression_event(self):
109110
'flag_key',
110111
'rule_key',
111112
'experiment',
113+
False,
112114
'test_user',
113115
None,
114116
)
@@ -139,7 +141,8 @@ def test_create_impression_event__with_attributes(self):
139141
'metadata': {'flag_key': 'flag_key',
140142
'rule_key': 'rule_key',
141143
'rule_type': 'experiment',
142-
'variation_key': 'variation'},
144+
'variation_key': 'variation',
145+
'enabled': True},
143146
}
144147
],
145148
'events': [
@@ -171,6 +174,7 @@ def test_create_impression_event__with_attributes(self):
171174
'flag_key',
172175
'rule_key',
173176
'experiment',
177+
True,
174178
'test_user',
175179
{'test_attribute': 'test_value'},
176180
)
@@ -199,7 +203,8 @@ def test_create_impression_event_when_attribute_is_not_in_datafile(self):
199203
'metadata': {'flag_key': 'flag_key',
200204
'rule_key': 'rule_key',
201205
'rule_type': 'experiment',
202-
'variation_key': 'variation'}
206+
'variation_key': 'variation',
207+
'enabled': True}
203208
}
204209
],
205210
'events': [
@@ -231,6 +236,7 @@ def test_create_impression_event_when_attribute_is_not_in_datafile(self):
231236
'flag_key',
232237
'rule_key',
233238
'experiment',
239+
True,
234240
'test_user',
235241
{'do_you_know_me': 'test_value'},
236242
)
@@ -350,7 +356,8 @@ def test_create_impression_event__with_user_agent_when_bot_filtering_is_enabled(
350356
'metadata': {'flag_key': 'flag_key',
351357
'rule_key': 'rule_key',
352358
'rule_type': 'experiment',
353-
'variation_key': 'variation'},
359+
'variation_key': 'variation',
360+
'enabled': False},
354361
}
355362
],
356363
'events': [
@@ -384,6 +391,7 @@ def test_create_impression_event__with_user_agent_when_bot_filtering_is_enabled(
384391
'flag_key',
385392
'rule_key',
386393
'experiment',
394+
False,
387395
'test_user',
388396
{'$opt_user_agent': 'Edge'},
389397
)
@@ -420,7 +428,8 @@ def test_create_impression_event__with_empty_attributes_when_bot_filtering_is_en
420428
'metadata': {'flag_key': 'flag_key',
421429
'rule_key': 'rule_key',
422430
'rule_type': 'experiment',
423-
'variation_key': 'variation'},
431+
'variation_key': 'variation',
432+
'enabled': False},
424433
}
425434
],
426435
'events': [
@@ -454,6 +463,7 @@ def test_create_impression_event__with_empty_attributes_when_bot_filtering_is_en
454463
'flag_key',
455464
'rule_key',
456465
'experiment',
466+
False,
457467
'test_user',
458468
None,
459469
)
@@ -496,7 +506,8 @@ def test_create_impression_event__with_user_agent_when_bot_filtering_is_disabled
496506
'metadata': {'flag_key': 'flag_key',
497507
'rule_key': 'rule_key',
498508
'rule_type': 'experiment',
499-
'variation_key': 'variation'},
509+
'variation_key': 'variation',
510+
'enabled': True},
500511
}
501512
],
502513
'events': [
@@ -530,6 +541,7 @@ def test_create_impression_event__with_user_agent_when_bot_filtering_is_disabled
530541
'flag_key',
531542
'rule_key',
532543
'experiment',
544+
True,
533545
'test_user',
534546
{'$opt_user_agent': 'Chrome'},
535547
)

Diff for: tests/test_event_payload.py

+3-2
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,8 @@ def test_impression_event_equals_serialized_payload(self):
3434
'metadata': {'flag_key': 'flag_key',
3535
'rule_key': 'rule_key',
3636
'rule_type': 'experiment',
37-
'variation_key': 'variation'},
37+
'variation_key': 'variation',
38+
'enabled': False},
3839
}
3940
],
4041
'events': [
@@ -59,7 +60,7 @@ def test_impression_event_equals_serialized_payload(self):
5960
batch = payload.EventBatch('12001', '111001', '42', 'python-sdk', version.__version__, False, True)
6061
visitor_attr = payload.VisitorAttribute('111094', 'test_attribute', 'custom', 'test_value')
6162
event = payload.SnapshotEvent('111182', 'a68cf1ad-0393-4e18-af87-efe8f01a7c9c', 'campaign_activated', 42123,)
62-
metadata = payload.Metadata('flag_key', 'rule_key', 'experiment', 'variation')
63+
metadata = payload.Metadata('flag_key', 'rule_key', 'experiment', 'variation', False)
6364
event_decision = payload.Decision('111182', '111127', '111129', metadata)
6465

6566
snapshots = payload.Snapshot([event], [event_decision])

Diff for: tests/test_optimizely.py

+16-8
Original file line numberDiff line numberDiff line change
@@ -325,7 +325,8 @@ def test_activate(self):
325325
'metadata': {'flag_key': '',
326326
'rule_key': 'test_experiment',
327327
'rule_type': 'experiment',
328-
'variation_key': 'variation'},
328+
'variation_key': 'variation',
329+
'enabled': True},
329330
}
330331
],
331332
'events': [
@@ -703,7 +704,8 @@ def test_activate__with_attributes__audience_match(self):
703704
'metadata': {'flag_key': '',
704705
'rule_key': 'test_experiment',
705706
'rule_type': 'experiment',
706-
'variation_key': 'variation'},
707+
'variation_key': 'variation',
708+
'enabled': True},
707709
}
708710
],
709711
'events': [
@@ -785,7 +787,8 @@ def test_activate__with_attributes_of_different_types(self):
785787
'metadata': {'flag_key': '',
786788
'rule_key': 'test_experiment',
787789
'rule_type': 'experiment',
788-
'variation_key': 'variation'},
790+
'variation_key': 'variation',
791+
'enabled': True},
789792
}
790793
],
791794
'events': [
@@ -981,7 +984,8 @@ def test_activate__with_attributes__audience_match__forced_bucketing(self):
981984
'metadata': {'flag_key': '',
982985
'rule_key': 'test_experiment',
983986
'rule_type': 'experiment',
984-
'variation_key': 'control'},
987+
'variation_key': 'control',
988+
'enabled': True},
985989
}
986990
],
987991
'events': [
@@ -1056,7 +1060,8 @@ def test_activate__with_attributes__audience_match__bucketing_id_provided(self):
10561060
'metadata': {'flag_key': '',
10571061
'rule_key': 'test_experiment',
10581062
'rule_type': 'experiment',
1059-
'variation_key': 'variation'},
1063+
'variation_key': 'variation',
1064+
'enabled': True},
10601065
}
10611066
],
10621067
'events': [
@@ -2004,7 +2009,8 @@ def test_is_feature_enabled__returns_true_for_feature_experiment_if_feature_enab
20042009
'metadata': {'flag_key': 'test_feature_in_experiment',
20052010
'rule_key': 'test_experiment',
20062011
'rule_type': 'feature-test',
2007-
'variation_key': 'variation'}}
2012+
'variation_key': 'variation',
2013+
'enabled': True}}
20082014
],
20092015
'events': [
20102016
{
@@ -2102,7 +2108,8 @@ def test_is_feature_enabled__returns_false_for_feature_experiment_if_feature_dis
21022108
'metadata': {'flag_key': 'test_feature_in_experiment',
21032109
'rule_key': 'test_experiment',
21042110
'rule_type': 'feature-test',
2105-
'variation_key': 'control'}}
2111+
'variation_key': 'control',
2112+
'enabled': False}}
21062113
],
21072114
'events': [
21082115
{
@@ -2248,7 +2255,8 @@ def test_is_feature_enabled__returns_true_for_feature_rollout_if_feature_enabled
22482255
'metadata': {'flag_key': 'test_feature_in_experiment',
22492256
'rule_key': 'test_experiment',
22502257
'rule_type': 'rollout',
2251-
'variation_key': 'variation'},
2258+
'variation_key': 'variation',
2259+
'enabled': True},
22522260
}
22532261
],
22542262
'events': [

0 commit comments

Comments
 (0)