rubocop 0.63.0 → 0.63.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 7aaecd68a4876e64c43f009e849b228a26805bfe
4
- data.tar.gz: 68a8b80a3f44980737704d596a595548bc6cb086
2
+ SHA256:
3
+ metadata.gz: 403ba108281ac77da6c733ad24b88350e4b4a3055ad36b6059d7784cbf4df56e
4
+ data.tar.gz: 86ebf007930c2de6e2f5eddbd0a6fba6e99ce9a7645f6407fdd4554a4e3c632c
5
5
  SHA512:
6
- metadata.gz: e2f5aacc075c83cc70ff025a59f4ed5201de381be89da00c93ed23fceb2a43d09960a653407ee6a040a68e9f6f199bed50342fdb413c84d3b22ee8ff0f840f08
7
- data.tar.gz: c9883abe7b2d4221e7af6a36f3d9aeeeca51de1a36d558c2a55a6a5b33cad9948a53bd9eeda38e4565f56b1aed85b7e98c4d2a8e2d939cb53984ad9eaec63088
6
+ metadata.gz: 65c260a9df4e731b52ed42e5412d100e71199d5b75e6dac98adaf097020b351019c3fabedd99f2c34465d414eba0439680aeb7799ece4321c63918b4ac2e46e9
7
+ data.tar.gz: 5bfe411917f9d371b3ce33464297b5aa7840959dccf1275553545601af6b5228a7e770e3993663b98d5880f91f18dfdb94cf55cfa697af923e63c3b9fb3bcd8f
data/README.md CHANGED
@@ -53,7 +53,7 @@ haven't reached version 1.0 yet). To prevent an unwanted RuboCop update you
53
53
  might want to use a conservative version locking in your `Gemfile`:
54
54
 
55
55
  ```rb
56
- gem 'rubocop', '~> 0.63.0', require: false
56
+ gem 'rubocop', '~> 0.63.1', require: false
57
57
  ```
58
58
 
59
59
  ## Quickstart
@@ -94,7 +94,7 @@ module RuboCop
94
94
  begin_line_num = previous_line_num - base_line_num + 1
95
95
  end_line_num = node.first_line - base_line_num + 1
96
96
  lines = source_in_lines[begin_line_num...end_line_num]
97
- "\n" + lines.join("\n").split(node.source).first
97
+ "\n#{(lines.join("\n").split(node.source).first || '')}"
98
98
  end
99
99
 
100
100
  def fix_escaped_content(word_node, escape, delimiters)
@@ -133,6 +133,7 @@ module RuboCop
133
133
  # Although there are multiple choices for a correct column,
134
134
  # select the first one of candidates to determine a specification.
135
135
  correct_column = candidates.first
136
+ @column_delta = correct_column - right_paren.column
136
137
  add_offense(right_paren,
137
138
  location: right_paren,
138
139
  message: message(correct_column,
@@ -34,12 +34,13 @@ module RuboCop
34
34
  def check(node)
35
35
  return unless node.method_name == :initialize
36
36
 
37
- check_body(node)
37
+ check_body(node.body)
38
38
  end
39
39
 
40
40
  # @param [DefNode] node a constructor definition
41
- def check_body(node)
42
- body = node.body
41
+ def check_body(body)
42
+ return if body.nil?
43
+
43
44
  case body.type
44
45
  when :begin
45
46
  check_body_lines(body.child_nodes)
@@ -19,18 +19,15 @@ module RuboCop
19
19
  # end
20
20
  # end
21
21
  class RelativeDateConstant < Cop
22
+ include RangeHelp
23
+
22
24
  MSG = 'Do not assign %<method_name>s to constants as it ' \
23
25
  'will be evaluated only once.'.freeze
24
26
 
25
- RELATIVE_DATE_METHODS = %i[ago from_now since until].freeze
26
-
27
27
  def on_casgn(node)
28
- _scope, _constant, rhs = *node
29
-
30
- # rhs would be nil in a or_asgn node
31
- return unless rhs
32
-
33
- check_node(rhs)
28
+ relative_date_assignment?(node) do |method_name|
29
+ add_offense(node, message: format(MSG, method_name: method_name))
30
+ end
34
31
  end
35
32
 
36
33
  def on_masgn(node)
@@ -39,20 +36,29 @@ module RuboCop
39
36
  return unless rhs && rhs.array_type?
40
37
 
41
38
  lhs.children.zip(rhs.children).each do |(name, value)|
42
- check_node(value) if name.casgn_type?
39
+ next unless name.casgn_type?
40
+
41
+ relative_date?(value) do |method_name|
42
+ add_offense(node,
43
+ location: range_between(name.loc.expression.begin_pos,
44
+ value.loc.expression.end_pos),
45
+ message: format(MSG, method_name: method_name))
46
+ end
43
47
  end
44
48
  end
45
49
 
46
50
  def on_or_asgn(node)
47
- lhs, rhs = *node
48
-
49
- return unless lhs.casgn_type?
50
-
51
- check_node(rhs)
51
+ relative_date_or_assignment?(node) do |method_name|
52
+ add_offense(node, message: format(MSG, method_name: method_name))
53
+ end
52
54
  end
53
55
 
54
56
  def autocorrect(node)
55
- _scope, const_name, value = *node
57
+ return unless node.casgn_type?
58
+
59
+ scope, const_name, value = *node
60
+ return unless scope.nil?
61
+
56
62
  indent = ' ' * node.loc.column
57
63
  new_code = ["def self.#{const_name.downcase}",
58
64
  "#{indent}#{value.source}",
@@ -62,27 +68,25 @@ module RuboCop
62
68
 
63
69
  private
64
70
 
65
- def check_node(node)
66
- return unless node.irange_type? ||
67
- node.erange_type? ||
68
- node.send_type?
69
-
70
- # for range nodes we need to check both their boundaries
71
- nodes = node.send_type? ? [node] : node.children
72
-
73
- nodes.each do |n|
74
- if relative_date_method?(n)
75
- add_offense(node.parent,
76
- message: format(MSG, method_name: n.method_name))
77
- end
78
- end
79
- end
80
-
81
- def relative_date_method?(node)
82
- node.send_type? &&
83
- RELATIVE_DATE_METHODS.include?(node.method_name) &&
84
- !node.arguments?
85
- end
71
+ def_node_matcher :relative_date_assignment?, <<-PATTERN
72
+ {
73
+ (casgn _ _ (send _ ${:since :from_now :after :ago :until :before}))
74
+ (casgn _ _ ({erange irange} _ (send _ ${:since :from_now :after :ago :until :before})))
75
+ (casgn _ _ ({erange irange} (send _ ${:since :from_now :after :ago :until :before}) _))
76
+ }
77
+ PATTERN
78
+
79
+ def_node_matcher :relative_date_or_assignment?, <<-PATTERN
80
+ (:or_asgn (casgn _ _) (send _ ${:since :from_now :after :ago :until :before}))
81
+ PATTERN
82
+
83
+ def_node_matcher :relative_date?, <<-PATTERN
84
+ {
85
+ ({erange irange} _ (send _ ${:since :from_now :after :ago :until :before}))
86
+ ({erange irange} (send _ ${:since :from_now :after :ago :until :before}) _)
87
+ (send _ ${:since :from_now :after :ago :until :before})
88
+ }
89
+ PATTERN
86
90
  end
87
91
  end
88
92
  end
@@ -20,7 +20,7 @@ module RuboCop
20
20
 
21
21
  MSG = 'Include a copyright notice matching /%<notice>s/ before ' \
22
22
  'any code.'.freeze
23
- AUTOCORRECT_EMPTY_WARNING = 'An AutocorrectNotice must be defined in' \
23
+ AUTOCORRECT_EMPTY_WARNING = 'An AutocorrectNotice must be defined in ' \
24
24
  'your RuboCop config'.freeze
25
25
 
26
26
  def investigate(processed_source)
@@ -38,6 +38,8 @@ module CopHelper
38
38
  end
39
39
 
40
40
  def autocorrect_source(source, file = nil)
41
+ RuboCop::Formatter::DisabledConfigFormatter.config_to_allow_offenses = {}
42
+ RuboCop::Formatter::DisabledConfigFormatter.detected_styles = {}
41
43
  cop.instance_variable_get(:@options)[:auto_correct] = true
42
44
  processed_source = parse_source(source, file)
43
45
  _investigate(cop, processed_source)
@@ -38,24 +38,65 @@ module RuboCop
38
38
  # 'Avoid chaining a method call on a do...end block.'
39
39
  # )
40
40
  #
41
+ # Auto-correction can be tested using `expect_correction` after
42
+ # `expect_offense`.
43
+ #
44
+ # @example `expect_offense` and `expect_correction`
45
+ #
46
+ # expect_offense(<<-RUBY.strip_indent)
47
+ # x % 2 == 0
48
+ # ^^^^^^^^^^ Replace with `Integer#even?`.
49
+ # RUBY
50
+ #
51
+ # expect_correction(<<-RUBY.strip_indent)
52
+ # x.even?
53
+ # RUBY
54
+ #
41
55
  # If you do not want to specify an offense then use the
42
56
  # companion method `expect_no_offenses`. This method is a much
43
57
  # simpler assertion since it just inspects the source and checks
44
58
  # that there were no offenses. The `expect_offense` method has
45
59
  # to do more work by parsing out lines that contain carets.
46
60
  module ExpectOffense
61
+ # rubocop:disable Metrics/AbcSize, Metrics/MethodLength
47
62
  def expect_offense(source, file = nil)
63
+ RuboCop::Formatter::DisabledConfigFormatter
64
+ .config_to_allow_offenses = {}
65
+ RuboCop::Formatter::DisabledConfigFormatter.detected_styles = {}
66
+ cop.instance_variable_get(:@options)[:auto_correct] = true
67
+
48
68
  expected_annotations = AnnotatedSource.parse(source)
49
69
 
50
70
  if expected_annotations.plain_source == source
51
- raise 'Use expect_no_offenses to assert that no offenses are found'
71
+ raise 'Use `expect_no_offenses` to assert that no offenses are found'
72
+ end
73
+
74
+ @processed_source = parse_source(expected_annotations.plain_source,
75
+ file)
76
+
77
+ unless @processed_source.valid_syntax?
78
+ raise 'Error parsing example code'
52
79
  end
53
80
 
54
- inspect_source(expected_annotations.plain_source, file)
81
+ _investigate(cop, @processed_source)
55
82
  actual_annotations =
56
83
  expected_annotations.with_offense_annotations(cop.offenses)
84
+
57
85
  expect(actual_annotations.to_s).to eq(expected_annotations.to_s)
58
86
  end
87
+ # rubocop:enable Metrics/AbcSize, Metrics/MethodLength
88
+
89
+ def expect_correction(correction)
90
+ unless @processed_source
91
+ raise '`expect_correction` must follow `expect_offense`'
92
+ end
93
+
94
+ corrector =
95
+ RuboCop::Cop::Corrector.new(@processed_source.buffer, cop.corrections)
96
+ new_source = corrector.rewrite
97
+
98
+ expect(new_source).to eq(correction)
99
+ end
59
100
 
60
101
  def expect_no_offenses(source, file = nil)
61
102
  inspect_source(source, file)
@@ -3,7 +3,7 @@
3
3
  module RuboCop
4
4
  # This module holds the RuboCop version information.
5
5
  module Version
6
- STRING = '0.63.0'.freeze
6
+ STRING = '0.63.1'.freeze
7
7
 
8
8
  MSG = '%<version>s (using Parser %<parser_version>s, running on ' \
9
9
  '%<ruby_engine>s %<ruby_version>s %<ruby_platform>s)'.freeze
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rubocop
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.63.0
4
+ version: 0.63.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Bozhidar Batsov
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: exe
12
12
  cert_chain: []
13
- date: 2019-01-16 00:00:00.000000000 Z
13
+ date: 2019-01-22 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: jaro_winkler
@@ -830,8 +830,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
830
830
  - !ruby/object:Gem::Version
831
831
  version: '0'
832
832
  requirements: []
833
- rubyforge_project:
834
- rubygems_version: 2.6.11
833
+ rubygems_version: 3.0.1
835
834
  signing_key:
836
835
  specification_version: 4
837
836
  summary: Automatic Ruby code style checking tool.