snapstats 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 (72) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +20 -0
  3. data/Rakefile +34 -0
  4. data/app/assets/javascripts/snapstats/application.js +19 -0
  5. data/app/assets/javascripts/snapstats/lib/d3.min.js +5 -0
  6. data/app/assets/javascripts/snapstats/lib/jquery.min.js +4 -0
  7. data/app/assets/javascripts/snapstats/lib/metricsgraphics.min.js +3 -0
  8. data/app/assets/javascripts/snapstats/main/main_controller.js +51 -0
  9. data/app/assets/javascripts/snapstats/performances/performances_controller.js +49 -0
  10. data/app/assets/javascripts/snapstats/users/users_controller.js +47 -0
  11. data/app/assets/stylesheets/snapstats/animate.css +3158 -0
  12. data/app/assets/stylesheets/snapstats/app.css +58 -0
  13. data/app/assets/stylesheets/snapstats/application.css +18 -0
  14. data/app/assets/stylesheets/snapstats/bootstrap.min.css +5 -0
  15. data/app/assets/stylesheets/snapstats/metricsgraphics-demo-dark.css +636 -0
  16. data/app/assets/stylesheets/snapstats/metricsgraphics.css +363 -0
  17. data/app/controllers/snapstats/application_controller.rb +5 -0
  18. data/app/controllers/snapstats/mains_controller.rb +18 -0
  19. data/app/controllers/snapstats/performances_controller.rb +18 -0
  20. data/app/controllers/snapstats/users_controller.rb +22 -0
  21. data/app/helpers/snapstats/application_helper.rb +7 -0
  22. data/app/views/layouts/snapstats/application.html.erb +20 -0
  23. data/app/views/snapstats/application/_main_menu.html.erb +8 -0
  24. data/app/views/snapstats/mains/show.html.erb +87 -0
  25. data/app/views/snapstats/performances/show.html.erb +80 -0
  26. data/app/views/snapstats/users/activity.html.erb +49 -0
  27. data/app/views/snapstats/users/show.html.erb +32 -0
  28. data/config/routes.rb +23 -0
  29. data/lib/event_logger/event_logger.rb +45 -0
  30. data/lib/event_logger/event_logger_static.rb +55 -0
  31. data/lib/event_logger/event_logger_store.rb +89 -0
  32. data/lib/event_reader/event_reader.rb +168 -0
  33. data/lib/ext/redis.rb +19 -0
  34. data/lib/snapstats/engine.rb +9 -0
  35. data/lib/snapstats/version.rb +3 -0
  36. data/lib/snapstats.rb +8 -0
  37. data/lib/tasks/snapstats_tasks.rake +4 -0
  38. data/test/dummy/README.rdoc +28 -0
  39. data/test/dummy/Rakefile +6 -0
  40. data/test/dummy/app/assets/javascripts/application.js +13 -0
  41. data/test/dummy/app/assets/stylesheets/application.css +13 -0
  42. data/test/dummy/app/controllers/application_controller.rb +5 -0
  43. data/test/dummy/app/helpers/application_helper.rb +2 -0
  44. data/test/dummy/app/views/layouts/application.html.erb +14 -0
  45. data/test/dummy/bin/bundle +3 -0
  46. data/test/dummy/bin/rails +4 -0
  47. data/test/dummy/bin/rake +4 -0
  48. data/test/dummy/config/application.rb +23 -0
  49. data/test/dummy/config/boot.rb +5 -0
  50. data/test/dummy/config/database.yml +25 -0
  51. data/test/dummy/config/environment.rb +5 -0
  52. data/test/dummy/config/environments/development.rb +29 -0
  53. data/test/dummy/config/environments/production.rb +80 -0
  54. data/test/dummy/config/environments/test.rb +36 -0
  55. data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
  56. data/test/dummy/config/initializers/filter_parameter_logging.rb +4 -0
  57. data/test/dummy/config/initializers/inflections.rb +16 -0
  58. data/test/dummy/config/initializers/mime_types.rb +5 -0
  59. data/test/dummy/config/initializers/secret_token.rb +12 -0
  60. data/test/dummy/config/initializers/session_store.rb +3 -0
  61. data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
  62. data/test/dummy/config/locales/en.yml +23 -0
  63. data/test/dummy/config/routes.rb +4 -0
  64. data/test/dummy/config.ru +4 -0
  65. data/test/dummy/public/404.html +58 -0
  66. data/test/dummy/public/422.html +58 -0
  67. data/test/dummy/public/500.html +57 -0
  68. data/test/dummy/public/favicon.ico +0 -0
  69. data/test/integration/navigation_test.rb +10 -0
  70. data/test/snapstats_test.rb +7 -0
  71. data/test/test_helper.rb +15 -0
  72. metadata +206 -0
