blazer 1.1.1 → 1.2.0
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of blazer might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/CHANGELOG.md +9 -0
- data/app/controllers/blazer/base_controller.rb +7 -2
- data/app/controllers/blazer/dashboards_controller.rb +2 -2
- data/app/controllers/blazer/queries_controller.rb +23 -13
- data/app/models/blazer/query.rb +8 -3
- data/app/views/blazer/checks/_form.html.erb +1 -1
- data/app/views/blazer/dashboards/_form.html.erb +1 -1
- data/app/views/blazer/queries/_index.html.erb +1 -1
- data/app/views/blazer/queries/home.html.erb +2 -1
- data/app/views/blazer/queries/run.html.erb +1 -1
- data/app/views/blazer/queries/show.html.erb +1 -1
- data/lib/blazer.rb +10 -4
- data/lib/blazer/data_source.rb +9 -1
- data/lib/blazer/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f2b31d4024bff8e0f4945c686632c39dfb689b04
|
4
|
+
data.tar.gz: 7c5a623ae6bf5522199336a1525935e19b25b548
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2ecc965c3c9b524056f8a87bd5032d5fc21a7de1ecc44803fae87171121534c2fee557a24582653b76ccd20b44407dad0fd5946bfd6ed26770978f6de0ee250e
|
7
|
+
data.tar.gz: 06785c76f5862dbcd4b1a7537ce0246df5b7fec64677ca6d603375ed83ef4070371fb5fbbd9e155b0eae0477f769ff35bd88ca4fe4aa379013e515e3d5b1ee57
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,12 @@
|
|
1
|
+
## 1.2.0
|
2
|
+
|
3
|
+
- Added non-editable queries
|
4
|
+
- Added variable defaults
|
5
|
+
- Added `local_time_suffix` setting
|
6
|
+
- Better timeout message
|
7
|
+
- Hide variables from commented out lines
|
8
|
+
- Fixed regex as variable names
|
9
|
+
|
1
10
|
## 1.1.1
|
2
11
|
|
3
12
|
- Added `before_action` option
|
@@ -23,8 +23,11 @@ module Blazer
|
|
23
23
|
render text: "BLAZER_DATABASE_URL required" if !ENV["BLAZER_DATABASE_URL"] && !Rails.env.development?
|
24
24
|
end
|
25
25
|
|
26
|
-
def process_vars(statement)
|
26
|
+
def process_vars(statement, data_source)
|
27
27
|
(@bind_vars ||= []).concat(extract_vars(statement)).uniq!
|
28
|
+
@bind_vars.each do |var|
|
29
|
+
params[var] ||= Blazer.data_sources[data_source].variable_defaults[var]
|
30
|
+
end
|
28
31
|
@success = @bind_vars.all? { |v| params[v] }
|
29
32
|
|
30
33
|
if @success
|
@@ -41,7 +44,9 @@ module Blazer
|
|
41
44
|
end
|
42
45
|
|
43
46
|
def extract_vars(statement)
|
44
|
-
|
47
|
+
# strip commented out lines
|
48
|
+
# and regex {1} or {1,2}
|
49
|
+
statement.gsub(/\-\-.+/, "").gsub(/\/\*.+\*\//m, "").scan(/\{.*?\}/).map { |v| v[1...-1] }.reject { |v| /\A\d+(\,\d+)?\z/.match(v) }.uniq
|
45
50
|
end
|
46
51
|
helper_method :extract_vars
|
47
52
|
|
@@ -23,7 +23,7 @@ module Blazer
|
|
23
23
|
def show
|
24
24
|
@queries = @dashboard.dashboard_queries.order(:position).preload(:query).map(&:query)
|
25
25
|
@queries.each do |query|
|
26
|
-
process_vars(query.statement)
|
26
|
+
process_vars(query.statement, query.data_source)
|
27
27
|
end
|
28
28
|
@bind_vars ||= []
|
29
29
|
|
@@ -62,7 +62,7 @@ module Blazer
|
|
62
62
|
@dashboard.queries.each do |query|
|
63
63
|
data_source = Blazer.data_sources[query.data_source]
|
64
64
|
statement = query.statement.dup
|
65
|
-
process_vars(statement)
|
65
|
+
process_vars(statement, query.data_source)
|
66
66
|
Blazer.transform_statement.call(data_source, statement) if Blazer.transform_statement
|
67
67
|
data_source.clear_cache(statement)
|
68
68
|
end
|
@@ -13,7 +13,6 @@ module Blazer
|
|
13
13
|
|
14
14
|
def new
|
15
15
|
@query = Blazer::Query.new(
|
16
|
-
statement: params[:statement],
|
17
16
|
data_source: params[:data_source],
|
18
17
|
name: params[:name]
|
19
18
|
)
|
@@ -35,7 +34,7 @@ module Blazer
|
|
35
34
|
|
36
35
|
def show
|
37
36
|
@statement = @query.statement.dup
|
38
|
-
process_vars(@statement)
|
37
|
+
process_vars(@statement, @query.data_source)
|
39
38
|
|
40
39
|
@smart_vars = {}
|
41
40
|
@sql_errors = []
|
@@ -57,13 +56,13 @@ module Blazer
|
|
57
56
|
|
58
57
|
def run
|
59
58
|
@statement = params[:statement]
|
60
|
-
|
59
|
+
data_source = params[:data_source]
|
60
|
+
process_vars(@statement, data_source)
|
61
61
|
@only_chart = params[:only_chart]
|
62
62
|
|
63
63
|
if @success
|
64
64
|
@query = Query.find_by(id: params[:query_id]) if params[:query_id]
|
65
65
|
|
66
|
-
data_source = params[:data_source]
|
67
66
|
data_source = @query.data_source if @query && @query.data_source
|
68
67
|
@data_source = Blazer.data_sources[data_source]
|
69
68
|
Blazer.transform_statement.call(@data_source, @statement) if Blazer.transform_statement
|
@@ -138,7 +137,7 @@ module Blazer
|
|
138
137
|
render layout: false
|
139
138
|
end
|
140
139
|
format.csv do
|
141
|
-
send_data csv_data(@rows), type: "text/csv; charset=utf-8; header=present", disposition: "attachment; filename=\"#{@query
|
140
|
+
send_data csv_data(@rows), type: "text/csv; charset=utf-8; header=present", disposition: "attachment; filename=\"#{@query.try(:name).try(:parameterize).presence || 'query'}.csv\""
|
142
141
|
end
|
143
142
|
end
|
144
143
|
end
|
@@ -146,7 +145,7 @@ module Blazer
|
|
146
145
|
def refresh
|
147
146
|
data_source = Blazer.data_sources[@query.data_source]
|
148
147
|
@statement = @query.statement.dup
|
149
|
-
process_vars(@statement)
|
148
|
+
process_vars(@statement, @query.data_source)
|
150
149
|
Blazer.transform_statement.call(data_source, @statement) if Blazer.transform_statement
|
151
150
|
data_source.clear_cache(@statement)
|
152
151
|
redirect_to query_path(@query, variable_params)
|
@@ -157,7 +156,10 @@ module Blazer
|
|
157
156
|
@query = Blazer::Query.new
|
158
157
|
@query.creator = blazer_user if @query.respond_to?(:creator)
|
159
158
|
end
|
160
|
-
|
159
|
+
unless @query.editable?(blazer_user)
|
160
|
+
@query.errors.add(:base, "Sorry, permission denied")
|
161
|
+
end
|
162
|
+
if @query.errors.empty? && @query.update(query_params)
|
161
163
|
redirect_to query_path(@query, variable_params)
|
162
164
|
else
|
163
165
|
render :edit
|
@@ -165,7 +167,7 @@ module Blazer
|
|
165
167
|
end
|
166
168
|
|
167
169
|
def destroy
|
168
|
-
@query.destroy
|
170
|
+
@query.destroy if @query.editable?(blazer_user)
|
169
171
|
redirect_to root_url
|
170
172
|
end
|
171
173
|
|
@@ -179,14 +181,16 @@ module Blazer
|
|
179
181
|
def set_queries(limit = nil)
|
180
182
|
@my_queries =
|
181
183
|
if blazer_user
|
182
|
-
|
183
|
-
queries = Blazer::Query.where(id:
|
184
|
-
|
184
|
+
favorite_query_ids = Blazer::Audit.where(user_id: blazer_user.id).where("created_at > ?", 30.days.ago).where("query_id IS NOT NULL").group(:query_id).order("count_all desc").count.keys
|
185
|
+
queries = Blazer::Query.named.where(id: favorite_query_ids)
|
186
|
+
queries = queries.includes(:creator) if Blazer.user_class
|
187
|
+
queries = queries.index_by(&:id)
|
188
|
+
favorite_query_ids.map { |query_id| queries[query_id] }.compact
|
185
189
|
else
|
186
190
|
[]
|
187
191
|
end
|
188
192
|
|
189
|
-
@queries = Blazer::Query.order(:name)
|
193
|
+
@queries = Blazer::Query.named.order(:name)
|
190
194
|
@queries = @queries.where("id NOT IN (?)", @my_queries.map(&:id)) if @my_queries.any?
|
191
195
|
@queries = @queries.includes(:creator) if Blazer.user_class
|
192
196
|
@queries = @queries.limit(limit) if limit
|
@@ -209,9 +213,15 @@ module Blazer
|
|
209
213
|
csv << rows.first.keys
|
210
214
|
end
|
211
215
|
rows.each do |row|
|
212
|
-
csv << row.
|
216
|
+
csv << row.map { |k, v| v.is_a?(Time) ? blazer_time_value(k, v) : v }
|
213
217
|
end
|
214
218
|
end
|
215
219
|
end
|
220
|
+
|
221
|
+
def blazer_time_value(k, v)
|
222
|
+
# yuck, instance var
|
223
|
+
@data_source.local_time_suffix.any? { |s| k.ends_with?(s) } ? v.to_s.sub(" UTC", "") : v.in_time_zone(Blazer.time_zone)
|
224
|
+
end
|
225
|
+
helper_method :blazer_time_value
|
216
226
|
end
|
217
227
|
end
|
data/app/models/blazer/query.rb
CHANGED
@@ -6,15 +6,20 @@ module Blazer
|
|
6
6
|
has_many :dashboards, through: :dashboard_queries
|
7
7
|
has_many :audits
|
8
8
|
|
9
|
-
validates :name, presence: true
|
10
9
|
validates :statement, presence: true
|
11
10
|
|
11
|
+
scope :named, -> { where("name <> ''") }
|
12
|
+
|
12
13
|
def to_param
|
13
|
-
[id, name.gsub("'", "").parameterize
|
14
|
+
[id, name].compact.join("-").gsub("'", "").parameterize
|
14
15
|
end
|
15
16
|
|
16
17
|
def friendly_name
|
17
|
-
name.gsub(/\[.+\]/, "").strip
|
18
|
+
name.to_s.gsub(/\[.+\]/, "").strip
|
19
|
+
end
|
20
|
+
|
21
|
+
def editable?(user)
|
22
|
+
(name.present? && name.first != "*") || user == creator
|
18
23
|
end
|
19
24
|
end
|
20
25
|
end
|
@@ -10,7 +10,7 @@
|
|
10
10
|
<div class="form-group">
|
11
11
|
<%= f.label :query_id, "Query" %>
|
12
12
|
<div class="hide">
|
13
|
-
<%= f.select :query_id, Blazer::Query.order(:name).map { |q| [q.name, q.id] }, {include_blank: true} %>
|
13
|
+
<%= f.select :query_id, Blazer::Query.named.order(:name).map { |q| [q.name, q.id] }, {include_blank: true} %>
|
14
14
|
</div>
|
15
15
|
<script>
|
16
16
|
$("#check_query_id").selectize().parents(".hide").removeClass("hide");
|
@@ -38,7 +38,7 @@ li:hover .glyphicon-remove {
|
|
38
38
|
<div class="form-group">
|
39
39
|
<%= f.label :query_id, "Add Chart" %>
|
40
40
|
<div class="hide">
|
41
|
-
<%= select_tag :query_id, options_for_select(Blazer::Query.order(:name).map { |q| [q.name, q.id] }), {include_blank: true, placeholder: "Select chart"} %>
|
41
|
+
<%= select_tag :query_id, options_for_select(Blazer::Query.named.order(:name).map { |q| [q.name, q.id] }), {include_blank: true, placeholder: "Select chart"} %>
|
42
42
|
</div>
|
43
43
|
<script>
|
44
44
|
$("#query_id").selectize().parents(".hide").removeClass("hide");
|
@@ -24,7 +24,7 @@
|
|
24
24
|
</h3>
|
25
25
|
</div>
|
26
26
|
<div class="col-sm-3 text-right">
|
27
|
-
<%= link_to "Edit", edit_query_path(@query, variable_params), class: "btn btn-default" %>
|
27
|
+
<%= link_to "Edit", edit_query_path(@query, variable_params), class: "btn btn-default", disabled: !@query.editable?(blazer_user) %>
|
28
28
|
<%= link_to "Fork", new_query_path(variable_params.merge(fork_query_id: @query.id, data_source: @query.data_source, name: @query.name)), class: "btn btn-info" %>
|
29
29
|
|
30
30
|
<% if !@error && @success %>
|
data/lib/blazer.rb
CHANGED
@@ -56,10 +56,16 @@ module Blazer
|
|
56
56
|
error = nil
|
57
57
|
tries = 0
|
58
58
|
# try 3 times on timeout errors
|
59
|
-
|
60
|
-
rows, error, cached_at = data_sources[check.query.data_source].run_statement(check.query.statement, refresh_cache: true)
|
61
|
-
|
62
|
-
|
59
|
+
while tries < 3
|
60
|
+
columns, rows, error, cached_at = data_sources[check.query.data_source].run_statement(check.query.statement, refresh_cache: true)
|
61
|
+
if error == Blazer::TIMEOUT_MESSAGE
|
62
|
+
Rails.logger.info "[blazer timeout] #{check.query.name}"
|
63
|
+
tries += 1
|
64
|
+
sleep(10)
|
65
|
+
else
|
66
|
+
break
|
67
|
+
end
|
68
|
+
end
|
63
69
|
check.update_state(rows, error)
|
64
70
|
end
|
65
71
|
end
|
data/lib/blazer/data_source.rb
CHANGED
@@ -32,6 +32,10 @@ module Blazer
|
|
32
32
|
settings["smart_variables"] || {}
|
33
33
|
end
|
34
34
|
|
35
|
+
def variable_defaults
|
36
|
+
settings["variable_defaults"] || {}
|
37
|
+
end
|
38
|
+
|
35
39
|
def timeout
|
36
40
|
settings["timeout"]
|
37
41
|
end
|
@@ -40,6 +44,10 @@ module Blazer
|
|
40
44
|
settings["cache"]
|
41
45
|
end
|
42
46
|
|
47
|
+
def local_time_suffix
|
48
|
+
@local_time_suffix ||= Array(settings["local_time_suffix"])
|
49
|
+
end
|
50
|
+
|
43
51
|
def use_transaction?
|
44
52
|
settings.key?("use_transaction") ? settings["use_transaction"] : true
|
45
53
|
end
|
@@ -82,7 +90,7 @@ module Blazer
|
|
82
90
|
end
|
83
91
|
rescue ActiveRecord::StatementInvalid => e
|
84
92
|
error = e.message.sub(/.+ERROR: /, "")
|
85
|
-
error = Blazer::TIMEOUT_MESSAGE if error.include?("canceling statement due to statement timeout") || error.include?("cancelled on user's request")
|
93
|
+
error = Blazer::TIMEOUT_MESSAGE if error.include?("canceling statement due to statement timeout") || error.include?("cancelled on user's request") || error.include?("system requested abort query")
|
86
94
|
end
|
87
95
|
end
|
88
96
|
|
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: 1.
|
4
|
+
version: 1.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Andrew Kane
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-03-
|
11
|
+
date: 2016-03-23 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|