optimizely 1.2.1 → 1.2.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +2 -1
- data/Gemfile +1 -3
- data/Gemfile.lock +20 -5
- data/lib/optimizely/engine.rb +149 -170
- data/lib/optimizely/experiment.rb +7 -2
- data/lib/optimizely/project.rb +7 -2
- data/lib/optimizely/variation.rb +18 -13
- data/lib/optimizely/version.rb +1 -1
- data/optimizely.gemspec +8 -2
- metadata +63 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 16e4c9c9f52348b79e7fcad30925d0b718658925
|
4
|
+
data.tar.gz: 4a8b4e33663afe5bdc4f627ab040d78e08579e23
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2d9d10c4893688e1cb96fd4542e6892b510f8fda1d13e562642bba5144d8d8c0707126a8dbfdea4dc3690c47b5cfd6ed6b803a3fc270f6c0ea2119e7a36edc55
|
7
|
+
data.tar.gz: d7c300fe8d53ddb225dd9bb28eb68d7446db43c8847fb4a63cea86c8bf21a10f797965060811b9682c3c2e8fc6c57a56b09bb22ac5b7ea0add33a11314937b9f
|
data/.gitignore
CHANGED
@@ -1 +1,2 @@
|
|
1
|
-
.DS_Store
|
1
|
+
.DS_Store
|
2
|
+
*.swp
|
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
@@ -2,18 +2,33 @@ PATH
|
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
4
|
optimizely (1.2.1)
|
5
|
+
json (~> 1.8.3)
|
5
6
|
|
6
7
|
GEM
|
7
8
|
remote: http://www.rubygems.org/
|
8
9
|
specs:
|
9
|
-
|
10
|
-
|
10
|
+
coderay (1.1.0)
|
11
|
+
json (1.8.3)
|
12
|
+
method_source (0.8.2)
|
13
|
+
power_assert (0.2.4)
|
14
|
+
pry (0.10.1)
|
15
|
+
coderay (~> 1.1.0)
|
16
|
+
method_source (~> 0.8.1)
|
17
|
+
slop (~> 3.4)
|
18
|
+
rake (10.4.2)
|
19
|
+
slop (3.6.0)
|
20
|
+
test-unit (3.1.2)
|
21
|
+
power_assert
|
11
22
|
|
12
23
|
PLATFORMS
|
13
24
|
ruby
|
14
25
|
|
15
26
|
DEPENDENCIES
|
16
|
-
bundler
|
17
|
-
json
|
27
|
+
bundler (~> 1.10.6)
|
18
28
|
optimizely!
|
19
|
-
|
29
|
+
pry (~> 0.10.1)
|
30
|
+
rake (~> 10.4.2)
|
31
|
+
test-unit (~> 3.1.2)
|
32
|
+
|
33
|
+
BUNDLED WITH
|
34
|
+
1.10.6
|
data/lib/optimizely/engine.rb
CHANGED
@@ -1,24 +1,24 @@
|
|
1
1
|
module Optimizely
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
2
|
+
class Engine
|
3
|
+
|
4
|
+
BASE_URL = "https://www.optimizelyapis.com/experiment/v1/"
|
5
|
+
|
6
|
+
attr_accessor :url
|
7
|
+
|
8
|
+
# Initialize Optimizely using an API token.
|
9
|
+
#
|
10
|
+
# == Options:
|
11
|
+
# +:api_token+:: Use an API token you received before.
|
12
|
+
# +:timeout+:: Set Net:HTTP timeout in seconds (default is 300).
|
13
|
+
#
|
14
|
+
def initialize(options={})
|
15
|
+
@options = options
|
16
|
+
check_init_auth_requirements
|
17
|
+
end
|
18
|
+
|
19
|
+
# Initalize the Token so it can be used in every request we'll do later on.
|
20
|
+
# Besides that also set the authentication header.
|
21
|
+
def token=(token)
|
22
22
|
@token = token
|
23
23
|
set_headers
|
24
24
|
end
|
@@ -29,13 +29,13 @@ module Optimizely
|
|
29
29
|
# optimizely = Optimizely.new({ api_token: 'oauth2_token' })
|
30
30
|
# projects = optimizely.projects # Look up all projects.
|
31
31
|
#
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
32
|
+
def projects
|
33
|
+
if @projects.nil?
|
34
|
+
response = self.get("projects")
|
35
|
+
@projects = response.collect { |project_json| Project.new(project_json) }
|
36
|
+
end
|
37
|
+
@projects
|
38
|
+
end
|
39
39
|
|
40
40
|
# Returns the details for a specific project.
|
41
41
|
#
|
@@ -43,16 +43,13 @@ module Optimizely
|
|
43
43
|
# optimizely = Optimizely.new({ api_token: 'oauth2_token' })
|
44
44
|
# project = optimizely.project(12345) # Look up the project.
|
45
45
|
#
|
46
|
-
|
47
|
-
|
48
|
-
|
46
|
+
def project(id)
|
47
|
+
@url = "projects/#{id}"
|
48
|
+
raise OptimizelyError::NoProjectID, "A Project ID is required to retrieve the project." if id.nil?
|
49
49
|
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
end
|
54
|
-
@project
|
55
|
-
end
|
50
|
+
response = self.get(@url)
|
51
|
+
Project.new(response)
|
52
|
+
end
|
56
53
|
|
57
54
|
# Returns the list of experiments for a specified project.
|
58
55
|
#
|
@@ -60,15 +57,12 @@ module Optimizely
|
|
60
57
|
# optimizely = Optimizely.new({ api_token: 'oauth2_token' })
|
61
58
|
# experiments = optimizely.experiments(12345) # Look up all experiments for a project.
|
62
59
|
#
|
63
|
-
|
64
|
-
|
60
|
+
def experiments(project_id)
|
61
|
+
raise OptimizelyError::NoProjectID, "A Project ID is required to retrieve experiments." if project_id.nil?
|
65
62
|
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
end
|
70
|
-
@experiments
|
71
|
-
end
|
63
|
+
response = self.get("projects/#{project_id}/experiments")
|
64
|
+
response.collect { |response_json| Experiment.new(response_json) }
|
65
|
+
end
|
72
66
|
|
73
67
|
# Returns the details for a specific experiment.
|
74
68
|
#
|
@@ -76,16 +70,13 @@ module Optimizely
|
|
76
70
|
# optimizely = Optimizely.new({ api_token: 'oauth2_token' })
|
77
71
|
# experiment = optimizely.experiment(12345) # Look up the experiment.
|
78
72
|
#
|
79
|
-
|
80
|
-
|
81
|
-
|
73
|
+
def experiment(id)
|
74
|
+
@url = "experiments/#{id}"
|
75
|
+
raise OptimizelyError::NoExperimentID, "An Experiment ID is required to retrieve the experiment." if id.nil?
|
82
76
|
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
end
|
87
|
-
@experiment
|
88
|
-
end
|
77
|
+
response = self.get(@url)
|
78
|
+
Experiment.new(response)
|
79
|
+
end
|
89
80
|
|
90
81
|
# Returns the list of variations for a specified experiment.
|
91
82
|
#
|
@@ -93,15 +84,12 @@ module Optimizely
|
|
93
84
|
# optimizely = Optimizely.new({ api_token: 'oauth2_token' })
|
94
85
|
# variations = optimizely.variations(12345) # Look up all variations for an experiment.
|
95
86
|
#
|
96
|
-
|
97
|
-
|
87
|
+
def variations(experiment_id)
|
88
|
+
raise OptimizelyError::NoExperimentID, "An Experiment ID is required to retrieve variations." if experiment_id.nil?
|
98
89
|
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
end
|
103
|
-
@variations
|
104
|
-
end
|
90
|
+
response = self.get("experiments/#{experiment_id}/variations")
|
91
|
+
response.collect { |variation_json| Variation.new(variation_json) }
|
92
|
+
end
|
105
93
|
|
106
94
|
# Returns the details for a specific variation.
|
107
95
|
#
|
@@ -109,16 +97,13 @@ module Optimizely
|
|
109
97
|
# optimizely = Optimizely.new({ api_token: 'oauth2_token' })
|
110
98
|
# variation = optimizely.variation(12345) # Look up the variation.
|
111
99
|
#
|
112
|
-
|
113
|
-
|
114
|
-
|
100
|
+
def variation(id)
|
101
|
+
@url = "variations/#{id}"
|
102
|
+
raise OptimizelyError::NoVariationID, "A Variation ID is required to retrieve the variation." if id.nil?
|
115
103
|
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
end
|
120
|
-
@variation
|
121
|
-
end
|
104
|
+
response = self.get(@url)
|
105
|
+
Variation.new(response)
|
106
|
+
end
|
122
107
|
|
123
108
|
# Returns the list of audiences for a specified project.
|
124
109
|
#
|
@@ -126,15 +111,12 @@ module Optimizely
|
|
126
111
|
# optimizely = Optimizely.new({ api_token: 'oauth2_token' })
|
127
112
|
# audiences = optimizely.audiences(12345) # Look up all audiences for a project.
|
128
113
|
#
|
129
|
-
|
130
|
-
|
114
|
+
def audiences(project_id)
|
115
|
+
raise OptimizelyError::NoProjectID, "A Project ID is required to retrieve audiences." if project_id.nil?
|
131
116
|
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
end
|
136
|
-
@audiences
|
137
|
-
end
|
117
|
+
response = self.get("projects/#{project_id}/audiences")
|
118
|
+
response.collect { |audience_json| Audience.new(audience_json) }
|
119
|
+
end
|
138
120
|
|
139
121
|
# Returns the details for a specific audience.
|
140
122
|
#
|
@@ -142,78 +124,75 @@ module Optimizely
|
|
142
124
|
# optimizely = Optimizely.new({ api_token: 'oauth2_token' })
|
143
125
|
# audience = optimizely.audience(12345) # Look up the audience.
|
144
126
|
#
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
response = https.request(request)
|
165
|
-
|
166
|
-
# Response code error checking
|
127
|
+
def audience(id)
|
128
|
+
@url = "audiences/#{id}"
|
129
|
+
raise OptimizelyError::NoAudienceID, "An Audience ID is required to retrieve the audience." if id.nil?
|
130
|
+
|
131
|
+
response = self.get(@url)
|
132
|
+
Audience.new(response)
|
133
|
+
end
|
134
|
+
|
135
|
+
# Return the parsed JSON data for a request that is done to the Optimizely REST API.
|
136
|
+
def get(url)
|
137
|
+
uri = URI.parse("#{BASE_URL}#{url}/")
|
138
|
+
https = Net::HTTP.new(uri.host, uri.port)
|
139
|
+
https.read_timeout = @options[:timeout] if @options[:timeout]
|
140
|
+
https.verify_mode = OpenSSL::SSL::VERIFY_NONE
|
141
|
+
https.use_ssl = true
|
142
|
+
request = Net::HTTP::Get.new(uri.request_uri, @headers)
|
143
|
+
response = https.request(request)
|
144
|
+
|
145
|
+
# Response code error checking
|
167
146
|
if response.code != '200'
|
168
147
|
check_response(response.code, response.body)
|
169
148
|
else
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
149
|
+
parse_json(response.body)
|
150
|
+
end
|
151
|
+
end
|
152
|
+
|
153
|
+
def post
|
154
|
+
uri = URI.parse("#{BASE_URL}#{url}/")
|
155
|
+
https = Net::HTTP.new(uri.host, uri.port)
|
156
|
+
https.read_timeout = @options[:timeout] if @options[:timeout]
|
157
|
+
https.verify_mode = OpenSSL::SSL::VERIFY_NONE
|
158
|
+
https.use_ssl = true
|
159
|
+
request = Net::HTTP::Post.new(uri.request_uri, @headers)
|
160
|
+
response = https.request(request)
|
161
|
+
|
162
|
+
# Response code error checking
|
184
163
|
check_response(response.code, response.body) if response.code != '201'
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
164
|
+
end
|
165
|
+
|
166
|
+
def put
|
167
|
+
uri = URI.parse("#{BASE_URL}#{url}/")
|
168
|
+
https = Net::HTTP.new(uri.host, uri.port)
|
169
|
+
https.read_timeout = @options[:timeout] if @options[:timeout]
|
170
|
+
https.verify_mode = OpenSSL::SSL::VERIFY_NONE
|
171
|
+
https.use_ssl = true
|
172
|
+
request = Net::HTTP::Put.new(uri.request_uri, @headers)
|
173
|
+
response = https.request(request)
|
174
|
+
|
175
|
+
# Response code error checking
|
197
176
|
check_response(response.code, response.body) if response.code != '202'
|
198
|
-
|
177
|
+
end
|
199
178
|
|
200
|
-
|
201
|
-
|
179
|
+
def delete
|
180
|
+
raise OptimizelyError::NoId, "An ID is required to delete data." if @url.nil?
|
202
181
|
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
182
|
+
uri = URI.parse("#{BASE_URL}#{@url}")
|
183
|
+
https = Net::HTTP.new(uri.host, uri.port)
|
184
|
+
https.read_timeout = @options[:timeout] if @options[:timeout]
|
185
|
+
https.verify_mode = OpenSSL::SSL::VERIFY_NONE
|
186
|
+
https.use_ssl = true
|
187
|
+
request = Net::HTTP::Delete.new(uri.request_uri, @headers)
|
188
|
+
response = https.request(request)
|
210
189
|
|
211
|
-
|
190
|
+
# Response code error checking
|
212
191
|
check_response(response.code, response.body) if response.code != '204'
|
213
|
-
|
192
|
+
end
|
214
193
|
|
215
|
-
|
216
|
-
|
194
|
+
def check_response(code, body)
|
195
|
+
case code
|
217
196
|
when '400'
|
218
197
|
raise OptimizelyError::BadRequest, body + "Your request was not sent in valid JSON. (status code: #{code})."
|
219
198
|
when '401'
|
@@ -221,37 +200,37 @@ module Optimizely
|
|
221
200
|
when '403'
|
222
201
|
raise OptimizelyError::Forbidden, body + "You provided an API token but it was invalid or revoked, or if you don't have read/ write access to the entity you're trying to view/edit (status code: #{code})."
|
223
202
|
when '404'
|
224
|
-
|
203
|
+
raise OptimizelyError::NotFound, body + "The id used in the request was inaccurate or you didn't have permission to view/edit it (status code: #{code})."
|
225
204
|
else
|
226
205
|
raise OptimizelyError::UnknownError, body + " (status code: #{code})."
|
227
206
|
end
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
|
244
|
-
|
245
|
-
|
246
|
-
|
247
|
-
|
248
|
-
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
|
253
|
-
|
254
|
-
|
255
|
-
|
256
|
-
|
207
|
+
end
|
208
|
+
|
209
|
+
|
210
|
+
private
|
211
|
+
|
212
|
+
|
213
|
+
# If there is no API token or an empty API token raise an exception.
|
214
|
+
def check_init_auth_requirements
|
215
|
+
if @options[:api_token].nil? || @options[:api_token].empty?
|
216
|
+
raise OptimizelyError::NoAPIToken, "An API token is required to initialize Optimizely."
|
217
|
+
else
|
218
|
+
self.token = @options[:api_token]
|
219
|
+
end
|
220
|
+
end
|
221
|
+
|
222
|
+
# As the authentication for the Optimizely Experiments API is handled via the
|
223
|
+
# Token header in every request we set the header + also make clear we expect JSON.
|
224
|
+
def set_headers
|
225
|
+
@headers = {}
|
226
|
+
@headers['Token'] = @token
|
227
|
+
@headers['Content-Type'] = "application/json"
|
228
|
+
end
|
229
|
+
|
230
|
+
# Parse the JSON data that's been requested through the get method.
|
231
|
+
def parse_json(data)
|
232
|
+
json = JSON.parse(data)
|
233
|
+
json
|
234
|
+
end
|
235
|
+
end
|
257
236
|
end
|
@@ -1,9 +1,10 @@
|
|
1
1
|
module Optimizely
|
2
|
-
|
2
|
+
class Experiment
|
3
3
|
|
4
4
|
attr_reader :id, :project_id, :variation_ids, :edit_url, :status
|
5
5
|
|
6
6
|
def initialize(json)
|
7
|
+
@json = json
|
7
8
|
@id = json['id']
|
8
9
|
@project_id = json['project_id']
|
9
10
|
@variation_ids = json['variation_ids']
|
@@ -11,5 +12,9 @@ module Optimizely
|
|
11
12
|
@status = json['status']
|
12
13
|
end
|
13
14
|
|
14
|
-
|
15
|
+
def [](x)
|
16
|
+
return @json[x]
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
15
20
|
end
|
data/lib/optimizely/project.rb
CHANGED
@@ -1,14 +1,19 @@
|
|
1
1
|
module Optimizely
|
2
|
-
|
2
|
+
class Project
|
3
3
|
|
4
4
|
attr_reader :project_name, :project_status, :id, :account_id
|
5
5
|
|
6
6
|
def initialize(json)
|
7
|
+
@json = json
|
7
8
|
@project_name = json['project_name']
|
8
9
|
@project_status = json['project_status']
|
9
10
|
@id = json['id']
|
10
11
|
@account_id = json['account_id']
|
11
12
|
end
|
12
13
|
|
13
|
-
|
14
|
+
def [](x)
|
15
|
+
return @json[x]
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
14
19
|
end
|
data/lib/optimizely/variation.rb
CHANGED
@@ -1,21 +1,26 @@
|
|
1
1
|
module Optimizely
|
2
|
-
|
2
|
+
class Variation
|
3
3
|
|
4
4
|
attr_reader :is_paused, :description, :weight, :created, :variation_id,
|
5
|
-
|
5
|
+
:section_id, :js_component, :experiment_id, :project_id, :id
|
6
6
|
|
7
7
|
def initialize(json)
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
8
|
+
@json = json
|
9
|
+
@is_paused = json['is_paused']
|
10
|
+
@description = json['description']
|
11
|
+
@weight = json['weight']
|
12
|
+
@created = DateTime.parse(json['created'])
|
13
|
+
@variation_id = json['variation_id']
|
14
|
+
@section_id = json['section_id']
|
15
|
+
@js_component = json['js_component']
|
16
|
+
@experiment_id = json['experiment_id']
|
17
|
+
@project_id = json['project_id']
|
18
|
+
@id = json['id']
|
18
19
|
end
|
19
20
|
|
20
|
-
|
21
|
+
def [](x)
|
22
|
+
return @json[x]
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
21
26
|
end
|
data/lib/optimizely/version.rb
CHANGED
data/optimizely.gemspec
CHANGED
@@ -17,5 +17,11 @@ Gem::Specification.new do |s|
|
|
17
17
|
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
18
18
|
s.require_paths = ["lib"]
|
19
19
|
s.extra_rdoc_files = ["README.md"]
|
20
|
-
|
21
|
-
|
20
|
+
|
21
|
+
s.add_runtime_dependency 'json', '~> 1.8.3'
|
22
|
+
|
23
|
+
s.add_development_dependency 'bundler', '~> 1.10.6'
|
24
|
+
s.add_development_dependency 'rake', '~> 10.4.2'
|
25
|
+
s.add_development_dependency 'test-unit', '~> 3.1.2'
|
26
|
+
s.add_development_dependency 'pry', '~> 0.10.1'
|
27
|
+
end
|
metadata
CHANGED
@@ -1,29 +1,85 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: optimizely
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.2.
|
4
|
+
version: 1.2.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Martijn Scheijbeler
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2015-07-31 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: json
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ~>
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 1.8.3
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ~>
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 1.8.3
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: bundler
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ~>
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: 1.10.6
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ~>
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: 1.10.6
|
13
41
|
- !ruby/object:Gem::Dependency
|
14
42
|
name: rake
|
15
43
|
requirement: !ruby/object:Gem::Requirement
|
16
44
|
requirements:
|
17
|
-
- -
|
45
|
+
- - ~>
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: 10.4.2
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ~>
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: 10.4.2
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: test-unit
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ~>
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: 3.1.2
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ~>
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: 3.1.2
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: pry
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ~>
|
18
74
|
- !ruby/object:Gem::Version
|
19
|
-
version:
|
75
|
+
version: 0.10.1
|
20
76
|
type: :development
|
21
77
|
prerelease: false
|
22
78
|
version_requirements: !ruby/object:Gem::Requirement
|
23
79
|
requirements:
|
24
|
-
- -
|
80
|
+
- - ~>
|
25
81
|
- !ruby/object:Gem::Version
|
26
|
-
version:
|
82
|
+
version: 0.10.1
|
27
83
|
description: A Ruby gem to communicate with the Optimizely Experiments API, it lets
|
28
84
|
you create and manage Optimizely projects and experiments.
|
29
85
|
email: martijn@marusem.com
|
@@ -67,7 +123,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
67
123
|
version: '0'
|
68
124
|
requirements: []
|
69
125
|
rubyforge_project:
|
70
|
-
rubygems_version: 2.
|
126
|
+
rubygems_version: 2.4.2
|
71
127
|
signing_key:
|
72
128
|
specification_version: 4
|
73
129
|
summary: The Optimizely Experiment API lets you create and manage Optimizely projects
|