aeternitas_web_ui 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (222) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.md +38 -0
  4. data/Rakefile +33 -0
  5. data/app/assets/config/aeternitas_web_ui_manifest.js +2 -0
  6. data/app/assets/images/aeternitas/web_ui/DataTables-1.10.15/images/sort_asc.png +0 -0
  7. data/app/assets/images/aeternitas/web_ui/DataTables-1.10.15/images/sort_asc_disabled.png +0 -0
  8. data/app/assets/images/aeternitas/web_ui/DataTables-1.10.15/images/sort_both.png +0 -0
  9. data/app/assets/images/aeternitas/web_ui/DataTables-1.10.15/images/sort_desc.png +0 -0
  10. data/app/assets/images/aeternitas/web_ui/DataTables-1.10.15/images/sort_desc_disabled.png +0 -0
  11. data/app/assets/images/aeternitas/web_ui/logo_large.png +0 -0
  12. data/app/assets/images/aeternitas/web_ui/logo_small.png +0 -0
  13. data/app/assets/javascripts/aeternitas/web_ui/Chart.min.js +14 -0
  14. data/app/assets/javascripts/aeternitas/web_ui/aeternitas_web_ui.js +135 -0
  15. data/app/assets/javascripts/aeternitas/web_ui/datatables.min.js +248 -0
  16. data/app/assets/javascripts/aeternitas/web_ui/jquery-3.2.1.min.js +4 -0
  17. data/app/assets/javascripts/aeternitas/web_ui/moment.min.js +7 -0
  18. data/app/assets/stylesheets/aeternitas/web_ui/aeternitas_web_ui.css.scss +181 -0
  19. data/app/assets/stylesheets/aeternitas/web_ui/datatables.min.css +21 -0
  20. data/app/assets/stylesheets/aeternitas/web_ui/normalize.css +427 -0
  21. data/app/assets/stylesheets/aeternitas/web_ui/spectre-icons.min.css +1 -0
  22. data/app/assets/stylesheets/aeternitas/web_ui/spectre.min.css +1 -0
  23. data/app/controllers/aeternitas/web_ui/application_controller.rb +13 -0
  24. data/app/controllers/aeternitas/web_ui/dashboard_controller.rb +35 -0
  25. data/app/controllers/aeternitas/web_ui/pollables_controller.rb +54 -0
  26. data/app/helpers/aeternitas/web_ui/application_helper.rb +28 -0
  27. data/app/views/aeternitas/web_ui/dashboard/error.html.erb +9 -0
  28. data/app/views/aeternitas/web_ui/dashboard/index.html.erb +128 -0
  29. data/app/views/aeternitas/web_ui/pollables/index.html.erb +31 -0
  30. data/app/views/aeternitas/web_ui/pollables/show.html.erb +159 -0
  31. data/app/views/layouts/aeternitas/web_ui/application.html.erb +46 -0
  32. data/app/views/partials/_timepicker.html.erb +39 -0
  33. data/config/routes.rb +15 -0
  34. data/lib/aeternitas/web_ui.rb +12 -0
  35. data/lib/aeternitas/web_ui/color_generator.rb +32 -0
  36. data/lib/aeternitas/web_ui/dashboard_statistics.rb +96 -0
  37. data/lib/aeternitas/web_ui/engine.rb +15 -0
  38. data/lib/aeternitas/web_ui/pollable_statistics.rb +148 -0
  39. data/lib/aeternitas/web_ui/pollables_index_statistics.rb +36 -0
  40. data/lib/aeternitas/web_ui/version.rb +5 -0
  41. data/lib/aeternitas_web_ui.rb +1 -0
  42. data/spec/aeternitas/web_ui/dashboard_statistics_spec.rb +5 -0
  43. data/spec/dummy/Rakefile +6 -0
  44. data/spec/dummy/app/assets/config/manifest.js +5 -0
  45. data/spec/dummy/app/assets/javascripts/application.js +13 -0
  46. data/spec/dummy/app/assets/javascripts/cable.js +13 -0
  47. data/spec/dummy/app/assets/stylesheets/application.css +15 -0
  48. data/spec/dummy/app/channels/application_cable/channel.rb +4 -0
  49. data/spec/dummy/app/channels/application_cable/connection.rb +4 -0
  50. data/spec/dummy/app/controllers/application_controller.rb +3 -0
  51. data/spec/dummy/app/helpers/application_helper.rb +2 -0
  52. data/spec/dummy/app/jobs/application_job.rb +2 -0
  53. data/spec/dummy/app/mailers/application_mailer.rb +4 -0
  54. data/spec/dummy/app/models/application_record.rb +3 -0
  55. data/spec/dummy/app/models/website.rb +7 -0
  56. data/spec/dummy/app/views/layouts/application.html.erb +14 -0
  57. data/spec/dummy/app/views/layouts/mailer.html.erb +13 -0
  58. data/spec/dummy/app/views/layouts/mailer.text.erb +1 -0
  59. data/spec/dummy/bin/bundle +3 -0
  60. data/spec/dummy/bin/rails +4 -0
  61. data/spec/dummy/bin/rake +4 -0
  62. data/spec/dummy/bin/setup +38 -0
  63. data/spec/dummy/bin/update +29 -0
  64. data/spec/dummy/bin/yarn +11 -0
  65. data/spec/dummy/config.ru +5 -0
  66. data/spec/dummy/config/application.rb +18 -0
  67. data/spec/dummy/config/boot.rb +5 -0
  68. data/spec/dummy/config/cable.yml +10 -0
  69. data/spec/dummy/config/database.yml +25 -0
  70. data/spec/dummy/config/environment.rb +5 -0
  71. data/spec/dummy/config/environments/development.rb +54 -0
  72. data/spec/dummy/config/environments/production.rb +91 -0
  73. data/spec/dummy/config/environments/test.rb +42 -0
  74. data/spec/dummy/config/initializers/aeternitas.rb +10 -0
  75. data/spec/dummy/config/initializers/application_controller_renderer.rb +6 -0
  76. data/spec/dummy/config/initializers/assets.rb +14 -0
  77. data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  78. data/spec/dummy/config/initializers/cookies_serializer.rb +5 -0
  79. data/spec/dummy/config/initializers/filter_parameter_logging.rb +4 -0
  80. data/spec/dummy/config/initializers/inflections.rb +16 -0
  81. data/spec/dummy/config/initializers/mime_types.rb +4 -0
  82. data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
  83. data/spec/dummy/config/locales/en.yml +33 -0
  84. data/spec/dummy/config/puma.rb +56 -0
  85. data/spec/dummy/config/routes.rb +3 -0
  86. data/spec/dummy/config/secrets.yml +32 -0
  87. data/spec/dummy/config/spring.rb +6 -0
  88. data/spec/dummy/db/development.sqlite3 +0 -0
  89. data/spec/dummy/db/migrate/20170615142109_add_aeternitas.rb +25 -0
  90. data/spec/dummy/db/migrate/20170615150918_create_websites.rb +9 -0
  91. data/spec/dummy/db/schema.rb +43 -0
  92. data/spec/dummy/db/test.sqlite3 +0 -0
  93. data/spec/dummy/log/development.log +3875 -0
  94. data/spec/dummy/log/test.log +1134 -0
  95. data/spec/dummy/package.json +5 -0
  96. data/spec/dummy/public/404.html +67 -0
  97. data/spec/dummy/public/422.html +67 -0
  98. data/spec/dummy/public/500.html +66 -0
  99. data/spec/dummy/public/apple-touch-icon-precomposed.png +0 -0
  100. data/spec/dummy/public/apple-touch-icon.png +0 -0
  101. data/spec/dummy/public/favicon.ico +0 -0
  102. data/spec/dummy/spec/factories/websites.rb +5 -0
  103. data/spec/dummy/spec/models/website_spec.rb +5 -0
  104. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/-k/-kLXhrSxIY5sbCDe0QBCbBd8WJSNrVJbZ7zFuA6aV4U.cache +0 -0
  105. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/-o/-obCtmhn01hgLEZXS6Mw25q3KANNcbMicP6RfnJqs-c.cache +0 -0
  106. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/12/12IM8C9fRRfEUMsNUOXTHDTcru6i-Cn9j9i70DXn-y0.cache +1 -0
  107. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/1k/1kk-XGxW3hIN5oXoLScKXylNwqB0H99cxBkCcAGGrp8.cache +3 -0
  108. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/44/44qYkKHvn72T102PBqbRG2moTko92VIJpzYabJfeS6U.cache +1 -0
  109. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/4A/4Abfy3Y5RDhRNeRqhLr4Mk8q91QThKHAcGVU0tGkFoY.cache +3 -0
  110. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/6V/6VIyPljLtQuKrTykLjAx_XoDBfIcX_HOE2yBu9uOSdU.cache +1 -0
  111. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/7F/7F9hVvEvdbYDKockjGlOS5MNzdaOmQUMR1k6zB2mmdw.cache +2 -0
  112. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/7t/7t3cb8FP9pKH0x6u5zztQaomVd_Ea2byod1xi3z0ND8.cache +1 -0
  113. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/9j/9ji3yCrDj1gcUeowiWgvRyr0dM3XZVAwUqOemFCBnPM.cache +1 -0
  114. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/9m/9m0b-POOO30jzasjiR7FAaKfuBrmA25ZBDMVfJiMSnI.cache +3 -0
  115. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/9p/9p_Eg3Rz6Tg7FnFaZ1p-oDm974o0hMPi0dMvHZgwyWk.cache +1 -0
  116. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/AW/AWlTynWy_guoR1g4VZ57C4AWiWsEK7uayom46TLjhcA.cache +1 -0
  117. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Ac/Ac0qkqaGdxPQD_G88eJzIN5NtBFVhj6HZlXu2kNzeLo.cache +2 -0
  118. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Ba/BaJebplv72wr47Itakhw4S4YXBkHcWjd7ga6K4horSA.cache +2 -0
  119. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Bx/BxEh0bLBiwmzYwWgq0oAcd4yHeJsO_9u-uKv5SZrFTI.cache +0 -0
  120. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/C7/C7HMichzQB_h5pGIx2VspERTa2o5A_X7fLs5FgjxHC8.cache +3 -0
  121. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/D6/D6gFB9w6_7cFtMEZ4KaYH0fsxUa0Tp7IAsv9UYdgImA.cache +1 -0
  122. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/DA/DAtiPOWz7Ioln7UsNTQpNvbSucdOkR5AZLJAunoL_80.cache +0 -0
  123. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/DE/DEHQF18h-J2qGdoGaqqi0_FAcgete1n9NKC4OPvXmB8.cache +1 -0
  124. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Dy/DyrUJnjxQEOstDmLQuJzLbs8GhMAPkyUJU4L9x_b1gM.cache +1 -0
  125. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/EI/EIURBB_96RWNA74XjxVtVxLU0ERRasHa2Pg16VWng6w.cache +0 -0
  126. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/EM/EMc2SkLN3MQqodjFDJpj2D8YXedVeTpK2uLlSmqVbss.cache +0 -0
  127. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Ey/Ey6Nnx6_lcXWynu4KI-tMB-ZOT2fliARz_CtWN-XhGE.cache +1 -0
  128. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Ez/EzuIevPsEIUN4VQW4wV3QYbZd04MTyKRoIHgjOpVSAA.cache +1 -0
  129. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Fg/FgCsX1kws9NdVveaMR1jeww7ipJ_lIOdeCEaVHPVbDc.cache +0 -0
  130. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Fr/Fr-uXijwIrM12om45Lmorl7eDbwi0nPVdZujOGc1LFc.cache +1 -0
  131. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/GQ/GQB9ipr-t7FLwl70MULPxFF4Xp6wRFt2lzXXaIWgys0.cache +1 -0
  132. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/HC/HCDOUd7-S45aJ_PjVAC_Vmjyud3i1aQv4cE3t9_Z3Dw.cache +2 -0
  133. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/HF/HFaRtgCpi84vLJppHFyBIzaQ5p97APFOGvTJCw7dUhc.cache +1 -0
  134. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/HV/HVZoJobEN5J9PqE1WbEkEt0FemX522vUrFtTHBc3EEI.cache +2 -0
  135. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Hc/HcvaIQ95E3lmzXC6OMHd0Of4ydqPVSjPa4wYkqZQao8.cache +3 -0
  136. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Hq/HqtzpmawkDHbZ2yivmWYT8_0VnM3oyZejJLXkmuP1UU.cache +4 -0
  137. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Ia/Iaw1i5cgoawU32A2pr3v2kDe6Gc0poNyqDsHW0trtvw.cache +2 -0
  138. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/JO/JOlHI2qJ5RtGMZTywiAJXWotQ7DYqkPQr1rdAdRB104.cache +1 -0
  139. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/J_/J_9SEIiFKLoQi7TOv5_4Fw5h6-JxqgigRgR-PjsLaEU.cache +3 -0
  140. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/KB/KBHvjzjkAKo6iwHDC5yVw3biGOheuuN7whkwZNFw3-M.cache +0 -0
  141. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Kq/Kq_ZJuG7iw-ig4qchZfLnxUdf07QHYz8H01Yp_pHF5o.cache +2 -0
  142. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Kq/Kqe1JPkLvSaZDqECSzYbVQrphMS6gT7QkYBMdwDNkq4.cache +0 -0
  143. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/L0/L0uas8TUBH9BXOmg8zWTeUBgwu5vFy-bGc0k03zsPq0.cache +0 -0
  144. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Ld/LdROBTVvr8zXxr3OPCMHA_3AywvZu7Cez7f_z5XYHI0.cache +0 -0
  145. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Lp/LpyCVxq18ir1EsiBSXY-2BdAagH6hRFOgQWmWrE727I.cache +1 -0
  146. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/M7/M7oeSeUboehmqBTMJOUCtHIjVLwI1oBmq3xheUYdA2k.cache +1 -0
  147. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/MV/MVXPEOUdfwuem0_FuXAsqoIVmgyXSbmJEK2LioWxWoY.cache +1 -0
  148. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/NE/NE69Jbtcym4T0LF0dzkyARWKFNjG2zdV8Kxn4Oksq8M.cache +1 -0
  149. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Na/Nas7iovPFfI0gYVOEu4l0hwX0TQfVNs2erUEu9jvHmA.cache +2 -0
  150. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Oe/OeZruz7mEg_RWeO8mqVMd1ggikG3Il2VIhkllfPcYuE.cache +1 -0
  151. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/PH/PHzxpfmyooBZxrJfKGpO230GdqvGWVJ8DYGGY623n2s.cache +0 -0
  152. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Pg/PguSb9Mfs0IjD3PVAt9qOEvQcMLaChTO257SMo5okN0.cache +1 -0
  153. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Pz/Pzo2OlZ5UJZpc3fiUsgwAY1rfvG5bt9Ky6cgN2K2B5Y.cache +1 -0
  154. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Qr/QrfetM8gwBYH682Y1WDaWsoMd-vp6bMbMgqfR0k0KQw.cache +2 -0
  155. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/RB/RBMwsNLHOEUBuomIxdt5gNL9IXQ4gWKL_0UYPj9RU7Y.cache +1 -0
  156. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/RK/RK-iGPd8VXOujRtH6ZlLNALBwzkLRfAYo5iSBFiTgAE.cache +1 -0
  157. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/S7/S7-GTzruCxIgO_bueFO_IN7OURaoaUqIaJQ3N80AN2w.cache +1 -0
  158. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/T7/T73Jjweh2QTR_C-gkYCIMWgTFBZ8ldUNWH5uHlRK3J4.cache +0 -0
  159. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Tm/TmWe7cAtOeFgAuw9Vt06ljOiT684y0U3t9oBhB_FKyU.cache +3 -0
  160. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/V2/V2-0Al52o42xi5FXWm3IGV7JUqaAxfitStrGQ7H433s.cache +0 -0
  161. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/V6/V6Vsl1RBICP4cZ5t67Eb1mgxQK3rlYybgeVNUr-DKeg.cache +1 -0
  162. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/VE/VERrn9nvVrihdCYH2DvS_vcKOWda9wBeZa8q5r3Icdc.cache +1 -0
  163. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/VP/VPJUlXKOX1Eghq4Ort11OUnAzXwGeWH3AJNVhENQi8A.cache +3 -0
  164. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/WD/WDmWIfKziP6Sqlk3O3X_UjMLBE3K5TjPOqGtKd4L3mg.cache +0 -0
  165. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/WI/WIycF4IotUXhmZ4hivZuDwg-S0YoIwSV3NmXSvQ9xZ8.cache +0 -0
  166. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/WR/WRwbZt7M1h7_Slke5TBcmDdQR20PbTmiJU0s09m-Zs4.cache +0 -0
  167. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Wd/Wda4pcAw7hsQopFe_DdtA3MIzyRqXtvE5r6tLOyNlzs.cache +1 -0
  168. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Ww/Ww54EgV0j7JCXs_EEDkk4vA4D5n0ymQPwaEs9Ar7srI.cache +1 -0
  169. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Xj/Xj5lkKia8d1pojluzf8ynxvHol1h-zL9qUaku0TXwTs.cache +0 -0
  170. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/YA/YAcxnT9igycEbRfrzhOc8-9tG58hhMH1k56TCKb5F18.cache +1 -0
  171. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/_2/_2m23tk1LD8fj62Zqm6QScDhq-X1gpV-dEgciUCQ8L4.cache +1 -0
  172. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/_2/_2oXM4jNZR8u1y-8AuJJpkAqwSSQxWQyvYipp-yB6D4.cache +0 -0
  173. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/_P/_PA4t_tY_hOfyxIMqlx1xkZpkRTrSYEsd8BMzNIQxps.cache +1 -0
  174. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/_V/_VZBKpxURis3xucwR1V-zxi4M3UBHe8or9OFVGRkxSA.cache +2 -0
  175. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/_t/_tIVtc0nLinTijInoofU90hhTpgmQipdkviPWN0hErE.cache +0 -0
  176. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/a-/a-rO42r8yB7agwCLmLqO-QGUJLZ3UGPtuAoyGwstIy4.cache +1 -0
  177. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/a4/a4FH1D1cwC9PSKViAq8eiVbSMP4n8qJYTatDCApEUVY.cache +1 -0
  178. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/ah/ahn0zY8HSOlD-5IKfi1WHXINw_rTYY5W0agkOVUZhz4.cache +2 -0
  179. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/bS/bSpBaFGvDXHNCANj1EExhQckeR1T1QiL5HlPhpnl9qA.cache +2 -0
  180. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/b_/b_Itlk9QZZd7Rvf8kcA4yLP1R5Acu7jB-m1xQiSU0qE.cache +2 -0
  181. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/bc/bc-PDjPUgmH2SvVE-Y5Nhz9BIegrk_40lJX6G36PUJU.cache +3 -0
  182. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/bx/bx37wPPuhr8859u843Z-C4S40zMtQCq-Wxnj30FcWpw.cache +1 -0
  183. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/c5/c5hmYyFjdofhyjiRT_sxXZfsTVUcn4o3ciS0JMXd3VA.cache +2 -0
  184. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/cc/ccUadB1Y9f684soDnoWJE2voDSkUQvZJ1SB4vrdfJ9E.cache +3 -0
  185. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/di/diUzyBgz61dxZh-7Wp74bamL6qu-_Anz3eg6_wLYkPw.cache +1 -0
  186. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/e2/e2Ylc5Zpg2LhF0OIPOGsNV0AHm93ECtnhy9pVj356ec.cache +2 -0
  187. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/eY/eYLGncKw3t1qT37TJvSe4WF9h9uSq4OnBX4M2FjxjgM.cache +2 -0
  188. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/f2/f2XZ7dioB3GDoh0A_ohtmVBxyuTHOJ8UkukUUkUKLLA.cache +1 -0
  189. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/fG/fGaY_ebzsFSKi88S8ohAH5jg4Tql_uIwTlp1wHnQo4k.cache +1 -0
  190. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/gr/grLncMCPWjG-0RQaaVsaeFe1cW4PdMdMBZ8YMjrIJJA.cache +1 -0
  191. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/hF/hF2Es43rly3EGSdPsQ16c6np9ZOQSN2-qwVBA0zfAhQ.cache +1 -0
  192. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/hi/hin5x482VtKk-L0Jl3gsi9OFc_1VQwBBwut6BgpRioc.cache +2 -0
  193. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/iJ/iJtagkilJK8mzrisxAcq1QOLmKXkL7rZJq3weCsHk2o.cache +3 -0
  194. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/jb/jbAwfZkknwCSaOfeOAtzKZvAuJ_tazQWFbpKg4Om7pI.cache +1 -0
  195. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/jv/jvQdoopzi45RJN2hQqE5yaMDJHeER6VeyIB0gkIJrMg.cache +1 -0
  196. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/kP/kP3QwEiqwmtW13ebsUP5_Y-22XAkcqTa0l-NcNPKv14.cache +1 -0
  197. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/kP/kPLNtXUpN1Kil4lHmXuTV_wrVwssGteoHkqyEBMnZX8.cache +3 -0
  198. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/kX/kXfIWl2Z5OuZRAU09ocSvyHkxtlp1ndpQWChoeG-wnY.cache +1 -0
  199. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/lt/ltzCXMQjQ3RFVpe85xy7b8eBynhvpsRL2_qW4--561Y.cache +0 -0
  200. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/mX/mX1nlsL_SWOB4y22W5FheRX0YEONKyOY7xUeIvRiHco.cache +2 -0
  201. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/mY/mY_p2GAwu3hcYTfl1rhEd2MlQ_CjO0xeWL5Qrt3xGBo.cache +0 -0
  202. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/mk/mkSTCGVDldtV_xWnAzngru6s8S4JnBm1XAaP1uoJyUI.cache +1 -0
  203. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/nU/nUrZgQKv-MhF36iJbrRoSbxzHZCeljQWFb_hMnzRuvQ.cache +0 -0
  204. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/n_/n_xYqQYhwEMQknb3jFQnjlxxBE9TzMNHCdJ-bEyZFIw.cache +2 -0
  205. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/nx/nxTv3sKVUQZADJyM3dPaVmUA78MIsMLD_K279yN_GsI.cache +2 -0
  206. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/oH/oHUxht4smsuHzMVe-1pNpSjZcD2bGauh5ryDZLdeovE.cache +1 -0
  207. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/q6/q6mLH7WU7lvJ3RHFZRHWpi6JFgOe8e_25dqXQMcQLHc.cache +1 -0
  208. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/rS/rS6FBiQPDC8x7vLvgojoUd0eMpLTVvmg0Lz8qkc8MT0.cache +1 -0
  209. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/tK/tKTjnoxmWbbw_M7p8NUiVBP6OhgmWKSZ5iArtycjzPg.cache +1 -0
  210. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/uG/uGmGo7nxtS613RUuCbgiYqjhkMBFXbtgn3yRFnHeLq8.cache +1 -0
  211. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/uQ/uQNb4N1-4Q4P4fcVRkzBOaRGMULQHzBgrO7Z5Fh7DS0.cache +0 -0
  212. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/vF/vFuo6Pb49ruU9pthFcaLPnf9BIgxsAj6Q4p-_6Heh6E.cache +1 -0
  213. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/ve/ve7bbMjc3AE8SF89fjquR85_YagiRCmi4Zz6jB98OV0.cache +0 -0
  214. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/wf/wfjV4MWCZieAHBa7nUJFYc1IbECuuoPrM89dS-oejKA.cache +4 -0
  215. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/wm/wmTgPVHe2nx7h_J_qR2uAWWoBfw4OrOTmBaCTxm-NxQ.cache +3 -0
  216. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/xQ/xQ82LRE4DPMiX_urd6hsUFpcTDkv8NuxSjcNelBATc4.cache +0 -0
  217. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/xi/xi9cKsTUSk-kcLGlDBjtjRLJsMa_noMLO49FHtWz7fM.cache +1 -0
  218. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/xv/xvddxGh623sMMUFppu7Qh2WX_cOJTH3OeEMishsijD4.cache +0 -0
  219. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/ym/ymUWW3E0GmBz-CBtgQ2Z4C--EZ4vBzXEQGP8P3tWIKU.cache +1 -0
  220. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/zC/zCrKEzgZARfJPuDX9jFzxPskAlcimaeRk5YTQ00RiPo.cache +1 -0
  221. data/spec/spec_helper.rb +18 -0
  222. metadata +542 -0
