eeny-meeny 2.2.2 → 2.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/.rspec +3 -0
- data/.simplecov +16 -0
- data/.travis.yml +3 -6
- data/CHANGELOG.md +8 -0
- data/Gemfile +0 -4
- data/README.md +1 -1
- data/eeny-meeny.gemspec +4 -4
- data/lib/eeny-meeny/{experiment_helper.rb → helpers/experiment_helper.rb} +6 -0
- data/lib/eeny-meeny/middleware.rb +1 -1
- data/lib/eeny-meeny/models/experiment.rb +10 -4
- data/lib/eeny-meeny/railtie.rb +8 -4
- data/lib/eeny-meeny/version.rb +1 -1
- data/lib/tasks/cookie.rake +1 -1
- data/spec/eeny-meeny/experiment_helper_spec.rb +1 -2
- data/spec/eeny-meeny/middleware_spec.rb +7 -4
- data/spec/eeny-meeny/models/cookie_spec.rb +0 -1
- data/spec/eeny-meeny/models/experiment_spec.rb +7 -2
- data/spec/eeny-meeny/models/variation_spec.rb +0 -1
- data/spec/fixtures/experiments.yml +10 -0
- data/spec/spec_helper.rb +1 -15
- data/spec/tasks/cookie_task_spec.rb +0 -1
- metadata +12 -11
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: eb901520367109f3167e217522a3b712ae71167e04c0458d4dac2b0907b541bc
|
4
|
+
data.tar.gz: b360de703e230a8aef6fb7ec7211fe24aa2f79007bb2c3344591a452b40d26ae
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f9e244e1ba2895921276b2fe070689a2694296ce8db150e0f9ddde380608d65e5cda63afe6e130981da0c7eed3e5e32eb67e28b021cfc38cbf8d931d23b4a8e3
|
7
|
+
data.tar.gz: e84d5450b37db881191650f259a9abe353d63e8ab8cbdda3c666932029ad78774281f8d99ea73491c74f1807d3aad7dce6908b678c779b888b1c79a32b7c3b2d
|
data/.rspec
ADDED
data/.simplecov
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'simplecov-rcov'
|
4
|
+
|
5
|
+
formatters = [
|
6
|
+
SimpleCov::Formatter::HTMLFormatter,
|
7
|
+
SimpleCov::Formatter::RcovFormatter
|
8
|
+
]
|
9
|
+
SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter.new(formatters)
|
10
|
+
SimpleCov.add_group('Lib', 'lib')
|
11
|
+
SimpleCov.add_group('Helpers', 'lib/eeny-meeny/helpers')
|
12
|
+
SimpleCov.add_group('Models', 'lib/eeny-meeny/models')
|
13
|
+
SimpleCov.add_group('Routing', 'lib/eeny-meeny/routing')
|
14
|
+
SimpleCov.add_group('Rake Tasks', 'lib/tasks')
|
15
|
+
SimpleCov.add_group('Specs', 'spec')
|
16
|
+
SimpleCov.start
|
data/.travis.yml
CHANGED
data/CHANGELOG.md
CHANGED
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -3,7 +3,7 @@ eeny-meeny
|
|
3
3
|
[![Gem Version](https://badge.fury.io/rb/eeny-meeny.svg)](https://badge.fury.io/rb/eeny-meeny)
|
4
4
|
[![Code Climate](https://codeclimate.com/github/corthmann/eeny-meeny/badges/gpa.svg)](https://codeclimate.com/github/corthmann/eeny-meeny)
|
5
5
|
[![Test Coverage](https://codeclimate.com/github/corthmann/eeny-meeny/badges/coverage.svg)](https://codeclimate.com/github/corthmann/eeny-meeny/coverage)
|
6
|
-
[![Build Status](https://travis-ci.
|
6
|
+
[![Build Status](https://travis-ci.com/corthmann/eeny-meeny.svg?branch=master)](https://travis-ci.com/corthmann/eeny-meeny)
|
7
7
|
|
8
8
|
Installation
|
9
9
|
-------------
|
data/eeny-meeny.gemspec
CHANGED
@@ -3,7 +3,7 @@ require File.expand_path('../lib/eeny-meeny/version', __FILE__)
|
|
3
3
|
Gem::Specification.new do |s|
|
4
4
|
s.name = 'eeny-meeny'
|
5
5
|
s.version = EenyMeeny::VERSION.dup
|
6
|
-
s.date = '
|
6
|
+
s.date = '2021-08-11'
|
7
7
|
s.summary = "A simple split and smoke testing tool for Rails"
|
8
8
|
s.authors = ["Christian Orthmann"]
|
9
9
|
s.email = 'christian.orthmann@gmail.com'
|
@@ -13,12 +13,12 @@ Gem::Specification.new do |s|
|
|
13
13
|
s.homepage = 'http://rubygems.org/gems/eeny-meeny'
|
14
14
|
s.license = 'MIT'
|
15
15
|
|
16
|
-
s.add_development_dependency('rake', '~>
|
16
|
+
s.add_development_dependency('rake', '~> 13')
|
17
17
|
s.add_development_dependency('rspec', '~> 3')
|
18
18
|
s.add_development_dependency('simplecov', '~> 0')
|
19
19
|
s.add_development_dependency('simplecov-rcov', '~> 0')
|
20
20
|
s.add_development_dependency('yard', '>= 0.9.11', '< 1.0.0')
|
21
|
-
s.add_development_dependency('rack-test', '~>
|
21
|
+
s.add_development_dependency('rack-test', '~> 1')
|
22
22
|
s.add_runtime_dependency('rack', '>= 1.2.1', '< 3')
|
23
|
-
s.add_runtime_dependency('activesupport', '>= 3.0.0', '< 6.
|
23
|
+
s.add_runtime_dependency('activesupport', '>= 3.0.0', '< 6.2.0')
|
24
24
|
end
|
@@ -1,7 +1,13 @@
|
|
1
|
+
require 'active_support/concern'
|
1
2
|
require 'eeny-meeny/models/cookie'
|
2
3
|
require 'eeny-meeny/models/experiment'
|
3
4
|
|
4
5
|
module EenyMeeny::ExperimentHelper
|
6
|
+
extend ActiveSupport::Concern
|
7
|
+
|
8
|
+
included do
|
9
|
+
helper_method :participates_in?, :smoke_test?
|
10
|
+
end
|
5
11
|
|
6
12
|
def participates_in?(experiment_id, variation_id: nil)
|
7
13
|
experiment = EenyMeeny::Experiment.find_by_id(experiment_id)
|
@@ -85,7 +85,7 @@ module EenyMeeny
|
|
85
85
|
# Skip if no valid 'smoke_test_id' query parameter present
|
86
86
|
return env, new_cookies unless query_parameters.key?('smoke_test_id') && (query_parameters['smoke_test_id'] =~ /\A[A-Za-z_]+\z/)
|
87
87
|
# Set HTTP_COOKIE header to enable smoke test on first pageview
|
88
|
-
cookie = EenyMeeny::Cookie.create_for_smoke_test(query_parameters['smoke_test_id'],
|
88
|
+
cookie = EenyMeeny::Cookie.create_for_smoke_test(query_parameters['smoke_test_id'], **@cookie_config)
|
89
89
|
env = add_or_replace_http_cookie(env, cookie)
|
90
90
|
new_cookies[cookie.name] = cookie
|
91
91
|
return env, new_cookies
|
@@ -1,3 +1,4 @@
|
|
1
|
+
require 'eeny-meeny/models/cookie'
|
1
2
|
require 'eeny-meeny/models/variation'
|
2
3
|
require 'active_support/time'
|
3
4
|
require 'active_support/core_ext/enumerable'
|
@@ -5,7 +6,9 @@ require 'active_support/core_ext/enumerable'
|
|
5
6
|
module EenyMeeny
|
6
7
|
class Experiment
|
7
8
|
|
8
|
-
COOKIE_EXPERIMENT_ID_REGEX =
|
9
|
+
COOKIE_EXPERIMENT_ID_REGEX = Regexp.new(
|
10
|
+
"\\A#{EenyMeeny::Cookie::EXPERIMENT_PREFIX}(.+)_v(\\d+)\\z"
|
11
|
+
).freeze
|
9
12
|
|
10
13
|
attr_reader :id, :name, :version, :variations, :total_weight, :end_at, :start_at
|
11
14
|
|
@@ -23,9 +26,12 @@ module EenyMeeny
|
|
23
26
|
end
|
24
27
|
|
25
28
|
def self.find_by_cookie_name(cookie_name)
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
+
return unless cookie_name =~ COOKIE_EXPERIMENT_ID_REGEX
|
30
|
+
|
31
|
+
experiment = find_by_id($1)
|
32
|
+
return unless experiment && experiment.version.to_s == $2
|
33
|
+
|
34
|
+
experiment
|
29
35
|
end
|
30
36
|
|
31
37
|
def initialize(id, name: '', version: 1, variations: {}, start_at: nil, end_at: nil)
|
data/lib/eeny-meeny/railtie.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
require 'eeny-meeny'
|
2
|
-
require 'eeny-meeny/experiment_helper'
|
3
2
|
require 'eeny-meeny/middleware'
|
3
|
+
require 'eeny-meeny/helpers/experiment_helper'
|
4
4
|
|
5
5
|
module EenyMeeny
|
6
6
|
class Railtie < Rails::Railtie
|
@@ -15,13 +15,17 @@ module EenyMeeny
|
|
15
15
|
config.secure = app.config.eeny_meeny[:secure] if app.config.eeny_meeny.key?(:secure)
|
16
16
|
config.query_parameters = app.config.eeny_meeny[:query_parameters] if app.config.eeny_meeny.key?(:query_parameters)
|
17
17
|
end
|
18
|
-
# Include Helpers in ActionController and ActionView
|
19
|
-
ActionController::Base.send :include, EenyMeeny::ExperimentHelper
|
20
|
-
ActionView::Base.send :include, EenyMeeny::ExperimentHelper
|
21
18
|
# Insert Middleware
|
22
19
|
app.middleware.insert_before ActionDispatch::Cookies, EenyMeeny::Middleware
|
23
20
|
end
|
24
21
|
|
22
|
+
config.to_prepare do
|
23
|
+
# Include Helpers in ActionController and ActionView
|
24
|
+
ActiveSupport.on_load(:action_controller_base) do
|
25
|
+
include EenyMeeny::ExperimentHelper
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
25
29
|
rake_tasks do
|
26
30
|
load 'tasks/cookie.rake'
|
27
31
|
end
|
data/lib/eeny-meeny/version.rb
CHANGED
data/lib/tasks/cookie.rake
CHANGED
@@ -38,7 +38,7 @@ namespace :eeny_meeny do
|
|
38
38
|
raise "Missing 'smoke_test_id' parameter" if (args['smoke_test_id'].nil? || args['smoke_test_id'].empty?)
|
39
39
|
smoke_test_id = args['smoke_test_id']
|
40
40
|
version = args['version'] || 1
|
41
|
-
cookie = EenyMeeny::Cookie.create_for_smoke_test(smoke_test_id, EenyMeeny.config.cookies.merge(version: version))
|
41
|
+
cookie = EenyMeeny::Cookie.create_for_smoke_test(smoke_test_id, **EenyMeeny.config.cookies.merge(version: version))
|
42
42
|
puts cookie
|
43
43
|
end
|
44
44
|
end
|
@@ -1,4 +1,3 @@
|
|
1
|
-
require 'spec_helper'
|
2
1
|
require 'eeny-meeny/models/encryptor'
|
3
2
|
require 'eeny-meeny/middleware'
|
4
3
|
|
@@ -55,7 +54,7 @@ describe EenyMeeny::Middleware do
|
|
55
54
|
let(:request) { Rack::MockRequest.new(subject) }
|
56
55
|
|
57
56
|
before(:example) do
|
58
|
-
@original_request_cookies = 'test=abc;eeny_meeny_my_page_v1=on1tOQ5hiKdA0biVZVwvTUQcmkODacwdpi%2FedQJIYQz9KdWYAXqzCafF5Dqqa6xtHFBdXYVmz%2Bp4%2FigmKz4hBVYZbJU%2FMwBbvYG%2BIoBelk10PxwtyxbA%2BiDzFT4jZeiTkNOmZ3rp1Gzz74JjT4aocqB187p7SrpeM2jfyZ8ZKPOiZs6tXf0QoXkV%2BZbtxJLRPr5lgmGxslfM8vCIm1%2F0HQ%3D%3D;'
|
57
|
+
@original_request_cookies = 'test=abc;eeny_meeny_my_page_v1=on1tOQ5hiKdA0biVZVwvTUQcmkODacwdpi%2FedQJIYQz9KdWYAXqzCafF5Dqqa6xtHFBdXYVmz%2Bp4%2FigmKz4hBVYZbJU%2FMwBbvYG%2BIoBelk10PxwtyxbA%2BiDzFT4jZeiTkNOmZ3rp1Gzz74JjT4aocqB187p7SrpeM2jfyZ8ZKPOiZs6tXf0QoXkV%2BZbtxJLRPr5lgmGxslfM8vCIm1%2F0HQ%3D%3D;eeny_meeny_versioned_v3=UUgXwn3j0%2BOL2cpov4duTnuCJPc621yHd6GjuXpN0gnYLDASTsDpyk01CnFY5ZYCAo%2BgLO%2BwTbsYObP8dp30rA%3D%3D;'
|
59
58
|
@response = request.get('/test',
|
60
59
|
'CONTENT_TYPE' => 'text/plain',
|
61
60
|
'HTTP_COOKIE' => @original_request_cookies)
|
@@ -72,9 +71,13 @@ describe EenyMeeny::Middleware do
|
|
72
71
|
|
73
72
|
context 'and the request contains a cookie from an undefined experiment' do
|
74
73
|
let(:request) { Rack::MockRequest.new(subject) }
|
74
|
+
let(:cookie_value) { 'eeny_meeny_undefined_experiment_v1=thevaluedoesntmatter' }
|
75
|
+
let(:return_value) do
|
76
|
+
"#{cookie_value}; path=/; max-age=0; expires=Thu, 01 Jan 1970 00:00:00 GMT; SameSite=Strict"
|
77
|
+
end
|
75
78
|
|
76
79
|
before(:example) do
|
77
|
-
@original_request_cookies =
|
80
|
+
@original_request_cookies = "test=abc;#{cookie_value};"
|
78
81
|
@response = request.get('/test',
|
79
82
|
'CONTENT_TYPE' => 'text/plain',
|
80
83
|
'HTTP_COOKIE' => @original_request_cookies)
|
@@ -82,7 +85,7 @@ describe EenyMeeny::Middleware do
|
|
82
85
|
|
83
86
|
|
84
87
|
it "instructs the browser to remove through the 'Set-Cookie' header on the response" do
|
85
|
-
expect(@response['Set-Cookie']).to include(
|
88
|
+
expect(@response['Set-Cookie']).to include(return_value)
|
86
89
|
end
|
87
90
|
end
|
88
91
|
|
@@ -1,4 +1,3 @@
|
|
1
|
-
require 'spec_helper'
|
2
1
|
require 'eeny-meeny/models/experiment'
|
3
2
|
require 'eeny-meeny/models/variation'
|
4
3
|
|
@@ -158,7 +157,7 @@ describe EenyMeeny::Experiment do
|
|
158
157
|
it 'returns those experiments' do
|
159
158
|
instances = described_class.find_all
|
160
159
|
expect(instances).to be_a Array
|
161
|
-
expect(instances.size).to eq(
|
160
|
+
expect(instances.size).to eq(3)
|
162
161
|
instances.each do |instance|
|
163
162
|
expect(instance).to be_a EenyMeeny::Experiment
|
164
163
|
end
|
@@ -213,6 +212,12 @@ describe EenyMeeny::Experiment do
|
|
213
212
|
end
|
214
213
|
end
|
215
214
|
|
215
|
+
context 'when the given cookie name does not match the experiment version' do
|
216
|
+
it 'returns the experiment' do
|
217
|
+
expect(described_class.find_by_cookie_name(:eeny_meeny_versioned_v2)).to be_nil
|
218
|
+
end
|
219
|
+
end
|
220
|
+
|
216
221
|
context 'when the given cookie name does not match a configured experiment' do
|
217
222
|
it 'returns nil' do
|
218
223
|
expect(described_class.find_by_cookie_name(:eeny_meeny_undefined_experiment_v2)).to be_nil
|
@@ -8,6 +8,16 @@
|
|
8
8
|
:new:
|
9
9
|
:name: New My Page
|
10
10
|
:weight: 0.98
|
11
|
+
:versioned:
|
12
|
+
:name: Versioned
|
13
|
+
:version: 3
|
14
|
+
:variations:
|
15
|
+
:old:
|
16
|
+
:name: Old Versioned Page
|
17
|
+
:weight: 0.02
|
18
|
+
:new:
|
19
|
+
:name: New Versioned Page
|
20
|
+
:weight: 0.98
|
11
21
|
:expired:
|
12
22
|
:name: Expired
|
13
23
|
:version: 1
|
data/spec/spec_helper.rb
CHANGED
@@ -1,28 +1,15 @@
|
|
1
1
|
require 'simplecov'
|
2
|
-
require 'simplecov-rcov'
|
3
|
-
require 'codeclimate-test-reporter'
|
4
2
|
require 'active_support/time'
|
5
|
-
|
6
|
-
SimpleCov.start do
|
7
|
-
formatter SimpleCov::Formatter::MultiFormatter.new([
|
8
|
-
SimpleCov::Formatter::HTMLFormatter,
|
9
|
-
SimpleCov::Formatter::RcovFormatter,
|
10
|
-
CodeClimate::TestReporter::Formatter])
|
11
|
-
add_group('EenyMeeny', 'lib/eeny-meeny')
|
12
|
-
add_group('Rake Tasks', 'lib/tasks')
|
13
|
-
add_group('Specs', 'spec')
|
14
|
-
end
|
15
|
-
|
16
3
|
require 'rspec'
|
17
4
|
require 'yaml'
|
18
5
|
require 'mock_rack_app'
|
19
|
-
|
20
6
|
require 'eeny-meeny'
|
21
7
|
|
22
8
|
RSpec.configure do |config|
|
23
9
|
config.run_all_when_everything_filtered = true
|
24
10
|
config.filter_run :focus
|
25
11
|
config.order = "random"
|
12
|
+
config.expose_dsl_globally = true
|
26
13
|
|
27
14
|
config.before(:suite) do
|
28
15
|
Time.zone = 'UTC'
|
@@ -41,5 +28,4 @@ RSpec.configure do |config|
|
|
41
28
|
config.experiments = YAML.load_file(File.join('spec','fixtures','empty_experiments.yml'))
|
42
29
|
end
|
43
30
|
end
|
44
|
-
|
45
31
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: eeny-meeny
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Christian Orthmann
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2021-08-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|
@@ -16,14 +16,14 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '
|
19
|
+
version: '13'
|
20
20
|
type: :development
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: '
|
26
|
+
version: '13'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: rspec
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -92,14 +92,14 @@ dependencies:
|
|
92
92
|
requirements:
|
93
93
|
- - "~>"
|
94
94
|
- !ruby/object:Gem::Version
|
95
|
-
version:
|
95
|
+
version: '1'
|
96
96
|
type: :development
|
97
97
|
prerelease: false
|
98
98
|
version_requirements: !ruby/object:Gem::Requirement
|
99
99
|
requirements:
|
100
100
|
- - "~>"
|
101
101
|
- !ruby/object:Gem::Version
|
102
|
-
version:
|
102
|
+
version: '1'
|
103
103
|
- !ruby/object:Gem::Dependency
|
104
104
|
name: rack
|
105
105
|
requirement: !ruby/object:Gem::Requirement
|
@@ -129,7 +129,7 @@ dependencies:
|
|
129
129
|
version: 3.0.0
|
130
130
|
- - "<"
|
131
131
|
- !ruby/object:Gem::Version
|
132
|
-
version: 6.
|
132
|
+
version: 6.2.0
|
133
133
|
type: :runtime
|
134
134
|
prerelease: false
|
135
135
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -139,13 +139,15 @@ dependencies:
|
|
139
139
|
version: 3.0.0
|
140
140
|
- - "<"
|
141
141
|
- !ruby/object:Gem::Version
|
142
|
-
version: 6.
|
142
|
+
version: 6.2.0
|
143
143
|
description:
|
144
144
|
email: christian.orthmann@gmail.com
|
145
145
|
executables: []
|
146
146
|
extensions: []
|
147
147
|
extra_rdoc_files: []
|
148
148
|
files:
|
149
|
+
- ".rspec"
|
150
|
+
- ".simplecov"
|
149
151
|
- ".travis.yml"
|
150
152
|
- CHANGELOG.md
|
151
153
|
- Gemfile
|
@@ -154,7 +156,7 @@ files:
|
|
154
156
|
- Rakefile
|
155
157
|
- eeny-meeny.gemspec
|
156
158
|
- lib/eeny-meeny.rb
|
157
|
-
- lib/eeny-meeny/experiment_helper.rb
|
159
|
+
- lib/eeny-meeny/helpers/experiment_helper.rb
|
158
160
|
- lib/eeny-meeny/middleware.rb
|
159
161
|
- lib/eeny-meeny/models/cookie.rb
|
160
162
|
- lib/eeny-meeny/models/encryptor.rb
|
@@ -196,8 +198,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
196
198
|
- !ruby/object:Gem::Version
|
197
199
|
version: '0'
|
198
200
|
requirements: []
|
199
|
-
|
200
|
-
rubygems_version: 2.6.14.3
|
201
|
+
rubygems_version: 3.1.4
|
201
202
|
signing_key:
|
202
203
|
specification_version: 4
|
203
204
|
summary: A simple split and smoke testing tool for Rails
|