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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 7d498bb03f6c2cdf408e73065449df3d27f7d2e4
4
- data.tar.gz: b23b774a851a748277ffd1a1b33a420ca75f35ed
3
+ metadata.gz: f2b31d4024bff8e0f4945c686632c39dfb689b04
4
+ data.tar.gz: 7c5a623ae6bf5522199336a1525935e19b25b548
5
5
  SHA512:
6
- metadata.gz: 6f551893a6c87914244c745aa481e01339465b7c59b97caac8a3c323dc378be92bf8ec39ed8d2ad64012880be5cbb909bdf6c8f5278bd3b85930aa1ab17f5b5a
7
- data.tar.gz: 3fe76a4cb97e6b8f55a338b5c0bbde9564a972bee3fba93bc6b04b9f7bc7331b975abf87fd514b18c5ab6c72039ef2398449539747e9271d1a235fb97a1c236e
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
- statement.scan(/\{.*?\}/).map { |v| v[1...-1] }.uniq
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
- process_vars(@statement)
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 ? @query.name.parameterize : 'query'}.csv\""
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
- if @query.update(query_params)
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
- recent_query_ids = Blazer::Audit.where(user_id: blazer_user.id).where("query_id IS NOT NULL").order("created_at desc").limit(100).pluck(:query_id).uniq.first(20)
183
- queries = Blazer::Query.where(id: recent_query_ids).index_by(&:id)
184
- recent_query_ids.map { |query_id| queries[query_id] }.compact
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.values.map { |v| v.is_a?(Time) ? v.in_time_zone(Blazer.time_zone) : v }
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
@@ -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].join("-")
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");
@@ -1,4 +1,4 @@
1
- <% (@my_queries + @dashboards + @queries).each do |query| %>
1
+ <% (@dashboards + @my_queries + @queries).each do |query| %>
2
2
  <% is_query = query.is_a?(Blazer::Query) %>
3
3
  <tr>
4
4
  <td class="query <%= "dashboard" unless is_query %>">
@@ -32,7 +32,8 @@
32
32
 
33
33
  <script>
34
34
  var options = {
35
- valueNames: ['query', 'creator']
35
+ valueNames: ['query', 'creator'],
36
+ page: 200
36
37
  };
37
38
 
38
39
  function updateList() {
@@ -98,7 +98,7 @@
98
98
  <% row.each do |k, v| %>
99
99
  <td>
100
100
  <% if v.is_a?(Time) %>
101
- <% v = v.in_time_zone(Blazer.time_zone) %>
101
+ <% v = blazer_time_value(k, v) %>
102
102
  <% end %>
103
103
 
104
104
  <% unless v.nil? %>
@@ -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
- begin
60
- rows, error, cached_at = data_sources[check.query.data_source].run_statement(check.query.statement, refresh_cache: true)
61
- tries += 1
62
- end while error && error.include?("canceling statement due to statement timeout") && tries < 3
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
@@ -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
 
@@ -1,3 +1,3 @@
1
1
  module Blazer
2
- VERSION = "1.1.1"
2
+ VERSION = "1.2.0"
3
3
  end
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.1.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-07 00:00:00.000000000 Z
11
+ date: 2016-03-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails