rails_best_practices 1.19.5 → 1.22.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (141) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +1 -0
  3. data/CHANGELOG.md +10 -16
  4. data/Gemfile +2 -1
  5. data/Gemfile.lock +51 -45
  6. data/Guardfile +2 -0
  7. data/Rakefile +2 -17
  8. data/assets/result.html.erb +2 -0
  9. data/lib/rails_best_practices/analyzer.rb +59 -48
  10. data/lib/rails_best_practices/core/check.rb +39 -32
  11. data/lib/rails_best_practices/core/checks_loader.rb +8 -6
  12. data/lib/rails_best_practices/core/configs.rb +1 -2
  13. data/lib/rails_best_practices/core/controllers.rb +1 -2
  14. data/lib/rails_best_practices/core/error.rb +1 -1
  15. data/lib/rails_best_practices/core/helpers.rb +1 -2
  16. data/lib/rails_best_practices/core/mailers.rb +1 -2
  17. data/lib/rails_best_practices/core/methods.rb +21 -16
  18. data/lib/rails_best_practices/core/model_associations.rb +9 -4
  19. data/lib/rails_best_practices/core/models.rb +1 -2
  20. data/lib/rails_best_practices/core/modules.rb +1 -1
  21. data/lib/rails_best_practices/core/routes.rb +2 -2
  22. data/lib/rails_best_practices/core/runner.rb +49 -34
  23. data/lib/rails_best_practices/inline_disables/comment_ripper.rb +19 -0
  24. data/lib/rails_best_practices/inline_disables/inline_disable.rb +50 -0
  25. data/lib/rails_best_practices/inline_disables.rb +3 -0
  26. data/lib/rails_best_practices/lexicals/long_line_check.rb +7 -3
  27. data/lib/rails_best_practices/option_parser.rb +22 -6
  28. data/lib/rails_best_practices/prepares/controller_prepare.rb +15 -3
  29. data/lib/rails_best_practices/prepares/gemfile_prepare.rb +1 -1
  30. data/lib/rails_best_practices/prepares/helper_prepare.rb +6 -1
  31. data/lib/rails_best_practices/prepares/initializer_prepare.rb +2 -2
  32. data/lib/rails_best_practices/prepares/mailer_prepare.rb +1 -0
  33. data/lib/rails_best_practices/prepares/model_prepare.rb +52 -12
  34. data/lib/rails_best_practices/prepares/route_prepare.rb +16 -10
  35. data/lib/rails_best_practices/prepares.rb +1 -1
  36. data/lib/rails_best_practices/reviews/add_model_virtual_attribute_review.rb +15 -13
  37. data/lib/rails_best_practices/reviews/always_add_db_index_review.rb +36 -31
  38. data/lib/rails_best_practices/reviews/check_destroy_return_value_review.rb +14 -5
  39. data/lib/rails_best_practices/reviews/check_save_return_value_review.rb +19 -8
  40. data/lib/rails_best_practices/reviews/hash_syntax_review.rb +5 -5
  41. data/lib/rails_best_practices/reviews/isolate_seed_data_review.rb +4 -4
  42. data/lib/rails_best_practices/reviews/keep_finders_on_their_own_model_review.rb +7 -8
  43. data/lib/rails_best_practices/reviews/law_of_demeter_review.rb +6 -6
  44. data/lib/rails_best_practices/reviews/move_code_into_controller_review.rb +1 -1
  45. data/lib/rails_best_practices/reviews/move_code_into_helper_review.rb +6 -7
  46. data/lib/rails_best_practices/reviews/move_finder_to_named_scope_review.rb +7 -8
  47. data/lib/rails_best_practices/reviews/needless_deep_nesting_review.rb +12 -10
  48. data/lib/rails_best_practices/reviews/not_use_default_route_review.rb +1 -2
  49. data/lib/rails_best_practices/reviews/overuse_route_customizations_review.rb +5 -5
  50. data/lib/rails_best_practices/reviews/protect_mass_assignment_review.rb +5 -2
  51. data/lib/rails_best_practices/reviews/remove_unused_methods_in_controllers_review.rb +6 -3
  52. data/lib/rails_best_practices/reviews/remove_unused_methods_in_helpers_review.rb +6 -4
  53. data/lib/rails_best_practices/reviews/remove_unused_methods_in_models_review.rb +29 -9
  54. data/lib/rails_best_practices/reviews/replace_complex_creation_with_factory_method_review.rb +3 -3
  55. data/lib/rails_best_practices/reviews/restrict_auto_generated_routes_review.rb +17 -15
  56. data/lib/rails_best_practices/reviews/simplify_render_in_controllers_review.rb +1 -2
  57. data/lib/rails_best_practices/reviews/simplify_render_in_views_review.rb +3 -3
  58. data/lib/rails_best_practices/reviews/use_before_filter_review.rb +2 -1
  59. data/lib/rails_best_practices/reviews/use_model_association_review.rb +6 -6
  60. data/lib/rails_best_practices/reviews/use_multipart_alternative_as_content_type_of_email_review.rb +9 -8
  61. data/lib/rails_best_practices/reviews/use_observer_review.rb +9 -9
  62. data/lib/rails_best_practices/reviews/use_query_attribute_review.rb +26 -26
  63. data/lib/rails_best_practices/reviews/use_say_with_time_in_migrations_review.rb +8 -7
  64. data/lib/rails_best_practices/reviews/use_scope_access_review.rb +17 -15
  65. data/lib/rails_best_practices/reviews/use_turbo_sprockets_rails3_review.rb +2 -1
  66. data/lib/rails_best_practices/version.rb +1 -1
  67. data/lib/rails_best_practices.rb +2 -2
  68. data/rails_best_practices.gemspec +35 -36
  69. data/spec/fixtures/lib/rails_best_practices/plugins/reviews/not_use_rails_root_review.rb +1 -2
  70. data/spec/rails_best_practices/analyzer_spec.rb +73 -42
  71. data/spec/rails_best_practices/core/check_spec.rb +5 -5
  72. data/spec/rails_best_practices/core/checks_loader_spec.rb +3 -3
  73. data/spec/rails_best_practices/core/configs_spec.rb +1 -1
  74. data/spec/rails_best_practices/core/controllers_spec.rb +1 -1
  75. data/spec/rails_best_practices/core/error_spec.rb +21 -21
  76. data/spec/rails_best_practices/core/except_methods_spec.rb +7 -7
  77. data/spec/rails_best_practices/core/gems_spec.rb +4 -4
  78. data/spec/rails_best_practices/core/helpers_spec.rb +1 -1
  79. data/spec/rails_best_practices/core/klasses_spec.rb +3 -3
  80. data/spec/rails_best_practices/core/mailers_spec.rb +1 -1
  81. data/spec/rails_best_practices/core/methods_spec.rb +6 -6
  82. data/spec/rails_best_practices/core/model_associations_spec.rb +10 -6
  83. data/spec/rails_best_practices/core/model_attributes_spec.rb +4 -4
  84. data/spec/rails_best_practices/core/models_spec.rb +1 -1
  85. data/spec/rails_best_practices/core/modules_spec.rb +5 -5
  86. data/spec/rails_best_practices/core/routes_spec.rb +5 -5
  87. data/spec/rails_best_practices/core/runner_spec.rb +9 -7
  88. data/spec/rails_best_practices/core_ext/erubis_spec.rb +10 -10
  89. data/spec/rails_best_practices/inline_disables/inline_disable_spec.rb +62 -0
  90. data/spec/rails_best_practices/lexicals/long_line_check_spec.rb +11 -10
  91. data/spec/rails_best_practices/lexicals/remove_tab_check_spec.rb +6 -6
  92. data/spec/rails_best_practices/lexicals/remove_trailing_whitespace_check_spec.rb +6 -6
  93. data/spec/rails_best_practices/prepares/config_prepare_spec.rb +2 -2
  94. data/spec/rails_best_practices/prepares/controller_prepare_spec.rb +18 -10
  95. data/spec/rails_best_practices/prepares/gemfile_prepare_spec.rb +2 -2
  96. data/spec/rails_best_practices/prepares/helper_prepare_spec.rb +3 -3
  97. data/spec/rails_best_practices/prepares/initializer_prepare_spec.rb +3 -3
  98. data/spec/rails_best_practices/prepares/mailer_prepare_spec.rb +2 -2
  99. data/spec/rails_best_practices/prepares/model_prepare_spec.rb +79 -43
  100. data/spec/rails_best_practices/prepares/route_prepare_spec.rb +138 -77
  101. data/spec/rails_best_practices/prepares/schema_prepare_spec.rb +2 -2
  102. data/spec/rails_best_practices/reviews/add_model_virtual_attribute_review_spec.rb +18 -12
  103. data/spec/rails_best_practices/reviews/always_add_db_index_review_spec.rb +28 -22
  104. data/spec/rails_best_practices/reviews/check_destroy_return_value_review_spec.rb +15 -13
  105. data/spec/rails_best_practices/reviews/check_save_return_value_review_spec.rb +31 -21
  106. data/spec/rails_best_practices/reviews/default_scope_is_evil_review_spec.rb +6 -6
  107. data/spec/rails_best_practices/reviews/dry_bundler_in_capistrano_review_spec.rb +5 -5
  108. data/spec/rails_best_practices/reviews/hash_syntax_review_spec.rb +9 -9
  109. data/spec/rails_best_practices/reviews/isolate_seed_data_review_spec.rb +7 -7
  110. data/spec/rails_best_practices/reviews/keep_finders_on_their_own_model_review_spec.rb +9 -9
  111. data/spec/rails_best_practices/reviews/law_of_demeter_review_spec.rb +21 -14
  112. data/spec/rails_best_practices/reviews/move_code_into_controller_review_spec.rb +6 -6
  113. data/spec/rails_best_practices/reviews/move_code_into_helper_review_spec.rb +11 -6
  114. data/spec/rails_best_practices/reviews/move_code_into_model_review_spec.rb +26 -16
  115. data/spec/rails_best_practices/reviews/move_finder_to_named_scope_review_spec.rb +7 -7
  116. data/spec/rails_best_practices/reviews/move_model_logic_into_model_review_spec.rb +9 -7
  117. data/spec/rails_best_practices/reviews/needless_deep_nesting_review_spec.rb +9 -9
  118. data/spec/rails_best_practices/reviews/not_rescue_exception_review_spec.rb +9 -9
  119. data/spec/rails_best_practices/reviews/not_use_default_route_review_spec.rb +5 -5
  120. data/spec/rails_best_practices/reviews/not_use_time_ago_in_words_review_spec.rb +7 -7
  121. data/spec/rails_best_practices/reviews/overuse_route_customizations_review_spec.rb +7 -7
  122. data/spec/rails_best_practices/reviews/protect_mass_assignment_review_spec.rb +24 -19
  123. data/spec/rails_best_practices/reviews/remove_empty_helpers_review_spec.rb +6 -6
  124. data/spec/rails_best_practices/reviews/remove_unused_methods_in_controllers_review_spec.rb +44 -31
  125. data/spec/rails_best_practices/reviews/remove_unused_methods_in_helpers_review_spec.rb +17 -12
  126. data/spec/rails_best_practices/reviews/remove_unused_methods_in_models_review_spec.rb +46 -44
  127. data/spec/rails_best_practices/reviews/replace_complex_creation_with_factory_method_review_spec.rb +10 -8
  128. data/spec/rails_best_practices/reviews/replace_instance_variable_with_local_variable_review_spec.rb +16 -10
  129. data/spec/rails_best_practices/reviews/restrict_auto_generated_routes_review_spec.rb +54 -31
  130. data/spec/rails_best_practices/reviews/simplify_render_in_controllers_review_spec.rb +9 -9
  131. data/spec/rails_best_practices/reviews/simplify_render_in_views_review_spec.rb +13 -13
  132. data/spec/rails_best_practices/reviews/use_before_filter_review_spec.rb +11 -9
  133. data/spec/rails_best_practices/reviews/use_model_association_review_spec.rb +7 -7
  134. data/spec/rails_best_practices/reviews/use_multipart_alternative_as_content_type_of_email_review_spec.rb +21 -17
  135. data/spec/rails_best_practices/reviews/use_observer_review_spec.rb +6 -6
  136. data/spec/rails_best_practices/reviews/use_parentheses_in_method_def_review_spec.rb +9 -7
  137. data/spec/rails_best_practices/reviews/use_query_attribute_review_spec.rb +31 -24
  138. data/spec/rails_best_practices/reviews/use_say_with_time_in_migrations_review_spec.rb +15 -11
  139. data/spec/rails_best_practices/reviews/use_scope_access_review_spec.rb +14 -14
  140. data/spec/rails_best_practices/reviews/use_turbo_sprockets_rails3_review_spec.rb +10 -8
  141. metadata +16 -11
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ce639228ddc1497545e69b3ce97cd43b4832a5e9ebba9cf69e26c01c21831768
4
- data.tar.gz: 9ea6a9454fbc1cd32c2b924066667e418448fea6c823c045bf7853bc0ea05c63
3
+ metadata.gz: 349689325c6d2ac9c0f96f076153f1cceeb93586ff23d9ce2ac3a083befcc9dc
4
+ data.tar.gz: 88f23404986309df3287a5b7c7963374e7faea592b1ce48c100ba9225497c5c5
5
5
  SHA512:
