rails_best_practices 1.19.3 → 1.21.0
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 +0 -1
- data/.travis.yml +2 -3
- data/CHANGELOG.md +10 -11
- data/Gemfile +3 -5
- data/Gemfile.lock +125 -0
- data/Guardfile +2 -0
- data/README.md +5 -1
- data/Rakefile +2 -17
- data/assets/result.html.erb +2 -0
- data/lib/rails_best_practices.rb +4 -2
- data/lib/rails_best_practices/analyzer.rb +63 -51
- data/lib/rails_best_practices/cli.rb +22 -0
- data/lib/rails_best_practices/command.rb +1 -131
- data/lib/rails_best_practices/core/check.rb +63 -55
- data/lib/rails_best_practices/core/checks_loader.rb +24 -23
- 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 +27 -21
- data/lib/rails_best_practices/core/model_associations.rb +10 -5
- 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 +87 -72
- data/lib/rails_best_practices/inline_disables.rb +3 -0
- 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/lexicals/long_line_check.rb +7 -3
- data/lib/rails_best_practices/option_parser.rb +156 -0
- data/lib/rails_best_practices/prepares.rb +1 -1
- data/lib/rails_best_practices/prepares/controller_prepare.rb +23 -17
- data/lib/rails_best_practices/prepares/gemfile_prepare.rb +2 -2
- data/lib/rails_best_practices/prepares/helper_prepare.rb +6 -1
- data/lib/rails_best_practices/prepares/initializer_prepare.rb +3 -3
- data/lib/rails_best_practices/prepares/mailer_prepare.rb +2 -1
- data/lib/rails_best_practices/prepares/model_prepare.rb +63 -23
- data/lib/rails_best_practices/prepares/route_prepare.rb +28 -21
- data/lib/rails_best_practices/prepares/schema_prepare.rb +1 -1
- data/lib/rails_best_practices/reviews/add_model_virtual_attribute_review.rb +38 -34
- data/lib/rails_best_practices/reviews/always_add_db_index_review.rb +94 -88
- data/lib/rails_best_practices/reviews/check_destroy_return_value_review.rb +15 -5
- data/lib/rails_best_practices/reviews/check_save_return_value_review.rb +20 -8
- data/lib/rails_best_practices/reviews/default_scope_is_evil_review.rb +1 -1
- data/lib/rails_best_practices/reviews/dry_bundler_in_capistrano_review.rb +1 -1
- data/lib/rails_best_practices/reviews/hash_syntax_review.rb +16 -16
- data/lib/rails_best_practices/reviews/isolate_seed_data_review.rb +12 -12
- data/lib/rails_best_practices/reviews/keep_finders_on_their_own_model_review.rb +10 -11
- data/lib/rails_best_practices/reviews/law_of_demeter_review.rb +25 -24
- data/lib/rails_best_practices/reviews/move_code_into_controller_review.rb +4 -4
- data/lib/rails_best_practices/reviews/move_code_into_helper_review.rb +9 -10
- data/lib/rails_best_practices/reviews/move_finder_to_named_scope_review.rb +10 -11
- data/lib/rails_best_practices/reviews/needless_deep_nesting_review.rb +24 -22
- data/lib/rails_best_practices/reviews/not_rescue_exception_review.rb +1 -1
- data/lib/rails_best_practices/reviews/not_use_default_route_review.rb +1 -2
- data/lib/rails_best_practices/reviews/not_use_time_ago_in_words_review.rb +1 -1
- data/lib/rails_best_practices/reviews/overuse_route_customizations_review.rb +8 -8
- data/lib/rails_best_practices/reviews/protect_mass_assignment_review.rb +35 -32
- data/lib/rails_best_practices/reviews/remove_empty_helpers_review.rb +4 -4
- data/lib/rails_best_practices/reviews/remove_unused_methods_in_controllers_review.rb +20 -17
- data/lib/rails_best_practices/reviews/remove_unused_methods_in_helpers_review.rb +12 -10
- data/lib/rails_best_practices/reviews/remove_unused_methods_in_models_review.rb +38 -18
- data/lib/rails_best_practices/reviews/replace_complex_creation_with_factory_method_review.rb +11 -11
- data/lib/rails_best_practices/reviews/restrict_auto_generated_routes_review.rb +77 -74
- data/lib/rails_best_practices/reviews/review.rb +2 -1
- data/lib/rails_best_practices/reviews/simplify_render_in_controllers_review.rb +2 -3
- data/lib/rails_best_practices/reviews/simplify_render_in_views_review.rb +12 -12
- data/lib/rails_best_practices/reviews/use_before_filter_review.rb +14 -10
- data/lib/rails_best_practices/reviews/use_model_association_review.rb +15 -15
- data/lib/rails_best_practices/reviews/use_multipart_alternative_as_content_type_of_email_review.rb +24 -22
- data/lib/rails_best_practices/reviews/use_observer_review.rb +28 -28
- data/lib/rails_best_practices/reviews/use_parentheses_in_method_def_review.rb +6 -6
- data/lib/rails_best_practices/reviews/use_query_attribute_review.rb +63 -60
- data/lib/rails_best_practices/reviews/use_say_with_time_in_migrations_review.rb +9 -8
- data/lib/rails_best_practices/reviews/use_scope_access_review.rb +16 -14
- data/lib/rails_best_practices/reviews/use_turbo_sprockets_rails3_review.rb +2 -1
- data/lib/rails_best_practices/version.rb +1 -1
- data/rails_best_practices.gemspec +48 -49
- 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 -18
- 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 +32 -31
- 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 +17 -17
- 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 +141 -76
- 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 +13 -13
- 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 +29 -22
- 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 +32 -22
- 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 -17
- 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 +47 -32
- data/spec/rails_best_practices/reviews/remove_unused_methods_in_helpers_review_spec.rb +21 -14
- data/spec/rails_best_practices/reviews/remove_unused_methods_in_models_review_spec.rb +57 -53
- 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 +20 -14
- 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 +35 -31
- 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 +10 -8
- 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 +61 -59
- metadata +21 -14
@@ -31,14 +31,15 @@ module RailsBestPractices
|
|
31
31
|
node.body.statements.each do |child_node|
|
32
32
|
next if child_node.grep_nodes_count(sexp_type: %i[fcall command], message: WITH_SAY_METHODS) > 0
|
33
33
|
|
34
|
-
receiver_node =
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
34
|
+
receiver_node =
|
35
|
+
if child_node.sexp_type == :method_add_block
|
36
|
+
child_node[1]
|
37
|
+
elsif child_node.sexp_type == :method_add_arg
|
38
|
+
child_node[1]
|
39
|
+
else
|
40
|
+
child_node
|
41
|
+
end
|
42
|
+
if receiver_node.sexp_type == :call
|
42
43
|
add_error('use say with time in migrations', node.file, child_node.line_number)
|
43
44
|
end
|
44
45
|
end
|
@@ -30,28 +30,30 @@ module RailsBestPractices
|
|
30
30
|
|
31
31
|
private
|
32
32
|
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
33
|
+
# check a if node to see
|
34
|
+
#
|
35
|
+
# if the conditional statement is compared with current_user or current_user.id,
|
36
|
+
# and there is a redirect_to method call in the block body,
|
37
|
+
# then it should be replaced by using scope access.
|
38
|
+
def current_user_redirect?(node)
|
39
|
+
all_conditions =
|
40
|
+
if node.conditional_statement == node.conditional_statement.all_conditions
|
40
41
|
[node.conditional_statement]
|
41
42
|
else
|
42
43
|
node.conditional_statement.all_conditions
|
43
44
|
end
|
44
|
-
|
45
|
+
results =
|
46
|
+
all_conditions.map do |condition_node|
|
45
47
|
['==', '!='].include?(condition_node.message.to_s) &&
|
46
48
|
(current_user?(condition_node.argument) || current_user?(condition_node.receiver))
|
47
49
|
end
|
48
|
-
|
49
|
-
|
50
|
+
results.any? { |result| result == true } && node.body.grep_node(message: 'redirect_to')
|
51
|
+
end
|
50
52
|
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
53
|
+
# check a call node to see if it uses current_user, or current_user.id.
|
54
|
+
def current_user?(node)
|
55
|
+
node.to_s == 'current_user' || (node.receiver.to_s == 'current_user' && node.message.to_s == 'id')
|
56
|
+
end
|
55
57
|
end
|
56
58
|
end
|
57
59
|
end
|
@@ -18,7 +18,8 @@ module RailsBestPractices
|
|
18
18
|
# check command node to see if load 'deploy/assets'
|
19
19
|
add_callback :start_command do |node|
|
20
20
|
if Prepares.gems.gem_version('rails').to_i == 3
|
21
|
-
if !Prepares.gems.has_gem?('turbo-sprockets-rails3') &&
|
21
|
+
if !Prepares.gems.has_gem?('turbo-sprockets-rails3') && node.message.to_s == 'load' &&
|
22
|
+
node.arguments.to_s == 'deploy/assets'
|
22
23
|
add_error 'speed up assets precompile with turbo-sprockets-rails3'
|
23
24
|
end
|
24
25
|
end
|
@@ -2,54 +2,53 @@
|
|
2
2
|
|
3
3
|
require File.expand_path('lib/rails_best_practices/version', __dir__)
|
4
4
|
|
5
|
-
Gem::Specification.new do |
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
#{'*' * 80}
|
5
|
+
Gem::Specification.new do |spec|
|
6
|
+
spec.name = 'rails_best_practices'
|
7
|
+
spec.version = RailsBestPractices::VERSION
|
8
|
+
spec.platform = Gem::Platform::RUBY
|
9
|
+
spec.authors = ['Richard Huang']
|
10
|
+
spec.email = ['flyerhzm@gmail.com']
|
11
|
+
spec.homepage = 'http://rails-bestpractices.com'
|
12
|
+
spec.summary = 'a code metric tool for rails codes.'
|
13
|
+
spec.description = 'a code metric tool for rails codes, written in Ruby.'
|
14
|
+
spec.license = 'MIT'
|
15
|
+
|
16
|
+
spec.required_ruby_version = '>= 1.9.0'
|
17
|
+
spec.required_rubygems_version = '>= 1.3.6'
|
18
|
+
|
19
|
+
spec.add_dependency('activesupport')
|
20
|
+
spec.add_dependency('code_analyzer', '>= 0.5.2')
|
21
|
+
spec.add_dependency('erubis')
|
22
|
+
spec.add_dependency('i18n')
|
23
|
+
spec.add_dependency('json')
|
24
|
+
spec.add_dependency('require_all', '~> 3.0')
|
25
|
+
spec.add_dependency('ruby-progressbar')
|
26
|
+
|
27
|
+
spec.add_development_dependency('awesome_print')
|
28
|
+
spec.add_development_dependency('bundler')
|
29
|
+
spec.add_development_dependency('haml')
|
30
|
+
spec.add_development_dependency('rake')
|
31
|
+
spec.add_development_dependency('rspec')
|
32
|
+
spec.add_development_dependency('slim')
|
33
|
+
|
34
|
+
spec.files = `git ls-files`.split($/)
|
35
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
36
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
37
|
+
spec.require_paths = %w[lib assets]
|
38
|
+
|
39
|
+
spec.post_install_message = <<~POST_INSTALL_MESSAGE
|
40
|
+
#{'*' * 80}
|
41
|
+
|
42
|
+
rails_best_practices is a code metric tool to check the quality of rails codes.
|
43
|
+
|
44
|
+
I highly recommend you browse the Rails Best Practices website first.
|
45
|
+
|
46
|
+
http://rails-bestpractices.com
|
47
|
+
|
48
|
+
Enjoy!
|
49
|
+
|
50
|
+
Richard Huang (flyerhzm@gmail.com)
|
51
|
+
|
52
|
+
#{'*' * 80}
|
54
53
|
POST_INSTALL_MESSAGE
|
55
54
|
end
|
@@ -5,8 +5,7 @@ require 'rails_best_practices/reviews/review'
|
|
5
5
|
module RailsBestPractices
|
6
6
|
module Plugins
|
7
7
|
module Reviews
|
8
|
-
class NotUseRailsRootReview < RailsBestPractices::Reviews::Review
|
9
|
-
end
|
8
|
+
class NotUseRailsRootReview < RailsBestPractices::Reviews::Review; end
|
10
9
|
end
|
11
10
|
end
|
12
11
|
end
|
@@ -5,39 +5,70 @@ require 'tmpdir'
|
|
5
5
|
|
6
6
|
module RailsBestPractices
|
7
7
|
describe Analyzer do
|
8
|
-
subject {
|
8
|
+
subject { described_class.new('.') }
|
9
9
|
|
10
10
|
describe '::new' do
|
11
|
-
it '
|
11
|
+
it 'expands a relative path to an absolute' do
|
12
12
|
expect(subject.path).to eq File.expand_path('.')
|
13
13
|
end
|
14
14
|
end
|
15
15
|
|
16
16
|
describe 'expand_dirs_to_files' do
|
17
|
-
it '
|
17
|
+
it 'expands all files in spec directory' do
|
18
18
|
dir = File.dirname(__FILE__)
|
19
19
|
expect(subject.expand_dirs_to_files(dir)).to be_include(dir + '/analyzer_spec.rb')
|
20
20
|
end
|
21
21
|
end
|
22
22
|
|
23
23
|
describe 'file_sort' do
|
24
|
-
it '
|
25
|
-
files = [
|
26
|
-
|
24
|
+
it 'gets models first, mailers, helpers and then others' do
|
25
|
+
files = [
|
26
|
+
'app/controllers/users_controller.rb',
|
27
|
+
'app/mailers/user_mailer.rb',
|
28
|
+
'app/helpers/users_helper.rb',
|
29
|
+
'app/models/user.rb',
|
30
|
+
'app/views/users/index.html.haml',
|
31
|
+
'app/views/users/show.html.slim',
|
32
|
+
'lib/user.rb'
|
33
|
+
]
|
34
|
+
expect(subject.file_sort(files)).to eq(
|
35
|
+
[
|
36
|
+
'app/models/user.rb',
|
37
|
+
'app/mailers/user_mailer.rb',
|
38
|
+
'app/helpers/users_helper.rb',
|
39
|
+
'app/controllers/users_controller.rb',
|
40
|
+
'app/views/users/index.html.haml',
|
41
|
+
'app/views/users/show.html.slim',
|
42
|
+
'lib/user.rb'
|
43
|
+
]
|
44
|
+
)
|
27
45
|
end
|
28
46
|
end
|
29
47
|
|
30
48
|
describe 'file_ignore' do
|
31
49
|
before do
|
32
|
-
@all = [
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
50
|
+
@all = [
|
51
|
+
'app/controllers/users_controller.rb',
|
52
|
+
'app/mailers/user_mailer.rb',
|
53
|
+
'app/models/user.rb',
|
54
|
+
'app/views/users/index.html.haml',
|
55
|
+
'app/views/users/show.html.slim',
|
56
|
+
'lib/user.rb'
|
57
|
+
]
|
58
|
+
@filtered = [
|
59
|
+
'app/controllers/users_controller.rb',
|
60
|
+
'app/mailers/user_mailer.rb',
|
61
|
+
'app/models/user.rb',
|
62
|
+
'app/views/users/index.html.haml',
|
63
|
+
'app/views/users/show.html.slim'
|
64
|
+
]
|
65
|
+
end
|
66
|
+
|
67
|
+
it 'ignores lib' do
|
37
68
|
expect(subject.file_ignore(@all, 'lib/')).to eq(@filtered)
|
38
69
|
end
|
39
70
|
|
40
|
-
it '
|
71
|
+
it 'ignores regexp patterns' do
|
41
72
|
expect(subject.file_ignore(@all, /lib/)).to eq(@filtered)
|
42
73
|
end
|
43
74
|
end
|
@@ -88,7 +119,7 @@ module RailsBestPractices
|
|
88
119
|
end
|
89
120
|
|
90
121
|
describe 'output_terminal_errors' do
|
91
|
-
it '
|
122
|
+
it 'outputs errors in terminal' do
|
92
123
|
check1 = Reviews::LawOfDemeterReview.new
|
93
124
|
check2 = Reviews::UseQueryAttributeReview.new
|
94
125
|
runner = Core::Runner.new(reviews: [check1, check2])
|
@@ -102,11 +133,14 @@ module RailsBestPractices
|
|
102
133
|
subject.output_terminal_errors
|
103
134
|
result = $stdout.string
|
104
135
|
$stdout = $origin_stdout
|
105
|
-
expect(result).to eq(
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
136
|
+
expect(result).to eq(
|
137
|
+
[
|
138
|
+
"\e[31mapp/models/user.rb:10 - law of demeter\e[0m",
|
139
|
+
"\e[31mapp/models/post.rb:100 - use query attribute\e[0m",
|
140
|
+
"\e[32m\nPlease go to https://rails-bestpractices.com to see more useful Rails Best Practices.\e[0m",
|
141
|
+
"\e[31m\nFound 2 warnings.\e[0m"
|
142
|
+
].join("\n") + "\n"
|
143
|
+
)
|
110
144
|
end
|
111
145
|
end
|
112
146
|
|
@@ -114,10 +148,7 @@ module RailsBestPractices
|
|
114
148
|
let(:output_file) { 'rails_best_practices_output.json' }
|
115
149
|
|
116
150
|
subject do
|
117
|
-
described_class.new('.',
|
118
|
-
'format' => 'json',
|
119
|
-
'output-file' => output_file
|
120
|
-
)
|
151
|
+
described_class.new('.', 'format' => 'json', 'output-file' => output_file)
|
121
152
|
end
|
122
153
|
|
123
154
|
let(:check1) { Reviews::LawOfDemeterReview.new }
|
@@ -142,54 +173,54 @@ module RailsBestPractices
|
|
142
173
|
end
|
143
174
|
|
144
175
|
describe 'parse_files' do
|
145
|
-
it '
|
146
|
-
Dir.mktmpdir
|
176
|
+
it 'does not filter out all files when the path contains "vendor"' do
|
177
|
+
Dir.mktmpdir do |random_dir|
|
147
178
|
Dir.mkdir(File.join(random_dir, 'vendor'))
|
148
179
|
Dir.mkdir(File.join(random_dir, 'vendor', 'my_project'))
|
149
180
|
File.open(File.join(random_dir, 'vendor', 'my_project', 'my_file.rb'), 'w') { |file| file << 'woot' }
|
150
|
-
analyzer =
|
181
|
+
analyzer = described_class.new(File.join(random_dir, 'vendor', 'my_project'))
|
151
182
|
expect(analyzer.parse_files).to be_include File.join(random_dir, 'vendor', 'my_project', 'my_file.rb')
|
152
|
-
|
183
|
+
end
|
153
184
|
end
|
154
185
|
|
155
|
-
it '
|
156
|
-
Dir.mktmpdir
|
186
|
+
it 'does not filter out all files when the path contains "spec"' do
|
187
|
+
Dir.mktmpdir do |random_dir|
|
157
188
|
Dir.mkdir(File.join(random_dir, 'spec'))
|
158
189
|
Dir.mkdir(File.join(random_dir, 'spec', 'my_project'))
|
159
190
|
File.open(File.join(random_dir, 'spec', 'my_project', 'my_file.rb'), 'w') { |file| file << 'woot' }
|
160
|
-
analyzer =
|
191
|
+
analyzer = described_class.new(File.join(random_dir, 'spec', 'my_project'))
|
161
192
|
expect(analyzer.parse_files).to be_include File.join(random_dir, 'spec', 'my_project', 'my_file.rb')
|
162
|
-
|
193
|
+
end
|
163
194
|
end
|
164
195
|
|
165
|
-
it '
|
166
|
-
Dir.mktmpdir
|
196
|
+
it 'does not filter out all files when the path contains "test"' do
|
197
|
+
Dir.mktmpdir do |random_dir|
|
167
198
|
Dir.mkdir(File.join(random_dir, 'test'))
|
168
199
|
Dir.mkdir(File.join(random_dir, 'test', 'my_project'))
|
169
200
|
File.open(File.join(random_dir, 'test', 'my_project', 'my_file.rb'), 'w') { |file| file << 'woot' }
|
170
|
-
analyzer =
|
201
|
+
analyzer = described_class.new(File.join(random_dir, 'test', 'my_project'))
|
171
202
|
expect(analyzer.parse_files).to be_include File.join(random_dir, 'test', 'my_project', 'my_file.rb')
|
172
|
-
|
203
|
+
end
|
173
204
|
end
|
174
205
|
|
175
|
-
it '
|
176
|
-
Dir.mktmpdir
|
206
|
+
it 'does not filter out all files when the path contains "features"' do
|
207
|
+
Dir.mktmpdir do |random_dir|
|
177
208
|
Dir.mkdir(File.join(random_dir, 'test'))
|
178
209
|
Dir.mkdir(File.join(random_dir, 'test', 'my_project'))
|
179
210
|
File.open(File.join(random_dir, 'test', 'my_project', 'my_file.rb'), 'w') { |file| file << 'woot' }
|
180
|
-
analyzer =
|
211
|
+
analyzer = described_class.new(File.join(random_dir, 'test', 'my_project'))
|
181
212
|
expect(analyzer.parse_files).to be_include File.join(random_dir, 'test', 'my_project', 'my_file.rb')
|
182
|
-
|
213
|
+
end
|
183
214
|
end
|
184
215
|
|
185
|
-
it '
|
186
|
-
Dir.mktmpdir
|
216
|
+
it 'does not filter out all files when the path contains "tmp"' do
|
217
|
+
Dir.mktmpdir do |random_dir|
|
187
218
|
Dir.mkdir(File.join(random_dir, 'tmp'))
|
188
219
|
Dir.mkdir(File.join(random_dir, 'tmp', 'my_project'))
|
189
220
|
File.open(File.join(random_dir, 'tmp', 'my_project', 'my_file.rb'), 'w') { |file| file << 'woot' }
|
190
|
-
analyzer =
|
221
|
+
analyzer = described_class.new(File.join(random_dir, 'tmp', 'my_project'))
|
191
222
|
expect(analyzer.parse_files).to be_include File.join(random_dir, 'tmp', 'my_project', 'my_file.rb')
|
192
|
-
|
223
|
+
end
|
193
224
|
end
|
194
225
|
end
|
195
226
|
end
|
@@ -4,13 +4,13 @@ require 'spec_helper'
|
|
4
4
|
|
5
5
|
module RailsBestPractices::Core
|
6
6
|
describe Check do
|
7
|
-
let(:check) {
|
7
|
+
let(:check) { described_class.new }
|
8
8
|
|
9
9
|
context 'debug' do
|
10
|
-
it '
|
11
|
-
|
12
|
-
expect(
|
13
|
-
|
10
|
+
it 'is debug mode' do
|
11
|
+
described_class.debug
|
12
|
+
expect(described_class).to be_debug
|
13
|
+
described_class.class_eval { @debug = false }
|
14
14
|
end
|
15
15
|
end
|
16
16
|
end
|
@@ -4,17 +4,17 @@ require 'spec_helper'
|
|
4
4
|
|
5
5
|
module RailsBestPractices::Core
|
6
6
|
describe ChecksLoader do
|
7
|
-
let(:checks_loader) {
|
7
|
+
let(:checks_loader) { described_class.new(RailsBestPractices::Analyzer::DEFAULT_CONFIG) }
|
8
8
|
|
9
9
|
describe 'load_lexicals' do
|
10
|
-
it '
|
10
|
+
it 'loads lexical checks from the default configuration' do
|
11
11
|
lexicals = checks_loader.load_lexicals
|
12
12
|
expect(lexicals.map(&:class)).to include(RailsBestPractices::Lexicals::RemoveTrailingWhitespaceCheck)
|
13
13
|
end
|
14
14
|
end
|
15
15
|
|
16
16
|
describe 'load_reviews' do
|
17
|
-
it '
|
17
|
+
it 'loads the reviews from the default the configuration' do
|
18
18
|
reviews = checks_loader.load_reviews
|
19
19
|
expect(reviews.map(&:class)).to include(RailsBestPractices::Reviews::AlwaysAddDbIndexReview)
|
20
20
|
end
|