@@ -0,0 +1,46 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <title>Æternitas Dashboard</title>
6
+ <%= stylesheet_link_tag 'aeternitas/web_ui/aeternitas_web_ui' %>
7
+ <%= javascript_include_tag 'aeternitas/web_ui/aeternitas_web_ui' %>
8
+ </head>
9
+ <body>
10
+ <header class="page-header">
11
+ <section class="container grid-1280">
12
+ <nav class="navbar">
13
+ <section class="navbar-section">
14
+ <%= link_to root_url, class: 'btn btn-link' do %>
15
+ <%= image_tag "aeternitas/web_ui/logo_large.png", class: "navbar-logo" %>
16
+ <% end %>
17
+ <%= link_to 'Dashboard', root_url, class: 'btn btn-link' %>
18
+ <%= link_to 'Pollables', pollables_path, class: 'btn btn-link' %>
19
+ </section>
20
+ <section class="navbar-section">
21
+ </section>
22
+ </nav>
23
+ </section>
24
+ </header>
25
+ <section class="navbar-spacer">&nbsp;</section>
26
+
27
+ <div class="content-wrapper">
28
+ <%= yield %>
29
+ </div>
30
+
31
+ <footer>
32
+ <div class="container grid-1280">
33
+ <p>
34
+ <a href="https://github.com/FHG-IMW/aeternitas"> Github </a>
35
+ |
36
+ Æternitas Version <%= Aeternitas::VERSION %>
37
+ |
38
+ UI Version <%= Aeternitas::WebUi::VERSION %>
39
+ </p>
40
+ <p>
41
+ Licensed under the <a href="https://github.com/FHG-IMW/aeternitas/blob/master/LICENSE.txt" >MIT License</a>.
42
+ </p>
43
+ </div>
44
+ </footer>
45
+ </body>
46
+ </html>
@@ -0,0 +1,39 @@
1
+ <div class="timepicker">
2
+ <div class="timepicker-header">
3
+ <h6>Time Range: </h6>
4
+ <strong> 1 day </strong>
5
+ <i class="icon icon-arrow-down float-right"></i>
6
+ </div>
7
+
8
+
9
+ <div class="timepicker-body closed">
10
+ <h6>Ending Now</h6>
11
+ <hr>
12
+ <ul class="step">
13
+ <li class="step-item" data-range="30">
14
+ <a href="#">30 minutes</a>
15
+ </li>
16
+ <li class="step-item" data-range="60">
17
+ <a href="#">1 hour</a>
18
+ </li>
19
+ <li class="step-item"data-range="180">
20
+ <a href="#" >3 hours</a>
21
+ </li>
22
+ <li class="step-item" data-range="360">
23
+ <a href="#">6 hours</a>
24
+ </li>
25
+ <li class="step-item" data-range="720">
26
+ <a href="#">12 hours</a>
27
+ </li>
28
+ <li class="step-item active" data-range="1440">
29
+ <a href="#">1 day</a>
30
+ </li>
31
+ <li class="step-item" data-range="4320">
32
+ <a href="#">3 days</a>
33
+ </li>
34
+ <li class="step-item" data-range="20160">
35
+ <a href="#">2 weeks</a>
36
+ </li>
37
+ </ul>
38
+ </div>
39
+ </div>
data/config/routes.rb ADDED
@@ -0,0 +1,15 @@
1
+ Aeternitas::WebUi::Engine.routes.draw do
2
+ resource :dashboard, controller: :dashboard, only: [:index] do
3
+ get 'polls_24h', on: :collection
4
+ get 'future_polls', on: :collection
5
+ get 'pollable_growth', on: :collection
6
+ end
7
+
8
+ resources :pollables, only: [:index, :show] do
9
+ get :timeline, on: :member
10
+ get :execution_time, on: :member
11
+ get :data_growth, on: :member
12
+ end
13
+
14
+ root 'dashboard#index'
15
+ end
@@ -0,0 +1,12 @@
1
+ require 'aeternitas/web_ui/engine'
2
+ require 'aeternitas/web_ui/color_generator'
3
+ require 'aeternitas/web_ui/dashboard_statistics'
4
+ require 'aeternitas/web_ui/pollable_statistics'
5
+ require 'aeternitas/web_ui/pollables_index_statistics'
6
+ require 'aeternitas/web_ui/version'
7
+
8
+ module Aeternitas
9
+ module WebUi
10
+
11
+ end
12
+ end
@@ -0,0 +1,32 @@
1
+ require 'colorable'
2
+
3
+ module Aeternitas
4
+ module WebUi
5
+ class ColorGenerator
6
+ def initialize(n, baseColor = "#C25B56")
7
+ @counter = 0
8
+ @base_color = Colorable::Color.new(baseColor).hsb
9
+ @step = 240.0 / n
10
+ @colors = []
11
+ end
12
+
13
+ def next
14
+ generate_color(@counter)
15
+ @counter += 1
16
+ current
17
+ end
18
+
19
+ def current
20
+ @colors[@counter] || generate_color(@counter)
21
+ end
22
+
23
+
24
+ def generate_color(i)
25
+ next_hue = @base_color[0] + (@step * (i % 240.0))
26
+ next_color = Colorable::Color.new(Colorable::HSB.new(next_hue, @base_color[1], @base_color[2]))
27
+ @colors[i] = next_color
28
+ next_color
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,96 @@
1
+ module Aeternitas
2
+ module WebUi
3
+ module DashboardStatistics
4
+ def self.enqueued
5
+ Aeternitas::PollableMetaData.enqueued.count
6
+ end
7
+
8
+ def self.count_polls_24h
9
+ Aeternitas::Metrics.polls(Pollable, from: 24.hours.ago, to: Time.now, resolution: :day).map {|v| v[:count]}.sum
10
+ end
11
+
12
+ def self.count_failed_polls_24h
13
+ Aeternitas::Metrics.failed_polls(Pollable, from: 24.hours.ago, to: Time.now, resolution: :day).map {|v| v[:count]}.sum
14
+ end
15
+
16
+ def self.polls_24h
17
+ polls = Aeternitas::Metrics.polls(Pollable, from: 24.hours.ago, to: Time.now, resolution: :hour)
18
+ failures = Aeternitas::Metrics.failed_polls(Pollable, from: 24.hours.ago, to: Time.now, resolution: :hour)
19
+
20
+ {
21
+ labels: polls.map {|v| v[:timestamp].strftime("%H:%M")},
22
+ datasets: [
23
+ {
24
+ label: '# Polls',
25
+ data: polls.map {|v| v[:count]},
26
+ borderColor: "#96C0CE",
27
+ backgroundColor: "rgba(171,221,235,0.5)"
28
+ },
29
+ {
30
+ label: '# Failures',
31
+ data: failures.map {|v| v[:count]},
32
+ borderColor: "#C25B56",
33
+ backgroundColor: "rgba(255,116,111,0.5)"
34
+ }
35
+ ]
36
+ }
37
+ end
38
+
39
+ def self.future_polls
40
+ labels = []
41
+ datapoints = Hash.new { |k, v| k[v] = Array.new(7, 0) }
42
+
43
+ (Date.today..6.days.from_now.to_date).each_with_index do |day, i|
44
+ labels[i] = day.strftime("%b %d")
45
+ Aeternitas::PollableMetaData
46
+ .where(next_polling: (day.beginning_of_day..day.end_of_day))
47
+ .group(:pollable_class)
48
+ .count
49
+ .each_pair { |pollable, count| datapoints[pollable][i] = count }
50
+ end
51
+
52
+ colors = ColorGenerator.new(datapoints.count)
53
+
54
+ {
55
+ labels: labels,
56
+ datasets: datapoints.map do |pollable, data|
57
+ {
58
+ label: pollable,
59
+ data: data,
60
+ backgroundColor: colors.next.hex,
61
+ borderColor: colors.current.hex
62
+ }
63
+ end
64
+ }
65
+ end
66
+
67
+ def self.pollable_growth
68
+ pollable_classes = Aeternitas::PollableMetaData.distinct(:pollable_class).pluck(:pollable_class)
69
+ range = (7.days.ago.to_date..Date.today)
70
+
71
+ colors = ColorGenerator.new(pollable_classes.count)
72
+
73
+ datasets = pollable_classes.map do |type|
74
+ values = Aeternitas::Metrics.pollables_created(
75
+ type.constantize,
76
+ from: range.begin.beginning_of_day,
77
+ to: range.end.end_of_day,
78
+ resolution: :day
79
+ ).map { |v| v[:count] }
80
+
81
+ {
82
+ label: type,
83
+ data: values,
84
+ borderColor: colors.next.hex,
85
+ backgroundColor: colors.current.hex
86
+ }
87
+ end
88
+
89
+ {
90
+ labels: range.to_a.map { |date| date.strftime("%B %d") },
91
+ datasets: datasets
92
+ }
93
+ end
94
+ end
95
+ end
96
+ end
@@ -0,0 +1,15 @@
1
+ module Aeternitas
2
+ module WebUi
3
+ class Engine < ::Rails::Engine
4
+ isolate_namespace Aeternitas::WebUi
5
+
6
+ initializer 'aeternitas.assets.precompile' do |app|
7
+ app.config.assets.precompile += [
8
+ 'aeternitas/web_ui/aeternitas_web_ui.js',
9
+ 'aeternitas/web_ui/aeternitas_web_ui.css',
10
+ 'aeternitas/web_ui/logo_large.png'
11
+ ]
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,148 @@
1
+ module Aeternitas
2
+ module WebUi
3
+ module PollableStatistics
4
+ def self.enqueued(pollable)
5
+ Aeternitas::PollableMetaData
6
+ .where(pollable_class: pollable.name)
7
+ .enqueued
8
+ .count
9
+ end
10
+
11
+ def self.deactivated(pollable)
12
+ Aeternitas::PollableMetaData
13
+ .where(pollable_class: pollable.name)
14
+ .deactivated
15
+ .count
16
+ end
17
+
18
+ def self.guard_locked_ratio(pollable)
19
+ Aeternitas::Metrics.guard_locked_ratio(
20
+ pollable,
21
+ from: 24.hours.ago,
22
+ to: Time.now,
23
+ resolution: :hour
24
+ ).avg
25
+ end
26
+
27
+ def self.timeline(pollable, from, to)
28
+ resolution = get_resolution(from, to)
29
+ polls = Aeternitas::Metrics.polls(pollable, from: from, to: to, resolution: resolution)
30
+ success = Aeternitas::Metrics.successful_polls(pollable, from: from, to: to, resolution: resolution)
31
+ failures = Aeternitas::Metrics.failed_polls(pollable, from: from, to: to, resolution: resolution)
32
+ locks = Aeternitas::Metrics.guard_locked(pollable, from: from, to: to, resolution: resolution)
33
+
34
+ {
35
+ labels: polls.map {|v| v[:timestamp].strftime("%B %d. %H:%M")},
36
+ datasets: [
37
+ {
38
+ label: '# Polls',
39
+ data: polls.map {|v| v[:count]},
40
+ borderColor: "#96C0CE",
41
+ backgroundColor: "rgba(171,221,235,0.5)",
42
+ fill: false,
43
+ type: 'line'
44
+ },
45
+ {
46
+ label: '# Successfull Polls',
47
+ data: success.map {|v| v[:count]},
48
+ borderColor: "#32b643",
49
+ backgroundColor: "rgba(50,182,67,0.5)",
50
+ },
51
+ {
52
+ label: '# Failures',
53
+ data: failures.map {|v| v[:count]},
54
+ borderColor: "#C25B56",
55
+ backgroundColor: "rgba(255,116,111,0.5)",
56
+ },
57
+ {
58
+ label: '# Guard Locked',
59
+ data: locks.map {|v| v[:count]},
60
+ borderColor: "#ffd59c",
61
+ backgroundColor: "rgba(255,213,156,0.5)",
62
+ }
63
+ ]
64
+ }
65
+ end
66
+
67
+ def self.execution_time(pollable, from, to)
68
+ resolution = get_resolution(from, to)
69
+ polling_time = Aeternitas::Metrics.execution_time(pollable, from: from, to: to, resolution: resolution)
70
+
71
+ {
72
+ labels: polling_time.map {|v| v[:timestamp].strftime("%B %d. %H:%M")},
73
+ datasets: [
74
+ {
75
+ label: 'Average',
76
+ data: polling_time.map {|v| (v[:avg] * 1000).to_i},
77
+ borderColor: "#96C0CE",
78
+ backgroundColor: "rgba(171,221,235,0.5)",
79
+ fill: false,
80
+ type: 'line'
81
+ },
82
+ {
83
+ label: 'Minimum',
84
+ data: polling_time.map {|v| (v[:min] * 1000).to_i},
85
+ borderColor: "#32b643",
86
+ backgroundColor: "rgba(50,182,67,0.5)",
87
+ fill: false,
88
+ type: 'line'
89
+ },
90
+ {
91
+ label: 'Maximum',
92
+ data: polling_time.map {|v| (v[:max] * 1000).to_i},
93
+ borderColor: "#ffd59c",
94
+ backgroundColor: "rgba(255,213,156,0.5)",
95
+ fill: false,
96
+ type: 'line'
97
+ }
98
+ ]
99
+ }
100
+ end
101
+
102
+ def self.data_growth(pollable, from, to)
103
+ resolution = get_resolution(from, to)
104
+ pollables_created = Aeternitas::Metrics.pollables_created(pollable, from: from, to: to, resolution: resolution)
105
+ sources_created = Aeternitas::Metrics.sources_created(pollable, from: from, to: to, resolution: resolution)
106
+
107
+ {
108
+ labels: pollables_created.map { |v| v[:timestamp].strftime('%B %d. %H:%M') },
109
+ datasets: [
110
+ {
111
+ label: "Created #{pollable.name.pluralize}",
112
+ data: pollables_created.map { |v| v[:count] },
113
+ borderColor: '#96C0CE',
114
+ backgroundColor: 'rgba(171,221,235,0.5)',
115
+ fill: false,
116
+ type: 'line'
117
+ },
118
+ {
119
+ label: "Created Sources",
120
+ data: sources_created.map { |v| v[:count] },
121
+ borderColor: "#32b643",
122
+ backgroundColor: "rgba(50,182,67,0.5)",
123
+ fill: false,
124
+ type: 'line'
125
+ }
126
+ ]
127
+ }
128
+ end
129
+
130
+ def self.deactivated_pollables(pollable)
131
+ Aeternitas::PollableMetaData.deactivated.includes(:pollable).where(pollable_class: pollable.name)
132
+ end
133
+
134
+ def self.get_resolution(from, to)
135
+ case (to.to_time - from.to_time)
136
+ when 0.hours..2.hours
137
+ :minute
138
+ when 2.hours..12.hours
139
+ :ten_minutes
140
+ when 12.hours..3.days
141
+ :hour
142
+ else
143
+ :day
144
+ end
145
+ end
146
+ end
147
+ end
148
+ end
@@ -0,0 +1,36 @@
1
+ module Aeternitas
2
+ module WebUi
3
+ module PollablesIndexStatistics
4
+ def self.available_pollables
5
+ Aeternitas::PollableMetaData.distinct(:pollable_class).pluck(:pollable_class).map(&:constantize)
6
+ end
7
+
8
+ def self.failure_ratio(pollable)
9
+ Aeternitas::Metrics.failure_ratio(
10
+ pollable,
11
+ from: 24.hours.ago,
12
+ to: Time.now,
13
+ resolution: :hour
14
+ ).avg.round(2)
15
+ end
16
+
17
+ def self.guard_locked_ratio(pollable)
18
+ Aeternitas::Metrics.guard_locked_ratio(
19
+ pollable,
20
+ from: 24.hours.ago,
21
+ to: Time.now,
22
+ resolution: :hour
23
+ ).avg.round(2)
24
+ end
25
+
26
+ def self.polls(pollable)
27
+ Aeternitas::Metrics.polls(
28
+ pollable,
29
+ from: 24.hours.ago,
30
+ to: Time.now,
31
+ resolution: :hour
32
+ ).map { |v| v[:count] }.sum
33
+ end
34
+ end
35
+ end
36
+ end