6
- metadata.gz: e89e188603ede56c8f538f1415c352aa477fa8c3b591363380c1603dbbe301af6b0f5b29d834bd3b2e90525eb3418eda50508bdd7fc5a81a40aaf4c75f4e0cab
7
- data.tar.gz: d318bb1faf3c574f8a88e59a54893af1ff1ffadd5e5542d1243b340bd07d72125214c8d4c9343c47ca32777fe8379ffb0f035093a51abe6a583ef3d80820ac97
6
+ metadata.gz: 0e9b9b059759295ffb811c75a4a00c4a76dcf7fac01345590fd3ea7862a717535fc0faad8b1aaf0996c6e2cf86439222292649261667cb0625cab38548364700
7
+ data.tar.gz: 82856757223d3f764ba672b4d443c350c0ecd7f54bfe7e45fb1cd5714316077e6b8ac9c4a74a227a399a7645695bd0f51c7d68d787d1330fc86d9ddfe3dae8a2
data/.travis.yml CHANGED
@@ -1,3 +1,4 @@
1
1
  language: ruby
2
2
  rvm:
3
3
  - 2.6.4
4
+ script: bundle exec rspec spec
data/CHANGELOG.md CHANGED
@@ -1,30 +1,24 @@
1
1
  # Next Release
2
2
 
