trailguide 0.1.31 → 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 (72) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +73 -8
  3. data/app/assets/javascripts/trail_guide/admin/application.js +20 -1
  4. data/app/assets/stylesheets/trail_guide/admin/application.css +22 -0
  5. data/app/assets/stylesheets/trail_guide/admin/experiments.css +36 -3
  6. data/app/controllers/trail_guide/admin/application_controller.rb +59 -8
  7. data/app/controllers/trail_guide/admin/experiments_controller.rb +209 -16
  8. data/app/controllers/trail_guide/admin/groups_controller.rb +34 -0
  9. data/app/controllers/trail_guide/experiments_controller.rb +1 -1
  10. data/app/views/layouts/trail_guide/admin/_calculator.erb +24 -0
  11. data/app/views/layouts/trail_guide/admin/_footer.html.erb +27 -0
  12. data/app/views/layouts/trail_guide/admin/_header.html.erb +147 -0
  13. data/app/views/layouts/trail_guide/admin/_import_modal.html.erb +45 -0
  14. data/app/views/layouts/trail_guide/admin/application.html.erb +17 -3
  15. data/app/views/trail_guide/admin/experiments/_alert_peek.html.erb +19 -0
  16. data/app/views/trail_guide/admin/experiments/_alert_state.html.erb +49 -0
  17. data/app/views/trail_guide/admin/experiments/_btn_analyze.html.erb +11 -0
  18. data/app/views/trail_guide/admin/experiments/_btn_analyze_goal.html.erb +5 -0
  19. data/app/views/trail_guide/admin/experiments/_btn_convert.html.erb +33 -0
  20. data/app/views/trail_guide/admin/experiments/_btn_enroll.html.erb +3 -0
  21. data/app/views/trail_guide/admin/experiments/_btn_join.html.erb +11 -0
  22. data/app/views/trail_guide/admin/experiments/_btn_leave.html.erb +7 -0
  23. data/app/views/trail_guide/admin/experiments/_btn_pause.html.erb +5 -0
  24. data/app/views/trail_guide/admin/experiments/_btn_peek.html.erb +13 -0
  25. data/app/views/trail_guide/admin/experiments/_btn_reset.html.erb +5 -0
  26. data/app/views/trail_guide/admin/experiments/_btn_restart.html.erb +5 -0
  27. data/app/views/trail_guide/admin/experiments/_btn_resume.html.erb +5 -0
  28. data/app/views/trail_guide/admin/experiments/_btn_schedule.html.erb +6 -0
  29. data/app/views/trail_guide/admin/experiments/_btn_start.html.erb +5 -0
  30. data/app/views/trail_guide/admin/experiments/_btn_stop.html.erb +5 -0
  31. data/app/views/trail_guide/admin/experiments/_experiment.html.erb +68 -172
  32. data/app/views/trail_guide/admin/experiments/_header.html.erb +87 -0
  33. data/app/views/trail_guide/admin/experiments/_start_modal.html.erb +57 -0
  34. data/app/views/trail_guide/admin/experiments/_tbody.html.erb +112 -0
  35. data/app/views/trail_guide/admin/experiments/_thead.html.erb +38 -0
  36. data/app/views/trail_guide/admin/experiments/index.html.erb +8 -16
  37. data/app/views/trail_guide/admin/experiments/show.html.erb +78 -0
  38. data/app/views/trail_guide/admin/groups/index.html.erb +40 -0
  39. data/app/views/trail_guide/admin/groups/show.html.erb +9 -0
  40. data/app/views/trail_guide/admin/orphans/_alert.html.erb +44 -0
  41. data/config/initializers/trailguide.rb +72 -9
  42. data/config/routes/admin.rb +19 -12
  43. data/lib/trail_guide/admin/engine.rb +2 -0
  44. data/lib/trail_guide/admin.rb +2 -0
  45. data/lib/trail_guide/calculators/bayesian.rb +98 -0
  46. data/lib/trail_guide/calculators/calculator.rb +58 -0
  47. data/lib/trail_guide/calculators/score.rb +68 -0
  48. data/lib/trail_guide/calculators.rb +8 -0
  49. data/lib/trail_guide/catalog.rb +134 -19
  50. data/lib/trail_guide/combined_experiment.rb +8 -3
  51. data/lib/trail_guide/config.rb +6 -1
  52. data/lib/trail_guide/engine.rb +2 -0
  53. data/lib/trail_guide/errors.rb +30 -1
  54. data/lib/trail_guide/experiment.rb +0 -1
  55. data/lib/trail_guide/experiments/base.rb +189 -53
  56. data/lib/trail_guide/experiments/config.rb +82 -13
  57. data/lib/trail_guide/experiments/participant.rb +21 -1
  58. data/lib/trail_guide/helper.rb +59 -32
  59. data/lib/trail_guide/metrics/checkpoint.rb +24 -0
  60. data/lib/trail_guide/metrics/config.rb +45 -0
  61. data/lib/trail_guide/metrics/funnel.rb +24 -0
  62. data/lib/trail_guide/metrics/goal.rb +89 -0
  63. data/lib/trail_guide/metrics.rb +9 -0
  64. data/lib/trail_guide/participant.rb +54 -21
  65. data/lib/trail_guide/variant.rb +34 -12
  66. data/lib/trail_guide/version.rb +2 -2
  67. data/lib/trailguide.rb +4 -0
  68. metadata +112 -7
  69. data/app/views/layouts/trail_guide/admin/_footer.erb +0 -10
  70. data/app/views/layouts/trail_guide/admin/_header.erb +0 -42
  71. data/app/views/trail_guide/admin/experiments/_combined_experiment.html.erb +0 -189
  72. data/config/routes.rb +0 -5
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: trailguide
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.31
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mark Rebec
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-04-16 00:00:00.000000000 Z
11
+ date: 2019-05-31 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -66,6 +66,76 @@ dependencies:
66
66
  - - ">="