@@ -0,0 +1,363 @@
1
+ .mg-active-datapoint {
2
+ fill: black;
3
+ font-size: 0.9rem;
4
+ font-weight: 400;
5
+ opacity: 0.8;
6
+ }
7
+
8
+ .mg-area1-color {
9
+ fill: #0000ff;
10
+ }
11
+
12
+ .mg-area2-color {
13
+ fill: #05b378;
14
+ }
15
+
16
+ .mg-area3-color {
17
+ fill: #db4437;
18
+ }
19
+
20
+ .mg-area4-color {
21
+ fill: #f8b128;
22
+ }
23
+
24
+ .mg-area5-color {
25
+ fill: #5c5c5c;
26
+ }
27
+
28
+ .mg-barplot rect.mg-bar {
29
+ shape-rendering: auto;
30
+ fill: #b6b6fc;
31
+ }
32
+
33
+ .mg-barplot rect.mg-bar.active {
34
+ fill: #9e9efc;
35
+ }
36
+
37
+ .mg-barplot .mg-bar-prediction {
38
+ fill: #5b5b5b;
39
+ }
40
+
41
+ .mg-barplot .mg-bar-baseline {
42
+ stroke: #5b5b5b;
43
+ stroke-width: 2;
44
+ }
45
+
46
+ .mg-baselines line {
47
+ opacity: 1;
48
+ shape-rendering: auto;
49
+ stroke: #b3b2b2;
50
+ stroke-width: 1px;
51
+ }
52
+
53
+ .mg-baselines text {
54
+ fill: black;
55
+ font-size: 0.7rem;
56
+ opacity: 0.5;
57
+ stroke: none;
58
+ }
59
+
60
+ .mg-chart-title .popover {
61
+ font-size: 0.95rem;
62
+ }
63
+
64
+ .mg-chart-title .popover-content {
65
+ cursor: auto;
66
+ line-height: 17px;
67
+ }
68
+
69
+ .mg-chart-title .popover.top,
70
+ .mg-data-table .popover.top {
71
+ margin-top: 0;
72
+ }
73
+
74
+ .mg-chart-title {
75
+ cursor: default;
76
+ font-size: 1.8rem;
77
+ padding-top: 8px;
78
+ text-align: center;
79
+ }
80
+
81
+ .mg-chart-title .fa {
82
+ color: #ccc;
83
+ font-size: 1.2rem;
84
+ padding-left: 4px;
85
+ vertical-align: top;
86
+ }
87
+
88
+ .mg-chart-title .fa.warning {
89
+ font-weight: 300;
90
+ }
91
+
92
+ .mg-points circle {
93
+ opacity: 0.85;
94
+ }
95
+
96
+ .mg-data-table {
97
+ margin-top: 30px;
98
+ }
99
+
100
+ .mg-data-table thead tr th {
101
+ border-bottom: 1px solid darkgray;
102
+ cursor: default;
103
+ font-size: 1.1rem;
104
+ font-weight: normal;
105
+ padding: 5px 5px 8px 5px;
106
+ text-align: right;
107
+ }
108
+
109
+ .mg-data-table thead tr th .fa {
110
+ color: #ccc;
111
+ padding-left: 4px;
112
+ }
113
+
114
+ .mg-data-table thead tr th .popover {
115
+ font-size: 1rem;
116
+ font-weight: normal;
117
+ }
118
+
119
+ .mg-data-table .secondary-title {
120
+ color: darkgray;
121
+ }
122
+
123
+ .mg-data-table tbody tr td {
124
+ margin: 2px;
125
+ padding: 5px;
126
+ vertical-align: top;
127
+ }
128
+
129
+ .mg-data-table tbody tr td.table-text {
130
+ opacity: 0.8;
131
+ padding-left: 30px;
132
+ }
133
+
134
+ .mg-y-axis line.mg-extended-y-ticks {
135
+ opacity: 0.4;
136
+ }
137
+
138
+ .mg-x-axis line.mg-extended-x-ticks {
139
+ opacity: 0.4;
140
+ }
141
+
142
+ .mg-histogram .axis path,
143
+ .mg-histogram .axis line {
144
+ fill: none;
145
+ opacity: 0.7;
146
+ shape-rendering: auto;
147
+ stroke: #ccc;
148
+ }
149
+
150
+ .mg-histogram .mg-bar rect {
151
+ fill: #b6b6fc;
152
+ shape-rendering: auto;
153
+ }
154
+
155
+ .mg-histogram .mg-bar rect.active {
156
+ fill: #9e9efc;
157
+ }
158
+
159
+ .mg-least-squares-line {
160
+ stroke: red;
161
+ stroke-width: 1px;
162
+ }
163
+
164
+ .mg-lowess-line {
165
+ fill: none;
166
+ stroke: red;
167
+ }
168
+
169
+ .mg-line1-color {
170
+ stroke: #4040e8;
171
+ }
172
+
173
+ .mg-hover-line1-color {
174
+ fill: #4040e8;
175
+ }
176
+
177
+ .mg-line2-color {
178
+ stroke: #05b378;
179
+ }
180
+
181
+ .mg-hover-line2-color {
182
+ fill: #05b378;
183
+ }
184
+
185
+ .mg-line3-color {
186
+ stroke: #db4437;
187
+ }
188
+
189
+ .mg-hover-line3-color {
190
+ fill: #db4437;
191
+ }
192
+
193
+ .mg-line4-color {
194
+ stroke: #f8b128;
195
+ }
196
+
197
+ .mg-hover-line4-color {
198
+ fill: #f8b128;
199
+ }
200
+
201
+ .mg-line5-color {
202
+ stroke: #5c5c5c;
203
+ }
204
+
205
+ .mg-hover-line5-color {
206
+ fill: #5c5c5c;
207
+ }
208
+
209
+ .mg-line1-legend-color {
210
+ color: #4040e8;
211
+ }
212
+
213
+ .mg-line2-legend-color {
214
+ color: #05b378;
215
+ }
216
+
217
+ .mg-line3-legend-color {
218
+ color: #db4437;
219
+ }
220
+
221
+ .mg-line4-legend-color {
222
+ color: #f8b128;
223
+ }
224
+
225
+ .mg-line5-legend-color {
226
+ color: #5c5c5c;
227
+ }
228
+
229
+ .mg-main-area-solid svg .mg-main-area {
230
+ fill: #ccccff;
231
+ opacity: 1;
232
+ }
233
+
234
+ .mg-markers line {
235
+ opacity: 0.9;
236
+ shape-rendering: auto;
237
+ stroke: #b3b2b2;
238
+ stroke-width: 1px;
239
+ }
240
+
241
+ .mg-markers text {
242
+ fill: black;
243
+ font-size: 0.7rem;
244
+ opacity: 0.5;
245
+ stroke: none;
246
+ }
247
+
248
+ .mg-missing-text {
249
+ opacity: 0.9;
250
+ }
251
+
252
+ .mg-missing-background {
253
+ stroke: blue;
254
+ fill: none;
255
+ stroke-dasharray: 10,5;
256
+ stroke-opacity: 0.05;
257
+ stroke-width: 2;
258
+ }
259
+
260
+ .mg-missing .mg-main-line {
261
+ opacity: 0.1;
262
+ }
263
+
264
+ .mg-missing .mg-main-area {
265
+ opacity: 0.03;
266
+ }
267
+
268
+ path.mg-main-area {
269
+ opacity: 0.2;
270
+ stroke: none;
271
+ }
272
+
273
+ path.mg-confidence-band {
274
+ fill: #ccc;
275
+ opacity: 0.4;
276
+ stroke: none;
277
+ }
278
+
279
+ path.mg-main-line {
280
+ fill: none;
281
+ opacity: 0.8;
282
+ stroke-width: 1.1px;
283
+ }
284
+
285
+ .mg-points circle {
286
+ fill-opacity: 0.4;
287
+ stroke-opacity: 1;
288
+ }
289
+
290
+ circle.mg-points-mono {
291
+ fill: #0000ff;
292
+ stroke: #0000ff;
293
+ }
294
+
295
+ /* a selected point in a scatterplot */
296
+ .mg-points circle.selected {
297
+ fill-opacity: 1;
298
+ stroke-opacity: 1;
299
+ }
300
+
301
+ .mg-voronoi path {
302
+ fill: none;
303
+ pointer-events: all;
304
+ stroke: none;
305
+ stroke-opacity: 0.1;
306
+ }
307
+
308
+ .mg-x-rug-mono,
309
+ .mg-y-rug-mono {
310
+ stroke: black;
311
+ }
312
+
313
+ .mg-x-axis line,
314
+ .mg-y-axis line {
315
+ opacity: 1;
316
+ shape-rendering: auto;
317
+ stroke: #b3b2b2;
318
+ stroke-width: 1px;
319
+ }
320
+
321
+ .mg-x-axis text,
322
+ .mg-y-axis text,
323
+ .mg-histogram .axis text {
324
+ fill: black;
325
+ font-size: 0.9rem;
326
+ opacity: 0.5;
327
+ }
328
+
329
+ .mg-x-axis .label,
330
+ .mg-y-axis .label,
331
+ .mg-axis .label {
332
+ font-size: 0.8rem;
333
+ text-transform: uppercase;
334
+ font-weight: 400;
335
+ }
336
+
337
+ .mg-x-axis-small text,
338
+ .mg-y-axis-small text,
339
+ .mg-active-datapoint-small {
340
+ font-size: 0.6rem;
341
+ }
342
+
343
+ .mg-x-axis-small .label,
344
+ .mg-y-axis-small .label {
345
+ font-size: 0.65rem;
346
+ }
347
+
348
+ .mg-year-marker text {
349
+ fill: black;
350
+ font-size: 0.7rem;
351
+ opacity: 0.5;
352
+ }
353
+
354
+ .mg-year-marker line {
355
+ opacity: 1;
356
+ shape-rendering: auto;
357
+ stroke: #b3b2b2;
358
+ stroke-width: 1px;
359
+ }
360
+
361
+ .mg-year-marker-small text {
362
+ font-size: 0.6rem;
363
+ }
@@ -0,0 +1,5 @@
1
+ module Snapstats
2
+ class ApplicationController < ActionController::Base
3
+
4
+ end
5
+ end
@@ -0,0 +1,18 @@
1
+ module Snapstats
2
+ class MainsController < ApplicationController
3
+
4
+ def show
5
+ @uniqs = EventReader::Uniqs.fetch_uniqs
6
+ @clicks = EventReader::Cpm.fetch_all_hash
7
+ @platforms = EventReader::Browsers.fetch_platforms
8
+ @browsers = EventReader::Browsers.fetch_browsers
9
+ end
10
+
11
+ def chart
12
+ data = EventReader::Cpm.fetch_all_chart
13
+ render json: data
14
+ end
15
+
16
+ end
17
+ end
18
+
@@ -0,0 +1,18 @@
1
+ module Snapstats
2
+ class PerformancesController < ApplicationController
3
+
4
+ def index
5
+
6
+ end
7
+
8
+ def show
9
+ @controllers = Snapstats::EventReader::Performance.fetch_slowest_controllers
10
+ end
11
+
12
+ def chart
13
+ data = Snapstats::EventReader::Activity.fetch_all_chart
14
+ render json: {data: data.values, legend: data.keys}
15
+ end
16
+
17
+ end
18
+ end
@@ -0,0 +1,22 @@
1
+ module Snapstats
2
+ class UsersController < ApplicationController
3
+
4
+ def index
5
+
6
+ end
7
+
8
+ def show
9
+ @users = EventReader::UserActivity.fetch_all
10
+ end
11
+
12
+ def activity
13
+ @user_email = EventReader::UserActivity.fetch_email_by_uid params[:id]
14
+ @activity = EventReader::UserActivity.fetch_for_user params[:id]
15
+ end
16
+
17
+ def chart
18
+ render json: EventReader::UserActivity.fetch_chart_for_user(params[:id])
19
+ end
20
+
21
+ end
22
+ end
@@ -0,0 +1,7 @@
1
+ module Snapstats
2
+ module ApplicationHelper
3
+ def active_cat? cat_type
4
+ raw "class=\"active section-#{cat_type}\"" if params[:controller].scan(/#{cat_type.to_s}/).present?
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,20 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title>Snapstats</title>
5
+ <%= stylesheet_link_tag "snapstats/application", media: "all" %>
6
+ <%= javascript_include_tag "snapstats/application" %>
7
+ <%= csrf_meta_tags %>
8
+ </head>
9
+ <body>
10
+
11
+ <div class="app-container">
12
+
13
+ <%= render 'main_menu' %>
14
+ <%= yield %>
15
+
16
+ </div>
17
+
18
+
19
+ </body>
20
+ </html>
@@ -0,0 +1,8 @@
1
+ <div class="container">
2
+ <ul class="menu pull-left">
3
+ <li <%= active_cat? :main %>> <%= link_to 'Daily report', root_path %> </li>
4
+ <li <%= active_cat? :user %>> <a href="#"><%= link_to 'Users', user_path %></a></li>
5
+ <li <%= active_cat? :performance %>> <a href="#"><%= link_to 'Performance', performance_path %></li>
6
+ <li <%= active_cat? :reports %>> <a href="#"><%= link_to 'Reports', performance_path %></li>
7
+ </ul>
8
+ </div>
@@ -0,0 +1,87 @@
1
+
2
+
3
+ <div class="container animated fadeIn">
4
+
5
+ <div class="panel panel-wgt">
6
+ <div class="panel-heading">
7
+ <h3 class="panel-title">Activity</h3>
8
+ </div>
9
+ <div class="panel-body">
10
+ <div class="chart"></div>
11
+ </div>
12
+ </div>
13
+
14
+ </div>
15
+
16
+ <!-- Daily overview -->
17
+
18
+ <div class="container animated fadeIn">
19
+
20
+ <div class="page-header">
21
+ <h1>Daily overview</h1>
22
+ </div>
23
+
24
+ <div class="row">
25
+ <div class="col-lg-12">
26
+ <table class="table">
27
+
28
+ <tr>
29
+ <td class="col-lg-8">Unique visits</td>
30
+ <td><%= @uniqs %></td>
31
+ </tr>
32
+
33
+ <tr class="clean-cell">
34
+ <td>&nbsp;</td>
35
+ <td>&nbsp;</td>
36
+ </tr>
37
+
38
+ <tr>
39
+ <td>Clicks per minute</td>
40
+ <td><%= @clicks[:cpm] %></td>
41
+ </tr>
42
+
43
+ <tr>
44
+ <td>Clicks per hour</td>
45
+ <td><%= @clicks[:cph] %></td>
46
+ </tr>
47
+
48
+ <tr>
49
+ <td>Clicks per day</td>
50
+ <td><%= @clicks[:cpd] %></td>
51
+ </tr>
52
+
53
+
54
+ <tr class="clean-cell">
55
+ <td>&nbsp;</td>
56
+ <td>&nbsp;</td>
57
+ </tr>
58
+
59
+ <!-- Platforms -->
60
+
61
+ <% @platforms.each do |i| %>
62
+ <tr>
63
+ <td><%= i.name %></td>
64
+ <td><%= i.total %></td>
65
+ </tr>
66
+ <% end %>
67
+
68
+ <!-- Browsers -->
69
+
70
+ <tr class="clean-cell">
71
+ <td>&nbsp;</td>
72
+ <td>&nbsp;</td>
73
+ </tr>
74
+
75
+ <% @browsers.each do |i| %>
76
+ <tr>
77
+ <td><%= i.name %></td>
78
+ <td><%= i.total %></td>
79
+ </tr>
80
+ <% end %>
81
+
82
+ </table>
83
+ </div>
84
+ </div>
85
+
86
+ </div>
87
+
@@ -0,0 +1,80 @@
1
+ <div class="container animated fadeIn">
2
+
3
+ <div class="panel panel-wgt">
4
+ <div class="panel-heading">
5
+ <h3 class="panel-title">Load Average</h3>
6
+ </div>
7
+ <div class="panel-body">
8
+ <div class="chart-performance"></div>
9
+ <div class="legend pull-right"></div>
10
+ </div>
11
+ </div>
12
+
13
+ </div>
14
+
15
+
16
+
17
+ <div class="container animated fadeIn">
18
+
19
+ <div class="page-header">
20
+ <h1>Top Slowest Actions</h1>
21
+ </div>
22
+
23
+ <div class="row">
24
+ <div class="col-lg-12">
25
+ <table class="table">
26
+
27
+ <tr>
28
+ <th class="col-lg-6"> Controller </th>
29
+ <th class="col-lg-4">Action</th>
30
+ <th>Render time (ms)</th>
31
+ </tr>
32
+
33
+ <% @controllers.each do |i| %>
34
+ <tr>
35
+ <td> <%= i.controller %> </td>
36
+ <td> <%= i.action %> </td>
37
+ <td><%= i.render_time %></td>
38
+ </tr>
39
+ <% end %>
40
+
41
+ </table>
42
+ </div>
43
+ </div>
44
+
45
+ </div>
46
+
47
+
48
+ <div class="container animated fadeIn" style="display:none;">
49
+
50
+ <div class="page-header">
51
+ <h1>System Component</h1>
52
+ </div>
53
+
54
+ <div class="row">
55
+ <div class="col-lg-12">
56
+ <table class="table">
57
+
58
+ <tr>
59
+ <td class="col-lg-5">admin@admin.local</td>
60
+ <td class="col-lg-3">5 minutes ago</td>
61
+ <td>/companies</td>
62
+ </tr>
63
+
64
+ <tr>
65
+ <td>test1@local</td>
66
+ <td>10 minutes ago</td>
67
+ <td>/companies</td>
68
+ </tr>
69
+
70
+ <tr>
71
+ <td>test2@local</td>
72
+ <td>15 minutes ago</td>
73
+ <td>/companies</td>
74
+ </tr>
75
+
76
+ </table>
77
+ </div>
78
+ </div>
79
+
80
+ </div>
@@ -0,0 +1,49 @@
1
+
2
+ <div class="container animated fadeIn">
3
+
4
+ <div class="panel panel-wgt">
5
+ <div class="panel-heading">
6
+ <h3 class="panel-title"><%= @user_email %></h3>
7
+ </div>
8
+ <div class="panel-body">
9
+ <div class="user-activity-chart"></div>
10
+ </div>
11
+ </div>
12
+
13
+ </div>
14
+
15
+ <div class="container animated fadeIn">
16
+
17
+ <div class="page-header">
18
+ <h1>Requests </h1>
19
+ </div>
20
+
21
+ <div class="row">
22
+ <div class="col-lg-12">
23
+ <table class="table">
24
+
25
+ <tr>
26
+ <th class="col-lg-5"> Path </th>
27
+ <th class="col-lg-3"> Time </th>
28
+ <th>Render Time (ms)</th>
29
+ <th>Platform</th>
30
+ <th>Browser</th>
31
+ </tr>
32
+
33
+ <% @activity.each do |i| %>
34
+
35
+ <tr>
36
+ <td> <%= i.path %> </td>
37
+ <td> <%= time_ago_in_words i.date, locale: :en %> </td>
38
+ <td> <%= i.render_time %> </td>
39
+ <td> <%= i.os %> </td>
40
+ <td> <%= i.browser %> <%= i.version %> </td>
41
+ </tr>
42
+
43
+ <% end %>
44
+
45
+ </table>
46
+ </div>
47
+ </div>
48
+
49
+ </div>
@@ -0,0 +1,32 @@
1
+
2
+ <div class="container animated fadeIn">
3
+
4
+ <div class="page-header">
5
+ <h1>Users Activity</h1>
6
+ </div>
7
+
8
+ <div class="row">
9
+ <div class="col-lg-12">
10
+ <table class="table">
11
+
12
+ <tr>
13
+ <th class="col-lg-5"> User email </th>
14
+ <th class="col-lg-3"> Time </th>
15
+ <th>Path</th>
16
+ </tr>
17
+
18
+ <% @users.each do |i| %>
19
+
20
+ <tr>
21
+ <td> <%= link_to i.email, activity_user_path(i.user_id) %> </td>
22
+ <td> <%= time_ago_in_words i.date, locale: :en %> </td>
23
+ <td> <%= i.path %> </td>
24
+ </tr>
25
+
26
+ <% end %>
27
+
28
+ </table>
29
+ </div>
30
+ </div>
31
+
32
+ </div>