3
- ## 1.19.5
3
+ ## 1.22.0 (2021-10-27)
4
4
 
5
- * Add the link format for vscode
6
- * Use code_analyzer 0.5.1
5
+ * Support atom editor
7
6
 
8
- ## 1.19.4
7
+ ## 1.21.0 (2021-06-15)
9
8
 
10
- * Add cli class
9
+ * Disable check by inline comment
10
+ * Add type check for string
11
11
 
12
- ## 1.19.3
12
+ ## 1.20.0 (2020-02-29)
13
13
 
14
+ * Support ruby 2.7
15
+ * Add the link format for vscode
16
+ * Add cli class
17
+ * Add table_name and module_prefix to model ignored methods
14
18
  * Fix false positive remove unused method for around_action in
15
19
  controller
16
20
  * Fix current_class_name in end_class callback
17
21
 
18
- ## 1.19.2
19
-
20
- * Integrate with awesomecode.io
21
- * Update to require_all 2.x
22
-
23
- ## 1.19.1
24
-
25
- * Add table_name and module_prefix to model ignored methods
26
- * Forcing requrie_all version
27
-
28
22
  ## 1.19.0 (2017-07-26)
29
23
 
30
24
  * RestrictAutoGeneratedRoutesCheck is compatibale with rails api_only