67
67
  - !ruby/object:Gem::Version
68
68
  version: 0.9.3
69
+ - !ruby/object:Gem::Dependency
70
+ name: gsl
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: 2.1.0
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: 2.1.0
83
+ - !ruby/object:Gem::Dependency
84
+ name: integration
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: 0.1.4
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: 0.1.4
97
+ - !ruby/object:Gem::Dependency
98
+ name: distribution
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: 0.7.3
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: 0.7.3
111
+ - !ruby/object:Gem::Dependency
112
+ name: rubystats
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: 0.3.0
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: 0.3.0
125
+ - !ruby/object:Gem::Dependency
126
+ name: abanalyzer
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ">="
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
69
139
  - !ruby/object:Gem::Dependency
70
140
  name: sqlite3
71
141
  requirement: !ruby/object:Gem::Requirement
@@ -125,16 +195,41 @@ files:
125
195
  - app/assets/stylesheets/trail_guide/admin/experiments.css
126
196
  - app/controllers/trail_guide/admin/application_controller.rb
127
197
  - app/controllers/trail_guide/admin/experiments_controller.rb
198
+ - app/controllers/trail_guide/admin/groups_controller.rb
128
199
  - app/controllers/trail_guide/experiments_controller.rb
129
- - app/views/layouts/trail_guide/admin/_footer.erb
130
- - app/views/layouts/trail_guide/admin/_header.erb
200
+ - app/views/layouts/trail_guide/admin/_calculator.erb
201
+ - app/views/layouts/trail_guide/admin/_footer.html.erb
202
+ - app/views/layouts/trail_guide/admin/_header.html.erb
203
+ - app/views/layouts/trail_guide/admin/_import_modal.html.erb
131
204
  - app/views/layouts/trail_guide/admin/application.html.erb
132
- - app/views/trail_guide/admin/experiments/_combined_experiment.html.erb
205
+ - app/views/trail_guide/admin/experiments/_alert_peek.html.erb
206
+ - app/views/trail_guide/admin/experiments/_alert_state.html.erb
207
+ - app/views/trail_guide/admin/experiments/_btn_analyze.html.erb
208
+ - app/views/trail_guide/admin/experiments/_btn_analyze_goal.html.erb
209
+ - app/views/trail_guide/admin/experiments/_btn_convert.html.erb
210
+ - app/views/trail_guide/admin/experiments/_btn_enroll.html.erb
211
+ - app/views/trail_guide/admin/experiments/_btn_join.html.erb
212
+ - app/views/trail_guide/admin/experiments/_btn_leave.html.erb
213
+ - app/views/trail_guide/admin/experiments/_btn_pause.html.erb
214
+ - app/views/trail_guide/admin/experiments/_btn_peek.html.erb
215
+ - app/views/trail_guide/admin/experiments/_btn_reset.html.erb
216
+ - app/views/trail_guide/admin/experiments/_btn_restart.html.erb
217
+ - app/views/trail_guide/admin/experiments/_btn_resume.html.erb
218
+ - app/views/trail_guide/admin/experiments/_btn_schedule.html.erb
219
+ - app/views/trail_guide/admin/experiments/_btn_start.html.erb
220
+ - app/views/trail_guide/admin/experiments/_btn_stop.html.erb
133
221
  - app/views/trail_guide/admin/experiments/_experiment.html.erb
