railsblazer 2.0.0

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 (107) hide show
  1. checksums.yaml +7 -0
  2. data/.gitattributes +1 -0
  3. data/.github/ISSUE_TEMPLATE.md +0 -0
  4. data/.gitignore +14 -0
  5. data/CHANGELOG.md +247 -0
  6. data/CONTRIBUTING.md +42 -0
  7. data/Gemfile +4 -0
  8. data/LICENSE.txt +22 -0
  9. data/README.md +855 -0
  10. data/Rakefile +1 -0
  11. data/app/assets/fonts/blazer/glyphicons-halflings-regular.eot +0 -0
  12. data/app/assets/fonts/blazer/glyphicons-halflings-regular.svg +288 -0
  13. data/app/assets/fonts/blazer/glyphicons-halflings-regular.ttf +0 -0
  14. data/app/assets/fonts/blazer/glyphicons-halflings-regular.woff +0 -0
  15. data/app/assets/fonts/blazer/glyphicons-halflings-regular.woff2 +0 -0
  16. data/app/assets/javascripts/blazer/Chart.js +14145 -0
  17. data/app/assets/javascripts/blazer/Sortable.js +1144 -0
  18. data/app/assets/javascripts/blazer/ace.js +6 -0
  19. data/app/assets/javascripts/blazer/ace/ace.js +11 -0
  20. data/app/assets/javascripts/blazer/ace/ext-language_tools.js +5 -0
  21. data/app/assets/javascripts/blazer/ace/mode-sql.js +1 -0
  22. data/app/assets/javascripts/blazer/ace/snippets/sql.js +1 -0
  23. data/app/assets/javascripts/blazer/ace/snippets/text.js +1 -0
  24. data/app/assets/javascripts/blazer/ace/theme-twilight.js +1 -0
  25. data/app/assets/javascripts/blazer/application.js +79 -0
  26. data/app/assets/javascripts/blazer/bootstrap.js +2366 -0
  27. data/app/assets/javascripts/blazer/chartkick.js +1693 -0
  28. data/app/assets/javascripts/blazer/daterangepicker.js +1505 -0
  29. data/app/assets/javascripts/blazer/fuzzysearch.js +24 -0
  30. data/app/assets/javascripts/blazer/highlight.pack.js +1 -0
  31. data/app/assets/javascripts/blazer/jquery.js +10308 -0
  32. data/app/assets/javascripts/blazer/jquery.stickytableheaders.js +263 -0
  33. data/app/assets/javascripts/blazer/jquery_ujs.js +469 -0
  34. data/app/assets/javascripts/blazer/moment-timezone.js +1007 -0
  35. data/app/assets/javascripts/blazer/moment.js +3043 -0
  36. data/app/assets/javascripts/blazer/queries.js +110 -0
  37. data/app/assets/javascripts/blazer/routes.js +23 -0
  38. data/app/assets/javascripts/blazer/selectize.js +3667 -0
  39. data/app/assets/javascripts/blazer/stupidtable.js +114 -0
  40. data/app/assets/javascripts/blazer/vue.js +7515 -0
  41. data/app/assets/stylesheets/blazer/application.css +198 -0
  42. data/app/assets/stylesheets/blazer/bootstrap.css.erb +6202 -0
  43. data/app/assets/stylesheets/blazer/daterangepicker-bs3.css +375 -0
  44. data/app/assets/stylesheets/blazer/github.css +125 -0
  45. data/app/assets/stylesheets/blazer/selectize.default.css +387 -0
  46. data/app/controllers/blazer/base_controller.rb +113 -0
  47. data/app/controllers/blazer/checks_controller.rb +56 -0
  48. data/app/controllers/blazer/dashboards_controller.rb +105 -0
  49. data/app/controllers/blazer/queries_controller.rb +337 -0
  50. data/app/helpers/blazer/base_helper.rb +57 -0
  51. data/app/mailers/blazer/check_mailer.rb +27 -0
  52. data/app/mailers/blazer/slack_notifier.rb +76 -0
  53. data/app/models/blazer/audit.rb +6 -0
  54. data/app/models/blazer/check.rb +104 -0
  55. data/app/models/blazer/connection.rb +5 -0
  56. data/app/models/blazer/dashboard.rb +13 -0
  57. data/app/models/blazer/dashboard_query.rb +9 -0
  58. data/app/models/blazer/query.rb +40 -0
  59. data/app/models/blazer/record.rb +5 -0
  60. data/app/views/blazer/_nav.html.erb +16 -0
  61. data/app/views/blazer/_variables.html.erb +102 -0
  62. data/app/views/blazer/check_mailer/failing_checks.html.erb +6 -0
  63. data/app/views/blazer/check_mailer/state_change.html.erb +47 -0
  64. data/app/views/blazer/checks/_form.html.erb +79 -0
  65. data/app/views/blazer/checks/edit.html.erb +1 -0
  66. data/app/views/blazer/checks/index.html.erb +43 -0
  67. data/app/views/blazer/checks/new.html.erb +1 -0
  68. data/app/views/blazer/dashboards/_form.html.erb +76 -0
  69. data/app/views/blazer/dashboards/edit.html.erb +1 -0
  70. data/app/views/blazer/dashboards/new.html.erb +1 -0
  71. data/app/views/blazer/dashboards/show.html.erb +47 -0
  72. data/app/views/blazer/queries/_form.html.erb +240 -0
  73. data/app/views/blazer/queries/edit.html.erb +2 -0
  74. data/app/views/blazer/queries/home.html.erb +152 -0
  75. data/app/views/blazer/queries/new.html.erb +2 -0
  76. data/app/views/blazer/queries/run.html.erb +165 -0
  77. data/app/views/blazer/queries/schema.html.erb +20 -0
  78. data/app/views/blazer/queries/show.html.erb +73 -0
  79. data/app/views/layouts/blazer/application.html.erb +24 -0
  80. data/blazer-0.0.1.gem +0 -0
  81. data/blazer.gemspec +27 -0
  82. data/config/routes.rb +16 -0
  83. data/lib/blazer.rb +223 -0
  84. data/lib/blazer/adapters/athena_adapter.rb +128 -0
  85. data/lib/blazer/adapters/base_adapter.rb +53 -0
  86. data/lib/blazer/adapters/bigquery_adapter.rb +68 -0
  87. data/lib/blazer/adapters/cassandra_adapter.rb +59 -0
  88. data/lib/blazer/adapters/drill_adapter.rb +28 -0
  89. data/lib/blazer/adapters/druid_adapter.rb +67 -0
  90. data/lib/blazer/adapters/elasticsearch_adapter.rb +46 -0
  91. data/lib/blazer/adapters/mongodb_adapter.rb +39 -0
  92. data/lib/blazer/adapters/presto_adapter.rb +45 -0
  93. data/lib/blazer/adapters/snowflake_adapter.rb +73 -0
  94. data/lib/blazer/adapters/sql_adapter.rb +182 -0
  95. data/lib/blazer/data_source.rb +195 -0
  96. data/lib/blazer/detect_anomalies.R +19 -0
  97. data/lib/blazer/engine.rb +30 -0
  98. data/lib/blazer/result.rb +170 -0
  99. data/lib/blazer/run_statement.rb +40 -0
  100. data/lib/blazer/run_statement_job.rb +21 -0
  101. data/lib/blazer/version.rb +3 -0
  102. data/lib/generators/blazer/install_generator.rb +39 -0
  103. data/lib/generators/blazer/templates/config.yml.tt +62 -0
  104. data/lib/generators/blazer/templates/install.rb.tt +46 -0
  105. data/lib/tasks/blazer.rake +11 -0
  106. data/railsblazer-0.0.1.gem +0 -0
  107. metadata +234 -0
@@ -0,0 +1,387 @@
1
+ /**
2
+ * selectize.default.css (v0.12.1) - Default Theme
3
+ * Copyright (c) 2013–2015 Brian Reavis & contributors
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this
6
+ * file except in compliance with the License. You may obtain a copy of the License at:
7
+ * http://www.apache.org/licenses/LICENSE-2.0
8
+ *
9
+ * Unless required by applicable law or agreed to in writing, software distributed under
10
+ * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
11
+ * ANY KIND, either express or implied. See the License for the specific language
12
+ * governing permissions and limitations under the License.
13
+ *
14
+ * @author Brian Reavis <brian@thirdroute.com>
15
+ */
16
+ .selectize-control.plugin-drag_drop.multi > .selectize-input > div.ui-sortable-placeholder {
17
+ visibility: visible !important;
18
+ background: #f2f2f2 !important;
19
+ background: rgba(0, 0, 0, 0.06) !important;
20
+ border: 0 none !important;
21
+ -webkit-box-shadow: inset 0 0 12px 4px #ffffff;
22
+ box-shadow: inset 0 0 12px 4px #ffffff;
23
+ }
24
+ .selectize-control.plugin-drag_drop .ui-sortable-placeholder::after {
25
+ content: '!';
26
+ visibility: hidden;
27
+ }
28
+ .selectize-control.plugin-drag_drop .ui-sortable-helper {
29
+ -webkit-box-shadow: 0 2px 5px rgba(0, 0, 0, 0.2);
30
+ box-shadow: 0 2px 5px rgba(0, 0, 0, 0.2);
31
+ }
32
+ .selectize-dropdown-header {
33
+ position: relative;
34
+ padding: 5px 8px;
35
+ border-bottom: 1px solid #d0d0d0;
36
+ background: #f8f8f8;
37
+ -webkit-border-radius: 3px 3px 0 0;
38
+ -moz-border-radius: 3px 3px 0 0;
39
+ border-radius: 3px 3px 0 0;
40
+ }
41
+ .selectize-dropdown-header-close {
42
+ position: absolute;
43
+ right: 8px;
44
+ top: 50%;
45
+ color: #303030;
46
+ opacity: 0.4;
47
+ margin-top: -12px;
48
+ line-height: 20px;
49
+ font-size: 20px !important;
50
+ }
51
+ .selectize-dropdown-header-close:hover {
52
+ color: #000000;
53
+ }
54
+ .selectize-dropdown.plugin-optgroup_columns .optgroup {
55
+ border-right: 1px solid #f2f2f2;
56
+ border-top: 0 none;
57
+ float: left;
58
+ -webkit-box-sizing: border-box;
59
+ -moz-box-sizing: border-box;
60
+ box-sizing: border-box;
61
+ }
62
+ .selectize-dropdown.plugin-optgroup_columns .optgroup:last-child {
63
+ border-right: 0 none;
64
+ }
65
+ .selectize-dropdown.plugin-optgroup_columns .optgroup:before {
66
+ display: none;
67
+ }
68
+ .selectize-dropdown.plugin-optgroup_columns .optgroup-header {
69
+ border-top: 0 none;
70
+ }
71
+ .selectize-control.plugin-remove_button [data-value] {
72
+ position: relative;
73
+ padding-right: 24px !important;
74
+ }
75
+ .selectize-control.plugin-remove_button [data-value] .remove {
76
+ z-index: 1;
77
+ /* fixes ie bug (see #392) */
78
+ position: absolute;
79
+ top: 0;
80
+ right: 0;
81
+ bottom: 0;
82
+ width: 17px;
83
+ text-align: center;
84
+ font-weight: bold;
85
+ font-size: 12px;
86
+ color: inherit;
87
+ text-decoration: none;
88
+ vertical-align: middle;
89
+ display: inline-block;
90
+ padding: 2px 0 0 0;
91
+ border-left: 1px solid #0073bb;
92
+ -webkit-border-radius: 0 2px 2px 0;
93
+ -moz-border-radius: 0 2px 2px 0;
94
+ border-radius: 0 2px 2px 0;
95
+ -webkit-box-sizing: border-box;
96
+ -moz-box-sizing: border-box;
97
+ box-sizing: border-box;
98
+ }
99
+ .selectize-control.plugin-remove_button [data-value] .remove:hover {
100
+ background: rgba(0, 0, 0, 0.05);
101
+ }
102
+ .selectize-control.plugin-remove_button [data-value].active .remove {
103
+ border-left-color: #00578d;
104
+ }
105
+ .selectize-control.plugin-remove_button .disabled [data-value] .remove:hover {
106
+ background: none;
107
+ }
108
+ .selectize-control.plugin-remove_button .disabled [data-value] .remove {
109
+ border-left-color: #aaaaaa;
110
+ }
111
+ .selectize-control {
112
+ position: relative;
113
+ }
114
+ .selectize-dropdown,
115
+ .selectize-input,
116
+ .selectize-input input {
117
+ color: #303030;
118
+ font-family: inherit;
119
+ font-size: 13px;
120
+ line-height: 18px;
121
+ -webkit-font-smoothing: inherit;
122
+ }
123
+ .selectize-input,
124
+ .selectize-control.single .selectize-input.input-active {
125
+ background: #ffffff;
126
+ cursor: text;
127
+ display: inline-block;
128
+ }
129
+ .selectize-input {
130
+ border: 1px solid #d0d0d0;
131
+ padding: 8px 8px;
132
+ display: inline-block;
133
+ width: 100%;
134
+ overflow: hidden;
135
+ position: relative;
136
+ z-index: 1;
137
+ -webkit-box-sizing: border-box;
138
+ -moz-box-sizing: border-box;
139
+ box-sizing: border-box;
140
+ -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.1);
141
+ box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.1);
142
+ -webkit-border-radius: 3px;
143
+ -moz-border-radius: 3px;
144
+ border-radius: 3px;
145
+ }
146
+ .selectize-control.multi .selectize-input.has-items {
147
+ padding: 5px 8px 2px;
148
+ }
149
+ .selectize-input.full {
150
+ background-color: #ffffff;
151
+ }
152
+ .selectize-input.disabled,
153
+ .selectize-input.disabled * {
154
+ cursor: default !important;
155
+ }
156
+ .selectize-input.focus {
157
+ -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.15);
158
+ box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.15);
159
+ }
160
+ .selectize-input.dropdown-active {
161
+ -webkit-border-radius: 3px 3px 0 0;
162
+ -moz-border-radius: 3px 3px 0 0;
163
+ border-radius: 3px 3px 0 0;
164
+ }
165
+ .selectize-input > * {
166
+ vertical-align: baseline;
167
+ display: -moz-inline-stack;
168
+ display: inline-block;
169
+ zoom: 1;
170
+ *display: inline;
171
+ }
172
+ .selectize-control.multi .selectize-input > div {
173
+ cursor: pointer;
174
+ margin: 0 3px 3px 0;
175
+ padding: 2px 6px;
176
+ background: #1da7ee;
177
+ color: #ffffff;
178
+ border: 1px solid #0073bb;
179
+ }
180
+ .selectize-control.multi .selectize-input > div.active {
181
+ background: #92c836;
182
+ color: #ffffff;
183
+ border: 1px solid #00578d;
184
+ }
185
+ .selectize-control.multi .selectize-input.disabled > div,
186
+ .selectize-control.multi .selectize-input.disabled > div.active {
187
+ color: #ffffff;
188
+ background: #d2d2d2;
189
+ border: 1px solid #aaaaaa;
190
+ }
191
+ .selectize-input > input {
192
+ display: inline-block !important;
193
+ padding: 0 !important;
194
+ min-height: 0 !important;
195
+ max-height: none !important;
196
+ max-width: 100% !important;
197
+ margin: 0 1px !important;
198
+ text-indent: 0 !important;
199
+ border: 0 none !important;
200
+ background: none !important;
201
+ line-height: inherit !important;
202
+ -webkit-user-select: auto !important;
203
+ -webkit-box-shadow: none !important;
204
+ box-shadow: none !important;
205
+ }
206
+ .selectize-input > input::-ms-clear {
207
+ display: none;
208
+ }
209
+ .selectize-input > input:focus {
210
+ outline: none !important;
211
+ }
212
+ .selectize-input::after {
213
+ content: ' ';
214
+ display: block;
215
+ clear: left;
216
+ }
217
+ .selectize-input.dropdown-active::before {
218
+ content: ' ';
219
+ display: block;
220
+ position: absolute;
221
+ background: #f0f0f0;
222
+ height: 1px;
223
+ bottom: 0;
224
+ left: 0;
225
+ right: 0;
226
+ }
227
+ .selectize-dropdown {
228
+ position: absolute;
229
+ z-index: 10;
230
+ border: 1px solid #d0d0d0;
231
+ background: #ffffff;
232
+ margin: -1px 0 0 0;
233
+ border-top: 0 none;
234
+ -webkit-box-sizing: border-box;
235
+ -moz-box-sizing: border-box;
236
+ box-sizing: border-box;
237
+ -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
238
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
239
+ -webkit-border-radius: 0 0 3px 3px;
240
+ -moz-border-radius: 0 0 3px 3px;
241
+ border-radius: 0 0 3px 3px;
242
+ }
243
+ .selectize-dropdown [data-selectable] {
244
+ cursor: pointer;
245
+ overflow: hidden;
246
+ }
247
+ .selectize-dropdown [data-selectable] .highlight {
248
+ background: rgba(125, 168, 208, 0.2);
249
+ -webkit-border-radius: 1px;
250
+ -moz-border-radius: 1px;
251
+ border-radius: 1px;
252
+ }
253
+ .selectize-dropdown [data-selectable],
254
+ .selectize-dropdown .optgroup-header {
255
+ padding: 5px 8px;
256
+ }
257
+ .selectize-dropdown .optgroup:first-child .optgroup-header {
258
+ border-top: 0 none;
259
+ }
260
+ .selectize-dropdown .optgroup-header {
261
+ color: #303030;
262
+ background: #ffffff;
263
+ cursor: default;
264
+ }
265
+ .selectize-dropdown .active {
266
+ background-color: #f5fafd;
267
+ color: #495c68;
268
+ }
269
+ .selectize-dropdown .active.create {
270
+ color: #495c68;
271
+ }
272
+ .selectize-dropdown .create {
273
+ color: rgba(48, 48, 48, 0.5);
274
+ }
275
+ .selectize-dropdown-content {
276
+ overflow-y: auto;
277
+ overflow-x: hidden;
278
+ max-height: 200px;
279
+ }
280
+ .selectize-control.single .selectize-input,
281
+ .selectize-control.single .selectize-input input {
282
+ cursor: pointer;
283
+ }
284
+ .selectize-control.single .selectize-input.input-active,
285
+ .selectize-control.single .selectize-input.input-active input {
286
+ cursor: text;
287
+ }
288
+ .selectize-control.single .selectize-input:after {
289
+ content: ' ';
290
+ display: block;
291
+ position: absolute;
292
+ top: 50%;
293
+ right: 15px;
294
+ margin-top: -3px;
295
+ width: 0;
296
+ height: 0;
297
+ border-style: solid;
298
+ border-width: 5px 5px 0 5px;
299
+ border-color: #808080 transparent transparent transparent;
300
+ }
301
+ .selectize-control.single .selectize-input.dropdown-active:after {
302
+ margin-top: -4px;
303
+ border-width: 0 5px 5px 5px;
304
+ border-color: transparent transparent #808080 transparent;
305
+ }
306
+ .selectize-control.rtl.single .selectize-input:after {
307
+ left: 15px;
308
+ right: auto;
309
+ }
310
+ .selectize-control.rtl .selectize-input > input {
311
+ margin: 0 4px 0 -2px !important;
312
+ }
313
+ .selectize-control .selectize-input.disabled {
314
+ opacity: 0.5;
315
+ background-color: #fafafa;
316
+ }
317
+ .selectize-control.multi .selectize-input.has-items {
318
+ padding-left: 5px;
319
+ padding-right: 5px;
320
+ }
321
+ .selectize-control.multi .selectize-input.disabled [data-value] {
322
+ color: #999;
323
+ text-shadow: none;
324
+ background: none;
325
+ -webkit-box-shadow: none;
326
+ box-shadow: none;
327
+ }
328
+ .selectize-control.multi .selectize-input.disabled [data-value],
329
+ .selectize-control.multi .selectize-input.disabled [data-value] .remove {
330
+ border-color: #e6e6e6;
331
+ }
332
+ .selectize-control.multi .selectize-input.disabled [data-value] .remove {
333
+ background: none;
334
+ }
335
+ .selectize-control.multi .selectize-input [data-value] {
336
+ text-shadow: 0 1px 0 rgba(0, 51, 83, 0.3);
337
+ -webkit-border-radius: 3px;
338
+ -moz-border-radius: 3px;
339
+ border-radius: 3px;
340
+ background-color: #1b9dec;
341
+ background-image: -moz-linear-gradient(top, #1da7ee, #178ee9);
342
+ background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#1da7ee), to(#178ee9));
343
+ background-image: -webkit-linear-gradient(top, #1da7ee, #178ee9);
344
+ background-image: -o-linear-gradient(top, #1da7ee, #178ee9);
345
+ background-image: linear-gradient(to bottom, #1da7ee, #178ee9);
346
+ background-repeat: repeat-x;
347
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff1da7ee', endColorstr='#ff178ee9', GradientType=0);
348
+ -webkit-box-shadow: 0 1px 0 rgba(0,0,0,0.2),inset 0 1px rgba(255,255,255,0.03);
349
+ box-shadow: 0 1px 0 rgba(0,0,0,0.2),inset 0 1px rgba(255,255,255,0.03);
350
+ }
351
+ .selectize-control.multi .selectize-input [data-value].active {
352
+ background-color: #0085d4;
353
+ background-image: -moz-linear-gradient(top, #008fd8, #0075cf);
354
+ background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#008fd8), to(#0075cf));
355
+ background-image: -webkit-linear-gradient(top, #008fd8, #0075cf);
356
+ background-image: -o-linear-gradient(top, #008fd8, #0075cf);
357
+ background-image: linear-gradient(to bottom, #008fd8, #0075cf);
358
+ background-repeat: repeat-x;
359
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff008fd8', endColorstr='#ff0075cf', GradientType=0);
360
+ }
361
+ .selectize-control.single .selectize-input {
362
+ -webkit-box-shadow: 0 1px 0 rgba(0,0,0,0.05), inset 0 1px 0 rgba(255,255,255,0.8);
363
+ box-shadow: 0 1px 0 rgba(0,0,0,0.05), inset 0 1px 0 rgba(255,255,255,0.8);
364
+ background-color: #f9f9f9;
365
+ background-image: -moz-linear-gradient(top, #fefefe, #f2f2f2);
366
+ background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fefefe), to(#f2f2f2));
367
+ background-image: -webkit-linear-gradient(top, #fefefe, #f2f2f2);
368
+ background-image: -o-linear-gradient(top, #fefefe, #f2f2f2);
369
+ background-image: linear-gradient(to bottom, #fefefe, #f2f2f2);
370
+ background-repeat: repeat-x;
371
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffefefe', endColorstr='#fff2f2f2', GradientType=0);
372
+ }
373
+ .selectize-control.single .selectize-input,
374
+ .selectize-dropdown.single {
375
+ border-color: #b8b8b8;
376
+ }
377
+ .selectize-dropdown .optgroup-header {
378
+ padding-top: 7px;
379
+ font-weight: bold;
380
+ font-size: 0.85em;
381
+ }
382
+ .selectize-dropdown .optgroup {
383
+ border-top: 1px solid #f0f0f0;
384
+ }
385
+ .selectize-dropdown .optgroup:first-child {
386
+ border-top: 0 none;
387
+ }
@@ -0,0 +1,113 @@
1
+ module Blazer
2
+ class BaseController < ApplicationController
3
+ # skip filters
4
+ filters = _process_action_callbacks.map(&:filter) - [:activate_authlogic]
5
+ if Rails::VERSION::MAJOR >= 5
6
+ skip_before_action(*filters, raise: false)
7
+ skip_after_action(*filters, raise: false)
8
+ skip_around_action(*filters, raise: false)
9
+ else
10
+ skip_action_callback(*filters)
11
+ end
12
+
13
+ protect_from_forgery with: :exception
14
+
15
+ if ENV["BLAZER_PASSWORD"]
16
+ http_basic_authenticate_with name: ENV["BLAZER_USERNAME"], password: ENV["BLAZER_PASSWORD"]
17
+ end
18
+
19
+ if Blazer.settings["before_action"]
20
+ raise Blazer::Error, "The docs for protecting Blazer with a custom before_action had an incorrect example from August 2017 to June 2018. The example method had a boolean return value. However, you must render or redirect if a user is unauthorized rather than return a falsy value. Double check that your before_action works correctly for unauthorized users (if it worked when added, there should be no issue). Then, change before_action to before_action_method in config/blazer.yml."
21
+ end
22
+
23
+ if Blazer.before_action
24
+ before_action Blazer.before_action.to_sym
25
+ end
26
+
27
+ if Blazer.override_csp
28
+ after_action do
29
+ response.headers['Content-Security-Policy'] = "default-src 'self' https: 'unsafe-inline' 'unsafe-eval' data:"
30
+ end
31
+ end
32
+
33
+ layout "blazer/application"
34
+
35
+ private
36
+
37
+ def process_vars(statement, data_source)
38
+ (@bind_vars ||= []).concat(Blazer.extract_vars(statement)).uniq!
39
+ @bind_vars.each do |var|
40
+ params[var] ||= Blazer.data_sources[data_source].variable_defaults[var]
41
+ end
42
+ @success = @bind_vars.all? { |v| params[v] }
43
+
44
+ if @success
45
+ @bind_vars.each do |var|
46
+ value = params[var].presence
47
+ if value
48
+ if ["start_time", "end_time"].include?(var)
49
+ value = value.to_s.gsub(" ", "+") # fix for Quip bug
50
+ end
51
+
52
+ if var.end_with?("_at")
53
+ begin
54
+ value = Blazer.time_zone.parse(value)
55
+ rescue
56
+ # do nothing
57
+ end
58
+ end
59
+
60
+ if value =~ /\A\d+\z/
61
+ value = value.to_i
62
+ elsif value =~ /\A\d+\.\d+\z/
63
+ value = value.to_f
64
+ end
65
+ end
66
+ statement.gsub!("{#{var}}", ActiveRecord::Base.connection.quote(value))
67
+ end
68
+ end
69
+ end
70
+
71
+ def parse_smart_variables(var, data_source)
72
+ smart_var_data_source =
73
+ ([data_source] + Array(data_source.settings["inherit_smart_settings"]).map { |ds| Blazer.data_sources[ds] }).find { |ds| ds.smart_variables[var] }
74
+
75
+ if smart_var_data_source
76
+ query = smart_var_data_source.smart_variables[var]
77
+
78
+ if query.is_a? Hash
79
+ smart_var = query.map { |k,v| [v, k] }
80
+ elsif query.is_a? Array
81
+ smart_var = query.map { |v| [v, v] }
82
+ elsif query
83
+ result = smart_var_data_source.run_statement(query)
84
+ smart_var = result.rows.map { |v| v.reverse }
85
+ error = result.error if result.error
86
+ end
87
+ end
88
+
89
+ [smart_var, error]
90
+ end
91
+
92
+ def variable_params
93
+ params.except(:controller, :action, :id, :host, :query, :dashboard, :query_id, :query_ids, :table_names, :authenticity_token, :utf8, :_method, :commit, :statement, :data_source, :name, :fork_query_id, :blazer, :run_id).permit!
94
+ end
95
+ helper_method :variable_params
96
+
97
+ def blazer_user
98
+ send(Blazer.user_method) if Blazer.user_method && respond_to?(Blazer.user_method)
99
+ end
100
+ helper_method :blazer_user
101
+
102
+ def render_errors(resource)
103
+ @errors = resource.errors
104
+ action = resource.persisted? ? :edit : :new
105
+ render action, status: :unprocessable_entity
106
+ end
107
+
108
+ # do not inherit from ApplicationController - #120
109
+ def default_url_options
110
+ {}
111
+ end
112
+ end
113
+ end