data/Gemfile CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  source 'https://rubygems.org'
2
4
  gemspec
3
5
 
@@ -6,4 +8,3 @@ gem 'coveralls', require: false
6
8
  gem 'guard'
7
9
  gem 'guard-rspec'
8
10
  gem 'pry'
9
- gem 'rspec', '~> 2.14.0'
data/Gemfile.lock CHANGED
@@ -1,9 +1,9 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- rails_best_practices (1.19.5)
4
+ rails_best_practices (1.22.0)
5
5
  activesupport
6
- code_analyzer (>= 0.5.1)
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.0.2.1)
16
+ activesupport (6.1.4.1)
17
17
  concurrent-ruby (~> 1.0, >= 1.0.2)
18
- i18n (>= 0.7, < 2)
19
- minitest (~> 5.1)
20
- tzinfo (~> 1.1)
21
- zeitwerk (~> 2.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.1)
23
+ code_analyzer (0.5.2)
24
24
  sexp_processor
25
- coderay (1.1.2)
26
- concurrent-ruby (1.1.5)
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.3)
33
+ diff-lcs (1.4.4)
34
34
  docile (1.3.2)
35
35
  erubis (2.7.0)
36
- ffi (1.11.3)
37
- formatador (0.2.5)
38
- guard (2.16.1)
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.9.12)
44
+ pry (>= 0.13.0)
45
45
  shellany (~> 0.0)
