prosperity 0.0.1 → 0.0.2

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 (223) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/javascripts/prosperity/application.js.coffee +5 -24
  3. data/app/assets/javascripts/prosperity/dashboards.js.coffee +17 -0
  4. data/app/assets/javascripts/prosperity/graph.js.coffee +89 -0
  5. data/app/assets/stylesheets/prosperity/application.css.scss +1 -1
  6. data/app/assets/stylesheets/prosperity/dashboards.css +4 -0
  7. data/app/assets/stylesheets/prosperity/graph.css +4 -0
  8. data/app/controllers/prosperity/application_controller.rb +30 -0
  9. data/app/controllers/prosperity/dashboard_graphs_controller.rb +24 -0
  10. data/app/controllers/prosperity/dashboards_controller.rb +33 -0
  11. data/app/controllers/prosperity/graphs_controller.rb +72 -0
  12. data/app/controllers/prosperity/metrics_controller.rb +57 -0
  13. data/app/helpers/prosperity/application_helper.rb +4 -0
  14. data/app/helpers/prosperity/dashboard_graphs_helper.rb +4 -0
  15. data/app/helpers/prosperity/dashboards_helper.rb +4 -0
  16. data/app/helpers/prosperity/graph_helper.rb +7 -0
  17. data/app/models/prosperity/dashboard.rb +8 -0
  18. data/app/models/prosperity/dashboard_graph.rb +6 -0
  19. data/app/models/prosperity/graph.rb +20 -0
  20. data/app/models/prosperity/graph_line.rb +8 -0
  21. data/app/views/layouts/prosperity/application.html.erb +56 -0
  22. data/app/views/prosperity/dashboards/edit.html.erb +24 -0
  23. data/app/views/prosperity/dashboards/index.html.erb +15 -0
  24. data/app/views/prosperity/dashboards/new.html.erb +8 -0
  25. data/app/views/prosperity/dashboards/show.html.erb +14 -0
  26. data/app/views/prosperity/graphs/edit.html.erb +41 -0
  27. data/app/views/prosperity/graphs/new.html.erb +15 -0
  28. data/app/views/prosperity/metrics/index.html.erb +8 -0
  29. data/app/views/prosperity/metrics/show.html.erb +23 -0
  30. data/app/views/prosperity/shared/_date_range.html.erb +9 -0
  31. data/config/routes.rb +12 -2
  32. data/db/migrate/20131127042251_dashboards.rb +34 -0
  33. data/lib/generators/metric/USAGE +8 -0
  34. data/lib/generators/metric/metric_generator.rb +7 -0
  35. data/lib/generators/metric/templates/metric.rb.erb +3 -0
  36. data/lib/prosperity/aggregate/aggregate_builder.rb +42 -0
  37. data/lib/prosperity/aggregate/average.rb +12 -0
  38. data/lib/prosperity/aggregate/base.rb +5 -0
  39. data/lib/prosperity/aggregate/count.rb +12 -0
  40. data/lib/prosperity/aggregate/maximum.rb +12 -0
  41. data/lib/prosperity/aggregate/minimum.rb +12 -0
  42. data/lib/prosperity/aggregate/sql.rb +12 -0
  43. data/lib/prosperity/aggregate/sum.rb +12 -0
  44. data/lib/prosperity/aggregate/with_column.rb +10 -0
  45. data/lib/prosperity/aggregate.rb +5 -0
  46. data/lib/prosperity/engine.rb +14 -0
  47. data/lib/prosperity/exception.rb +19 -1
  48. data/lib/prosperity/extractors/base.rb +33 -5
  49. data/lib/prosperity/extractors/change.rb +35 -0
  50. data/lib/prosperity/extractors/interval.rb +51 -0
  51. data/lib/prosperity/extractors/total.rb +23 -0
  52. data/lib/prosperity/helpers/time.rb +12 -0
  53. data/lib/prosperity/metric.rb +90 -5
  54. data/lib/prosperity/metric_finder.rb +10 -0
  55. data/lib/prosperity/metrics/option.rb +2 -0
  56. data/lib/prosperity/period.rb +4 -3
  57. data/lib/prosperity/periods.rb +13 -2
  58. data/lib/prosperity/version.rb +1 -1
  59. data/spec/controllers/prosperity/dashboard_graphs_controller_spec.rb +45 -0
  60. data/spec/controllers/prosperity/dashboards_controller_spec.rb +54 -0
  61. data/spec/controllers/prosperity/graphs_controller_spec.rb +145 -0
  62. data/spec/controllers/prosperity/metrics_controller_spec.rb +78 -0
  63. data/spec/dummy/app/models/user.rb +1 -0
  64. data/spec/dummy/app/prosperity/user_value_sum_metric.rb +4 -0
  65. data/spec/dummy/app/prosperity/user_value_sum_sql_metric.rb +4 -0
  66. data/spec/dummy/app/prosperity/users_metric.rb +8 -0
  67. data/spec/dummy/app/prosperity/users_sql_metric.rb +4 -0
  68. data/spec/dummy/config/database.yml +0 -8
  69. data/spec/dummy/config/routes.rb +1 -1
  70. data/spec/dummy/db/migrate/20140217005117_add_value_to_users.rb +5 -0
  71. data/spec/dummy/db/schema.rb +37 -1
  72. data/spec/dummy/db/seeds.rb +3 -1
  73. data/spec/dummy/log/development.log +76950 -0
  74. data/spec/dummy/log/test.log +111316 -0
  75. data/spec/dummy/tmp/cache/assets/development/sass/34a577735054231563e7022ea73e1468db9203ba/application.css.scssc +0 -0
  76. data/spec/dummy/tmp/cache/assets/development/sprockets/07e8fb2db7d85e29590a6b05160ca825 +0 -0
  77. data/spec/dummy/tmp/cache/assets/development/sprockets/1533bcf4a8f5a745dfda80cebd88d217 +0 -0
  78. data/spec/dummy/tmp/cache/assets/development/sprockets/1643e7f9f85637df140a850af6674f10 +0 -0
  79. data/spec/dummy/tmp/cache/assets/development/sprockets/197492ed379339e17a0f5d01d3b01b8c +0 -0
  80. data/spec/dummy/tmp/cache/assets/development/sprockets/1c55cf24465f311353197ce336df0178 +0 -0
  81. data/spec/dummy/tmp/cache/assets/development/sprockets/210050da208fb75a75b701bfa4e8470f +0 -0
  82. data/spec/dummy/tmp/cache/assets/development/sprockets/2733033a48e2e8a6fdd6e4ab371689ee +0 -0
  83. data/spec/dummy/tmp/cache/assets/development/sprockets/27a59e08207d3ae723f2b2b3d22264c3 +0 -0
  84. data/spec/dummy/tmp/cache/assets/development/sprockets/3e21790900d62ae3954585f08a1cb28a +0 -0
  85. data/spec/dummy/tmp/cache/assets/development/sprockets/3f76425644a701b85db3d385f077052d +0 -0
  86. data/spec/dummy/tmp/cache/assets/development/sprockets/448c1e44da04c20f27eaa31ad8c4391e +0 -0
  87. data/spec/dummy/tmp/cache/assets/development/sprockets/47df4fdca8a2ff6a43c18d7aa1ffd9c5 +0 -0
  88. data/spec/dummy/tmp/cache/assets/development/sprockets/566fbede2036fd06a20e7e52e30ddc7d +0 -0
  89. data/spec/dummy/tmp/cache/assets/development/sprockets/5f1aaf22720701db690538726e896a39 +0 -0
  90. data/spec/dummy/tmp/cache/assets/development/sprockets/647038c58f26163a9217646e1e5f09ae +0 -0
  91. data/spec/dummy/tmp/cache/assets/development/sprockets/6882b260ae69f1594eff540d803e5ac3 +0 -0
  92. data/spec/dummy/tmp/cache/assets/development/sprockets/69f4b83d363269ee4122bbbaaa1325d1 +0 -0
  93. data/spec/dummy/tmp/cache/assets/development/sprockets/6e1aee34907ba1ccdbfca2deb18a5adb +0 -0
  94. data/spec/dummy/tmp/cache/assets/development/sprockets/72c0d4a0eeedae5e79ae49abb24f6d32 +0 -0
  95. data/spec/dummy/tmp/cache/assets/development/sprockets/828a046f0e7dc2dad0eecfe49d31e14d +0 -0
  96. data/spec/dummy/tmp/cache/assets/development/sprockets/91ae0bd43f98b4f1f111e0bdc178302c +0 -0
  97. data/spec/dummy/tmp/cache/assets/development/sprockets/97d99b466bedb69706f4815fa26b69f3 +0 -0
  98. data/spec/dummy/tmp/cache/assets/development/sprockets/990cf740a7968767a327f6186313badb +0 -0
  99. data/spec/dummy/tmp/cache/assets/development/sprockets/a2b14d5c46db32da9183354fb3fcd0bf +0 -0
  100. data/spec/dummy/tmp/cache/assets/development/sprockets/a6d6196cfd275dea0718553a95f997a5 +0 -0
  101. data/spec/dummy/tmp/cache/assets/development/sprockets/bb1f5ffb0ccbeec2c6499044b356f7c6 +0 -0
  102. data/spec/dummy/tmp/cache/assets/development/sprockets/bc83340720a76d8208112f6aecbff08e +0 -0
  103. data/spec/dummy/tmp/cache/assets/development/sprockets/be67cef79122a71f7432c2f984f1f258 +0 -0
  104. data/spec/dummy/tmp/cache/assets/development/sprockets/c83e71ece967e80f8df838874c130431 +0 -0
  105. data/spec/dummy/tmp/cache/assets/development/sprockets/cad26971ff72bbf5aa5f4e6a469389eb +0 -0
  106. data/spec/dummy/tmp/cache/assets/development/sprockets/d0d5517256edcd1f83b11a13c6ca040f +0 -0
  107. data/spec/dummy/tmp/cache/assets/development/sprockets/d0f0c5e105bfb1d6e5cd7295fbd1f65d +0 -0
  108. data/spec/dummy/tmp/cache/assets/development/sprockets/d3087f7df919b7f0d8142ee163db6c79 +0 -0
  109. data/spec/dummy/tmp/cache/assets/development/sprockets/decc27a1fa9ea32fe0dcc18619e32587 +0 -0
  110. data/spec/dummy/tmp/cache/assets/development/sprockets/df796f7ea525be06a82ebc3a4f97ffec +0 -0
  111. data/spec/dummy/tmp/cache/assets/development/sprockets/e02b5049cf477b43a72b4a00e2fceb46 +0 -0
  112. data/spec/dummy/tmp/cache/assets/development/sprockets/e2a9bdd87a2d19256837fce6544a122c +0 -0
  113. data/spec/dummy/tmp/cache/assets/development/sprockets/e378dcebf3c529db0d6e57d0c8dc3904 +0 -0
  114. data/spec/dummy/tmp/cache/assets/development/sprockets/ee3031bd54230ddf2addb5fa5718c86b +0 -0
  115. data/spec/dummy/tmp/cache/assets/development/sprockets/f4648036e284d9aa3468f4f7b9bbb967 +0 -0
  116. data/spec/dummy/tmp/cache/assets/development/sprockets/f9bbf698d099ead559e5ba4a5a4c5538 +0 -0
  117. data/spec/dummy/tmp/cache/assets/development/sprockets/fb8d3825617fcc11dfa614a51effee0e +0 -0
  118. data/spec/dummy/tmp/cache/assets/test/sass/34a577735054231563e7022ea73e1468db9203ba/application.css.scssc +0 -0
  119. data/spec/dummy/tmp/cache/assets/test/sprockets/07e8fb2db7d85e29590a6b05160ca825 +0 -0
  120. data/spec/dummy/tmp/cache/assets/test/sprockets/0a40fa5e0d6c0de40a8a698dcd697305 +0 -0
  121. data/spec/dummy/tmp/cache/assets/test/sprockets/1533bcf4a8f5a745dfda80cebd88d217 +0 -0
  122. data/spec/dummy/tmp/cache/assets/test/sprockets/1643e7f9f85637df140a850af6674f10 +0 -0
  123. data/spec/dummy/tmp/cache/assets/test/sprockets/177ca1f3e92db4f8a8f6e7ad9786ebfc +0 -0
  124. data/spec/dummy/tmp/cache/assets/test/sprockets/197492ed379339e17a0f5d01d3b01b8c +0 -0
  125. data/spec/dummy/tmp/cache/assets/test/sprockets/1c55cf24465f311353197ce336df0178 +0 -0
  126. data/spec/dummy/tmp/cache/assets/test/sprockets/1cb94582c835e73b3fd3c276f9a7de56 +0 -0
  127. data/spec/dummy/tmp/cache/assets/test/sprockets/203047a4141cf08162077e7290421bbb +0 -0
  128. data/spec/dummy/tmp/cache/assets/test/sprockets/210050da208fb75a75b701bfa4e8470f +0 -0
  129. data/spec/dummy/tmp/cache/assets/test/sprockets/2733033a48e2e8a6fdd6e4ab371689ee +0 -0
  130. data/spec/dummy/tmp/cache/assets/test/sprockets/27a59e08207d3ae723f2b2b3d22264c3 +0 -0
  131. data/spec/dummy/tmp/cache/assets/test/sprockets/29a6c93aeb91d07a5533b3adba7697d0 +0 -0
  132. data/spec/dummy/tmp/cache/assets/test/sprockets/29ac2be474969468157245a7f8737fa4 +0 -0
  133. data/spec/dummy/tmp/cache/assets/test/sprockets/314e44d29ecc7449c9ca3b754329c245 +0 -0
  134. data/spec/dummy/tmp/cache/assets/test/sprockets/3162d1398d6940ee5e933b7ab4d2273d +0 -0
  135. data/spec/dummy/tmp/cache/assets/test/sprockets/3d80e2a5faaf2bd987d804c17aead745 +0 -0
  136. data/spec/dummy/tmp/cache/assets/test/sprockets/4155a156cc6ffb880b56dbc34346fbc0 +0 -0
  137. data/spec/dummy/tmp/cache/assets/test/sprockets/4166fe47cddf4ba18c53b843d69b4c5f +0 -0
  138. data/spec/dummy/tmp/cache/assets/test/sprockets/441f922b26aae90d40e319b6ed0a3bc8 +0 -0
  139. data/spec/dummy/tmp/cache/assets/test/sprockets/4432a4b71ce9551df8d4b3860f4b9be3 +0 -0
  140. data/spec/dummy/tmp/cache/assets/test/sprockets/448c1e44da04c20f27eaa31ad8c4391e +0 -0
  141. data/spec/dummy/tmp/cache/assets/test/sprockets/47df4fdca8a2ff6a43c18d7aa1ffd9c5 +0 -0
  142. data/spec/dummy/tmp/cache/assets/test/sprockets/5479c7b4fba9179d4d1dc59ae64964c1 +0 -0
  143. data/spec/dummy/tmp/cache/assets/test/sprockets/566fbede2036fd06a20e7e52e30ddc7d +0 -0
  144. data/spec/dummy/tmp/cache/assets/test/sprockets/5a3ab9afd151c265cf11c621c0ddbe00 +0 -0
  145. data/spec/dummy/tmp/cache/assets/test/sprockets/647038c58f26163a9217646e1e5f09ae +0 -0
  146. data/spec/dummy/tmp/cache/assets/test/sprockets/64e0150fafbd9aaa3822efa1abb0211d +0 -0
  147. data/spec/dummy/tmp/cache/assets/test/sprockets/65c2d908dbca1bc833ae0b552f6c27fa +0 -0
  148. data/spec/dummy/tmp/cache/assets/test/sprockets/6882b260ae69f1594eff540d803e5ac3 +0 -0
  149. data/spec/dummy/tmp/cache/assets/test/sprockets/69f4b83d363269ee4122bbbaaa1325d1 +0 -0
  150. data/spec/dummy/tmp/cache/assets/test/sprockets/6e1aee34907ba1ccdbfca2deb18a5adb +0 -0
  151. data/spec/dummy/tmp/cache/assets/test/sprockets/726d3f6850549a59954f0bf5584cfd9f +0 -0
  152. data/spec/dummy/tmp/cache/assets/test/sprockets/7ab9ac7cc2529219a4c68fd7854d5c0f +0 -0
  153. data/spec/dummy/tmp/cache/assets/test/sprockets/7bac3aca131c870ad5b07d8ccdc86e06 +0 -0
  154. data/spec/dummy/tmp/cache/assets/test/sprockets/80392355fc6e00cf69b2cd46978ebcbe +0 -0
  155. data/spec/dummy/tmp/cache/assets/test/sprockets/874b42463fefbb0bce47775722ebb4ae +0 -0
  156. data/spec/dummy/tmp/cache/assets/test/sprockets/87ef8ddd2847d19f22a16d726b88b433 +0 -0
  157. data/spec/dummy/tmp/cache/assets/test/sprockets/91ae0bd43f98b4f1f111e0bdc178302c +0 -0
  158. data/spec/dummy/tmp/cache/assets/test/sprockets/97d99b466bedb69706f4815fa26b69f3 +0 -0
  159. data/spec/dummy/tmp/cache/assets/test/sprockets/990cf740a7968767a327f6186313badb +0 -0
  160. data/spec/dummy/tmp/cache/assets/test/sprockets/9a690664139b0393787d6454b4697183 +0 -0
  161. data/spec/dummy/tmp/cache/assets/test/sprockets/a2b14d5c46db32da9183354fb3fcd0bf +0 -0
  162. data/spec/dummy/tmp/cache/assets/test/sprockets/a6d6196cfd275dea0718553a95f997a5 +0 -0
  163. data/spec/dummy/tmp/cache/assets/test/sprockets/bc83340720a76d8208112f6aecbff08e +0 -0
  164. data/spec/dummy/tmp/cache/assets/test/sprockets/c29c465933e7e86d6f6224f5e78c5baf +0 -0
  165. data/spec/dummy/tmp/cache/assets/test/sprockets/c975834a35907ecd2d314bbd6844ee88 +0 -0
  166. data/spec/dummy/tmp/cache/assets/test/sprockets/cad26971ff72bbf5aa5f4e6a469389eb +0 -0
  167. data/spec/dummy/tmp/cache/assets/test/sprockets/cf4affc50c6303e717d6514380d1f417 +0 -0
  168. data/spec/dummy/tmp/cache/assets/test/sprockets/d0d5517256edcd1f83b11a13c6ca040f +0 -0
  169. data/spec/dummy/tmp/cache/assets/test/sprockets/d3087f7df919b7f0d8142ee163db6c79 +0 -0
  170. data/spec/dummy/tmp/cache/assets/test/sprockets/d8b357d5741711da2dd710af0e15d268 +0 -0
  171. data/spec/dummy/tmp/cache/assets/test/sprockets/decc27a1fa9ea32fe0dcc18619e32587 +0 -0
  172. data/spec/dummy/tmp/cache/assets/test/sprockets/df796f7ea525be06a82ebc3a4f97ffec +0 -0
  173. data/spec/dummy/tmp/cache/assets/test/sprockets/e22a1b318499e7f06ea9274e18ab004f +0 -0
  174. data/spec/dummy/tmp/cache/assets/test/sprockets/e298cc3a8203ab1fb6978a90254f8926 +0 -0
  175. data/spec/dummy/tmp/cache/assets/test/sprockets/e378dcebf3c529db0d6e57d0c8dc3904 +0 -0
  176. data/spec/dummy/tmp/cache/assets/test/sprockets/e868f358fe87542c483951a2d9f532b6 +0 -0
  177. data/spec/dummy/tmp/cache/assets/test/sprockets/e8a6adf580ebd1942f4aabe6738678c2 +0 -0
  178. data/spec/dummy/tmp/cache/assets/test/sprockets/ed71f99e0a9653296abd5d6f501dd898 +0 -0
  179. data/spec/dummy/tmp/cache/assets/test/sprockets/efe6f2d16d3a1819817efb8734daf8af +0 -0
  180. data/spec/dummy/tmp/cache/assets/test/sprockets/f03e99bdb4159ae3485ca2858716e19b +0 -0
  181. data/spec/dummy/tmp/cache/assets/test/sprockets/f4648036e284d9aa3468f4f7b9bbb967 +0 -0
  182. data/spec/dummy/tmp/cache/assets/test/sprockets/f961f7434a28c0fe24bf4ffe6cba75fb +0 -0
  183. data/spec/dummy/tmp/cache/assets/test/sprockets/f9bbf698d099ead559e5ba4a5a4c5538 +0 -0
  184. data/spec/dummy/tmp/cache/assets/test/sprockets/fb8d3825617fcc11dfa614a51effee0e +0 -0
  185. data/spec/helpers/prosperity/dashboard_graphs_helper_spec.rb +6 -0
  186. data/spec/helpers/prosperity/dashboards_helper_spec.rb +6 -0
  187. data/spec/helpers/prosperity/{metrics_helper_spec.rb → graph_helper_spec.rb} +1 -1
  188. data/spec/lib/prosperity/aggregate/aggregate_builder_spec.rb +65 -0
  189. data/spec/lib/prosperity/aggregate/average_spec.rb +7 -0
  190. data/spec/lib/prosperity/aggregate/base_spec.rb +7 -0
  191. data/spec/lib/prosperity/aggregate/count_spec.rb +7 -0
  192. data/spec/lib/prosperity/aggregate/maximum_spec.rb +7 -0
  193. data/spec/lib/prosperity/aggregate/minimum_spec.rb +7 -0
  194. data/spec/lib/prosperity/aggregate/sql_spec.rb +7 -0
  195. data/spec/lib/prosperity/aggregate/sum_spec.rb +7 -0
  196. data/spec/lib/prosperity/aggregate/with_column_spec.rb +7 -0
  197. data/spec/lib/prosperity/aggregate_spec.rb +7 -0
  198. data/spec/lib/prosperity/extractors/base_spec.rb +27 -2
  199. data/spec/lib/prosperity/extractors/change_spec.rb +72 -0
  200. data/spec/lib/prosperity/extractors/interval_spec.rb +153 -0
  201. data/spec/lib/prosperity/extractors/total_spec.rb +79 -0
  202. data/spec/lib/prosperity/helpers/time_spec.rb +7 -0
  203. data/spec/lib/prosperity/metric_finder_spec.rb +7 -0
  204. data/spec/lib/prosperity/metric_spec.rb +126 -1
  205. data/spec/lib/prosperity/periods_spec.rb +14 -0
  206. data/spec/models/prosperity/dashboard_graph_spec.rb +6 -0
  207. data/spec/models/prosperity/dashboard_spec.rb +6 -0
  208. data/spec/models/prosperity/graph_line_spec.rb +6 -0
  209. data/spec/models/prosperity/graph_spec.rb +6 -0
  210. data/spec/spec_helper.rb +5 -2
  211. data/spec/support/shared/extractors.rb +64 -0
  212. data/spec/support/test_database.rb +1 -0
  213. data/vendor/assets/javascripts/highcharts.js +285 -0
  214. metadata +317 -62
  215. data/app/helpers/prosperity/metrics_helper.rb +0 -11
  216. data/app/views/layouts/prosperity/application.html.haml +0 -37
  217. data/app/views/prosperity/metrics/index.html.haml +0 -7
  218. data/db/migrate/20131026214127_test.rb +0 -4
  219. data/lib/prosperity/extractors/count.rb +0 -18
  220. data/lib/prosperity/extractors/group.rb +0 -23
  221. data/spec/lib/prosperity/extractors/count_spec.rb +0 -35
  222. data/spec/lib/prosperity/extractors/group_spec.rb +0 -34
  223. data/vendor/assets/javascripts/chart.js +0 -1426
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 9a60131d02562924806b4b7671c421c139309d69
4
- data.tar.gz: 12a50361dd49b9388935a4305a2f3b1a937bc332
3
+ metadata.gz: 05c4975bfb8d25cc3a99a70c519d741a20409030
4
+ data.tar.gz: 409c4ec232d033c74e29a07d067154a0fbc40054
5
5
  SHA512:
