redis_analytics 1.0.1 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (41) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +8 -0
  3. data/Gemfile.lock +200 -0
  4. data/README.md +4 -2
  5. data/app/controllers/redis_analytics/api_controller.rb +1 -1
  6. data/app/helpers/redis_analytics/visits_helper.rb +1 -1
  7. data/config/routes.rb +1 -0
  8. data/coverage/assets/0.10.2/application.css +799 -0
  9. data/coverage/assets/0.10.2/application.js +1707 -0
  10. data/coverage/assets/0.10.2/colorbox/border.png +0 -0
  11. data/coverage/assets/0.10.2/colorbox/controls.png +0 -0
  12. data/coverage/assets/0.10.2/colorbox/loading.gif +0 -0
  13. data/coverage/assets/0.10.2/colorbox/loading_background.png +0 -0
  14. data/coverage/assets/0.10.2/favicon_green.png +0 -0
  15. data/coverage/assets/0.10.2/favicon_red.png +0 -0
  16. data/coverage/assets/0.10.2/favicon_yellow.png +0 -0
  17. data/coverage/assets/0.10.2/loading.gif +0 -0
  18. data/coverage/assets/0.10.2/magnify.png +0 -0
  19. data/coverage/assets/0.10.2/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
  20. data/coverage/assets/0.10.2/smoothness/images/ui-bg_flat_75_ffffff_40x100.png +0 -0
  21. data/coverage/assets/0.10.2/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png +0 -0
  22. data/coverage/assets/0.10.2/smoothness/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
  23. data/coverage/assets/0.10.2/smoothness/images/ui-bg_glass_75_dadada_1x400.png +0 -0
  24. data/coverage/assets/0.10.2/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png +0 -0
  25. data/coverage/assets/0.10.2/smoothness/images/ui-bg_glass_95_fef1ec_1x400.png +0 -0
  26. data/coverage/assets/0.10.2/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png +0 -0
  27. data/coverage/assets/0.10.2/smoothness/images/ui-icons_222222_256x240.png +0 -0
  28. data/coverage/assets/0.10.2/smoothness/images/ui-icons_2e83ff_256x240.png +0 -0
  29. data/coverage/assets/0.10.2/smoothness/images/ui-icons_454545_256x240.png +0 -0
  30. data/coverage/assets/0.10.2/smoothness/images/ui-icons_888888_256x240.png +0 -0
  31. data/coverage/assets/0.10.2/smoothness/images/ui-icons_cd0a0a_256x240.png +0 -0
  32. data/coverage/index.html +3483 -0
  33. data/lib/redis_analytics/engine.rb +4 -4
  34. data/lib/redis_analytics/helpers.rb +1 -1
  35. data/lib/redis_analytics/metrics.rb +1 -1
  36. data/lib/redis_analytics/version.rb +1 -2
  37. data/lib/redis_analytics/visit.rb +1 -1
  38. data/redis_analytics.gemspec +1 -1
  39. data/spec/lib/redis_analytics/configuration_spec.rb +2 -2
  40. data/test/dummy/Gemfile.lock +121 -0
  41. metadata +32 -5
