rubocop 0.75.0 → 0.75.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
2
  SHA256:
3
- metadata.gz: 78f22d960f9c7b85730f215741a8e083b3b63396f414478d4831762e4c4cf7cb
4
- data.tar.gz: b933d30e9d959fd0ef51958f5815349cab06f8dc7069b4f10c16907e43be53a5
3
+ metadata.gz: 354a14aa737b4743d04d65393e8caae409513d2302b31aca36090441100f1bdb
4
+ data.tar.gz: 7bdbb625ae97e5e0f1a5ca6bfe0d93c71ac4a86a566ba13b987a293949486e51
5
5
  SHA512:
6
- metadata.gz: 070a442e799b151ea2be23c3eb0d00ad25cc269ed6296ca3862fb6b3b25bfff238886423e7ae52cea853041038fefa354f818377cfde730b4464d7503b0680da
7
- data.tar.gz: b14a228097fd48fc7c3dd4c7674b607574f99fba7b9870b64e97b836340181b57563794dd1d5371929fa1dac7e33430eb14189447b05caba84e8ce2b5034f12e
6
+ metadata.gz: bf54a562c567c28f118f5bf6bf0a9fb9e5987351559a001f80de025cb08793cd546731e80d3690dcce3ce8e0eda96381563ae307a5b0df303322c75331b8f14b
7
+ data.tar.gz: 76fb85901be4d90de0697874bf0bea52c2a23e2b39fa9607ec797d6768465c4f903bc2645ebf41a504f526064aee2e0000f7bbd2701735787425770682b79ec8
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 lock in your `Gemfile`:
54
54
 
55
55
  ```rb
56
- gem 'rubocop', '~> 0.75.0', require: false
56
+ gem 'rubocop', '~> 0.75.1', require: false
57
57
  ```
58
58
 
59
59
  ## Quickstart
@@ -1815,7 +1815,7 @@ Metrics/LineLength:
1815
1815
  - https
1816
1816
  # The IgnoreCopDirectives option causes the LineLength rule to ignore cop
1817
1817
  # directives like '# rubocop: enable ...' when calculating a line's length.
1818
- IgnoreCopDirectives: false
1818
+ IgnoreCopDirectives: true
1819
1819
  # The IgnoredPatterns option is a list of !ruby/regexp and/or string
1820
1820
  # elements. Strings will be converted to Regexp objects. A line that matches
1821
1821
  # any regular expression listed in this option will be ignored by LineLength.
@@ -98,7 +98,7 @@ module RuboCop
98
98
  end
99
99
 
100
100
  def fix_escaped_content(word_node, escape, delimiters)
101
- content = word_node.children.first.to_s
101
+ content = +word_node.children.first.to_s
102
102
  content = escape_string(content) if escape
103
103
  substitute_escaped_delimiters(content, delimiters)
104
104
  content
@@ -45,7 +45,7 @@ module RuboCop
45
45
  return if correct_style?(node)
46
46
 
47
47
  if node.modifier_form? && last_argument_is_heredoc?(node)
48
- heredoc_node = last_argument(node)
48
+ heredoc_node = last_heredoc_argument(node)
49
49
 
50
50
  return if next_line_empty?(heredoc_line(node, heredoc_node))
51
51
 
@@ -109,16 +109,27 @@ module RuboCop
109
109
 
110
110
  def last_argument_is_heredoc?(node)
111
111
  last_children = node.if_branch
112
-
113
112
  return false unless last_children&.send_type?
114
113
 
115
- last_argument = last_argument(node)
116
-
117
- last_argument.respond_to?(:heredoc?) && last_argument.heredoc?
114
+ heredoc?(last_heredoc_argument(node))
118
115
  end
119
116
 
