canary_labs 0.2.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.
Files changed (60) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.rdoc +3 -0
  4. data/Rakefile +34 -0
  5. data/lib/canary_labs.rb +2 -0
  6. data/lib/canary_labs/version.rb +3 -0
  7. data/lib/experiment_repo.rb +30 -0
  8. data/lib/feature.rb +23 -0
  9. data/lib/generators/initializer/USAGE +0 -0
  10. data/lib/generators/initializer/initializer_generator.rb +9 -0
  11. data/lib/generators/initializer/templates/initializer.rb +1 -0
  12. data/lib/resolvers/group.rb +13 -0
  13. data/lib/resolvers/percentage.rb +20 -0
  14. data/lib/tasks/canary_labs_tasks.rake +4 -0
  15. data/test/beta_test.rb +25 -0
  16. data/test/betas_test.rb +7 -0
  17. data/test/dummy/README.rdoc +28 -0
  18. data/test/dummy/Rakefile +6 -0
  19. data/test/dummy/app/assets/config/manifest.js +3 -0
  20. data/test/dummy/app/assets/javascripts/application.js +13 -0
  21. data/test/dummy/app/assets/stylesheets/application.css +15 -0
  22. data/test/dummy/app/controllers/application_controller.rb +5 -0
  23. data/test/dummy/app/helpers/application_helper.rb +2 -0
  24. data/test/dummy/app/views/layouts/application.html.erb +14 -0
  25. data/test/dummy/bin/bundle +3 -0
  26. data/test/dummy/bin/rails +4 -0
  27. data/test/dummy/bin/rake +4 -0
  28. data/test/dummy/bin/setup +29 -0
  29. data/test/dummy/config.ru +4 -0
  30. data/test/dummy/config/application.rb +26 -0
  31. data/test/dummy/config/boot.rb +5 -0
  32. data/test/dummy/config/database.yml +25 -0
  33. data/test/dummy/config/environment.rb +5 -0
  34. data/test/dummy/config/environments/development.rb +41 -0
  35. data/test/dummy/config/environments/production.rb +79 -0
  36. data/test/dummy/config/environments/test.rb +42 -0
  37. data/test/dummy/config/initializers/assets.rb +11 -0
  38. data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
  39. data/test/dummy/config/initializers/cookies_serializer.rb +3 -0
  40. data/test/dummy/config/initializers/filter_parameter_logging.rb +4 -0
  41. data/test/dummy/config/initializers/inflections.rb +16 -0
  42. data/test/dummy/config/initializers/mime_types.rb +4 -0
  43. data/test/dummy/config/initializers/session_store.rb +3 -0
  44. data/test/dummy/config/initializers/to_time_preserves_timezone.rb +10 -0
  45. data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
  46. data/test/dummy/config/locales/en.yml +23 -0
  47. data/test/dummy/config/routes.rb +56 -0
  48. data/test/dummy/config/secrets.yml +22 -0
  49. data/test/dummy/db/development.sqlite3 +0 -0
  50. data/test/dummy/db/schema.rb +16 -0
  51. data/test/dummy/db/test.sqlite3 +0 -0
  52. data/test/dummy/public/404.html +67 -0
  53. data/test/dummy/public/422.html +67 -0
  54. data/test/dummy/public/500.html +66 -0
  55. data/test/dummy/public/favicon.ico +0 -0
  56. data/test/experiment_repo_test.rb +59 -0
  57. data/test/resolvers/group_test.rb +23 -0
  58. data/test/resolvers/percentage_test.rb +22 -0
  59. data/test/test_helper.rb +20 -0
  60. metadata +174 -0
@@ -0,0 +1,67 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title>The change you wanted was rejected (422)</title>
5
+ <meta name="viewport" content="width=device-width,initial-scale=1">
6
+ <style>
7
+ body {
8
+ background-color: #EFEFEF;
9
+ color: #2E2F30;
10
+ text-align: center;
11
+ font-family: arial, sans-serif;
12
+ margin: 0;
13
+ }
14
+
15
+ div.dialog {
16
+ width: 95%;
17
+ max-width: 33em;
18
+ margin: 4em auto 0;
19
+ }
20
+
21
+ div.dialog > div {
22
+ border: 1px solid #CCC;
23
+ border-right-color: #999;
24
+ border-left-color: #999;
25
+ border-bottom-color: #BBB;
26
+ border-top: #B00100 solid 4px;
27
+ border-top-left-radius: 9px;
28
+ border-top-right-radius: 9px;
29
+ background-color: white;
30
+ padding: 7px 12% 0;
31
+ box-shadow: 0 3px 8px rgba(50, 50, 50, 0.17);
32
+ }
33
+
34
+ h1 {
35
+ font-size: 100%;
36
+ color: #730E15;
37
+ line-height: 1.5em;
38
+ }
39
+
40
+ div.dialog > p {
41
+ margin: 0 0 1em;
42
+ padding: 1em;
43
+ background-color: #F7F7F7;
44
+ border: 1px solid #CCC;
45
+ border-right-color: #999;
46
+ border-left-color: #999;
47
+ border-bottom-color: #999;
48
+ border-bottom-left-radius: 4px;
49
+ border-bottom-right-radius: 4px;
50
+ border-top-color: #DADADA;
51
+ color: #666;
52
+ box-shadow: 0 3px 8px rgba(50, 50, 50, 0.17);
53
+ }
54
+ </style>
55
+ </head>
56
+
57
+ <body>
58
+ <!-- This file lives in public/422.html -->
59
+ <div class="dialog">
60
+ <div>
61
+ <h1>The change you wanted was rejected.</h1>
62
+ <p>Maybe you tried to change something you didn't have access to.</p>
63
+ </div>
64
+ <p>If you are the application owner check the logs for more information.</p>
65
+ </div>
66
+ </body>
67
+ </html>
@@ -0,0 +1,66 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title>We're sorry, but something went wrong (500)</title>
5
+ <meta name="viewport" content="width=device-width,initial-scale=1">
6
+ <style>
7
+ body {
8
+ background-color: #EFEFEF;
9
+ color: #2E2F30;
10
+ text-align: center;
11
+ font-family: arial, sans-serif;
12
+ margin: 0;
13
+ }
14
+
15
+ div.dialog {
16
+ width: 95%;
17
+ max-width: 33em;
18
+ margin: 4em auto 0;
19
+ }
20
+
21
+ div.dialog > div {
22
+ border: 1px solid #CCC;
23
+ border-right-color: #999;
24
+ border-left-color: #999;
25
+ border-bottom-color: #BBB;
26
+ border-top: #B00100 solid 4px;
27
+ border-top-left-radius: 9px;
28
+ border-top-right-radius: 9px;
29
+ background-color: white;
30
+ padding: 7px 12% 0;
31
+ box-shadow: 0 3px 8px rgba(50, 50, 50, 0.17);
32
+ }
33
+
34
+ h1 {
35
+ font-size: 100%;
36
+ color: #730E15;
37
+ line-height: 1.5em;
38
+ }
39
+
40
+ div.dialog > p {
41
+ margin: 0 0 1em;
42
+ padding: 1em;
43
+ background-color: #F7F7F7;
44
+ border: 1px solid #CCC;
45
+ border-right-color: #999;
46
+ border-left-color: #999;
47
+ border-bottom-color: #999;
48
+ border-bottom-left-radius: 4px;
49
+ border-bottom-right-radius: 4px;
50
+ border-top-color: #DADADA;
51
+ color: #666;
52
+ box-shadow: 0 3px 8px rgba(50, 50, 50, 0.17);
53
+ }
54
+ </style>
55
+ </head>
56
+
57
+ <body>
58
+ <!-- This file lives in public/500.html -->
59
+ <div class="dialog">
60
+ <div>
61
+ <h1>We're sorry, but something went wrong.</h1>
62
+ </div>
63
+ <p>If you are the application owner check the logs for more information.</p>
64
+ </div>
65
+ </body>
66
+ </html>
File without changes
@@ -0,0 +1,59 @@
1
+ require 'test_helper'
2
+ require 'experiment_repo'
3
+ require 'feature'
4
+ require 'resolvers/group'
5
+
6
+ module CanaryLabs
7
+ class ExperimentRepoTest < ActiveSupport::TestCase
8
+ def test_add_beta
9
+ repo = new_repo
10
+ repo.add :added_beta, '', CanaryLabs::Resolvers::Group.new([])
11
+
12
+ assert_includes(
13
+ repo.all,
14
+ Feature.new(:added_beta, '', CanaryLabs::Resolvers::Group.new([])),
15
+ )
16
+ end
17
+
18
+ def test_find_beta_by_name
19
+ repo = new_repo
20
+ repo.add :beta_to_find, '', CanaryLabs::Resolvers::Group.new([])
21
+
22
+ assert_equal(
23
+ Feature.new(:beta_to_find, '', CanaryLabs::Resolvers::Group.new([])),
24
+ repo.find(:beta_to_find)
25
+ )
26
+ end
27
+
28
+ def test_participating_by_name
29
+ repo = new_repo
30
+ repo.add :participatable_beta, '', CanaryLabs::Resolvers::Group.new(['my_id'])
31
+
32
+ assert repo.participating? :participatable_beta, 'my_id'
33
+ end
34
+
35
+ def test_participating_with_bad_name
36
+ repo = new_repo
37
+
38
+ assert repo.participating? :bad_name, 'my_id'
39
+ end
40
+
41
+ def test_list_all_betas
42
+ repo = new_repo
43
+ repo.add :beta_a, '', CanaryLabs::Resolvers::Group.new([])
44
+ repo.add :beta_b, '', CanaryLabs::Resolvers::Group.new([])
45
+ repo.add :beta_c, '', CanaryLabs::Resolvers::Group.new([])
46
+
47
+ all_betas = repo.all
48
+
49
+ assert_equal 3, all_betas.length
50
+ assert_includes all_betas, Feature.new(:beta_a, '', CanaryLabs::Resolvers::Group.new([]))
51
+ end
52
+
53
+ private
54
+
55
+ def new_repo
56
+ CanaryLabs::ExperimentRepo.new
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,23 @@
1
+ require 'test_helper'
2
+ require 'resolvers/group'
3
+
4
+ module CanaryLabs
5
+ module Resolvers
6
+ class GroupTest < ActiveSupport::TestCase
7
+ def test_participating
8
+ resolver = Group.new ['admin_id', 'dev_id', 'qa_id', 'beta_lover_id']
9
+ id_participating_pairs = {
10
+ 'admin_id' => true,
11
+ 'dev_id' => true,
12
+ 'qa_id' => true,
13
+ 'beta_lover_id' => true,
14
+ 'boring_customer_id' => false,
15
+ }
16
+
17
+ id_participating_pairs.each do |id, participating|
18
+ assert_equal participating, resolver.participating?(id)
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,22 @@
1
+ require 'test_helper'
2
+ require 'resolvers/percentage'
3
+
4
+ module CanaryLabs
5
+ module Resolvers
6
+ class PercentageTest < ActiveSupport::TestCase
7
+ def test_participating
8
+ total_participating = 0
9
+ resolver = Percentage.new 0.1, :test
10
+
11
+ (0..9999).to_a.each_index do |idx|
12
+ total_participating += 1 if resolver.participating? idx
13
+ end
14
+
15
+ # ensure we are within 10% of the expected percentage (i.e. with an eligibility percentage of 10%
16
+ # between 9% and 11% of tested range were eligible)
17
+ error_rate = (total_participating / 1000.0) - 1
18
+ assert error_rate.abs < 0.1
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,20 @@
1
+ # Configure Rails Environment
2
+ ENV["RAILS_ENV"] = "test"
3
+
4
+ require File.expand_path("../../test/dummy/config/environment.rb", __FILE__)
5
+ ActiveRecord::Migrator.migrations_paths = [File.expand_path("../../test/dummy/db/migrate", __FILE__)]
6
+ require "rails/test_help"
7
+
8
+ # Filter out Minitest backtrace while allowing backtrace from other libraries
9
+ # to be shown.
10
+ Minitest.backtrace_filter = Minitest::BacktraceFilter.new
11
+
12
+ # Load support files
13
+ Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each { |f| require f }
14
+
15
+ # Load fixtures from the engine
16
+ if ActiveSupport::TestCase.respond_to?(:fixture_path=)
17
+ ActiveSupport::TestCase.fixture_path = File.expand_path("../fixtures", __FILE__)
18
+ ActionDispatch::IntegrationTest.fixture_path = ActiveSupport::TestCase.fixture_path
19
+ ActiveSupport::TestCase.fixtures :all
20
+ end
metadata ADDED
@@ -0,0 +1,174 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: canary_labs
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.2.0
5
+ platform: ruby
6
+ authors:
7
+ - Davis Kimoto
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2019-12-13 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rails
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: 4.2.11.1
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: 4.2.11.1
27
+ - !ruby/object:Gem::Dependency
28
+ name: sqlite3
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
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'
41
+ description: Description of CanaryLabs.
42
+ email:
43
+ - davis.kimoto@gmail.com
44
+ executables: []
45
+ extensions: []
46
+ extra_rdoc_files: []
47
+ files:
48
+ - MIT-LICENSE
49
+ - README.rdoc
50
+ - Rakefile
51
+ - lib/canary_labs.rb
52
+ - lib/canary_labs/version.rb
53
+ - lib/experiment_repo.rb
54
+ - lib/feature.rb
55
+ - lib/generators/initializer/USAGE
56
+ - lib/generators/initializer/initializer_generator.rb
57
+ - lib/generators/initializer/templates/initializer.rb
58
+ - lib/resolvers/group.rb
59
+ - lib/resolvers/percentage.rb
60
+ - lib/tasks/canary_labs_tasks.rake
61
+ - test/beta_test.rb
62
+ - test/betas_test.rb
63
+ - test/dummy/README.rdoc
64
+ - test/dummy/Rakefile
65
+ - test/dummy/app/assets/config/manifest.js
66
+ - test/dummy/app/assets/javascripts/application.js
67
+ - test/dummy/app/assets/stylesheets/application.css
68
+ - test/dummy/app/controllers/application_controller.rb
69
+ - test/dummy/app/helpers/application_helper.rb
70
+ - test/dummy/app/views/layouts/application.html.erb
71
+ - test/dummy/bin/bundle
72
+ - test/dummy/bin/rails
73
+ - test/dummy/bin/rake
74
+ - test/dummy/bin/setup
75
+ - test/dummy/config.ru
76
+ - test/dummy/config/application.rb
77
+ - test/dummy/config/boot.rb
78
+ - test/dummy/config/database.yml
79
+ - test/dummy/config/environment.rb
80
+ - test/dummy/config/environments/development.rb
81
+ - test/dummy/config/environments/production.rb
82
+ - test/dummy/config/environments/test.rb
83
+ - test/dummy/config/initializers/assets.rb
84
+ - test/dummy/config/initializers/backtrace_silencers.rb
85
+ - test/dummy/config/initializers/cookies_serializer.rb
86
+ - test/dummy/config/initializers/filter_parameter_logging.rb
87
+ - test/dummy/config/initializers/inflections.rb
88
+ - test/dummy/config/initializers/mime_types.rb
89
+ - test/dummy/config/initializers/session_store.rb
90
+ - test/dummy/config/initializers/to_time_preserves_timezone.rb
91
+ - test/dummy/config/initializers/wrap_parameters.rb
92
+ - test/dummy/config/locales/en.yml
93
+ - test/dummy/config/routes.rb
94
+ - test/dummy/config/secrets.yml
95
+ - test/dummy/db/development.sqlite3
96
+ - test/dummy/db/schema.rb
97
+ - test/dummy/db/test.sqlite3
98
+ - test/dummy/public/404.html
99
+ - test/dummy/public/422.html
100
+ - test/dummy/public/500.html
101
+ - test/dummy/public/favicon.ico
102
+ - test/experiment_repo_test.rb
103
+ - test/resolvers/group_test.rb
104
+ - test/resolvers/percentage_test.rb
105
+ - test/test_helper.rb
106
+ homepage: https://github.com/dkimot/rails-canary_labs
107
+ licenses:
108
+ - MIT
109
+ metadata: {}
110
+ post_install_message:
111
+ rdoc_options: []
112
+ require_paths:
113
+ - lib
114
+ required_ruby_version: !ruby/object:Gem::Requirement
115
+ requirements:
116
+ - - ">="
117
+ - !ruby/object:Gem::Version
118
+ version: '0'
119
+ required_rubygems_version: !ruby/object:Gem::Requirement
120
+ requirements:
121
+ - - ">="
122
+ - !ruby/object:Gem::Version
123
+ version: '0'
124
+ requirements: []
125
+ rubygems_version: 3.0.4
126
+ signing_key:
127
+ specification_version: 4
128
+ summary: https://github.com/dkimot/rails-canary_labs
129
+ test_files:
130
+ - test/dummy/app/controllers/application_controller.rb
131
+ - test/dummy/app/views/layouts/application.html.erb
132
+ - test/dummy/app/assets/config/manifest.js
133
+ - test/dummy/app/assets/javascripts/application.js
134
+ - test/dummy/app/assets/stylesheets/application.css
135
+ - test/dummy/app/helpers/application_helper.rb
136
+ - test/dummy/bin/rake
137
+ - test/dummy/bin/setup
138
+ - test/dummy/bin/bundle
139
+ - test/dummy/bin/rails
140
+ - test/dummy/config/secrets.yml
141
+ - test/dummy/config/routes.rb
142
+ - test/dummy/config/locales/en.yml
143
+ - test/dummy/config/environments/production.rb
144
+ - test/dummy/config/environments/development.rb
145
+ - test/dummy/config/environments/test.rb
146
+ - test/dummy/config/environment.rb
147
+ - test/dummy/config/application.rb
148
+ - test/dummy/config/database.yml
149
+ - test/dummy/config/boot.rb
150
+ - test/dummy/config/initializers/backtrace_silencers.rb
151
+ - test/dummy/config/initializers/mime_types.rb
152
+ - test/dummy/config/initializers/filter_parameter_logging.rb
153
+ - test/dummy/config/initializers/session_store.rb
154
+ - test/dummy/config/initializers/wrap_parameters.rb
155
+ - test/dummy/config/initializers/assets.rb
156
+ - test/dummy/config/initializers/cookies_serializer.rb
157
+ - test/dummy/config/initializers/to_time_preserves_timezone.rb
158
+ - test/dummy/config/initializers/inflections.rb
159
+ - test/dummy/config.ru
160
+ - test/dummy/Rakefile
161
+ - test/dummy/public/favicon.ico
162
+ - test/dummy/public/422.html
163
+ - test/dummy/public/500.html
164
+ - test/dummy/public/404.html
165
+ - test/dummy/db/schema.rb
166
+ - test/dummy/db/test.sqlite3
167
+ - test/dummy/db/development.sqlite3
168
+ - test/dummy/README.rdoc
169
+ - test/resolvers/group_test.rb
170
+ - test/resolvers/percentage_test.rb
171
+ - test/betas_test.rb
172
+ - test/experiment_repo_test.rb
173
+ - test/test_helper.rb
174
+ - test/beta_test.rb