222
+ - app/views/trail_guide/admin/experiments/_header.html.erb
223
+ - app/views/trail_guide/admin/experiments/_start_modal.html.erb
224
+ - app/views/trail_guide/admin/experiments/_tbody.html.erb
225
+ - app/views/trail_guide/admin/experiments/_thead.html.erb
134
226
  - app/views/trail_guide/admin/experiments/index.html.erb
227
+ - app/views/trail_guide/admin/experiments/show.html.erb
228
+ - app/views/trail_guide/admin/groups/index.html.erb
229
+ - app/views/trail_guide/admin/groups/show.html.erb
230
+ - app/views/trail_guide/admin/orphans/_alert.html.erb
135
231
  - config/initializers/assets.rb
136
232
  - config/initializers/trailguide.rb
137
- - config/routes.rb
138
233
  - config/routes/admin.rb
139
234
  - config/routes/engine.rb
140
235
  - lib/trail_guide/adapters.rb
@@ -153,6 +248,10 @@ files:
153
248
  - lib/trail_guide/algorithms/distributed.rb
154
249
  - lib/trail_guide/algorithms/random.rb
155
250
  - lib/trail_guide/algorithms/weighted.rb
251
+ - lib/trail_guide/calculators.rb
252
+ - lib/trail_guide/calculators/bayesian.rb
253
+ - lib/trail_guide/calculators/calculator.rb
254
+ - lib/trail_guide/calculators/score.rb
156
255
  - lib/trail_guide/catalog.rb
157
256
  - lib/trail_guide/combined_experiment.rb
158
257
  - lib/trail_guide/config.rb
@@ -164,6 +263,11 @@ files:
164
263
  - lib/trail_guide/experiments/config.rb
165
264
  - lib/trail_guide/experiments/participant.rb
166
265
  - lib/trail_guide/helper.rb
266
+ - lib/trail_guide/metrics.rb
267
+ - lib/trail_guide/metrics/checkpoint.rb
268
+ - lib/trail_guide/metrics/config.rb
269
+ - lib/trail_guide/metrics/funnel.rb
270
+ - lib/trail_guide/metrics/goal.rb
167
271
  - lib/trail_guide/participant.rb
168
272
  - lib/trail_guide/spec_helper.rb
169
273
  - lib/trail_guide/unity.rb
@@ -189,7 +293,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
189
293
  - !ruby/object:Gem::Version
190
294
  version: '0'
191
295
  requirements: []
192
- rubygems_version: 3.0.3
296
+ rubyforge_project:
297
+ rubygems_version: 2.7.9
193
298
  signing_key:
194
299
  specification_version: 4
195
300
  summary: User experiments for rails
