rails_best_practices 1.20.0 → 1.22.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 +4 -4
- data/CHANGELOG.md +9 -0
- data/Gemfile +2 -1
- data/Gemfile.lock +49 -43
- data/Guardfile +2 -0
- data/Rakefile +2 -0
- data/assets/result.html.erb +2 -0
- data/lib/rails_best_practices/analyzer.rb +59 -48
- data/lib/rails_best_practices/core/check.rb +39 -32
- data/lib/rails_best_practices/core/checks_loader.rb +8 -6
- data/lib/rails_best_practices/core/configs.rb +1 -2
- data/lib/rails_best_practices/core/controllers.rb +1 -2
- data/lib/rails_best_practices/core/error.rb +1 -1
- data/lib/rails_best_practices/core/helpers.rb +1 -2
- data/lib/rails_best_practices/core/mailers.rb +1 -2
- data/lib/rails_best_practices/core/methods.rb +21 -16
- data/lib/rails_best_practices/core/model_associations.rb +9 -4
- data/lib/rails_best_practices/core/models.rb +1 -2
- data/lib/rails_best_practices/core/modules.rb +1 -1
- data/lib/rails_best_practices/core/routes.rb +2 -2
- data/lib/rails_best_practices/core/runner.rb +49 -34
- data/lib/rails_best_practices/inline_disables/comment_ripper.rb +19 -0
- data/lib/rails_best_practices/inline_disables/inline_disable.rb +50 -0
- data/lib/rails_best_practices/inline_disables.rb +3 -0
- data/lib/rails_best_practices/lexicals/long_line_check.rb +7 -3
- data/lib/rails_best_practices/option_parser.rb +22 -6
- data/lib/rails_best_practices/prepares/controller_prepare.rb +15 -3
- data/lib/rails_best_practices/prepares/gemfile_prepare.rb +1 -1
- data/lib/rails_best_practices/prepares/helper_prepare.rb +6 -1
- data/lib/rails_best_practices/prepares/initializer_prepare.rb +2 -2
- data/lib/rails_best_practices/prepares/mailer_prepare.rb +1 -0
- data/lib/rails_best_practices/prepares/model_prepare.rb +52 -12
- data/lib/rails_best_practices/prepares/route_prepare.rb +16 -10
- data/lib/rails_best_practices/prepares.rb +1 -1
- data/lib/rails_best_practices/reviews/add_model_virtual_attribute_review.rb +15 -13
- data/lib/rails_best_practices/reviews/always_add_db_index_review.rb +34 -29
- data/lib/rails_best_practices/reviews/check_destroy_return_value_review.rb +14 -5
- data/lib/rails_best_practices/reviews/check_save_return_value_review.rb +19 -8
- data/lib/rails_best_practices/reviews/hash_syntax_review.rb +5 -5
- data/lib/rails_best_practices/reviews/isolate_seed_data_review.rb +4 -4
- data/lib/rails_best_practices/reviews/keep_finders_on_their_own_model_review.rb +7 -8
- data/lib/rails_best_practices/reviews/law_of_demeter_review.rb +6 -6
- data/lib/rails_best_practices/reviews/move_code_into_controller_review.rb +1 -1
- data/lib/rails_best_practices/reviews/move_code_into_helper_review.rb +6 -7
- data/lib/rails_best_practices/reviews/move_finder_to_named_scope_review.rb +7 -8
- data/lib/rails_best_practices/reviews/needless_deep_nesting_review.rb +12 -10
- data/lib/rails_best_practices/reviews/not_use_default_route_review.rb +1 -2
- data/lib/rails_best_practices/reviews/overuse_route_customizations_review.rb +5 -5
- data/lib/rails_best_practices/reviews/protect_mass_assignment_review.rb +5 -2
- data/lib/rails_best_practices/reviews/remove_unused_methods_in_controllers_review.rb +6 -3
- data/lib/rails_best_practices/reviews/remove_unused_methods_in_helpers_review.rb +6 -4
- data/lib/rails_best_practices/reviews/remove_unused_methods_in_models_review.rb +29 -9
- data/lib/rails_best_practices/reviews/replace_complex_creation_with_factory_method_review.rb +3 -3
- data/lib/rails_best_practices/reviews/restrict_auto_generated_routes_review.rb +17 -15
- data/lib/rails_best_practices/reviews/simplify_render_in_controllers_review.rb +1 -2
- data/lib/rails_best_practices/reviews/simplify_render_in_views_review.rb +3 -3
- data/lib/rails_best_practices/reviews/use_before_filter_review.rb +2 -1
- data/lib/rails_best_practices/reviews/use_model_association_review.rb +5 -5
- data/lib/rails_best_practices/reviews/use_multipart_alternative_as_content_type_of_email_review.rb +9 -8
- data/lib/rails_best_practices/reviews/use_observer_review.rb +9 -9
- data/lib/rails_best_practices/reviews/use_query_attribute_review.rb +26 -26
- data/lib/rails_best_practices/reviews/use_say_with_time_in_migrations_review.rb +8 -7
- data/lib/rails_best_practices/reviews/use_scope_access_review.rb +17 -15
- data/lib/rails_best_practices/reviews/use_turbo_sprockets_rails3_review.rb +2 -1
- data/lib/rails_best_practices/version.rb +1 -1
- data/lib/rails_best_practices.rb +2 -2
- data/rails_best_practices.gemspec +39 -38
- data/spec/fixtures/lib/rails_best_practices/plugins/reviews/not_use_rails_root_review.rb +1 -2
- data/spec/rails_best_practices/analyzer_spec.rb +73 -42
- data/spec/rails_best_practices/core/check_spec.rb +5 -5
- data/spec/rails_best_practices/core/checks_loader_spec.rb +3 -3
- data/spec/rails_best_practices/core/configs_spec.rb +1 -1
- data/spec/rails_best_practices/core/controllers_spec.rb +1 -1
- data/spec/rails_best_practices/core/error_spec.rb +21 -21
- data/spec/rails_best_practices/core/except_methods_spec.rb +7 -7
- data/spec/rails_best_practices/core/gems_spec.rb +4 -4
- data/spec/rails_best_practices/core/helpers_spec.rb +1 -1
- data/spec/rails_best_practices/core/klasses_spec.rb +3 -3
- data/spec/rails_best_practices/core/mailers_spec.rb +1 -1
- data/spec/rails_best_practices/core/methods_spec.rb +6 -6
- data/spec/rails_best_practices/core/model_associations_spec.rb +10 -6
- data/spec/rails_best_practices/core/model_attributes_spec.rb +4 -4
- data/spec/rails_best_practices/core/models_spec.rb +1 -1
- data/spec/rails_best_practices/core/modules_spec.rb +5 -5
- data/spec/rails_best_practices/core/routes_spec.rb +5 -5
- data/spec/rails_best_practices/core/runner_spec.rb +9 -7
- data/spec/rails_best_practices/core_ext/erubis_spec.rb +10 -10
- data/spec/rails_best_practices/inline_disables/inline_disable_spec.rb +62 -0
- data/spec/rails_best_practices/lexicals/long_line_check_spec.rb +11 -10
- data/spec/rails_best_practices/lexicals/remove_tab_check_spec.rb +6 -6
- data/spec/rails_best_practices/lexicals/remove_trailing_whitespace_check_spec.rb +6 -6
- data/spec/rails_best_practices/prepares/config_prepare_spec.rb +2 -2
- data/spec/rails_best_practices/prepares/controller_prepare_spec.rb +18 -10
- data/spec/rails_best_practices/prepares/gemfile_prepare_spec.rb +2 -2
- data/spec/rails_best_practices/prepares/helper_prepare_spec.rb +3 -3
- data/spec/rails_best_practices/prepares/initializer_prepare_spec.rb +3 -3
- data/spec/rails_best_practices/prepares/mailer_prepare_spec.rb +2 -2
- data/spec/rails_best_practices/prepares/model_prepare_spec.rb +79 -43
- data/spec/rails_best_practices/prepares/route_prepare_spec.rb +138 -77
- data/spec/rails_best_practices/prepares/schema_prepare_spec.rb +2 -2
- data/spec/rails_best_practices/reviews/add_model_virtual_attribute_review_spec.rb +18 -12
- data/spec/rails_best_practices/reviews/always_add_db_index_review_spec.rb +28 -22
- data/spec/rails_best_practices/reviews/check_destroy_return_value_review_spec.rb +15 -13
- data/spec/rails_best_practices/reviews/check_save_return_value_review_spec.rb +31 -21
- data/spec/rails_best_practices/reviews/default_scope_is_evil_review_spec.rb +6 -6
- data/spec/rails_best_practices/reviews/dry_bundler_in_capistrano_review_spec.rb +5 -5
- data/spec/rails_best_practices/reviews/hash_syntax_review_spec.rb +9 -9
- data/spec/rails_best_practices/reviews/isolate_seed_data_review_spec.rb +7 -7
- data/spec/rails_best_practices/reviews/keep_finders_on_their_own_model_review_spec.rb +9 -9
- data/spec/rails_best_practices/reviews/law_of_demeter_review_spec.rb +21 -14
- data/spec/rails_best_practices/reviews/move_code_into_controller_review_spec.rb +6 -6
- data/spec/rails_best_practices/reviews/move_code_into_helper_review_spec.rb +11 -6
- data/spec/rails_best_practices/reviews/move_code_into_model_review_spec.rb +26 -16
- data/spec/rails_best_practices/reviews/move_finder_to_named_scope_review_spec.rb +7 -7
- data/spec/rails_best_practices/reviews/move_model_logic_into_model_review_spec.rb +9 -7
- data/spec/rails_best_practices/reviews/needless_deep_nesting_review_spec.rb +9 -9
- data/spec/rails_best_practices/reviews/not_rescue_exception_review_spec.rb +9 -9
- data/spec/rails_best_practices/reviews/not_use_default_route_review_spec.rb +5 -5
- data/spec/rails_best_practices/reviews/not_use_time_ago_in_words_review_spec.rb +7 -7
- data/spec/rails_best_practices/reviews/overuse_route_customizations_review_spec.rb +7 -7
- data/spec/rails_best_practices/reviews/protect_mass_assignment_review_spec.rb +24 -19
- data/spec/rails_best_practices/reviews/remove_empty_helpers_review_spec.rb +6 -6
- data/spec/rails_best_practices/reviews/remove_unused_methods_in_controllers_review_spec.rb +44 -31
- data/spec/rails_best_practices/reviews/remove_unused_methods_in_helpers_review_spec.rb +17 -12
- data/spec/rails_best_practices/reviews/remove_unused_methods_in_models_review_spec.rb +46 -44
- data/spec/rails_best_practices/reviews/replace_complex_creation_with_factory_method_review_spec.rb +10 -8
- data/spec/rails_best_practices/reviews/replace_instance_variable_with_local_variable_review_spec.rb +16 -10
- data/spec/rails_best_practices/reviews/restrict_auto_generated_routes_review_spec.rb +54 -31
- data/spec/rails_best_practices/reviews/simplify_render_in_controllers_review_spec.rb +9 -9
- data/spec/rails_best_practices/reviews/simplify_render_in_views_review_spec.rb +13 -13
- data/spec/rails_best_practices/reviews/use_before_filter_review_spec.rb +11 -9
- data/spec/rails_best_practices/reviews/use_model_association_review_spec.rb +7 -7
- data/spec/rails_best_practices/reviews/use_multipart_alternative_as_content_type_of_email_review_spec.rb +21 -17
- data/spec/rails_best_practices/reviews/use_observer_review_spec.rb +6 -6
- data/spec/rails_best_practices/reviews/use_parentheses_in_method_def_review_spec.rb +9 -7
- data/spec/rails_best_practices/reviews/use_query_attribute_review_spec.rb +31 -24
- data/spec/rails_best_practices/reviews/use_say_with_time_in_migrations_review_spec.rb +15 -11
- data/spec/rails_best_practices/reviews/use_scope_access_review_spec.rb +14 -14
- data/spec/rails_best_practices/reviews/use_turbo_sprockets_rails3_review_spec.rb +10 -8
- metadata +12 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 36bdd893273a363e797a90d58df2426f0429f94637171cdf803d4cfe3a3c0033
|
4
|
+
data.tar.gz: c2fc8eb82530d50615ecfd423da421c056fb309fd4edcdde91ea5cbe4c9ed2c2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 158478715edfea916abf0666e24665ac0da4aa5e6784df370a78f44654f2b817d415866ec363503bb7081011ace66edb0e32197d9d384c394f59cb429dc8d0ee
|
7
|
+
data.tar.gz: c785c39a4050af719e2513241dcff648dec9fe0d6c8bda3717e50da991fbc8d0d03cc1159fff946ad06d2c7378a5b9247146266e1e94d7d85178cbe50181e067
|
data/CHANGELOG.md
CHANGED
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,9 +1,9 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
rails_best_practices (1.
|
4
|
+
rails_best_practices (1.22.1)
|
5
5
|
activesupport
|
6
|
-
code_analyzer (>= 0.5.
|
6
|
+
code_analyzer (>= 0.5.2)
|
7
7
|
erubis
|
8
8
|
i18n
|
9
9
|
json
|
@@ -13,74 +13,81 @@ PATH
|
|
13
13
|
GEM
|
14
14
|
remote: https://rubygems.org/
|
15
15
|
specs:
|
16
|
-
activesupport (6.
|
16
|
+
activesupport (6.1.4.1)
|
17
17
|
concurrent-ruby (~> 1.0, >= 1.0.2)
|
18
|
-
i18n (>=
|
19
|
-
minitest (
|
20
|
-
tzinfo (~>
|
21
|
-
zeitwerk (~> 2.
|
18
|
+
i18n (>= 1.6, < 2)
|
19
|
+
minitest (>= 5.1)
|
20
|
+
tzinfo (~> 2.0)
|
21
|
+
zeitwerk (~> 2.3)
|
22
22
|
awesome_print (1.8.0)
|
23
|
-
code_analyzer (0.5.
|
23
|
+
code_analyzer (0.5.2)
|
24
24
|
sexp_processor
|
25
|
-
coderay (1.1.
|
26
|
-
concurrent-ruby (1.1.
|
25
|
+
coderay (1.1.3)
|
26
|
+
concurrent-ruby (1.1.9)
|
27
27
|
coveralls (0.8.23)
|
28
28
|
json (>= 1.8, < 3)
|
29
29
|
simplecov (~> 0.16.1)
|
30
30
|
term-ansicolor (~> 1.3)
|
31
31
|
thor (>= 0.19.4, < 2.0)
|
32
32
|
tins (~> 1.6)
|
33
|
-
diff-lcs (1.
|
33
|
+
diff-lcs (1.4.4)
|
34
34
|
docile (1.3.2)
|
35
35
|
erubis (2.7.0)
|
36
|
-
ffi (1.
|
37
|
-
formatador (0.
|
38
|
-
guard (2.
|
36
|
+
ffi (1.15.4)
|
37
|
+
formatador (0.3.0)
|
38
|
+
guard (2.18.0)
|
39
39
|
formatador (>= 0.2.4)
|
40
40
|
listen (>= 2.7, < 4.0)
|
41
41
|
lumberjack (>= 1.0.12, < 2.0)
|
42
42
|
nenv (~> 0.1)
|
43
43
|
notiffany (~> 0.0)
|
44
|
-
pry (>= 0.
|
44
|
+
pry (>= 0.13.0)
|
45
45
|
shellany (~> 0.0)
|
46
46
|
thor (>= 0.18.1)
|
47
|
-
guard-
|
47
|
+
guard-compat (1.2.1)
|
48
|
+
guard-rspec (4.7.3)
|
48
49
|
guard (~> 2.1)
|
49
|
-
|
50
|
+
guard-compat (~> 1.1)
|
51
|
+
rspec (>= 2.99.0, < 4.0)
|
50
52
|
haml (5.1.2)
|
51
53
|
temple (>= 0.8.0)
|
52
54
|
tilt
|
53
|
-
i18n (1.
|
55
|
+
i18n (1.8.10)
|
54
56
|
concurrent-ruby (~> 1.0)
|
55
57
|
json (2.3.0)
|
56
|
-
listen (3.
|
58
|
+
listen (3.7.0)
|
57
59
|
rb-fsevent (~> 0.10, >= 0.10.3)
|
58
60
|
rb-inotify (~> 0.9, >= 0.9.10)
|
59
|
-
lumberjack (1.
|
60
|
-
method_source (0.
|
61
|
-
minitest (5.
|
61
|
+
lumberjack (1.2.8)
|
62
|
+
method_source (1.0.0)
|
63
|
+
minitest (5.14.4)
|
62
64
|
nenv (0.3.0)
|
63
65
|
notiffany (0.1.3)
|
64
66
|
nenv (~> 0.1)
|
65
67
|
shellany (~> 0.0)
|
66
|
-
pry (0.
|
67
|
-
coderay (~> 1.1
|
68
|
-
method_source (~>
|
68
|
+
pry (0.14.1)
|
69
|
+
coderay (~> 1.1)
|
70
|
+
method_source (~> 1.0)
|
69
71
|
rake (13.0.1)
|
70
|
-
rb-fsevent (0.
|
72
|
+
rb-fsevent (0.11.0)
|
71
73
|
rb-inotify (0.10.1)
|
72
74
|
ffi (~> 1.0)
|
73
75
|
require_all (3.0.0)
|
74
|
-
rspec (
|
75
|
-
rspec-core (~>
|
76
|
-
rspec-expectations (~>
|
77
|
-
rspec-mocks (~>
|
78
|
-
rspec-core (
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
76
|
+
rspec (3.10.0)
|
77
|
+
rspec-core (~> 3.10.0)
|
78
|
+
rspec-expectations (~> 3.10.0)
|
79
|
+
rspec-mocks (~> 3.10.0)
|
80
|
+
rspec-core (3.10.1)
|
81
|
+
rspec-support (~> 3.10.0)
|
82
|
+
rspec-expectations (3.10.1)
|
83
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
84
|
+
rspec-support (~> 3.10.0)
|
85
|
+
rspec-mocks (3.10.2)
|
86
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
87
|
+
rspec-support (~> 3.10.0)
|
88
|
+
rspec-support (3.10.2)
|
89
|
+
ruby-progressbar (1.11.0)
|
90
|
+
sexp_processor (4.15.3)
|
84
91
|
shellany (0.0.1)
|
85
92
|
simplecov (0.16.1)
|
86
93
|
docile (~> 1.1)
|
@@ -93,13 +100,12 @@ GEM
|
|
93
100
|
temple (0.8.2)
|
94
101
|
term-ansicolor (1.7.1)
|
95
102
|
tins (~> 1.0)
|
96
|
-
thor (1.0
|
97
|
-
thread_safe (0.3.6)
|
103
|
+
thor (1.1.0)
|
98
104
|
tilt (2.0.10)
|
99
105
|
tins (1.22.2)
|
100
|
-
tzinfo (
|
101
|
-
|
102
|
-
zeitwerk (2.
|
106
|
+
tzinfo (2.0.4)
|
107
|
+
concurrent-ruby (~> 1.0)
|
108
|
+
zeitwerk (2.5.1)
|
103
109
|
|
104
110
|
PLATFORMS
|
105
111
|
ruby
|
@@ -114,8 +120,8 @@ DEPENDENCIES
|
|
114
120
|
pry
|
115
121
|
rails_best_practices!
|
116
122
|
rake
|
117
|
-
rspec
|
123
|
+
rspec
|
118
124
|
slim
|
119
125
|
|
120
126
|
BUNDLED WITH
|
121
|
-
2.
|
127
|
+
2.2.22
|
data/Guardfile
CHANGED
data/Rakefile
CHANGED
data/assets/result.html.erb
CHANGED
@@ -115,6 +115,8 @@
|
|
115
115
|
<td class='filename'>
|
116
116
|
<% if @github %>
|
117
117
|
<a href='<%= @github_name %>/blob/<%= @last_commit_id %>/<%= error.short_filename %>#L<%= error.first_line_number %>' target='_blank'><%= error.short_filename %></a>
|
118
|
+
<% elsif @atom %>
|
119
|
+
<a href='atom://core/open/file?filename=<%= File.expand_path(error.filename) %>&line=<%= error.line_number %>'><%= error.short_filename %></a>
|
118
120
|
<% elsif @textmate %>
|
119
121
|
<a href='txmt://open/?url=file://<%= File.expand_path(error.filename) %>&line=<%= error.line_number %>'><%= error.short_filename %></a>
|
120
122
|
<% elsif @sublime %>
|
@@ -104,30 +104,31 @@ module RailsBestPractices
|
|
104
104
|
#
|
105
105
|
# @return [Array] all files for parsing
|
106
106
|
def parse_files
|
107
|
-
@parse_files ||=
|
108
|
-
|
109
|
-
|
107
|
+
@parse_files ||=
|
108
|
+
begin
|
109
|
+
files = expand_dirs_to_files(@path)
|
110
|
+
files = file_sort(files)
|
110
111
|
|
111
|
-
|
112
|
-
|
113
|
-
|
112
|
+
if @options['only'].present?
|
113
|
+
files = file_accept(files, @options['only'])
|
114
|
+
end
|
114
115
|
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
116
|
+
# By default, tmp, vender, spec, test, features are ignored.
|
117
|
+
%w[vendor spec test features tmp].each do |dir|
|
118
|
+
files = file_ignore(files, File.join(@path, dir)) unless @options[dir]
|
119
|
+
end
|
119
120
|
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
121
|
+
# Exclude files based on exclude regexes if the option is set.
|
122
|
+
@options['exclude'].each do |pattern|
|
123
|
+
files = file_ignore(files, pattern)
|
124
|
+
end
|
124
125
|
|
125
|
-
|
126
|
-
|
127
|
-
|
126
|
+
%w[Capfile Gemfile Gemfile.lock].each do |file|
|
127
|
+
files.unshift File.join(@path, file)
|
128
|
+
end
|
128
129
|
|
129
|
-
|
130
|
-
|
130
|
+
files.compact
|
131
|
+
end
|
131
132
|
end
|
132
133
|
|
133
134
|
# expand all files with extenstion rb, erb, haml, slim, builder and rxml under the dirs
|
@@ -158,7 +159,10 @@ module RailsBestPractices
|
|
158
159
|
models = files.find_all { |file| file =~ Core::Check::MODEL_FILES }
|
159
160
|
mailers = files.find_all { |file| file =~ Core::Check::MAILER_FILES }
|
160
161
|
helpers = files.find_all { |file| file =~ Core::Check::HELPER_FILES }
|
161
|
-
others =
|
162
|
+
others =
|
163
|
+
files.find_all do |file|
|
164
|
+
file !~ Core::Check::MAILER_FILES && file !~ Core::Check::MODEL_FILES && file !~ Core::Check::HELPER_FILES
|
165
|
+
end
|
162
166
|
models + mailers + helpers + others
|
163
167
|
end
|
164
168
|
|
@@ -194,7 +198,10 @@ module RailsBestPractices
|
|
194
198
|
def load_hg_info
|
195
199
|
hg_progressbar = ProgressBar.create(title: 'Hg Info', total: errors.size) if display_bar?
|
196
200
|
errors.each do |error|
|
197
|
-
|
201
|
+
info_command = "cd #{@runner.class.base_path}"
|
202
|
+
info_command += " && hg blame -lvcu #{error.filename[@runner.class.base_path.size..-1].gsub(%r{^/}, '')}"
|
203
|
+
info_command += " | sed -n /:#{error.line_number.split(',').first}:/p"
|
204
|
+
hg_info = system(info_command)
|
198
205
|
unless hg_info == ''
|
199
206
|
hg_commit_username = hg_info.split(':')[0].strip
|
200
207
|
error.hg_username = hg_commit_username.split(/\ /)[0..-2].join(' ')
|
@@ -208,9 +215,11 @@ module RailsBestPractices
|
|
208
215
|
# load git commit and git username info.
|
209
216
|
def load_git_info
|
210
217
|
git_progressbar = ProgressBar.create(title: 'Git Info', total: errors.size) if display_bar?
|
211
|
-
start = @runner.class.base_path =~
|
218
|
+
start = @runner.class.base_path =~ %r{/$} ? @runner.class.base_path.size : @runner.class.base_path.size + 1
|
212
219
|
errors.each do |error|
|
213
|
-
|
220
|
+
info_command = "cd #{@runner.class.base_path}"
|
221
|
+
info_command += " && git blame -L #{error.line_number.split(',').first},+1 #{error.filename[start..-1]}"
|
222
|
+
git_info = system(info_command)
|
214
223
|
unless git_info == ''
|
215
224
|
git_commit, git_username = git_info.split(/\d{4}-\d{2}-\d{2}/).first.split('(')
|
216
225
|
error.git_commit = git_commit.split(' ').first.strip
|
@@ -224,7 +233,10 @@ module RailsBestPractices
|
|
224
233
|
# output errors with html format.
|
225
234
|
def output_html_errors
|
226
235
|
require 'erubis'
|
227
|
-
template =
|
236
|
+
template =
|
237
|
+
@options['template'] ?
|
238
|
+
File.read(File.expand_path(@options['template'])) :
|
239
|
+
File.read(File.join(File.dirname(__FILE__), '..', '..', 'assets', 'result.html.erb'))
|
228
240
|
|
229
241
|
if @options['with-github']
|
230
242
|
last_commit_id = @options['last-commit-id'] || `cd #{@runner.class.base_path} && git rev-parse HEAD`.chomp
|
@@ -235,27 +247,29 @@ module RailsBestPractices
|
|
235
247
|
File.open(@options['output-file'], 'w+') do |file|
|
236
248
|
eruby = Erubis::Eruby.new(template)
|
237
249
|
file.puts eruby.evaluate(
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
|
244
|
-
|
245
|
-
|
246
|
-
|
247
|
-
|
248
|
-
|
249
|
-
|
250
|
+
errors: errors,
|
251
|
+
error_types: error_types,
|
252
|
+
atom: @options['with-atom'],
|
253
|
+
textmate: @options['with-textmate'],
|
254
|
+
vscode: @options['with-vscode'],
|
255
|
+
sublime: @options['with-sublime'],
|
256
|
+
mvim: @options['with-mvim'],
|
257
|
+
github: @options['with-github'],
|
258
|
+
github_name: @options['github-name'],
|
259
|
+
last_commit_id: last_commit_id,
|
260
|
+
git: @options['with-git'],
|
261
|
+
hg: @options['with-hg']
|
262
|
+
)
|
250
263
|
end
|
251
264
|
end
|
252
265
|
|
253
266
|
def output_xml_errors
|
254
267
|
require 'rexml/document'
|
255
268
|
|
256
|
-
document =
|
257
|
-
|
258
|
-
|
269
|
+
document =
|
270
|
+
REXML::Document.new.tap do |d|
|
271
|
+
d << REXML::XMLDecl.new
|
272
|
+
end
|
259
273
|
|
260
274
|
checkstyle = REXML::Element.new('checkstyle', document)
|
261
275
|
|
@@ -289,13 +303,10 @@ module RailsBestPractices
|
|
289
303
|
|
290
304
|
# output errors with json format.
|
291
305
|
def output_json_errors
|
292
|
-
errors_as_hashes =
|
293
|
-
|
294
|
-
filename:
|
295
|
-
|
296
|
-
message: err.message
|
297
|
-
}
|
298
|
-
end
|
306
|
+
errors_as_hashes =
|
307
|
+
errors.map do |err|
|
308
|
+
{ filename: err.filename, line_number: err.line_number, message: err.message }
|
309
|
+
end
|
299
310
|
|
300
311
|
File.open(@options['output-file'], 'w+') do |file|
|
301
312
|
file.write JSON.dump(errors_as_hashes)
|
@@ -316,8 +327,8 @@ module RailsBestPractices
|
|
316
327
|
|
317
328
|
# analyze source codes.
|
318
329
|
def analyze_source_codes
|
319
|
-
@bar = ProgressBar.create(title: 'Source Code', total: parse_files.size *
|
320
|
-
%w[lexical prepare review].each { |process| send(:process, process) }
|
330
|
+
@bar = ProgressBar.create(title: 'Source Code', total: parse_files.size * 4) if display_bar?
|
331
|
+
%w[lexical prepare review inline_disable].each { |process| send(:process, process) }
|
321
332
|
@bar.finish if display_bar?
|
322
333
|
end
|
323
334
|
|
@@ -3,24 +3,25 @@
|
|
3
3
|
module RailsBestPractices
|
4
4
|
module Core
|
5
5
|
# A Check class that takes charge of checking the sexp.
|
6
|
+
|
6
7
|
class Check < CodeAnalyzer::Checker
|
7
|
-
ALL_FILES =
|
8
|
-
CONTROLLER_FILES = /
|
9
|
-
MIGRATION_FILES = /
|
10
|
-
MODEL_FILES = /
|
11
|
-
MAILER_FILES = /
|
12
|
-
VIEW_FILES = /
|
13
|
-
PARTIAL_VIEW_FILES = /
|
14
|
-
ROUTE_FILES = /
|
15
|
-
SCHEMA_FILE = /
|
16
|
-
HELPER_FILES = /
|
17
|
-
DEPLOY_FILES = /
|
18
|
-
CONFIG_FILES = /
|
19
|
-
INITIALIZER_FILES = /
|
20
|
-
CAPFILE = /Capfile
|
21
|
-
GEMFILE_LOCK = /Gemfile\.lock
|
22
|
-
|
23
|
-
SKIP_FILES = /
|
8
|
+
ALL_FILES = /.*/.freeze
|
9
|
+
CONTROLLER_FILES = %r{app/(controllers|cells)/.*\.rb$}.freeze
|
10
|
+
MIGRATION_FILES = %r{db/migrate/.*\.rb$}.freeze
|
11
|
+
MODEL_FILES = %r{app/models/.*\.rb$}.freeze
|
12
|
+
MAILER_FILES = %r{app/models/.*mailer\.rb$|app/mailers/.*\.rb}.freeze
|
13
|
+
VIEW_FILES = %r{app/(views|cells)/.*\.(erb|haml|slim|builder|rxml)$}.freeze
|
14
|
+
PARTIAL_VIEW_FILES = %r{app/(views|cells)/.*/_.*\.(erb|haml|slim|builder|rxml)$}.freeze
|
15
|
+
ROUTE_FILES = %r{config/routes.*\.rb}.freeze
|
16
|
+
SCHEMA_FILE = %r{db/schema\.rb}.freeze
|
17
|
+
HELPER_FILES = %r{app/helpers/.*\.rb$}.freeze
|
18
|
+
DEPLOY_FILES = %r{config/deploy.*\.rb}.freeze
|
19
|
+
CONFIG_FILES = %r{config/(application|environment|environments/.*)\.rb}.freeze
|
20
|
+
INITIALIZER_FILES = %r{config/initializers/.*\.rb}.freeze
|
21
|
+
CAPFILE = /Capfile/.freeze
|
22
|
+
GEMFILE_LOCK = /Gemfile\.lock/.freeze
|
23
|
+
|
24
|
+
SKIP_FILES = %r{db/schema.rb}.freeze
|
24
25
|
|
25
26
|
def initialize(options = {})
|
26
27
|
options.each do |key, value|
|
@@ -33,7 +34,7 @@ module RailsBestPractices
|
|
33
34
|
# @param [String] the file name of node.
|
34
35
|
# @return [Boolean] true if the check will need to parse the file.
|
35
36
|
def parse_file?(node_file)
|
36
|
-
is_interesting_file?(node_file)
|
37
|
+
node_file.is_a?(String) && is_interesting_file?(node_file) && !is_ignored?(node_file)
|
37
38
|
end
|
38
39
|
|
39
40
|
def is_interesting_file?(node_file)
|
@@ -60,13 +61,10 @@ module RailsBestPractices
|
|
60
61
|
# @param [String] filename, is the filename of source code
|
61
62
|
# @param [Integer] line_number, is the line number of the source code which is reviewing
|
62
63
|
def add_error(message, filename = @node.file, line_number = @node.line_number)
|
63
|
-
errors <<
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
type: self.class.to_s,
|
68
|
-
url: url
|
69
|
-
)
|
64
|
+
errors <<
|
65
|
+
RailsBestPractices::Core::Error.new(
|
66
|
+
filename: filename, line_number: line_number, message: message, type: self.class.to_s, url: url
|
67
|
+
)
|
70
68
|
end
|
71
69
|
|
72
70
|
# errors that violate the rails best practices.
|
@@ -99,9 +97,9 @@ module RailsBestPractices
|
|
99
97
|
end
|
100
98
|
end
|
101
99
|
|
102
|
-
class <<self
|
100
|
+
class << self
|
103
101
|
def url(url = nil)
|
104
|
-
url ?
|
102
|
+
url ? @url = url : @url
|
105
103
|
end
|
106
104
|
|
107
105
|
def debug?
|
@@ -114,6 +112,7 @@ module RailsBestPractices
|
|
114
112
|
end
|
115
113
|
|
116
114
|
# Helper to parse the class name.
|
115
|
+
|
117
116
|
module Classable
|
118
117
|
def self.included(base)
|
119
118
|
base.class_eval do
|
@@ -165,6 +164,7 @@ module RailsBestPractices
|
|
165
164
|
end
|
166
165
|
|
167
166
|
# Helper to parse the module name.
|
167
|
+
|
168
168
|
module Moduleable
|
169
169
|
def self.included(base)
|
170
170
|
base.class_eval do
|
@@ -197,7 +197,15 @@ module RailsBestPractices
|
|
197
197
|
module Callable
|
198
198
|
def self.included(base)
|
199
199
|
base.class_eval do
|
200
|
-
interesting_nodes :call,
|
200
|
+
interesting_nodes :call,
|
201
|
+
:fcall,
|
202
|
+
:var_ref,
|
203
|
+
:vcall,
|
204
|
+
:command_call,
|
205
|
+
:command,
|
206
|
+
:alias,
|
207
|
+
:bare_assoc_hash,
|
208
|
+
:method_add_arg
|
201
209
|
|
202
210
|
# remembe the message of call node.
|
203
211
|
add_callback :start_call do |node|
|
@@ -371,10 +379,8 @@ module RailsBestPractices
|
|
371
379
|
class_name = '.*' if class_name == '*'
|
372
380
|
class_expression = Regexp.new class_name
|
373
381
|
|
374
|
-
class_names =
|
375
|
-
|
376
|
-
.map(&:extend_class_name)
|
377
|
-
.compact
|
382
|
+
class_names =
|
383
|
+
Prepares.klasses.select { |klass| klass.class_name == method.class_name }.map(&:extend_class_name).compact
|
378
384
|
|
379
385
|
class_names.unshift method.class_name
|
380
386
|
matched = class_names.any? { |name| name =~ class_expression }
|
@@ -385,6 +391,7 @@ module RailsBestPractices
|
|
385
391
|
end
|
386
392
|
|
387
393
|
# Helper to parse the access control.
|
394
|
+
|
388
395
|
module Accessable
|
389
396
|
def self.included(base)
|
390
397
|
base.class_eval do
|
@@ -14,17 +14,19 @@ module RailsBestPractices
|
|
14
14
|
|
15
15
|
# load all reviews according to configuration.
|
16
16
|
def load_reviews
|
17
|
-
load_checks_from_config
|
17
|
+
load_checks_from_config do |check_name|
|
18
|
+
RailsBestPractices::Reviews.const_get(check_name.gsub(/Check$/, 'Review'))
|
19
|
+
end
|
18
20
|
end
|
19
21
|
|
20
22
|
private
|
21
23
|
|
22
|
-
|
24
|
+
# read the checks from yaml config.
|
23
25
|
def checks_from_config
|
24
26
|
@checks ||= YAML.load_file @config
|
25
27
|
end
|
26
28
|
|
27
|
-
|
29
|
+
# load all checks from the configuration
|
28
30
|
def load_checks_from_config(&block)
|
29
31
|
checks_from_config.each_with_object([]) do |check, active_checks|
|
30
32
|
check_instance = instantiate_check(block, *check)
|
@@ -32,13 +34,13 @@ module RailsBestPractices
|
|
32
34
|
end
|
33
35
|
end
|
34
36
|
|
35
|
-
|
37
|
+
# instantiates a check
|
36
38
|
def instantiate_check(block, check_name, options)
|
37
39
|
check_class = load_check_class(check_name, &block)
|
38
|
-
check_class
|
40
|
+
check_class&.new(options || {})
|
39
41
|
end
|
40
42
|
|
41
|
-
|
43
|
+
# loads the class for a check by calling the given block
|
42
44
|
def load_check_class(check_name)
|
43
45
|
yield(check_name)
|
44
46
|
rescue NameError
|
@@ -20,7 +20,7 @@ module RailsBestPractices
|
|
20
20
|
end
|
21
21
|
|
22
22
|
def short_filename
|
23
|
-
File.expand_path(filename)[File.expand_path(Core::Runner.base_path).size..-1].sub(
|
23
|
+
File.expand_path(filename)[File.expand_path(Core::Runner.base_path).size..-1].sub(%r{^/}, '')
|
24
24
|
end
|
25
25
|
|
26
26
|
def first_line_number
|