@@ -0,0 +1,3483 @@
1
+ <!DOCTYPE html>
2
+ <html xmlns='http://www.w3.org/1999/xhtml'>
3
+ <head>
4
+ <title>Code coverage for Redis analytics</title>
5
+ <meta http-equiv="content-type" content="text/html; charset=utf-8" />
6
+ <script src='./assets/0.10.2/application.js' type='text/javascript'></script>
7
+ <link href='./assets/0.10.2/application.css' media='screen, projection, print' rel='stylesheet' type='text/css'>
8
+ <link rel="shortcut icon" type="image/png" href="./assets/0.10.2/favicon_red.png" />
9
+ <link rel="icon" type="image/png" href="./assets/0.10.2/favicon.png" />
10
+ </head>
11
+
12
+ <body>
13
+ <div id="loading">
14
+ <img src="./assets/0.10.2/loading.gif" alt="loading"/>
15
+ </div>
16
+ <div id="wrapper" style="display:none;">
17
+ <div class="timestamp">Generated <abbr class="timeago" title="2019-08-26T21:47:34+05:30">2019-08-26T21:47:34+05:30</abbr></div>
18
+ <ul class="group_tabs"></ul>
19
+
20
+ <div id="content">
21
+ <div class="file_list_container" id="AllFiles">
22
+ <h2>
23
+ <span class="group_name">All Files</span>
24
+ (<span class="covered_percent"><span class="red">78.17%</span></span>
25
+ covered at
26
+ <span class="covered_strength">
27
+ <span class="green">
28
+ 6.68
29
+ </span>
30
+ </span> hits/line)
31
+ </h2>
32
+ <a name="AllFiles"></a>
33
+ <div>
34
+ <b>9</b> files in total.
35
+ <b>284</b> relevant lines.
36
+ <span class="green"><b>222</b> lines covered</span> and
37
+ <span class="red"><b>62</b> lines missed </span>
38
+ </div>
39
+ <table class="file_list">
40
+ <thead>
41
+ <tr>
42
+ <th>File</th>
43
+ <th>% covered</th>
44
+ <th>Lines</th>
45
+ <th>Relevant Lines</th>
46
+ <th>Lines covered</th>
47
+ <th>Lines missed</th>
48
+ <th>Avg. Hits / Line</th>
49
+ </tr>
50
+ </thead>
51
+ <tbody>
52
+
53
+ <tr>
54
+ <td class="strong"><a href="#709e5b575527bfb0fe8d6cf469b4f763bdd67521" class="src_link" title="lib/redis_analytics.rb">lib/redis_analytics.rb</a></td>
55
+ <td class="green strong">100.0 %</td>
56
+ <td>19</td>
57
+ <td>15</td>
58
+ <td>15</td>
59
+ <td>0</td>
60
+ <td>1.0</td>
61
+ </tr>
62
+
63
+ <tr>
64
+ <td class="strong"><a href="#78e9cdccdb69ce4fd7b2aef653c5c7650ae690af" class="src_link" title="lib/redis_analytics/configuration.rb">lib/redis_analytics/configuration.rb</a></td>
65
+ <td class="green strong">95.45 %</td>
66
+ <td>101</td>
67
+ <td>44</td>
68
+ <td>42</td>
69
+ <td>2</td>
70
+ <td>3.6</td>
71
+ </tr>
72
+
73
+ <tr>
74
+ <td class="strong"><a href="#d7d2f13be7d44f86b655a354e76d93137d9a6412" class="src_link" title="lib/redis_analytics/engine.rb">lib/redis_analytics/engine.rb</a></td>
75
+ <td class="red strong">75.0 %</td>
76
+ <td>25</td>
77
+ <td>12</td>
78
+ <td>9</td>
79
+ <td>3</td>
80
+ <td>0.8</td>
81
+ </tr>
82
+
83
+ <tr>
84
+ <td class="strong"><a href="#b4607e0c59dbb347e7e6b4644a4253e764f4a3fc" class="src_link" title="lib/redis_analytics/filter.rb">lib/redis_analytics/filter.rb</a></td>
85
+ <td class="green strong">100.0 %</td>
86
+ <td>32</td>
87
+ <td>16</td>
88
+ <td>16</td>
89
+ <td>0</td>
90
+ <td>1.3</td>
91
+ </tr>
92
+
93
+ <tr>
94
+ <td class="strong"><a href="#ce88f9a4f91b2ab47eda0a65a09066ab0349a76d" class="src_link" title="lib/redis_analytics/helpers.rb">lib/redis_analytics/helpers.rb</a></td>
95
+ <td class="red strong">21.74 %</td>
96
+ <td>74</td>
97
+ <td>46</td>
98
+ <td>10</td>
99
+ <td>36</td>
100
+ <td>0.2</td>
101
+ </tr>
102
+
103
+ <tr>
104
+ <td class="strong"><a href="#18ab91ae3806c8c6964faa84b3a4e70b84fbf3f3" class="src_link" title="lib/redis_analytics/metrics.rb">lib/redis_analytics/metrics.rb</a></td>
105
+ <td class="red strong">67.35 %</td>
106
+ <td>95</td>
107
+ <td>49</td>
108
+ <td>33</td>
109
+ <td>16</td>
110
+ <td>1.5</td>
111
+ </tr>
112
+
113
+ <tr>
114
+ <td class="strong"><a href="#33256377178a999bdf701dc35554a34e73202356" class="src_link" title="lib/redis_analytics/time_ext.rb">lib/redis_analytics/time_ext.rb</a></td>
115
+ <td class="red strong">71.43 %</td>
116
+ <td>13</td>
117
+ <td>7</td>
118
+ <td>5</td>
119
+ <td>2</td>
120
+ <td>0.7</td>
121
+ </tr>
122
+
123
+ <tr>
124
+ <td class="strong"><a href="#ab2a757718213263405983cc381a1743db19a6d3" class="src_link" title="lib/redis_analytics/tracker.rb">lib/redis_analytics/tracker.rb</a></td>
125
+ <td class="green strong">93.1 %</td>
126
+ <td>45</td>
127
+ <td>29</td>
128
+ <td>27</td>
129
+ <td>2</td>
130
+ <td>2.8</td>
131
+ </tr>
132
+
133
+ <tr>
134
+ <td class="strong"><a href="#ef7dac77b9088acb55bda5292fc8a299551c9e22" class="src_link" title="lib/redis_analytics/visit.rb">lib/redis_analytics/visit.rb</a></td>
135
+ <td class="green strong">98.48 %</td>
136
+ <td>121</td>
137
+ <td>66</td>
138
+ <td>65</td>
139
+ <td>1</td>
140
+ <td>23.1</td>
141
+ </tr>
142
+
143
+ </tbody>
144
+ </table>
145
+ </div>
146
+
147
+
148
+
149
+ </div>
150
+
151
+ <div id="footer">
152
+ Generated by <a href="http://github.com/colszowka/simplecov">simplecov</a> v0.16.1
153
+ and simplecov-html v0.10.2<br/>
154
+ using RSpec
155
+ </div>
156
+
157
+ <div class="source_files">
158
+
159
+ <div class="source_table" id="709e5b575527bfb0fe8d6cf469b4f763bdd67521">
160
+ <div class="header">
161
+ <h3>lib/redis_analytics.rb</h3>
162
+ <h4><span class="green">100.0 %</span> covered</h4>
163
+ <div>
164
+ <b>15</b> relevant lines.
165
+ <span class="green"><b>15</b> lines covered</span> and
166
+ <span class="red"><b>0</b> lines missed.</span>
167
+ </div>
168
+ </div>
169
+
170
+ <pre>
171
+ <ol>
172
+
173
+ <li class="covered" data-hits="1" data-linenumber="1">
174
+ <span class="hits">1</span>
175
+
176
+ <code class="ruby">require &#39;redis&#39;</code>
177
+ </li>
178
+
179
+ <li class="covered" data-hits="1" data-linenumber="2">
180
+ <span class="hits">1</span>
181
+
182
+ <code class="ruby">require &#39;browser&#39;</code>
183
+ </li>
184
+
185
+ <li class="covered" data-hits="1" data-linenumber="3">
186
+ <span class="hits">1</span>
187
+
188
+ <code class="ruby">require &#39;geoip&#39;</code>
189
+ </li>
190
+
191
+ <li class="never" data-hits="" data-linenumber="4">
192
+
193
+
194
+ <code class="ruby"></code>
195
+ </li>
196
+
197
+ <li class="covered" data-hits="1" data-linenumber="5">
198
+ <span class="hits">1</span>
199
+
200
+ <code class="ruby">require &#39;redis_analytics&#39;</code>
201
+ </li>
202
+
203
+ <li class="never" data-hits="" data-linenumber="6">
204
+
205
+
206
+ <code class="ruby"></code>
207
+ </li>
208
+
209
+ <li class="covered" data-hits="1" data-linenumber="7">
210
+ <span class="hits">1</span>
211
+
212
+ <code class="ruby">require &#39;redis_analytics/version&#39;</code>
213
+ </li>
214
+
215
+ <li class="covered" data-hits="1" data-linenumber="8">
216
+ <span class="hits">1</span>
217
+
218
+ <code class="ruby">require &#39;redis_analytics/time_ext&#39;</code>
219
+ </li>
220
+
221
+ <li class="covered" data-hits="1" data-linenumber="9">
222
+ <span class="hits">1</span>
223
+
224
+ <code class="ruby">require &#39;redis_analytics/filter&#39;</code>
225
+ </li>
226
+
227
+ <li class="covered" data-hits="1" data-linenumber="10">
228
+ <span class="hits">1</span>
229
+
230
+ <code class="ruby">require &#39;redis_analytics/configuration&#39;</code>
231
+ </li>
232
+
233
+ <li class="covered" data-hits="1" data-linenumber="11">
234
+ <span class="hits">1</span>
235
+
236
+ <code class="ruby">require &#39;redis_analytics/metrics&#39;</code>
237
+ </li>
238
+
239
+ <li class="covered" data-hits="1" data-linenumber="12">
240
+ <span class="hits">1</span>
241
+
242
+ <code class="ruby">require &#39;redis_analytics/visit&#39;</code>
243
+ </li>
244
+
245
+ <li class="covered" data-hits="1" data-linenumber="13">
246
+ <span class="hits">1</span>
247
+
248
+ <code class="ruby">require &#39;redis_analytics/helpers&#39;</code>
249
+ </li>
250
+
251
+ <li class="covered" data-hits="1" data-linenumber="14">
252
+ <span class="hits">1</span>
253
+
254
+ <code class="ruby">require &#39;redis_analytics/tracker&#39;</code>
255
+ </li>
256
+
257
+ <li class="covered" data-hits="1" data-linenumber="15">
258
+ <span class="hits">1</span>
259
+
260
+ <code class="ruby">require &#39;redis_analytics/engine&#39;</code>
261
+ </li>
262
+
263
+ <li class="never" data-hits="" data-linenumber="16">
264
+
265
+
266
+ <code class="ruby"></code>
267
+ </li>
268
+
269
+ <li class="covered" data-hits="1" data-linenumber="17">
270
+ <span class="hits">1</span>
271
+
272
+ <code class="ruby">module RedisAnalytics</code>
273
+ </li>
274
+
275
+ <li class="covered" data-hits="1" data-linenumber="18">
276
+ <span class="hits">1</span>
277
+
278
+ <code class="ruby"> extend Configuration</code>
279
+ </li>
280
+
281
+ <li class="never" data-hits="" data-linenumber="19">
282
+
283
+
284
+ <code class="ruby">end</code>
285
+ </li>
286
+
287
+ </ol>
288
+ </pre>
289
+ </div>
290
+
291
+
292
+ <div class="source_table" id="78e9cdccdb69ce4fd7b2aef653c5c7650ae690af">
293
+ <div class="header">
294
+ <h3>lib/redis_analytics/configuration.rb</h3>
295
+ <h4><span class="green">95.45 %</span> covered</h4>
296
+ <div>
297
+ <b>44</b> relevant lines.
298
+ <span class="green"><b>42</b> lines covered</span> and
299
+ <span class="red"><b>2</b> lines missed.</span>
300
+ </div>
301
+ </div>
302
+
303
+ <pre>
304
+ <ol>
305
+
306
+ <li class="covered" data-hits="1" data-linenumber="1">
307
+ <span class="hits">1</span>
308
+
309
+ <code class="ruby">module RedisAnalytics</code>
310
+ </li>
311
+
312
+ <li class="covered" data-hits="1" data-linenumber="2">
313
+ <span class="hits">1</span>
314
+
315
+ <code class="ruby"> module Configuration</code>
316
+ </li>
317
+
318
+ <li class="never" data-hits="" data-linenumber="3">
319
+
320
+
321
+ <code class="ruby"> # Redis connection instance</code>
322
+ </li>
323
+
324
+ <li class="covered" data-hits="1" data-linenumber="4">
325
+ <span class="hits">1</span>
326
+
327
+ <code class="ruby"> attr_accessor :redis_connection</code>
328
+ </li>
329
+
330
+ <li class="never" data-hits="" data-linenumber="5">
331
+
332
+
333
+ <code class="ruby"></code>
334
+ </li>
335
+
336
+ <li class="never" data-hits="" data-linenumber="6">
337
+
338
+
339
+ <code class="ruby"> # Redis namespace for keys</code>
340
+ </li>
341
+
342
+ <li class="covered" data-hits="1" data-linenumber="7">
343
+ <span class="hits">1</span>
344
+
345
+ <code class="ruby"> attr_writer :redis_namespace</code>
346
+ </li>
347
+
348
+ <li class="never" data-hits="" data-linenumber="8">
349
+
350
+
351
+ <code class="ruby"></code>
352
+ </li>
353
+
354
+ <li class="never" data-hits="" data-linenumber="9">
355
+
356
+
357
+ <code class="ruby"> # Name of the cookie which tracks first visitors</code>
358
+ </li>
359
+
360
+ <li class="covered" data-hits="1" data-linenumber="10">
361
+ <span class="hits">1</span>
362
+
363
+ <code class="ruby"> attr_writer :first_visit_cookie_name</code>
364
+ </li>
365
+
366
+ <li class="never" data-hits="" data-linenumber="11">
367
+
368
+
369
+ <code class="ruby"></code>
370
+ </li>
371
+
372
+ <li class="never" data-hits="" data-linenumber="12">
373
+
374
+
375
+ <code class="ruby"> # Name of the cookie which tracks current visits</code>
376
+ </li>
377
+
378
+ <li class="covered" data-hits="1" data-linenumber="13">
379
+ <span class="hits">1</span>
380
+
381
+ <code class="ruby"> attr_writer :current_visit_cookie_name</code>
382
+ </li>
383
+
384
+ <li class="never" data-hits="" data-linenumber="14">
385
+
386
+
387
+ <code class="ruby"></code>
388
+ </li>
389
+
390
+ <li class="never" data-hits="" data-linenumber="15">
391
+
392
+
393
+ <code class="ruby"> # Minutes the visit should timeout after (if no hit is received)</code>
394
+ </li>
395
+
396
+ <li class="covered" data-hits="1" data-linenumber="16">
397
+ <span class="hits">1</span>
398
+
399
+ <code class="ruby"> attr_writer :visit_timeout</code>
400
+ </li>
401
+
402
+ <li class="never" data-hits="" data-linenumber="17">
403
+
404
+
405
+ <code class="ruby"></code>
406
+ </li>
407
+
408
+ <li class="never" data-hits="" data-linenumber="18">
409
+
410
+
411
+ <code class="ruby"> # Endpoint for dashboard</code>
412
+ </li>
413
+
414
+ <li class="covered" data-hits="1" data-linenumber="19">
415
+ <span class="hits">1</span>
416
+
417
+ <code class="ruby"> attr_writer :dashboard_endpoint</code>
418
+ </li>
419
+
420
+ <li class="never" data-hits="" data-linenumber="20">
421
+
422
+
423
+ <code class="ruby"></code>
424
+ </li>
425
+
426
+ <li class="never" data-hits="" data-linenumber="21">
427
+
428
+
429
+ <code class="ruby"> # Endpoint for api</code>
430
+ </li>
431
+
432
+ <li class="covered" data-hits="1" data-linenumber="22">
433
+ <span class="hits">1</span>
434
+
435
+ <code class="ruby"> attr_writer :api_endpoint</code>
436
+ </li>
437
+
438
+ <li class="never" data-hits="" data-linenumber="23">
439
+
440
+
441
+ <code class="ruby"></code>
442
+ </li>
443
+
444
+ <li class="covered" data-hits="1" data-linenumber="24">
445
+ <span class="hits">1</span>
446
+
447
+ <code class="ruby"> attr_writer :path_filters</code>
448
+ </li>
449
+
450
+ <li class="never" data-hits="" data-linenumber="25">
451
+
452
+
453
+ <code class="ruby"></code>
454
+ </li>
455
+
456
+ <li class="covered" data-hits="1" data-linenumber="26">
457
+ <span class="hits">1</span>
458
+
459
+ <code class="ruby"> attr_writer :filters</code>
460
+ </li>
461
+
462
+ <li class="never" data-hits="" data-linenumber="27">
463
+
464
+
465
+ <code class="ruby"></code>
466
+ </li>
467
+
468
+ <li class="never" data-hits="" data-linenumber="28">
469
+
470
+
471
+ <code class="ruby"> # Path to the Geo IP Database file</code>
472
+ </li>
473
+
474
+ <li class="covered" data-hits="1" data-linenumber="29">
475
+ <span class="hits">1</span>
476
+
477
+ <code class="ruby"> attr_writer :geo_ip_data_path</code>
478
+ </li>
479
+
480
+ <li class="never" data-hits="" data-linenumber="30">
481
+
482
+
483
+ <code class="ruby"></code>
484
+ </li>
485
+
486
+ <li class="never" data-hits="" data-linenumber="31">
487
+
488
+
489
+ <code class="ruby"> # Redis namespace for keys</code>
490
+ </li>
491
+
492
+ <li class="covered" data-hits="1" data-linenumber="32">
493
+ <span class="hits">1</span>
494
+
495
+ <code class="ruby"> def redis_namespace</code>
496
+ </li>
497
+
498
+ <li class="covered" data-hits="6" data-linenumber="33">
499
+ <span class="hits">6</span>
500
+
501
+ <code class="ruby"> @redis_namespace ||= &#39;ra&#39;</code>
502
+ </li>
503
+
504
+ <li class="never" data-hits="" data-linenumber="34">
505
+
506
+
507
+ <code class="ruby"> end</code>
508
+ </li>
509
+
510
+ <li class="never" data-hits="" data-linenumber="35">
511
+
512
+
513
+ <code class="ruby"></code>
514
+ </li>
515
+
516
+ <li class="never" data-hits="" data-linenumber="36">
517
+
518
+
519
+ <code class="ruby"> # Minutes the visit should timeout after (if no hit is received)</code>
520
+ </li>
521
+
522
+ <li class="covered" data-hits="1" data-linenumber="37">
523
+ <span class="hits">1</span>
524
+
525
+ <code class="ruby"> def visit_timeout</code>
526
+ </li>
527
+
528
+ <li class="covered" data-hits="6" data-linenumber="38">
529
+ <span class="hits">6</span>
530
+
531
+ <code class="ruby"> @visit_timeout ||= 30 # minutes</code>
532
+ </li>
533
+
534
+ <li class="never" data-hits="" data-linenumber="39">
535
+
536
+
537
+ <code class="ruby"> end</code>
538
+ </li>
539
+
540
+ <li class="never" data-hits="" data-linenumber="40">
541
+
542
+
543
+ <code class="ruby"></code>
544
+ </li>
545
+
546
+ <li class="never" data-hits="" data-linenumber="41">
547
+
548
+
549
+ <code class="ruby"> # Name of the cookie which tracks first visitors (unknown visitors)</code>
550
+ </li>
551
+
552
+ <li class="covered" data-hits="1" data-linenumber="42">
553
+ <span class="hits">1</span>
554
+
555
+ <code class="ruby"> def first_visit_cookie_name</code>
556
+ </li>
557
+
558
+ <li class="covered" data-hits="22" data-linenumber="43">
559
+ <span class="hits">22</span>
560
+
561
+ <code class="ruby"> @first_visit_cookie_name ||= &#39;_rucn&#39;</code>
562
+ </li>
563
+
564
+ <li class="never" data-hits="" data-linenumber="44">
565
+
566
+
567
+ <code class="ruby"> end</code>
568
+ </li>
569
+
570
+ <li class="never" data-hits="" data-linenumber="45">
571
+
572
+
573
+ <code class="ruby"></code>
574
+ </li>
575
+
576
+ <li class="never" data-hits="" data-linenumber="46">
577
+
578
+
579
+ <code class="ruby"> # Name of the cookie which tracks visits</code>
580
+ </li>
581
+
582
+ <li class="covered" data-hits="1" data-linenumber="47">
583
+ <span class="hits">1</span>
584
+
585
+ <code class="ruby"> def current_visit_cookie_name</code>
586
+ </li>
587
+
588
+ <li class="covered" data-hits="29" data-linenumber="48">
589
+ <span class="hits">29</span>
590
+
591
+ <code class="ruby"> @current_visit_cookie_name ||= &#39;_vcn&#39;</code>
592
+ </li>
593
+
594
+ <li class="never" data-hits="" data-linenumber="49">
595
+
596
+
597
+ <code class="ruby"> end</code>
598
+ </li>
599
+
600
+ <li class="never" data-hits="" data-linenumber="50">
601
+
602
+
603
+ <code class="ruby"></code>
604
+ </li>
605
+
606
+ <li class="covered" data-hits="1" data-linenumber="51">
607
+ <span class="hits">1</span>
608
+
609
+ <code class="ruby"> def filters</code>
610
+ </li>
611
+
612
+ <li class="covered" data-hits="6" data-linenumber="52">
613
+ <span class="hits">6</span>
614
+
615
+ <code class="ruby"> @filters ||= []</code>
616
+ </li>
617
+
618
+ <li class="never" data-hits="" data-linenumber="53">
619
+
620
+
621
+ <code class="ruby"> end</code>
622
+ </li>
623
+
624
+ <li class="never" data-hits="" data-linenumber="54">
625
+
626
+
627
+ <code class="ruby"></code>
628
+ </li>
629
+
630
+ <li class="covered" data-hits="1" data-linenumber="55">
631
+ <span class="hits">1</span>
632
+
633
+ <code class="ruby"> def path_filters</code>
634
+ </li>
635
+
636
+ <li class="covered" data-hits="6" data-linenumber="56">
637
+ <span class="hits">6</span>
638
+
639
+ <code class="ruby"> @path_filters ||= []</code>
640
+ </li>
641
+
642
+ <li class="never" data-hits="" data-linenumber="57">
643
+
644
+
645
+ <code class="ruby"> end</code>
646
+ </li>
647
+
648
+ <li class="never" data-hits="" data-linenumber="58">
649
+
650
+
651
+ <code class="ruby"></code>
652
+ </li>
653
+
654
+ <li class="covered" data-hits="1" data-linenumber="59">
655
+ <span class="hits">1</span>
656
+
657
+ <code class="ruby"> def add_filter(&amp;proc)</code>
658
+ </li>
659
+
660
+ <li class="covered" data-hits="1" data-linenumber="60">
661
+ <span class="hits">1</span>
662
+
663
+ <code class="ruby"> filters &lt;&lt; RedisAnalytics::Filter.new(proc)</code>
664
+ </li>
665
+
666
+ <li class="never" data-hits="" data-linenumber="61">
667
+
668
+
669
+ <code class="ruby"> end</code>
670
+ </li>
671
+
672
+ <li class="never" data-hits="" data-linenumber="62">
673
+
674
+
675
+ <code class="ruby"></code>
676
+ </li>
677
+
678
+ <li class="covered" data-hits="1" data-linenumber="63">
679
+ <span class="hits">1</span>
680
+
681
+ <code class="ruby"> def add_path_filter(path)</code>
682
+ </li>
683
+
684
+ <li class="covered" data-hits="1" data-linenumber="64">
685
+ <span class="hits">1</span>
686
+
687
+ <code class="ruby"> path_filters &lt;&lt; RedisAnalytics::PathFilter.new(path)</code>
688
+ </li>
689
+
690
+ <li class="never" data-hits="" data-linenumber="65">
691
+
692
+
693
+ <code class="ruby"> end</code>
694
+ </li>
695
+
696
+ <li class="never" data-hits="" data-linenumber="66">
697
+
698
+
699
+ <code class="ruby"></code>
700
+ </li>
701
+
702
+ <li class="covered" data-hits="1" data-linenumber="67">
703
+ <span class="hits">1</span>
704
+
705
+ <code class="ruby"> def geo_ip_data_path</code>
706
+ </li>
707
+
708
+ <li class="covered" data-hits="3" data-linenumber="68">
709
+ <span class="hits">3</span>
710
+
711
+ <code class="ruby"> @geo_ip_data_path = ::File.expand_path(::File.join(::File.dirname(__FILE__),&#39;..&#39;,&#39;..&#39;)) + &quot;/bin/GeoIP.dat&quot;</code>
712
+ </li>
713
+
714
+ <li class="never" data-hits="" data-linenumber="69">
715
+
716
+
717
+ <code class="ruby"> end</code>
718
+ </li>
719
+
720
+ <li class="never" data-hits="" data-linenumber="70">
721
+
722
+
723
+ <code class="ruby"></code>
724
+ </li>
725
+
726
+ <li class="covered" data-hits="1" data-linenumber="71">
727
+ <span class="hits">1</span>
728
+
729
+ <code class="ruby"> def visitor_recency_slices</code>
730
+ </li>
731
+
732
+ <li class="covered" data-hits="2" data-linenumber="72">
733
+ <span class="hits">2</span>
734
+
735
+ <code class="ruby"> @visitor_recency_slices ||= [1, 7, 30]</code>
736
+ </li>
737
+
738
+ <li class="never" data-hits="" data-linenumber="73">
739
+
740
+
741
+ <code class="ruby"> end</code>
742
+ </li>
743
+
744
+ <li class="never" data-hits="" data-linenumber="74">
745
+
746
+
747
+ <code class="ruby"></code>
748
+ </li>
749
+
750
+ <li class="covered" data-hits="1" data-linenumber="75">
751
+ <span class="hits">1</span>
752
+
753
+ <code class="ruby"> def default_range</code>
754
+ </li>
755
+
756
+ <li class="covered" data-hits="3" data-linenumber="76">
757
+ <span class="hits">3</span>
758
+
759
+ <code class="ruby"> @default_range = :day</code>
760
+ </li>
761
+
762
+ <li class="never" data-hits="" data-linenumber="77">
763
+
764
+
765
+ <code class="ruby"> end</code>
766
+ </li>
767
+
768
+ <li class="never" data-hits="" data-linenumber="78">
769
+
770
+
771
+ <code class="ruby"></code>
772
+ </li>
773
+
774
+ <li class="covered" data-hits="1" data-linenumber="79">
775
+ <span class="hits">1</span>
776
+
777
+ <code class="ruby"> def redis_key_timestamps # [format, expire in seconds or nil]</code>
778
+ </li>
779
+
780
+ <li class="covered" data-hits="37" data-linenumber="80">
781
+ <span class="hits">37</span>
782
+
783
+ <code class="ruby"> [&#39;%Y&#39;, &#39;%Y_%m&#39;, &#39;%Y_%m_%d&#39;, &#39;%Y_%m_%d_%H&#39;, &#39;%Y_%m_%d_%H_%M&#39;]</code>
784
+ </li>
785
+
786
+ <li class="never" data-hits="" data-linenumber="81">
787
+
788
+
789
+ <code class="ruby"> end</code>
790
+ </li>
791
+
792
+ <li class="never" data-hits="" data-linenumber="82">
793
+
794
+
795
+ <code class="ruby"></code>
796
+ </li>
797
+
798
+ <li class="covered" data-hits="1" data-linenumber="83">
799
+ <span class="hits">1</span>
800
+
801
+ <code class="ruby"> def time_range_formats</code>
802
+ </li>
803
+
804
+ <li class="covered" data-hits="2" data-linenumber="84">
805
+ <span class="hits">2</span>
806
+
807
+ <code class="ruby"> [[:year, :month, &quot;%b&quot;], [:week, :day, &quot;%a&quot;], [:day, :hour, &quot;%l%P&quot;]]</code>
808
+ </li>
809
+
810
+ <li class="never" data-hits="" data-linenumber="85">
811
+
812
+
813
+ <code class="ruby"> end</code>
814
+ </li>
815
+
816
+ <li class="never" data-hits="" data-linenumber="86">
817
+
818
+
819
+ <code class="ruby"></code>
820
+ </li>
821
+
822
+ <li class="covered" data-hits="1" data-linenumber="87">
823
+ <span class="hits">1</span>
824
+
825
+ <code class="ruby"> def configure</code>
826
+ </li>
827
+
828
+ <li class="covered" data-hits="6" data-linenumber="88">
829
+ <span class="hits">6</span>
830
+
831
+ <code class="ruby"> yield self</code>
832
+ </li>
833
+
834
+ <li class="never" data-hits="" data-linenumber="89">
835
+
836
+
837
+ <code class="ruby"> end</code>
838
+ </li>
839
+
840
+ <li class="never" data-hits="" data-linenumber="90">
841
+
842
+
843
+ <code class="ruby"></code>
844
+ </li>
845
+
846
+ <li class="covered" data-hits="1" data-linenumber="91">
847
+ <span class="hits">1</span>
848
+
849
+ <code class="ruby"> def api_endpoint</code>
850
+ </li>
851
+
852
+ <li class="missed" data-hits="0" data-linenumber="92">
853
+
854
+
855
+ <code class="ruby"> @api_endpoint || dashboard_endpoint + &#39;/api&#39;</code>
856
+ </li>
857
+
858
+ <li class="never" data-hits="" data-linenumber="93">
859
+
860
+
861
+ <code class="ruby"> end</code>
862
+ </li>
863
+
864
+ <li class="never" data-hits="" data-linenumber="94">
865
+
866
+
867
+ <code class="ruby"></code>
868
+ </li>
869
+
870
+ <li class="covered" data-hits="1" data-linenumber="95">
871
+ <span class="hits">1</span>
872
+
873
+ <code class="ruby"> def dashboard_endpoint</code>
874
+ </li>
875
+
876
+ <li class="missed" data-hits="0" data-linenumber="96">
877
+
878
+
879
+ <code class="ruby"> @dashboard_endpoint || &#39;/redis_analytics&#39;</code>
880
+ </li>
881
+
882
+ <li class="never" data-hits="" data-linenumber="97">
883
+
884
+
885
+ <code class="ruby"> end</code>
886
+ </li>
887
+
888
+ <li class="never" data-hits="" data-linenumber="98">
889
+
890
+
891
+ <code class="ruby"></code>
892
+ </li>
893
+
894
+ <li class="never" data-hits="" data-linenumber="99">
895
+
896
+
897
+ <code class="ruby"> end</code>
898
+ </li>
899
+
900
+ <li class="never" data-hits="" data-linenumber="100">
901
+
902
+
903
+ <code class="ruby">end</code>
904
+ </li>
905
+
906
+ <li class="never" data-hits="" data-linenumber="101">
907
+
908
+
909
+ <code class="ruby"></code>
910
+ </li>
911
+
912
+ </ol>
913
+ </pre>
914
+ </div>
915
+
916
+
917
+ <div class="source_table" id="d7d2f13be7d44f86b655a354e76d93137d9a6412">
918
+ <div class="header">
919
+ <h3>lib/redis_analytics/engine.rb</h3>
920
+ <h4><span class="red">75.0 %</span> covered</h4>
921
+ <div>
922
+ <b>12</b> relevant lines.
923
+ <span class="green"><b>9</b> lines covered</span> and
924
+ <span class="red"><b>3</b> lines missed.</span>
925
+ </div>
926
+ </div>
927
+
928
+ <pre>
929
+ <ol>
930
+
931
+ <li class="covered" data-hits="1" data-linenumber="1">
932
+ <span class="hits">1</span>
933
+
934
+ <code class="ruby">require &#39;rails&#39;</code>
935
+ </li>
936
+
937
+ <li class="covered" data-hits="1" data-linenumber="2">
938
+ <span class="hits">1</span>
939
+
940
+ <code class="ruby">require &#39;jquery-rails&#39;</code>
941
+ </li>
942
+
943
+ <li class="never" data-hits="" data-linenumber="3">
944
+
945
+
946
+ <code class="ruby"></code>
947
+ </li>
948
+
949
+ <li class="covered" data-hits="1" data-linenumber="4">
950
+ <span class="hits">1</span>
951
+
952
+ <code class="ruby">module RedisAnalytics</code>
953
+ </li>
954
+
955
+ <li class="covered" data-hits="1" data-linenumber="5">
956
+ <span class="hits">1</span>
957
+
958
+ <code class="ruby"> module Dashboard</code>
959
+ </li>
960
+
961
+ <li class="covered" data-hits="1" data-linenumber="6">
962
+ <span class="hits">1</span>
963
+
964
+ <code class="ruby"> class Engine &lt; ::Rails::Engine</code>
965
+ </li>
966
+
967
+ <li class="covered" data-hits="1" data-linenumber="7">
968
+ <span class="hits">1</span>
969
+
970
+ <code class="ruby"> isolate_namespace RedisAnalytics</code>
971
+ </li>
972
+
973
+ <li class="never" data-hits="" data-linenumber="8">
974
+
975
+
976
+ <code class="ruby"></code>
977
+ </li>
978
+
979
+ <li class="covered" data-hits="1" data-linenumber="9">
980
+ <span class="hits">1</span>
981
+
982
+ <code class="ruby"> initializer &quot;redis_analytics.middleware&quot; do |app|</code>
983
+ </li>
984
+
985
+ <li class="missed" data-hits="0" data-linenumber="10">
986
+
987
+
988
+ <code class="ruby"> app.config.app_middleware.use RedisAnalytics::Tracker</code>
989
+ </li>
990
+
991
+ <li class="never" data-hits="" data-linenumber="11">
992
+
993
+
994
+ <code class="ruby"> end</code>
995
+ </li>
996
+
997
+ <li class="never" data-hits="" data-linenumber="12">
998
+
999
+
1000
+ <code class="ruby"></code>
1001
+ </li>
1002
+
1003
+ <li class="covered" data-hits="1" data-linenumber="13">
1004
+ <span class="hits">1</span>
1005
+
1006
+ <code class="ruby"> initializer &quot;redis_analytics.view_helpers&quot; do |app|</code>
1007
+ </li>
1008
+
1009
+ <li class="missed" data-hits="0" data-linenumber="14">
1010
+
1011
+
1012
+ <code class="ruby"> ActionController::Base.send :include, RedisAnalytics::Helpers</code>
1013
+ </li>
1014
+
1015
+ <li class="never" data-hits="" data-linenumber="15">
1016
+
1017
+
1018
+ <code class="ruby"> end</code>
1019
+ </li>
1020
+
1021
+ <li class="never" data-hits="" data-linenumber="16">
1022
+
1023
+
1024
+ <code class="ruby"></code>
1025
+ </li>
1026
+
1027
+ <li class="covered" data-hits="1" data-linenumber="17">
1028
+ <span class="hits">1</span>
1029
+
1030
+ <code class="ruby"> initializer &quot;redis_analytics.precompile.hook&quot;, group: :all do |app|</code>
1031
+ </li>
1032
+
1033
+ <li class="missed" data-hits="0" data-linenumber="18">
1034
+
1035
+
1036
+ <code class="ruby"> app.config.assets.precompile += %w[</code>
1037
+ </li>
1038
+
1039
+ <li class="never" data-hits="" data-linenumber="19">
1040
+
1041
+
1042
+ <code class="ruby"> redis_analytics/redis_analytics.js</code>
1043
+ </li>
1044
+
1045
+ <li class="never" data-hits="" data-linenumber="20">
1046
+
1047
+
1048
+ <code class="ruby"> redis_analytics/redis_analytics.css</code>
1049
+ </li>
1050
+
1051
+ <li class="never" data-hits="" data-linenumber="21">
1052
+
1053
+
1054
+ <code class="ruby"> ]</code>
1055
+ </li>
1056
+
1057
+ <li class="never" data-hits="" data-linenumber="22">
1058
+
1059
+
1060
+ <code class="ruby"> end</code>
1061
+ </li>
1062
+
1063
+ <li class="never" data-hits="" data-linenumber="23">
1064
+
1065
+
1066
+ <code class="ruby"> end</code>
1067
+ </li>
1068
+
1069
+ <li class="never" data-hits="" data-linenumber="24">
1070
+
1071
+
1072
+ <code class="ruby"> end</code>
1073
+ </li>
1074
+
1075
+ <li class="never" data-hits="" data-linenumber="25">
1076
+
1077
+
1078
+ <code class="ruby">end</code>
1079
+ </li>
1080
+
1081
+ </ol>
1082
+ </pre>
1083
+ </div>
1084
+
1085
+
1086
+ <div class="source_table" id="b4607e0c59dbb347e7e6b4644a4253e764f4a3fc">
1087
+ <div class="header">
1088
+ <h3>lib/redis_analytics/filter.rb</h3>
1089
+ <h4><span class="green">100.0 %</span> covered</h4>
1090
+ <div>
1091
+ <b>16</b> relevant lines.
1092
+ <span class="green"><b>16</b> lines covered</span> and
1093
+ <span class="red"><b>0</b> lines missed.</span>
1094
+ </div>
1095
+ </div>
1096
+
1097
+ <pre>
1098
+ <ol>
1099
+
1100
+ <li class="covered" data-hits="1" data-linenumber="1">
1101
+ <span class="hits">1</span>
1102
+
1103
+ <code class="ruby">module RedisAnalytics</code>
1104
+ </li>
1105
+
1106
+ <li class="covered" data-hits="1" data-linenumber="2">
1107
+ <span class="hits">1</span>
1108
+
1109
+ <code class="ruby"> class Filter</code>
1110
+ </li>
1111
+
1112
+ <li class="covered" data-hits="1" data-linenumber="3">
1113
+ <span class="hits">1</span>
1114
+
1115
+ <code class="ruby"> attr_reader :filter_proc</code>
1116
+ </li>
1117
+
1118
+ <li class="never" data-hits="" data-linenumber="4">
1119
+
1120
+
1121
+ <code class="ruby"></code>
1122
+ </li>
1123
+
1124
+ <li class="covered" data-hits="1" data-linenumber="5">
1125
+ <span class="hits">1</span>
1126
+
1127
+ <code class="ruby"> def initialize(filter_proc)</code>
1128
+ </li>
1129
+
1130
+ <li class="covered" data-hits="2" data-linenumber="6">
1131
+ <span class="hits">2</span>
1132
+
1133
+ <code class="ruby"> @filter_proc = filter_proc</code>
1134
+ </li>
1135
+
1136
+ <li class="never" data-hits="" data-linenumber="7">
1137
+
1138
+
1139
+ <code class="ruby"> end</code>
1140
+ </li>
1141
+
1142
+ <li class="never" data-hits="" data-linenumber="8">
1143
+
1144
+
1145
+ <code class="ruby"></code>
1146
+ </li>
1147
+
1148
+ <li class="covered" data-hits="1" data-linenumber="9">
1149
+ <span class="hits">1</span>
1150
+
1151
+ <code class="ruby"> def matches?(request, response)</code>
1152
+ </li>
1153
+
1154
+ <li class="covered" data-hits="1" data-linenumber="10">
1155
+ <span class="hits">1</span>
1156
+
1157
+ <code class="ruby"> filter_proc.call(request, response)</code>
1158
+ </li>
1159
+
1160
+ <li class="never" data-hits="" data-linenumber="11">
1161
+
1162
+
1163
+ <code class="ruby"> end</code>
1164
+ </li>
1165
+
1166
+ <li class="never" data-hits="" data-linenumber="12">
1167
+
1168
+
1169
+ <code class="ruby"></code>
1170
+ </li>
1171
+
1172
+ <li class="never" data-hits="" data-linenumber="13">
1173
+
1174
+
1175
+ <code class="ruby"> end</code>
1176
+ </li>
1177
+
1178
+ <li class="never" data-hits="" data-linenumber="14">
1179
+
1180
+
1181
+ <code class="ruby"></code>
1182
+ </li>
1183
+
1184
+ <li class="covered" data-hits="1" data-linenumber="15">
1185
+ <span class="hits">1</span>
1186
+
1187
+ <code class="ruby"> class PathFilter</code>
1188
+ </li>
1189
+
1190
+ <li class="covered" data-hits="1" data-linenumber="16">
1191
+ <span class="hits">1</span>
1192
+
1193
+ <code class="ruby"> attr_reader :filter_path</code>
1194
+ </li>
1195
+
1196
+ <li class="never" data-hits="" data-linenumber="17">
1197
+
1198
+
1199
+ <code class="ruby"></code>
1200
+ </li>
1201
+
1202
+ <li class="covered" data-hits="1" data-linenumber="18">
1203
+ <span class="hits">1</span>
1204
+
1205
+ <code class="ruby"> def initialize(filter_path)</code>
1206
+ </li>
1207
+
1208
+ <li class="covered" data-hits="3" data-linenumber="19">
1209
+ <span class="hits">3</span>
1210
+
1211
+ <code class="ruby"> @filter_path = filter_path</code>
1212
+ </li>
1213
+
1214
+ <li class="never" data-hits="" data-linenumber="20">
1215
+
1216
+
1217
+ <code class="ruby"> end</code>
1218
+ </li>
1219
+
1220
+ <li class="never" data-hits="" data-linenumber="21">
1221
+
1222
+
1223
+ <code class="ruby"></code>
1224
+ </li>
1225
+
1226
+ <li class="covered" data-hits="1" data-linenumber="22">
1227
+ <span class="hits">1</span>
1228
+
1229
+ <code class="ruby"> def matches?(request_path)</code>
1230
+ </li>
1231
+
1232
+ <li class="covered" data-hits="2" data-linenumber="23">
1233
+ <span class="hits">2</span>
1234
+
1235
+ <code class="ruby"> if filter_path.is_a?(String)</code>
1236
+ </li>
1237
+
1238
+ <li class="covered" data-hits="1" data-linenumber="24">
1239
+ <span class="hits">1</span>
1240
+
1241
+ <code class="ruby"> request_path == filter_path</code>
1242
+ </li>
1243
+
1244
+ <li class="covered" data-hits="1" data-linenumber="25">
1245
+ <span class="hits">1</span>
1246
+
1247
+ <code class="ruby"> elsif filter_path.is_a?(Regexp)</code>
1248
+ </li>
1249
+
1250
+ <li class="covered" data-hits="1" data-linenumber="26">
1251
+ <span class="hits">1</span>
1252
+
1253
+ <code class="ruby"> request_path =~ filter_path</code>
1254
+ </li>
1255
+
1256
+ <li class="never" data-hits="" data-linenumber="27">
1257
+
1258
+
1259
+ <code class="ruby"> end</code>
1260
+ </li>
1261
+
1262
+ <li class="never" data-hits="" data-linenumber="28">
1263
+
1264
+
1265
+ <code class="ruby"> end</code>
1266
+ </li>
1267
+
1268
+ <li class="never" data-hits="" data-linenumber="29">
1269
+
1270
+
1271
+ <code class="ruby"> end</code>
1272
+ </li>
1273
+
1274
+ <li class="never" data-hits="" data-linenumber="30">
1275
+
1276
+
1277
+ <code class="ruby"></code>
1278
+ </li>
1279
+
1280
+ <li class="never" data-hits="" data-linenumber="31">
1281
+
1282
+
1283
+ <code class="ruby">end</code>
1284
+ </li>
1285
+
1286
+ <li class="never" data-hits="" data-linenumber="32">
1287
+
1288
+
1289
+ <code class="ruby"></code>
1290
+ </li>
1291
+
1292
+ </ol>
1293
+ </pre>
1294
+ </div>
1295
+
1296
+
1297
+ <div class="source_table" id="ce88f9a4f91b2ab47eda0a65a09066ab0349a76d">
1298
+ <div class="header">
1299
+ <h3>lib/redis_analytics/helpers.rb</h3>
1300
+ <h4><span class="red">21.74 %</span> covered</h4>
1301
+ <div>
1302
+ <b>46</b> relevant lines.
1303
+ <span class="green"><b>10</b> lines covered</span> and
1304
+ <span class="red"><b>36</b> lines missed.</span>
1305
+ </div>
1306
+ </div>
1307
+
1308
+ <pre>
1309
+ <ol>
1310
+
1311
+ <li class="covered" data-hits="1" data-linenumber="1">
1312
+ <span class="hits">1</span>
1313
+
1314
+ <code class="ruby">module RedisAnalytics</code>
1315
+ </li>
1316
+
1317
+ <li class="covered" data-hits="1" data-linenumber="2">
1318
+ <span class="hits">1</span>
1319
+
1320
+ <code class="ruby"> module Helpers</code>
1321
+ </li>
1322
+
1323
+ <li class="never" data-hits="" data-linenumber="3">
1324
+
1325
+
1326
+ <code class="ruby"></code>
1327
+ </li>
1328
+
1329
+ <li class="covered" data-hits="1" data-linenumber="4">
1330
+ <span class="hits">1</span>
1331
+
1332
+ <code class="ruby"> FORMAT_SPECIFIER = [[&#39;%Y&#39;, 365], [&#39;%m&#39;, 30], [&#39;%d&#39;, 24], [&#39;%H&#39;, 60], [&#39;%M&#39;, 60]]</code>
1333
+ </li>
1334
+
1335
+ <li class="never" data-hits="" data-linenumber="5">
1336
+
1337
+
1338
+ <code class="ruby"></code>
1339
+ </li>
1340
+
1341
+ <li class="covered" data-hits="1" data-linenumber="6">
1342
+ <span class="hits">1</span>
1343
+
1344
+ <code class="ruby"> GRANULARITY = [&#39;yearly&#39;, &#39;monthly&#39;, &#39;dayly&#39;, &#39;hourly&#39;, &#39;minutely&#39;]</code>
1345
+ </li>
1346
+
1347
+ <li class="never" data-hits="" data-linenumber="7">
1348
+
1349
+
1350
+ <code class="ruby"></code>
1351
+ </li>
1352
+
1353
+ <li class="covered" data-hits="1" data-linenumber="8">
1354
+ <span class="hits">1</span>
1355
+
1356
+ <code class="ruby"> private</code>
1357
+ </li>
1358
+
1359
+ <li class="covered" data-hits="1" data-linenumber="9">
1360
+ <span class="hits">1</span>
1361
+
1362
+ <code class="ruby"> def method_missing(meth, *args, &amp;block)</code>
1363
+ </li>
1364
+
1365
+ <li class="missed" data-hits="0" data-linenumber="10">
1366
+
1367
+
1368
+ <code class="ruby"> if meth.to_s =~ /^(minute|hour|dai|day|month|year)ly_([a-z_0-9]+)$/</code>
1369
+ </li>
1370
+
1371
+ <li class="missed" data-hits="0" data-linenumber="11">
1372
+
1373
+
1374
+ <code class="ruby"> granularity = ($1 == &#39;dai&#39; ? &#39;day&#39; : $1) + &#39;ly&#39;</code>
1375
+ </li>
1376
+
1377
+ <li class="missed" data-hits="0" data-linenumber="12">
1378
+
1379
+
1380
+ <code class="ruby"> metric_name = $2</code>
1381
+ </li>
1382
+
1383
+ <li class="missed" data-hits="0" data-linenumber="13">
1384
+
1385
+
1386
+ <code class="ruby"> data(granularity, metric_name, *args)</code>
1387
+ </li>
1388
+
1389
+ <li class="never" data-hits="" data-linenumber="14">
1390
+
1391
+
1392
+ <code class="ruby"> else</code>
1393
+ </li>
1394
+
1395
+ <li class="missed" data-hits="0" data-linenumber="15">
1396
+
1397
+
1398
+ <code class="ruby"> super</code>
1399
+ </li>
1400
+
1401
+ <li class="never" data-hits="" data-linenumber="16">
1402
+
1403
+
1404
+ <code class="ruby"> end</code>
1405
+ </li>
1406
+
1407
+ <li class="never" data-hits="" data-linenumber="17">
1408
+
1409
+
1410
+ <code class="ruby"> end</code>
1411
+ </li>
1412
+
1413
+ <li class="never" data-hits="" data-linenumber="18">
1414
+
1415
+
1416
+ <code class="ruby"></code>
1417
+ </li>
1418
+
1419
+ <li class="covered" data-hits="1" data-linenumber="19">
1420
+ <span class="hits">1</span>
1421
+
1422
+ <code class="ruby"> def metric_type(metric_name)</code>
1423
+ </li>
1424
+
1425
+ <li class="missed" data-hits="0" data-linenumber="20">
1426
+
1427
+
1428
+ <code class="ruby"> RedisAnalytics.redis_connection.hget(&quot;#{RedisAnalytics.redis_namespace}:#METRICS&quot;, metric_name)</code>
1429
+ </li>
1430
+
1431
+ <li class="never" data-hits="" data-linenumber="21">
1432
+
1433
+
1434
+ <code class="ruby"> end</code>
1435
+ </li>
1436
+
1437
+ <li class="never" data-hits="" data-linenumber="22">
1438
+
1439
+
1440
+ <code class="ruby"></code>
1441
+ </li>
1442
+
1443
+ <li class="covered" data-hits="1" data-linenumber="23">
1444
+ <span class="hits">1</span>
1445
+
1446
+ <code class="ruby"> def data(granularity, metric_name, from_date, options = {})</code>
1447
+ </li>
1448
+
1449
+ <li class="missed" data-hits="0" data-linenumber="24">
1450
+
1451
+
1452
+ <code class="ruby"> aggregate = options[:aggregate] || false</code>
1453
+ </li>
1454
+
1455
+ <li class="missed" data-hits="0" data-linenumber="25">
1456
+
1457
+
1458
+ <code class="ruby"> x = granularity[0..-3]</code>
1459
+ </li>
1460
+
1461
+ <li class="never" data-hits="" data-linenumber="26">
1462
+
1463
+
1464
+ <code class="ruby"></code>
1465
+ </li>
1466
+
1467
+ <li class="missed" data-hits="0" data-linenumber="27">
1468
+
1469
+
1470
+ <code class="ruby"> to_date = (options[:to_date] || Time.now).send(&quot;end_of_#{x}&quot;)</code>
1471
+ </li>
1472
+
1473
+ <li class="missed" data-hits="0" data-linenumber="28">
1474
+
1475
+
1476
+ <code class="ruby"> i = from_date.send(&quot;beginning_of_#{x}&quot;)</code>
1477
+ </li>
1478
+
1479
+ <li class="never" data-hits="" data-linenumber="29">
1480
+
1481
+
1482
+ <code class="ruby"></code>
1483
+ </li>
1484
+
1485
+ <li class="missed" data-hits="0" data-linenumber="30">
1486
+
1487
+
1488
+ <code class="ruby"> union = []</code>
1489
+ </li>
1490
+
1491
+ <li class="missed" data-hits="0" data-linenumber="31">
1492
+
1493
+
1494
+ <code class="ruby"> time = []</code>
1495
+ </li>
1496
+
1497
+ <li class="never" data-hits="" data-linenumber="32">
1498
+
1499
+
1500
+ <code class="ruby"> begin</code>
1501
+ </li>
1502
+
1503
+ <li class="missed" data-hits="0" data-linenumber="33">
1504
+
1505
+
1506
+ <code class="ruby"> slice_key = i.strftime(FORMAT_SPECIFIER[0..GRANULARITY.index(granularity)].map{|x| x[0]}.join(&#39;_&#39;))</code>
1507
+ </li>
1508
+
1509
+ <li class="missed" data-hits="0" data-linenumber="34">
1510
+
1511
+
1512
+ <code class="ruby"> union &lt;&lt; &quot;#{RedisAnalytics.redis_namespace}:#{metric_name}:#{slice_key}&quot;</code>
1513
+ </li>
1514
+
1515
+ <li class="missed" data-hits="0" data-linenumber="35">
1516
+
1517
+
1518
+ <code class="ruby"> time &lt;&lt; slice_key.split(&#39;_&#39;)</code>
1519
+ </li>
1520
+
1521
+ <li class="missed" data-hits="0" data-linenumber="36">
1522
+
1523
+
1524
+ <code class="ruby"> i += 1.send(x)</code>
1525
+ </li>
1526
+
1527
+ <li class="missed" data-hits="0" data-linenumber="37">
1528
+
1529
+
1530
+ <code class="ruby"> end while i &lt;= to_date</code>
1531
+ </li>
1532
+
1533
+ <li class="missed" data-hits="0" data-linenumber="38">
1534
+
1535
+
1536
+ <code class="ruby"> seq = get_next_seq</code>
1537
+ </li>
1538
+
1539
+ <li class="missed" data-hits="0" data-linenumber="39">
1540
+
1541
+
1542
+ <code class="ruby"> if metric_type(metric_name) == &#39;String&#39;</code>
1543
+ </li>
1544
+
1545
+ <li class="missed" data-hits="0" data-linenumber="40">
1546
+
1547
+
1548
+ <code class="ruby"> if aggregate</code>
1549
+ </li>
1550
+
1551
+ <li class="missed" data-hits="0" data-linenumber="41">
1552
+
1553
+
1554
+ <code class="ruby"> union_key = &quot;#{RedisAnalytics.redis_namespace}:#{seq}&quot;</code>
1555
+ </li>
1556
+
1557
+ <li class="missed" data-hits="0" data-linenumber="42">
1558
+
1559
+
1560
+ <code class="ruby"> RedisAnalytics.redis_connection.zunionstore(union_key, union)</code>
1561
+ </li>
1562
+
1563
+ <li class="missed" data-hits="0" data-linenumber="43">
1564
+
1565
+
1566
+ <code class="ruby"> RedisAnalytics.redis_connection.expire(union_key, 100)</code>
1567
+ </li>
1568
+
1569
+ <li class="missed" data-hits="0" data-linenumber="44">
1570
+
1571
+
1572
+ <code class="ruby"> return Hash[RedisAnalytics.redis_connection.zrange(union_key, 0, -1, :with_scores =&gt; true)]</code>
1573
+ </li>
1574
+
1575
+ <li class="never" data-hits="" data-linenumber="45">
1576
+
1577
+
1578
+ <code class="ruby"> else</code>
1579
+ </li>
1580
+
1581
+ <li class="missed" data-hits="0" data-linenumber="46">
1582
+
1583
+
1584
+ <code class="ruby"> return time.zip(union.map{|x| Hash[RedisAnalytics.redis_connection.zrange(x, 0, -1, :with_scores =&gt; true)]})</code>
1585
+ </li>
1586
+
1587
+ <li class="never" data-hits="" data-linenumber="47">
1588
+
1589
+
1590
+ <code class="ruby"> end</code>
1591
+ </li>
1592
+
1593
+ <li class="missed" data-hits="0" data-linenumber="48">
1594
+
1595
+
1596
+ <code class="ruby"> elsif metric_type(metric_name) == &#39;Integer&#39;</code>
1597
+ </li>
1598
+
1599
+ <li class="missed" data-hits="0" data-linenumber="49">
1600
+
1601
+
1602
+ <code class="ruby"> if aggregate</code>
1603
+ </li>
1604
+
1605
+ <li class="missed" data-hits="0" data-linenumber="50">
1606
+
1607
+
1608
+ <code class="ruby"> return RedisAnalytics.redis_connection.mget(*union).map(&amp;:to_i).inject(:+)</code>
1609
+ </li>
1610
+
1611
+ <li class="never" data-hits="" data-linenumber="51">
1612
+
1613
+
1614
+ <code class="ruby"> else</code>
1615
+ </li>
1616
+
1617
+ <li class="missed" data-hits="0" data-linenumber="52">
1618
+
1619
+
1620
+ <code class="ruby"> return time.zip(RedisAnalytics.redis_connection.mget(*union).map(&amp;:to_i))</code>
1621
+ </li>
1622
+
1623
+ <li class="never" data-hits="" data-linenumber="53">
1624
+
1625
+
1626
+ <code class="ruby"> end</code>
1627
+ </li>
1628
+
1629
+ <li class="never" data-hits="" data-linenumber="54">
1630
+
1631
+
1632
+ <code class="ruby"> else</code>
1633
+ </li>
1634
+
1635
+ <li class="missed" data-hits="0" data-linenumber="55">
1636
+
1637
+
1638
+ <code class="ruby"> if Metrics.public_instance_methods.any?{|m| m.to_s =~ /^#{metric_name}_ratio_per_(hit|visit)$/}</code>
1639
+ </li>
1640
+
1641
+ <li class="missed" data-hits="0" data-linenumber="56">
1642
+
1643
+
1644
+ <code class="ruby"> aggregate ? {} : time.zip([{}] * time.length)</code>
1645
+ </li>
1646
+
1647
+ <li class="missed" data-hits="0" data-linenumber="57">
1648
+
1649
+
1650
+ <code class="ruby"> elsif Metrics.public_instance_methods.any?{|m| m.to_s =~ /^#{metric_name}_count_per_(hit|visit)$/}</code>
1651
+ </li>
1652
+
1653
+ <li class="missed" data-hits="0" data-linenumber="58">
1654
+
1655
+
1656
+ <code class="ruby"> aggregate ? 0 : time.zip([0] * time.length)</code>
1657
+ </li>
1658
+
1659
+ <li class="never" data-hits="" data-linenumber="59">
1660
+
1661
+
1662
+ <code class="ruby"> else</code>
1663
+ </li>
1664
+
1665
+ <li class="missed" data-hits="0" data-linenumber="60">
1666
+
1667
+
1668
+ <code class="ruby"> aggregate ? 0 : time.zip([0] * time.length)</code>
1669
+ </li>
1670
+
1671
+ <li class="never" data-hits="" data-linenumber="61">
1672
+
1673
+
1674
+ <code class="ruby"> end</code>
1675
+ </li>
1676
+
1677
+ <li class="never" data-hits="" data-linenumber="62">
1678
+
1679
+
1680
+ <code class="ruby"> end</code>
1681
+ </li>
1682
+
1683
+ <li class="never" data-hits="" data-linenumber="63">
1684
+
1685
+
1686
+ <code class="ruby"> end</code>
1687
+ </li>
1688
+
1689
+ <li class="never" data-hits="" data-linenumber="64">
1690
+
1691
+
1692
+ <code class="ruby"></code>
1693
+ </li>
1694
+
1695
+ <li class="covered" data-hits="1" data-linenumber="65">
1696
+ <span class="hits">1</span>
1697
+
1698
+ <code class="ruby"> def get_next_seq</code>
1699
+ </li>
1700
+
1701
+ <li class="missed" data-hits="0" data-linenumber="66">
1702
+
1703
+
1704
+ <code class="ruby"> seq = RedisAnalytics.redis_connection.incr(&quot;#{RedisAnalytics.redis_namespace}:#SEQUENCER&quot;)</code>
1705
+ </li>
1706
+
1707
+ <li class="never" data-hits="" data-linenumber="67">
1708
+
1709
+
1710
+ <code class="ruby"> end</code>
1711
+ </li>
1712
+
1713
+ <li class="never" data-hits="" data-linenumber="68">
1714
+
1715
+
1716
+ <code class="ruby"></code>
1717
+ </li>
1718
+
1719
+ <li class="covered" data-hits="1" data-linenumber="69">
1720
+ <span class="hits">1</span>
1721
+
1722
+ <code class="ruby"> def time_range</code>
1723
+ </li>
1724
+
1725
+ <li class="missed" data-hits="0" data-linenumber="70">
1726
+
1727
+
1728
+ <code class="ruby"> (request.cookies[&quot;_rarng&quot;] || RedisAnalytics.default_range).to_sym</code>
1729
+ </li>
1730
+
1731
+ <li class="never" data-hits="" data-linenumber="71">
1732
+
1733
+
1734
+ <code class="ruby"> end</code>
1735
+ </li>
1736
+
1737
+ <li class="never" data-hits="" data-linenumber="72">
1738
+
1739
+
1740
+ <code class="ruby"> end</code>
1741
+ </li>
1742
+
1743
+ <li class="never" data-hits="" data-linenumber="73">
1744
+
1745
+
1746
+ <code class="ruby">end</code>
1747
+ </li>
1748
+
1749
+ <li class="never" data-hits="" data-linenumber="74">
1750
+
1751
+
1752
+ <code class="ruby"></code>
1753
+ </li>
1754
+
1755
+ </ol>
1756
+ </pre>
1757
+ </div>
1758
+
1759
+
1760
+ <div class="source_table" id="18ab91ae3806c8c6964faa84b3a4e70b84fbf3f3">
1761
+ <div class="header">
1762
+ <h3>lib/redis_analytics/metrics.rb</h3>
1763
+ <h4><span class="red">67.35 %</span> covered</h4>
1764
+ <div>
1765
+ <b>49</b> relevant lines.
1766
+ <span class="green"><b>33</b> lines covered</span> and
1767
+ <span class="red"><b>16</b> lines missed.</span>
1768
+ </div>
1769
+ </div>
1770
+
1771
+ <pre>
1772
+ <ol>
1773
+
1774
+ <li class="covered" data-hits="1" data-linenumber="1">
1775
+ <span class="hits">1</span>
1776
+
1777
+ <code class="ruby">module RedisAnalytics</code>
1778
+ </li>
1779
+
1780
+ <li class="covered" data-hits="1" data-linenumber="2">
1781
+ <span class="hits">1</span>
1782
+
1783
+ <code class="ruby"> module Metrics</code>
1784
+ </li>
1785
+
1786
+ <li class="never" data-hits="" data-linenumber="3">
1787
+
1788
+
1789
+ <code class="ruby"></code>
1790
+ </li>
1791
+
1792
+ <li class="covered" data-hits="1" data-linenumber="4">
1793
+ <span class="hits">1</span>
1794
+
1795
+ <code class="ruby"> attr_reader :visit_time_count_per_visit</code>
1796
+ </li>
1797
+
1798
+ <li class="covered" data-hits="1" data-linenumber="5">
1799
+ <span class="hits">1</span>
1800
+
1801
+ <code class="ruby"> attr_reader :visits_count_per_visit, :first_visits_count_per_visit, :repeat_visits_count_per_visit</code>
1802
+ </li>
1803
+
1804
+ <li class="covered" data-hits="1" data-linenumber="6">
1805
+ <span class="hits">1</span>
1806
+
1807
+ <code class="ruby"> attr_reader :unique_visits_ratio_per_visit</code>
1808
+ </li>
1809
+
1810
+ <li class="covered" data-hits="1" data-linenumber="7">
1811
+ <span class="hits">1</span>
1812
+
1813
+ <code class="ruby"> attr_reader :page_views_count_per_hit, :second_page_views_count_per_hit</code>
1814
+ </li>
1815
+
1816
+ <li class="never" data-hits="" data-linenumber="8">
1817
+
1818
+
1819
+ <code class="ruby"></code>
1820
+ </li>
1821
+
1822
+ <li class="never" data-hits="" data-linenumber="9">
1823
+
1824
+
1825
+ <code class="ruby"> # Developers can override or define new public methods here</code>
1826
+ </li>
1827
+
1828
+ <li class="never" data-hits="" data-linenumber="10">
1829
+
1830
+
1831
+ <code class="ruby"> # Methods should start with track and end with count or types</code>
1832
+ </li>
1833
+
1834
+ <li class="never" data-hits="" data-linenumber="11">
1835
+
1836
+
1837
+ <code class="ruby"> # Return types should be Integer or String resp.</code>
1838
+ </li>
1839
+
1840
+ <li class="never" data-hits="" data-linenumber="12">
1841
+
1842
+
1843
+ <code class="ruby"> # If you return nil or an error nothing will be tracked</code>
1844
+ </li>
1845
+
1846
+ <li class="never" data-hits="" data-linenumber="13">
1847
+
1848
+
1849
+ <code class="ruby"></code>
1850
+ </li>
1851
+
1852
+ <li class="covered" data-hits="1" data-linenumber="14">
1853
+ <span class="hits">1</span>
1854
+
1855
+ <code class="ruby"> def browser_ratio_per_visit</code>
1856
+ </li>
1857
+
1858
+ <li class="covered" data-hits="3" data-linenumber="15">
1859
+ <span class="hits">3</span>
1860
+
1861
+ <code class="ruby"> user_agent.name.to_s</code>
1862
+ </li>
1863
+
1864
+ <li class="never" data-hits="" data-linenumber="16">
1865
+
1866
+
1867
+ <code class="ruby"> end</code>
1868
+ </li>
1869
+
1870
+ <li class="never" data-hits="" data-linenumber="17">
1871
+
1872
+
1873
+ <code class="ruby"></code>
1874
+ </li>
1875
+
1876
+ <li class="covered" data-hits="1" data-linenumber="18">
1877
+ <span class="hits">1</span>
1878
+
1879
+ <code class="ruby"> def platform_ratio_per_visit</code>
1880
+ </li>
1881
+
1882
+ <li class="covered" data-hits="3" data-linenumber="19">
1883
+ <span class="hits">3</span>
1884
+
1885
+ <code class="ruby"> user_agent.platform.to_s</code>
1886
+ </li>
1887
+
1888
+ <li class="never" data-hits="" data-linenumber="20">
1889
+
1890
+
1891
+ <code class="ruby"> end</code>
1892
+ </li>
1893
+
1894
+ <li class="never" data-hits="" data-linenumber="21">
1895
+
1896
+
1897
+ <code class="ruby"></code>
1898
+ </li>
1899
+
1900
+ <li class="covered" data-hits="1" data-linenumber="22">
1901
+ <span class="hits">1</span>
1902
+
1903
+ <code class="ruby"> def country_ratio_per_visit</code>
1904
+ </li>
1905
+
1906
+ <li class="covered" data-hits="3" data-linenumber="23">
1907
+ <span class="hits">3</span>
1908
+
1909
+ <code class="ruby"> if defined?(GeoIP)</code>
1910
+ </li>
1911
+
1912
+ <li class="covered" data-hits="3" data-linenumber="24">
1913
+ <span class="hits">3</span>
1914
+
1915
+ <code class="ruby"> begin</code>
1916
+ </li>
1917
+
1918
+ <li class="covered" data-hits="3" data-linenumber="25">
1919
+ <span class="hits">3</span>
1920
+
1921
+ <code class="ruby"> g = GeoIP.new(RedisAnalytics.geo_ip_data_path)</code>
1922
+ </li>
1923
+
1924
+ <li class="covered" data-hits="3" data-linenumber="26">
1925
+ <span class="hits">3</span>
1926
+
1927
+ <code class="ruby"> geo_country_code = g.country(@rack_request.ip).to_hash[:country_code2]</code>
1928
+ </li>
1929
+
1930
+ <li class="covered" data-hits="3" data-linenumber="27">
1931
+ <span class="hits">3</span>
1932
+
1933
+ <code class="ruby"> if geo_country_code and geo_country_code =~ /^[A-Z]{2}$/</code>
1934
+ </li>
1935
+
1936
+ <li class="missed" data-hits="0" data-linenumber="28">
1937
+
1938
+
1939
+ <code class="ruby"> return geo_country_code</code>
1940
+ </li>
1941
+
1942
+ <li class="never" data-hits="" data-linenumber="29">
1943
+
1944
+
1945
+ <code class="ruby"> end</code>
1946
+ </li>
1947
+
1948
+ <li class="missed" data-hits="0" data-linenumber="30">
1949
+
1950
+
1951
+ <code class="ruby"> rescue Exception =&gt; e</code>
1952
+ </li>
1953
+
1954
+ <li class="missed" data-hits="0" data-linenumber="31">
1955
+
1956
+
1957
+ <code class="ruby"> warn &quot;Unable to fetch country info #{e}&quot;</code>
1958
+ </li>
1959
+
1960
+ <li class="never" data-hits="" data-linenumber="32">
1961
+
1962
+
1963
+ <code class="ruby"> end</code>
1964
+ </li>
1965
+
1966
+ <li class="never" data-hits="" data-linenumber="33">
1967
+
1968
+
1969
+ <code class="ruby"> end</code>
1970
+ </li>
1971
+
1972
+ <li class="never" data-hits="" data-linenumber="34">
1973
+
1974
+
1975
+ <code class="ruby"> end</code>
1976
+ </li>
1977
+
1978
+ <li class="never" data-hits="" data-linenumber="35">
1979
+
1980
+
1981
+ <code class="ruby"></code>
1982
+ </li>
1983
+
1984
+ <li class="covered" data-hits="1" data-linenumber="36">
1985
+ <span class="hits">1</span>
1986
+
1987
+ <code class="ruby"> def recency_ratio_per_visit</code>
1988
+ </li>
1989
+
1990
+ <li class="never" data-hits="" data-linenumber="37">
1991
+
1992
+
1993
+ <code class="ruby"> # tracking for visitor recency</code>
1994
+ </li>
1995
+
1996
+ <li class="covered" data-hits="3" data-linenumber="38">
1997
+ <span class="hits">3</span>
1998
+
1999
+ <code class="ruby"> if @last_visit_time # from first_visit_cookie</code>
2000
+ </li>
2001
+
2002
+ <li class="missed" data-hits="0" data-linenumber="39">
2003
+
2004
+
2005
+ <code class="ruby"> days_since_last_visit = ((@t.to_i - @last_visit_time.to_i)/(24*3600)).round</code>
2006
+ </li>
2007
+
2008
+ <li class="missed" data-hits="0" data-linenumber="40">
2009
+
2010
+
2011
+ <code class="ruby"> if days_since_last_visit &lt;= 1</code>
2012
+ </li>
2013
+
2014
+ <li class="missed" data-hits="0" data-linenumber="41">
2015
+
2016
+
2017
+ <code class="ruby"> return &#39;d&#39;</code>
2018
+ </li>
2019
+
2020
+ <li class="missed" data-hits="0" data-linenumber="42">
2021
+
2022
+
2023
+ <code class="ruby"> elsif days_since_last_visit &lt;= 7</code>
2024
+ </li>
2025
+
2026
+ <li class="missed" data-hits="0" data-linenumber="43">
2027
+
2028
+
2029
+ <code class="ruby"> return &#39;w&#39;</code>
2030
+ </li>
2031
+
2032
+ <li class="missed" data-hits="0" data-linenumber="44">
2033
+
2034
+
2035
+ <code class="ruby"> elsif days_since_last_visit &lt;= 30</code>
2036
+ </li>
2037
+
2038
+ <li class="missed" data-hits="0" data-linenumber="45">
2039
+
2040
+
2041
+ <code class="ruby"> return &#39;m&#39;</code>
2042
+ </li>
2043
+
2044
+ <li class="never" data-hits="" data-linenumber="46">
2045
+
2046
+
2047
+ <code class="ruby"> else</code>
2048
+ </li>
2049
+
2050
+ <li class="missed" data-hits="0" data-linenumber="47">
2051
+
2052
+
2053
+ <code class="ruby"> return &#39;o&#39;</code>
2054
+ </li>
2055
+
2056
+ <li class="never" data-hits="" data-linenumber="48">
2057
+
2058
+
2059
+ <code class="ruby"> end</code>
2060
+ </li>
2061
+
2062
+ <li class="never" data-hits="" data-linenumber="49">
2063
+
2064
+
2065
+ <code class="ruby"> end</code>
2066
+ </li>
2067
+
2068
+ <li class="never" data-hits="" data-linenumber="50">
2069
+
2070
+
2071
+ <code class="ruby"> end</code>
2072
+ </li>
2073
+
2074
+ <li class="never" data-hits="" data-linenumber="51">
2075
+
2076
+
2077
+ <code class="ruby"></code>
2078
+ </li>
2079
+
2080
+ <li class="covered" data-hits="1" data-linenumber="52">
2081
+ <span class="hits">1</span>
2082
+
2083
+ <code class="ruby"> def device_ratio_per_visit</code>
2084
+ </li>
2085
+
2086
+ <li class="covered" data-hits="3" data-linenumber="53">
2087
+ <span class="hits">3</span>
2088
+
2089
+ <code class="ruby"> return ((user_agent.mobile? or user_agent.tablet?) ? &#39;mobile&#39; : &#39;desktop&#39;)</code>
2090
+ </li>
2091
+
2092
+ <li class="never" data-hits="" data-linenumber="54">
2093
+
2094
+
2095
+ <code class="ruby"> end</code>
2096
+ </li>
2097
+
2098
+ <li class="never" data-hits="" data-linenumber="55">
2099
+
2100
+
2101
+ <code class="ruby"></code>
2102
+ </li>
2103
+
2104
+ <li class="covered" data-hits="1" data-linenumber="56">
2105
+ <span class="hits">1</span>
2106
+
2107
+ <code class="ruby"> def referrer_ratio_per_visit</code>
2108
+ </li>
2109
+
2110
+ <li class="covered" data-hits="3" data-linenumber="57">
2111
+ <span class="hits">3</span>
2112
+
2113
+ <code class="ruby"> if @rack_request.referrer</code>
2114
+ </li>
2115
+
2116
+ <li class="missed" data-hits="0" data-linenumber="58">
2117
+
2118
+
2119
+ <code class="ruby"> [&#39;google&#39;, &#39;bing&#39;, &#39;yahoo&#39;, &#39;cleartrip&#39;, &#39;github&#39;].each do |referrer|</code>
2120
+ </li>
2121
+
2122
+ <li class="never" data-hits="" data-linenumber="59">
2123
+
2124
+
2125
+ <code class="ruby"> # this will track x.google.mysite.com as google so its buggy, fix the regex</code>
2126
+ </li>
2127
+
2128
+ <li class="missed" data-hits="0" data-linenumber="60">
2129
+
2130
+
2131
+ <code class="ruby"> if m = @rack_request.referrer.match(/^(https?:\/\/)?([a-zA-Z0-9\.\-]+\.)?(#{referrer})\.([a-zA-Z\.]+)(:[0-9]+)?(\/.*)?$/)</code>
2132
+ </li>
2133
+
2134
+ <li class="missed" data-hits="0" data-linenumber="61">
2135
+
2136
+
2137
+ <code class="ruby"> &quot;REFERRER =&gt; #{m.to_a[3]}&quot;</code>
2138
+ </li>
2139
+
2140
+ <li class="missed" data-hits="0" data-linenumber="62">
2141
+
2142
+
2143
+ <code class="ruby"> referrer = m.to_a[3]</code>
2144
+ </li>
2145
+
2146
+ <li class="never" data-hits="" data-linenumber="63">
2147
+
2148
+
2149
+ <code class="ruby"> else</code>
2150
+ </li>
2151
+
2152
+ <li class="missed" data-hits="0" data-linenumber="64">
2153
+
2154
+
2155
+ <code class="ruby"> referrer = &#39;other&#39;</code>
2156
+ </li>
2157
+
2158
+ <li class="never" data-hits="" data-linenumber="65">
2159
+
2160
+
2161
+ <code class="ruby"> end</code>
2162
+ </li>
2163
+
2164
+ <li class="never" data-hits="" data-linenumber="66">
2165
+
2166
+
2167
+ <code class="ruby"> end</code>
2168
+ </li>
2169
+
2170
+ <li class="never" data-hits="" data-linenumber="67">
2171
+
2172
+
2173
+ <code class="ruby"> else</code>
2174
+ </li>
2175
+
2176
+ <li class="covered" data-hits="3" data-linenumber="68">
2177
+ <span class="hits">3</span>
2178
+
2179
+ <code class="ruby"> referrer = &#39;organic&#39;</code>
2180
+ </li>
2181
+
2182
+ <li class="never" data-hits="" data-linenumber="69">
2183
+
2184
+
2185
+ <code class="ruby"> end</code>
2186
+ </li>
2187
+
2188
+ <li class="covered" data-hits="3" data-linenumber="70">
2189
+ <span class="hits">3</span>
2190
+
2191
+ <code class="ruby"> return referrer</code>
2192
+ </li>
2193
+
2194
+ <li class="never" data-hits="" data-linenumber="71">
2195
+
2196
+
2197
+ <code class="ruby"> end</code>
2198
+ </li>
2199
+
2200
+ <li class="never" data-hits="" data-linenumber="72">
2201
+
2202
+
2203
+ <code class="ruby"></code>
2204
+ </li>
2205
+
2206
+ <li class="never" data-hits="" data-linenumber="73">
2207
+
2208
+
2209
+ <code class="ruby"> # track the ratio of URL&#39;s visits</code>
2210
+ </li>
2211
+
2212
+ <li class="covered" data-hits="1" data-linenumber="74">
2213
+ <span class="hits">1</span>
2214
+
2215
+ <code class="ruby"> def url_ratio_per_hit</code>
2216
+ </li>
2217
+
2218
+ <li class="covered" data-hits="4" data-linenumber="75">
2219
+ <span class="hits">4</span>
2220
+
2221
+ <code class="ruby"> return @rack_request.path</code>
2222
+ </li>
2223
+
2224
+ <li class="never" data-hits="" data-linenumber="76">
2225
+
2226
+
2227
+ <code class="ruby"> end</code>
2228
+ </li>
2229
+
2230
+ <li class="never" data-hits="" data-linenumber="77">
2231
+
2232
+
2233
+ <code class="ruby"> </code>
2234
+ </li>
2235
+
2236
+ <li class="never" data-hits="" data-linenumber="78">
2237
+
2238
+
2239
+ <code class="ruby"> # track the landing pages ratio</code>
2240
+ </li>
2241
+
2242
+ <li class="covered" data-hits="1" data-linenumber="79">
2243
+ <span class="hits">1</span>
2244
+
2245
+ <code class="ruby"> def landing_page_ratio_per_hit</code>
2246
+ </li>
2247
+
2248
+ <li class="covered" data-hits="4" data-linenumber="80">
2249
+ <span class="hits">4</span>
2250
+
2251
+ <code class="ruby"> return @rack_request.path if @page_view_seq_no.to_i == 0</code>
2252
+ </li>
2253
+
2254
+ <li class="never" data-hits="" data-linenumber="81">
2255
+
2256
+
2257
+ <code class="ruby"> end</code>
2258
+ </li>
2259
+
2260
+ <li class="never" data-hits="" data-linenumber="82">
2261
+
2262
+
2263
+ <code class="ruby"></code>
2264
+ </li>
2265
+
2266
+ <li class="never" data-hits="" data-linenumber="83">
2267
+
2268
+
2269
+ <code class="ruby"> # track the landing pages ratio</code>
2270
+ </li>
2271
+
2272
+ <li class="covered" data-hits="1" data-linenumber="84">
2273
+ <span class="hits">1</span>
2274
+
2275
+ <code class="ruby"> def http_response_ratio_per_hit</code>
2276
+ </li>
2277
+
2278
+ <li class="covered" data-hits="4" data-linenumber="85">
2279
+ <span class="hits">4</span>
2280
+
2281
+ <code class="ruby"> return @rack_response.status.to_s</code>
2282
+ </li>
2283
+
2284
+ <li class="never" data-hits="" data-linenumber="86">
2285
+
2286
+
2287
+ <code class="ruby"> end</code>
2288
+ </li>
2289
+
2290
+ <li class="never" data-hits="" data-linenumber="87">
2291
+
2292
+
2293
+ <code class="ruby"></code>
2294
+ </li>
2295
+
2296
+ <li class="covered" data-hits="1" data-linenumber="88">
2297
+ <span class="hits">1</span>
2298
+
2299
+ <code class="ruby"> private</code>
2300
+ </li>
2301
+
2302
+ <li class="covered" data-hits="1" data-linenumber="89">
2303
+ <span class="hits">1</span>
2304
+
2305
+ <code class="ruby"> def user_agent</code>
2306
+ </li>
2307
+
2308
+ <li class="covered" data-hits="9" data-linenumber="90">
2309
+ <span class="hits">9</span>
2310
+
2311
+ <code class="ruby"> Browser.new(:ua =&gt; @rack_request.user_agent, :accept_language =&gt; &#39;en-us&#39;)</code>
2312
+ </li>
2313
+
2314
+ <li class="never" data-hits="" data-linenumber="91">
2315
+
2316
+
2317
+ <code class="ruby"> end</code>
2318
+ </li>
2319
+
2320
+ <li class="never" data-hits="" data-linenumber="92">
2321
+
2322
+
2323
+ <code class="ruby"></code>
2324
+ </li>
2325
+
2326
+ <li class="never" data-hits="" data-linenumber="93">
2327
+
2328
+
2329
+ <code class="ruby"> end</code>
2330
+ </li>
2331
+
2332
+ <li class="never" data-hits="" data-linenumber="94">
2333
+
2334
+
2335
+ <code class="ruby">end</code>
2336
+ </li>
2337
+
2338
+ <li class="never" data-hits="" data-linenumber="95">
2339
+
2340
+
2341
+ <code class="ruby"></code>
2342
+ </li>
2343
+
2344
+ </ol>
2345
+ </pre>
2346
+ </div>
2347
+
2348
+
2349
+ <div class="source_table" id="33256377178a999bdf701dc35554a34e73202356">
2350
+ <div class="header">
2351
+ <h3>lib/redis_analytics/time_ext.rb</h3>
2352
+ <h4><span class="red">71.43 %</span> covered</h4>
2353
+ <div>
2354
+ <b>7</b> relevant lines.
2355
+ <span class="green"><b>5</b> lines covered</span> and
2356
+ <span class="red"><b>2</b> lines missed.</span>
2357
+ </div>
2358
+ </div>
2359
+
2360
+ <pre>
2361
+ <ol>
2362
+
2363
+ <li class="covered" data-hits="1" data-linenumber="1">
2364
+ <span class="hits">1</span>
2365
+
2366
+ <code class="ruby">require &#39;date&#39;</code>
2367
+ </li>
2368
+
2369
+ <li class="covered" data-hits="1" data-linenumber="2">
2370
+ <span class="hits">1</span>
2371
+
2372
+ <code class="ruby">module TimeExtensions</code>
2373
+ </li>
2374
+
2375
+ <li class="never" data-hits="" data-linenumber="3">
2376
+
2377
+
2378
+ <code class="ruby"></code>
2379
+ </li>
2380
+
2381
+ <li class="covered" data-hits="1" data-linenumber="4">
2382
+ <span class="hits">1</span>
2383
+
2384
+ <code class="ruby"> def end_of_minute</code>
2385
+ </li>
2386
+
2387
+ <li class="missed" data-hits="0" data-linenumber="5">
2388
+
2389
+
2390
+ <code class="ruby"> Time.local(self.year, self.mon, self.day, self.hour, self.min, 59)</code>
2391
+ </li>
2392
+
2393
+ <li class="never" data-hits="" data-linenumber="6">
2394
+
2395
+
2396
+ <code class="ruby"> end</code>
2397
+ </li>
2398
+
2399
+ <li class="never" data-hits="" data-linenumber="7">
2400
+
2401
+
2402
+ <code class="ruby"></code>
2403
+ </li>
2404
+
2405
+ <li class="covered" data-hits="1" data-linenumber="8">
2406
+ <span class="hits">1</span>
2407
+
2408
+ <code class="ruby"> def beginning_of_minute</code>
2409
+ </li>
2410
+
2411
+ <li class="missed" data-hits="0" data-linenumber="9">
2412
+
2413
+
2414
+ <code class="ruby"> Time.local(self.year, self.mon, self.day, self.hour, self.min, 0)</code>
2415
+ </li>
2416
+
2417
+ <li class="never" data-hits="" data-linenumber="10">
2418
+
2419
+
2420
+ <code class="ruby"> end</code>
2421
+ </li>
2422
+
2423
+ <li class="never" data-hits="" data-linenumber="11">
2424
+
2425
+
2426
+ <code class="ruby">end</code>
2427
+ </li>
2428
+
2429
+ <li class="never" data-hits="" data-linenumber="12">
2430
+
2431
+
2432
+ <code class="ruby"></code>
2433
+ </li>
2434
+
2435
+ <li class="covered" data-hits="1" data-linenumber="13">
2436
+ <span class="hits">1</span>
2437
+
2438
+ <code class="ruby">Time.send :include, TimeExtensions</code>
2439
+ </li>
2440
+
2441
+ </ol>
2442
+ </pre>
2443
+ </div>
2444
+
2445
+
2446
+ <div class="source_table" id="ab2a757718213263405983cc381a1743db19a6d3">
2447
+ <div class="header">
2448
+ <h3>lib/redis_analytics/tracker.rb</h3>
2449
+ <h4><span class="green">93.1 %</span> covered</h4>
2450
+ <div>
2451
+ <b>29</b> relevant lines.
2452
+ <span class="green"><b>27</b> lines covered</span> and
2453
+ <span class="red"><b>2</b> lines missed.</span>
2454
+ </div>
2455
+ </div>
2456
+
2457
+ <pre>
2458
+ <ol>
2459
+
2460
+ <li class="never" data-hits="" data-linenumber="1">
2461
+
2462
+
2463
+ <code class="ruby"># -*- coding: utf-8 -*-</code>
2464
+ </li>
2465
+
2466
+ <li class="covered" data-hits="1" data-linenumber="2">
2467
+ <span class="hits">1</span>
2468
+
2469
+ <code class="ruby">require &#39;digest/md5&#39;</code>
2470
+ </li>
2471
+
2472
+ <li class="covered" data-hits="1" data-linenumber="3">
2473
+ <span class="hits">1</span>
2474
+
2475
+ <code class="ruby">module RedisAnalytics</code>
2476
+ </li>
2477
+
2478
+ <li class="covered" data-hits="1" data-linenumber="4">
2479
+ <span class="hits">1</span>
2480
+
2481
+ <code class="ruby"> class Tracker</code>
2482
+ </li>
2483
+
2484
+ <li class="never" data-hits="" data-linenumber="5">
2485
+
2486
+
2487
+ <code class="ruby"></code>
2488
+ </li>
2489
+
2490
+ <li class="covered" data-hits="1" data-linenumber="6">
2491
+ <span class="hits">1</span>
2492
+
2493
+ <code class="ruby"> def initialize(app)</code>
2494
+ </li>
2495
+
2496
+ <li class="covered" data-hits="2" data-linenumber="7">
2497
+ <span class="hits">2</span>
2498
+
2499
+ <code class="ruby"> @app = app</code>
2500
+ </li>
2501
+
2502
+ <li class="never" data-hits="" data-linenumber="8">
2503
+
2504
+
2505
+ <code class="ruby"> end</code>
2506
+ </li>
2507
+
2508
+ <li class="never" data-hits="" data-linenumber="9">
2509
+
2510
+
2511
+ <code class="ruby"></code>
2512
+ </li>
2513
+
2514
+ <li class="covered" data-hits="1" data-linenumber="10">
2515
+ <span class="hits">1</span>
2516
+
2517
+ <code class="ruby"> def call(env)</code>
2518
+ </li>
2519
+
2520
+ <li class="covered" data-hits="4" data-linenumber="11">
2521
+ <span class="hits">4</span>
2522
+
2523
+ <code class="ruby"> dup.call!(env)</code>
2524
+ </li>
2525
+
2526
+ <li class="never" data-hits="" data-linenumber="12">
2527
+
2528
+
2529
+ <code class="ruby"> end</code>
2530
+ </li>
2531
+
2532
+ <li class="never" data-hits="" data-linenumber="13">
2533
+
2534
+
2535
+ <code class="ruby"></code>
2536
+ </li>
2537
+
2538
+ <li class="covered" data-hits="1" data-linenumber="14">
2539
+ <span class="hits">1</span>
2540
+
2541
+ <code class="ruby"> def call!(env)</code>
2542
+ </li>
2543
+
2544
+ <li class="covered" data-hits="4" data-linenumber="15">
2545
+ <span class="hits">4</span>
2546
+
2547
+ <code class="ruby"> @env = env</code>
2548
+ </li>
2549
+
2550
+ <li class="covered" data-hits="4" data-linenumber="16">
2551
+ <span class="hits">4</span>
2552
+
2553
+ <code class="ruby"> @request = Rack::Request.new(env)</code>
2554
+ </li>
2555
+
2556
+ <li class="covered" data-hits="4" data-linenumber="17">
2557
+ <span class="hits">4</span>
2558
+
2559
+ <code class="ruby"> status, headers, body = @app.call(env)</code>
2560
+ </li>
2561
+
2562
+ <li class="covered" data-hits="4" data-linenumber="18">
2563
+ <span class="hits">4</span>
2564
+
2565
+ <code class="ruby"> @response = Rack::Response.new(body, status, headers)</code>
2566
+ </li>
2567
+
2568
+ <li class="covered" data-hits="4" data-linenumber="19">
2569
+ <span class="hits">4</span>
2570
+
2571
+ <code class="ruby"> record if should_record?</code>
2572
+ </li>
2573
+
2574
+ <li class="covered" data-hits="4" data-linenumber="20">
2575
+ <span class="hits">4</span>
2576
+
2577
+ <code class="ruby"> @response.finish</code>
2578
+ </li>
2579
+
2580
+ <li class="never" data-hits="" data-linenumber="21">
2581
+
2582
+
2583
+ <code class="ruby"> end</code>
2584
+ </li>
2585
+
2586
+ <li class="never" data-hits="" data-linenumber="22">
2587
+
2588
+
2589
+ <code class="ruby"></code>
2590
+ </li>
2591
+
2592
+ <li class="covered" data-hits="1" data-linenumber="23">
2593
+ <span class="hits">1</span>
2594
+
2595
+ <code class="ruby"> def should_record?</code>
2596
+ </li>
2597
+
2598
+ <li class="covered" data-hits="4" data-linenumber="24">
2599
+ <span class="hits">4</span>
2600
+
2601
+ <code class="ruby"> dashboard_path = Rails.application.routes.named_routes[:redis_analytics].path rescue nil</code>
2602
+ </li>
2603
+
2604
+ <li class="covered" data-hits="4" data-linenumber="25">
2605
+ <span class="hits">4</span>
2606
+
2607
+ <code class="ruby"> return false if dashboard_path =~ @request.path</code>
2608
+ </li>
2609
+
2610
+ <li class="covered" data-hits="4" data-linenumber="26">
2611
+ <span class="hits">4</span>
2612
+
2613
+ <code class="ruby"> return false unless @response.ok?</code>
2614
+ </li>
2615
+
2616
+ <li class="covered" data-hits="4" data-linenumber="27">
2617
+ <span class="hits">4</span>
2618
+
2619
+ <code class="ruby"> return false unless @response.content_type =~ /^text\/html/</code>
2620
+ </li>
2621
+
2622
+ <li class="covered" data-hits="4" data-linenumber="28">
2623
+ <span class="hits">4</span>
2624
+
2625
+ <code class="ruby"> RedisAnalytics.path_filters.each do |filter|</code>
2626
+ </li>
2627
+
2628
+ <li class="missed" data-hits="0" data-linenumber="29">
2629
+
2630
+
2631
+ <code class="ruby"> return false if filter.matches?(@request.path)</code>
2632
+ </li>
2633
+
2634
+ <li class="never" data-hits="" data-linenumber="30">
2635
+
2636
+
2637
+ <code class="ruby"> end</code>
2638
+ </li>
2639
+
2640
+ <li class="covered" data-hits="4" data-linenumber="31">
2641
+ <span class="hits">4</span>
2642
+
2643
+ <code class="ruby"> RedisAnalytics.filters.each do |filter|</code>
2644
+ </li>
2645
+
2646
+ <li class="missed" data-hits="0" data-linenumber="32">
2647
+
2648
+
2649
+ <code class="ruby"> return false if filter.matches?(@request, @response)</code>
2650
+ </li>
2651
+
2652
+ <li class="never" data-hits="" data-linenumber="33">
2653
+
2654
+
2655
+ <code class="ruby"> end</code>
2656
+ </li>
2657
+
2658
+ <li class="covered" data-hits="4" data-linenumber="34">
2659
+ <span class="hits">4</span>
2660
+
2661
+ <code class="ruby"> return true</code>
2662
+ </li>
2663
+
2664
+ <li class="never" data-hits="" data-linenumber="35">
2665
+
2666
+
2667
+ <code class="ruby"> end</code>
2668
+ </li>
2669
+
2670
+ <li class="never" data-hits="" data-linenumber="36">
2671
+
2672
+
2673
+ <code class="ruby"></code>
2674
+ </li>
2675
+
2676
+ <li class="covered" data-hits="1" data-linenumber="37">
2677
+ <span class="hits">1</span>
2678
+
2679
+ <code class="ruby"> def record</code>
2680
+ </li>
2681
+
2682
+ <li class="covered" data-hits="4" data-linenumber="38">
2683
+ <span class="hits">4</span>
2684
+
2685
+ <code class="ruby"> v = Visit.new(@request, @response)</code>
2686
+ </li>
2687
+
2688
+ <li class="covered" data-hits="4" data-linenumber="39">
2689
+ <span class="hits">4</span>
2690
+
2691
+ <code class="ruby"> @response = v.record</code>
2692
+ </li>
2693
+
2694
+ <li class="covered" data-hits="4" data-linenumber="40">
2695
+ <span class="hits">4</span>
2696
+
2697
+ <code class="ruby"> @response.set_cookie(RedisAnalytics.current_visit_cookie_name, v.updated_current_visit_info)</code>
2698
+ </li>
2699
+
2700
+ <li class="covered" data-hits="4" data-linenumber="41">
2701
+ <span class="hits">4</span>
2702
+
2703
+ <code class="ruby"> @response.set_cookie(RedisAnalytics.first_visit_cookie_name, v.updated_first_visit_info)</code>
2704
+ </li>
2705
+
2706
+ <li class="never" data-hits="" data-linenumber="42">
2707
+
2708
+
2709
+ <code class="ruby"> end</code>
2710
+ </li>
2711
+
2712
+ <li class="never" data-hits="" data-linenumber="43">
2713
+
2714
+
2715
+ <code class="ruby"></code>
2716
+ </li>
2717
+
2718
+ <li class="never" data-hits="" data-linenumber="44">
2719
+
2720
+
2721
+ <code class="ruby"> end</code>
2722
+ </li>
2723
+
2724
+ <li class="never" data-hits="" data-linenumber="45">
2725
+
2726
+
2727
+ <code class="ruby">end</code>
2728
+ </li>
2729
+
2730
+ </ol>
2731
+ </pre>
2732
+ </div>
2733
+
2734
+
2735
+ <div class="source_table" id="ef7dac77b9088acb55bda5292fc8a299551c9e22">
2736
+ <div class="header">
2737
+ <h3>lib/redis_analytics/visit.rb</h3>
2738
+ <h4><span class="green">98.48 %</span> covered</h4>
2739
+ <div>
2740
+ <b>66</b> relevant lines.
2741
+ <span class="green"><b>65</b> lines covered</span> and
2742
+ <span class="red"><b>1</b> lines missed.</span>
2743
+ </div>
2744
+ </div>
2745
+
2746
+ <pre>
2747
+ <ol>
2748
+
2749
+ <li class="covered" data-hits="1" data-linenumber="1">
2750
+ <span class="hits">1</span>
2751
+
2752
+ <code class="ruby">module RedisAnalytics</code>
2753
+ </li>
2754
+
2755
+ <li class="covered" data-hits="1" data-linenumber="2">
2756
+ <span class="hits">1</span>
2757
+
2758
+ <code class="ruby"> class Visit</code>
2759
+ </li>
2760
+
2761
+ <li class="covered" data-hits="1" data-linenumber="3">
2762
+ <span class="hits">1</span>
2763
+
2764
+ <code class="ruby"> include Metrics</code>
2765
+ </li>
2766
+
2767
+ <li class="never" data-hits="" data-linenumber="4">
2768
+
2769
+
2770
+ <code class="ruby"></code>
2771
+ </li>
2772
+
2773
+ <li class="never" data-hits="" data-linenumber="5">
2774
+
2775
+
2776
+ <code class="ruby"> # This class represents one unique visit</code>
2777
+ </li>
2778
+
2779
+ <li class="never" data-hits="" data-linenumber="6">
2780
+
2781
+
2782
+ <code class="ruby"> # User may have never visited the site</code>
2783
+ </li>
2784
+
2785
+ <li class="never" data-hits="" data-linenumber="7">
2786
+
2787
+
2788
+ <code class="ruby"> # User may have visited before but his visit is expired</code>
2789
+ </li>
2790
+
2791
+ <li class="never" data-hits="" data-linenumber="8">
2792
+
2793
+
2794
+ <code class="ruby"> # Everything counted here is unique for a visit</code>
2795
+ </li>
2796
+
2797
+ <li class="never" data-hits="" data-linenumber="9">
2798
+
2799
+
2800
+ <code class="ruby"></code>
2801
+ </li>
2802
+
2803
+ <li class="never" data-hits="" data-linenumber="10">
2804
+
2805
+
2806
+ <code class="ruby"> # helpers</code>
2807
+ </li>
2808
+
2809
+ <li class="covered" data-hits="1" data-linenumber="11">
2810
+ <span class="hits">1</span>
2811
+
2812
+ <code class="ruby"> def for_each_time_range(t)</code>
2813
+ </li>
2814
+
2815
+ <li class="covered" data-hits="210" data-linenumber="12">
2816
+ <span class="hits">210</span>
2817
+
2818
+ <code class="ruby"> RedisAnalytics.redis_key_timestamps.map{|x, y| t.strftime(x)}.each do |ts|</code>
2819
+ </li>
2820
+
2821
+ <li class="covered" data-hits="175" data-linenumber="13">
2822
+ <span class="hits">175</span>
2823
+
2824
+ <code class="ruby"> yield(ts)</code>
2825
+ </li>
2826
+
2827
+ <li class="never" data-hits="" data-linenumber="14">
2828
+
2829
+
2830
+ <code class="ruby"> end</code>
2831
+ </li>
2832
+
2833
+ <li class="never" data-hits="" data-linenumber="15">
2834
+
2835
+
2836
+ <code class="ruby"> end</code>
2837
+ </li>
2838
+
2839
+ <li class="never" data-hits="" data-linenumber="16">
2840
+
2841
+
2842
+ <code class="ruby"></code>
2843
+ </li>
2844
+
2845
+ <li class="covered" data-hits="1" data-linenumber="17">
2846
+ <span class="hits">1</span>
2847
+
2848
+ <code class="ruby"> def first_visit_info</code>
2849
+ </li>
2850
+
2851
+ <li class="covered" data-hits="12" data-linenumber="18">
2852
+ <span class="hits">12</span>
2853
+
2854
+ <code class="ruby"> cookie = @rack_request.cookies[RedisAnalytics.first_visit_cookie_name]</code>
2855
+ </li>
2856
+
2857
+ <li class="covered" data-hits="12" data-linenumber="19">
2858
+ <span class="hits">12</span>
2859
+
2860
+ <code class="ruby"> return cookie ? cookie.split(&#39;.&#39;) : []</code>
2861
+ </li>
2862
+
2863
+ <li class="never" data-hits="" data-linenumber="20">
2864
+
2865
+
2866
+ <code class="ruby"> end</code>
2867
+ </li>
2868
+
2869
+ <li class="never" data-hits="" data-linenumber="21">
2870
+
2871
+
2872
+ <code class="ruby"></code>
2873
+ </li>
2874
+
2875
+ <li class="covered" data-hits="1" data-linenumber="22">
2876
+ <span class="hits">1</span>
2877
+
2878
+ <code class="ruby"> def current_visit_info</code>
2879
+ </li>
2880
+
2881
+ <li class="covered" data-hits="19" data-linenumber="23">
2882
+ <span class="hits">19</span>
2883
+
2884
+ <code class="ruby"> cookie = @rack_request.cookies[RedisAnalytics.current_visit_cookie_name]</code>
2885
+ </li>
2886
+
2887
+ <li class="covered" data-hits="19" data-linenumber="24">
2888
+ <span class="hits">19</span>
2889
+
2890
+ <code class="ruby"> return cookie ? cookie.split(&#39;.&#39;) : []</code>
2891
+ </li>
2892
+
2893
+ <li class="never" data-hits="" data-linenumber="25">
2894
+
2895
+
2896
+ <code class="ruby"> end</code>
2897
+ </li>
2898
+
2899
+ <li class="never" data-hits="" data-linenumber="26">
2900
+
2901
+
2902
+ <code class="ruby"></code>
2903
+ </li>
2904
+
2905
+ <li class="never" data-hits="" data-linenumber="27">
2906
+
2907
+
2908
+ <code class="ruby"> # method used in analytics.rb to initialize visit</code>
2909
+ </li>
2910
+
2911
+ <li class="covered" data-hits="1" data-linenumber="28">
2912
+ <span class="hits">1</span>
2913
+
2914
+ <code class="ruby"> def initialize(request, response)</code>
2915
+ </li>
2916
+
2917
+ <li class="covered" data-hits="4" data-linenumber="29">
2918
+ <span class="hits">4</span>
2919
+
2920
+ <code class="ruby"> @t = Time.now</code>
2921
+ </li>
2922
+
2923
+ <li class="covered" data-hits="4" data-linenumber="30">
2924
+ <span class="hits">4</span>
2925
+
2926
+ <code class="ruby"> @redis_key_prefix = &quot;#{RedisAnalytics.redis_namespace}:&quot;</code>
2927
+ </li>
2928
+
2929
+ <li class="covered" data-hits="4" data-linenumber="31">
2930
+ <span class="hits">4</span>
2931
+
2932
+ <code class="ruby"> @rack_request = request</code>
2933
+ </li>
2934
+
2935
+ <li class="covered" data-hits="4" data-linenumber="32">
2936
+ <span class="hits">4</span>
2937
+
2938
+ <code class="ruby"> @rack_response = response</code>
2939
+ </li>
2940
+
2941
+ <li class="covered" data-hits="4" data-linenumber="33">
2942
+ <span class="hits">4</span>
2943
+
2944
+ <code class="ruby"> @first_visit_seq = first_visit_info[0] || current_visit_info[0]</code>
2945
+ </li>
2946
+
2947
+ <li class="covered" data-hits="4" data-linenumber="34">
2948
+ <span class="hits">4</span>
2949
+
2950
+ <code class="ruby"> @current_visit_seq = current_visit_info[1]</code>
2951
+ </li>
2952
+
2953
+ <li class="never" data-hits="" data-linenumber="35">
2954
+
2955
+
2956
+ <code class="ruby"></code>
2957
+ </li>
2958
+
2959
+ <li class="covered" data-hits="4" data-linenumber="36">
2960
+ <span class="hits">4</span>
2961
+
2962
+ <code class="ruby"> @first_visit_time = first_visit_info[1]</code>
2963
+ </li>
2964
+
2965
+ <li class="covered" data-hits="4" data-linenumber="37">
2966
+ <span class="hits">4</span>
2967
+
2968
+ <code class="ruby"> @last_visit_time = first_visit_info[2]</code>
2969
+ </li>
2970
+
2971
+ <li class="never" data-hits="" data-linenumber="38">
2972
+
2973
+
2974
+ <code class="ruby"></code>
2975
+ </li>
2976
+
2977
+ <li class="covered" data-hits="4" data-linenumber="39">
2978
+ <span class="hits">4</span>
2979
+
2980
+ <code class="ruby"> @page_view_seq_no = current_visit_info[2] || 0</code>
2981
+ </li>
2982
+
2983
+ <li class="covered" data-hits="4" data-linenumber="40">
2984
+ <span class="hits">4</span>
2985
+
2986
+ <code class="ruby"> @last_visit_start_time = current_visit_info[3]</code>
2987
+ </li>
2988
+
2989
+ <li class="covered" data-hits="4" data-linenumber="41">
2990
+ <span class="hits">4</span>
2991
+
2992
+ <code class="ruby"> @last_visit_end_time = current_visit_info[4]</code>
2993
+ </li>
2994
+
2995
+ <li class="never" data-hits="" data-linenumber="42">
2996
+
2997
+
2998
+ <code class="ruby"> end</code>
2999
+ </li>
3000
+
3001
+ <li class="never" data-hits="" data-linenumber="43">
3002
+
3003
+
3004
+ <code class="ruby"></code>
3005
+ </li>
3006
+
3007
+ <li class="never" data-hits="" data-linenumber="44">
3008
+
3009
+
3010
+ <code class="ruby"> # called from analytics.rb</code>
3011
+ </li>
3012
+
3013
+ <li class="covered" data-hits="1" data-linenumber="45">
3014
+ <span class="hits">1</span>
3015
+
3016
+ <code class="ruby"> def record</code>
3017
+ </li>
3018
+
3019
+ <li class="covered" data-hits="4" data-linenumber="46">
3020
+ <span class="hits">4</span>
3021
+
3022
+ <code class="ruby"> if @current_visit_seq</code>
3023
+ </li>
3024
+
3025
+ <li class="covered" data-hits="1" data-linenumber="47">
3026
+ <span class="hits">1</span>
3027
+
3028
+ <code class="ruby"> track(&quot;visit_time&quot;, @t.to_i - @last_visit_end_time.to_i)</code>
3029
+ </li>
3030
+
3031
+ <li class="never" data-hits="" data-linenumber="48">
3032
+
3033
+
3034
+ <code class="ruby"> else</code>
3035
+ </li>
3036
+
3037
+ <li class="covered" data-hits="3" data-linenumber="49">
3038
+ <span class="hits">3</span>
3039
+
3040
+ <code class="ruby"> @current_visit_seq ||= counter(&quot;visits&quot;)</code>
3041
+ </li>
3042
+
3043
+ <li class="covered" data-hits="3" data-linenumber="50">
3044
+ <span class="hits">3</span>
3045
+
3046
+ <code class="ruby"> track(&quot;visits&quot;, 1) # track core &#39;visit&#39; metric</code>
3047
+ </li>
3048
+
3049
+ <li class="covered" data-hits="3" data-linenumber="51">
3050
+ <span class="hits">3</span>
3051
+
3052
+ <code class="ruby"> if @first_visit_seq</code>
3053
+ </li>
3054
+
3055
+ <li class="missed" data-hits="0" data-linenumber="52">
3056
+
3057
+
3058
+ <code class="ruby"> track(&quot;repeat_visits&quot;, 1)</code>
3059
+ </li>
3060
+
3061
+ <li class="never" data-hits="" data-linenumber="53">
3062
+
3063
+
3064
+ <code class="ruby"> else</code>
3065
+ </li>
3066
+
3067
+ <li class="covered" data-hits="3" data-linenumber="54">
3068
+ <span class="hits">3</span>
3069
+
3070
+ <code class="ruby"> @first_visit_seq ||= counter(&quot;unique_visits&quot;)</code>
3071
+ </li>
3072
+
3073
+ <li class="covered" data-hits="3" data-linenumber="55">
3074
+ <span class="hits">3</span>
3075
+
3076
+ <code class="ruby"> track(&quot;first_visits&quot;, 1)</code>
3077
+ </li>
3078
+
3079
+ <li class="covered" data-hits="3" data-linenumber="56">
3080
+ <span class="hits">3</span>
3081
+
3082
+ <code class="ruby"> track(&quot;unique_visits&quot;, 1)</code>
3083
+ </li>
3084
+
3085
+ <li class="never" data-hits="" data-linenumber="57">
3086
+
3087
+
3088
+ <code class="ruby"> end</code>
3089
+ </li>
3090
+
3091
+ <li class="covered" data-hits="3" data-linenumber="58">
3092
+ <span class="hits">3</span>
3093
+
3094
+ <code class="ruby"> exec_custom_methods(&#39;visit&#39;) # custom methods that are measured on a per-visit basis</code>
3095
+ </li>
3096
+
3097
+ <li class="never" data-hits="" data-linenumber="59">
3098
+
3099
+
3100
+ <code class="ruby"> end</code>
3101
+ </li>
3102
+
3103
+ <li class="covered" data-hits="4" data-linenumber="60">
3104
+ <span class="hits">4</span>
3105
+
3106
+ <code class="ruby"> exec_custom_methods(&#39;hit&#39;) # custom methods that are measured on a per-page-view (per-hit) basis</code>
3107
+ </li>
3108
+
3109
+ <li class="covered" data-hits="4" data-linenumber="61">
3110
+ <span class="hits">4</span>
3111
+
3112
+ <code class="ruby"> track(&quot;page_views&quot;, 1) # track core &#39;page_view&#39; metric</code>
3113
+ </li>
3114
+
3115
+ <li class="covered" data-hits="4" data-linenumber="62">
3116
+ <span class="hits">4</span>
3117
+
3118
+ <code class="ruby"> track(&quot;second_page_views&quot;, 1) if @page_view_seq_no.to_i == 1 # @last_visit_start_time and (@last_visit_start_time.to_i == @last_visit_end_time.to_i)</code>
3119
+ </li>
3120
+
3121
+ <li class="covered" data-hits="4" data-linenumber="63">
3122
+ <span class="hits">4</span>
3123
+
3124
+ <code class="ruby"> @rack_response</code>
3125
+ </li>
3126
+
3127
+ <li class="never" data-hits="" data-linenumber="64">
3128
+
3129
+
3130
+ <code class="ruby"> end</code>
3131
+ </li>
3132
+
3133
+ <li class="never" data-hits="" data-linenumber="65">
3134
+
3135
+
3136
+ <code class="ruby"></code>
3137
+ </li>
3138
+
3139
+ <li class="covered" data-hits="1" data-linenumber="66">
3140
+ <span class="hits">1</span>
3141
+
3142
+ <code class="ruby"> def exec_custom_methods(type)</code>
3143
+ </li>
3144
+
3145
+ <li class="covered" data-hits="7" data-linenumber="67">
3146
+ <span class="hits">7</span>
3147
+
3148
+ <code class="ruby"> Metrics.public_instance_methods.each do |meth|</code>
3149
+ </li>
3150
+
3151
+ <li class="covered" data-hits="112" data-linenumber="68">
3152
+ <span class="hits">112</span>
3153
+
3154
+ <code class="ruby"> if m = meth.to_s.match(/^([a-z_]*)_(count|ratio)_per_#{type}$/)</code>
3155
+ </li>
3156
+
3157
+ <li class="covered" data-hits="53" data-linenumber="69">
3158
+ <span class="hits">53</span>
3159
+
3160
+ <code class="ruby"> begin</code>
3161
+ </li>
3162
+
3163
+ <li class="covered" data-hits="53" data-linenumber="70">
3164
+ <span class="hits">53</span>
3165
+
3166
+ <code class="ruby"> return_value = self.send(meth)</code>
3167
+ </li>
3168
+
3169
+ <li class="covered" data-hits="50" data-linenumber="71">
3170
+ <span class="hits">50</span>
3171
+
3172
+ <code class="ruby"> track(m.to_a[1], return_value) if return_value</code>
3173
+ </li>
3174
+
3175
+ <li class="never" data-hits="" data-linenumber="72">
3176
+
3177
+
3178
+ <code class="ruby"> rescue =&gt; e</code>
3179
+ </li>
3180
+
3181
+ <li class="covered" data-hits="3" data-linenumber="73">
3182
+ <span class="hits">3</span>
3183
+
3184
+ <code class="ruby"> warn &quot;#{meth} resulted in an exception #{e}&quot;</code>
3185
+ </li>
3186
+
3187
+ <li class="never" data-hits="" data-linenumber="74">
3188
+
3189
+
3190
+ <code class="ruby"> end</code>
3191
+ </li>
3192
+
3193
+ <li class="never" data-hits="" data-linenumber="75">
3194
+
3195
+
3196
+ <code class="ruby"> end</code>
3197
+ </li>
3198
+
3199
+ <li class="never" data-hits="" data-linenumber="76">
3200
+
3201
+
3202
+ <code class="ruby"> end</code>
3203
+ </li>
3204
+
3205
+ <li class="never" data-hits="" data-linenumber="77">
3206
+
3207
+
3208
+ <code class="ruby"> end</code>
3209
+ </li>
3210
+
3211
+ <li class="never" data-hits="" data-linenumber="78">
3212
+
3213
+
3214
+ <code class="ruby"></code>
3215
+ </li>
3216
+
3217
+ <li class="never" data-hits="" data-linenumber="79">
3218
+
3219
+
3220
+ <code class="ruby"> # helpers</code>
3221
+ </li>
3222
+
3223
+ <li class="covered" data-hits="1" data-linenumber="80">
3224
+ <span class="hits">1</span>
3225
+
3226
+ <code class="ruby"> def counter(metric_name)</code>
3227
+ </li>
3228
+
3229
+ <li class="covered" data-hits="6" data-linenumber="81">
3230
+ <span class="hits">6</span>
3231
+
3232
+ <code class="ruby"> n = RedisAnalytics.redis_connection.incr(&quot;#{@redis_key_prefix}#{metric_name}&quot;)</code>
3233
+ </li>
3234
+
3235
+ <li class="never" data-hits="" data-linenumber="82">
3236
+
3237
+
3238
+ <code class="ruby"> # to debug, uncomment this line</code>
3239
+ </li>
3240
+
3241
+ <li class="never" data-hits="" data-linenumber="83">
3242
+
3243
+
3244
+ <code class="ruby"> # puts &quot;COUNT #{metric_name} -&gt; #{n}&quot;</code>
3245
+ </li>
3246
+
3247
+ <li class="covered" data-hits="6" data-linenumber="84">
3248
+ <span class="hits">6</span>
3249
+
3250
+ <code class="ruby"> return n</code>
3251
+ </li>
3252
+
3253
+ <li class="never" data-hits="" data-linenumber="85">
3254
+
3255
+
3256
+ <code class="ruby"> end</code>
3257
+ </li>
3258
+
3259
+ <li class="never" data-hits="" data-linenumber="86">
3260
+
3261
+
3262
+ <code class="ruby"></code>
3263
+ </li>
3264
+
3265
+ <li class="covered" data-hits="1" data-linenumber="87">
3266
+ <span class="hits">1</span>
3267
+
3268
+ <code class="ruby"> def updated_current_visit_info</code>
3269
+ </li>
3270
+
3271
+ <li class="covered" data-hits="4" data-linenumber="88">
3272
+ <span class="hits">4</span>
3273
+
3274
+ <code class="ruby"> value = [@first_visit_seq.to_i, @current_visit_seq.to_i, @page_view_seq_no.to_i + 1, (@last_visit_start_time || @t).to_i, @t.to_i]</code>
3275
+ </li>
3276
+
3277
+ <li class="never" data-hits="" data-linenumber="89">
3278
+
3279
+
3280
+ <code class="ruby"> # to debug, uncomment this line</code>
3281
+ </li>
3282
+
3283
+ <li class="never" data-hits="" data-linenumber="90">
3284
+
3285
+
3286
+ <code class="ruby"> # puts &quot;UPDATING VCN COOKIE -&gt; #{value}&quot;</code>
3287
+ </li>
3288
+
3289
+ <li class="covered" data-hits="4" data-linenumber="91">
3290
+ <span class="hits">4</span>
3291
+
3292
+ <code class="ruby"> expires = @t + RedisAnalytics.visit_timeout.to_i.minutes</code>
3293
+ </li>
3294
+
3295
+ <li class="covered" data-hits="4" data-linenumber="92">
3296
+ <span class="hits">4</span>
3297
+
3298
+ <code class="ruby"> {:value =&gt; value.join(&#39;.&#39;), :expires =&gt; expires}</code>
3299
+ </li>
3300
+
3301
+ <li class="never" data-hits="" data-linenumber="93">
3302
+
3303
+
3304
+ <code class="ruby"> end</code>
3305
+ </li>
3306
+
3307
+ <li class="never" data-hits="" data-linenumber="94">
3308
+
3309
+
3310
+ <code class="ruby"></code>
3311
+ </li>
3312
+
3313
+ <li class="covered" data-hits="1" data-linenumber="95">
3314
+ <span class="hits">1</span>
3315
+
3316
+ <code class="ruby"> def updated_first_visit_info</code>
3317
+ </li>
3318
+
3319
+ <li class="covered" data-hits="4" data-linenumber="96">
3320
+ <span class="hits">4</span>
3321
+
3322
+ <code class="ruby"> value = [@first_visit_seq.to_i, (@first_visit_time || @t).to_i, @t.to_i]</code>
3323
+ </li>
3324
+
3325
+ <li class="never" data-hits="" data-linenumber="97">
3326
+
3327
+
3328
+ <code class="ruby"> # to debug, uncomment this line</code>
3329
+ </li>
3330
+
3331
+ <li class="never" data-hits="" data-linenumber="98">
3332
+
3333
+
3334
+ <code class="ruby"> # puts &quot;UPDATING RUCN COOKIE -&gt; #{value}&quot;</code>
3335
+ </li>
3336
+
3337
+ <li class="covered" data-hits="4" data-linenumber="99">
3338
+ <span class="hits">4</span>
3339
+
3340
+ <code class="ruby"> expires = @t + 1.year</code>
3341
+ </li>
3342
+
3343
+ <li class="covered" data-hits="4" data-linenumber="100">
3344
+ <span class="hits">4</span>
3345
+
3346
+ <code class="ruby"> {:value =&gt; value.join(&#39;.&#39;), :expires =&gt; expires}</code>
3347
+ </li>
3348
+
3349
+ <li class="never" data-hits="" data-linenumber="101">
3350
+
3351
+
3352
+ <code class="ruby"> end</code>
3353
+ </li>
3354
+
3355
+ <li class="never" data-hits="" data-linenumber="102">
3356
+
3357
+
3358
+ <code class="ruby"></code>
3359
+ </li>
3360
+
3361
+ <li class="covered" data-hits="1" data-linenumber="103">
3362
+ <span class="hits">1</span>
3363
+
3364
+ <code class="ruby"> def track(metric_name, metric_value)</code>
3365
+ </li>
3366
+
3367
+ <li class="covered" data-hits="35" data-linenumber="104">
3368
+ <span class="hits">35</span>
3369
+
3370
+ <code class="ruby"> n = 0</code>
3371
+ </li>
3372
+
3373
+ <li class="covered" data-hits="35" data-linenumber="105">
3374
+ <span class="hits">35</span>
3375
+
3376
+ <code class="ruby"> RedisAnalytics.redis_connection.hmset(&quot;#{@redis_key_prefix}#METRICS&quot;, metric_name, metric_value.class)</code>
3377
+ </li>
3378
+
3379
+ <li class="covered" data-hits="35" data-linenumber="106">
3380
+ <span class="hits">35</span>
3381
+
3382
+ <code class="ruby"> for_each_time_range(@t) do |ts|</code>
3383
+ </li>
3384
+
3385
+ <li class="covered" data-hits="175" data-linenumber="107">
3386
+ <span class="hits">175</span>
3387
+
3388
+ <code class="ruby"> key = &quot;#{@redis_key_prefix}#{metric_name}:#{ts}&quot;</code>
3389
+ </li>
3390
+
3391
+ <li class="covered" data-hits="175" data-linenumber="108">
3392
+ <span class="hits">175</span>
3393
+
3394
+ <code class="ruby"> if metric_value.is_a?(Integer)</code>
3395
+ </li>
3396
+
3397
+ <li class="covered" data-hits="75" data-linenumber="109">
3398
+ <span class="hits">75</span>
3399
+
3400
+ <code class="ruby"> n = RedisAnalytics.redis_connection.incrby(key, metric_value)</code>
3401
+ </li>
3402
+
3403
+ <li class="never" data-hits="" data-linenumber="110">
3404
+
3405
+
3406
+ <code class="ruby"> else</code>
3407
+ </li>
3408
+
3409
+ <li class="covered" data-hits="100" data-linenumber="111">
3410
+ <span class="hits">100</span>
3411
+
3412
+ <code class="ruby"> n = RedisAnalytics.redis_connection.zincrby(key, 1, metric_value)</code>
3413
+ </li>
3414
+
3415
+ <li class="never" data-hits="" data-linenumber="112">
3416
+
3417
+
3418
+ <code class="ruby"> end</code>
3419
+ </li>
3420
+
3421
+ <li class="never" data-hits="" data-linenumber="113">
3422
+
3423
+
3424
+ <code class="ruby"> end</code>
3425
+ </li>
3426
+
3427
+ <li class="never" data-hits="" data-linenumber="114">
3428
+
3429
+
3430
+ <code class="ruby"> # to debug, uncomment this line</code>
3431
+ </li>
3432
+
3433
+ <li class="never" data-hits="" data-linenumber="115">
3434
+
3435
+
3436
+ <code class="ruby"> # puts &quot;TRACK #{metric_name} -&gt; #{n}&quot; </code>
3437
+ </li>
3438
+
3439
+ <li class="covered" data-hits="35" data-linenumber="116">
3440
+ <span class="hits">35</span>
3441
+
3442
+ <code class="ruby"> return n</code>
3443
+ </li>
3444
+
3445
+ <li class="never" data-hits="" data-linenumber="117">
3446
+
3447
+
3448
+ <code class="ruby"> end</code>
3449
+ </li>
3450
+
3451
+ <li class="never" data-hits="" data-linenumber="118">
3452
+
3453
+
3454
+ <code class="ruby"></code>
3455
+ </li>
3456
+
3457
+ <li class="never" data-hits="" data-linenumber="119">
3458
+
3459
+
3460
+ <code class="ruby"> end</code>
3461
+ </li>
3462
+
3463
+ <li class="never" data-hits="" data-linenumber="120">
3464
+
3465
+
3466
+ <code class="ruby">end</code>
3467
+ </li>
3468
+
3469
+ <li class="never" data-hits="" data-linenumber="121">
3470
+
3471
+
3472
+ <code class="ruby"></code>
3473
+ </li>
3474
+
3475
+ </ol>
3476
+ </pre>
3477
+ </div>
3478
+
3479
+
3480
+ </div>
3481
+ </div>
3482
+ </body>
3483
+ </html>