6
- metadata.gz: 2ce04e142220a10b870d9c767a762fd63e7043e559fdf841adeb76b42fa7e106184401d76e22ebec78c597a47cde82160d4965a3c4b978e5ea3de5743f7df289
7
- data.tar.gz: e72d9ba8a6bfb344ecaca189d251469b91ef9bd855669ad3cf7b31f6e6212a8e86e2f0ad97701d96e0c0c7276cae67a89fe36a4f20bdf438423e4c687ffd5913
6
+ metadata.gz: 05440b2f94e46093d8737b05649c18a0b62679cdf0464306d0693eabb48b1da7bdacaaf2a1419350c0c278032a6a2d3c95d3a45c4eb4007152a693270c20c55b
7
+ data.tar.gz: c2a87e6014004fbcb9b7982be91a60c7fa5f9e4709496de1e8b2c883e5a3911727da0dd2d6934f01e9ffadc9d970349b7e9607c6cb6403a4f4e55c1d3641526d
@@ -12,31 +12,12 @@
12
12
  #
13
13
  #= require jquery
14
14
  #= require jquery_ujs
15
- #= require chart
16
- #= require twitter/bootstrap
15
+ #= require highcharts
17
16
  #= require_tree .
18
17
 
19
18
  $ ->
20
- $("canvas.metric").each (i, el) ->
21
- ctx = el.getContext("2d")
22
- points = $(el).data('points')
23
-
24
- datasets = []
25
-
26
- size = 0
27
- for key, data of points
28
- datasets.push
29
- data: data
30
- fillColor : "rgba(151,187,205,0)",
31
- strokeColor : "rgba(0,0,0,1)",
32
-
33
-
34
- size = Math.max(size, data.length)
35
-
36
- data =
37
- labels : (i for i in [0..size])
38
- datasets: datasets
39
-
40
- myNewChart = new Chart(ctx).Line(data)
41
-
19
+ $(".metric").each (i, el) ->
20
+ $el = $(el)
21
+ url = $el.data('url')
22
+ graph = new Prosperity.Graph(el: el, url: url).render()
42
23
 