46
46
  thor (>= 0.18.1)
47
- guard-rspec (4.3.1)
47
+ guard-compat (1.2.1)
48
+ guard-rspec (4.7.3)
48
49
  guard (~> 2.1)
49
- rspec (>= 2.14, < 4.0)
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.7.0)
55
+ i18n (1.8.10)
54
56
  concurrent-ruby (~> 1.0)
55
57
  json (2.3.0)
56
- listen (3.2.1)
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.0.13)
60
- method_source (0.9.2)
61
- minitest (5.13.0)
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.12.2)
67
- coderay (~> 1.1.0)
68
- method_source (~> 0.9.0)
69
- rake (10.5.0)
70
- rb-fsevent (0.10.3)
68
+ pry (0.14.1)
69
+ coderay (~> 1.1)
70
+ method_source (~> 1.0)
71
+ rake (13.0.1)
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 (2.14.1)
75
- rspec-core (~> 2.14.0)
76
- rspec-expectations (~> 2.14.0)
77
- rspec-mocks (~> 2.14.0)
78
- rspec-core (2.14.8)
79
- rspec-expectations (2.14.5)
80
- diff-lcs (>= 1.1.3, < 2.0)
81
- rspec-mocks (2.14.6)
82
- ruby-progressbar (1.10.1)
83
- sexp_processor (4.13.0)
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.1)
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 (1.2.6)
101
- thread_safe (~> 0.1)
102
- zeitwerk (2.2.2)
106
+ tzinfo (2.0.4)
107
+ concurrent-ruby (~> 1.0)
108
+ zeitwerk (2.5.1)
103
109
 
104
110
  PLATFORMS
105
111
  ruby
@@ -113,9 +119,9 @@ DEPENDENCIES
113
119
  haml
114
120
  pry
115
121
  rails_best_practices!
116
- rake (< 11.0)
117
- rspec (~> 2.14.0)
122
+ rake
123
+ rspec
118
124
  slim
119
125
 
120
126
  BUNDLED WITH
121
- 2.1.2
127
+ 2.2.22
data/Guardfile CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # A sample Guardfile
2
4
  # More info at https://github.com/guard/guard#readme
3
5
 
data/Rakefile CHANGED
@@ -1,18 +1,3 @@
1
- require 'bundler'
2
- require 'bundler/gem_tasks'
3
-
4
- Bundler.setup
5
-
6
- require 'rake'
7
- require 'rspec'
8
- require 'rspec/core/rake_task'
1
+ # frozen_string_literal: true
9
2
 
10
- $LOAD_PATH.unshift File.expand_path('lib', __dir__)
11
- require 'rails_best_practices/version'
12
-
13
- RSpec::Core::RakeTask.new(:spec) do |spec|
14
- spec.pattern = 'spec/**/*_spec.rb'
15
- end
16
-
17
- task default: :spec
18
- task test: :spec
3
+ require 'bundler/gem_tasks'
@@ -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) %>&amp;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) %>&amp;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 ||= begin
108
- files = expand_dirs_to_files(@path)
109
- files = file_sort(files)
107
+ @parse_files ||=
108
+ begin
109
+ files = expand_dirs_to_files(@path)
110
+ files = file_sort(files)
110
111
 
111
- if @options['only'].present?
112
- files = file_accept(files, @options['only'])
113
- end
112
+ if @options['only'].present?
113
+ files = file_accept(files, @options['only'])
114
+ end
114
115
 
115
- # By default, tmp, vender, spec, test, features are ignored.
116
- %w[vendor spec test features tmp].each do |dir|
117
- files = file_ignore(files, File.join(@path, dir)) unless @options[dir]
118
- end
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
- # Exclude files based on exclude regexes if the option is set.
121
- @options['exclude'].each do |pattern|
122
- files = file_ignore(files, pattern)
123
- end
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
- %w[Capfile Gemfile Gemfile.lock].each do |file|
126
- files.unshift File.join(@path, file)
127
- end
126
+ %w[Capfile Gemfile Gemfile.lock].each do |file|
127
+ files.unshift File.join(@path, file)
128
+ end
128
129
 
