rails_best_practices 1.20.1 → 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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: e7a2b67944c27b7a11e48f2c490a4ea1080fc4df39ad1d59b20cdeaedfb4b083
4
- data.tar.gz: d96f6d7da9909bac895162f70ae1247a98a8df39da7fd2ce17365e959568c4f6
3
+ metadata.gz: e268c4837f5a1da4ac684c78bef59cd06ce20c69cc41ea9478391242897c5d4b
4
+ data.tar.gz: 3bfc141a02bfcb95f40f938be6d101ab3e0aed55518eb8c42d2a6c5b2effd246
5
5
  SHA512:
6
- metadata.gz: 244acdd4067af5f87364236d4fe5bc40d5a4d68b98d1c6786aaf0e53c7766626ef670c4aaa61d793a47bba643fddcd2cbd545a4697dff8d0a3d6f7238912c2b5
7
- data.tar.gz: 9b4ca4c95172317d9017691399fcb9211295bad98959477fa8fa24a054a7a6283dc7cdbabd926e925ccf0f3ea9bfe1dde3e594cc42a2db7bd3b37758cb7bdc6e
6
+ metadata.gz: f3c124054e218a06478ef27973a2fc6aed24eb4bc45fac4eebd3274b61a1fea9650c8d9bd366a06657714d22c5905ba00315a75f787556eab5a6527ad947011b
7
+ data.tar.gz: 4e0f3e83007b69bbba800ff378caf08adf5e87d8fd8e5d913c55ef35052775697f72c7c038cebaf417f13a29cdf654b2ce25effe570ae5e6fabf6988b4735401
data/CHANGELOG.md CHANGED
@@ -1,5 +1,10 @@
1
1
  # Next Release
2
2
 
3
+ ## 1.21.0 (2021-06-15)
4
+
5
+ * Disable check by inline comment
6
+ * Add type check for string
7
+
3
8
  ## 1.20.0 (2020-02-29)
4
9
 
5
10
  * Support ruby 2.7
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- rails_best_practices (1.20.1)
4
+ rails_best_practices (1.21.0)
5
5
  activesupport
6
6
  code_analyzer (>= 0.5.2)
7
7
  erubis
@@ -8,6 +8,7 @@ require 'rails_best_practices/analyzer'
8
8
  require 'rails_best_practices/lexicals'
9
9
  require 'rails_best_practices/prepares'
10
10
  require 'rails_best_practices/reviews'
11
+ require 'rails_best_practices/inline_disables'
11
12
  require 'rails_best_practices/option_parser'
12
13
  require 'rails_best_practices/cli'
13
14
 
@@ -326,8 +326,8 @@ module RailsBestPractices
326
326
 
327
327
  # analyze source codes.
328
328
  def analyze_source_codes
329
- @bar = ProgressBar.create(title: 'Source Code', total: parse_files.size * 3) if display_bar?
330
- %w[lexical prepare review].each { |process| send(:process, process) }
329
+ @bar = ProgressBar.create(title: 'Source Code', total: parse_files.size * 4) if display_bar?
330
+ %w[lexical prepare review inline_disable].each { |process| send(:process, process) }
331
331
  @bar.finish if display_bar?
332
332
  end
333
333
 
@@ -65,6 +65,9 @@ module RailsBestPractices
65
65
  checkers: @prepares.reject { |checker| checker.is_a? Prepares::GemfilePrepare }
66
66
  )
67
67
  @review_checker ||= CodeAnalyzer::CheckingVisitor::Default.new(checkers: @reviews)
68
+
69
+ @inlnie_disable ||= InlineDisables::InlineDisable.new
70
+ @inline_disable_checker ||= CodeAnalyzer::CheckingVisitor::Plain.new(checkers: [@inlnie_disable])
68
71
  end
69
72
 
70
73
  # lexical analysis the file.
@@ -106,11 +109,27 @@ module RailsBestPractices
106
109
  @review_checker.after_check
107
110
  end
108
111
 
112
+ # disable check by inline comment the file.
113
+ #
114
+ # @param [String] filename of the file
115
+ # @param [String] content of the file
116
+ def inline_disable(filename, content)
117
+ content = parse_html_template(filename, content)
118
+ @inline_disable_checker.check(filename, content)
119
+ end
120
+
121
+ def after_inline_disable
122
+ @inline_disable_checker.after_check
123
+ end
124
+
109
125
  # get all errors from lexicals and reviews.
110
126
  #
111
127
  # @return [Array] all errors from lexicals and reviews
112
128
  def errors
113
- @errors ||= (@reviews + @lexicals).collect(&:errors).flatten
129
+ @errors ||= begin
130
+ reported_errors = (@reviews + @lexicals).collect(&:errors).flatten
131
+ reported_errors.reject { |error| @inlnie_disable.disabled?(error) }
132
+ end
114
133
  end
115
134
 
116
135
  private
