optimizely-sdk 2.1.1 → 3.0.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.
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  #
4
- # Copyright 2016-2018, Optimizely and contributors
4
+ # Copyright 2016-2019, 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.
@@ -17,5 +17,5 @@
17
17
  #
18
18
  module Optimizely
19
19
  CLIENT_ENGINE = 'ruby-sdk'
20
- VERSION = '2.1.1'
20
+ VERSION = '3.0.0'
21
21
  end
metadata CHANGED
@@ -1,71 +1,99 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: optimizely-sdk
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.1.1
4
+ version: 3.0.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-10-11 00:00:00.000000000 Z
11
+ date: 2019-03-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - "~>"
17
+ - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: '1.10'
19
+ version: '0'
20
20
  type: :development
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - "~>"
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: coveralls
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
25
32
  - !ruby/object:Gem::Version
26
- version: '1.10'
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
27
41
  - !ruby/object:Gem::Dependency
28
42
  name: rake
29
43
  requirement: !ruby/object:Gem::Requirement
30
44
  requirements:
31
- - - "~>"
45
+ - - ">="
32
46
  - !ruby/object:Gem::Version
33
- version: '12.0'
47
+ version: '0'
34
48
  type: :development
35
49
  prerelease: false
36
50
  version_requirements: !ruby/object:Gem::Requirement
37
51
  requirements:
38
- - - "~>"
52
+ - - ">="
39
53
  - !ruby/object:Gem::Version
40
- version: '12.0'
54
+ version: '0'
41
55
  - !ruby/object:Gem::Dependency
42
56
  name: rspec
43
57
  requirement: !ruby/object:Gem::Requirement
44
58
  requirements:
45
- - - "~>"
59
+ - - ">="
46
60
  - !ruby/object:Gem::Version
47
- version: 3.8.0
61
+ version: '0'
48
62
  type: :development
49
63
  prerelease: false
50
64
  version_requirements: !ruby/object:Gem::Requirement
51
65
  requirements:
52
- - - "~>"
66
+ - - ">="
53
67
  - !ruby/object:Gem::Version
54
- version: 3.8.0
68
+ version: '0'
55
69
  - !ruby/object:Gem::Dependency
56
70
  name: rubocop
57
71
  requirement: !ruby/object:Gem::Requirement
58
72
  requirements:
59
73
  - - "~>"
60
74
  - !ruby/object:Gem::Version
61
- version: 0.58.0
75
+ version: '0.62'
62
76
  type: :development
63
77
  prerelease: false
64
78
  version_requirements: !ruby/object:Gem::Requirement
65
79
  requirements:
66
80
  - - "~>"
67
81
  - !ruby/object:Gem::Version
68
- version: 0.58.0
82
+ version: '0.62'
83
+ - !ruby/object:Gem::Dependency
84
+ name: webmock
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
69
97
  - !ruby/object:Gem::Dependency
70
98
  name: httparty
71
99
  requirement: !ruby/object:Gem::Requirement
@@ -118,7 +146,8 @@ files:
118
146
  - lib/optimizely.rb
119
147
  - lib/optimizely/audience.rb
120
148
  - lib/optimizely/bucketer.rb
121
- - lib/optimizely/condition.rb
149
+ - lib/optimizely/condition_tree_evaluator.rb
150
+ - lib/optimizely/custom_attribute_condition_evaluator.rb
122
151
  - lib/optimizely/decision_service.rb
123
152
  - lib/optimizely/error_handler.rb
124
153
  - lib/optimizely/event_builder.rb
@@ -155,7 +184,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
155
184
  version: '0'
156
185
  requirements: []
157
186
  rubyforge_project:
158
- rubygems_version: 2.5.1
187
+ rubygems_version: 2.6.14
159
188
  signing_key:
160
189
  specification_version: 4
161
190
  summary: Ruby SDK for Optimizely's testing framework
