blazer 3.4.0 → 3.5.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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +8 -0
- data/README.md +23 -27
- data/app/assets/javascripts/blazer/Sortable.js +826 -1162
- data/app/assets/javascripts/blazer/ace/ace.js +15775 -13360
- data/app/assets/javascripts/blazer/ace/ext-language_tools.js +1411 -668
- data/app/assets/javascripts/blazer/ace/mode-sql.js +12 -6
- data/app/assets/javascripts/blazer/ace/theme-twilight.js +3 -3
- data/app/assets/javascripts/blazer/application.js +94 -52
- data/app/assets/javascripts/blazer/chart.umd.js +6 -6
- data/app/assets/javascripts/blazer/daterangepicker.js +193 -199
- data/app/assets/javascripts/blazer/highlight.min.js +235 -373
- data/app/assets/javascripts/blazer/moment-timezone-with-data.js +116 -82
- data/app/assets/javascripts/blazer/moment.js +368 -365
- data/app/assets/javascripts/blazer/queries.js +68 -58
- data/app/assets/javascripts/blazer/routes.js +11 -11
- data/app/assets/javascripts/blazer/tablesort.js +42 -0
- data/app/assets/javascripts/blazer/tom-select.base.js +4175 -0
- data/app/assets/stylesheets/blazer/application.css +114 -5
- data/app/assets/stylesheets/blazer/tom-select.css +502 -0
- data/app/controllers/blazer/base_controller.rb +1 -1
- data/app/controllers/blazer/checks_controller.rb +5 -2
- data/app/controllers/blazer/queries_controller.rb +3 -1
- data/app/helpers/blazer/base_helper.rb +1 -1
- data/app/models/blazer/check.rb +35 -57
- data/app/views/blazer/_nav.html.erb +1 -1
- data/app/views/blazer/_variables.html.erb +57 -42
- data/app/views/blazer/checks/_form.html.erb +20 -16
- data/app/views/blazer/checks/index.html.erb +17 -20
- data/app/views/blazer/dashboards/_form.html.erb +63 -48
- data/app/views/blazer/dashboards/show.html.erb +23 -16
- data/app/views/blazer/queries/_caching.html.erb +1 -1
- data/app/views/blazer/queries/_chart.html.erb +8 -0
- data/app/views/blazer/queries/_form.html.erb +153 -180
- data/app/views/blazer/queries/_map.html.erb +8 -0
- data/app/views/blazer/queries/docs.html.erb +6 -6
- data/app/views/blazer/queries/edit.html.erb +1 -0
- data/app/views/blazer/queries/home.html.erb +101 -102
- data/app/views/blazer/queries/new.html.erb +1 -0
- data/app/views/blazer/queries/run.html.erb +23 -34
- data/app/views/blazer/queries/schema.html.erb +20 -20
- data/app/views/blazer/queries/show.html.erb +19 -12
- data/app/views/blazer/uploads/index.html.erb +10 -10
- data/app/views/layouts/blazer/application.html.erb +3 -3
- data/lib/blazer/adapters/athena_adapter.rb +12 -6
- data/lib/blazer/adapters/clickhouse_adapter.rb +136 -0
- data/lib/blazer/adapters/druid_adapter.rb +0 -2
- data/lib/blazer/adapters/snowflake2_adapter.rb +198 -0
- data/lib/blazer/adapters/soda_adapter.rb +0 -2
- data/lib/blazer/adapters/sql_adapter.rb +4 -0
- data/lib/blazer/adapters.rb +2 -0
- data/lib/blazer/check_types.rb +20 -0
- data/lib/blazer/email_notifier.rb +49 -0
- data/lib/blazer/result.rb +15 -0
- data/lib/blazer/slack_notifier.rb +39 -7
- data/lib/blazer/version.rb +1 -1
- data/lib/blazer.rb +32 -26
- data/lib/generators/blazer/templates/config.yml.tt +0 -2
- data/licenses/LICENSE-chart.js.txt +1 -1
- metadata +12 -31
- data/app/assets/javascripts/blazer/bootstrap.js +0 -2580
- data/app/assets/javascripts/blazer/jquery.js +0 -10872
- data/app/assets/javascripts/blazer/jquery.stickytableheaders.js +0 -325
- data/app/assets/javascripts/blazer/rails-ujs.js +0 -746
- data/app/assets/javascripts/blazer/selectize.js +0 -3891
- data/app/assets/javascripts/blazer/stupidtable-custom-settings.js +0 -13
- data/app/assets/javascripts/blazer/stupidtable.js +0 -281
- data/app/assets/javascripts/blazer/vue.global.prod.js +0 -1
- data/app/assets/stylesheets/blazer/selectize.css +0 -403
- data/licenses/LICENSE-jquery.txt +0 -20
- data/licenses/LICENSE-rails-ujs.txt +0 -20
- data/licenses/LICENSE-stickytableheaders.txt +0 -20
- data/licenses/LICENSE-stupidtable.txt +0 -19
- data/licenses/LICENSE-vue.txt +0 -21
- /data/licenses/{LICENSE-selectize.txt → LICENSE-tom-select.txt} +0 -0
|
@@ -4,12 +4,18 @@ var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules;
|
|
|
4
4
|
var SqlHighlightRules = function () {
|
|
5
5
|
var keywords = ("select|insert|update|delete|from|where|and|or|group|by|order|limit|offset|having|as|case|" +
|
|
6
6
|
"when|then|else|end|type|left|right|join|on|outer|desc|asc|union|create|table|primary|key|if|" +
|
|
7
|
-
"foreign|not|references|default|null|inner|cross|natural|database|drop|grant|distinct"
|
|
7
|
+
"foreign|not|references|default|null|inner|cross|natural|database|drop|grant|distinct|is|in|" +
|
|
8
|
+
"all|alter|any|array|at|authorization|between|both|cast|check|collate|column|commit|constraint|" +
|
|
9
|
+
"cube|current|current_date|current_time|current_timestamp|current_user|describe|escape|except|" +
|
|
10
|
+
"exists|external|extract|fetch|filter|for|full|function|global|grouping|intersect|interval|" +
|
|
11
|
+
"into|leading|like|local|no|of|only|out|overlaps|partition|position|range|revoke|rollback|rollup|" +
|
|
12
|
+
"row|rows|session_user|set|some|start|tablesample|time|to|trailing|truncate|unique|unknown|" +
|
|
13
|
+
"user|using|values|window|with");
|
|
8
14
|
var builtinConstants = ("true|false");
|
|
9
15
|
var builtinFunctions = ("avg|count|first|last|max|min|sum|ucase|lcase|mid|len|round|rank|now|format|" +
|
|
10
16
|
"coalesce|ifnull|isnull|nvl");
|
|
11
17
|
var dataTypes = ("int|numeric|decimal|date|varchar|char|bigint|float|double|bit|binary|text|set|timestamp|" +
|
|
12
|
-
"money|real|number|integer");
|
|
18
|
+
"money|real|number|integer|string");
|
|
13
19
|
var keywordMapper = this.createKeywordMapper({
|
|
14
20
|
"support.function": builtinFunctions,
|
|
15
21
|
"keyword": keywords,
|
|
@@ -25,16 +31,16 @@ var SqlHighlightRules = function () {
|
|
|
25
31
|
start: "/\\*",
|
|
26
32
|
end: "\\*/"
|
|
27
33
|
}, {
|
|
28
|
-
token: "string",
|
|
34
|
+
token: "string", // " string
|
|
29
35
|
regex: '".*?"'
|
|
30
36
|
}, {
|
|
31
|
-
token: "string",
|
|
37
|
+
token: "string", // ' string
|
|
32
38
|
regex: "'.*?'"
|
|
33
39
|
}, {
|
|
34
|
-
token: "string",
|
|
40
|
+
token: "string", // ` string (apache drill)
|
|
35
41
|
regex: "`.*?`"
|
|
36
42
|
}, {
|
|
37
|
-
token: "constant.numeric",
|
|
43
|
+
token: "constant.numeric", // float
|
|
38
44
|
regex: "[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b"
|
|
39
45
|
}, {
|
|
40
46
|
token: keywordMapper,
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
define("ace/theme/twilight
|
|
1
|
+
define("ace/theme/twilight-css",["require","exports","module"], function(require, exports, module){module.exports = ".ace-twilight .ace_gutter {\n background: #232323;\n color: #E2E2E2\n}\n\n.ace-twilight .ace_print-margin {\n width: 1px;\n background: #232323\n}\n\n.ace-twilight {\n background-color: #141414;\n color: #F8F8F8\n}\n\n.ace-twilight .ace_cursor {\n color: #A7A7A7\n}\n\n.ace-twilight .ace_marker-layer .ace_selection {\n background: rgba(221, 240, 255, 0.20)\n}\n\n.ace-twilight.ace_multiselect .ace_selection.ace_start {\n box-shadow: 0 0 3px 0px #141414;\n}\n\n.ace-twilight .ace_marker-layer .ace_step {\n background: rgb(102, 82, 0)\n}\n\n.ace-twilight .ace_marker-layer .ace_bracket {\n margin: -1px 0 0 -1px;\n border: 1px solid rgba(255, 255, 255, 0.25)\n}\n\n.ace-twilight .ace_marker-layer .ace_active-line {\n background: rgba(255, 255, 255, 0.031)\n}\n\n.ace-twilight .ace_gutter-active-line {\n background-color: rgba(255, 255, 255, 0.031)\n}\n\n.ace-twilight .ace_marker-layer .ace_selected-word {\n border: 1px solid rgba(221, 240, 255, 0.20)\n}\n\n.ace-twilight .ace_invisible {\n color: rgba(255, 255, 255, 0.25)\n}\n\n.ace-twilight .ace_keyword,\n.ace-twilight .ace_meta {\n color: #CDA869\n}\n\n.ace-twilight .ace_constant,\n.ace-twilight .ace_constant.ace_character,\n.ace-twilight .ace_constant.ace_character.ace_escape,\n.ace-twilight .ace_constant.ace_other,\n.ace-twilight .ace_heading,\n.ace-twilight .ace_markup.ace_heading,\n.ace-twilight .ace_support.ace_constant {\n color: #CF6A4C\n}\n\n.ace-twilight .ace_invalid.ace_illegal {\n color: #F8F8F8;\n background-color: rgba(86, 45, 86, 0.75)\n}\n\n.ace-twilight .ace_invalid.ace_deprecated {\n text-decoration: underline;\n font-style: italic;\n color: #D2A8A1\n}\n\n.ace-twilight .ace_support {\n color: #9B859D\n}\n\n.ace-twilight .ace_fold {\n background-color: #AC885B;\n border-color: #F8F8F8\n}\n\n.ace-twilight .ace_support.ace_function {\n color: #DAD085\n}\n\n.ace-twilight .ace_list,\n.ace-twilight .ace_markup.ace_list,\n.ace-twilight .ace_storage {\n color: #F9EE98\n}\n\n.ace-twilight .ace_entity.ace_name.ace_function,\n.ace-twilight .ace_meta.ace_tag {\n color: #AC885B\n}\n\n.ace-twilight .ace_string {\n color: #8F9D6A\n}\n\n.ace-twilight .ace_string.ace_regexp {\n color: #E9C062\n}\n\n.ace-twilight .ace_comment {\n font-style: italic;\n color: #5F5A60\n}\n\n.ace-twilight .ace_variable {\n color: #7587A6\n}\n\n.ace-twilight .ace_xml-pe {\n color: #494949\n}\n\n.ace-twilight .ace_indent-guide {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWMQERFpYLC1tf0PAAgOAnPnhxyiAAAAAElFTkSuQmCC) right repeat-y\n}\n\n.ace-twilight .ace_indent-guide-active {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQIW2PQ1dX9zzBz5sz/ABCcBFFentLlAAAAAElFTkSuQmCC) right repeat-y;\n}\n";
|
|
2
2
|
|
|
3
3
|
});
|
|
4
4
|
|
|
5
|
-
define("ace/theme/twilight",["require","exports","module","ace/theme/twilight
|
|
5
|
+
define("ace/theme/twilight",["require","exports","module","ace/theme/twilight-css","ace/lib/dom"], function(require, exports, module){exports.isDark = true;
|
|
6
6
|
exports.cssClass = "ace-twilight";
|
|
7
|
-
exports.cssText = require("./twilight
|
|
7
|
+
exports.cssText = require("./twilight-css");
|
|
8
8
|
var dom = require("../lib/dom");
|
|
9
9
|
dom.importCssString(exports.cssText, exports.cssClass, false);
|
|
10
10
|
|
|
@@ -1,9 +1,5 @@
|
|
|
1
|
-
//= require ./
|
|
2
|
-
//= require ./
|
|
3
|
-
//= require ./stupidtable
|
|
4
|
-
//= require ./stupidtable-custom-settings
|
|
5
|
-
//= require ./jquery.stickytableheaders
|
|
6
|
-
//= require ./selectize
|
|
1
|
+
//= require ./tablesort
|
|
2
|
+
//= require ./tom-select.base
|
|
7
3
|
//= require ./highlight.min
|
|
8
4
|
//= require ./moment
|
|
9
5
|
//= require ./moment-timezone-with-data
|
|
@@ -14,71 +10,117 @@
|
|
|
14
10
|
//= require ./mapkick.bundle
|
|
15
11
|
//= require ./ace
|
|
16
12
|
//= require ./Sortable
|
|
17
|
-
//= require ./bootstrap
|
|
18
|
-
//= require ./vue.global.prod
|
|
19
13
|
//= require ./routes
|
|
20
14
|
//= require ./queries
|
|
21
15
|
//= require ./fuzzysearch
|
|
22
16
|
|
|
23
|
-
|
|
24
|
-
|
|
17
|
+
document.addEventListener("mouseover", function (e) {
|
|
18
|
+
const target = e.target.closest(".dropdown-toggle")
|
|
19
|
+
if (target) {
|
|
20
|
+
target.parentElement.classList.add("open")
|
|
21
|
+
}
|
|
25
22
|
})
|
|
26
23
|
|
|
27
|
-
|
|
28
|
-
|
|
24
|
+
document.addEventListener("click", function (e) {
|
|
25
|
+
const dropdown = document.querySelector(".dropdown-toggle")
|
|
26
|
+
if (dropdown) {
|
|
27
|
+
if (dropdown.contains(e.target)) {
|
|
28
|
+
dropdown.parentElement.classList.toggle("open")
|
|
29
|
+
} else {
|
|
30
|
+
dropdown.parentElement.classList.remove("open")
|
|
31
|
+
}
|
|
32
|
+
}
|
|
29
33
|
})
|
|
30
34
|
|
|
31
|
-
|
|
32
|
-
|
|
35
|
+
document.addEventListener("change", function (e) {
|
|
36
|
+
const target = e.target.closest("#bind input, #bind select")
|
|
37
|
+
if (target) {
|
|
38
|
+
submitIfCompleted(target.closest("form"))
|
|
39
|
+
}
|
|
33
40
|
})
|
|
34
41
|
|
|
35
|
-
|
|
36
|
-
e.
|
|
42
|
+
document.addEventListener("click", function (e) {
|
|
43
|
+
const target = e.target.closest("#code")
|
|
44
|
+
if (target) {
|
|
45
|
+
target.classList.add("expanded")
|
|
46
|
+
}
|
|
47
|
+
})
|
|
48
|
+
|
|
49
|
+
document.addEventListener("click", function (e) {
|
|
50
|
+
const target = e.target.closest("a[disabled]")
|
|
51
|
+
if (target) {
|
|
52
|
+
e.preventDefault()
|
|
53
|
+
}
|
|
54
|
+
})
|
|
55
|
+
|
|
56
|
+
document.addEventListener("click", function (e) {
|
|
57
|
+
const target = e.target.closest("a[data-confirm]")
|
|
58
|
+
if (target) {
|
|
59
|
+
if (!window.confirm(target.getAttribute("data-confirm"))) {
|
|
60
|
+
e.preventDefault()
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
})
|
|
64
|
+
|
|
65
|
+
// make autofocus work with back button
|
|
66
|
+
window.addEventListener("pageshow", function (e) {
|
|
67
|
+
if (e.persisted) {
|
|
68
|
+
const element = document.querySelector("input[autofocus]")
|
|
69
|
+
if (element) {
|
|
70
|
+
element.focus()
|
|
71
|
+
}
|
|
72
|
+
}
|
|
37
73
|
})
|
|
38
74
|
|
|
39
|
-
function submitIfCompleted(
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
if (
|
|
75
|
+
function submitIfCompleted(form) {
|
|
76
|
+
let completed = true
|
|
77
|
+
for (const input of form.querySelectorAll("input[name], select")) {
|
|
78
|
+
if (input.value == "") {
|
|
43
79
|
completed = false
|
|
80
|
+
break
|
|
44
81
|
}
|
|
45
|
-
}
|
|
82
|
+
}
|
|
46
83
|
if (completed) {
|
|
47
|
-
|
|
84
|
+
form.submit()
|
|
48
85
|
}
|
|
49
86
|
}
|
|
50
87
|
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
$(document).keydown(function (e) {
|
|
55
|
-
var preventKeyPress
|
|
56
|
-
if (e.keyCode == 8) {
|
|
57
|
-
var d = e.srcElement || e.target
|
|
58
|
-
switch (d.tagName.toUpperCase()) {
|
|
59
|
-
case 'TEXTAREA':
|
|
60
|
-
preventKeyPress = d.readOnly || d.disabled
|
|
61
|
-
break
|
|
62
|
-
case 'INPUT':
|
|
63
|
-
preventKeyPress = d.readOnly || d.disabled || (d.attributes["type"] && $.inArray(d.attributes["type"].value.toLowerCase(), ["radio", "reset", "checkbox", "submit", "button"]) >= 0)
|
|
64
|
-
break
|
|
65
|
-
case 'DIV':
|
|
66
|
-
preventKeyPress = d.readOnly || d.disabled || !(d.attributes["contentEditable"] && d.attributes["contentEditable"].value == "true")
|
|
67
|
-
break
|
|
68
|
-
default:
|
|
69
|
-
preventKeyPress = true
|
|
70
|
-
break
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
else {
|
|
74
|
-
preventKeyPress = false
|
|
75
|
-
}
|
|
88
|
+
function show(element) {
|
|
89
|
+
element.classList.remove("hide")
|
|
90
|
+
}
|
|
76
91
|
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
92
|
+
function hide(element) {
|
|
93
|
+
element.classList.add("hide")
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
function toggle(element, found) {
|
|
97
|
+
if (found) {
|
|
98
|
+
show(element)
|
|
99
|
+
} else {
|
|
100
|
+
hide(element)
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
function pathParams(params) {
|
|
105
|
+
return (new URLSearchParams(params)).toString()
|
|
81
106
|
}
|
|
82
107
|
|
|
83
|
-
|
|
108
|
+
function getJSON(url, success, controller) {
|
|
109
|
+
const options = {headers: {"Accept": "application/json"}}
|
|
110
|
+
if (controller) {
|
|
111
|
+
options.signal = controller.signal
|
|
112
|
+
}
|
|
113
|
+
fetch(url, options)
|
|
114
|
+
.then(function (response) {
|
|
115
|
+
if (!response.ok) {
|
|
116
|
+
throw new Error(response.statusText)
|
|
117
|
+
}
|
|
118
|
+
return response.json()
|
|
119
|
+
})
|
|
120
|
+
.then(success)
|
|
121
|
+
}
|
|
84
122
|
|
|
123
|
+
function renderResults(element, data) {
|
|
124
|
+
const range = document.createRange()
|
|
125
|
+
element.replaceChildren(range.createContextualFragment(data))
|
|
126
|
+
}
|