@@ -0,0 +1,17 @@
1
+ # Place all the behaviors and hooks related to the matching controller here.
2
+ # All this logic will automatically be available in application.js.
3
+
4
+ $(".link-graph").submit (e) ->
5
+ $form = $(e.target)
6
+ dashboard_id = $form.find("#dashboard_id").val()
7
+ graph_id = $form.find("#graph_id").val()
8
+ url_template = $form.find("#url_template").val()
9
+
10
+ url = url_template.replace("dashboard_id", dashboard_id)
11
+ url = url.replace("graph_id", graph_id)
12
+ #"/dashboards/#{dashboard_id}/graphs/#{graph_id}"
13
+ if $form.attr('action') != url
14
+ e.preventDefault()
15
+ $form.attr('action', url)
16
+ $form.submit()
17
+
@@ -0,0 +1,89 @@
1
+
2
+ class Graph
3
+ constructor: (option) ->
4
+ @url = option.url
5
+ @el = option.el
6
+ @$el = $(option.el)
7
+
8
+ render: ->
9
+ highchartsOptions =
10
+ chart:
11
+ type: 'line'
12
+ renderTo: @el
13
+ tooltip:
14
+ crosshairs: [true, true]
15
+ series: []
16
+ xAxis:
17
+ type: 'datetime'
18
+ dateTimeLabelFormats:
19
+ day: '%e of %b'
20
+ yAxis: [{}, {}, {}]
21
+ title:
22
+ text: "Loading..."
23
+
24
+ chart = new Highcharts.Chart(highchartsOptions)
25
+
26
+ getSeries = (url, axisIndex) =>
27
+ $.get url, (json) =>
28
+ axisIndex = Math.min(axisIndex, chart.yAxis.length - 1)
29
+ serie =
30
+ data: json.data
31
+ name: json.label
32
+ yAxis: axisIndex
33
+ pointStart: Date.parse(json.start_time)
34
+ pointInterval: json.period_milliseconds
35
+
36
+ axisSettings =
37
+ title: {text: json.key}
38
+ min: Math.min.apply(Math, json.data)
39
+ max: Math.max.apply(Math, json.data)
40
+
41
+
42
+ if json.key == 'change'
43
+ axisSettings = $.extend axisSettings, {
44
+ min: 0,
45
+ max: Math.max.apply(Math, json.data),
46
+ labels: {formatter: -> this.value + '%' },
47
+ opposite: true
48
+ }
49
+
50
+ serie = $.extend serie, {
51
+ tooltip: {valueDecimals: 2, valueSuffix: '%'}
52
+ }
53
+
54
+ chart.yAxis[axisIndex].update(axisSettings)
55
+ chart.addSeries(serie)
56
+
57
+ $.getJSON @url, (json) ->
58
+ chart.setTitle {text: json.title}
59
+
60
+ for extractor, index in json.extractors
61
+ getSeries(extractor.url, index)
62
+
63
+ @
64
+
65
+ @Prosperity ||= {}
66
+ @Prosperity.Graph = Graph
67
+
68
+ updateMetricOptions = (el) ->
69
+ $el = $(el)
70
+ return if $el.length == 0
71
+ $form = $el.parents('form')
72
+ options = $form.data('metric-options')
73
+ possibleOptions = options[$el.val()] || []
74
+
75
+ $optionSelect = $el.parents(".graph-line").find(".metric-option-select select")
76
+ selectedOption = $form.find("input[type=\"hidden\"][name=\"#{$optionSelect.attr('name')}\"]").val()
77
+
78
+ $optionSelect.html('')
79
+ for option in possibleOptions
80
+ $optionSelect.append $('<option>', value: option, text: option, selected: selectedOption == option)
81
+
82
+ $(document).on "change", ".edit_graph .metric-title-select select", (e) ->
83
+ updateMetricOptions e.target
84
+
85
+ $ ->
86
+ $(".edit_graph .metric-title-select select").each (i, el) ->
87
+ updateMetricOptions el
88
+
89
+
@@ -16,4 +16,4 @@
16
16
 