120
- def last_argument(node)
121
- node.if_branch.children.last
117
+ def last_heredoc_argument(node)
118
+ n = if node.respond_to?(:if_branch)
119
+ node.if_branch.children.last
120
+ else
121
+ node
122
+ end
123
+
124
+ return n if heredoc?(n)
125
+ return unless n.respond_to?(:arguments)
126
+
127
+ n.arguments.each do |argument|
128
+ node = last_heredoc_argument(argument)
129
+ return node if node
130
+ end
131
+
132
+ return last_heredoc_argument(n.receiver) if n.respond_to?(:receiver)
122
133
  end
123
134
 
124
135
  def heredoc_line(node, heredoc_node)
@@ -129,6 +140,10 @@ module RuboCop
129
140
  node.last_line + num_of_heredoc_lines + END_OF_HEREDOC_LINE
130
141
  end
131
142
 
143
+ def heredoc?(node)
144
+ node.respond_to?(:heredoc?) && node.heredoc?
145
+ end
146
+
132
147
  def offense_location(node)
133
148
  if node.loc.respond_to?(:end) && node.loc.end
134
149
  :end
@@ -55,8 +55,8 @@ module RuboCop
55
55
  source
56
56
  .comments
57
57
  .take_while { |comment| comment.loc.line < source.ast.loc.line }
58
- .select { |comment| MagicComment.parse(comment.text).any? }
59
- .last
58
+ .reverse
59
+ .find { |comment| MagicComment.parse(comment.text).any? }
60
60
  end
61
61
  end
62
62
  end
@@ -36,7 +36,7 @@ module RuboCop
36
36
  #
37
37
  # end
38
38
  #
39
- # @example Enforcedstyle: beginning_only
39
+ # @example EnforcedStyle: beginning_only
40
40
  # # good
41
41
  #
42
42
  # class Foo
@@ -46,7 +46,7 @@ module RuboCop
46
46
  # end
47
47
  # end
48
48
  #
49
- # @example Enforcedstyle: ending_only
49
+ # @example EnforcedStyle: ending_only
50
50
  # # good
51
51
  #
52
52
  # class Foo
@@ -42,7 +42,8 @@ module RuboCop
42
42
  end
43
43
 
44
44
  def leftmost_multiple_assignment(node)
45
- return node unless node.parent&.assignment?
45
+ return node unless same_line?(node, node.parent) &&
46
+ node.parent.assignment?
46
47
 
47
48
  leftmost_multiple_assignment(node.parent)
48
49
 
@@ -6,9 +6,7 @@ module RuboCop
6
6
  # This cop checks for unused block arguments.
7
7
  #
8
8
  # @example
9
- #
10
9
  # # bad
11
- #
12
10
  # do_something do |used, unused|
13
11
  # puts used
14
12
  # end
@@ -21,10 +19,7 @@ module RuboCop
21
19
  # puts :baz
22
20
  # end
23
21
  #
24
- # @example
25
- #
26
- # #good
27
- #
22
+ # # good
28
23
  # do_something do |used, _unused|
29
24
  # puts used
30
25
  # end
@@ -36,6 +31,27 @@ module RuboCop
36
31
  # define_method(:foo) do |_bar|
37
32
  # puts :baz
38
33
  # end
34
+ #
35
+ # @example IgnoreEmptyBlocks: true (default)
36
+ # # good
37
+ # do_something { |unused| }
38
+ #
39
+ # @example IgnoreEmptyBlocks: false
40
+ # # bad
41
+ # do_something { |unused| }
42
+ #
43
+ # @example AllowUnusedKeywordArguments: false (default)
44
+ # # bad
45
+ # do_something do |unused: 42|
46
+ # foo
47
+ # end
48
+ #
49
+ # @example AllowUnusedKeywordArguments: true
50
+ # # good
51
+ # do_something do |unused: 42|
52
+ # foo
53
+ # end
54
+ #
39
55
  class UnusedBlockArgument < Cop
40
56
  include UnusedArgument
41
57
 
