rails-flog 1.2.0 → 1.3.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: fbd0cbd748320a0c504c00edbc8997475d9bf4c1
4
- data.tar.gz: 0d0775de3b25676721893cf95f0ed7e366888760
3
+ metadata.gz: 7573566571c52550bd3a1fdaf222159101caabb3
4
+ data.tar.gz: 3e19ae5c1197155f93264ac7e28614bbd22596b6
5
5
  SHA512:
6
- metadata.gz: 5183eb309d08dc9faa9ce44084dd8e0a36e5eb94a4e09936f0e4ab67bcd1502064b5db9d8bb8b829cfd2bd2790632b65971429b9469959b98b59e88230fecc07
7
- data.tar.gz: f959260174042393c7ec135d0dc2731c8169d22d0347722f9bb01cf45e4fbf034b49f77b70b4ac3aab3c6b6c77336bad4508b64af4479f2d849d48bdf2555a50
6
+ metadata.gz: 1a196d239d1af127143e19eefb1e8526de7d32684baab1b301cbd4d16aacde126ef35235103cb0546b5fe6a17d5b3c4d207234c6de0d25e467032a964564e206
7
+ data.tar.gz: b0b4ac38af5542776ea16fe73aa28efa774e2bee3b21618044c91c25de4d54ab13541099722039f4411f20dab9417874f7a22f92c36a49502c1b60ec661f116e
data/.travis.yml CHANGED
@@ -2,7 +2,7 @@ language: ruby
2
2
  rvm:
3
3
  - 1.9.3
4
4
  - 2.0.0
5
- # - 2.1.0
5
+ - 2.1.0
6
6
  gemfile:
7
7
  - gemfiles/rails_3_2_x.gemfile
8
8
  - gemfiles/rails_4_0_x.gemfile
data/README.md CHANGED
@@ -87,6 +87,32 @@ Or install it yourself as:
87
87
 
88
88
  Just install.
89
89
 
90
+ ## Configuration
91
+
92
+ Configure in your environment file (ex. `config/environments/development.rb`)
93
+
94
+ ```ruby
95
+ Flog.configure do |config|
96
+ # If this value is true, not format on cached query
97
+ config.ignore_cached_query = false
98
+ # If query duration is under this value, not format
99
+ config.query_duration_threshold = 2.0
100
+ # If key count of parameters is under this value, not format
101
+ config.params_key_count_threshold = 2
102
+ # If this value is true, force format in any situation
103
+ config.force_on_nested_params = false
104
+ end
105
+ ```
106
+
107
+ ### Default value
108
+
109
+ |Attribute |Data type |Default value |
110
+ |:--------------------------|:---------|:-------------|
111
+ |ignore_cached_query |boolean |true |
112
+ |query_duration_threshold |float |0.0 |
113
+ |params_key_count_threshold |integer |1 |
114
+ |force_on_nested_params |boolean |true |
115
+
90
116
  ## Disable temporary
91
117
 
92
118
  If you put a file to `<rails_app>/tmp` direcotry, `rails-flog` will disable format.
@@ -99,7 +125,7 @@ If you put a file to `<rails_app>/tmp` direcotry, `rails-flog` will disable form
99
125
 
100
126
  ## Supported versions
101
127
 
102
- - Ruby: 1.9.3, 2.0.0
128
+ - Ruby: 1.9.3, 2.0.0, 2.1.0
103
129
  - Rails: 3.2.x, 4.0.x
104
130
 
105
131
  ## Contributing
@@ -116,3 +142,5 @@ If you put a file to `<rails_app>/tmp` direcotry, `rails-flog` will disable form
116
142
  - v1.1.0 (2013-12-02 JST): Add feature that disables format by no-flog.txt
117
143
  - v1.1.1 (2013-12-06 JST): Change to alias_method_change from alias for method aliasing
118
144
  - v1.2.0 (2014-01-14 JST): Add feature that disables format partially by no-flog-sql.txt and no-flog-params.txt
145
+ - v1.3.0 (2014-01-26 JST): Add configuration
146
+
data/lib/flog.rb CHANGED
@@ -1,6 +1,7 @@
1
1
  # coding: utf-8
2
2
  require "flog/version"
3
3
  require "flog/status"
4
+ require "flog/configuration"
4
5
  require "flog/sql_formattable"
5
6
  require "flog/params_formattable"
6
7
 
@@ -0,0 +1,30 @@
1
+ # coding: utf-8
2
+ module Flog
3
+ class Configuration
4
+ attr_writer :ignore_cached_query, :force_on_nested_params
5
+ attr_accessor :query_duration_threshold, :params_key_count_threshold
6
+
7
+ def initialize
8
+ @ignore_cached_query = true
9
+ @query_duration_threshold = 0.0
10
+ @params_key_count_threshold = 1
11
+ @force_on_nested_params = true
12
+ end
13
+
14
+ def ignore_cached_query?
15
+ !!@ignore_cached_query
16
+ end
17
+
18
+ def force_on_nested_params?
19
+ !!@force_on_nested_params
20
+ end
21
+ end
22
+
23
+ def self.config
24
+ @@config ||= Flog::Configuration.new
25
+ end
26
+
27
+ def self.configure
28
+ yield(config) if block_given?
29
+ end
30
+ end
@@ -2,13 +2,12 @@
2
2
  require "action_controller/log_subscriber"