17
17
  .main {
18
18
  padding: 40px 15px;
19
- }
19
+ }
@@ -0,0 +1,4 @@
1
+ /*
2
+ Place all the styles related to the matching controller here.
3
+ They will automatically be included in application.css.
4
+ */
@@ -0,0 +1,4 @@
1
+ /*
2
+ Place all the styles related to the matching controller here.
3
+ They will automatically be included in application.css.
4
+ */
@@ -1,4 +1,34 @@
1
1
  module Prosperity
2
2
  class ApplicationController < ActionController::Base
3
+ protected
4
+ def set_error(model)
5
+ flash[:error] = model.errors.full_messages.to_sentence
6
+ end
7
+
8
+ def render_json_error(msg, code)
9
+ render json: {error: msg}, status: code
10
+ end
11
+
12
+ def strong_params?
13
+ defined?(ActionController::StrongParameters)
14
+ end
15
+
16
+ def now
17
+ @now ||= Time.now
18
+ end
19
+
20
+ def period
21
+ params.fetch(:period, 'week')
22
+ end
23
+
24
+ def end_time
25
+ params[:end_time].present? ? Time.parse(params[:end_time].to_s) : now
26
+ end
27
+
28
+ def start_time
29
+ params[:start_time].present? ? Time.parse(params[:start_time].to_s) : end_time - 3.months
30
+ end
31
+
32
+ helper_method :end_time, :start_time, :period
3
33
  end