@@ -6,20 +6,38 @@ module RuboCop
6
6
  # This cop checks for unused method arguments.
7
7
  #
8
8
  # @example
9
- #
10
9
  # # bad
11
- #
12
10
  # def some_method(used, unused, _unused_but_allowed)
13
11
  # puts used
14
12
  # end
15
13
  #
16
- # @example
17
- #
18
14
  # # good
19
- #
20
15
  # def some_method(used, _unused, _unused_but_allowed)
21
16
  # puts used
22
17
  # end
18
+ #
19
+ # @example AllowUnusedKeywordArguments: false (default)
20
+ # # bad
21
+ # def do_something(used, unused: 42)
22
+ # used
23
+ # end
24
+ #
25
+ # @example AllowUnusedKeywordArguments: true
26
+ # # good
27
+ # def do_something(used, unused: 42)
28
+ # used
29
+ # end
30
+ #
31
+ # @example IgnoreEmptyMethods: true (default)
32
+ # # good
33
+ # def do_something(unused)
34
+ # end
35
+ #
36
+ # @example IgnoreEmptyMethods: false
37
+ # # bad
38
+ # def do_something(unused)
39
+ # end
40
+ #
23
41
  class UnusedMethodArgument < Cop
24
42
  include UnusedArgument
25
43
 
@@ -6,55 +6,36 @@ module RuboCop
6
6
  # This cop checks for operators, variables, literals, and nonmutating
7
7
  # methods used in void context.
8
8
  #
9
- # @example
10
- #
9
+ # @example CheckForMethodsWithNoSideEffects: false (default)
11
10
  # # bad
12
- #
13
11
  # def some_method
14
12
  # some_num * 10
15
13
  # do_something
16
14
  # end
17
15
  #
18
- # @example
19
- #
20
- # # bad
21
- #
22
16
  # def some_method(some_var)
23
17
  # some_var
24
18
  # do_something
25
19
  # end
26
20
  #
27
- # @example
28
- #
29
- # # bad, when CheckForMethodsWithNoSideEffects is set true
30
- #
21
+ # @example CheckForMethodsWithNoSideEffects: true
22
+ # # bad
31
23
  # def some_method(some_array)
32
24
  # some_array.sort
33
25
  # do_something(some_array)
34
26
  # end
35
27
  #
36
- # @example
37
- #
38
28
  # # good
39
- #
40
29
  # def some_method
41
30
  # do_something
42
31
  # some_num * 10
43
32
  # end
44
33
  #
45
- # @example
46
- #
47
- # # good
48
- #
49
34
  # def some_method(some_var)
50
35
  # do_something
51
36
  # some_var
52
37
  # end
53
38
  #
54
- # @example
55
- #
56
- # # good, when CheckForMethodsWithNoSideEffects is set true
57
- #
58
39
  # def some_method(some_array)
59
40
  # some_array.sort!
60
41
  # do_something(some_array)
@@ -47,6 +47,50 @@ module RuboCop
47
47
  # def foo.bar
48
48
  # puts baz
49
49
  # end
50
+ #
51
+ # @example RequireForNonPublicMethods: false (default)
52
+ # # good
53
+ # class Foo
54
+ # protected
55
+ # def do_something
56
+ # end
57
+ # end
58
+ #
59
+ # class Foo
60
+ # private
61
+ # def do_something
62
+ # end
63
+ # end
64
+ #
65
+ # @example RequireForNonPublicMethods: true
66
+ # # bad
67
+ # class Foo
68
+ # protected
69
+ # def do_something
70
+ # end
71
+ # end
72
+ #
73
+ # class Foo
74
+ # private
75
+ # def do_something
76
+ # end
77
+ # end
78
+ #
79
+ # # good
80
+ # class Foo
81
+ # protected
82
+ # # Documentation
83
+ # def do_something
84
+ # end
85
+ # end
86
+ #
87
+ # class Foo
88
+ # private
89
+ # # Documentation
90
+ # def do_something
91
+ # end
92
+ # end
93
+ #
50
94
  class DocumentationMethod < Cop
