rollout_control 0.0.1

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 (50) 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/app/controllers/rollout_control/application_controller.rb +10 -0
  6. data/app/controllers/rollout_control/features_controller.rb +27 -0
  7. data/app/controllers/rollout_control/groups_controller.rb +30 -0
  8. data/app/controllers/rollout_control/users_controller.rb +30 -0
  9. data/config/routes.rb +6 -0
  10. data/lib/rollout_control/engine.rb +18 -0
  11. data/lib/rollout_control/version.rb +3 -0
  12. data/lib/rollout_control.rb +39 -0
  13. data/lib/tasks/rollout_control_tasks.rake +4 -0
  14. data/test/controllers/rollout_control/features_controller_test.rb +8 -0
  15. data/test/dummy/README.rdoc +28 -0
  16. data/test/dummy/Rakefile +6 -0
  17. data/test/dummy/app/assets/javascripts/application.js +13 -0
  18. data/test/dummy/app/assets/stylesheets/application.css +15 -0
  19. data/test/dummy/app/controllers/application_controller.rb +5 -0
  20. data/test/dummy/app/helpers/application_helper.rb +2 -0
  21. data/test/dummy/app/views/layouts/application.html.erb +14 -0
  22. data/test/dummy/bin/bundle +3 -0
  23. data/test/dummy/bin/rails +4 -0
  24. data/test/dummy/bin/rake +4 -0
  25. data/test/dummy/config/application.rb +25 -0
  26. data/test/dummy/config/boot.rb +5 -0
  27. data/test/dummy/config/environment.rb +5 -0
  28. data/test/dummy/config/environments/development.rb +37 -0
  29. data/test/dummy/config/environments/production.rb +78 -0
  30. data/test/dummy/config/environments/test.rb +34 -0
  31. data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
  32. data/test/dummy/config/initializers/cookies_serializer.rb +3 -0
  33. data/test/dummy/config/initializers/filter_parameter_logging.rb +4 -0
  34. data/test/dummy/config/initializers/inflections.rb +16 -0
  35. data/test/dummy/config/initializers/mime_types.rb +4 -0
  36. data/test/dummy/config/initializers/rollout.rb +8 -0
  37. data/test/dummy/config/initializers/session_store.rb +3 -0
  38. data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
  39. data/test/dummy/config/locales/en.yml +23 -0
  40. data/test/dummy/config/routes.rb +4 -0
  41. data/test/dummy/config/secrets.yml +22 -0
  42. data/test/dummy/config.ru +4 -0
  43. data/test/dummy/log/test.log +3780 -0
  44. data/test/dummy/public/404.html +67 -0
  45. data/test/dummy/public/422.html +67 -0
  46. data/test/dummy/public/500.html +66 -0
  47. data/test/dummy/public/favicon.ico +0 -0
  48. data/test/integration/rollout_control/rollout_control_test.rb +111 -0
  49. data/test/test_helper.rb +22 -0
  50. metadata +184 -0
