rails_best_practices 1.20.1 → 1.21.0

Sign up to get free protection for your applications and to get access to all the features.
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