51
95
  include DocumentationComment
52
96
  include DefNode
@@ -160,7 +160,7 @@ module RuboCop
160
160
  def depth(current_path)
161
161
  paths = current_path.split(File::SEPARATOR)
162
162
 
163
- paths.reject { |path| path == '.' }.count
163
+ paths.count { |path| path != '.' }
164
164
  end
165
165
 
166
166
  def parent_path(current_path)
@@ -8,7 +8,7 @@ module RuboCop
8
8
  # **Note:**
9
9
  # `unannotated` style cop only works for strings
10
10
  # which are passed as arguments to those methods:
11
- # `sprintf`, `format`, `%`.
11
+ # `printf`, `sprintf`, `format`, `%`.
12
12
  # The reason is that *unannotated* format is very similar
13
13
  # to encoded URLs or Date/Time formatting strings.
14
14
  #
@@ -41,10 +41,7 @@ module RuboCop
41
41
  class FormatStringToken < Cop
42
42
  include ConfigurableEnforcedStyle
43
43
 
44
- FORMAT_STRING_METHODS = %i[sprintf format %].freeze
45
-
46
44
  def on_str(node)
47
- return if placeholder_argument?(node)
48
45
  return if node.each_ancestor(:xstr, :regexp).any?
49
46
 
50
47
  tokens(node) do |detected_style, token_range|
@@ -61,14 +58,16 @@ module RuboCop
61
58
 
62
59
  private
63
60
 
64
- def includes_format_methods?(node)
65
- node.each_ancestor(:send).any? do |ancestor|
66
- FORMAT_STRING_METHODS.include?(ancestor.method_name)
67
- end
68
- end
61
+ def_node_matcher :format_string_in_typical_context?, <<~PATTERN
62
+ {
63
+ ^(send _ {:format :sprintf :printf} %0 ...)
64
+ ^(send %0 :% _)
65
+ }
66
+ PATTERN
69
67
 
70
68
  def unannotated_format?(node, detected_style)
71
- detected_style == :unannotated && !includes_format_methods?(node)
69
+ detected_style == :unannotated &&
70
+ !format_string_in_typical_context?(node)
72
71
  end
73
72
 
74
73
  def message(detected_style)
@@ -95,11 +94,7 @@ module RuboCop
95
94
  if source_map.is_a?(Parser::Source::Map::Heredoc)
96
95
  source_map.heredoc_body
97
96
  elsif source_map.begin
98
- slice_source(
99
- source_map.expression,
100
- source_map.expression.begin_pos + 1,
101
- source_map.expression.end_pos - 1
102
- )
97
+ source_map.expression.adjust(begin_pos: +1, end_pos: -1)
103
98
  else
104
99
  source_map.expression
105
100
  end
@@ -110,30 +105,14 @@ module RuboCop
110
105
 
111
106
  format_string.format_sequences.each do |seq|
112
107
  detected_style = seq.style
