optimizely-sdk 2.0.3 → 2.1.0

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 237d61dfbd7da5d8b12e1a9e2b913a684a2700bd
4
- data.tar.gz: e8620f5eb74a80a2e6d0a2b584bdfe369e4ad9ca
3
+ metadata.gz: 50614c45e6266670a008909d27b7baf89d443500
4
+ data.tar.gz: 89c89c31817a26ef93d516d19f406c12be5617f2
5
5
  SHA512:
6
- metadata.gz: 7ceffdff73cf4b58b609f3c40105134df1e97eee3105222749c6e72c7f54ab9aa00cf2de18b1821aba6f0d0cdd30b9f7872cc570886d7dc76f2ae00ad828baaf
7
- data.tar.gz: 11bc03a8f8af4c5758778e2c59fc090f6d39d52d818c267950d1ff98db1b043068d0bcef30ed8babcc7584e02200f0fcead4310c58d727bba9d21da6fcf642a1
6
+ metadata.gz: 8e443c5554673b3c209d3a8d85135d843db8e417df827a14d414f954f5eb3bbd70804163d948f48beb1174e909427761fd8e19acf77e2c7d7879fbe2dfcca013
7
+ data.tar.gz: 52e4ec4502499c9a831590ec0557fd418e09e0b89d2c1f11b786d6685cf8533cdf9820937bfa66778f627f8612ab2a45ac1044be79827c83b49ff4efcc942fcf
@@ -18,8 +18,6 @@
18
18
  require_relative './bucketer'
19
19
 
20
20
  module Optimizely
21
- RESERVED_ATTRIBUTE_KEY_BUCKETING_ID = "\$opt_bucketing_id"
22
-
23
21
  class DecisionService
24
22
  # Optimizely's decision service that determines into which variation of an experiment a user will be allocated.
25
23
  #
@@ -368,9 +366,9 @@ module Optimizely
368
366
  bucketing_id = user_id
369
367
 
370
368
  # If the bucketing ID key is defined in attributes, then use that in place of the userID
371
- if attributes && attributes[RESERVED_ATTRIBUTE_KEY_BUCKETING_ID].is_a?(String)
372
- unless attributes[RESERVED_ATTRIBUTE_KEY_BUCKETING_ID].empty?
373
- bucketing_id = attributes[RESERVED_ATTRIBUTE_KEY_BUCKETING_ID]
369
+ if attributes && attributes[Optimizely::Helpers::Constants::CONTROL_ATTRIBUTES['BUCKETING_ID']].is_a?(String)
370
+ unless attributes[Optimizely::Helpers::Constants::CONTROL_ATTRIBUTES['BUCKETING_ID']].empty?
371
+ bucketing_id = attributes[Optimizely::Helpers::Constants::CONTROL_ATTRIBUTES['BUCKETING_ID']]
374
372
  @config.logger.log(Logger::DEBUG, "Setting the bucketing ID '#{bucketing_id}'")
375
373
  end
376
374
  end
@@ -22,8 +22,6 @@ require_relative '../optimizely/helpers/event_tag_utils'
22
22
  require 'securerandom'
23
23
 
24
24
  module Optimizely
25
- RESERVED_ATTRIBUTE_KEY_BUCKETING_ID_EVENT_PARAM_KEY = 'optimizely_bucketing_id'
26
-
27
25
  class Event
28
26
  # Representation of an event which can be sent to the Optimizely logging endpoint.
29
27
 
@@ -58,6 +56,13 @@ module Optimizely
58
56
 
59
57
  private
60
58
 
59
+ def bot_filtering
60
+ # Get bot filtering bool
61
+ #
62
+ # Returns 'botFiltering' value in the datafile.
63
+ @config.bot_filtering
64
+ end
65
+
61
66
  def get_common_params(user_id, attributes)
62
67
  # Get params which are used in both conversion and impression events.
63
68
  #
@@ -69,33 +74,28 @@ module Optimizely
69
74
  visitor_attributes = []
70
75
 
71
76
  attributes&.keys&.each do |attribute_key|
72
- # Omit null attribute value
77
+ # Omit null attribute values
73
78
  attribute_value = attributes[attribute_key]
74
- next if attribute_value.nil?
75
-
76
- if attribute_key.eql? RESERVED_ATTRIBUTE_KEY_BUCKETING_ID
77
- # TODO: (Copied from PHP-SDK) (Alda): the type for bucketing ID attribute may change so
78
- # that custom attributes are not overloaded
79
- feature = {
80
- entity_id: RESERVED_ATTRIBUTE_KEY_BUCKETING_ID,
81
- key: RESERVED_ATTRIBUTE_KEY_BUCKETING_ID_EVENT_PARAM_KEY,
82
- type: CUSTOM_ATTRIBUTE_FEATURE_TYPE,
83
- value: attribute_value
84
- }
85
- else
86
- # Skip attributes not in the datafile
87
- attribute_id = @config.get_attribute_id(attribute_key)
88
- next unless attribute_id
89
-
90
- feature = {
91
- entity_id: attribute_id,
92
- key: attribute_key,
93
- type: CUSTOM_ATTRIBUTE_FEATURE_TYPE,
94
- value: attribute_value
95
- }
96
-
79
+ unless attribute_value.nil?
80
+ attribute_id = @config.get_attribute_id attribute_key
81
+ if attribute_id
82
+ visitor_attributes.push(
83
+ entity_id: attribute_id,
84
+ key: attribute_key,
85
+ type: CUSTOM_ATTRIBUTE_FEATURE_TYPE,
86
+ value: attribute_value
87
+ )
88
+ end
97
89
  end
98
- visitor_attributes.push(feature)
90
+ end
91
+ # Append Bot Filtering Attribute
92
+ if bot_filtering == true || bot_filtering == false
93
+ visitor_attributes.push(
94
+ entity_id: Optimizely::Helpers::Constants::CONTROL_ATTRIBUTES['BOT_FILTERING'],
95
+ key: Optimizely::Helpers::Constants::CONTROL_ATTRIBUTES['BOT_FILTERING'],
96
+ type: CUSTOM_ATTRIBUTE_FEATURE_TYPE,
97
+ value: bot_filtering
98
+ )
99
99
  end
100
100
 
101
101
  common_params = {
@@ -315,6 +315,12 @@ module Optimizely
315
315
  'VARIABLE_KEY' => 'Variable key',
316
316
  'VARIABLE_TYPE' => 'Variable type'
317
317
  }.freeze
318
+
319
+ CONTROL_ATTRIBUTES = {
320
+ 'BOT_FILTERING' => '$opt_bot_filtering',
321
+ 'BUCKETING_ID' => '$opt_bucketing_id',
322
+ 'USER_AGENT' => '$opt_user_agent'
323
+ }.freeze
318
324
  end
319
325
  end
320
326
  end
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  #
4
- # Copyright 2017, Optimizely and contributors
4
+ # Copyright 2017-2018, Optimizely and contributors
5
5
  #
6
6
  # Licensed under the Apache License, Version 2.0 (the "License");
7
7
  # you may not use this file except in compliance with the License.
@@ -86,20 +86,31 @@ module Optimizely
86
86
  false
87
87
  end
88
88
 
89
+ # @deprecated Use {#clear_notification_listeners} instead.
89
90
  def clear_notifications(notification_type)
90
- # Removes notifications for a certain notification type
91
- #
92
- # Args:
93
- # notification_type: one of the constants in NOTIFICATION_TYPES
91
+ @logger.log Logger::WARN, "'clear_notifications' is deprecated. Call 'clear_notification_listeners' instead."
92
+ clear_notification_listeners(notification_type)
93
+ end
94
94
 
95
+ # Removes notifications for a certain notification type
96
+ #
97
+ # @param notification_type - one of the constants in NOTIFICATION_TYPES
98
+
99
+ def clear_notification_listeners(notification_type)
95
100
  return nil unless notification_type_valid?(notification_type)
96
101
 
97
102
  @notifications[notification_type] = []