4
34
  end
@@ -0,0 +1,24 @@
1
+ require_dependency "prosperity/application_controller"
2
+
3
+ module Prosperity
4
+ class DashboardGraphsController < ApplicationController
5
+ before_action :get_objs
6
+ def create
7
+ DashboardGraph.create!(graph: @graph, dashboard: @dashboard)
8
+ redirect_to edit_dashboard_path(@dashboard)
9
+ end
10
+
11
+ def destroy
12
+ dashboard_graph = DashboardGraph.where(graph_id: @graph.id, dashboard_id: @dashboard.id).first
13
+ raise ActiveRecord::RecordNotFound unless dashboard_graph
14
+ dashboard_graph.destroy
15
+ redirect_to edit_dashboard_path(@dashboard)
16
+ end
17
+
18
+ private
19
+ def get_objs
20
+ @graph = Graph.find(params[:graph_id])
21
+ @dashboard = Dashboard.find(params[:dashboard_id])
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,33 @@
1
+ require_dependency "prosperity/application_controller"
2
+
3
+ module Prosperity
4
+ class DashboardsController < ApplicationController
5
+ def index
6
+ @dashboards = Dashboard.all
7
+ end
8
+
9
+ def new
10
+ @dashboard = Dashboard.new
11
+ end
12
+
13
+ def show
14
+ @dashboard = Dashboard.find(params[:id])
15
+ end
16
+
17
+ def edit
18
+ @dashboard = Dashboard.find(params[:id])
19
+ end
20
+
21
+ def create
22
+ @dashboard = Dashboard.new
23
+ @dashboard.title = params.fetch(:dashboard, {})[:title]
24
+ @dashboard.default = false
25
+ if @dashboard.save
26
+ redirect_to action: :index
27
+ else
28
+ flash[:error] = @dashboard.errors.full_messages.to_sentence
29
+ render action: :new
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,72 @@
1
+ require_dependency "prosperity/application_controller"
2
+
3
+ module Prosperity
4
+ class GraphsController < ApplicationController
5
+ before_action :get_graph, only: [:edit, :update, :show]
6
+ def new
7
+ @graph = Graph.new
8
+ end
9
+
10
+ def edit
11
+ @metrics = MetricFinder.all.map(&:new)
12
+ @options = @metrics.inject({}) do |h, metric|
13
+ h[metric.id] = metric.options.keys
14
+ h
15
+ end
16
+ @graph.graph_lines.build
17
+ end
18
+
19
+ def show
20
+ render json: {
21
+ title: @graph.title,
22
+ extractors: @graph.graph_lines.map do |line|
23
+ {
24
+ key: line.extractor,
25
+ url: data_metric_path(id: line.metric,
26
+ extractor: line.extractor,
27
+ option: line.option,
28
+ period: @graph.period,
29
+ start_time: start_time,
30
+ end_time: end_time),
31
+ }
32
+ end
33
+ }
34
+ end
35
+
36
+ def update
37
+ unless @graph.update_attributes(graph_params)
38
+ set_error(@graph)
39
+ end
40
+ redirect_to action: :edit
41
+ end
42
+
43
+ def create
44
+ @graph = Graph.new
45
+ [:title, :period].each do |attr|
46
+ @graph.send("#{attr}=", graph_params[attr])
47
+ end
48
+
49
+ if @graph.save
50
+ redirect_to edit_graph_path(@graph)
51
+ else
52
+ set_error(@graph)
53
+ render action: :new
54
+ end
55
+ end
56
+
57
+ private
58
+
59
+ def get_graph
60
+ @graph = Graph.find(params[:id])
61
+ end
62
+
63
+ def graph_params
64
+ if strong_params?
65
+ params.require(:graph).
66
+ permit(Graph::ATTR_ACCESSIBLE + [:graph_lines_attributes => (GraphLine::ATTR_ACCESSIBLE + [:id])])
67
+ else
68
+ params.fetch(:graph, {})
69
+ end
70
+ end
71
+ end
72
+ end
@@ -2,8 +2,65 @@ require_dependency "prosperity/application_controller"
2
2
 