129
- files.compact
130
- end
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 = files.find_all { |file| file !~ Core::Check::MAILER_FILES && file !~ Core::Check::MODEL_FILES && file !~ Core::Check::HELPER_FILES }
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
- hg_info = `cd #{@runner.class.base_path} && hg blame -lvcu #{error.filename[@runner.class.base_path.size..-1].gsub(/^\//, '')} | sed -n /:#{error.line_number.split(',').first}:/p`
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 =~ /\/$/ ? @runner.class.base_path.size : @runner.class.base_path.size + 1
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
- git_info = `cd #{@runner.class.base_path} && git blame -L #{error.line_number.split(',').first},+1 #{error.filename[start..-1]}`
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 = @options['template'] ? File.read(File.expand_path(@options['template'])) : File.read(File.join(File.dirname(__FILE__), '..', '..', 'assets', 'result.html.erb'))
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
- errors: errors,
239
- error_types: error_types,
240
- textmate: @options['with-textmate'],
241
- vscode: @options['with-vscode'],
242
- sublime: @options['with-sublime'],
243
- mvim: @options['with-mvim'],
244
- github: @options['with-github'],
245
- github_name: @options['github-name'],
246
- last_commit_id: last_commit_id,
247
- git: @options['with-git'],
248
- hg: @options['with-hg']
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 = REXML::Document.new.tap do |d|
257
- d << REXML::XMLDecl.new
258
- end
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 = errors.map do |err|
293
- {
294
- filename: err.filename,
295
- line_number: err.line_number,
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 * 3) if display_bar?
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 = /app\/(controllers|cells)\/.*\.rb$/
9
- MIGRATION_FILES = /db\/migrate\/.*\.rb$/
10
- MODEL_FILES = /app\/models\/.*\.rb$/
11
- MAILER_FILES = /app\/models\/.*mailer\.rb$|app\/mailers\/.*\.rb/
12
- VIEW_FILES = /app\/(views|cells)\/.*\.(erb|haml|slim|builder|rxml)$/
13
- PARTIAL_VIEW_FILES = /app\/(views|cells)\/.*\/_.*\.(erb|haml|slim|builder|rxml)$/
14
- ROUTE_FILES = /config\/routes.*\.rb/
15
- SCHEMA_FILE = /db\/schema\.rb/
16
- HELPER_FILES = /app\/helpers\/.*\.rb$/
17
- DEPLOY_FILES = /config\/deploy.*\.rb/
18
- CONFIG_FILES = /config\/(application|environment|environments\/.*)\.rb/
19
- INITIALIZER_FILES = /config\/initializers\/.*\.rb/
20
- CAPFILE = /Capfile/
21
- GEMFILE_LOCK = /Gemfile\.lock/
22
-
23
- SKIP_FILES = /db\/schema.rb/
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) and !is_ignored?(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 << RailsBestPractices::Core::Error.new(
64
- filename: filename,
65
- line_number: line_number,
66
- message: message,
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 ? @url = url : @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, :fcall, :var_ref, :vcall, :command_call, :command, :alias, :bare_assoc_hash, :method_add_arg
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 = Prepares.klasses
375
- .select { |klass| klass.class_name == method.class_name }
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 { |check_name| RailsBestPractices::Reviews.const_get(check_name.gsub(/Check$/, 'Review')) }
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
- # read the checks from yaml config.
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
- # load all checks from the configuration
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
- # instantiates a check
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.new(options || {}) unless check_class.nil?
40
+ check_class&.new(options || {})
39
41
  end
40
42
 
41
- # loads the class for a check by calling the given block
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
@@ -2,7 +2,6 @@
2
2
 
3
3
  module RailsBestPractices
4
4
  module Core
5
- class Configs < Hash
6
- end
5
+ class Configs < Hash; end
7
6
  end
8
7
  end
@@ -5,7 +5,6 @@ require_rel 'klasses'
5
5
  module RailsBestPractices
6
6
  module Core
7
7
  # Controller classes.
8
- class Controllers < Klasses
9
- end
8
+ class Controllers < Klasses; end
10
9
  end
11
10
  end
@@ -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
@@ -5,7 +5,6 @@ require_rel 'modules'
5
5
  module RailsBestPractices
6
6
  module Core
7
7
  # Helper moduels.
8
- class Helpers < Modules
9
- end
8
+ class Helpers < Modules; end
10
9
  end
11
10
  end