113
- token = slice_source(
114
- contents,
115
- contents.begin_pos + seq.begin_pos,
116
- contents.begin_pos + seq.end_pos
108
+ token = contents.begin.adjust(
109
+ begin_pos: seq.begin_pos,
110
+ end_pos: seq.end_pos
117
111
  )
118
112
 
119
113
  yield(detected_style, token)
120
114
  end
121
115
  end
122
-
123
- def slice_source(source_range, new_begin, new_end)
124
- Parser::Source::Range.new(
125
- source_range.source_buffer,
126
- new_begin,
127
- new_end
128
- )
129
- end
130
-
131
- def placeholder_argument?(node)
132
- return false unless node.parent
133
- return true if node.parent.pair_type?
134
-
135
- placeholder_argument?(node.parent)
136
- end
137
116
  end
138
117
  end
139
118
  end
@@ -64,20 +64,6 @@ module RuboCop
64
64
  # # okay with `^assert` listed in `IgnoredPatterns`
65
65
  # assert_equal 'test', x
66
66
  #
67
- # # IgnoreMacros: true (default)
68
- #
69
- # # good
70
- # class Foo
71
- # bar :baz
72
- # end
73
- #
74
- # # IgnoreMacros: false
75
- #
76
- # # bad
77
- # class Foo
78
- # bar :baz
79
- # end
80
- #
81
67
  # @example EnforcedStyle: omit_parentheses
82
68
  #
83
69
  # # bad
@@ -92,7 +78,21 @@ module RuboCop
92
78
  # # good
93
79
  # foo.enforce strict: true
94
80
  #
95
- # # AllowParenthesesInMultilineCall: false (default)
81
+ # @example IgnoreMacros: true (default)
82
+ #
83
+ # # good
84
+ # class Foo
85
+ # bar :baz
86
+ # end
87
+ #
88
+ # @example IgnoreMacros: false
89
+ #
90
+ # # bad
91
+ # class Foo
92
+ # bar :baz
93
+ # end
94
+ #
95
+ # @example AllowParenthesesInMultilineCall: false (default)
96
96
  #
97
97
  # # bad
98
98
  # foo.enforce(
@@ -103,7 +103,7 @@ module RuboCop
103
103
  # foo.enforce \
104
104
  # strict: true
105
105
  #
106
- # # AllowParenthesesInMultilineCall: true
106
+ # @example AllowParenthesesInMultilineCall: true
107
107
  #
108
108
  # # good
109
109
  # foo.enforce(
@@ -114,7 +114,7 @@ module RuboCop
114
114
  # foo.enforce \
115
115
  # strict: true
116
116
  #
117
- # # AllowParenthesesInChaining: false (default)
117
+ # @example AllowParenthesesInChaining: false (default)
118
118
  #
119
119
  # # bad
120
120
  # foo().bar(1)
@@ -122,7 +122,7 @@ module RuboCop
122
122
  # # good
123
123
  # foo().bar 1
124
124
  #
125
- # # AllowParenthesesInChaining: true
125
+ # @example AllowParenthesesInChaining: true
126
126
  #
127
127
  # # good
128
128
  # foo().bar(1)
@@ -130,7 +130,7 @@ module RuboCop
130
130
  # # good
131
131
  # foo().bar 1
132
132
  #
133
- # # AllowParenthesesInCamelCaseMethod: false (default)
133
+ # @example AllowParenthesesInCamelCaseMethod: false (default)
134
134
  #
135
135
  # # bad
136
136
  # Array(1)
@@ -138,7 +138,7 @@ module RuboCop
138
138
  # # good
139
139
  # Array 1
140
140
  #
141
- # # AllowParenthesesInCamelCaseMethod: true
141
+ # @example AllowParenthesesInCamelCaseMethod: true
142
142
  #
143
143
  # # good
144
144
  # Array(1)
@@ -35,6 +35,18 @@ module RuboCop
35
35
  # end
36
36
  # end
37
37
  #
38
+ # @example AllowMultipleReturnValues: false (default)
39
+ # # bad
40
+ # def test
41
+ # return x, y
42
+ # end
43
+ #
44
+ # @example AllowMultipleReturnValues: true
45
+ # # good
46
+ # def test
47
+ # return x, y
48
+ # end
49
+ #
38
50
  class RedundantReturn < Cop
39
51
  include RangeHelp
40
52
 
@@ -120,7 +120,7 @@ module RuboCop
120
120
  corrector.remove(begin_range(node, body))
121
121
  corrector.remove(end_range(node, body))
122
122
  corrector.insert_before(method_call.loc.dot, '&')
123
- handle_comments(corrector, method_call)
123
+ handle_comments(corrector, node, method_call)
124
124
 
125
125
  add_safe_nav_to_all_methods_in_chain(corrector, method_call, body)
126
126
  end
@@ -128,12 +128,20 @@ module RuboCop
128
128
 
129
129
  private
130
130
 
131
- def handle_comments(corrector, method_call)
131
+ def handle_comments(corrector, node, method_call)
132
132
  return if processed_source.comments.empty?
133
133
 
134
- comments = processed_source.comments.map(&:text).join("\n")
135
134
  corrector.insert_before(method_call.loc.expression,
136
- comments + "\n")
135
+ "#{comments(node).join("\n")}\n")
136
+ end
137
+
138
+ def comments(node)
139
+ comments = processed_source.comments.select do |comment|
140
+ comment.loc.first_line >= node.loc.first_line &&
141
+ comment.loc.last_line <= node.loc.last_line
142
+ end
143
+
144
+ comments.map(&:text)
137
145
  end