3
3
  module Prosperity
4
4
  class MetricsController < ApplicationController
5
+ before_filter :get_metric, only: [:show, :data]
6
+
5
7
  def index
6
8
  @metrics = MetricFinder.all
7
9
  end
10
+
11
+ def show
12
+ respond_to do |format|
13
+ format.html
14
+ format.json do
15
+ render json: {
16
+ id: @metric.id,
17
+ title: @metric.title,
18
+ options: @metric.options.map do |k, option|
19
+ {key: k}
20
+ end,
21
+ extractors: @metric.extractors.map do |ext|
22
+ {
23
+ key: ext.key,
24
+ url: data_metric_path(id: @metric.id,
25
+ extractor: ext.key,
26
+ option: option,
27
+ period: period,
28
+ start_time: start_time,
29
+ end_time: end_time),
30
+
31
+ }
32
+ end
33
+ }
34
+ end
35
+ end
36
+ end
37
+
38
+ def data
39
+ ext_klass = Metric.extractors[params.fetch(:extractor, "interval")]
40
+
41
+ p = Prosperity::Periods::ALL.fetch(period)
42
+ ext = ext_klass.new(@metric, option, start_time, end_time, p)
43
+
44
+ json = {
45
+ data: ext.to_a,
46
+ key: ext.key,
47
+ label: ext.label,
48
+ start_time: start_time.iso8601,
49
+ period_milliseconds: p.duration * 1000
50
+ }
51
+ render json: json
52
+ end
53
+ private
54
+
55
+ def get_metric
56
+ @metric = MetricFinder.find_by_name(params.fetch(:id)).new
57
+ rescue NameError
58
+ render_json_error("Could not find metric #{params.fetch(:id)}", 404)
59
+ end
60
+
61
+ def option
62
+ params.fetch(:option, 'default')
63
+ end
64
+ helper_method :option
8
65
  end
