redis_analytics 0.6.0 → 0.7.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (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>