rails-flog 1.3.2 → 1.6.1
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 +5 -5
- data/.gitignore +2 -0
- data/.rubocop.yml +25 -0
- data/.travis.yml +25 -6
- data/Gemfile +2 -0
- data/README.md +13 -2
- data/Rakefile +7 -5
- data/gemfiles/rails_4_2_x.gemfile +8 -0
- data/gemfiles/rails_5_0_x.gemfile +8 -0
- data/gemfiles/rails_5_1_x.gemfile +8 -0
- data/gemfiles/rails_5_2_x.gemfile +8 -0
- data/gemfiles/rails_6_0_x.gemfile +8 -0
- data/lib/flog.rb +6 -6
- data/lib/flog/configuration.rb +33 -9
- data/lib/flog/params_formattable.rb +55 -45
- data/lib/flog/payload_value_shuntable.rb +19 -7
- data/lib/flog/sql_formattable.rb +41 -33
- data/lib/flog/status.rb +40 -24
- data/lib/flog/version.rb +3 -2
- data/rails-flog.gemspec +21 -19
- data/test/test_helper.rb +39 -26
- data/test/unit/params_formattable_test.rb +89 -50
- data/test/unit/payload_value_shuntable_test.rb +19 -18
- data/test/unit/sql_formattable_test.rb +144 -55
- data/test/unit/status_test.rb +96 -82
- metadata +57 -41
- data/gemfiles/rails_3_2_x.gemfile +0 -7
- data/gemfiles/rails_4_0_x.gemfile +0 -7
- data/gemfiles/rails_4_1_x.gemfile +0 -8
data/lib/flog/status.rb
CHANGED
@@ -1,33 +1,49 @@
|
|
1
|
-
#
|
2
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'rails'
|
3
4
|
|
4
5
|
module Flog
|
6
|
+
# Status returns checke result of switch files
|
5
7
|
class Status
|
6
|
-
SWITCH_FILE_NAME =
|
7
|
-
SQL_SWITCH_FILE_NAME =
|
8
|
-
PARAMS_SWITCH_FILE_NAME =
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
8
|
+
SWITCH_FILE_NAME = 'no-flog.txt'
|
9
|
+
SQL_SWITCH_FILE_NAME = 'no-flog-sql.txt'
|
10
|
+
PARAMS_SWITCH_FILE_NAME = 'no-flog-params.txt'
|
11
|
+
class << self
|
12
|
+
def enabled?
|
13
|
+
!switch_file_exists?(SWITCH_FILE_NAME)
|
14
|
+
rescue StandardError
|
15
|
+
true
|
16
|
+
end
|
15
17
|
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
18
|
+
def sql_formattable?
|
19
|
+
enabled? && !switch_file_exists?(SQL_SWITCH_FILE_NAME)
|
20
|
+
rescue StandardError
|
21
|
+
true
|
22
|
+
end
|
21
23
|
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
24
|
+
def params_formattable?
|
25
|
+
enabled? && !switch_file_exists?(PARAMS_SWITCH_FILE_NAME)
|
26
|
+
rescue StandardError
|
27
|
+
true
|
28
|
+
end
|
29
|
+
|
30
|
+
def switch_file_base_path
|
31
|
+
if Rails.root&.exist?
|
32
|
+
Rails.root
|
33
|
+
else
|
34
|
+
Pathname.new(File.expand_path(File.dirname(__FILE__) + '../../'))
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def switch_file_dir_path
|
39
|
+
switch_file_base_path.join('tmp')
|
40
|
+
end
|
41
|
+
|
42
|
+
private
|
27
43
|
|
28
|
-
|
29
|
-
|
30
|
-
|
44
|
+
def switch_file_exists?(file_name)
|
45
|
+
switch_file_dir_path.join(file_name).exist?
|
46
|
+
end
|
31
47
|
end
|
32
48
|
end
|
33
49
|
end
|
data/lib/flog/version.rb
CHANGED
data/rails-flog.gemspec
CHANGED
@@ -1,30 +1,32 @@
|
|
1
|
-
#
|
2
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
lib = File.expand_path('lib', __dir__)
|
3
4
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
5
|
require 'flog/version'
|
5
6
|
|
6
7
|
Gem::Specification.new do |spec|
|
7
|
-
spec.name =
|
8
|
+
spec.name = 'rails-flog'
|
8
9
|
spec.version = Flog::VERSION
|
9
|
-
spec.authors = [
|
10
|
-
spec.email = [
|
11
|
-
spec.description =
|
12
|
-
spec.summary =
|
13
|
-
spec.homepage =
|
14
|
-
spec.license =
|
10
|
+
spec.authors = ['pinzolo']
|
11
|
+
spec.email = ['pinzolo@gmail.com']
|
12
|
+
spec.description = 'This formats parameters and sql in rails log.'
|
13
|
+
spec.summary = 'Rails log formatter for parameters and sql'
|
14
|
+
spec.homepage = 'https://github.com/pinzolo/rails-flog'
|
15
|
+
spec.license = 'MIT'
|
15
16
|
|
16
|
-
spec.files = `git ls-files`.split(
|
17
|
+
spec.files = `git ls-files`.split($INPUT_RECORD_SEPARATOR)
|
17
18
|
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
18
19
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
|
-
spec.require_paths = [
|
20
|
+
spec.require_paths = ['lib']
|
20
21
|
|
21
|
-
spec.add_development_dependency
|
22
|
-
spec.add_development_dependency
|
23
|
-
spec.add_development_dependency
|
24
|
-
spec.add_development_dependency
|
25
|
-
spec.add_development_dependency
|
22
|
+
spec.add_development_dependency 'bundler'
|
23
|
+
spec.add_development_dependency 'coveralls'
|
24
|
+
spec.add_development_dependency 'minitest'
|
25
|
+
spec.add_development_dependency 'rake'
|
26
|
+
spec.add_development_dependency 'rubocop'
|
27
|
+
spec.add_development_dependency 'sqlite3'
|
26
28
|
|
27
|
-
spec.add_dependency
|
28
|
-
spec.add_dependency
|
29
|
-
spec.add_dependency
|
29
|
+
spec.add_dependency 'anbt-sql-formatter', '>=0.0.7'
|
30
|
+
spec.add_dependency 'amazing_print'
|
31
|
+
spec.add_dependency 'rails', '>=4.2.0'
|
30
32
|
end
|
data/test/test_helper.rb
CHANGED
@@ -1,43 +1,56 @@
|
|
1
|
-
#
|
2
|
-
|
3
|
-
require
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'coveralls'
|
4
|
+
require 'simplecov'
|
4
5
|
SimpleCov.formatter = Coveralls::SimpleCov::Formatter
|
5
6
|
SimpleCov.start do
|
6
7
|
add_filter '/test/'
|
7
8
|
add_filter '/bundle/'
|
8
9
|
end
|
9
10
|
|
10
|
-
|
11
|
-
require
|
12
|
-
require "minitest/autorun"
|
13
|
-
require "mocha/api"
|
11
|
+
require 'flog'
|
12
|
+
require 'minitest/autorun'
|
14
13
|
|
15
|
-
|
16
|
-
|
14
|
+
unless defined?(TestLogger)
|
15
|
+
class TestLogger
|
16
|
+
attr_accessor :debugs, :infos, :errors
|
17
17
|
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
18
|
+
def initialize
|
19
|
+
@debugs = []
|
20
|
+
@infos = []
|
21
|
+
@errors = []
|
22
|
+
end
|
23
23
|
|
24
|
-
|
25
|
-
|
26
|
-
|
24
|
+
def debug?
|
25
|
+
true
|
26
|
+
end
|
27
27
|
|
28
|
-
|
29
|
-
|
30
|
-
|
28
|
+
def info?
|
29
|
+
true
|
30
|
+
end
|
31
31
|
|
32
|
-
|
33
|
-
|
32
|
+
def debug(message)
|
33
|
+
@debugs += message.split("\n") if message
|
34
|
+
end
|
35
|
+
|
36
|
+
def info(message)
|
37
|
+
@infos += message.split("\n") if message
|
38
|
+
end
|
39
|
+
|
40
|
+
def error(message)
|
41
|
+
@errors += message.split("\n") if message
|
42
|
+
end
|
34
43
|
end
|
44
|
+
end
|
45
|
+
|
46
|
+
unless defined?(COLOR_SEQ_REGEX)
|
47
|
+
COLOR_SEQ_REGEX = /\e\[(\d+;)*\d+m/.freeze
|
35
48
|
|
36
|
-
def
|
37
|
-
|
49
|
+
def remove_color_seq(log)
|
50
|
+
log.gsub(COLOR_SEQ_REGEX, '')
|
38
51
|
end
|
39
52
|
|
40
|
-
def
|
41
|
-
|
53
|
+
def match_color_seq(log)
|
54
|
+
COLOR_SEQ_REGEX.match(log)
|
42
55
|
end
|
43
56
|
end
|
@@ -1,6 +1,7 @@
|
|
1
|
-
#
|
2
|
-
|
3
|
-
require
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'action_controller'
|
4
|
+
require 'test_helper'
|
4
5
|
|
5
6
|
class TestController < ActionController::Base
|
6
7
|
def initialize(routes)
|
@@ -12,11 +13,11 @@ class TestController < ActionController::Base
|
|
12
13
|
end
|
13
14
|
|
14
15
|
def show
|
15
|
-
|
16
|
+
head :not_found
|
16
17
|
end
|
17
18
|
end
|
18
19
|
|
19
|
-
|
20
|
+
module ParamsFormattableTestHelper
|
20
21
|
def setup
|
21
22
|
# default configuration
|
22
23
|
Flog.configure do |config|
|
@@ -26,11 +27,7 @@ class ParamsFormattableTest < ActionController::TestCase
|
|
26
27
|
|
27
28
|
@old_logger = ActionController::Base.logger
|
28
29
|
ActiveSupport::LogSubscriber.colorize_logging = false
|
29
|
-
|
30
|
-
@routes.draw do
|
31
|
-
get "test/show", to: "test#show"
|
32
|
-
end
|
33
|
-
@controller = TestController.new(@routes)
|
30
|
+
setup_routes
|
34
31
|
super
|
35
32
|
ActionController::Base.logger = TestLogger.new
|
36
33
|
end
|
@@ -40,46 +37,90 @@ class ParamsFormattableTest < ActionController::TestCase
|
|
40
37
|
ActionController::Base.logger = @old_logger
|
41
38
|
end
|
42
39
|
|
40
|
+
def setup_routes
|
41
|
+
@routes = ActionDispatch::Routing::RouteSet.new
|
42
|
+
@routes.draw do
|
43
|
+
get 'test/show', to: 'test#show'
|
44
|
+
end
|
45
|
+
@controller = TestController.new(@routes)
|
46
|
+
end
|
47
|
+
|
48
|
+
def assert_logger(&block)
|
49
|
+
raise ActionController::Base.logger.errors.first if ActionController::Base.logger.errors.present?
|
50
|
+
|
51
|
+
block.call(ActionController::Base.logger)
|
52
|
+
end
|
53
|
+
|
54
|
+
def assert_include(log, *expected_includees)
|
55
|
+
expected_includees.each do |e|
|
56
|
+
assert log.include?(e)
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
def assert_hash(hash)
|
61
|
+
assert_equal hash['foo'], 'foo_value'
|
62
|
+
assert_equal hash['bar']['prop'], 'prop_value'
|
63
|
+
assert_equal hash['bar']['attr'], 'attr_value'
|
64
|
+
end
|
65
|
+
|
66
|
+
def get_show(params)
|
67
|
+
if Gem::Version.new(Rails.version) >= Gem::Version.new('5.0.0')
|
68
|
+
get :show, params: params
|
69
|
+
else
|
70
|
+
get :show, params
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
def hash_from_logs(logs, start, finish)
|
75
|
+
eval(start.upto(finish).reduce('') { |s, n| s + logs[n] })
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
class ParamsFormattableTest < ActionController::TestCase
|
80
|
+
include ParamsFormattableTestHelper
|
81
|
+
|
43
82
|
def test_parameters_log_is_formatted
|
44
|
-
|
83
|
+
get_show foo: 'foo_value', bar: { prop: 'prop_value', attr: 'attr_value' }
|
45
84
|
assert_logger do |logger|
|
46
|
-
logs = logger.infos.map { |log| log
|
47
|
-
assert_equal
|
48
|
-
|
49
|
-
|
50
|
-
assert_equal %( "bar" => "bar_value") , logs[4]
|
51
|
-
assert_equal %(}) , logs[5]
|
85
|
+
logs = logger.infos.map { |log| remove_color_seq(log) }
|
86
|
+
assert_equal ' Parameters: ', logs[1]
|
87
|
+
hash = hash_from_logs(logs, 2, 8)
|
88
|
+
assert_hash hash
|
52
89
|
end
|
53
90
|
end
|
54
91
|
|
55
92
|
def test_colorized_on_colorize_loggin_is_true
|
56
93
|
ActiveSupport::LogSubscriber.colorize_logging = true
|
57
|
-
|
94
|
+
get_show foo: 'foo_value', bar: 'bar_value'
|
58
95
|
assert_logger do |logger|
|
59
|
-
assert
|
96
|
+
assert match_color_seq(logger.infos.join)
|
60
97
|
end
|
61
98
|
end
|
62
99
|
|
63
100
|
def test_not_colorized_on_colorize_loggin_is_false
|
64
|
-
|
65
|
-
|
66
|
-
|
101
|
+
Flog::Status.stub(:enabled?, true) do
|
102
|
+
get_show foo: 'foo_value', bar: 'bar_value'
|
103
|
+
assert_logger do |logger|
|
104
|
+
assert_nil match_color_seq(logger.infos.join)
|
105
|
+
end
|
67
106
|
end
|
68
107
|
end
|
69
108
|
|
70
109
|
def test_parameters_log_is_not_formatted_when_enabled_is_false
|
71
|
-
Flog::Status.
|
72
|
-
|
73
|
-
|
74
|
-
|
110
|
+
Flog::Status.stub(:enabled?, false) do
|
111
|
+
get_show foo: 'foo_value', bar: 'bar_value'
|
112
|
+
assert_logger do |logger|
|
113
|
+
assert_include logger.infos[1], 'Parameters: {', %("foo"=>"foo_value"), %("bar"=>"bar_value")
|
114
|
+
end
|
75
115
|
end
|
76
116
|
end
|
77
117
|
|
78
118
|
def test_parameters_log_is_not_formatted_when_params_formattable_is_false
|
79
|
-
Flog::Status.
|
80
|
-
|
81
|
-
|
82
|
-
|
119
|
+
Flog::Status.stub(:params_formattable?, false) do
|
120
|
+
get_show foo: 'foo_value', bar: 'bar_value'
|
121
|
+
assert_logger do |logger|
|
122
|
+
assert_include logger.infos[1], 'Parameters: {', %("foo"=>"foo_value"), %("bar"=>"bar_value")
|
123
|
+
end
|
83
124
|
end
|
84
125
|
end
|
85
126
|
|
@@ -87,9 +128,9 @@ class ParamsFormattableTest < ActionController::TestCase
|
|
87
128
|
Flog.configure do |config|
|
88
129
|
config.params_key_count_threshold = 2
|
89
130
|
end
|
90
|
-
|
131
|
+
get_show foo: 'foo_value', bar: 'bar_value'
|
91
132
|
assert_logger do |logger|
|
92
|
-
|
133
|
+
assert_include logger.infos[1], 'Parameters: {', %("foo"=>"foo_value"), %("bar"=>"bar_value")
|
93
134
|
end
|
94
135
|
end
|
95
136
|
|
@@ -97,36 +138,34 @@ class ParamsFormattableTest < ActionController::TestCase
|
|
97
138
|
Flog.configure do |config|
|
98
139
|
config.params_key_count_threshold = 3
|
99
140
|
end
|
100
|
-
|
141
|
+
get_show foo: 'foo_value', bar: 'bar_value'
|
101
142
|
assert_logger do |logger|
|
102
|
-
|
143
|
+
assert_include logger.infos[1], 'Parameters: {', %("foo"=>"foo_value"), %("bar"=>"bar_value")
|
103
144
|
end
|
104
145
|
end
|
105
146
|
|
147
|
+
# rubocop:disable Metrics/LineLength
|
106
148
|
def test_parameters_log_is_formatted_when_key_of_parameters_count_is_under_configured_threshold_but_force_on_nested_params_configuration_is_true
|
107
149
|
Flog.configure do |config|
|
108
150
|
config.params_key_count_threshold = 3
|
109
151
|
end
|
110
|
-
|
152
|
+
get_show foo: 'foo_value', bar: { prop: 'prop_value', attr: 'attr_value' }
|
111
153
|
assert_logger do |logger|
|
112
|
-
logs = logger.infos.map { |log| log
|
113
|
-
assert_equal
|
114
|
-
|
115
|
-
|
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]
|
154
|
+
logs = logger.infos.map { |log| remove_color_seq(log) }
|
155
|
+
assert_equal ' Parameters: ', logs[1]
|
156
|
+
hash = hash_from_logs(logs, 2, 8)
|
157
|
+
assert_hash hash
|
121
158
|
end
|
122
159
|
end
|
160
|
+
# rubocop:enable Metrics/LineLength
|
123
161
|
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
162
|
+
def test_parameters_log_is_not_formatted_when_ignore_params_configuration_is_true
|
163
|
+
Flog.configure do |config|
|
164
|
+
config.ignore_params = true
|
165
|
+
end
|
166
|
+
get_show foo: 'foo_value', bar: 'bar_value'
|
167
|
+
assert_logger do |logger|
|
168
|
+
assert_include logger.infos[1], 'Parameters: {', %("foo"=>"foo_value"), %("bar"=>"bar_value")
|
130
169
|
end
|
131
170
|
end
|
132
171
|
end
|
@@ -1,5 +1,6 @@
|
|
1
|
-
#
|
2
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'test_helper'
|
3
4
|
|
4
5
|
class TestClass
|
5
6
|
include Flog::PayloadValueShuntable
|
@@ -8,49 +9,49 @@ end
|
|
8
9
|
class PayloadValueShuntableTest < ActiveSupport::TestCase
|
9
10
|
def setup
|
10
11
|
@tester = TestClass.new
|
11
|
-
@payload = { foo:
|
12
|
+
@payload = { foo: 'foo_value', bar: 'bar_value' }
|
12
13
|
end
|
13
14
|
|
14
15
|
def test_shunt_payload_value
|
15
|
-
@tester.shunt_payload_value(@payload, :foo,
|
16
|
-
assert_equal
|
16
|
+
@tester.shunt_payload_value(@payload, :foo, 'new_value') do
|
17
|
+
assert_equal 'new_value', @payload[:foo]
|
17
18
|
end
|
18
19
|
end
|
19
20
|
|
20
21
|
def test_value_of_other_key_is_not_changed
|
21
|
-
@tester.shunt_payload_value(@payload, :foo,
|
22
|
-
assert_equal
|
22
|
+
@tester.shunt_payload_value(@payload, :foo, 'new_value') do
|
23
|
+
assert_equal 'bar_value', @payload[:bar]
|
23
24
|
end
|
24
25
|
end
|
25
26
|
|
26
27
|
def test_restoration
|
27
|
-
@tester.shunt_payload_value(@payload, :foo,
|
28
|
-
assert_equal
|
28
|
+
@tester.shunt_payload_value(@payload, :foo, 'new_value') do
|
29
|
+
assert_equal 'new_value', @payload[:foo]
|
29
30
|
end
|
30
|
-
assert_equal
|
31
|
+
assert_equal 'foo_value', @payload[:foo]
|
31
32
|
end
|
32
33
|
|
33
34
|
def test_ensure_restoration_on_error_raised_in_block
|
34
35
|
error_raised = false
|
35
36
|
begin
|
36
|
-
@tester.shunt_payload_value(@payload, :foo,
|
37
|
-
raise
|
37
|
+
@tester.shunt_payload_value(@payload, :foo, 'new_value') do
|
38
|
+
raise 'error'
|
38
39
|
end
|
39
|
-
rescue
|
40
|
+
rescue StandardError
|
40
41
|
error_raised = true
|
41
42
|
end
|
42
43
|
assert error_raised
|
43
|
-
assert_equal
|
44
|
+
assert_equal 'foo_value', @payload[:foo]
|
44
45
|
end
|
45
46
|
|
46
47
|
def test_without_block
|
47
|
-
@tester.shunt_payload_value(@payload, :foo,
|
48
|
-
assert_equal
|
48
|
+
@tester.shunt_payload_value(@payload, :foo, 'new_value')
|
49
|
+
assert_equal 'foo_value', @payload[:foo]
|
49
50
|
end
|
50
51
|
|
51
52
|
def test_key_removed_when_give_not_exist_key
|
52
|
-
@tester.shunt_payload_value(@payload, :baz,
|
53
|
-
assert_equal
|
53
|
+
@tester.shunt_payload_value(@payload, :baz, 'new_value') do
|
54
|
+
assert_equal 'new_value', @payload[:baz]
|
54
55
|
end
|
55
56
|
assert_equal false, @payload.key?(:baz)
|
56
57
|
end
|