@@ -0,0 +1,67 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title>The page you were looking for doesn't exist (404)</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/404.html -->
59
+ <div class="dialog">
60
+ <div>
61
+ <h1>The page you were looking for doesn't exist.</h1>
62
+ <p>You may have mistyped the address or the page may have moved.</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,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,111 @@
1
+ require 'test_helper'
2
+
3
+ class RolloutControlTest < ActionDispatch::IntegrationTest
4
+ test "list empty features" do
5
+ get '/rollout/features'
6
+ assert_response :success
7
+ assert_equal [], last_json
8
+ end
9
+
10
+ test "list existing features" do
11
+ rollout.activate(:kittens)
12
+ get '/rollout/features'
13
+ assert_response :success
14
+ kittens_json = { 'name' => 'kittens', 'percentage' => 100, 'groups' => [], 'users' => [] }
15
+ assert_equal [kittens_json], last_json
16
+
17
+ rollout.activate_percentage(:burritos, 50)
18
+ rollout.activate_group(:burritos, :burrito_lovers)
19
+ rollout.activate_user(:burritos, user(35))
20
+ get '/rollout/features'
21
+ assert_response :success
22
+ features_json = last_json
23
+ assert_equal 2, features_json.size
24
+ burritos_json = { 'name' => 'burritos', 'percentage' => 50, 'groups' => ['burrito_lovers'], 'users' => ['35'] }
25
+ assert features_json.include?(kittens_json)
26
+ assert features_json.include?(burritos_json)
27
+ end
28
+
29
+ test "show feature" do
30
+ rollout.activate(:kittens)
31
+ get '/rollout/features/kittens'
32
+ assert_response :success
33
+ feature_data = { 'percentage' => 100, 'groups' => [], 'users' => [] }
34
+ assert_equal feature_data, last_json
35
+
36
+ rollout.activate_percentage(:kittens, 75)
37
+ get '/rollout/features/kittens'
38
+ assert_response :success
39
+ feature_data['percentage'] = 75
40
+ assert_equal feature_data, last_json
41
+
42
+ rollout.activate_user(:kittens, OpenStruct.new(id: 101))
43
+ get '/rollout/features/kittens'
44
+ assert_response :success
45
+ feature_data['users'] << '101'
46
+ assert_equal feature_data, last_json
47
+ end
48
+
49
+ test "update feature percentage" do
50
+ rollout.activate(:kittens)
51
+ patch '/rollout/features/kittens', { percentage: '65' }
52
+ assert_response :success
53
+ assert_equal 65, rollout.get(:kittens).percentage
54
+ end
55
+
56
+ test "add group to feature" do
57
+ rollout.deactivate(:extra_sharp_knives)
58
+ post 'rollout/features/extra_sharp_knives/groups', group: 'experienced_chefs'
59
+ assert_equal 0, rollout.get(:extra_sharp_knives).percentage
60
+ assert_equal [:experienced_chefs], rollout.get(:extra_sharp_knives).groups
61
+ end
62
+
63
+ test "attempt to add group to feature without a group name" do
64
+ rollout.deactivate(:extra_sharp_knives)
65
+ post 'rollout/features/extra_sharp_knives/groups'
66
+ assert_response 400
67
+ assert_equal [], rollout.get(:extra_sharp_knives).groups
68
+ end
69
+
70
+ test "remove group from feature" do
71
+ rollout.deactivate(:extra_sharp_knives)
72
+ rollout.activate_group(:extra_sharp_knives, :experienced_chefs)
73
+ delete 'rollout/features/extra_sharp_knives/groups/experienced_chefs'
74
+ assert_equal 0, rollout.get(:extra_sharp_knives).percentage
75
+ assert_equal [], rollout.get(:extra_sharp_knives).groups
76
+ end
77
+
78
+ test "add user to feature" do
79
+ rollout.deactivate(:potato_gun)
80
+ post 'rollout/features/potato_gun/users', user_id: 45
81
+ assert_equal 0, rollout.get(:potato_gun).percentage
82
+ assert_equal ['45'], rollout.get(:potato_gun).users
83
+ assert rollout.active?(:potato_gun, user(45))
84
+ end
85
+
86
+ test "attempt to activate user to feature without a user id" do
87
+ rollout.deactivate(:potato_gun)
88
+ post 'rollout/features/potato_gun/users'
89
+ assert_response 400
90
+ assert_equal [], rollout.get(:potato_gun).users
91
+ end
92
+
93
+ test "remove user from feature" do
94
+ rollout.deactivate(:potato_gun)
95
+ rollout.activate_user(:potato_gun, user(45))
96
+ delete 'rollout/features/potato_gun/users/45'
97
+ assert_equal 0, rollout.get(:potato_gun).percentage
98
+ assert_equal [], rollout.get(:potato_gun).groups
99
+ refute rollout.active?(:potato_gun, user(45))
100
+ end
101
+
102
+ private
103
+
104
+ def user(id)
105
+ OpenStruct.new(id: id)
106
+ end
107
+
108
+ def rollout
109
+ RolloutControl.rollout
110
+ end
111
+ end
@@ -0,0 +1,22 @@
1
+ ENV['RAILS_ENV'] = 'test'
2
+
3
+ # RolloutControl config is done in test/dummy/config/initializers/rollout.rb
4
+ require File.expand_path('../dummy/config/environment.rb', __FILE__)
5
+ require 'rails/test_help'
6
+ require 'fakeredis'
7
+ require 'rollout'
8
+ require 'pry'
9
+
10
+ Rails.backtrace_cleaner.remove_silencers!
11
+
12
+ class ActiveSupport::TestCase
13
+ setup do
14
+ $redis.flushdb
15
+ end
16
+
17
+ private
18
+
19
+ def last_json
20
+ JSON.parse(response.body)
21
+ end
22
+ end
metadata ADDED
@@ -0,0 +1,184 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: rollout_control
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Aaron Royer
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-11-12 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.0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '4.0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rollout
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '2.0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '2.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: fakeredis
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: pry
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ description: rollout API as a Rails engine
70
+ email:
71
+ - aaronroyer@gmail.com
72
+ executables: []
73
+ extensions: []
74
+ extra_rdoc_files: []
75
+ files:
76
+ - MIT-LICENSE
77
+ - README.rdoc
78
+ - Rakefile
79
+ - app/controllers/rollout_control/application_controller.rb
80
+ - app/controllers/rollout_control/features_controller.rb
81
+ - app/controllers/rollout_control/groups_controller.rb
82
+ - app/controllers/rollout_control/users_controller.rb
83
+ - config/routes.rb
84
+ - lib/rollout_control.rb
85
+ - lib/rollout_control/engine.rb
86
+ - lib/rollout_control/version.rb
87
+ - lib/tasks/rollout_control_tasks.rake
88
+ - test/controllers/rollout_control/features_controller_test.rb
89
+ - test/dummy/README.rdoc
90
+ - test/dummy/Rakefile
91
+ - test/dummy/app/assets/javascripts/application.js
92
+ - test/dummy/app/assets/stylesheets/application.css
93
+ - test/dummy/app/controllers/application_controller.rb
94
+ - test/dummy/app/helpers/application_helper.rb
95
+ - test/dummy/app/views/layouts/application.html.erb
96
+ - test/dummy/bin/bundle
97
+ - test/dummy/bin/rails
98
+ - test/dummy/bin/rake
99
+ - test/dummy/config.ru
100
+ - test/dummy/config/application.rb
101
+ - test/dummy/config/boot.rb
102
+ - test/dummy/config/environment.rb
103
+ - test/dummy/config/environments/development.rb
104
+ - test/dummy/config/environments/production.rb
105
+ - test/dummy/config/environments/test.rb
106
+ - test/dummy/config/initializers/backtrace_silencers.rb
107
+ - test/dummy/config/initializers/cookies_serializer.rb
108
+ - test/dummy/config/initializers/filter_parameter_logging.rb
109
+ - test/dummy/config/initializers/inflections.rb
110
+ - test/dummy/config/initializers/mime_types.rb
111
+ - test/dummy/config/initializers/rollout.rb
112
+ - test/dummy/config/initializers/session_store.rb
113
+ - test/dummy/config/initializers/wrap_parameters.rb
114
+ - test/dummy/config/locales/en.yml
115
+ - test/dummy/config/routes.rb
116
+ - test/dummy/config/secrets.yml
117
+ - test/dummy/log/test.log
118
+ - test/dummy/public/404.html
119
+ - test/dummy/public/422.html
120
+ - test/dummy/public/500.html
121
+ - test/dummy/public/favicon.ico
122
+ - test/integration/rollout_control/rollout_control_test.rb
123
+ - test/test_helper.rb
124
+ homepage: https://github.com/hired/rollout_control
125
+ licenses:
126
+ - MIT
127
+ metadata: {}
128
+ post_install_message:
129
+ rdoc_options: []
130
+ require_paths:
131
+ - lib
132
+ required_ruby_version: !ruby/object:Gem::Requirement
133
+ requirements:
134
+ - - ">="
135
+ - !ruby/object:Gem::Version
136
+ version: '0'
137
+ required_rubygems_version: !ruby/object:Gem::Requirement
138
+ requirements:
139
+ - - ">="
140
+ - !ruby/object:Gem::Version
141
+ version: '0'
142
+ requirements: []
143
+ rubyforge_project:
144
+ rubygems_version: 2.2.2
145
+ signing_key:
146
+ specification_version: 4
147
+ summary: Allows controlling rollout remotely with clients such as chat bots
148
+ test_files:
149
+ - test/controllers/rollout_control/features_controller_test.rb
150
+ - test/dummy/app/assets/javascripts/application.js
151
+ - test/dummy/app/assets/stylesheets/application.css
152
+ - test/dummy/app/controllers/application_controller.rb
153
+ - test/dummy/app/helpers/application_helper.rb
154
+ - test/dummy/app/views/layouts/application.html.erb
155
+ - test/dummy/bin/bundle
156
+ - test/dummy/bin/rails
157
+ - test/dummy/bin/rake
158
+ - test/dummy/config/application.rb
159
+ - test/dummy/config/boot.rb
160
+ - test/dummy/config/environment.rb
161
+ - test/dummy/config/environments/development.rb
162
+ - test/dummy/config/environments/production.rb
163
+ - test/dummy/config/environments/test.rb
164
+ - test/dummy/config/initializers/backtrace_silencers.rb
165
+ - test/dummy/config/initializers/cookies_serializer.rb
166
+ - test/dummy/config/initializers/filter_parameter_logging.rb
167
+ - test/dummy/config/initializers/inflections.rb
168
+ - test/dummy/config/initializers/mime_types.rb
169
+ - test/dummy/config/initializers/rollout.rb
170
+ - test/dummy/config/initializers/session_store.rb
171
+ - test/dummy/config/initializers/wrap_parameters.rb
172
+ - test/dummy/config/locales/en.yml
173
+ - test/dummy/config/routes.rb
174
+ - test/dummy/config/secrets.yml
175
+ - test/dummy/config.ru
176
+ - test/dummy/log/test.log
177
+ - test/dummy/public/404.html
178
+ - test/dummy/public/422.html
179
+ - test/dummy/public/500.html
180
+ - test/dummy/public/favicon.ico
181
+ - test/dummy/Rakefile
182
+ - test/dummy/README.rdoc
183
+ - test/integration/rollout_control/rollout_control_test.rb
184
+ - test/test_helper.rb