3
3
  require "awesome_print"
4
4
  require "flog/payload_value_shuntable"
5
- require "flog/status"
6
5
 
7
6
  class ActionController::LogSubscriber
8
7
  include Flog::PayloadValueShuntable
9
8
 
10
9
  def start_processing_with_flog(event)
11
- return start_processing_without_flog(event) unless Flog::Status.params_formattable?
10
+ return start_processing_without_flog(event) unless formattable?(event)
12
11
 
13
12
  replaced = replace_params(event.payload[:params])
14
13
 
@@ -38,4 +37,17 @@ class ActionController::LogSubscriber
38
37
  end
39
38
  replaced
40
39
  end
40
+
41
+ def formattable?(event)
42
+ return false unless Flog::Status.params_formattable?
43
+
44
+ if Flog.config.force_on_nested_params?
45
+ return true if event.payload[:params].values.any? { |value| value.is_a?(Hash) }
46
+ end
47
+
48
+ threshold = Flog.config.params_key_count_threshold.to_i
49
+ threshold += 1 if event.payload[:params].keys.include?("controller")
50
+ threshold += 1 if event.payload[:params].keys.include?("action")
51
+ event.payload[:params].keys.size > threshold
52
+ end
41
53
  end
@@ -6,7 +6,7 @@ class ActiveRecord::LogSubscriber
6
6
  include Flog::PayloadValueShuntable
7
7
 
8
8
  def sql_with_flog(event)
9
- return sql_without_flog(event) unless Flog::Status.sql_formattable?
9
+ return sql_without_flog(event) unless formattable?(event)
10
10
 
11
11
  formatted = format_sql(event.payload[:sql])
12
12
 
@@ -29,4 +29,14 @@ class ActiveRecord::LogSubscriber
29
29
  rule.indent_string = "\t"
30
30
  AnbtSql::Formatter.new(rule).format(sql.squeeze(" "))
31
31
  end
32
+
33
+ def formattable?(event)
34
+ return false unless Flog::Status.sql_formattable?
35
+
36
+ if event.payload[:name] == "CACHE" && Flog.config.ignore_cached_query?
37
+ return false
38
+ end
39
+
40
+ event.duration >= Flog.config.query_duration_threshold.to_f
41
+ end
32
42
  end
data/lib/flog/version.rb CHANGED
@@ -1,4 +1,4 @@
1
1
  # coding: utf-8
2
2
  module Flog
3
- VERSION = "1.2.0"
3
+ VERSION = "1.3.0"
4
4
  end
@@ -18,6 +18,12 @@ end
18
18
 
19
19
  class ParamsFormattableTest < ActionController::TestCase
20
20
  def setup
21
+ # default configuration
22
+ Flog.configure do |config|
23
+ config.params_key_count_threshold = 1
24
+ config.force_on_nested_params = true
25
+ end
26
+
21
27
  @old_logger = ActionController::Base.logger
22
28
  ActiveSupport::LogSubscriber.colorize_logging = false
23
29
  @routes = ActionDispatch::Routing::RouteSet.new
@@ -77,6 +83,44 @@ class ParamsFormattableTest < ActionController::TestCase
77
83
  end
78
84
  end
79
85
 
86
+ def test_parameters_log_is_not_formatted_when_key_of_parameters_count_equals_to_configured_threshold
87
+ Flog.configure do |config|
88
+ config.params_key_count_threshold = 2
89
+ end
90
+ get :show, foo: "foo_value", bar: "bar_value"
91
+ assert_logger do |logger|
92
+ assert logger.infos[1].include?(%(Parameters: {"foo"=>"foo_value", "bar"=>"bar_value"}))
93
+ end
94
+ end
95
+
96
+ def test_parameters_log_is_not_formatted_when_key_of_parameters_count_is_under_configured_threshold
97
+ Flog.configure do |config|
98
+ config.params_key_count_threshold = 3
99
+ end
100
+ get :show, foo: "foo_value", bar: "bar_value"
101
+ assert_logger do |logger|
102
+ assert logger.infos[1].include?(%(Parameters: {"foo"=>"foo_value", "bar"=>"bar_value"}))
103
+ end
104
+ end
105
+
106
+ def test_parameters_log_is_formatted_when_key_of_parameters_count_is_under_configured_threshold_but_force_on_nested_params_configuration_is_true
107
+ Flog.configure do |config|
108
+ config.params_key_count_threshold = 3
109
+ end
110
+ get :show, foo: "foo_value", bar: { prop: "prop_value", attr: "attr_value" }
111
+ assert_logger do |logger|
112
+ logs = logger.infos.map { |log| log.gsub(/\e\[(\d+;)*\d+m/, "") }
113
+ assert_equal %( Parameters: ) , logs[1]
114
+ assert_equal %({) , logs[2]
115
+ assert_equal %( "foo" => "foo_value",) , logs[3]
116
+ assert_equal %( "bar" => {) , logs[4]
117
+ assert_equal %( "prop" => "prop_value",), logs[5]
118
+ assert_equal %( "attr" => "attr_value") , logs[6]
119
+ assert_equal %( }) , logs[7]
120
+ assert_equal %(}) , logs[8]
121
+ end
122
+ end
123
+
80
124
  private
81
125
  def assert_logger(&block)
82
126
  if ActionController::Base.logger.errors.present?
@@ -15,6 +15,12 @@ class Book < ActiveRecord::Base; end
15
15
 
16
16
  class SqlFormattableTest < ActiveSupport::TestCase
17
17
  def setup
18
+ # default configuration
19
+ Flog.configure do |config|
20
+ config.ignore_cached_query = true
21
+ config.query_duration_threshold = 0.0
22
+ end
23
+
18
24
  @old_logger = ActiveRecord::Base.logger
19
25
  ActiveSupport::LogSubscriber.colorize_logging = false
20
26
  ActiveRecord::Base.logger = TestLogger.new
@@ -68,6 +74,58 @@ class SqlFormattableTest < ActiveSupport::TestCase
68
74
  end
69
75
  end
70
76
 
77
+ def test_sql_is_not_formatted_on_cached_query
78
+ Book.cache do
79
+ Book.where(category: "comics").to_a
80
+ Book.where(category: "comics").to_a
81
+ end
82
+ assert_logger do |logger|
83
+ logs = logger.debugs.map { |log| log.gsub("\t", " ") }
84
+ assert_equal %{ SELECT} , logs[1]
85
+ assert_equal %{ "books" . *} , logs[2]
86
+ assert_equal %{ FROM} , logs[3]
87
+ assert_equal %{ "books"} , logs[4]
88
+ assert_equal %{ WHERE} , logs[5]
89
+ assert_equal %{ "books" . "category" = 'comics'}, logs[6]
90
+ assert logs[7].include?(%(SELECT "books".* FROM "books" WHERE "books"."category" = 'comics'))
91
+ end
92
+ end
93
+
94
+ def test_sql_is_formatted_on_cached_query_when_ignore_cached_query_configration_is_false
95
+ Flog.configure do |config|
96
+ config.ignore_cached_query = false
97
+ end
98
+ Book.cache do
99
+ Book.where(category: "comics").to_a
100
+ Book.where(category: "comics").to_a
101
+ end
102
+ assert_logger do |logger|
103
+ logs = logger.debugs.map { |log| log.gsub("\t", " ") }
104
+ assert_equal %{ SELECT} , logs[1]
105
+ assert_equal %{ "books" . *} , logs[2]
106
+ assert_equal %{ FROM} , logs[3]
107
+ assert_equal %{ "books"} , logs[4]
108
+ assert_equal %{ WHERE} , logs[5]
109
+ assert_equal %{ "books" . "category" = 'comics'}, logs[6]
110
+ assert_equal %{ SELECT} , logs[8]
111
+ assert_equal %{ "books" . *} , logs[9]
112
+ assert_equal %{ FROM} , logs[10]
113
+ assert_equal %{ "books"} , logs[11]
114
+ assert_equal %{ WHERE} , logs[12]
115
+ assert_equal %{ "books" . "category" = 'comics'}, logs[13]
116
+ end
117
+ end
118
+
119
+ def test_sql_is_not_formatted_when_duration_is_under_threshold
120
+ Flog.configure do |config|
121
+ config.query_duration_threshold = 100.0
122
+ end
123
+ Book.where(category: "comics").to_a
124
+ assert_logger do |logger|
125
+ assert logger.debugs.first.include?(%(SELECT "books".* FROM "books" WHERE "books"."category" = 'comics'))
126
+ end
127
+ end
128
+
71
129
  private
72
130
  def assert_logger(&block)
73
131
  if ActiveRecord::Base.logger.errors.present?
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rails-flog
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.0
4
+ version: 1.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - pinzolo
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-01-14 00:00:00.000000000 Z
11
+ date: 2014-01-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -140,6 +140,7 @@ files:
140
140
  - gemfiles/rails_4_0_x.gemfile
141
141
  - gemfiles/rails_4_1_x.gemfile
142
142
  - lib/flog.rb
143
+ - lib/flog/configuration.rb
143
144
  - lib/flog/params_formattable.rb
144
145
  - lib/flog/payload_value_shuntable.rb
145
146
  - lib/flog/sql_formattable.rb