98
103
  @logger.log Logger::INFO, "All callbacks for notification type #{notification_type} have been removed."
99
104
  end
100
105
 
106
+ # @deprecated Use {#clear_all_notification_listeners} instead.
101
107
  def clean_all_notifications
102
- # Removes all notifications
108
+ @logger.log Logger::WARN, "'clean_all_notifications' is deprecated. Call 'clear_all_notification_listeners' instead."
109
+ clear_all_notification_listeners
110
+ end
111
+
112
+ # Removes all notifications
113
+ def clear_all_notification_listeners
103
114
  @notifications.each_key { |key| @notifications[key] = [] }
104
115
  end
105
116
 
@@ -15,6 +15,7 @@
15
15
  # limitations under the License.
16
16
  #
17
17
  require 'json'
18
+ require_relative 'helpers/constants'
18
19
  require_relative 'helpers/validator'
19
20
 
20
21
  module Optimizely
@@ -25,6 +26,7 @@ module Optimizely
25
26
  class ProjectConfig
26
27
  # Representation of the Optimizely project config.
27
28
  RUNNING_EXPERIMENT_STATUS = ['Running'].freeze
29
+ RESERVED_ATTRIBUTE_PREFIX = '$opt_'
28
30
 
29
31
  # Gets project config attributes.
30
32
  attr_reader :error_handler
@@ -41,6 +43,7 @@ module Optimizely
41
43
  attr_reader :project_id
42
44
  # Boolean - denotes if Optimizely should remove the last block of visitors' IP address before storing event data
43
45
  attr_reader :anonymize_ip
46
+ attr_reader :bot_filtering
44
47
  attr_reader :revision
45
48
  attr_reader :rollouts
46
49
  attr_reader :version
@@ -87,7 +90,8 @@ module Optimizely
87
90
  @feature_flags = config.fetch('featureFlags', [])
88
91
  @groups = config.fetch('groups', [])
89
92
  @project_id = config['projectId']
90
- @anonymize_ip = config.key? 'anonymizeIP' ? config['anonymizeIP'] : false
93
+ @anonymize_ip = config.key?('anonymizeIP') ? config['anonymizeIP'] : false
94
+ @bot_filtering = config['botFiltering']
91
95
  @revision = config['revision']
92
96
  @rollouts = config.fetch('rollouts', [])
93
97
 
@@ -363,8 +367,23 @@ module Optimizely
363
367
  end
364
368
 
365
369
  def get_attribute_id(attribute_key)
370
+ # Get attribute ID for the provided attribute key.
371
+ #
372
+ # Args:
373
+ # Attribute key for which attribute is to be fetched.
374
+ #
375
+ # Returns:
376
+ # Attribute ID corresponding to the provided attribute key.
366
377
  attribute = @attribute_key_map[attribute_key]
367
- return attribute['id'] if attribute
378
+ has_reserved_prefix = attribute_key.to_s.start_with?(RESERVED_ATTRIBUTE_PREFIX)
379
+ unless attribute.nil?
380
+ if has_reserved_prefix
381
+ @logger.log(Logger::WARN, "Attribute '#{attribute_key}' unexpectedly has reserved prefix '#{RESERVED_ATTRIBUTE_PREFIX}'; "\
382
+ 'using attribute ID instead of reserved attribute name.')
383
+ end
384
+ return attribute['id']
385
+ end
386
+ return attribute_key if has_reserved_prefix
368
387
  @logger.log Logger::ERROR, "Attribute key '#{attribute_key}' is not in datafile."
369
388
  @error_handler.handle_error InvalidAttributeError
370
389
  nil
@@ -17,5 +17,5 @@
17
17
  #
18
18
  module Optimizely
19
19
  CLIENT_ENGINE = 'ruby-sdk'
20
- VERSION = '2.0.3'
20
+ VERSION = '2.1.0'
21
21
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: optimizely-sdk
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.3
4
+ version: 2.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Optimizely
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-06-25 00:00:00.000000000 Z
11
+ date: 2018-07-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler