redis_analytics 0.6.0 → 0.7.1

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