aleph_analytics 0.0.0.alpha

Sign up to get free protection for your applications and to get access to all the features.
Files changed (527) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +0 -0
  3. data/Gemfile +70 -0
  4. data/Gemfile.lock +489 -0
  5. data/LICENSE +21 -0
  6. data/Procfile +2 -0
  7. data/README.md +1 -0
  8. data/ROADMAP.md +7 -0
  9. data/Rakefile +9 -0
  10. data/app/assets/fonts/octicons-local.ttf +0 -0
  11. data/app/assets/fonts/octicons.eot +0 -0
  12. data/app/assets/fonts/octicons.svg +183 -0
  13. data/app/assets/fonts/octicons.ttf +0 -0
  14. data/app/assets/fonts/octicons.woff +0 -0
  15. data/app/assets/javascripts/angular/aleph.js.es6 +90 -0
  16. data/app/assets/javascripts/angular/config/schema_completer_config.js.es6 +71 -0
  17. data/app/assets/javascripts/angular/controllers/alerts/alert_index_controller.js.es6 +16 -0
  18. data/app/assets/javascripts/angular/controllers/alerts/alert_show_controller.js.es6 +99 -0
  19. data/app/assets/javascripts/angular/controllers/controllers.js.es6 +65 -0
  20. data/app/assets/javascripts/angular/controllers/query/query_index_controller.js.es6 +80 -0
  21. data/app/assets/javascripts/angular/controllers/query/query_repl_controller.js.es6 +147 -0
  22. data/app/assets/javascripts/angular/controllers/query/query_show_controller.js.es6 +43 -0
  23. data/app/assets/javascripts/angular/controllers/schema/schema_index_controller.js.es6 +61 -0
  24. data/app/assets/javascripts/angular/controllers/snippet/snippet_index_controller.js.es6 +80 -0
  25. data/app/assets/javascripts/angular/directives/directives.js.es6 +30 -0
  26. data/app/assets/javascripts/angular/directives/query/query_details_directive.js.es6 +87 -0
  27. data/app/assets/javascripts/angular/directives/query/query_version_sidebar_directive.js.es6 +65 -0
  28. data/app/assets/javascripts/angular/directives/result/result_directive.js.es6 +59 -0
  29. data/app/assets/javascripts/angular/directives/result/results_directive.js.es6 +30 -0
  30. data/app/assets/javascripts/angular/directives/visualization_directive.js.es6 +101 -0
  31. data/app/assets/javascripts/angular/filters/filters.js.es6 +27 -0
  32. data/app/assets/javascripts/angular/services/alert/alert.js.es6 +51 -0
  33. data/app/assets/javascripts/angular/services/alert/alert_resource.js.es6 +10 -0
  34. data/app/assets/javascripts/angular/services/lib/ace_completers.js.es6 +29 -0
  35. data/app/assets/javascripts/angular/services/lib/ace_sql_parse.js.es6 +156 -0
  36. data/app/assets/javascripts/angular/services/lib/action_handler.js.es6 +73 -0
  37. data/app/assets/javascripts/angular/services/lib/alert_flash.js.es6 +30 -0
  38. data/app/assets/javascripts/angular/services/lib/default_ace_configurator_service.js.es6 +74 -0
  39. data/app/assets/javascripts/angular/services/lib/github_url_service.js.es6 +53 -0
  40. data/app/assets/javascripts/angular/services/lib/keyword_completer.js.es6 +36 -0
  41. data/app/assets/javascripts/angular/services/lib/local_resource.js.es6 +20 -0
  42. data/app/assets/javascripts/angular/services/lib/lock_service.js.es6 +48 -0
  43. data/app/assets/javascripts/angular/services/lib/locking_poll_service.js.es6 +42 -0
  44. data/app/assets/javascripts/angular/services/lib/matcher_runner.js.es6 +65 -0
  45. data/app/assets/javascripts/angular/services/lib/navigation_guard.js.es6 +45 -0
  46. data/app/assets/javascripts/angular/services/lib/open_repl_service.js.es6 +56 -0
  47. data/app/assets/javascripts/angular/services/lib/page_title_manager.js.es6 +38 -0
  48. data/app/assets/javascripts/angular/services/lib/pagination.js.es6 +114 -0
  49. data/app/assets/javascripts/angular/services/lib/pagination_components.js.es6 +91 -0
  50. data/app/assets/javascripts/angular/services/lib/parameter_methods.js.es6 +35 -0
  51. data/app/assets/javascripts/angular/services/lib/role_model.js.es6 +21 -0
  52. data/app/assets/javascripts/angular/services/lib/schema_completer.js.es6 +56 -0
  53. data/app/assets/javascripts/angular/services/lib/selection_tag_input.js.es6 +42 -0
  54. data/app/assets/javascripts/angular/services/lib/server_configurations.js.es6 +15 -0
  55. data/app/assets/javascripts/angular/services/lib/spinner_state.js.es6 +45 -0
  56. data/app/assets/javascripts/angular/services/lib/tag_resource.js.es6 +14 -0
  57. data/app/assets/javascripts/angular/services/model/collection_dirty_awareness.js.es6 +33 -0
  58. data/app/assets/javascripts/angular/services/model/collection_model_base.js.es6 +75 -0
  59. data/app/assets/javascripts/angular/services/model/dirty_aware_collection_model.js.es6 +31 -0
  60. data/app/assets/javascripts/angular/services/model/dirty_aware_model.js.es6 +50 -0
  61. data/app/assets/javascripts/angular/services/model/model_base.js.es6 +80 -0
  62. data/app/assets/javascripts/angular/services/model/model_state.js.es6 +51 -0
  63. data/app/assets/javascripts/angular/services/model/models.js.es6 +15 -0
  64. data/app/assets/javascripts/angular/services/model/unpersisted_model.js.es6 +20 -0
  65. data/app/assets/javascripts/angular/services/model_generation/model_factory.js.es6 +28 -0
  66. data/app/assets/javascripts/angular/services/model_generation/model_generation.js.es6 +13 -0
  67. data/app/assets/javascripts/angular/services/model_generation/model_manager.js.es6 +86 -0
  68. data/app/assets/javascripts/angular/services/model_generation/resource_factory.js.es6 +38 -0
  69. data/app/assets/javascripts/angular/services/model_generation/standard_collection_model.js.es6 +25 -0
  70. data/app/assets/javascripts/angular/services/model_generation/standard_model.js.es6 +38 -0
  71. data/app/assets/javascripts/angular/services/query/query.js.es6 +55 -0
  72. data/app/assets/javascripts/angular/services/query/query_handler.js.es6 +40 -0
  73. data/app/assets/javascripts/angular/services/query/query_loader.js.es6 +54 -0
  74. data/app/assets/javascripts/angular/services/query/query_request_transformers.js.es6 +26 -0
  75. data/app/assets/javascripts/angular/services/query/query_resource.js.es6 +21 -0
  76. data/app/assets/javascripts/angular/services/query/query_tab.js.es6 +63 -0
  77. data/app/assets/javascripts/angular/services/query/query_versions.js.es6 +21 -0
  78. data/app/assets/javascripts/angular/services/result/result.js.es6 +26 -0
  79. data/app/assets/javascripts/angular/services/result/result_poller.js.es6 +30 -0
  80. data/app/assets/javascripts/angular/services/result/result_runner.js.es6 +48 -0
  81. data/app/assets/javascripts/angular/services/result/results.js.es6 +10 -0
  82. data/app/assets/javascripts/angular/services/schema/schema_column.js.es6 +93 -0
  83. data/app/assets/javascripts/angular/services/schema/schema_column_resource.js.es6 +12 -0
  84. data/app/assets/javascripts/angular/services/schema/schema_columns.js.es6 +57 -0
  85. data/app/assets/javascripts/angular/services/schema/schema_comment_resource.js.es6 +12 -0
  86. data/app/assets/javascripts/angular/services/services.js.es6 +140 -0
  87. data/app/assets/javascripts/angular/services/snippet/ace_snippet_manager.js.es6 +44 -0
  88. data/app/assets/javascripts/angular/services/visualization/source_renderer.js.es6 +70 -0
  89. data/app/assets/javascripts/angular/services/visualization/visualization.js.es6 +47 -0
  90. data/app/assets/javascripts/angular/services/visualization/visualization_service.js.es6 +67 -0
  91. data/app/assets/javascripts/angular/services/visualization/visualizations.js.es6 +11 -0
  92. data/app/assets/javascripts/application.js +22 -0
  93. data/app/assets/javascripts/lib/key_binding.js +24 -0
  94. data/app/assets/javascripts/lib/serialized_storage.js +11 -0
  95. data/app/assets/javascripts/lib/underscore_contrib/array_builders.js +190 -0
  96. data/app/assets/javascripts/lib/underscore_contrib/function_predicates.js +95 -0
  97. data/app/assets/javascripts/lib/underscore_contrib/object_builders.js +111 -0
  98. data/app/assets/javascripts/lib/underscore_contrib/object_selectors.js +112 -0
  99. data/app/assets/javascripts/lib/underscore_contrib/util_existential.js +15 -0
  100. data/app/assets/javascripts/lib/utils.js +29 -0
  101. data/app/assets/stylesheets/alert_bar.css.sass +13 -0
  102. data/app/assets/stylesheets/alerts.css.sass +66 -0
  103. data/app/assets/stylesheets/application.css.sass +35 -0
  104. data/app/assets/stylesheets/comments.css.sass +7 -0
  105. data/app/assets/stylesheets/index_components.css.sass +105 -0
  106. data/app/assets/stylesheets/queries.css.sass +110 -0
  107. data/app/assets/stylesheets/repl.css.sass +59 -0
  108. data/app/assets/stylesheets/results.css.sass +25 -0
  109. data/app/assets/stylesheets/schemas.css.sass +56 -0
  110. data/app/assets/stylesheets/sessions.css.sass +9 -0
  111. data/app/assets/stylesheets/shared.css.sass +157 -0
  112. data/app/assets/stylesheets/sidebar.css.sass +85 -0
  113. data/app/assets/stylesheets/snippets.css.sass +15 -0
  114. data/app/assets/stylesheets/sort_bar.css.sass +10 -0
  115. data/app/assets/stylesheets/spinners.css.sass +67 -0
  116. data/app/assets/stylesheets/summary.css.sass +16 -0
  117. data/app/assets/stylesheets/variables.css.sass +110 -0
  118. data/app/assets/stylesheets/visualizations.css.sass +15 -0
  119. data/app/controllers/alerts_controller.rb +72 -0
  120. data/app/controllers/application_controller.rb +38 -0
  121. data/app/controllers/columns_controller.rb +21 -0
  122. data/app/controllers/queries_controller.rb +85 -0
  123. data/app/controllers/query_versions_controller.rb +38 -0
  124. data/app/controllers/result_csvs_controller.rb +29 -0
  125. data/app/controllers/results_controller.rb +53 -0
  126. data/app/controllers/roles_controller.rb +9 -0
  127. data/app/controllers/schema_comments_controller.rb +47 -0
  128. data/app/controllers/snippets_controller.rb +67 -0
  129. data/app/controllers/tags_controller.rb +19 -0
  130. data/app/controllers/visualizations_controller.rb +61 -0
  131. data/app/mailers/alert_mailer.rb +8 -0
  132. data/app/models/ability.rb +31 -0
  133. data/app/models/alert.rb +139 -0
  134. data/app/models/alert_execution.rb +25 -0
  135. data/app/models/query.rb +85 -0
  136. data/app/models/query_execution.rb +39 -0
  137. data/app/models/query_role.rb +3 -0
  138. data/app/models/query_version.rb +61 -0
  139. data/app/models/result.rb +67 -0
  140. data/app/models/schema_comment.rb +3 -0
  141. data/app/models/snippet.rb +3 -0
  142. data/app/models/user.rb +19 -0
  143. data/app/models/visualization.rb +7 -0
  144. data/app/serializers/alert_serializer.rb +10 -0
  145. data/app/serializers/query_index_serializer.rb +7 -0
  146. data/app/serializers/query_serializer.rb +8 -0
  147. data/app/serializers/query_version_serializer.rb +3 -0
  148. data/app/serializers/result_serializer.rb +3 -0
  149. data/app/views/alert_mailer/alert_failing_email.html.haml +17 -0
  150. data/app/views/alerts/_index.html.haml +10 -0
  151. data/app/views/alerts/_index_item.html.haml +25 -0
  152. data/app/views/alerts/_index_sidebar.html.haml +20 -0
  153. data/app/views/alerts/_index_sort_bar.html.haml +22 -0
  154. data/app/views/alerts/_show.html.haml +90 -0
  155. data/app/views/application/_rollbar.html.erb +9 -0
  156. data/app/views/application/index.html.haml +1 -0
  157. data/app/views/application/unauthorized.html.haml +5 -0
  158. data/app/views/application/unauthorized.json +3 -0
  159. data/app/views/devise/sessions/new.html.haml +22 -0
  160. data/app/views/layouts/application.html.haml +78 -0
  161. data/app/views/queries/_alert.html.haml +6 -0
  162. data/app/views/queries/_comments.html.haml +5 -0
  163. data/app/views/queries/_index.html.haml +15 -0
  164. data/app/views/queries/_index_item.html.haml +37 -0
  165. data/app/views/queries/_index_sidebar.html.haml +58 -0
  166. data/app/views/queries/_index_sort_bar.html.haml +29 -0
  167. data/app/views/queries/_query_details.html.haml +81 -0
  168. data/app/views/queries/_query_version_sidebar.html.haml +46 -0
  169. data/app/views/queries/_repl.html.haml +79 -0
  170. data/app/views/queries/_results.html.haml +29 -0
  171. data/app/views/queries/_role_template.html.haml +3 -0
  172. data/app/views/queries/_show.html.haml +28 -0
  173. data/app/views/queries/_tag_template.html.haml +3 -0
  174. data/app/views/results/_show.html.haml +45 -0
  175. data/app/views/schemas/_index.html.haml +47 -0
  176. data/app/views/snippets/_index.html.haml +30 -0
  177. data/app/views/snippets/_index_item.html.haml +20 -0
  178. data/app/views/visualizations/_show.html.haml +83 -0
  179. data/bin/aleph +71 -0
  180. data/bin/bundle +3 -0
  181. data/bin/executables/bundle_runner.rb +12 -0
  182. data/bin/executables/clock.rb +7 -0
  183. data/bin/executables/deps.rb +10 -0
  184. data/bin/executables/import_env_variables.rb +17 -0
  185. data/bin/executables/init_db.rb +7 -0
  186. data/bin/executables/lib/config_generator.rb +51 -0
  187. data/bin/executables/lib/env_writer.rb +25 -0
  188. data/bin/executables/lib/import_env_file.rb +19 -0
  189. data/bin/executables/lib/seeder.rb +14 -0
  190. data/bin/executables/lib/utils.rb +30 -0
  191. data/bin/executables/playground.rb +130 -0
  192. data/bin/executables/seed_playground_db.rb +9 -0
  193. data/bin/executables/update_db.rb +7 -0
  194. data/bin/executables/web_server.rb +12 -0
  195. data/bin/executables/worker.rb +7 -0
  196. data/bin/rails +4 -0
  197. data/bin/rake +4 -0
  198. data/config/application.rb +59 -0
  199. data/config/attribute-map.yml +4 -0
  200. data/config/boot.rb +4 -0
  201. data/config/database.yml +40 -0
  202. data/config/environment.rb +5 -0
  203. data/config/environments/development.rb +37 -0
  204. data/config/environments/playground.rb +55 -0
  205. data/config/environments/production.rb +68 -0
  206. data/config/environments/staging.rb +75 -0
  207. data/config/environments/test.rb +46 -0
  208. data/config/initializers/01_internalize_configurations.rb +70 -0
  209. data/config/initializers/action_controller_renderers.rb +15 -0
  210. data/config/initializers/active_model_serializer.rb +7 -0
  211. data/config/initializers/assets.rb +8 -0
  212. data/config/initializers/backtrace_silencers.rb +7 -0
  213. data/config/initializers/cookies_serializer.rb +3 -0
  214. data/config/initializers/default_enviorment_variables.rb +8 -0
  215. data/config/initializers/devise.rb +297 -0
  216. data/config/initializers/filter_parameter_logging.rb +4 -0
  217. data/config/initializers/haml.rb +1 -0
  218. data/config/initializers/inflections.rb +16 -0
  219. data/config/initializers/mime_types.rb +4 -0
  220. data/config/initializers/net_http.rb +1 -0
  221. data/config/initializers/pester.rb +15 -0
  222. data/config/initializers/rails_admin.rb +27 -0
  223. data/config/initializers/redis.rb +14 -0
  224. data/config/initializers/rollbar.rb +45 -0
  225. data/config/initializers/session_store.rb +3 -0
  226. data/config/initializers/sql_logging_patch.rb +7 -0
  227. data/config/initializers/to_bool.rb +29 -0
  228. data/config/initializers/wrap_parameters.rb +14 -0
  229. data/config/locales/devise.en.yml +62 -0
  230. data/config/locales/en.yml +23 -0
  231. data/config/puma.rb +10 -0
  232. data/config/resque-pool.yml +15 -0
  233. data/config/resque.yml +10 -0
  234. data/config/routes.rb +33 -0
  235. data/config/secrets.yml +26 -0
  236. data/config.ru +4 -0
  237. data/db/migrate/20140710204753_database_begin.rb +150 -0
  238. data/lib/aleph_log_formatter.rb +5 -0
  239. data/lib/authentication.rb +17 -0
  240. data/lib/aws_s3.rb +7 -0
  241. data/lib/clock.rb +7 -0
  242. data/lib/compilable_parameter.rb +50 -0
  243. data/lib/count_publisher.rb +26 -0
  244. data/lib/csv_helper/aws.rb +30 -0
  245. data/lib/csv_helper/base.rb +20 -0
  246. data/lib/csv_helper/local.rb +18 -0
  247. data/lib/csv_serializer.rb +23 -0
  248. data/lib/csv_service.rb +12 -0
  249. data/lib/github/blob.rb +23 -0
  250. data/lib/github/commit.rb +37 -0
  251. data/lib/github/pusher.rb +94 -0
  252. data/lib/github/refs.rb +39 -0
  253. data/lib/github/tree.rb +29 -0
  254. data/lib/github.rb +64 -0
  255. data/lib/interaction/query_creation.rb +27 -0
  256. data/lib/interaction/query_interaction.rb +35 -0
  257. data/lib/interaction/query_update.rb +62 -0
  258. data/lib/interaction/result_creation.rb +48 -0
  259. data/lib/pagination_search/attribute_set.rb +61 -0
  260. data/lib/pagination_search/base_relation.rb +80 -0
  261. data/lib/pagination_search/hash_paginate.rb +74 -0
  262. data/lib/pagination_search/paginated_records.rb +16 -0
  263. data/lib/pagination_search/pagination.rb +12 -0
  264. data/lib/pagination_search/search_conditions.rb +59 -0
  265. data/lib/query_version_support.rb +14 -0
  266. data/lib/redis_result_row_count.rb +26 -0
  267. data/lib/redshift_connection_pool.rb +8 -0
  268. data/lib/redshift_pg/connection.rb +44 -0
  269. data/lib/redshift_pg/redshift_pg.rb +15 -0
  270. data/lib/result_csv_generator.rb +40 -0
  271. data/lib/role.rb +40 -0
  272. data/lib/sample_skimmer.rb +30 -0
  273. data/lib/schema_comment_matcher.rb +27 -0
  274. data/lib/schemas/descriptor.rb +85 -0
  275. data/lib/schemas/descriptors.rb +10 -0
  276. data/lib/schemas/paginate.rb +21 -0
  277. data/lib/schemas/redis_store.rb +22 -0
  278. data/lib/simple_cache.rb +13 -0
  279. data/lib/sql_compiler.rb +33 -0
  280. data/lib/summarizer.rb +18 -0
  281. data/lib/tasks/karma.rake +32 -0
  282. data/lib/tasks/resque_setup.rake +18 -0
  283. data/playground_data/1.csv +13 -0
  284. data/playground_data/aleph.playground.sqlite3 +0 -0
  285. data/public/404.html +26 -0
  286. data/public/422.html +26 -0
  287. data/public/500.html +25 -0
  288. data/public/aleph.png +0 -0
  289. data/public/assets/.sprockets-manifest-24b5998edb20c5b4d6edf39d44cd3ff7.json +1 -0
  290. data/public/assets/FontAwesome-9ccfa32dd4cd1b8e83f68899d85bd5e6.otf +0 -0
  291. data/public/assets/ZeroClipboard-8b5c117b88fe37e32fd34a70fdf60026.swf +0 -0
  292. data/public/assets/angular/aleph.js-19b4df67407de5dab249abfc391c0eaf.es6 +90 -0
  293. data/public/assets/angular/config/schema_completer_config.js-1b696920b5e04f75620630d75117b201.es6 +71 -0
  294. data/public/assets/angular/controllers/alerts/alert_index_controller.js-4344581b1e9b456c3f991f96bb4d403d.es6 +16 -0
  295. data/public/assets/angular/controllers/alerts/alert_show_controller.js-a984dc82fbcac380cdc8682bf8986933.es6 +99 -0
  296. data/public/assets/angular/controllers/controllers.js-7431ae468ea2f0d392661448a61cfdf3.es6 +65 -0
  297. data/public/assets/angular/controllers/query/query_index_controller.js-828eadeee6a971b11b5c07f65f0c6def.es6 +80 -0
  298. data/public/assets/angular/controllers/query/query_repl_controller.js-3c4bac22e41766e2e83e720d53acade3.es6 +147 -0
  299. data/public/assets/angular/controllers/query/query_show_controller.js-020c83fd94ece7d55bd94b9981a40083.es6 +43 -0
  300. data/public/assets/angular/controllers/schema/schema_index_controller.js-d0d790d168b49caefa4b8f7993c928f1.es6 +61 -0
  301. data/public/assets/angular/controllers/snippet/snippet_index_controller.js-9191ee2e37d16d5807b8a7f45530a6c2.es6 +80 -0
  302. data/public/assets/angular/directives/directives.js-44fda752585bddc5d026feaab8b14108.es6 +30 -0
  303. data/public/assets/angular/directives/query/query_details_directive.js-2dd979e2463826558f166d9dc9e2c8a9.es6 +87 -0
  304. data/public/assets/angular/directives/query/query_version_sidebar_directive.js-b19ba8a9bf4e66c5740e9b9f9495cee1.es6 +65 -0
  305. data/public/assets/angular/directives/result/result_directive.js-76c151e9277e35578f92b076c2fa5b06.es6 +59 -0
  306. data/public/assets/angular/directives/result/results_directive.js-fcbf9750790823a11ca313e630bd2b0f.es6 +30 -0
  307. data/public/assets/angular/directives/visualization_directive.js-82cb45a52eba62deb283a3699add1b33.es6 +101 -0
  308. data/public/assets/angular/filters/filters.js-48cdb16fc89337e861c9f18ad57fd9bf.es6 +27 -0
  309. data/public/assets/angular/services/alert/alert.js-a76ea96e948de324fcc00f3ef3ecae4e.es6 +51 -0
  310. data/public/assets/angular/services/alert/alert_resource.js-ac68ea99936eb213c0fb37d4fbb1511a.es6 +10 -0
  311. data/public/assets/angular/services/lib/ace_completers.js-5353182bc538210dad12865ad6a060fd.es6 +29 -0
  312. data/public/assets/angular/services/lib/ace_sql_parse.js-4114a8ad4fe4dbf4f72c0ab7fca22e83.es6 +156 -0
  313. data/public/assets/angular/services/lib/action_handler.js-85a8f75f507efcf2fe950fa7717b6976.es6 +73 -0
  314. data/public/assets/angular/services/lib/alert_flash.js-7a4fe7ef5510a224677a12ecf2fe973b.es6 +30 -0
  315. data/public/assets/angular/services/lib/default_ace_configurator_service.js-9b83d6b53495dafe10bfed5074c3ec01.es6 +74 -0
  316. data/public/assets/angular/services/lib/github_url_service.js-719084a625f60d20c24097f00813b481.es6 +53 -0
  317. data/public/assets/angular/services/lib/keyword_completer.js-560b51694457619401c72431dd7b647e.es6 +36 -0
  318. data/public/assets/angular/services/lib/local_resource.js-9b57357ed203c783708e48154721242a.es6 +20 -0
  319. data/public/assets/angular/services/lib/lock_service.js-32eb33fda9c27fb5643b25c63099b52c.es6 +48 -0
  320. data/public/assets/angular/services/lib/locking_poll_service.js-d0271cc07d20ec73291e7175e1714d42.es6 +42 -0
  321. data/public/assets/angular/services/lib/matcher_runner.js-bd63f4c6ad965716c5b793d3c4602563.es6 +65 -0
  322. data/public/assets/angular/services/lib/navigation_guard.js-5c7497900f99319f3ef76b83662c20cd.es6 +45 -0
  323. data/public/assets/angular/services/lib/open_repl_service.js-2332490470ea58f3e5ce7f6fe5dd2659.es6 +56 -0
  324. data/public/assets/angular/services/lib/page_title_manager.js-227f9ddb49d23bfa934bf216ef96ccbd.es6 +38 -0
  325. data/public/assets/angular/services/lib/pagination.js-baa9a496d01b87f90c588c51864d1533.es6 +114 -0
  326. data/public/assets/angular/services/lib/pagination_components.js-4fcc03120d1299713347b487f1e8fd44.es6 +91 -0
  327. data/public/assets/angular/services/lib/parameter_methods.js-16ecb25ffb24d5870dfc17f9f408fa5b.es6 +35 -0
  328. data/public/assets/angular/services/lib/role_model.js-3d5072f279676294e7d17cbb4bb3adb5.es6 +21 -0
  329. data/public/assets/angular/services/lib/schema_completer.js-d04d49642967fd9f8e2c95e0df81f2ae.es6 +56 -0
  330. data/public/assets/angular/services/lib/selection_tag_input.js-86cc6d564c108d722951b6fcd2b51221.es6 +42 -0
  331. data/public/assets/angular/services/lib/server_configurations.js-fd8c16a3d02926e7597240566808c141.es6 +15 -0
  332. data/public/assets/angular/services/lib/spinner_state.js-315bb62df18f9370a89f8b865eb1766a.es6 +45 -0
  333. data/public/assets/angular/services/lib/tag_resource.js-8849bbdd579bd38b36a362bed926c2f2.es6 +14 -0
  334. data/public/assets/angular/services/model/collection_dirty_awareness.js-8a78450bd8b565fb03633ab735893508.es6 +33 -0
  335. data/public/assets/angular/services/model/collection_model_base.js-8092335acde425d28718c1a9fc677d39.es6 +75 -0
  336. data/public/assets/angular/services/model/dirty_aware_collection_model.js-6f4d2b409a033f5ffc6bd5a747df2046.es6 +31 -0
  337. data/public/assets/angular/services/model/dirty_aware_model.js-ec1a086f3ec459827dbd5381bd970975.es6 +50 -0
  338. data/public/assets/angular/services/model/model_base.js-9fd807dfdf4f26afe60d8e282ca08e6c.es6 +80 -0
  339. data/public/assets/angular/services/model/model_state.js-3e96e381ea7a9eff857081ffbf3a8bab.es6 +51 -0
  340. data/public/assets/angular/services/model/models.js-6798762a6e263be75c7c4e9f8a19da66.es6 +15 -0
  341. data/public/assets/angular/services/model/unpersisted_model.js-49597959c989e68c713fd826743bb7b5.es6 +20 -0
  342. data/public/assets/angular/services/model_generation/model_factory.js-0bccc6a2e9b4738c67230fc68d9780ae.es6 +28 -0
  343. data/public/assets/angular/services/model_generation/model_generation.js-f08c6eff199b5ad02b2e2bdf866d69ff.es6 +13 -0
  344. data/public/assets/angular/services/model_generation/model_manager.js-b05d8f00bc4499c50098ae31013de88c.es6 +86 -0
  345. data/public/assets/angular/services/model_generation/resource_factory.js-e8ce2f4be9383d885dbb965c8e425bab.es6 +38 -0
  346. data/public/assets/angular/services/model_generation/standard_collection_model.js-19c44dc3a937a85d825c5a2f020a6769.es6 +25 -0
  347. data/public/assets/angular/services/model_generation/standard_model.js-74439b041eebfc7e0fad454cf6e32192.es6 +38 -0
  348. data/public/assets/angular/services/query/query.js-7b6228d0a5c1a6ea76242f4aa49aafd0.es6 +55 -0
  349. data/public/assets/angular/services/query/query_handler.js-d8cb3c66bcf6d16cd13bb5bcd0921496.es6 +40 -0
  350. data/public/assets/angular/services/query/query_loader.js-1fbc8b859778d46b73b9adc300984851.es6 +54 -0
  351. data/public/assets/angular/services/query/query_request_transformers.js-522901477c7848324cd5c014005a85c8.es6 +26 -0
  352. data/public/assets/angular/services/query/query_resource.js-b809fbfd1c379619fa07ef8e52509810.es6 +21 -0
  353. data/public/assets/angular/services/query/query_tab.js-fe34f5e6d0c813d2d92838be14cd6783.es6 +63 -0
  354. data/public/assets/angular/services/query/query_versions.js-aa3aec9021354a7394797101ea500887.es6 +21 -0
  355. data/public/assets/angular/services/result/result.js-be8178c80c767a651a97537b2b0149d5.es6 +26 -0
  356. data/public/assets/angular/services/result/result_poller.js-b15617d53f164cbe5636bb5573a70504.es6 +30 -0
  357. data/public/assets/angular/services/result/result_runner.js-ce2c5b3121c8e67903c302e600749c14.es6 +48 -0
  358. data/public/assets/angular/services/result/results.js-53088d6088f6b4783b274a64322d361c.es6 +10 -0
  359. data/public/assets/angular/services/schema/schema_column.js-3908faecc9874fa08484d7490701a7d4.es6 +93 -0
  360. data/public/assets/angular/services/schema/schema_column_resource.js-a6982ce9698b104192c4e455300df455.es6 +12 -0
  361. data/public/assets/angular/services/schema/schema_columns.js-c63a16e2e0778a885bd27c7cf2ed7d88.es6 +57 -0
  362. data/public/assets/angular/services/schema/schema_comment_resource.js-20254ea1a4e7b4850c9f21f9619130ce.es6 +12 -0
  363. data/public/assets/angular/services/services.js-6225c5ea24a9082506d1932d7884b53b.es6 +140 -0
  364. data/public/assets/angular/services/snippet/ace_snippet_manager.js-dbbba5d8ad5040042b469b294c4d7228.es6 +44 -0
  365. data/public/assets/angular/services/visualization/source_renderer.js-d7274c88b067a35f2e91bf7f39be7d47.es6 +70 -0
  366. data/public/assets/angular/services/visualization/visualization.js-23e36c87721aa263dd3f99769027cabb.es6 +47 -0
  367. data/public/assets/angular/services/visualization/visualization_service.js-25de86b5ceef60cf2b1dfde5fb0e9216.es6 +67 -0
  368. data/public/assets/angular/services/visualization/visualizations.js-1227bc3dcd67e85c8050d82360a26d53.es6 +11 -0
  369. data/public/assets/application-9153e0bf570016651e5eb8c67e037d3a.css +10 -0
  370. data/public/assets/application-ef5c2ae95804ac9785f190a9aea7ad8b.js +149 -0
  371. data/public/assets/bootstrap/glyphicons-halflings-regular-448c34a56d699c29117adc64c43affeb.woff2 +0 -0
  372. data/public/assets/bootstrap/glyphicons-halflings-regular-89889688147bd7575d6327160d64e760.svg +288 -0
  373. data/public/assets/bootstrap/glyphicons-halflings-regular-e18bbf611f2a2e43afc071aa2f4e1512.ttf +0 -0
  374. data/public/assets/bootstrap/glyphicons-halflings-regular-f4769f9bdb7466be65088239c12046d1.eot +0 -0
  375. data/public/assets/bootstrap/glyphicons-halflings-regular-fa2772327f55d8198301fdb8bcfc8158.woff +0 -0
  376. data/public/assets/fontawesome-webfont-4f0022f25672c7f501c339cbf98d9117.ttf +0 -0
  377. data/public/assets/fontawesome-webfont-776d58f453c8fe5d6a89e9c31ee223ff.svg +504 -0
  378. data/public/assets/fontawesome-webfont-90186830c9c50a0fed932494581761d9.eot +0 -0
  379. data/public/assets/fontawesome-webfont-926c93d201fe51c8f351e858468980c3.woff2 +0 -0
  380. data/public/assets/fontawesome-webfont-fdf491ce5ff5b2da02708cd0e9864719.woff +0 -0
  381. data/public/assets/glyphicons-halflings-regular-0a5c48c69a25a93e37ed62db813387fa.svg +229 -0
  382. data/public/assets/glyphicons-halflings-regular-47da44498fc073d9fff9ab0cdb0bef8e.ttf +0 -0
  383. data/public/assets/glyphicons-halflings-regular-5eae1f7217b606d3580dd70ac840fea1.woff +0 -0
  384. data/public/assets/glyphicons-halflings-regular-aa16cd35628e6dddf56e766c9aa4ae63.eot +0 -0
  385. data/public/assets/jquery-ui/ui-bg_flat_0_aaaaaa_40x100-2a44fbdb7360c60122bcf6dcef0387d8.png +0 -0
  386. data/public/assets/jquery-ui/ui-bg_flat_75_ffffff_40x100-8692e6efddf882acbff144c38ea7dfdf.png +0 -0
  387. data/public/assets/jquery-ui/ui-bg_glass_55_fbf9ee_1x400-f8f4558e0b92ff2cd6136781533902ec.png +0 -0
  388. data/public/assets/jquery-ui/ui-bg_glass_65_ffffff_1x400-e5a8f32e28fd5c27bf0fed33c8a8b9b5.png +0 -0
  389. data/public/assets/jquery-ui/ui-bg_glass_75_dadada_1x400-c12c6510dad3ebfa64c8a30e959a2469.png +0 -0
  390. data/public/assets/jquery-ui/ui-bg_glass_75_e6e6e6_1x400-f4254356c2a8c9a383205ef2c4de22c4.png +0 -0
  391. data/public/assets/jquery-ui/ui-bg_glass_95_fef1ec_1x400-5a3be2d8fff8324d59aec3df7b0a0c83.png +0 -0
  392. data/public/assets/jquery-ui/ui-bg_highlight-soft_75_cccccc_1x100-72c593d16e998952cd8d798fee33c6f3.png +0 -0
  393. data/public/assets/jquery-ui/ui-icons_222222_256x240-9129e086dc488d8bcaf808510bc646ba.png +0 -0
  394. data/public/assets/jquery-ui/ui-icons_2e83ff_256x240-25162bf857a8eb83ea932a58436e1049.png +0 -0
  395. data/public/assets/jquery-ui/ui-icons_454545_256x240-771099482bdc1571ece41073b1752596.png +0 -0
  396. data/public/assets/jquery-ui/ui-icons_888888_256x240-faf6f5dc44e713178784c1fb053990aa.png +0 -0
  397. data/public/assets/jquery-ui/ui-icons_cd0a0a_256x240-5d8808d43cefca6f6781a5316d176632.png +0 -0
  398. data/public/assets/octicons-0a82c1edade24862533bbe96ebeaea47.eot +0 -0
  399. data/public/assets/octicons-103abd6cc0199e2519ef6f1aac4bb0e0.ttf +0 -0
  400. data/public/assets/octicons-adc17600a2b7a648eba306c2e1426b85.svg +183 -0
  401. data/public/assets/octicons-be82065223a03ba577de159d97a5d63d.woff +0 -0
  402. data/public/assets/octicons-local-72e4167c13648cb89e9e96cdd212cb82.ttf +0 -0
  403. data/public/assets/rails_admin/aristo/images/bg_fallback-a7547e71656b1e538b93ddb49dfc98d3.png +0 -0
  404. data/public/assets/rails_admin/aristo/images/icon_sprite-415c1eec8a2d31d217d4d1d5a1d44345.png +0 -0
  405. data/public/assets/rails_admin/aristo/images/progress_bar-449b2fab5cf4122c17a416f6e26569fe.gif +0 -0
  406. data/public/assets/rails_admin/aristo/images/slider_handles-ba57b6efb64ca6263f77ce2624ad71ee.png +0 -0
  407. data/public/assets/rails_admin/aristo/images/ui-icons_222222_256x240-a2c05c5e967f9cf4dae51c1243b3b93c.png +0 -0
  408. data/public/assets/rails_admin/aristo/images/ui-icons_454545_256x240-a7a7eff72c4f562524dc472824aab656.png +0 -0
  409. data/public/assets/rails_admin/base/README-f7dd742c2237cb1959438b94c7503a41.txt +2 -0
  410. data/public/assets/rails_admin/bootstrap/glyphicons-halflings-d4fef5262f29f592560fb59918a1c052.png +0 -0
  411. data/public/assets/rails_admin/bootstrap/glyphicons-halflings-white-9bbc6e9602998a385c2ea13df56470fd.png +0 -0
  412. data/public/assets/rails_admin/bullet_black-06d345566cf9e0f97a23bb07ab3d50d9.png +0 -0
  413. data/public/assets/rails_admin/bullet_white-469b537fa21b7143f719578f7426825d.png +0 -0
  414. data/public/assets/rails_admin/calendar-697f5a44753da70028cfd04b98ac45d2.png +0 -0
  415. data/public/assets/rails_admin/clock-0cc82b549af3df4f730a02335f54b0df.png +0 -0
  416. data/public/assets/rails_admin/colorpicker/colorpicker_background-7aaa2a726200c0ac3ba43c01f073a93d.png +0 -0
  417. data/public/assets/rails_admin/colorpicker/colorpicker_hex-cbc06f4015cbb276a3dd966e1be37c25.png +0 -0
  418. data/public/assets/rails_admin/colorpicker/colorpicker_hsb_b-2315aba3c2fbbcfcc22869b21836c31d.png +0 -0
  419. data/public/assets/rails_admin/colorpicker/colorpicker_hsb_h-3120023551e3601467cf52e1c8aaae9e.png +0 -0
  420. data/public/assets/rails_admin/colorpicker/colorpicker_hsb_s-77a77892bdef0906fdfc3426d06108fd.png +0 -0
  421. data/public/assets/rails_admin/colorpicker/colorpicker_indic-f485d07540a89502e36dc1a55cec05d0.gif +0 -0
  422. data/public/assets/rails_admin/colorpicker/colorpicker_overlay-4b2dd6f78c4aac5cc932e845698b2db5.png +0 -0
  423. data/public/assets/rails_admin/colorpicker/colorpicker_rgb_b-2315aba3c2fbbcfcc22869b21836c31d.png +0 -0
  424. data/public/assets/rails_admin/colorpicker/colorpicker_rgb_g-475afe3f4f69e59ff30a445384a8d961.png +0 -0
  425. data/public/assets/rails_admin/colorpicker/colorpicker_rgb_r-02de28945293fe2fd026c9be3b89955a.png +0 -0
  426. data/public/assets/rails_admin/colorpicker/colorpicker_select-cdf55197d05f18c552dc35bdb858fa2a.gif +0 -0
  427. data/public/assets/rails_admin/colorpicker/colorpicker_submit-9912e5cf348e0be359ff9b1078fbb7da.png +0 -0
  428. data/public/assets/rails_admin/colorpicker/custom_background-a0ab8ff3e2b85b1f8ed5a4d86967471b.png +0 -0
  429. data/public/assets/rails_admin/colorpicker/custom_hex-065e780d7b89f7dda63a472caa7c2bdd.png +0 -0
  430. data/public/assets/rails_admin/colorpicker/custom_hsb_b-66f5963cf1a0a2680acbcac2bb77f40d.png +0 -0
  431. data/public/assets/rails_admin/colorpicker/custom_hsb_h-cd1f2e27122aeca17af416f328b758cd.png +0 -0
  432. data/public/assets/rails_admin/colorpicker/custom_hsb_s-ca6f3e4f0c1fc2cb110c788018369e07.png +0 -0
  433. data/public/assets/rails_admin/colorpicker/custom_indic-04660eb352eb259581a36a0fe8da2d4d.gif +0 -0
  434. data/public/assets/rails_admin/colorpicker/custom_rgb_b-64bc0c5110f84efe32e82c58d50660f6.png +0 -0
  435. data/public/assets/rails_admin/colorpicker/custom_rgb_g-33fe011475956750a457b1f93f1b9075.png +0 -0
  436. data/public/assets/rails_admin/colorpicker/custom_rgb_r-18f2ee37089d850c52b212d8a31aac92.png +0 -0
  437. data/public/assets/rails_admin/colorpicker/custom_submit-9d0a14eebb9ae04edfb8099827a42968.png +0 -0
  438. data/public/assets/rails_admin/colorpicker/select-76bd5c10f34de24b73ff4454735d3e18.png +0 -0
  439. data/public/assets/rails_admin/colorpicker/select2-d3fea9a451ac2c29bcd4a82b6e4f326a.png +0 -0
  440. data/public/assets/rails_admin/colorpicker/slider-db040ce7280fc74269e330a862e738e6.png +0 -0
  441. data/public/assets/rails_admin/jquery.colorpicker-7c36c2fac54a031f6e0dfe6ad137cfb1.js +1 -0
  442. data/public/assets/rails_admin/jquery.colorpicker-e402a30af31a4ba5957fec816dc9239c.css +1 -0
  443. data/public/assets/rails_admin/logo-9b479a57b493ee824767163101a5409f.png +0 -0
  444. data/public/assets/rails_admin/magnifier-4fcdfd820ff2e951458af3d1309ab20c.png +0 -0
  445. data/public/assets/rails_admin/multiselect/icon_sprite-415c1eec8a2d31d217d4d1d5a1d44345.png +0 -0
  446. data/public/assets/rails_admin/multiselect/ui-icon-circle-triangle-n-dark-32c1cfdd900379bf62658e475fb2ba38.png +0 -0
  447. data/public/assets/rails_admin/multiselect/ui-icon-circle-triangle-n-light-73160d919a189ba13bd4387e3623b7e9.png +0 -0
  448. data/public/assets/rails_admin/multiselect/ui-icon-circle-triangle-s-dark-c15e6bff59c80c5473236cf77870f31d.png +0 -0
  449. data/public/assets/rails_admin/multiselect/ui-icon-circle-triangle-s-light-fbf43811420f67d49d4dc64c7817f72c.png +0 -0
  450. data/public/assets/rails_admin/rails_admin-d25a684b9f690652469ceb212fbe7b95.js +328 -0
  451. data/public/assets/rails_admin/rails_admin-d85fb3c8bbff377491ed5af5239cf185.css +8 -0
  452. data/public/assets/resque_web/application-b29b34115c3ad5c539f26114fc91e584.css +4 -0
  453. data/public/assets/resque_web/application-d2bc6e68cf7c6215e804fe9e3f46f1d0.js +111 -0
  454. data/public/assets/resque_web/idle-53474088772d9917bd463b19efa32fc3.png +0 -0
  455. data/public/assets/resque_web/lifebuoy-0281230b31ba4078685f4df3e8169534.png +0 -0
  456. data/public/assets/resque_web/poll-af53f85832c41a9cde68b08cb09711f1.png +0 -0
  457. data/public/assets/resque_web/rails-9c0a079bdd7701d7e729bd956823d153.png +0 -0
  458. data/public/assets/resque_web/working-26a36c5119cbdcc64ebade2c5f8c389d.png +0 -0
  459. data/public/assets/twitter/bootstrap/glyphicons-halflings-2516339970d710819585f90773aebe0a.png +0 -0
  460. data/public/assets/twitter/bootstrap/glyphicons-halflings-white-9bbc6e9602998a385c2ea13df56470fd.png +0 -0
  461. data/public/bg_big.svg +2 -0
  462. data/public/bg_new.svg +2 -0
  463. data/public/favicon.ico +0 -0
  464. data/public/resources/keyword_config.json +51 -0
  465. data/public/resources/visualization/area.html +17 -0
  466. data/public/resources/visualization/area_step.html +17 -0
  467. data/public/resources/visualization/bar.html +17 -0
  468. data/public/resources/visualization/custom.html +6 -0
  469. data/public/resources/visualization/line.html +16 -0
  470. data/public/resources/visualization/presets.json +13 -0
  471. data/public/resources/visualization/scatter.html +17 -0
  472. data/public/resources/visualization/spline.html +17 -0
  473. data/public/resources/visualization/spline_area.html +17 -0
  474. data/public/resources/visualization/stacked_area.html +18 -0
  475. data/public/resources/visualization/stacked_bar.html +18 -0
  476. data/public/resources/visualization/stacked_spline_area.html +18 -0
  477. data/public/resources/visualization/template.json +12 -0
  478. data/public/robots.txt +2 -0
  479. data/vendor/assets/javascripts/ace/ace.js +18655 -0
  480. data/vendor/assets/javascripts/ace/ext-language_tools.js +1937 -0
  481. data/vendor/assets/javascripts/ace/mode-html.js +2794 -0
  482. data/vendor/assets/javascripts/ace/mode-pgsql.js +1503 -0
  483. data/vendor/assets/javascripts/ace/snippets/coffee.js +102 -0
  484. data/vendor/assets/javascripts/ace/snippets/css.js +974 -0
  485. data/vendor/assets/javascripts/ace/snippets/haml.js +27 -0
  486. data/vendor/assets/javascripts/ace/snippets/html.js +835 -0
  487. data/vendor/assets/javascripts/ace/snippets/html_elixir.js +7 -0
  488. data/vendor/assets/javascripts/ace/snippets/html_ruby.js +7 -0
  489. data/vendor/assets/javascripts/ace/snippets/javascript.js +202 -0
  490. data/vendor/assets/javascripts/ace/snippets/json.js +7 -0
  491. data/vendor/assets/javascripts/ace/snippets/jsp.js +106 -0
  492. data/vendor/assets/javascripts/ace/snippets/jsx.js +7 -0
  493. data/vendor/assets/javascripts/ace/snippets/less.js +7 -0
  494. data/vendor/assets/javascripts/ace/snippets/mysql.js +7 -0
  495. data/vendor/assets/javascripts/ace/snippets/pgsql.js +7 -0
  496. data/vendor/assets/javascripts/ace/snippets/plain_text.js +7 -0
  497. data/vendor/assets/javascripts/ace/snippets/rhtml.js +7 -0
  498. data/vendor/assets/javascripts/ace/snippets/sass.js +7 -0
  499. data/vendor/assets/javascripts/ace/snippets/scss.js +7 -0
  500. data/vendor/assets/javascripts/ace/snippets/snippets.js +16 -0
  501. data/vendor/assets/javascripts/ace/snippets/sql.js +33 -0
  502. data/vendor/assets/javascripts/ace/snippets/sqlserver.js +76 -0
  503. data/vendor/assets/javascripts/ace/snippets/svg.js +7 -0
  504. data/vendor/assets/javascripts/ace/snippets/text.js +7 -0
  505. data/vendor/assets/javascripts/ace/snippets/textile.js +37 -0
  506. data/vendor/assets/javascripts/ace/theme-monokai.js +105 -0
  507. data/vendor/assets/javascripts/angular-filter/angular-filter.js +2271 -0
  508. data/vendor/assets/javascripts/angular-hotkeys/hotkeys.js +1523 -0
  509. data/vendor/assets/javascripts/angular-selection-model/selection-model.js +563 -0
  510. data/vendor/assets/javascripts/angular-spinner/treasure-overlay-spinner.js +53 -0
  511. data/vendor/assets/javascripts/angular-ui-ace/ui-ace.js +298 -0
  512. data/vendor/assets/javascripts/angular-ui-bootstrap/ui-bootstrap-tpls-0.14.3.js +8503 -0
  513. data/vendor/assets/javascripts/d3/c3.min.js +5 -0
  514. data/vendor/assets/javascripts/d3/d3.v3.min.js +5 -0
  515. data/vendor/assets/javascripts/infinite-scroll/infinite-scroll.js +186 -0
  516. data/vendor/assets/javascripts/ng-clip/ngClip.js +84 -0
  517. data/vendor/assets/javascripts/ng-tags-input/ng-tags-input.min.js +1 -0
  518. data/vendor/assets/javascripts/pluralize/pluralize.js +453 -0
  519. data/vendor/assets/javascripts/underscore-js/underscore.js +1548 -0
  520. data/vendor/assets/stylesheets/angular-hotkeys/hotkeys.css +110 -0
  521. data/vendor/assets/stylesheets/angular-spinner/treasure-overlay-spinner.css +136 -0
  522. data/vendor/assets/stylesheets/c3/c3.min.css +1 -0
  523. data/vendor/assets/stylesheets/ng-tags-input/ng-tags-input.bootstrap.min.css +1 -0
  524. data/vendor/assets/stylesheets/ng-tags-input/ng-tags-input.min.css +1 -0
  525. data/vendor/assets/stylesheets/octicons/README.md +1 -0
  526. data/vendor/assets/stylesheets/octicons/sprockets-octicons.scss +217 -0
  527. metadata +600 -0