138
146
 
139
147
  def allowed_if_condition?(node)
@@ -6,6 +6,9 @@ module RuboCop
6
6
  # This cop checks for multiple expressions placed on the same line.
7
7
  # It also checks for lines terminated with a semicolon.
8
8
  #
9
+ # This cop has `AllowAsExpressionSeparator` configuration option.
10
+ # It allows `;` to separate several expressions on the same line.
11
+ #
9
12
  # @example
10
13
  # # bad
11
14
  # foo = 1; bar = 2;
@@ -15,6 +18,14 @@ module RuboCop
15
18
  # foo = 1
16
19
  # bar = 2
17
20
  # baz = 3
21
+ #
22
+ # @example AllowAsExpressionSeparator: false (default)
23
+ # # bad
24
+ # foo = 1; bar = 2
25
+ #
26
+ # @example AllowAsExpressionSeparator: true
27
+ # # good
28
+ # foo = 1; bar = 2
18
29
  class Semicolon < Cop
19
30
  include RangeHelp
20
31
 
@@ -15,9 +15,14 @@ module RuboCop
15
15
  private
16
16
 
17
17
  def report_offense(file, offense)
18
- output.printf("%s:%d:%d: %s: %s\n",
19
- cyan(smart_path(file)), offense.line, offense.real_column,
20
- colored_severity_code(offense), message(offense))
18
+ output.printf(
19
+ "%<path>s:%<line>d:%<column>d: %<severity>s: %<message>s\n",
20
+ path: cyan(smart_path(file)),
21
+ line: offense.line,
22
+ column: offense.real_column,
23
+ severity: colored_severity_code(offense),
24
+ message: message(offense)
25
+ )
21
26
 
22
27
  # rubocop:disable Lint/HandleExceptions
23
28
  begin
@@ -8,20 +8,30 @@ module RuboCop
8
8
  class EmacsStyleFormatter < BaseFormatter
9
9
  def file_finished(file, offenses)
10
10
  offenses.each do |o|
11
- message =
12
- if o.corrected_with_todo?
13
- "[Todo] #{o.message}"
14
- elsif o.corrected?
15
- "[Corrected] #{o.message}"
16
- else
17
- o.message
18
- end
19
-
20
- output.printf("%s:%d:%d: %s: %s\n",
21
- file, o.line, o.real_column, o.severity.code,
22
- message.tr("\n", ' '))
11
+ output.printf(
12
+ "%<path>s:%<line>d:%<column>d: %<severity>s: %<message>s\n",
13
+ path: file,
14
+ line: o.line,
15
+ column: o.real_column,
16
+ severity: o.severity.code,
17
+ message: message(o)
18
+ )
23
19
  end
24
20
  end
21
+
22
+ private
23
+
24
+ def message(offense)
25
+ message =
26
+ if offense.corrected_with_todo?
27
+ "[Todo] #{offense.message}"
28
+ elsif offense.corrected?
29
+ "[Corrected] #{offense.message}"
30
+ else
31
+ offense.message
32
+ end
33
+ message.tr("\n", ' ')
34
+ end
25
35
  end