@@ -1,10 +0,0 @@
1
- <div class="footer container-fluid bg-light">
2
- <div class="row">
3
- <div class="col-sm text-left">
4
- <%= link_to "TrailGuide v#{TrailGuide::Version::VERSION}", "https://github.com/markrebec/trailguide", target: :blank, class: "text-muted" %>
5
- </div>
6
- <div class="col-sm text-right">
7
- <small class="text-muted"><%= TrailGuide.redis._client.id %><%= "/#{TrailGuide.redis.namespace}" if TrailGuide.redis.respond_to?(:namespace) %></small>
8
- </div>
9
- </div>
10
- </div>
@@ -1,42 +0,0 @@
1
- <nav class="navbar navbar-expanded-sm navbar-light bg-light">
2
- <%= link_to trail_guide_admin.experiments_path, class: "navbar-brand" do %>
3
- <%= image_tag "trail_guide/trailguide.png" %>
4
- <%= TrailGuide::Admin.configuration.title %>
5
- <% end %>
6
- <div class="col-sm text-center">
7
- <%= link_to trail_guide_admin.experiments_path, class: "text-dark" do %>
8
- <strong class="total">
9
- <%= TrailGuide.catalog.count %>
10
- </strong>
11
- <span>experiments</span>
12
- <% end %>
13
-
14
- <span>/</span>
15
-
16
- <%= link_to trail_guide_admin.scoped_experiments_path(scope: :running), class: "text-dark" do %>
17
- <strong class="total">
18
- <%= TrailGuide.catalog.running.count %>
19
- </strong>
20
- <span>running</span>
21
- <% end %>
22
-
23
- <span>/</span>
24
-
25
- <%= link_to trail_guide_admin.scoped_experiments_path(scope: :paused), class: "text-dark" do %>
26
- <strong class="total">
27
- <%= TrailGuide.catalog.paused.count %>
28
- </strong>
29
- <span>paused</span>
30
- <% end %>
31
-
32
- <span>/</span>
33
-
34
- <%= link_to trail_guide_admin.scoped_experiments_path(scope: :stopped), class: "text-dark" do %>
35
- <strong class="total">
36
- <%= TrailGuide.catalog.stopped.count %>
37
- </strong>
38
- <span>stopped</span>
39
- <% end %>
40
- </div>
41
- <span class="navbar-brand"><small class="text-muted"><%= TrailGuide::Admin.configuration.subtitle %></small></span>
42
- </nav>
@@ -1,189 +0,0 @@
1
- <div class="experiment row justify-content-center">
2
- <div class="col-sm-12 col-md-10 col-lg-8">
3
- <div class="row">
4
- <div class="col-sm-12 col-md-6 col-lg-8">
5
- <h4 id="<%= combined_experiment.experiment_name %>">
6
- <%= link_to combined_experiment.experiment_name.to_s.humanize.titleize, trail_guide_admin.experiments_path(anchor: combined_experiment.experiment_name), class: "text-dark" %>
7
- </h4>
8
- </div>
9
- <div class="col-sm-12 col-md-6 col-lg-4 text-right">
10
- <% if combined_experiment.running? %>
11
- <% if experiment_peekable?(combined_experiment) %>
12
- <% if experiment_peeking?(combined_experiment) %>
13
- <%= link_to trail_guide_admin.experiments_path(anchor: combined_experiment.experiment_name), class: 'btn btn-sm btn-outline-primary', method: :put, data: {toggle: :tooltip}, title: "hide this experiment's metrics" do %>
14
- <span class="fas fa-eye-slash" />
15
- <% end %>
16
- <% else %>
17
- <%= link_to peek_url(combined_experiment), class: 'btn btn-sm btn-primary', method: :put, data: {toggle: :tooltip}, title: "peek at this experiment's metrics" do %>
18
- <span class="fas fa-eye" />
19
- <% end %>
20
- <% end %>
21
- <% end %>
22
-
23
- <% if combined_experiment.configuration.can_resume? %>
24
- <%= link_to trail_guide_admin.pause_experiment_path(combined_experiment.experiment_name), class: 'btn btn-sm btn-warning', method: :put, data: {toggle: :tooltip}, title: 'pause this experiment - you will have the option to resume or reset' do %>
25
- <span class="fas fa-pause" />
26
- <% end %>
27
- <% end %>
28
-
29
- <%= link_to trail_guide_admin.stop_experiment_path(combined_experiment.experiment_name), class: 'btn btn-sm btn-danger', method: :put, data: {toggle: :tooltip}, title: 'stop this experiment - once stopped you will need to reset before restarting' do %>
30
- <span class="fas fa-stop" />
31
- <% end %>
32
-
33
- <%= link_to trail_guide_admin.restart_experiment_path(combined_experiment.experiment_name), class: 'btn btn-sm btn-danger',method: :put, data: {toggle: :tooltip}, title: 'restart this experiment - will reset all data and restart the experiment' do %>
34
- <span class="fas fa-redo" />
35
- <% end %>
36
- <% elsif combined_experiment.paused? %>
37
- <% if combined_experiment.configuration.can_resume? %>
38
- <%= link_to trail_guide_admin.resume_experiment_path(combined_experiment.experiment_name), class: 'btn btn-sm btn-success',method: :put, data: {toggle: :tooltip}, title: 'resume this experiment to start bucketing users and serving variants again' do %>
39
- <span class="fas fa-redo" />
40
- <% end %>
41
- <%= link_to trail_guide_admin.stop_experiment_path(combined_experiment.experiment_name), class: 'btn btn-sm btn-danger', method: :put, data: {toggle: :tooltip}, title: 'stop this experiment - once stopped you will need to reset before restarting' do %>
42
- <span class="fas fa-stop" />
43
- <% end %>
44
- <% end %>
45
- <%= link_to trail_guide_admin.restart_experiment_path(combined_experiment.experiment_name), class: 'btn btn-sm btn-danger',method: :put, data: {toggle: :tooltip}, title: 'restart this experiment - will reset all data and restart the experiment' do %>
46
- <span class="fas fa-redo" />
47
- <% end %>
48
- <% elsif combined_experiment.stopped? %>
49
- <%= link_to trail_guide_admin.restart_experiment_path(combined_experiment.experiment_name), class: 'btn btn-sm btn-danger',method: :put, data: {toggle: :tooltip}, title: 'restart this experiment - will reset all data and restart the experiment' do %>
50
- <span class="fas fa-redo" />
51
- <% end %>
52
- <% elsif !combined_experiment.started? %>
53
- <%= link_to trail_guide_admin.start_experiment_path(combined_experiment.experiment_name), class: 'btn btn-sm btn-success',method: :put, data: {toggle: :tooltip}, title: 'start this experiment' do %>
54
- <span class="fas fa-play" />
55
- <% end %>
56
- <% end %>
57
- <%= link_to trail_guide_admin.reset_experiment_path(combined_experiment.experiment_name), class: 'btn btn-sm btn-outline-danger',method: :put, data: {toggle: :tooltip}, title: "stop this experiment if it's running and reset all data" do %>
58
- <span class="fas fa-ban" />
59
- <% end %>
60
- </div>
61
- </div>
62
-
63
- <div class="row">
64
- <div class="col-sm-12 col-md-6 col-lg-8">
65
- <p><%= combined_experiment.configuration.summary %></p>
66
- </div>
67
- <div class="col-sm-12 col-md-6 col-lg-4 text-right">
68
- <% if combined_experiment.started? %>
69
- <small class="text-muted"><%= combined_experiment.started_at.strftime('%b %e %Y @ %l:%M %p') %></small>
70
- <span class="text-muted">&mdash;</span>
71
- <% if combined_experiment.stopped? %>
72
- <small class="text-muted"><%= combined_experiment.stopped_at.strftime('%b %e %Y @ %l:%M %p') %></small>
73
- <% elsif combined_experiment.paused? %>
74
- <small class="text-muted">paused</small>
75
- <% else %>
76
- <small class="text-muted">running</small>
77
- <% end %>
78
- <% else %>
79
- <small class="text-muted">not running</small>
80
- <% end %>
81
- </div>
82
- </div>
83
-
84
- <table class="table table-hover">
85
- <% combined_experiments = combined_experiment.combined.map { |e| TrailGuide.catalog.find(e) } %>
86
- <% combined_experiments.each do |experiment| %>
87
- <thead class="thead-light">
88
- <tr>
89
- <th scope="col">
90
- <h5 id="<%= experiment.experiment_name %>">
91
- <%= link_to experiment.experiment_name.to_s.humanize.titleize, trail_guide_admin.experiments_path(anchor: experiment.experiment_name), class: "text-dark" %>
92
- </h5>
93
- </th>
94
-
95
- <th scope="col">Participants</th>
96
-
97
- <% if experiment.goals.empty? %>
98
- <th scope="col">Converted</th>
99
- <% else %>
100
- <% experiment.goals.each do |goal| %>
101
- <th scope="col"><%= goal.to_s.humanize.titleize %></th>
102
- <% end %>
103
- <% end %>
104
-
105
- <th>&nbsp;</th>
106
- </tr>
107
- </thead>
108
-
109
- <tbody>
110
- <% experiment.variants.each do |variant| %>
111
- <tr>
112
- <th scope="row">
113
- <% if experiment.configuration.preview_url? %>
114
- <%= link_to variant.name.to_s.humanize.titleize, preview_url(variant), target: :blank, class: "text-dark" %>
115
- <% else %>
116
- <%= variant.name.to_s.humanize.titleize %>
117
- <% end %>
118
-
119
- <% if experiment.running? && !experiment.winner? && participant.variant(experiment) == variant %>
120
- <span class="fas fa-user text-muted" data-toggle="tooltip" title="you are currently in this cohort"></span>
121
- <% end %>
122
- <% if experiment.winner? && variant == experiment.winner %>
123
- <span class="fas fa-star text-primary" data-toggle="tooltip" title="this variant has been promoted as the winner of the experiment"></span>
124
- <% end %>
125
- <% if variant.control? %>
126
- <span class="fas fa-cog text-muted" data-toggle="tooltip" title="this variant is the control group for this experiment"></span>
127
- <% end %>
128
- </th>
129
-
130
- <td><%= experiment_metric combined_experiment, variant.participants %></td>
131
-
132
- <% if experiment.goals.empty? %>
133
- <td><%= experiment_metric combined_experiment, variant.converted %></td>
134
- <% else %>
135
- <% experiment.goals.each do |goal| %>
136
- <td><%= experiment_metric combined_experiment, variant.converted(goal) %></td>
137
- <% end %>
138
- <% end %>
139
-
140
- <td class="text-right">
141
- <% if experiment.running? && !experiment.winner? %>
142
- <% if participant.variant(experiment) == variant %>
143
- <%= link_to trail_guide_admin.leave_experiment_path(experiment.experiment_name), class: "btn btn-sm btn-outline-secondary", method: :put, data: {toggle: :tooltip}, title: 'leave this cohort' do %>
144
- <span class="fas fa-sign-out-alt" />
145
- <% end %>
146
- <% else %>
147
- <%= link_to trail_guide_admin.join_experiment_path(experiment.experiment_name, variant.name), class: "btn btn-sm btn-secondary", method: :put, data: {toggle: :tooltip}, title: 'join this cohort' do %>
148
- <span class="fas fa-sign-in-alt" />
149
- <% end %>
150
- <% end %>
151
- <% end %>
152
-
153
- <% if !experiment.winner? || variant != experiment.winner %>
154
- <%= link_to trail_guide_admin.winner_experiment_path(experiment.experiment_name, variant.name), class: "btn btn-sm btn-#{experiment.winner? ? "outline-" : ""}primary", method: :put, data: {toggle: :tooltip}, title: 'rollout this variant as the winner for this experiment' do %>
155
- <span class="fas fa-star" />
156
- <% end %>
157
- <% elsif experiment.winner? && variant == experiment.winner %>
158
- <%= link_to trail_guide_admin.clear_experiment_path(experiment.experiment_name), class: "btn btn-sm btn-warning", method: :put, data: {toggle: :tooltip}, title: 'remove this variant as the selected winner' do %>
159
- <span class="fas fa-window-close" />
160
- <% end %>
161
- <% end %>
162
- </td>
163
- </tr>
164
- <% end %>
165
- </tbody>
166
- <% end %>
167
-
168
- <tfoot class="thead-light">
169
- <tr>
170
- <th scope="row">&nbsp;</th>
171
- <th>
172
- <span><%= number_with_delimiter combined_experiment.participants %></span>
173
- <% if combined_experiment.configuration.target_sample_size %>
174
- <span class="text-muted">/ <%= number_with_delimiter combined_experiment.configuration.target_sample_size %></span>
175
- <% end %>
176
- </th>
177
- <% if combined_experiment.goals.empty? %>
178
- <th><%= experiment_metric combined_experiment, combined_experiments.sum(&:converted) %></th>
179
- <% else %>
180
- <% combined_experiment.goals.each do |goal| %>
181
- <th><%= experiment_metric combined_experiment, combined_experiments.sum { |e| e.converted(goal) } %></th>
182
- <% end %>
183
- <% end %>
184
- <th>&nbsp;</th>
185
- </tr>
186
- </tfoot>
187
- </table>
188
- </div>
189
- </div>
data/config/routes.rb DELETED
@@ -1,5 +0,0 @@
1
- # this not only organizes the routes, but also ensures they're only included
2
- # once (via ruby require behavior), because having two separate engines in the
3
- # gem can cause routes to be parsed twice and double up
4
- require_relative 'routes/engine'
5
- require_relative 'routes/admin'