9
66
  end
@@ -3,5 +3,9 @@ module Prosperity
3
3
  def app_name
4
4
  "Prosperity"
5
5
  end
6
+
7
+ def link_to_metric(metric)
8
+ link_to metric.new.title, metric_path(id: metric.name)
9
+ end
6
10
  end
7
11
  end
@@ -0,0 +1,4 @@
1
+ module Prosperity
2
+ module DashboardGraphsHelper
3
+ end
4
+ end
@@ -0,0 +1,4 @@
1
+ module Prosperity
2
+ module DashboardsHelper
3
+ end
4
+ end
@@ -0,0 +1,7 @@
1
+ module Prosperity
2
+ module GraphHelper
3
+ def options_for_extractors
4
+ Prosperity::Metric.extractors.keys.map(&:to_s).sort
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,8 @@
1
+ module Prosperity
2
+ class Dashboard < ActiveRecord::Base
3
+ has_many :dashboard_graphs
4
+ has_many :graphs, through: :dashboard_graphs
5
+
6
+ validates_presence_of :title
7
+ end
8
+ end
@@ -0,0 +1,6 @@
1
+ module Prosperity
2
+ class DashboardGraph < ActiveRecord::Base
3
+ belongs_to :dashboard
4
+ belongs_to :graph
5
+ end
6
+ end
@@ -0,0 +1,20 @@
1
+ module Prosperity
2
+ class Graph < ActiveRecord::Base
3
+ has_many :graph_lines, class_name: 'Prosperity::GraphLine'
4
+ validates_presence_of :title, :period
5
+ accepts_nested_attributes_for :graph_lines, reject_if: :not_filled?
6
+
7
+ ATTR_ACCESSIBLE = [:title, :period, :graph_lines].freeze
8
+
9
+ attr_accessible *ATTR_ACCESSIBLE unless defined?(ActionController::StrongParameters)
10
+
11
+ private
12
+ def not_filled?(line)
13
+ if line[:id]
14
+ false
15
+ else
16
+ line[:option].blank? || line[:metric].blank?
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,8 @@
1
+ module Prosperity
2
+ class GraphLine < ActiveRecord::Base
3
+ belongs_to :graph
4
+ ATTR_ACCESSIBLE = [:option, :metric, :extractor].freeze
5
+
6
+ validates_presence_of :option, :metric, :extractor
7
+ end
8
+ end
@@ -0,0 +1,56 @@
1
+ <!DOCTYPE html>
2
+ <html>(lang="en")
3
+ <head>
4
+ <title>
5
+ <%= content_for?(:title) ? yield(:title) : app_name %>
6
+ </title>
7
+ <%= csrf_meta_tags %>
8
+ <!-- Le HTML5 shim, for IE6-8 support of HTML elements
9
+ -->
10
+ <!--[if lt IE 9]
11
+ <%= javascript_include_tag "//cdnjs.cloudflare.com/ajax/libs/html5shiv/3.6.1/html5shiv.js" %>
12
+ -->
13
+ <%= stylesheet_link_tag "prosperity/application", :media => "all" %>
14
+ </head>
15
+ <body>
16
+ <div class="navbar navbar-inverse navbar-fixed-top">
17
+ <div class="container">
18
+ <div class="navbar-header">
19
+ <button class="navbar-toggle" data-target=".navbar-collapse" data-toggle="collapse" type="button">
20
+ <span class="icon-bar"></span>
21
+ <span class="icon-bar"></span>
22
+ <span class="icon-bar"></span>
23
+ </button>
24
+ <a class="navbar-brand" href="<%= root_path %>">
25
+ <%= app_name %>
26
+ </a>
27
+ </div>
28
+ <div class="collapse navbar-collapse">
29
+ <ul class="nav navbar-nav">
30
+ <li class="active">
31
+ <a href="<%= dashboards_path %>">Dashboards</a>
32
+ </li>
33
+ <li>
34
+ <a href="<%= metrics_path %>">All Metrics</a>
35
+ </li>
36
+ </ul>
37
+ </div>
38
+ </div>
39
+ </div>
40
+ <div class="container">
41
+ <div class="main">
42
+ <% flash.each do |name, msg| %>
43
+ <% if msg.is_a?(String) %>
44
+ <div class="alert alert-<%= name == :notice ? "success" : "error" %>">
45
+ <a class="close" data-dismiss="alert">&#215;</a>
46
+ <%= content_tag :div, msg, :id => "flash_#{name}" %>
47
+ </div>
48
+ <% end %>
49
+ <% end %>
50
+
51
+ <%= yield %>
52
+ </div>
53
+ </div>
54
+ <%= javascript_include_tag "prosperity/application" %>
55
+ </body>
56
+ </html>
@@ -0,0 +1,24 @@
1
+ <h1>Edit Dashboard</h1>
2
+
3
+ <% if Prosperity::Graph.exists? %>
4
+ <ul>
5
+ <% @dashboard.graphs.each do |graph| %>
6
+ <li>
7
+ <%= link_to graph.title, edit_graph_path(graph) %>
8
+ -
9
+ <%= link_to 'Delete', dashboard_dashboard_graphs_path(dashboard_id: @dashboard.id, graph_id: graph.id), method: :delete %>
10
+ </li>
11
+ <% end %>
12
+ </ul>
13
+
14
+ <%= form_tag({}, class: "link-graph", method: "POST") do %>
15
+ <%= hidden_field_tag :dashboard_id, @dashboard.id %>
16
+ <%= hidden_field_tag :url_template, dashboard_dashboard_graphs_path(dashboard_id: 'dashboard_id', graph_id: 'graph_id') %>
17
+ <%= select_tag :graph_id, options_from_collection_for_select(Prosperity::Graph.all, :id, :title) %>
18
+ <%= submit_tag "Add To Dashboard", class: 'btn btn-success' %>
19
+ <% end %>
20
+
21
+ OR
22
+ <% end %>
23
+
24
+ <%= link_to "Add New Graph", new_graph_path, class: 'btn btn-primary' %>
@@ -0,0 +1,15 @@
1
+ <h1>Dashboards</h1>
2
+
3
+ <p>
4
+ <ul>
5
+ <% for dashboard in @dashboards %>
6
+ <li>
7
+ <%= link_to dashboard.title, dashboard_path(dashboard) %>
8
+ -
9
+ <%= link_to 'edit', edit_dashboard_path(dashboard) %>
10
+ </li>
11
+ <% end %>
12
+ </ul>
13
+ </p>
14
+
15
+ <a href="<%= new_dashboard_path %>" class="btn btn-primary">New Dashboard</a>
@@ -0,0 +1,8 @@
1
+ <h1>New Dashboards</h1>
2
+
3
+ <%= form_for @dashboard do |f| %>
4
+ <%= f.label :title %>
5
+ <%= f.text_field :title %>
6
+
7
+ <%= f.submit nil, class: "btn btn-success" %>
8
+ <% end%>
@@ -0,0 +1,14 @@
1
+ <h1><%= @dashboard.title %></h1>
2
+
3
+ <%= form_tag(dashboard_path(params[:id]), method: 'get') do %>
4
+ <%= render 'prosperity/shared/date_range' %>
5
+ <%= submit_tag "Update", class: 'btn btn-primary' %>
6
+ <% end %>
7
+
8
+ <% @dashboard.graphs.each do |graph| %>
9
+ <div class="graph">
10
+ <h2><%= graph.title %></h2>
11
+
12
+ <div class="metric" data-url="<%= graph_path(graph, start_time: start_time) %>"></div>
13
+ </div>
14
+ <% end %>
@@ -0,0 +1,41 @@
1
+ <h1>Edit Graph</h1>
2
+
3
+ <p>Title: <%= @graph.title%></p>
4
+
5
+ <div class="row">
6
+ <div class="span6">
7
+ <%= form_for @graph, data: {metric_options: @options} do |f| %>
8
+ <h4>Lines</h4>
9
+ <%= f.fields_for :graph_lines do |l| %>
10
+ <% if l.object.new_record? %>
11
+ <h4>Add New Line</h4>
12
+ <% end %>
13
+
14
+ <div class="graph-line">
15
+ <div class="form-group metric-title-select">
16
+ <%= l.label :metric %>
17
+ <%= l.select :metric, @metrics.map{|m| [m.title, m.id]}, include_blank: true %>
18
+ </div>
19
+
20
+ <div class="form-group metric-option-select">
21
+ <%= l.hidden_field :option %>
22
+ <%= l.label :option %>
23
+ <%= l.select :option, [] %>
24
+ </div>
25
+
26
+ <div class="form-group">
27
+ <%= l.label :extractor %>
28
+ <%= l.select :extractor, options_for_extractors %>
29
+ </div>
30
+ </div>
31
+ <% end %>
32
+ <%= f.submit "Save & View", class: "btn btn-success" %>
33
+ <% end %>
34
+ </div>
35
+
36
+ <div class="span8">
37
+ <div class="graph well"/>
38
+ <div class="metric" data-url="<%= graph_path(@graph) %>"></div>
39
+ </div>
40
+ </div>
41
+
@@ -0,0 +1,15 @@
1
+ <h1>New Graph</h1>
2
+
3
+ <%= form_for @graph, html: {role: 'form'} do |f| %>
4
+ <div class="form-group">
5
+ <%= f.label :title %>
6
+ <%= f.text_field :title %>
7
+ </div>
8
+
9
+ <div class="form-group">
10
+ <%= f.label :period %>
11
+ <%= f.select :period, Prosperity::Periods::ALL.keys %>
12
+ </div>
13
+
14
+ <%= f.submit "Save", class: 'btn btn-success' %>
15
+ <% end %>