26
36
  end
27
37
  end
@@ -13,7 +13,7 @@ module RuboCop
13
13
  def file_finished(file, offenses)
14
14
  return if offenses.empty?
15
15
 
16
- output.printf("%s\n", file)
16
+ output.printf("%<path>s\n", path: file)
17
17
  end
18
18
  end
19
19
  end
@@ -9,21 +9,21 @@ module RuboCop
9
9
  # which invoke same method of each formatters.
10
10
  class FormatterSet < Array
11
11
  BUILTIN_FORMATTERS_FOR_KEYS = {
12
- 'progress' => ProgressFormatter,
13
- 'simple' => SimpleTextFormatter,
14
- 'clang' => ClangStyleFormatter,
15
- 'fuubar' => FuubarStyleFormatter,
16
- 'emacs' => EmacsStyleFormatter,
17
- 'json' => JSONFormatter,
18
- 'html' => HTMLFormatter,
19
- 'files' => FileListFormatter,
20
- 'offenses' => OffenseCountFormatter,
21
- 'disabled' => DisabledLinesFormatter,
22
- 'worst' => WorstOffendersFormatter,
23
- 'tap' => TapFormatter,
24
- 'quiet' => QuietFormatter,
25
- 'autogenconf' => AutoGenConfigFormatter,
26
- 'pacman' => PacmanFormatter
12
+ '[a]utogenconf' => AutoGenConfigFormatter,
13
+ '[c]lang' => ClangStyleFormatter,
14
+ '[d]isabled' => DisabledLinesFormatter,
15
+ '[e]macs' => EmacsStyleFormatter,
16
+ '[fi]les' => FileListFormatter,
17
+ '[fu]ubar' => FuubarStyleFormatter,
18
+ '[h]tml' => HTMLFormatter,
19
+ '[j]son' => JSONFormatter,
20
+ '[o]ffenses' => OffenseCountFormatter,
21
+ '[pa]cman' => PacmanFormatter,
22
+ '[p]rogress' => ProgressFormatter,
23
+ '[q]uiet' => QuietFormatter,
24
+ '[s]imple' => SimpleTextFormatter,
25
+ '[t]ap' => TapFormatter,
26
+ '[w]orst' => WorstOffendersFormatter
27
27
  }.freeze
28
28
 
29
29
  FORMATTER_APIS = %i[started finished].freeze
@@ -82,7 +82,7 @@ module RuboCop
82
82
 
83
83
  def builtin_formatter_class(specified_key)
84
84
  matching_keys = BUILTIN_FORMATTERS_FOR_KEYS.keys.select do |key|
85
- key.start_with?(specified_key)
85
+ key =~ /^\[#{specified_key}\]/ || specified_key == key.delete('[]')
86
86
  end
87
87
 
88
88
  raise %(No formatter for "#{specified_key}") if matching_keys.empty?
@@ -2,7 +2,7 @@
2
2
 
3
3
  module RuboCop
4
4
  module Formatter
5
- # This formatter prints a PACDOT per every file to be analized.
5
+ # This formatter prints a PACDOT per every file to be analyzed.
6
6
  # Pacman will "eat" one PACDOT per file when no offense is detected.
7
7
  # Otherwise it will print a Ghost.
8
8
  # This is inspired by the Pacman formatter for RSpec by Carlos Rojas.
@@ -49,7 +49,7 @@ module RuboCop
49
49
 
50
50
  def cols
51
51
  @cols ||= begin
52
- width = `tput cols`.chomp.to_i
52
+ _height, width = $stdout.winsize
53
53
  width.nil? || width.zero? ? FALLBACK_TERMINAL_WIDTH : width
54
54
  end
55
55
  end
@@ -68,7 +68,7 @@ module RuboCop
68
68
  def step(character)
69
69
  regex = /#{Regexp.quote(PACMAN)}|#{Regexp.quote(PACDOT)}/
70
70
  @progress_line = @progress_line.sub(regex, character)
71
- output.printf("%s\r", @progress_line)
71
+ output.printf("%<line>s\r", line: @progress_line)
72
72
  return unless @progress_line[-1] =~ /ᗣ|\./
73
73
 
74
74
  @repetitions += 1
@@ -42,9 +42,13 @@ module RuboCop
42
42
  output.puts yellow("== #{smart_path(file)} ==")
43
43
 
44
44
  offenses.each do |o|
45
- output.printf("%s:%3d:%3d: %s\n",
46
- colored_severity_code(o),
47
- o.line, o.real_column, message(o))
45
+ output.printf(
46
+ "%<severity>s:%3<line>d:%3<column>d: %<message>s\n",
47
+ severity: colored_severity_code(o),
48
+ line: o.line,
49
+ column: o.real_column,
50
+ message: message(o)
51
+ )
48
52
  end
49
53
  end
50
54
 
@@ -42,9 +42,14 @@ module RuboCop
42
42
  end
43
43
 
44
44
  def report_offense(file, offense)
45
- output.printf("# %s:%d:%d: %s: %s\n",
46
- cyan(smart_path(file)), offense.line, offense.real_column,
47
- colored_severity_code(offense), message(offense))
45
+ output.printf(
46
+ "# %<path>s:%<line>d:%<column>d: %<severity>s: %<message>s\n",
47
+ path: cyan(smart_path(file)),
48
+ line: offense.line,
49
+ column: offense.real_column,
50
+ severity: colored_severity_code(offense),
51
+ message: message(offense)
52
+ )
48
53
 
49
54
  # rubocop:disable Lint/HandleExceptions
50
55
  begin
@@ -367,8 +367,9 @@ module RuboCop
367
367
  # This module contains help texts for command line options.
368
368
  module OptionsHelp
369
369
  MAX_EXCL = RuboCop::Options::DEFAULT_MAXIMUM_EXCLUSION_ITEMS.to_s
370
-
371
370
  # rubocop:disable Metrics/LineLength
371
+ FORMATTER_OPTION_LIST = RuboCop::Formatter::FormatterSet::BUILTIN_FORMATTERS_FOR_KEYS.keys
372
+
372
373
  TEXT = {
373
374
  only: 'Run only the given cop(s).',
374
375
  only_guide_cops: ['Run only cops for rules that link to a',
@@ -407,21 +408,8 @@ module RuboCop
407
408
  format: ['Choose an output formatter. This option',
408
409
  'can be specified multiple times to enable',
409
410
  'multiple formatters at the same time.',
410
- ' [p]rogress (default)',
411
- ' [s]imple',
412
- ' [c]lang',
413
- ' [d]isabled cops via inline comments',
414
- ' [fu]ubar',
415
- ' [pa]cman',
416
- ' [e]macs',
417
- ' [j]son',
418
- ' [h]tml',
419
- ' [fi]les',
420
- ' [o]ffenses',
421
- ' [w]orst',
422
- ' [t]ap',
423
- ' [q]uiet',
424
- ' [a]utogenconf',
411
+ '[p]rogress is used by default',
412
+ *FORMATTER_OPTION_LIST.map { |item| " #{item}" },
425
413
  ' custom formatter class name'],
426
414
  out: ['Write output to a file instead of STDOUT.',
427
415
  'This option applies to the previously',
@@ -3,7 +3,7 @@
3
3
  module RuboCop
4
4
  # This module holds the RuboCop version information.
5
5
  module Version
6
- STRING = '0.75.0'
6
+ STRING = '0.75.1'
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)'
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.75.0
4
+ version: 0.75.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-09-30 00:00:00.000000000 Z
13
+ date: 2019-10-14 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: jaro_winkler