@@ -1,135 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- #
4
- # Copyright 2016-2017, Optimizely and contributors
5
- #
6
- # Licensed under the Apache License, Version 2.0 (the "License");
7
- # you may not use this file except in compliance with the License.
8
- # You may obtain a copy of the License at
9
- #
10
- # http://www.apache.org/licenses/LICENSE-2.0
11
- #
12
- # Unless required by applicable law or agreed to in writing, software
13
- # distributed under the License is distributed on an "AS IS" BASIS,
14
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
- # See the License for the specific language governing permissions and
16
- # limitations under the License.
17
- #
18
- require 'json'
19
-
20
- module Optimizely
21
- class ConditionalOperatorTypes
22
- AND = 'and'
23
- OR = 'or'
24
- NOT = 'not'
25
- end
26
-
27
- class ConditionEvaluator
28
- DEFAULT_OPERATOR_TYPES = [
29
- ConditionalOperatorTypes::AND,
30
- ConditionalOperatorTypes::OR,
31
- ConditionalOperatorTypes::NOT
32
- ].freeze
33
-
34
- attr_reader :user_attributes
35
-
36
- def initialize(user_attributes)
37
- @user_attributes = user_attributes
38
- end
39
-
40
- def and_evaluator(conditions)
41
- # Evaluates an array of conditions as if the evaluator had been applied
42
- # to each entry and the results AND-ed together.
43
- #
44
- # conditions - Array of conditions ex: [operand_1, operand_2]
45
- #
46
- # Returns boolean true if all operands evaluate to true.
47
-
48
- conditions.each do |condition|
49
- result = evaluate(condition)
50
- return result if result == false
51
- end
52
-
53
- true
54
- end
55
-
56
- def or_evaluator(conditions)
57
- # Evaluates an array of conditions as if the evaluator had been applied
58
- # to each entry and the results AND-ed together.
59
- #
60
- # conditions - Array of conditions ex: [operand_1, operand_2]
61
- #
62
- # Returns boolean true if any operand evaluates to true.
63
-
64
- conditions.each do |condition|
65
- result = evaluate(condition)
66
- return result if result == true
67
- end
68
-
69
- false
70
- end
71
-
72
- def not_evaluator(single_condition)
73
- # Evaluates an array of conditions as if the evaluator had been applied
74
- # to a single entry and NOT was applied to the result.
75
- #
76
- # single_condition - Array of a single condition ex: [operand_1]
77
- #
78
- # Returns boolean true if the operand evaluates to false.
79
-
80
- return false if single_condition.length != 1
81
-
82
- !evaluate(single_condition[0])
83
- end
84
-
85
- def evaluator(condition_array)
86
- # Method to compare single audience condition against provided user data i.e. attributes.
87
- #
88
- # condition_array - Array consisting of condition key and corresponding value.
89
- #
90
- # Returns boolean indicating the result of comparing the condition value against the user attributes.
91
-
92
- condition_array[1] == @user_attributes[condition_array[0]]
93
- end
94
-
95
- def evaluate(conditions)
96
- # Top level method to evaluate audience conditions.
97
- #
98
- # conditions - Nested array of and/or conditions.
99
- # Example: ['and', operand_1, ['or', operand_2, operand_3]]
100
- #
101
- # Returns boolean result of evaluating the conditions evaluated.
102
-
103
- if conditions.is_a? Array
104
- operator_type = conditions[0]
105
- return false unless DEFAULT_OPERATOR_TYPES.include?(operator_type)
106
- case operator_type
107
- when ConditionalOperatorTypes::AND
108
- return and_evaluator(conditions[1..-1])
109
- when ConditionalOperatorTypes::OR
110
- return or_evaluator(conditions[1..-1])
111
- when ConditionalOperatorTypes::NOT
112
- return not_evaluator(conditions[1..-1])
113
- end
114
- end
115
-
116
- # Create array of condition key and corresponding value of audience condition.
117
- condition_array = audience_condition_deserializer(conditions)
118
-
119
- # Compare audience condition against provided user data i.e. attributes.
120
- evaluator(condition_array)
121
- end
122
-
123
- private
124
-
125
- def audience_condition_deserializer(condition)
126
- # Deserializer defining how hashes need to be decoded for audience conditions.
127
- #
128
- # condition - Hash representing one audience condition.
129
- #
130
- # Returns array consisting of condition key and corresponding value.
131
-
132
- [condition['name'], condition['value']]
133
- end
134
- end
135
- end