blazer 3.0.3 → 3.0.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +5 -0
- data/README.md +0 -45
- data/app/controllers/blazer/base_controller.rb +3 -3
- data/app/views/blazer/_variables.html.erb +8 -8
- data/app/views/blazer/checks/_form.html.erb +8 -8
- data/app/views/blazer/checks/index.html.erb +2 -2
- data/app/views/blazer/dashboards/_form.html.erb +2 -2
- data/app/views/blazer/dashboards/show.html.erb +2 -2
- data/app/views/blazer/queries/_form.html.erb +2 -2
- data/app/views/blazer/queries/home.html.erb +2 -2
- data/app/views/blazer/queries/run.html.erb +4 -4
- data/app/views/blazer/queries/schema.html.erb +2 -2
- data/app/views/blazer/queries/show.html.erb +4 -4
- data/app/views/blazer/uploads/index.html.erb +2 -2
- data/app/views/layouts/blazer/application.html.erb +4 -4
- data/lib/blazer/adapters/athena_adapter.rb +1 -1
- data/lib/blazer/adapters/hive_adapter.rb +1 -1
- data/lib/blazer/adapters/presto_adapter.rb +2 -2
- data/lib/blazer/adapters/sql_adapter.rb +13 -4
- data/lib/blazer/data_source.rb +1 -1
- data/lib/blazer/result.rb +1 -1
- data/lib/blazer/statement.rb +2 -2
- data/lib/blazer/version.rb +1 -1
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 160f3a7275160ebbeb9446cfacbe2c24d7882820f3548e10239cfdf383b3af87
|
4
|
+
data.tar.gz: 809bb498a6c00217e10239f87352c3051b3bb95d956910aa8f39a610e6adf58d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 81ad8488e41e590d3deba688200ec253f3d1f42c00794ce4c6819aa9c9e765d54b692f1172116a30d098877d80a2c07c38814adef07650ac6d56c1bd605d79cc
|
7
|
+
data.tar.gz: 88917858d1aea93202f411f5becd420e49d71b6619fd91cd5580760fbb0a5a8c9bdc8eb0fc604264effd9334ca78d9d111d3bd42067d1b7e1eb5bc8e35562e4e
|
data/CHANGELOG.md
CHANGED
data/README.md
CHANGED
@@ -1026,51 +1026,6 @@ override_csp: true
|
|
1026
1026
|
|
1027
1027
|
Maps now use Mapbox GL JS v1 instead of Mapbox.js, which affects Mapbox billing.
|
1028
1028
|
|
1029
|
-
### 2.6
|
1030
|
-
|
1031
|
-
Custom adapters now need to specify how to quote variables in queries (there is no longer a default)
|
1032
|
-
|
1033
|
-
```ruby
|
1034
|
-
class FooAdapter < Blazer::Adapters::BaseAdapter
|
1035
|
-
def quoting
|
1036
|
-
:backslash_escape # single quote strings and convert ' to \' and \ to \\
|
1037
|
-
# or
|
1038
|
-
:single_quote_escape # single quote strings and convert ' to ''
|
1039
|
-
# or
|
1040
|
-
->(value) { ... } # custom method
|
1041
|
-
end
|
1042
|
-
end
|
1043
|
-
```
|
1044
|
-
|
1045
|
-
### 2.3
|
1046
|
-
|
1047
|
-
To archive queries, create a migration
|
1048
|
-
|
1049
|
-
```sh
|
1050
|
-
rails g migration add_status_to_blazer_queries
|
1051
|
-
```
|
1052
|
-
|
1053
|
-
with:
|
1054
|
-
|
1055
|
-
```ruby
|
1056
|
-
add_column :blazer_queries, :status, :string
|
1057
|
-
Blazer::Query.update_all(status: "active")
|
1058
|
-
```
|
1059
|
-
|
1060
|
-
### 2.0
|
1061
|
-
|
1062
|
-
To use Slack notifications, create a migration
|
1063
|
-
|
1064
|
-
```sh
|
1065
|
-
rails g migration add_slack_channels_to_blazer_checks
|
1066
|
-
```
|
1067
|
-
|
1068
|
-
with:
|
1069
|
-
|
1070
|
-
```ruby
|
1071
|
-
add_column :blazer_checks, :slack_channels, :text
|
1072
|
-
```
|
1073
|
-
|
1074
1029
|
## History
|
1075
1030
|
|
1076
1031
|
View the [changelog](https://github.com/ankane/blazer/blob/master/CHANGELOG.md)
|
@@ -71,9 +71,9 @@ module Blazer
|
|
71
71
|
if smart_var_data_source
|
72
72
|
query = smart_var_data_source.smart_variables[var]
|
73
73
|
|
74
|
-
if query.is_a?
|
75
|
-
smart_var = query.map { |k,v| [v, k] }
|
76
|
-
elsif query.is_a?
|
74
|
+
if query.is_a?(Hash)
|
75
|
+
smart_var = query.map { |k, v| [v, k] }
|
76
|
+
elsif query.is_a?(Array)
|
77
77
|
smart_var = query.map { |v| [v, v] }
|
78
78
|
elsif query
|
79
79
|
result = smart_var_data_source.run_statement(query)
|
@@ -1,6 +1,6 @@
|
|
1
1
|
<% if @bind_vars.any? %>
|
2
2
|
<% var_params = request.query_parameters %>
|
3
|
-
|
3
|
+
<%= javascript_tag nonce: true do %>
|
4
4
|
<%= blazer_js_var "timeZone", Blazer.time_zone.tzinfo.name %>
|
5
5
|
var now = moment.tz(timeZone)
|
6
6
|
var format = "YYYY-MM-DD"
|
@@ -8,7 +8,7 @@
|
|
8
8
|
function toDate(time) {
|
9
9
|
return moment.tz(time.format(format), timeZone)
|
10
10
|
}
|
11
|
-
|
11
|
+
<% end %>
|
12
12
|
<form id="bind" method="get" action="<%= action %>" class="form-inline" style="margin-bottom: 15px;">
|
13
13
|
<% date_vars = ["start_time", "end_time"] %>
|
14
14
|
<% if (date_vars - @bind_vars).empty? %>
|
@@ -21,11 +21,11 @@
|
|
21
21
|
<%= label_tag var, var %>
|
22
22
|
<% if (data = @smart_vars[var]) %>
|
23
23
|
<%= select_tag var, options_for_select([[nil, nil]] + data, selected: var_params[var]), style: "margin-right: 20px; width: 200px; display: none;" %>
|
24
|
-
|
24
|
+
<%= javascript_tag nonce: true do %>
|
25
25
|
$("#<%= var %>").selectize({
|
26
26
|
create: true
|
27
27
|
});
|
28
|
-
|
28
|
+
<% end %>
|
29
29
|
<% elsif var.end_with?("_at") || var == "start_time" || var == "end_time" %>
|
30
30
|
<%= hidden_field_tag var, var_params[var] %>
|
31
31
|
|
@@ -35,7 +35,7 @@
|
|
35
35
|
</div>
|
36
36
|
</div>
|
37
37
|
|
38
|
-
|
38
|
+
<%= javascript_tag nonce: true do %>
|
39
39
|
(function() {
|
40
40
|
var input = $("#<%= var %>")
|
41
41
|
var datePicker = $("#<%= var %>-select")
|
@@ -57,7 +57,7 @@
|
|
57
57
|
datePicker.find("span").html(toDate(picker.startDate).format("MMMM D, YYYY"))
|
58
58
|
}
|
59
59
|
})()
|
60
|
-
|
60
|
+
<% end %>
|
61
61
|
<% else %>
|
62
62
|
<%= text_field_tag var, var_params[var], style: "width: 120px; margin-right: 20px;", autofocus: i == 0 && !var.end_with?("_at") && !var_params[var], class: "form-control" %>
|
63
63
|
<% end %>
|
@@ -75,7 +75,7 @@
|
|
75
75
|
</div>
|
76
76
|
</div>
|
77
77
|
|
78
|
-
|
78
|
+
<%= javascript_tag nonce: true do %>
|
79
79
|
function dateStr(daysAgo) {
|
80
80
|
return now.clone().subtract(daysAgo || 0, "days").format(format)
|
81
81
|
}
|
@@ -119,7 +119,7 @@
|
|
119
119
|
$("#reportrange").trigger("apply.daterangepicker", picker)
|
120
120
|
submitIfCompleted($("#start_time").closest("form"))
|
121
121
|
}
|
122
|
-
|
122
|
+
<% end %>
|
123
123
|
<% end %>
|
124
124
|
|
125
125
|
<input type="submit" class="btn btn-success" value="Run" style="vertical-align: top;" />
|
@@ -12,12 +12,12 @@
|
|
12
12
|
<div class="hide">
|
13
13
|
<%= f.select :query_id, [], {include_blank: true} %>
|
14
14
|
</div>
|
15
|
-
|
15
|
+
<%= javascript_tag nonce: true do %>
|
16
16
|
<%= blazer_js_var "queries", Blazer::Query.active.named.order(:name).select("id, name").map { |q| {text: q.name, value: q.id} } %>
|
17
17
|
<%= blazer_js_var "items", [@check.query_id].compact %>
|
18
18
|
|
19
19
|
$("#check_query_id").selectize({options: queries, items: items, highlight: false, maxOptions: 100}).parents(".hide").removeClass("hide");
|
20
|
-
|
20
|
+
<% end %>
|
21
21
|
</div>
|
22
22
|
|
23
23
|
<% if @check.respond_to?(:check_type) %>
|
@@ -28,9 +28,9 @@
|
|
28
28
|
<% check_options << ["Anomaly (most recent data point)", "anomaly"] if Blazer.anomaly_checks %>
|
29
29
|
<%= f.select :check_type, check_options %>
|
30
30
|
</div>
|
31
|
-
|
31
|
+
<%= javascript_tag nonce: true do %>
|
32
32
|
$("#check_check_type").selectize({}).parent().removeClass("hide");
|
33
|
-
|
33
|
+
<% end %>
|
34
34
|
</div>
|
35
35
|
<% elsif @check.respond_to?(:invert) %>
|
36
36
|
<div class="form-group">
|
@@ -38,9 +38,9 @@
|
|
38
38
|
<div class="hide">
|
39
39
|
<%= f.select :invert, [["Any results (bad data)", false], ["No results (missing data)", true]] %>
|
40
40
|
</div>
|
41
|
-
|
41
|
+
<%= javascript_tag nonce: true do %>
|
42
42
|
$("#check_invert").selectize({}).parent().removeClass("hide");
|
43
|
-
|
43
|
+
<% end %>
|
44
44
|
</div>
|
45
45
|
<% end %>
|
46
46
|
|
@@ -50,9 +50,9 @@
|
|
50
50
|
<div class="hide">
|
51
51
|
<%= f.select :schedule, Blazer.check_schedules.map { |v| [v, v] } %>
|
52
52
|
</div>
|
53
|
-
|
53
|
+
<%= javascript_tag nonce: true do %>
|
54
54
|
$("#check_schedule").selectize({}).parent().removeClass("hide");
|
55
|
-
|
55
|
+
<% end %>
|
56
56
|
</div>
|
57
57
|
<% end %>
|
58
58
|
|
@@ -62,11 +62,11 @@
|
|
62
62
|
</tbody>
|
63
63
|
</table>
|
64
64
|
|
65
|
-
|
65
|
+
<%= javascript_tag nonce: true do %>
|
66
66
|
$("#search").on("keyup", function() {
|
67
67
|
var value = $(this).val().toLowerCase()
|
68
68
|
$("#checks tbody tr").filter( function() {
|
69
69
|
$(this).toggle($(this).text().toLowerCase().indexOf(value) > -1)
|
70
70
|
})
|
71
71
|
}).focus()
|
72
|
-
|
72
|
+
<% end %>
|
@@ -30,7 +30,7 @@
|
|
30
30
|
</p>
|
31
31
|
<% end %>
|
32
32
|
|
33
|
-
|
33
|
+
<%= javascript_tag nonce: true do %>
|
34
34
|
<%= blazer_js_var "queries", Blazer::Query.active.named.order(:name).select("id, name").map { |q| {text: q.name, value: q.id} } %>
|
35
35
|
<%= blazer_js_var "dashboardQueries", @queries || @dashboard.dashboard_queries.order(:position).map(&:query) %>
|
36
36
|
|
@@ -79,4 +79,4 @@
|
|
79
79
|
app.queries.splice(e.newIndex, 0, app.queries.splice(e.oldIndex, 1)[0])
|
80
80
|
}
|
81
81
|
})
|
82
|
-
|
82
|
+
<% end %>
|
@@ -38,7 +38,7 @@
|
|
38
38
|
<p class="text-muted">Loading...</p>
|
39
39
|
</div>
|
40
40
|
</div>
|
41
|
-
|
41
|
+
<%= javascript_tag nonce: true do %>
|
42
42
|
<% data = {statement: query.statement, query_id: query.id, data_source: query.data_source, variables: variable_params(query), only_chart: true} %>
|
43
43
|
<% data.merge!(cohort_period: params[:cohort_period]) if params[:cohort_period] %>
|
44
44
|
<%= blazer_js_var "data", data %>
|
@@ -49,5 +49,5 @@
|
|
49
49
|
}, function (message) {
|
50
50
|
$("#chart-<%= i %>").addClass("query-error").html(message)
|
51
51
|
});
|
52
|
-
|
52
|
+
<% end %>
|
53
53
|
<% end %>
|
@@ -68,7 +68,7 @@
|
|
68
68
|
</div>
|
69
69
|
</div>
|
70
70
|
|
71
|
-
|
71
|
+
<%= javascript_tag nonce: true do %>
|
72
72
|
<%= blazer_js_var "variableParams", @variable_params %>
|
73
73
|
<%= blazer_js_var "previewStatement", Blazer.data_sources.to_h { |k, v| [k, (v.preview_statement rescue "")] } %>
|
74
74
|
|
@@ -252,4 +252,4 @@
|
|
252
252
|
})
|
253
253
|
app.config.compilerOptions.whitespace = "preserve"
|
254
254
|
app.mount("#app")
|
255
|
-
|
255
|
+
<% end %>
|
@@ -56,7 +56,7 @@
|
|
56
56
|
<p v-if="more" class="text-muted">Loading...</p>
|
57
57
|
</div>
|
58
58
|
|
59
|
-
|
59
|
+
<%= javascript_tag nonce: true do %>
|
60
60
|
<%= blazer_js_var "dashboards", @dashboards %>
|
61
61
|
<%= blazer_js_var "queries", @queries %>
|
62
62
|
<%= blazer_js_var "more", @more %>
|
@@ -166,4 +166,4 @@
|
|
166
166
|
})
|
167
167
|
app.config.compilerOptions.whitespace = "preserve"
|
168
168
|
app.mount("#queries")
|
169
|
-
|
169
|
+
<% end %>
|
@@ -75,21 +75,21 @@
|
|
75
75
|
<% if @markers.any? %>
|
76
76
|
<% map_id = SecureRandom.hex %>
|
77
77
|
<%= content_tag :div, nil, id: map_id, style: "height: #{@only_chart ? 300 : 500}px;" %>
|
78
|
-
|
78
|
+
<%= javascript_tag nonce: true do %>
|
79
79
|
<%= blazer_js_var "mapboxAccessToken", Blazer.mapbox_access_token %>
|
80
80
|
<%= blazer_js_var "markers", @markers %>
|
81
81
|
<%= blazer_js_var "mapId", map_id %>
|
82
82
|
new Mapkick.Map(mapId, markers, {accessToken: mapboxAccessToken, tooltips: {hover: false, html: true}});
|
83
|
-
|
83
|
+
<% end %>
|
84
84
|
<% elsif @geojson.any? %>
|
85
85
|
<% map_id = SecureRandom.hex %>
|
86
86
|
<%= content_tag :div, nil, id: map_id, style: "height: #{@only_chart ? 300 : 500}px;" %>
|
87
|
-
|
87
|
+
<%= javascript_tag nonce: true do %>
|
88
88
|
<%= blazer_js_var "mapboxAccessToken", Blazer.mapbox_access_token %>
|
89
89
|
<%= blazer_js_var "geojson", @geojson %>
|
90
90
|
<%= blazer_js_var "mapId", map_id %>
|
91
91
|
new Mapkick.AreaMap(mapId, geojson, {accessToken: mapboxAccessToken, tooltips: {hover: false, html: true}});
|
92
|
-
|
92
|
+
<% end %>
|
93
93
|
<% elsif chart_type == "line" %>
|
94
94
|
<% chart_data = @columns[1..-1].each_with_index.map{ |k, i| {name: blazer_series_name(k), data: @rows.map{ |r| [r[0], r[i + 1]] }, library: series_library[i]} } %>
|
95
95
|
<%= line_chart chart_data, **chart_options %>
|
@@ -28,7 +28,7 @@
|
|
28
28
|
</table>
|
29
29
|
<% end %>
|
30
30
|
|
31
|
-
|
31
|
+
<%= javascript_tag nonce: true do %>
|
32
32
|
$("#search").on("keyup", function() {
|
33
33
|
var value = $(this).val().toLowerCase()
|
34
34
|
$(".schema-table").filter(function() {
|
@@ -52,4 +52,4 @@
|
|
52
52
|
$(this).toggle(found)
|
53
53
|
})
|
54
54
|
}).focus()
|
55
|
-
|
55
|
+
<% end %>
|
@@ -46,7 +46,7 @@
|
|
46
46
|
<p class="text-muted">Loading...</p>
|
47
47
|
</div>
|
48
48
|
|
49
|
-
|
49
|
+
<%= javascript_tag nonce: true do %>
|
50
50
|
function showRun(data) {
|
51
51
|
$("#results").html(data)
|
52
52
|
$("#results table").stupidtable(stupidtableCustomSettings).stickyTableHeaders({fixedOffset: 60})
|
@@ -59,14 +59,14 @@
|
|
59
59
|
<%= blazer_js_var "data", @run_data %>
|
60
60
|
|
61
61
|
runQuery(data, showRun, showError)
|
62
|
-
|
62
|
+
<% end %>
|
63
63
|
<% end %>
|
64
64
|
|
65
|
-
|
65
|
+
<%= javascript_tag nonce: true do %>
|
66
66
|
// do not highlight really long queries
|
67
67
|
// this can lead to performance issues
|
68
68
|
var code = $("#code code")
|
69
69
|
if (code.text().length < 10000) {
|
70
70
|
hljs.highlightElement(code.get(0))
|
71
71
|
}
|
72
|
-
|
72
|
+
<% end %>
|
@@ -45,11 +45,11 @@
|
|
45
45
|
</tbody>
|
46
46
|
</table>
|
47
47
|
|
48
|
-
|
48
|
+
<%= javascript_tag nonce: true do %>
|
49
49
|
$("#search").on("keyup", function() {
|
50
50
|
var value = $(this).val().toLowerCase()
|
51
51
|
$("#uploads tbody tr").filter( function() {
|
52
52
|
$(this).toggle($(this).text().toLowerCase().indexOf(value) > -1)
|
53
53
|
})
|
54
54
|
}).focus()
|
55
|
-
|
55
|
+
<% end %>
|
@@ -7,14 +7,14 @@
|
|
7
7
|
<%= favicon_link_tag "blazer/favicon.png" %>
|
8
8
|
<% if defined?(Propshaft::Railtie) %>
|
9
9
|
<%= stylesheet_link_tag "blazer/bootstrap-propshaft", "blazer/bootstrap", "blazer/selectize", "blazer/github", "blazer/daterangepicker", "blazer/application" %>
|
10
|
-
<%= javascript_include_tag "blazer/jquery", "blazer/rails-ujs", "blazer/stupidtable", "blazer/stupidtable-custom-settings", "blazer/jquery.stickytableheaders", "blazer/selectize", "blazer/highlight.min", "blazer/moment", "blazer/moment-timezone-with-data", "blazer/daterangepicker", "blazer/chart.umd", "blazer/chartjs-adapter-date-fns.bundle", "blazer/chartkick", "blazer/mapkick.bundle", "blazer/ace/ace", "blazer/ace/ext-language_tools", "blazer/ace/theme-twilight", "blazer/ace/mode-sql", "blazer/ace/snippets/text", "blazer/ace/snippets/sql", "blazer/Sortable", "blazer/bootstrap", "blazer/vue.global.prod", "blazer/routes", "blazer/queries", "blazer/fuzzysearch", "blazer/application" %>
|
10
|
+
<%= javascript_include_tag "blazer/jquery", "blazer/rails-ujs", "blazer/stupidtable", "blazer/stupidtable-custom-settings", "blazer/jquery.stickytableheaders", "blazer/selectize", "blazer/highlight.min", "blazer/moment", "blazer/moment-timezone-with-data", "blazer/daterangepicker", "blazer/chart.umd", "blazer/chartjs-adapter-date-fns.bundle", "blazer/chartkick", "blazer/mapkick.bundle", "blazer/ace/ace", "blazer/ace/ext-language_tools", "blazer/ace/theme-twilight", "blazer/ace/mode-sql", "blazer/ace/snippets/text", "blazer/ace/snippets/sql", "blazer/Sortable", "blazer/bootstrap", "blazer/vue.global.prod", "blazer/routes", "blazer/queries", "blazer/fuzzysearch", "blazer/application", nonce: true %>
|
11
11
|
<% else %>
|
12
12
|
<%= stylesheet_link_tag "blazer/application" %>
|
13
|
-
<%= javascript_include_tag "blazer/application" %>
|
13
|
+
<%= javascript_include_tag "blazer/application", nonce: true %>
|
14
14
|
<% end %>
|
15
|
-
|
15
|
+
<%= javascript_tag nonce: true do %>
|
16
16
|
<%= blazer_js_var "rootPath", root_path %>
|
17
|
-
|
17
|
+
<% end %>
|
18
18
|
<%= csrf_meta_tags %>
|
19
19
|
</head>
|
20
20
|
<body>
|
@@ -39,10 +39,10 @@ module Blazer
|
|
39
39
|
def client
|
40
40
|
@client ||= begin
|
41
41
|
uri = URI.parse(settings["url"])
|
42
|
-
query = uri.query ? CGI
|
42
|
+
query = uri.query ? CGI.parse(uri.query) : {}
|
43
43
|
Presto::Client.new(
|
44
44
|
server: "#{uri.host}:#{uri.port}",
|
45
|
-
catalog: uri.path.to_s.
|
45
|
+
catalog: uri.path.to_s.delete_prefix("/"),
|
46
46
|
schema: query["schema"] || "public",
|
47
47
|
user: uri.user,
|
48
48
|
http_debug: false
|
@@ -29,13 +29,22 @@ module Blazer
|
|
29
29
|
end
|
30
30
|
|
31
31
|
columns = result.columns
|
32
|
-
result.rows
|
33
|
-
|
32
|
+
rows = result.rows
|
33
|
+
|
34
|
+
# cast values
|
35
|
+
if result.column_types.any?
|
36
|
+
types = columns.map { |c| result.column_types[c] }
|
37
|
+
rows =
|
38
|
+
rows.map do |row|
|
39
|
+
row.map.with_index do |v, i|
|
40
|
+
v && (t = types[i]) ? t.send(:cast_value, v) : v
|
41
|
+
end
|
42
|
+
end
|
34
43
|
end
|
35
44
|
|
36
45
|
# fix for non-ASCII column names and charts
|
37
46
|
if adapter_name == "Trilogy"
|
38
|
-
columns.map
|
47
|
+
columns = columns.map { |k| k.dup.force_encoding(Encoding::UTF_8) }
|
39
48
|
end
|
40
49
|
rescue => e
|
41
50
|
error = e.message.sub(/.+ERROR: /, "")
|
@@ -141,7 +150,7 @@ module Blazer
|
|
141
150
|
def cohort_analysis_statement(statement, period:, days:)
|
142
151
|
raise "Cohort analysis not supported" unless supports_cohort_analysis?
|
143
152
|
|
144
|
-
cohort_column = statement
|
153
|
+
cohort_column = statement.match?(/\bcohort_time\b/) ? "cohort_time" : "conversion_time"
|
145
154
|
tzname = Blazer.time_zone.tzinfo.name
|
146
155
|
|
147
156
|
if mysql?
|
data/lib/blazer/data_source.rb
CHANGED
data/lib/blazer/result.rb
CHANGED
@@ -131,7 +131,7 @@ module Blazer
|
|
131
131
|
|
132
132
|
if chart_type == "line"
|
133
133
|
columns[1..-1].each_with_index.each do |k, i|
|
134
|
-
series << {name: k, data: rows.map{ |r| [r[0], r[i + 1]] }}
|
134
|
+
series << {name: k, data: rows.map { |r| [r[0], r[i + 1]] }}
|
135
135
|
end
|
136
136
|
else
|
137
137
|
rows.group_by { |r| v = r[1]; (smart_values[columns[1]] || {})[v.to_s] || v }.each_with_index.map do |(name, v), i|
|
data/lib/blazer/statement.rb
CHANGED
@@ -33,9 +33,9 @@ module Blazer
|
|
33
33
|
end
|
34
34
|
|
35
35
|
unless value.is_a?(ActiveSupport::TimeWithZone)
|
36
|
-
if value
|
36
|
+
if value.match?(/\A\d+\z/)
|
37
37
|
value = value.to_i
|
38
|
-
elsif value
|
38
|
+
elsif value.match?(/\A\d+\.\d+\z/)
|
39
39
|
value = value.to_f
|
40
40
|
end
|
41
41
|
end
|
data/lib/blazer/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: blazer
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.0.
|
4
|
+
version: 3.0.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Andrew Kane
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-
|
11
|
+
date: 2024-09-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: railties
|
@@ -251,7 +251,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
251
251
|
- !ruby/object:Gem::Version
|
252
252
|
version: '0'
|
253
253
|
requirements: []
|
254
|
-
rubygems_version: 3.5.
|
254
|
+
rubygems_version: 3.5.11
|
255
255
|
signing_key:
|
256
256
|
specification_version: 4
|
257
257
|
summary: Explore your data with SQL. Easily create charts and dashboards, and share
|