@@ -0,0 +1,3 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_rel 'inline_disables'
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RailsBestPractices
4
+ module InlineDisables
5
+ class CommentRipper < Ripper::SexpBuilder
6
+ attr_reader :comments
7
+
8
+ def initialize(*arg)
9
+ super
10
+ @comments = []
11
+ end
12
+
13
+ def on_comment(*arg)
14
+ # [sexp_type, statement, [lineno, column]] = super
15
+ comments << super
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,50 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RailsBestPractices
4
+ module InlineDisables
5
+ class InlineDisable < Core::Check
6
+ interesting_files ALL_FILES
7
+ url '#'
8
+
9
+ def initialize(*args)
10
+ super
11
+ @disabled_errors = []
12
+ end
13
+
14
+ def check(filename, content)
15
+ comments = CommentRipper.new(content).tap(&:parse).comments
16
+ comments.each do |_sexp_type, statement, (line_number, _column)|
17
+ add_as_disable_errors(filename, statement, line_number)
18
+ end
19
+ end
20
+
21
+ def disabled?(error)
22
+ error_key = [error.filename, error.line_number, error.type.split('::').last].join('-')
23
+ disabled_error_keys.include?(error_key)
24
+ end
25
+
26
+ private
27
+
28
+ def disabled_error_keys
29
+ @disabled_error_keys ||= Set.new(@disabled_errors.map { |e| [e.filename, e.line_number, e.type].join('-') })
30
+ end
31
+
32
+ def add_as_disable_errors(filename, statement, line_number)
33
+ match = statement.match(/rails_b(?:est_)?p(?:ractices)?:disable (.*)/)
34
+ return unless match
35
+
36
+ check_names = match[1].split(',')
37
+ check_names.each do |check_name|
38
+ add_as_disable_error(filename, check_name.gsub(/Check$/, 'Review'), line_number)
39
+ end
40
+ end
41
+
42
+ def add_as_disable_error(filename, check_name, line_number)
43
+ @disabled_errors <<
44
+ RailsBestPractices::Core::Error.new(
45
+ filename: filename, line_number: line_number, message: 'disable by inline comment', type: check_name, url: url
46
+ )
47
+ end
48
+ end
49
+ end
50
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module RailsBestPractices
4
- VERSION = '1.20.1'
4
+ VERSION = '1.21.0'
5
5
  end
@@ -0,0 +1,62 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ module RailsBestPractices
6
+ module InlineDisables
7
+ describe InlineDisable do
8
+ let(:runner) { Core::Runner.new(reviews: Reviews::MoveModelLogicIntoModelReview.new) }
9
+
10
+ it 'moves model logic into model' do
11
+ content = <<-EOF
12
+ class PostsController < ApplicationController
13
+ def publish
14
+ @post = Post.find(params[:id])
15
+ @post.update_attributes(:is_published, true)
16
+ @post.approved_by = current_user
17
+
18
+ if @post.created_at > Time.now - 7.days
19
+ @post.popular = 100
20
+ else
21
+ @post.popular = 0
22
+ end
23
+
24
+ redirect_to post_url(@post)
25
+ end
26
+ end
27
+ EOF
28
+ runner.review('app/controllers/posts_controller.rb', content)
29
+ runner.inline_disable('app/controllers/posts_controller.rb', content)
30
+
31
+ expect(runner.errors.size).to eq(1)
32
+ expect(runner.errors[0].to_s).to eq(
33
+ 'app/controllers/posts_controller.rb:2 - move model logic into model (@post use_count > 4)'
34
+ )
35
+ end
36
+
37
+ it 'is no error is output' do
38
+ content = <<-EOF
39
+ class PostsController < ApplicationController
40
+ def publish # rails_best_practices:disable MoveModelLogicIntoModelCheck
41
+ @post = Post.find(params[:id])
42
+ @post.update_attributes(:is_published, true)
43
+ @post.approved_by = current_user
44
+
45
+ if @post.created_at > Time.now - 7.days
46
+ @post.popular = 100
47
+ else
48
+ @post.popular = 0
49
+ end
50
+
51
+ redirect_to post_url(@post)
52
+ end
53
+ end
54
+ EOF
55
+ runner.review('app/controllers/posts_controller.rb', content)
56
+ runner.inline_disable('app/controllers/posts_controller.rb', content)
57
+
58
+ expect(runner.errors.size).to eq(0)
59
+ end
60
+ end
61
+ end
62
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rails_best_practices
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.20.1
4
+ version: 1.21.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Richard Huang
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-05-08 00:00:00.000000000 Z
11
+ date: 2021-06-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -235,6 +235,9 @@ files:
235
235
  - lib/rails_best_practices/core/routes.rb
236
236
  - lib/rails_best_practices/core/runner.rb
237
237
  - lib/rails_best_practices/core_ext/erubis.rb
238
+ - lib/rails_best_practices/inline_disables.rb
239
+ - lib/rails_best_practices/inline_disables/comment_ripper.rb
240
+ - lib/rails_best_practices/inline_disables/inline_disable.rb
238
241
  - lib/rails_best_practices/lexicals.rb
239
242
  - lib/rails_best_practices/lexicals/long_line_check.rb
240
243
  - lib/rails_best_practices/lexicals/remove_tab_check.rb
@@ -314,6 +317,7 @@ files:
314
317
  - spec/rails_best_practices/core/routes_spec.rb
315
318
  - spec/rails_best_practices/core/runner_spec.rb
316
319
  - spec/rails_best_practices/core_ext/erubis_spec.rb
320
+ - spec/rails_best_practices/inline_disables/inline_disable_spec.rb
317
321
  - spec/rails_best_practices/lexicals/long_line_check_spec.rb
318
322
  - spec/rails_best_practices/lexicals/remove_tab_check_spec.rb
319
323
  - spec/rails_best_practices/lexicals/remove_trailing_whitespace_check_spec.rb
@@ -424,6 +428,7 @@ test_files:
424
428
  - spec/rails_best_practices/core/routes_spec.rb
425
429
  - spec/rails_best_practices/core/runner_spec.rb
426
430
  - spec/rails_best_practices/core_ext/erubis_spec.rb
431
+ - spec/rails_best_practices/inline_disables/inline_disable_spec.rb
427
432
  - spec/rails_best_practices/lexicals/long_line_check_spec.rb
428
433
  - spec/rails_best_practices/lexicals/remove_tab_check_spec.rb
429
434
  - spec/rails_best_practices/lexicals/remove_trailing_whitespace_check_spec.rb