@@ -0,0 +1,26 @@
1
+ # Be sure to restart your server when you modify this file.
2
+
3
+ # Your secret key is used for verifying the integrity of signed cookies.
4
+ # If you change this key, all old signed cookies will become invalid!
5
+
6
+ # Make sure the secret is at least 30 characters and all random,
7
+ # no regular words or you'll be exposed to dictionary attacks.
8
+ # You can use `rake secret` to generate a secure secret key.
9
+
10
+ # Make sure the secrets in this file are kept private
11
+ # if you're sharing your code publicly.
12
+
13
+ playground:
14
+ secret_key_base: 9e7c5bc270eea113a263a475bd38c97fb2f5691e4b1cd2d7155f46a4df770c6005edfc032815a98c830fd5dc9c3935193279ab33bca8aa81bc567585232c0847
15
+
16
+ development:
17
+ secret_key_base: cb9a5aecfb471728b1d2eee49c26ccf648388e0e709f683b4d2dd2a57a4a1c5dde88a8d852143f524f1fb33b9ee3beac306cb64f7ec365340bbb8b72bbbe71ca
18
+
19
+ test:
20
+ secret_key_base: 6e430dd05a2077ca4c4e4920e9334c5c68d136aae42d4eca6f438228e15b871c0ffc08f9ff3d320358be23bf0bb7748282ac55a306f581bf567420067e133f15
21
+
22
+ staging:
23
+ secret_key_base: <%= ENV["SECRET_KEY_BASE"] %>
24
+
25
+ production:
26
+ secret_key_base: <%= ENV["SECRET_KEY_BASE"] %>
data/config.ru ADDED
@@ -0,0 +1,4 @@
1
+ # This file is used by Rack-based servers to start the application.
2
+
3
+ require ::File.expand_path('../config/environment', __FILE__)
4
+ run Aleph::Application
@@ -0,0 +1,150 @@
1
+ class DatabaseBegin < ActiveRecord::Migration
2
+ def change
3
+ # These are extensions that must be enabled in order to support this database
4
+ enable_extension "plpgsql"
5
+
6
+ create_table "alerts", force: :cascade do |t|
7
+ t.string "status"
8
+ t.string "comparator"
9
+ t.integer "target"
10
+ t.integer "query_id"
11
+ t.string "email"
12
+ t.text "error_message"
13
+ t.integer "last_alert_result_id"
14
+ t.datetime "created_at"
15
+ t.datetime "updated_at"
16
+ t.text "description"
17
+ end
18
+
19
+ create_table "queries", force: :cascade do |t|
20
+ t.string "title"
21
+ t.datetime "created_at"
22
+ t.datetime "updated_at"
23
+ t.text "latest_body"
24
+ t.datetime "deleted_at"
25
+ end
26
+
27
+ create_table "query_roles", force: :cascade do |t|
28
+ t.integer "query_id"
29
+ t.string "role"
30
+ end
31
+
32
+ add_index "query_roles", ["query_id"], name: "index_query_roles_on_query_id", using: :btree
33
+
34
+ create_table "query_versions", force: :cascade do |t|
35
+ t.integer "query_id"
36
+ t.integer "version"
37
+ t.datetime "created_at"
38
+ t.datetime "updated_at"
39
+ t.string "blob_sha", limit: 40
40
+ t.text "parameters"
41
+ t.text "comment"
42
+ t.datetime "deleted_at"
43
+ t.text "body"
44
+ t.string "commit_sha", limit: 40
45
+ t.string "tree_sha", limit: 40
46
+ t.integer "user_id"
47
+ end
48
+
49
+ add_index "query_versions", ["query_id", "version"], name: "index_query_versions_on_query_id_and_version", using: :btree
50
+ add_index "query_versions", ["user_id"], name: "index_query_versions_on_user_id", using: :btree
51
+
52
+ create_table "results", force: :cascade do |t|
53
+ t.datetime "created_at"
54
+ t.datetime "updated_at"
55
+ t.string "status"
56
+ t.text "error_message"
57
+ t.integer "query_version_id"
58
+ t.text "sample_data"
59
+ t.integer "row_count"
60
+ t.text "parameters"
61
+ t.text "headers"
62
+ t.text "compiled_body"
63
+ t.datetime "started_at"
64
+ t.datetime "deleted_at"
65
+ t.integer "owner_id"
66
+ t.datetime "completed_at"
67
+ end
68
+
69
+ add_index "results", ["query_version_id"], name: "index_results_on_query_version_id", using: :btree
70
+
71
+ create_table "schema_comments", force: :cascade do |t|
72
+ t.string "target_type"
73
+ t.string "schema"
74
+ t.string "table"
75
+ t.string "column"
76
+ t.text "text"
77
+ t.integer "user_id"
78
+ end
79
+
80
+ add_index "schema_comments", ["schema"], name: "index_schema_comments_on_schema", using: :btree
81
+
82
+ create_table "sessions", force: :cascade do |t|
83
+ t.string "session_id", null: false
84
+ t.text "data"
85
+ t.datetime "created_at"
86
+ t.datetime "updated_at"
87
+ end
88
+
89
+ add_index "sessions", ["session_id"], name: "index_sessions_on_session_id", using: :btree
90
+ add_index "sessions", ["updated_at"], name: "index_sessions_on_updated_at", using: :btree
91
+
92
+ create_table "snippets", force: :cascade do |t|
93
+ t.string "name"
94
+ t.text "content"
95
+ t.datetime "created_at", null: false
96
+ t.datetime "updated_at", null: false
97
+ t.integer "user_id"
98
+ end
99
+
100
+ add_index "snippets", ["user_id"], name: "index_snippets_on_user_id", using: :btree
101
+
102
+ create_table "taggings", force: :cascade do |t|
103
+ t.integer "tag_id"
104
+ t.integer "taggable_id"
105
+ t.string "taggable_type"
106
+ t.integer "tagger_id"
107
+ t.string "tagger_type"
108
+ t.string "context", limit: 128
109
+ t.datetime "created_at"
110
+ end
111
+
112
+ add_index "taggings", ["tag_id", "taggable_id", "taggable_type", "context", "tagger_id", "tagger_type"], name: "taggings_idx", unique: true, using: :btree
113
+ add_index "taggings", ["taggable_id", "taggable_type", "context"], name: "index_taggings_on_taggable_id_and_taggable_type_and_context", using: :btree
114
+
115
+ create_table "tags", force: :cascade do |t|
116
+ t.string "name"
117
+ t.integer "taggings_count", default: 0
118
+ end
119
+
120
+ add_index "tags", ["name"], name: "index_tags_on_name", unique: true, using: :btree
121
+
122
+ create_table "users", force: :cascade do |t|
123
+ t.string "name"
124
+ t.string "email", default: "", null: false
125
+ t.string "encrypted_password", default: "", null: false
126
+ t.datetime "remember_created_at"
127
+ t.string "role"
128
+ end
129
+
130
+ create_table "versions", force: :cascade do |t|
131
+ t.string "item_type", null: false
132
+ t.integer "item_id", null: false
133
+ t.string "event", null: false
134
+ t.string "whodunnit"
135
+ t.text "object"
136
+ t.datetime "created_at"
137
+ end
138
+
139
+ add_index "versions", ["item_type", "item_id"], name: "index_versions_on_item_type_and_item_id", using: :btree
140
+
141
+ create_table "visualizations", force: :cascade do |t|
142
+ t.integer "query_version_id"
143
+ t.text "html_source"
144
+ t.string "title"
145
+ end
146
+
147
+ add_index "visualizations", ["query_version_id"], name: "index_visualizations_on_query_version_id", using: :btree
148
+
149
+ end
150
+ end
@@ -0,0 +1,5 @@
1
+ class AlephLogFormatter < Logger::Formatter
2
+ def call(severity, timestamp, _progname, msg)
3
+ "#{timestamp.to_formatted_s(:db)} #{severity} #{msg}\n"
4
+ end
5
+ end
@@ -0,0 +1,17 @@
1
+ module Authentication
2
+ class << self
3
+ ACCEPTABLE_TYPES = %w(
4
+ saml
5
+ database
6
+ disabled
7
+ ).freeze
8
+
9
+ def type
10
+ raise 'auth_type must be present in config.yml' unless APP_CONFIG['auth_type']
11
+ unless ACCEPTABLE_TYPES.include?(APP_CONFIG['auth_type'])
12
+ raise "Unacceptable auth_type, valid types are: #{ACCEPTABLE_TYPES.join(',')}"
13
+ end
14
+ APP_CONFIG['auth_type'].try(:inquiry)
15
+ end
16
+ end
17
+ end
data/lib/aws_s3.rb ADDED
@@ -0,0 +1,7 @@
1
+ module AwsS3
2
+ class << self
3
+ def resource
4
+ @s3 ||= Aws::S3::Resource.new(region: 'us-east-1')
5
+ end
6
+ end
7
+ end
data/lib/clock.rb ADDED
@@ -0,0 +1,7 @@
1
+ require 'clockwork'
2
+ require './config/boot'
3
+ require './config/environment'
4
+
5
+ module Clockwork
6
+ every(1.day, 'AlertJob', at: '06:00', tz: 'Pacific Time (US & Canada)') { Alert.run_all }
7
+ end
@@ -0,0 +1,50 @@
1
+ class CompilableParameter
2
+ attr_reader :name, :type, :default_value
3
+
4
+ class CompilerArgumentError < ArgumentError; end
5
+
6
+ def initialize(option)
7
+ option = option.stringify_keys
8
+ @name = option['name']
9
+ @type = option['type']
10
+ @default_value = option['default']
11
+ end
12
+
13
+ def compile(provided_value)
14
+ value = provided_value.blank? ? default_value : provided_value
15
+ process(value)
16
+ end
17
+
18
+ private
19
+
20
+ def process(value)
21
+ case type
22
+ when 'raw'
23
+ value
24
+ when 'string'
25
+ as_string(value)
26
+ when 'number'
27
+ value.to_f.to_s
28
+ when 'date'
29
+ sql_cast(as_string(parse_time(value).strftime('%Y-%m-%d')), 'DATE')
30
+ when 'timestamp'
31
+ sql_cast(as_string(parse_time(value).utc.iso8601(3)), 'TIMESTAMP')
32
+ else
33
+ raise CompilerArgumentError, "Unknown parameter type #{type}"
34
+ end
35
+ end
36
+
37
+ def parse_time(value)
38
+ parsed = Chronic.parse(value)
39
+ return parsed if parsed
40
+ raise CompilerArgumentError, "Value #{value} is unparseable as time"
41
+ end
42
+
43
+ def as_string(raw)
44
+ "'#{raw.gsub(/'/, '\'\'')}'"
45
+ end
46
+
47
+ def sql_cast(value, type)
48
+ "(#{type} #{value})"
49
+ end
50
+ end
@@ -0,0 +1,26 @@
1
+ class CountPublisher
2
+ INCREMENT_SIZE = 1000
3
+
4
+ def initialize(redis_row_count)
5
+ @redis_row_count = redis_row_count
6
+ @redis = Redis.current
7
+ end
8
+
9
+ def callbacks
10
+ { during_execute: publish_ongoing, after_execute: expire_count }
11
+ end
12
+
13
+ private
14
+
15
+ def publish_ongoing
16
+ lambda do |_row, row_count|
17
+ if row_count % INCREMENT_SIZE == 0
18
+ @redis_row_count.increment_count_by(INCREMENT_SIZE)
19
+ end
20
+ end
21
+ end
22
+
23
+ def expire_count
24
+ ->(_row_count) { @redis_row_count.expire }
25
+ end
26
+ end
@@ -0,0 +1,30 @@
1
+ module CsvHelper
2
+ class Aws < Base
3
+ S3_BUCKET = APP_CONFIG['s3_bucket']
4
+ S3_FOLDER = APP_CONFIG['s3_folder'] || 'results'
5
+
6
+ def url
7
+ Pester.s3.retry do
8
+ obj = AwsS3.resource.bucket(S3_BUCKET).object(key)
9
+ if obj.exists?
10
+ obj.presigned_url(:get, response_content_disposition: "attachment; filename=result_#{@result_id}.csv", expires_in: 3600)
11
+ else
12
+ nil
13
+ end
14
+ end
15
+ end
16
+
17
+ def store!
18
+ Pester.s3.retry do
19
+ obj = AwsS3.resource.bucket(S3_BUCKET).object(key)
20
+ obj.upload_file(filepath)
21
+ end
22
+ end
23
+
24
+ private
25
+
26
+ def key
27
+ S3_FOLDER ? "#{S3_FOLDER}/#{filename}" : filename
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,20 @@
1
+ require 'fileutils'
2
+ module CsvHelper
3
+ class Base
4
+ CSV_RESULTS_DIR = '/tmp'
5
+
6
+ def initialize(result_id)
7
+ @result_id = result_id
8
+ @tmp_results_dir = File.join(Rails.root, CSV_RESULTS_DIR)
9
+ FileUtils.mkdir_p(@tmp_results_dir)
10
+ end
11
+
12
+ def filepath
13
+ File.join(@tmp_results_dir, filename)
14
+ end
15
+
16
+ def filename
17
+ "#{@result_id}.csv"
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,18 @@
1
+ require 'fileutils'
2
+ module CsvHelper
3
+ class Local < Base
4
+ attr_reader :url
5
+ LOCAL_RESULT_CSV = 'local_result_csvs'
6
+
7
+ def initialize(result_id)
8
+ super(result_id)
9
+ FileUtils.mkdir_p(File.join('public', LOCAL_RESULT_CSV))
10
+ @url = File.join(LOCAL_RESULT_CSV, filename)
11
+ @local_url = File.join('public', @url)
12
+ end
13
+
14
+ def store!
15
+ FileUtils.copy(filepath, @local_url)
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,23 @@
1
+ require 'csv'
2
+
3
+ class CsvSerializer
4
+ def self.load(csv_string)
5
+ # takes a CSV string, and returns an Array of Hashes
6
+ # the keys are the column names and the values are the values.
7
+ # keys and values will all be strings.
8
+
9
+ csv_table = CSV.parse(csv_string.present? ? csv_string : '', headers: :first_row)
10
+ csv_table.map { |csv_row| csv_row.to_hash }
11
+ end
12
+
13
+ def self.dump(data)
14
+ # takes something that behaves like an Array of Hashes, and returns a CSV string.
15
+
16
+ headers = data.try(:first).present? ? data.first.keys : []
17
+ CSV.generate(headers: headers, write_headers: true) do |csv|
18
+ data.try(:map) do |data_hash|
19
+ csv << headers.map { |key| data_hash[key] }
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,12 @@
1
+ class CsvService
2
+ attr_reader :service_impl
3
+ delegate :url, :store!, :filepath, :filename, to: :service_impl
4
+
5
+ def initialize(result_id)
6
+ if APP_CONFIG['s3_bucket']
7
+ @service_impl = CsvHelper::Aws.new(result_id)
8
+ else
9
+ @service_impl = CsvHelper::Local.new(result_id)
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,23 @@
1
+ module Github
2
+ module Blob
3
+ ENDPOINT = URI.join(Github::ROOT_ENDPOINT, 'repos/', "#{Github::OWNER}/", "#{Github::REPO}/", 'git/', 'blobs').to_s
4
+
5
+ def self.get(sha)
6
+ raise 'invalid sha #{sha} when retrieving github blob' unless Github.valid_sha?(sha)
7
+ resp = Github.get("#{ENDPOINT}/#{sha}")
8
+ raise "Github blob retrieve failed with http code: #{resp.code}" if resp.code != '200'
9
+ ActiveSupport::JSON.decode(resp.body)
10
+ end
11
+
12
+ def self.create(content, encoding='utf-8')
13
+ input = {
14
+ 'content' => content,
15
+ 'encoding' => encoding
16
+ }
17
+
18
+ resp = Github.post(ENDPOINT, input)
19
+ raise "Github blob POST failed with http code: #{resp.code}" if resp.code != '201'
20
+ ActiveSupport::JSON.decode(resp.body)['sha']
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,37 @@
1
+ module Github
2
+ module Commit
3
+ ENDPOINT = URI.join(Github::ROOT_ENDPOINT, 'repos/', "#{Github::OWNER}/", "#{Github::REPO}/", 'git/', 'commits').to_s
4
+
5
+ AUTHOR_KEYS = %w(
6
+ name
7
+ email
8
+ date
9
+ )
10
+
11
+ def self.get(sha)
12
+ raise 'invalid sha #{sha} when retrieving github commit' unless Github.valid_sha?(sha)
13
+ resp = Github.get("#{ENDPOINT}/#{sha}")
14
+ raise "Github commit retrieve failed with http code: #{resp.code}" if resp.code != '200'
15
+ ActiveSupport::JSON.decode(resp.body)
16
+ end
17
+
18
+ # @param - message: The commit message
19
+ # @param - tree: The SHA of the tree object this commit points to
20
+ # @param - parents: Array of strings.
21
+ # The SHAs of the commits that were the parents of this commit. If omitted or empty, the commit will be written as a root commit.
22
+ # For a single parent, an array of one SHA should be provided; for a merge commit, an array of more than one should be provided.
23
+ # @return - commit sha
24
+ def self.create(message, tree, parents, author={})
25
+ input = {
26
+ 'message' => message,
27
+ 'tree' => tree,
28
+ 'parents' => parents
29
+ }
30
+ author.slice!(*AUTHOR_KEYS)
31
+ input.merge!({'author' => author}) if author.present?
32
+ resp = Github.post(ENDPOINT, input)
33
+ raise "Github commit POST failed with http code: #{resp.code}" if resp.code != '201'
34
+ ActiveSupport::JSON.decode(resp.body)['sha']
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,94 @@
1
+ module Github
2
+ class Pusher
3
+ TREE_QUERY = %w(
4
+ SELECT
5
+ q.id as query_id, blob_sha
6
+ FROM queries q
7
+ JOIN (
8
+ SELECT
9
+ qv2.query_id, qv2.blob_sha FROM query_versions qv2
10
+ JOIN (
11
+ SELECT
12
+ query_id, max(version) max FROM query_versions group by 1
13
+ ) qv3
14
+ ON qv2.query_id=qv3.query_id
15
+ AND qv2.version = qv3.max
16
+ ) qv
17
+ ON q.id = qv.query_id
18
+ AND coalesce(qv.blob_sha, '') != ''
19
+ ).join(' ')
20
+
21
+ LAST_SHAS = %w(
22
+ SELECT
23
+ tree_sha, commit_sha
24
+ FROM query_versions
25
+ WHERE coalesce(tree_sha, '') != ''
26
+ AND coalesce(commit_sha, '') != ''
27
+ ORDER BY id DESC
28
+ LIMIT 1
29
+ ).join(' ')
30
+
31
+ def create_blob(body)
32
+ blob_sha = Blob.create(body)
33
+ raise "Error: invalid blob_sha #{blob_sha}" unless valid_sha?(blob_sha)
34
+ blob_sha
35
+ end
36
+
37
+ def create_tree(query_id, blob_sha, base_tree)
38
+ tree = {}
39
+ ActiveRecord::Base.connection.execute(TREE_QUERY).each do |query|
40
+ tree[query['query_id'].to_s] = to_tree_hash(query['query_id'], query['blob_sha'])
41
+ end
42
+ tree[query_id.to_s] = to_tree_hash(query_id, blob_sha)
43
+
44
+ tree_sha = Tree.create(tree.values, base_tree)
45
+ raise "Error: invalid tree_sha #{tree_sha}" unless valid_sha?(tree_sha)
46
+ tree_sha
47
+ end
48
+
49
+ def create_commit(query_id, tree_sha, parent_commit_sha, version, author, email)
50
+ author = {
51
+ 'name' => author,
52
+ 'email' => email,
53
+ 'date' => DateTime.now.utc.strftime('%Y-%m-%dT%H:%M:%SZ')
54
+ }
55
+
56
+ parents = parent_commit_sha.nil? ? [] : [parent_commit_sha]
57
+ commit_sha = Commit.create("Version #{version} for query #{query_id}", tree_sha, parents, author)
58
+ raise "Error: invalid commit_sha #{commit_sha}" unless valid_sha?(commit_sha)
59
+ commit_sha
60
+ end
61
+
62
+ def git_push(query_id, body, version, author, email)
63
+ last_shas = ActiveRecord::Base.connection.execute(LAST_SHAS).first
64
+ base_tree = nil
65
+ parent_commit_sha = nil
66
+ if last_shas
67
+ base_tree = last_shas['tree_sha']
68
+ parent_commit_sha = last_shas['commit_sha']
69
+ end
70
+
71
+ blob_sha = create_blob(body)
72
+ tree_sha = create_tree(query_id, blob_sha, base_tree)
73
+ commit_sha = create_commit(query_id, tree_sha, parent_commit_sha, version, author, email)
74
+ Refs.update(APP_CONFIG['github_ref'], commit_sha)
75
+
76
+ [blob_sha, commit_sha, tree_sha]
77
+ end
78
+
79
+ private
80
+
81
+ def valid_sha?(sha)
82
+ sha.size == 40 && sha =~ /^[0-9A-F]+$/i
83
+ end
84
+
85
+ def to_tree_hash(query_id, blob_sha)
86
+ {
87
+ 'path' => "query_#{query_id}",
88
+ 'mode' => '100644',
89
+ 'type' => 'blob',
90
+ 'sha' => blob_sha
91
+ }
92
+ end
93
+ end
94
+ end
@@ -0,0 +1,39 @@
1
+ module Github
2
+ module Refs
3
+ ENDPOINT = URI.join(Github::ROOT_ENDPOINT, 'repos/', "#{Github::OWNER}/", "#{Github::REPO}/", 'git/', 'refs').to_s
4
+
5
+ def self.get(ref)
6
+ resp = Github.get("#{ENDPOINT}/#{ref}")
7
+ raise "Github refs POST failed with http code: #{resp.code}" if resp.code != '200'
8
+ ActiveSupport::JSON.decode(resp.body)
9
+ end
10
+
11
+ def self.get_all
12
+ resp = Github.get(ENDPOINT)
13
+ raise "Github refs POST failed with http code: #{resp.code}" if resp.code != '200'
14
+ ActiveSupport::JSON.decode(resp.body)
15
+ end
16
+
17
+ def self.create(ref, sha)
18
+ ref = "refs/#{ref}"
19
+ params = {
20
+ 'ref' => ref,
21
+ 'sha' => sha
22
+ }
23
+
24
+ resp = Github.post(ENDPOINT, params)
25
+ raise "Github refs POST failed with http code: #{resp.code}" if resp.code != '201'
26
+ ActiveSupport::JSON.decode(resp.body)
27
+ end
28
+
29
+ def self.update(ref, sha)
30
+ params = {
31
+ 'sha' => sha,
32
+ 'force' => true
33
+ }
34
+ resp = Github.patch("#{ENDPOINT}/#{ref}", params)
35
+ raise "Github refs update failed with http code: #{resp.code}" if resp.code != '200'
36
+ ActiveSupport::JSON.decode(resp.body)
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,29 @@
1
+ module Github
2
+ module Tree
3
+ ENDPOINT = URI.join(Github::ROOT_ENDPOINT, 'repos/', "#{Github::OWNER}/", "#{Github::REPO}/", 'git/', 'trees').to_s
4
+
5
+ def self.get(sha, recursive=false)
6
+ raise 'invalid sha #{sha} when retrieving github tree' unless Github.valid_sha?(sha)
7
+ params = recursive ? { 'recursive' => 1 } : {}
8
+ resp = Github.get("#{ENDPOINT}/#{sha}", params)
9
+ raise "Github tree retrieve failed with http code: #{resp.code}" if resp.code != '200'
10
+ ActiveSupport::JSON.decode(resp.body)
11
+ end
12
+
13
+
14
+ # @param - tree: array of hashes. Objects (of path, mode, type, and sha) specifying a tree structure
15
+ # @param - base_tree: The SHA1 of the tree you want to update with new data. If you don’t set this, the commit will be created on top of everything;
16
+ # however, it will only contain your change, the rest of your files will show up as deleted.
17
+ def self.create(tree, base_tree)
18
+ return unless tree.instance_of?(Array)
19
+ params = {
20
+ 'base_tree' => base_tree,
21
+ 'tree' => tree
22
+ }
23
+
24
+ resp = Github.post(ENDPOINT, params)
25
+ raise "Github tree POST failed with http code: #{resp.code}\nBody is: #{resp.body}" if resp.code != '201'
26
+ ActiveSupport::JSON.decode(resp.body)['sha']
27
+ end
28
+ end
29
+ end