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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: b63f2223b23e189cdf963583f0666227ec3a6410
4
- data.tar.gz: c2e23b8389b07ed951ed3506b3b3f6a6e88bdf1b
2
+ SHA256:
3
+ metadata.gz: eb901520367109f3167e217522a3b712ae71167e04c0458d4dac2b0907b541bc
4
+ data.tar.gz: b360de703e230a8aef6fb7ec7211fe24aa2f79007bb2c3344591a452b40d26ae
5
5
  SHA512:
6
- metadata.gz: 51f9a32c834a0b723e76ac840a9deca30deb98bb49bb41f671977f631d4dbddb5a094b0b6a35b16445b6886af629ce4413ed6f776b00e1ba410e02f048585f73
7
- data.tar.gz: 79b2ed878d4a24c3a736b311a942d9386b5266eac1a0410ece9d0b76e90e42b6d640bdfadd798e4e9ed4b3b10af1c0c92704c03d6c3638b0550b2866ac50d136
6
+ metadata.gz: f9e244e1ba2895921276b2fe070689a2694296ce8db150e0f9ddde380608d65e5cda63afe6e130981da0c7eed3e5e32eb67e28b021cfc38cbf8d931d23b4a8e3
7
+ data.tar.gz: e84d5450b37db881191650f259a9abe353d63e8ab8cbdda3c666932029ad78774281f8d99ea73491c74f1807d3aad7dce6908b678c779b888b1c79a32b7c3b2d
data/.rspec ADDED
@@ -0,0 +1,3 @@
1
+ --require spec_helper
2
+ --color
3
+ --format documentation
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
@@ -1,9 +1,6 @@
1
1
  language: ruby
2
- sudo: false
3
2
  env:
4
- - "RAILS_VERSION=4.2.8"
3
+ - "RAILS_VERSION=6.1.4"
5
4
  rvm:
6
- - 2.2.10
7
- - 2.3.7
8
- - 2.4.4
9
- - 2.5.1
5
+ - 2.6.8
6
+ - 2.7.4
data/CHANGELOG.md CHANGED
@@ -1,3 +1,11 @@
1
+ ### 2.3.0 (2021-08-11)
2
+
3
+ Changes:
4
+
5
+ - Support Rails 6 (PR: #11).
6
+ - Remove cookies for previous experiment versions (PR: #12).
7
+ - Update Travis configuration to include Ruby version 2.6 to 2.7.
8
+
1
9
  ### 2.2.2 (2019-04-08)
2
10
 
3
11
  Bugfixes:
data/Gemfile CHANGED
@@ -1,7 +1,3 @@
1
1
  source 'https://rubygems.org'
2
2
 
3
- group :test do
4
- gem 'codeclimate-test-reporter', require: nil
5
- end
6
-
7
3
  gemspec
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.org/corthmann/eeny-meeny.svg?branch=master)](https://travis-ci.org/corthmann/eeny-meeny)
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 = '2019-04-08'
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', '~> 10')
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', '~> 0.6.3')
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.0.0')
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'], @cookie_config)
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 = /\Aeeny_meeny_(.+)_v\d+\z/.freeze
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
- if cookie_name =~ COOKIE_EXPERIMENT_ID_REGEX
27
- find_by_id($1)
28
- end
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)
@@ -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
@@ -1,3 +1,3 @@
1
1
  module EenyMeeny
2
- VERSION = '2.2.2'
2
+ VERSION = '2.3.0'
3
3
  end
@@ -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,6 +1,5 @@
1
- require 'spec_helper'
2
1
  require 'eeny-meeny/middleware'
3
- require 'eeny-meeny/experiment_helper'
2
+ require 'eeny-meeny/helpers/experiment_helper'
4
3
  require 'eeny-meeny/models/experiment'
5
4
  require 'eeny-meeny/models/variation'
6
5
  require 'eeny-meeny/models/cookie'
@@ -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 = 'test=abc;eeny_meeny_undefined_experiment_v1=thevaluedoesntmatter;'
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('eeny_meeny_undefined_experiment_v1=thevaluedoesntmatter; path=/; max-age=0; expires=Thu, 01 Jan 1970 00:00:00 -0000; SameSite=Strict')
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/cookie'
3
2
  require 'eeny-meeny/models/experiment'
4
3
 
@@ -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(2)
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
@@ -1,4 +1,3 @@
1
- require 'spec_helper'
2
1
  require 'eeny-meeny/models/variation'
3
2
 
4
3
  describe EenyMeeny::Variation do
@@ -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
@@ -1,4 +1,3 @@
1
- require 'spec_helper'
2
1
  require 'rake'
3
2
 
4
3
  describe 'cookie.rake', experiments: true do
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.2.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: 2019-04-08 00:00:00.000000000 Z
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: '10'
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: '10'
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: 0.6.3
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: 0.6.3
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.0.0
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.0.0
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
- rubyforge_project:
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