snapstats 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
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>