rubocop 1.19.0 → 1.22.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +1 -1
- data/config/default.yml +86 -14
- data/lib/rubocop/config.rb +5 -0
- data/lib/rubocop/config_loader.rb +4 -2
- data/lib/rubocop/config_validator.rb +9 -1
- data/lib/rubocop/cop/base.rb +3 -3
- data/lib/rubocop/cop/bundler/gem_filename.rb +103 -0
- data/lib/rubocop/cop/bundler/insecure_protocol_source.rb +45 -21
- data/lib/rubocop/cop/bundler/ordered_gems.rb +3 -12
- data/lib/rubocop/cop/correctors/lambda_literal_to_method_corrector.rb +2 -2
- data/lib/rubocop/cop/correctors/line_break_corrector.rb +1 -1
- data/lib/rubocop/cop/correctors/ordered_gem_corrector.rb +11 -10
- data/lib/rubocop/cop/documentation.rb +1 -1
- data/lib/rubocop/cop/gemspec/ordered_dependencies.rb +3 -12
- data/lib/rubocop/cop/gemspec/required_ruby_version.rb +1 -1
- data/lib/rubocop/cop/generator.rb +14 -8
- data/lib/rubocop/cop/internal_affairs/node_matcher_directive.rb +1 -1
- data/lib/rubocop/cop/layout/argument_alignment.rb +1 -1
- data/lib/rubocop/cop/layout/class_structure.rb +2 -1
- data/lib/rubocop/cop/layout/dot_position.rb +25 -2
- data/lib/rubocop/cop/layout/end_alignment.rb +1 -1
- data/lib/rubocop/cop/layout/leading_comment_space.rb +1 -1
- data/lib/rubocop/cop/layout/line_length.rb +8 -6
- data/lib/rubocop/cop/layout/multiline_block_layout.rb +1 -1
- data/lib/rubocop/cop/layout/multiline_method_argument_line_breaks.rb +3 -0
- data/lib/rubocop/cop/layout/redundant_line_break.rb +1 -0
- data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +5 -4
- data/lib/rubocop/cop/layout/single_line_block_chain.rb +15 -4
- data/lib/rubocop/cop/layout/space_after_not.rb +1 -0
- data/lib/rubocop/cop/layout/space_around_equals_in_parameter_default.rb +2 -1
- data/lib/rubocop/cop/layout/space_around_keyword.rb +2 -2
- data/lib/rubocop/cop/layout/space_before_brackets.rb +1 -0
- data/lib/rubocop/cop/layout/space_inside_parens.rb +74 -24
- data/lib/rubocop/cop/layout/space_inside_reference_brackets.rb +1 -1
- data/lib/rubocop/cop/lint/ambiguous_operator_precedence.rb +111 -0
- data/lib/rubocop/cop/lint/ambiguous_range.rb +8 -8
- data/lib/rubocop/cop/lint/assignment_in_condition.rb +7 -5
- data/lib/rubocop/cop/lint/binary_operator_with_identical_operands.rb +18 -5
- data/lib/rubocop/cop/lint/boolean_symbol.rb +5 -0
- data/lib/rubocop/cop/lint/debugger.rb +2 -4
- data/lib/rubocop/cop/lint/deprecated_class_methods.rb +4 -4
- data/lib/rubocop/cop/lint/disjunctive_assignment_in_constructor.rb +24 -1
- data/lib/rubocop/cop/lint/else_layout.rb +9 -5
- data/lib/rubocop/cop/lint/empty_in_pattern.rb +1 -1
- data/lib/rubocop/cop/lint/erb_new_arguments.rb +1 -1
- data/lib/rubocop/cop/lint/float_out_of_range.rb +1 -1
- data/lib/rubocop/cop/lint/hash_compare_by_identity.rb +12 -3
- data/lib/rubocop/cop/lint/incompatible_io_select_with_fiber_scheduler.rb +67 -0
- data/lib/rubocop/cop/lint/interpolation_check.rb +5 -0
- data/lib/rubocop/cop/lint/loop.rb +4 -3
- data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +5 -1
- data/lib/rubocop/cop/lint/number_conversion.rb +12 -1
- data/lib/rubocop/cop/lint/numbered_parameter_assignment.rb +1 -1
- data/lib/rubocop/cop/lint/or_assignment_to_constant.rb +4 -2
- data/lib/rubocop/cop/lint/out_of_range_regexp_ref.rb +17 -0
- data/lib/rubocop/cop/lint/percent_string_array.rb +10 -0
- data/lib/rubocop/cop/lint/raise_exception.rb +4 -0
- data/lib/rubocop/cop/lint/redundant_safe_navigation.rb +5 -4
- data/lib/rubocop/cop/lint/require_relative_self_path.rb +49 -0
- data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +1 -1
- data/lib/rubocop/cop/lint/symbol_conversion.rb +1 -1
- data/lib/rubocop/cop/lint/triple_quotes.rb +1 -1
- data/lib/rubocop/cop/lint/unexpected_block_arity.rb +8 -3
- data/lib/rubocop/cop/lint/unused_method_argument.rb +2 -3
- data/lib/rubocop/cop/lint/useless_method_definition.rb +3 -2
- data/lib/rubocop/cop/lint/useless_setter_call.rb +7 -4
- data/lib/rubocop/cop/lint/useless_times.rb +4 -3
- data/lib/rubocop/cop/metrics/abc_size.rb +6 -0
- data/lib/rubocop/cop/metrics/perceived_complexity.rb +1 -1
- data/lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +1 -1
- data/lib/rubocop/cop/metrics/utils/code_length_calculator.rb +1 -1
- data/lib/rubocop/cop/mixin/annotation_comment.rb +57 -34
- data/lib/rubocop/cop/mixin/code_length.rb +1 -1
- data/lib/rubocop/cop/mixin/documentation_comment.rb +5 -2
- data/lib/rubocop/cop/mixin/frozen_string_literal.rb +23 -1
- data/lib/rubocop/cop/mixin/heredoc.rb +1 -3
- data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +2 -2
- data/lib/rubocop/cop/mixin/ordered_gem_node.rb +9 -1
- data/lib/rubocop/cop/mixin/percent_array.rb +11 -3
- data/lib/rubocop/cop/mixin/preceding_following_alignment.rb +9 -1
- data/lib/rubocop/cop/naming/ascii_identifiers.rb +0 -3
- data/lib/rubocop/cop/naming/block_parameter_name.rb +1 -1
- data/lib/rubocop/cop/naming/constant_name.rb +1 -1
- data/lib/rubocop/cop/naming/inclusive_language.rb +9 -9
- data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +5 -4
- data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +7 -0
- data/lib/rubocop/cop/security/io_methods.rb +49 -0
- data/lib/rubocop/cop/security/json_load.rb +8 -7
- data/lib/rubocop/cop/security/open.rb +4 -0
- data/lib/rubocop/cop/security/yaml_load.rb +4 -0
- data/lib/rubocop/cop/style/accessor_grouping.rb +2 -2
- data/lib/rubocop/cop/style/and_or.rb +5 -0
- data/lib/rubocop/cop/style/arguments_forwarding.rb +13 -2
- data/lib/rubocop/cop/style/array_coercion.rb +21 -3
- data/lib/rubocop/cop/style/ascii_comments.rb +0 -3
- data/lib/rubocop/cop/style/block_delimiters.rb +23 -6
- data/lib/rubocop/cop/style/case_equality.rb +6 -9
- data/lib/rubocop/cop/style/case_like_if.rb +5 -0
- data/lib/rubocop/cop/style/class_and_module_children.rb +9 -0
- data/lib/rubocop/cop/style/collection_compact.rb +7 -5
- data/lib/rubocop/cop/style/collection_methods.rb +8 -6
- data/lib/rubocop/cop/style/combinable_loops.rb +3 -2
- data/lib/rubocop/cop/style/comment_annotation.rb +25 -39
- data/lib/rubocop/cop/style/commented_keyword.rb +4 -1
- data/lib/rubocop/cop/style/date_time.rb +5 -0
- data/lib/rubocop/cop/style/document_dynamic_eval_definition.rb +1 -1
- data/lib/rubocop/cop/style/documentation.rb +23 -8
- data/lib/rubocop/cop/style/double_negation.rb +27 -6
- data/lib/rubocop/cop/style/empty_method.rb +1 -1
- data/lib/rubocop/cop/style/encoding.rb +26 -15
- data/lib/rubocop/cop/style/explicit_block_argument.rb +21 -11
- data/lib/rubocop/cop/style/float_division.rb +10 -2
- data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +7 -2
- data/lib/rubocop/cop/style/global_std_stream.rb +4 -0
- data/lib/rubocop/cop/style/hash_as_last_array_item.rb +11 -0
- data/lib/rubocop/cop/style/hash_each_methods.rb +5 -0
- data/lib/rubocop/cop/style/hash_except.rb +4 -3
- data/lib/rubocop/cop/style/hash_transform_keys.rb +4 -6
- data/lib/rubocop/cop/style/hash_transform_values.rb +4 -6
- data/lib/rubocop/cop/style/identical_conditional_branches.rb +18 -16
- data/lib/rubocop/cop/style/if_with_boolean_literal_branches.rb +18 -4
- data/lib/rubocop/cop/style/infinite_loop.rb +4 -3
- data/lib/rubocop/cop/style/inverse_methods.rb +9 -2
- data/lib/rubocop/cop/style/lambda_call.rb +1 -1
- data/lib/rubocop/cop/style/line_end_concatenation.rb +13 -0
- data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +6 -6
- data/lib/rubocop/cop/style/module_function.rb +8 -9
- data/lib/rubocop/cop/style/mutable_constant.rb +73 -6
- data/lib/rubocop/cop/style/negated_if.rb +1 -1
- data/lib/rubocop/cop/style/negated_unless.rb +1 -1
- data/lib/rubocop/cop/style/non_nil_check.rb +2 -2
- data/lib/rubocop/cop/style/not.rb +2 -2
- data/lib/rubocop/cop/style/numbered_parameters.rb +46 -0
- data/lib/rubocop/cop/style/numbered_parameters_limit.rb +50 -0
- data/lib/rubocop/cop/style/numeric_literals.rb +7 -8
- data/lib/rubocop/cop/style/numeric_predicate.rb +5 -0
- data/lib/rubocop/cop/style/optional_arguments.rb +4 -0
- data/lib/rubocop/cop/style/optional_boolean_parameter.rb +14 -4
- data/lib/rubocop/cop/style/parallel_assignment.rb +1 -1
- data/lib/rubocop/cop/style/percent_q_literals.rb +2 -2
- data/lib/rubocop/cop/style/preferred_hash_methods.rb +9 -4
- data/lib/rubocop/cop/style/raise_args.rb +1 -1
- data/lib/rubocop/cop/style/redundant_argument.rb +14 -7
- data/lib/rubocop/cop/style/redundant_begin.rb +25 -0
- data/lib/rubocop/cop/style/redundant_condition.rb +2 -3
- data/lib/rubocop/cop/style/redundant_fetch_block.rb +4 -0
- data/lib/rubocop/cop/style/redundant_file_extension_in_require.rb +12 -3
- data/lib/rubocop/cop/style/redundant_freeze.rb +4 -4
- data/lib/rubocop/cop/style/redundant_interpolation.rb +1 -1
- data/lib/rubocop/cop/style/redundant_percent_q.rb +2 -3
- data/lib/rubocop/cop/style/redundant_self.rb +10 -0
- data/lib/rubocop/cop/style/redundant_self_assignment.rb +4 -3
- data/lib/rubocop/cop/style/redundant_self_assignment_branch.rb +23 -28
- data/lib/rubocop/cop/style/redundant_sort.rb +51 -18
- data/lib/rubocop/cop/style/regexp_literal.rb +3 -3
- data/lib/rubocop/cop/style/return_nil.rb +2 -1
- data/lib/rubocop/cop/style/safe_navigation.rb +13 -2
- data/lib/rubocop/cop/style/select_by_regexp.rb +106 -0
- data/lib/rubocop/cop/style/single_argument_dig.rb +5 -0
- data/lib/rubocop/cop/style/slicing_with_range.rb +13 -0
- data/lib/rubocop/cop/style/sole_nested_conditional.rb +4 -0
- data/lib/rubocop/cop/style/special_global_vars.rb +4 -0
- data/lib/rubocop/cop/style/static_class.rb +5 -5
- data/lib/rubocop/cop/style/string_chars.rb +4 -2
- data/lib/rubocop/cop/style/string_concatenation.rb +5 -1
- data/lib/rubocop/cop/style/string_hash_keys.rb +4 -0
- data/lib/rubocop/cop/style/struct_inheritance.rb +4 -0
- data/lib/rubocop/cop/style/swap_values.rb +4 -2
- data/lib/rubocop/cop/style/symbol_array.rb +3 -3
- data/lib/rubocop/cop/style/symbol_proc.rb +26 -0
- data/lib/rubocop/cop/style/trailing_comma_in_block_args.rb +19 -0
- data/lib/rubocop/cop/style/trivial_accessors.rb +1 -1
- data/lib/rubocop/cop/style/word_array.rb +3 -3
- data/lib/rubocop/cop/style/yoda_condition.rb +24 -7
- data/lib/rubocop/cop/style/zero_length_predicate.rb +6 -0
- data/lib/rubocop/cop/util.rb +2 -2
- data/lib/rubocop/cops_documentation_generator.rb +17 -5
- data/lib/rubocop/magic_comment.rb +44 -15
- data/lib/rubocop/options.rb +126 -112
- data/lib/rubocop/result_cache.rb +1 -1
- data/lib/rubocop/rspec/cop_helper.rb +1 -1
- data/lib/rubocop/rspec/expect_offense.rb +6 -2
- data/lib/rubocop/runner.rb +1 -2
- data/lib/rubocop/version.rb +1 -1
- data/lib/rubocop.rb +10 -2
- metadata +13 -5
@@ -7,6 +7,11 @@ module RuboCop
|
|
7
7
|
class MagicComment
|
8
8
|
# @see https://git.io/vMC1C IRB's pattern for matching magic comment tokens
|
9
9
|
TOKEN = /[[:alnum:]\-_]+/.freeze
|
10
|
+
KEYWORDS = {
|
11
|
+
encoding: '(?:en)?coding',
|
12
|
+
frozen_string_literal: 'frozen[_-]string[_-]literal',
|
13
|
+
shareable_constant_value: 'shareable[_-]constant[_-]value'
|
14
|
+
}.freeze
|
10
15
|
|
11
16
|
# Detect magic comment format and pass it to the appropriate wrapper.
|
12
17
|
#
|
@@ -15,8 +20,8 @@ module RuboCop
|
|
15
20
|
# @return [RuboCop::MagicComment]
|
16
21
|
def self.parse(comment)
|
17
22
|
case comment
|
18
|
-
when EmacsComment::
|
19
|
-
when VimComment::
|
23
|
+
when EmacsComment::REGEXP then EmacsComment.new(comment)
|
24
|
+
when VimComment::REGEXP then VimComment.new(comment)
|
20
25
|
else
|
21
26
|
SimpleComment.new(comment)
|
22
27
|
end
|
@@ -30,6 +35,10 @@ module RuboCop
|
|
30
35
|
frozen_string_literal_specified? || encoding_specified? || shareable_constant_value_specified?
|
31
36
|
end
|
32
37
|
|
38
|
+
def valid?
|
39
|
+
@comment.start_with?('#') && any?
|
40
|
+
end
|
41
|
+
|
33
42
|
# Does the magic comment enable the frozen string literal feature.
|
34
43
|
#
|
35
44
|
# Test whether the frozen string literal value is `true`. Cannot
|
@@ -111,6 +120,18 @@ module RuboCop
|
|
111
120
|
#
|
112
121
|
# @abstract
|
113
122
|
class EditorComment < MagicComment
|
123
|
+
def encoding
|
124
|
+
match(self.class::KEYWORDS[:encoding])
|
125
|
+
end
|
126
|
+
|
127
|
+
# Rewrite the comment without a given token type
|
128
|
+
def without(type)
|
129
|
+
remaining = tokens.grep_v(/\A#{self.class::KEYWORDS[type.to_sym]}/)
|
130
|
+
return '' if remaining.empty?
|
131
|
+
|
132
|
+
self.class::FORMAT % remaining.join(self.class::SEPARATOR)
|
133
|
+
end
|
134
|
+
|
114
135
|
private
|
115
136
|
|
116
137
|
# Find a token starting with the provided keyword and extract its value.
|
@@ -135,7 +156,7 @@ module RuboCop
|
|
135
156
|
#
|
136
157
|
# @return [Array<String>]
|
137
158
|
def tokens
|
138
|
-
extract(self.class::
|
159
|
+
extract(self.class::REGEXP).split(self.class::SEPARATOR).map(&:strip)
|
139
160
|
end
|
140
161
|
end
|
141
162
|
|
@@ -151,22 +172,19 @@ module RuboCop
|
|
151
172
|
# @see https://www.gnu.org/software/emacs/manual/html_node/emacs/Specify-Coding.html
|
152
173
|
# @see https://git.io/vMCXh Emacs handling in Ruby's parse.y
|
153
174
|
class EmacsComment < EditorComment
|
154
|
-
|
175
|
+
REGEXP = /-\*-(.+)-\*-/.freeze
|
176
|
+
FORMAT = '# -*- %s -*-'
|
155
177
|
SEPARATOR = ';'
|
156
178
|
OPERATOR = ':'
|
157
179
|
|
158
|
-
def encoding
|
159
|
-
match('(?:en)?coding')
|
160
|
-
end
|
161
|
-
|
162
180
|
private
|
163
181
|
|
164
182
|
def extract_frozen_string_literal
|
165
|
-
match(
|
183
|
+
match(KEYWORDS[:frozen_string_literal])
|
166
184
|
end
|
167
185
|
|
168
186
|
def extract_shareable_constant_value
|
169
|
-
match(
|
187
|
+
match(KEYWORDS[:shareable_constant_value])
|
170
188
|
end
|
171
189
|
end
|
172
190
|
|
@@ -179,9 +197,11 @@ module RuboCop
|
|
179
197
|
#
|
180
198
|
# comment.encoding # => 'ascii-8bit'
|
181
199
|
class VimComment < EditorComment
|
182
|
-
|
200
|
+
REGEXP = /#\s*vim:\s*(.+)/.freeze
|
201
|
+
FORMAT = '# vim: %s'
|
183
202
|
SEPARATOR = ', '
|
184
203
|
OPERATOR = '='
|
204
|
+
KEYWORDS = MagicComment::KEYWORDS.merge(encoding: 'fileencoding').freeze
|
185
205
|
|
186
206
|
# For some reason the fileencoding keyword only works if there
|
187
207
|
# is at least one other token included in the string. For example
|
@@ -193,7 +213,7 @@ module RuboCop
|
|
193
213
|
# # vim: foo=bar, fileencoding=ascii-8bit
|
194
214
|
#
|
195
215
|
def encoding
|
196
|
-
|
216
|
+
super if tokens.size > 1
|
197
217
|
end
|
198
218
|
|
199
219
|
# Vim comments cannot specify frozen string literal behavior.
|
@@ -219,7 +239,16 @@ module RuboCop
|
|
219
239
|
class SimpleComment < MagicComment
|
220
240
|
# Match `encoding` or `coding`
|
221
241
|
def encoding
|
222
|
-
extract(/\A\s*\#.*\b
|
242
|
+
extract(/\A\s*\#.*\b#{KEYWORDS[:encoding]}: (#{TOKEN})/io)
|
243
|
+
end
|
244
|
+
|
245
|
+
# Rewrite the comment without a given token type
|
246
|
+
def without(type)
|
247
|
+
if @comment.match?(/\A#\s*#{self.class::KEYWORDS[type.to_sym]}/)
|
248
|
+
''
|
249
|
+
else
|
250
|
+
@comment
|
251
|
+
end
|
223
252
|
end
|
224
253
|
|
225
254
|
private
|
@@ -232,11 +261,11 @@ module RuboCop
|
|
232
261
|
# Case-insensitive and dashes/underscores are acceptable.
|
233
262
|
# @see https://git.io/vM7Mg
|
234
263
|
def extract_frozen_string_literal
|
235
|
-
extract(/\A\s*#\s
|
264
|
+
extract(/\A\s*#\s*#{KEYWORDS[:frozen_string_literal]}:\s*(#{TOKEN})\s*\z/io)
|
236
265
|
end
|
237
266
|
|
238
267
|
def extract_shareable_constant_value
|
239
|
-
extract(/\A\s*#\s
|
268
|
+
extract(/\A\s*#\s*#{KEYWORDS[:shareable_constant_value]}:\s*(#{TOKEN})\s*\z/io)
|
240
269
|
end
|
241
270
|
end
|
242
271
|
end
|
data/lib/rubocop/options.rb
CHANGED
@@ -59,86 +59,111 @@ module RuboCop
|
|
59
59
|
|
60
60
|
def define_options
|
61
61
|
OptionParser.new do |opts|
|
62
|
-
opts.banner = 'Usage: rubocop [options] [file1, file2, ...]'
|
62
|
+
opts.banner = rainbow.wrap('Usage: rubocop [options] [file1, file2, ...]').bright
|
63
63
|
|
64
|
-
|
65
|
-
add_only_options(opts)
|
66
|
-
add_configuration_options(opts)
|
67
|
-
add_formatting_options(opts)
|
68
|
-
|
69
|
-
option(opts, '-r', '--require FILE') { |f| require_feature(f) }
|
70
|
-
|
71
|
-
add_severity_option(opts)
|
72
|
-
add_flags_with_optional_args(opts)
|
64
|
+
add_check_options(opts)
|
73
65
|
add_cache_options(opts)
|
74
|
-
|
75
|
-
|
66
|
+
add_output_options(opts)
|
67
|
+
add_autocorrection_options(opts)
|
68
|
+
add_config_generation_options(opts)
|
69
|
+
add_additional_modes(opts)
|
70
|
+
add_general_options(opts)
|
71
|
+
end
|
72
|
+
end
|
76
73
|
|
74
|
+
def add_check_options(opts) # rubocop:disable Metrics/AbcSize, Metrics/MethodLength
|
75
|
+
section(opts, 'Basic Options') do
|
76
|
+
option(opts, '-l', '--lint') do
|
77
|
+
@options[:only] ||= []
|
78
|
+
@options[:only] << 'Lint'
|
79
|
+
end
|
80
|
+
option(opts, '-x', '--fix-layout') do
|
81
|
+
@options[:only] ||= []
|
82
|
+
@options[:only] << 'Layout'
|
83
|
+
@options[:auto_correct] = true
|
84
|
+
end
|
85
|
+
option(opts, '--safe')
|
86
|
+
add_cop_selection_csv_option('except', opts)
|
87
|
+
add_cop_selection_csv_option('only', opts)
|
88
|
+
option(opts, '--only-guide-cops')
|
89
|
+
option(opts, '-F', '--fail-fast')
|
90
|
+
option(opts, '--disable-pending-cops')
|
91
|
+
option(opts, '--enable-pending-cops')
|
92
|
+
option(opts, '--ignore-disable-comments')
|
93
|
+
option(opts, '--force-exclusion')
|
94
|
+
option(opts, '--only-recognized-file-types')
|
95
|
+
option(opts, '--ignore-parent-exclusion')
|
96
|
+
option(opts, '--force-default-config')
|
77
97
|
option(opts, '-s', '--stdin FILE')
|
98
|
+
option(opts, '-P', '--[no-]parallel')
|
99
|
+
add_severity_option(opts)
|
78
100
|
end
|
79
101
|
end
|
80
102
|
|
81
|
-
def
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
103
|
+
def add_output_options(opts) # rubocop:disable Metrics/AbcSize, Metrics/MethodLength
|
104
|
+
section(opts, 'Output Options') do
|
105
|
+
option(opts, '-f', '--format FORMATTER') do |key|
|
106
|
+
@options[:formatters] ||= []
|
107
|
+
@options[:formatters] << [key]
|
108
|
+
end
|
86
109
|
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
message = "--#{option} argument should be [COP1,COP2,...]."
|
110
|
+
option(opts, '-D', '--[no-]display-cop-names')
|
111
|
+
option(opts, '-E', '--extra-details')
|
112
|
+
option(opts, '-S', '--display-style-guide')
|
91
113
|
|
92
|
-
|
114
|
+
option(opts, '-o', '--out FILE') do |path|
|
115
|
+
if @options[:formatters]
|
116
|
+
@options[:formatters].last << path
|
117
|
+
else
|
118
|
+
@options[:output_path] = path
|
119
|
+
end
|
93
120
|
end
|
94
121
|
|
95
|
-
|
122
|
+
option(opts, '--stderr')
|
123
|
+
option(opts, '--display-time')
|
124
|
+
option(opts, '--display-only-failed')
|
125
|
+
option(opts, '--display-only-fail-level-offenses')
|
96
126
|
end
|
97
127
|
end
|
98
128
|
|
99
|
-
def
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
def add_auto_gen_options(opts)
|
109
|
-
option(opts, '--auto-gen-config')
|
110
|
-
|
111
|
-
option(opts, '--regenerate-todo') do
|
112
|
-
@options.replace(ConfigRegeneration.new.options.merge(@options))
|
129
|
+
def add_autocorrection_options(opts)
|
130
|
+
section(opts, 'Auto-correction') do
|
131
|
+
option(opts, '-a', '--auto-correct') { @options[:safe_auto_correct] = true }
|
132
|
+
option(opts, '--safe-auto-correct') do
|
133
|
+
warn '--safe-auto-correct is deprecated; use --auto-correct'
|
134
|
+
@options[:safe_auto_correct] = @options[:auto_correct] = true
|
135
|
+
end
|
136
|
+
option(opts, '-A', '--auto-correct-all') { @options[:auto_correct] = true }
|
137
|
+
option(opts, '--disable-uncorrectable')
|
113
138
|
end
|
139
|
+
end
|
114
140
|
|
115
|
-
|
141
|
+
def add_config_generation_options(opts)
|
142
|
+
section(opts, 'Config Generation') do
|
143
|
+
option(opts, '--auto-gen-config')
|
116
144
|
|
117
|
-
|
145
|
+
option(opts, '--regenerate-todo') do
|
146
|
+
@options.replace(ConfigRegeneration.new.options.merge(@options))
|
147
|
+
end
|
118
148
|
|
119
|
-
|
120
|
-
option(opts, '--[no-]auto-gen-only-exclude')
|
121
|
-
option(opts, '--[no-]auto-gen-timestamp')
|
149
|
+
option(opts, '--exclude-limit COUNT') { @validator.validate_exclude_limit_option }
|
122
150
|
|
123
|
-
|
151
|
+
option(opts, '--[no-]offense-counts')
|
152
|
+
option(opts, '--[no-]auto-gen-only-exclude')
|
153
|
+
option(opts, '--[no-]auto-gen-timestamp')
|
154
|
+
end
|
124
155
|
end
|
125
156
|
|
126
|
-
def
|
127
|
-
option(opts,
|
128
|
-
|
129
|
-
|
130
|
-
end
|
157
|
+
def add_cop_selection_csv_option(option, opts)
|
158
|
+
option(opts, "--#{option} [COP1,COP2,...]") do |list|
|
159
|
+
unless list
|
160
|
+
message = "--#{option} argument should be [COP1,COP2,...]."
|
131
161
|
|
132
|
-
|
133
|
-
if @options[:formatters]
|
134
|
-
@options[:formatters].last << path
|
135
|
-
else
|
136
|
-
@options[:output_path] = path
|
162
|
+
raise OptionArgumentError, message
|
137
163
|
end
|
138
|
-
end
|
139
164
|
|
140
|
-
|
141
|
-
|
165
|
+
@options[:"#{option}"] = list.empty? ? [''] : list.split(',')
|
166
|
+
end
|
142
167
|
end
|
143
168
|
|
144
169
|
def add_severity_option(opts)
|
@@ -148,62 +173,50 @@ module RuboCop
|
|
148
173
|
table) do |severity|
|
149
174
|
@options[:fail_level] = severity
|
150
175
|
end
|
151
|
-
option(opts, '--display-only-fail-level-offenses')
|
152
176
|
end
|
153
177
|
|
154
|
-
def
|
155
|
-
|
156
|
-
|
178
|
+
def add_cache_options(opts)
|
179
|
+
section(opts, 'Caching') do
|
180
|
+
option(opts, '-C', '--cache FLAG')
|
181
|
+
option(opts, '--cache-root DIR') { @validator.validate_cache_enabled_for_cache_root }
|
157
182
|
end
|
158
183
|
end
|
159
184
|
|
160
|
-
def
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
def add_boolean_flags(opts)
|
167
|
-
option(opts, '-F', '--fail-fast')
|
168
|
-
option(opts, '-d', '--debug')
|
169
|
-
option(opts, '-D', '--[no-]display-cop-names')
|
170
|
-
option(opts, '-E', '--extra-details')
|
171
|
-
option(opts, '-S', '--display-style-guide')
|
172
|
-
option(opts, '-a', '--auto-correct') { @options[:safe_auto_correct] = true }
|
173
|
-
option(opts, '--safe-auto-correct') do
|
174
|
-
warn '--safe-auto-correct is deprecated; use --auto-correct'
|
175
|
-
@options[:safe_auto_correct] = @options[:auto_correct] = true
|
185
|
+
def add_additional_modes(opts)
|
186
|
+
section(opts, 'Additional Modes') do
|
187
|
+
option(opts, '-L', '--list-target-files')
|
188
|
+
option(opts, '--show-cops [COP1,COP2,...]') do |list|
|
189
|
+
@options[:show_cops] = list.nil? ? [] : list.split(',')
|
190
|
+
end
|
176
191
|
end
|
177
|
-
option(opts, '-A', '--auto-correct-all') { @options[:auto_correct] = true }
|
178
|
-
option(opts, '--disable-pending-cops')
|
179
|
-
option(opts, '--enable-pending-cops')
|
180
|
-
option(opts, '--ignore-disable-comments')
|
181
|
-
|
182
|
-
option(opts, '--safe')
|
183
|
-
|
184
|
-
option(opts, '--stderr')
|
185
|
-
option(opts, '--[no-]color')
|
186
|
-
|
187
|
-
option(opts, '-v', '--version')
|
188
|
-
option(opts, '-V', '--verbose-version')
|
189
|
-
option(opts, '-P', '--[no-]parallel')
|
190
192
|
end
|
191
|
-
# rubocop:enable Metrics/MethodLength, Metrics/AbcSize
|
192
193
|
|
193
|
-
def
|
194
|
-
|
195
|
-
|
196
|
-
|
194
|
+
def add_general_options(opts)
|
195
|
+
section(opts, 'General Options') do
|
196
|
+
option(opts, '--init')
|
197
|
+
option(opts, '-c', '--config FILE')
|
198
|
+
option(opts, '-d', '--debug')
|
199
|
+
option(opts, '-r', '--require FILE') { |f| require_feature(f) }
|
200
|
+
option(opts, '--[no-]color')
|
201
|
+
option(opts, '-v', '--version')
|
202
|
+
option(opts, '-V', '--verbose-version')
|
197
203
|
end
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
204
|
+
end
|
205
|
+
|
206
|
+
def rainbow
|
207
|
+
@rainbow ||= begin
|
208
|
+
rainbow = Rainbow.new
|
209
|
+
rainbow.enabled = false if ARGV.include?('--no-color')
|
210
|
+
rainbow
|
202
211
|
end
|
203
212
|
end
|
204
213
|
|
205
|
-
|
206
|
-
|
214
|
+
# Creates a section of options in order to separate them visually when
|
215
|
+
# using `--help`.
|
216
|
+
def section(opts, heading, &_block)
|
217
|
+
heading = rainbow.wrap(heading).bright
|
218
|
+
opts.separator("\n#{heading}:\n")
|
219
|
+
yield
|
207
220
|
end
|
208
221
|
|
209
222
|
# Sets a value in the @options hash, based on the given long option and its
|
@@ -403,7 +416,7 @@ module RuboCop
|
|
403
416
|
only: 'Run only the given cop(s).',
|
404
417
|
only_guide_cops: ['Run only cops for rules that link to a',
|
405
418
|
'style guide.'],
|
406
|
-
except: '
|
419
|
+
except: 'Exclude the given cop(s).',
|
407
420
|
require: 'Require Ruby file.',
|
408
421
|
config: 'Specify configuration file.',
|
409
422
|
auto_gen_config: ['Generate a configuration file acting as a',
|
@@ -422,29 +435,30 @@ module RuboCop
|
|
422
435
|
'when running --auto-gen-config, except if the',
|
423
436
|
'number of files with offenses is bigger than',
|
424
437
|
'exclude-limit. Default is false.'],
|
425
|
-
exclude_limit: ['
|
426
|
-
'
|
427
|
-
"
|
438
|
+
exclude_limit: ['Set the limit for how many files to explicitly exclude.',
|
439
|
+
'If there are more files than the limit, the cop will',
|
440
|
+
"be disabled instead. Default is #{MAX_EXCL}."],
|
428
441
|
disable_uncorrectable: ['Used with --auto-correct to annotate any',
|
429
442
|
'offenses that do not support autocorrect',
|
430
443
|
'with `rubocop:todo` comments.'],
|
431
|
-
force_exclusion: ['
|
432
|
-
'
|
433
|
-
'
|
444
|
+
force_exclusion: ['Any files excluded by `Exclude` in configuration',
|
445
|
+
'files will be excluded, even if given explicitly',
|
446
|
+
'as arguments.'],
|
434
447
|
only_recognized_file_types: ['Inspect files given on the command line only if',
|
435
|
-
'they are listed in AllCops/Include parameters',
|
448
|
+
'they are listed in `AllCops/Include` parameters',
|
436
449
|
'of user configuration or default configuration.'],
|
437
450
|
ignore_disable_comments: ['Run cops even when they are disabled locally',
|
438
|
-
'
|
439
|
-
ignore_parent_exclusion: ['Prevent from inheriting AllCops/Exclude from',
|
451
|
+
'by a `rubocop:disable` directive.'],
|
452
|
+
ignore_parent_exclusion: ['Prevent from inheriting `AllCops/Exclude` from',
|
440
453
|
'parent folders.'],
|
441
454
|
force_default_config: ['Use default configuration even if configuration',
|
442
455
|
'files are present in the directory tree.'],
|
443
456
|
format: ['Choose an output formatter. This option',
|
444
457
|
'can be specified multiple times to enable',
|
445
458
|
'multiple formatters at the same time.',
|
446
|
-
|
447
|
-
|
459
|
+
*FORMATTER_OPTION_LIST.map do |item|
|
460
|
+
" #{item}#{' (default)' if item == '[p]rogress'}"
|
461
|
+
end,
|
448
462
|
' custom formatter class name'],
|
449
463
|
out: ['Write output to a file instead of STDOUT.',
|
450
464
|
'This option applies to the previously',
|
data/lib/rubocop/result_cache.rb
CHANGED
@@ -45,7 +45,7 @@ module RuboCop
|
|
45
45
|
def remove_oldest_files(files, dirs, cache_root, verbose)
|
46
46
|
# Add 1 to half the number of files, so that we remove the file if
|
47
47
|
# there's only 1 left.
|
48
|
-
remove_count = 1 + files.length / 2
|
48
|
+
remove_count = 1 + (files.length / 2)
|
49
49
|
puts "Removing the #{remove_count} oldest files from #{cache_root}" if verbose
|
50
50
|
sorted = files.sort_by { |path| File.mtime(path) }
|
51
51
|
remove_files(sorted, dirs, remove_count)
|
@@ -49,7 +49,7 @@ module CopHelper
|
|
49
49
|
team = RuboCop::Cop::Team.new([cop], nil, raise_error: true)
|
50
50
|
report = team.investigate(processed_source)
|
51
51
|
@last_corrector = report.correctors.first || RuboCop::Cop::Corrector.new(processed_source)
|
52
|
-
report.offenses
|
52
|
+
report.offenses.reject(&:disabled?)
|
53
53
|
end
|
54
54
|
end
|
55
55
|
|
@@ -126,7 +126,7 @@ module RuboCop
|
|
126
126
|
@offenses
|
127
127
|
end
|
128
128
|
|
129
|
-
# rubocop:disable Metrics/AbcSize, Metrics/MethodLength
|
129
|
+
# rubocop:disable Metrics/AbcSize, Metrics/MethodLength, Metrics/CyclomaticComplexity
|
130
130
|
def expect_correction(correction, loop: true, source: nil)
|
131
131
|
if source
|
132
132
|
expected_annotations = parse_annotations(source, raise_error: false)
|
@@ -136,6 +136,8 @@ module RuboCop
|
|
136
136
|
|
137
137
|
raise '`expect_correction` must follow `expect_offense`' unless @processed_source
|
138
138
|
|
139
|
+
source = @processed_source.raw_source
|
140
|
+
|
139
141
|
iteration = 0
|
140
142
|
new_source = loop do
|
141
143
|
iteration += 1
|
@@ -155,9 +157,11 @@ module RuboCop
|
|
155
157
|
_investigate(cop, @processed_source)
|
156
158
|
end
|
157
159
|
|
160
|
+
raise 'Use `expect_no_corrections` if the code will not change' if new_source == source
|
161
|
+
|
158
162
|
expect(new_source).to eq(correction)
|
159
163
|
end
|
160
|
-
# rubocop:enable Metrics/AbcSize, Metrics/MethodLength
|
164
|
+
# rubocop:enable Metrics/AbcSize, Metrics/MethodLength, Metrics/CyclomaticComplexity
|
161
165
|
|
162
166
|
def expect_no_corrections
|
163
167
|
raise '`expect_no_corrections` must follow `expect_offense`' unless @processed_source
|
data/lib/rubocop/runner.rb
CHANGED
@@ -216,8 +216,7 @@ module RuboCop
|
|
216
216
|
def cached_run?
|
217
217
|
@cached_run ||=
|
218
218
|
(@options[:cache] == 'true' ||
|
219
|
-
@options[:cache] != 'false' &&
|
220
|
-
@config_store.for_pwd.for_all_cops['UseCache']) &&
|
219
|
+
(@options[:cache] != 'false' && @config_store.for_pwd.for_all_cops['UseCache'])) &&
|
221
220
|
# When running --auto-gen-config, there's some processing done in the
|
222
221
|
# cops related to calculating the Max parameters for Metrics cops. We
|
223
222
|
# need to do that processing and cannot use caching.
|
data/lib/rubocop/version.rb
CHANGED
data/lib/rubocop.rb
CHANGED
@@ -57,7 +57,6 @@ require_relative 'rubocop/cop/variable_force/reference'
|
|
57
57
|
require_relative 'rubocop/cop/variable_force/scope'
|
58
58
|
require_relative 'rubocop/cop/variable_force/variable_table'
|
59
59
|
|
60
|
-
require_relative 'rubocop/cop/mixin/annotation_comment'
|
61
60
|
require_relative 'rubocop/cop/mixin/array_min_size'
|
62
61
|
require_relative 'rubocop/cop/mixin/array_syntax'
|
63
62
|
require_relative 'rubocop/cop/mixin/alignment'
|
@@ -76,6 +75,7 @@ require_relative 'rubocop/cop/mixin/def_node'
|
|
76
75
|
require_relative 'rubocop/cop/mixin/documentation_comment'
|
77
76
|
require_relative 'rubocop/cop/mixin/duplication'
|
78
77
|
require_relative 'rubocop/cop/mixin/range_help'
|
78
|
+
require_relative 'rubocop/cop/mixin/annotation_comment' # relies on range
|
79
79
|
require_relative 'rubocop/cop/mixin/empty_lines_around_body' # relies on range
|
80
80
|
require_relative 'rubocop/cop/mixin/empty_parameter'
|
81
81
|
require_relative 'rubocop/cop/mixin/end_keyword_alignment'
|
@@ -152,6 +152,7 @@ require_relative 'rubocop/cop/correctors/unused_arg_corrector'
|
|
152
152
|
|
153
153
|
require_relative 'rubocop/cop/bundler/duplicated_gem'
|
154
154
|
require_relative 'rubocop/cop/bundler/gem_comment'
|
155
|
+
require_relative 'rubocop/cop/bundler/gem_filename'
|
155
156
|
require_relative 'rubocop/cop/bundler/gem_version'
|
156
157
|
require_relative 'rubocop/cop/bundler/insecure_protocol_source'
|
157
158
|
require_relative 'rubocop/cop/bundler/ordered_gems'
|
@@ -262,6 +263,7 @@ require_relative 'rubocop/cop/layout/trailing_whitespace'
|
|
262
263
|
require_relative 'rubocop/cop/lint/ambiguous_assignment'
|
263
264
|
require_relative 'rubocop/cop/lint/ambiguous_block_association'
|
264
265
|
require_relative 'rubocop/cop/lint/ambiguous_operator'
|
266
|
+
require_relative 'rubocop/cop/lint/ambiguous_operator_precedence'
|
265
267
|
require_relative 'rubocop/cop/lint/ambiguous_range'
|
266
268
|
require_relative 'rubocop/cop/lint/ambiguous_regexp_literal'
|
267
269
|
require_relative 'rubocop/cop/lint/assignment_in_condition'
|
@@ -305,8 +307,9 @@ require_relative 'rubocop/cop/lint/hash_compare_by_identity'
|
|
305
307
|
require_relative 'rubocop/cop/lint/heredoc_method_call_position'
|
306
308
|
require_relative 'rubocop/cop/lint/identity_comparison'
|
307
309
|
require_relative 'rubocop/cop/lint/implicit_string_concatenation'
|
308
|
-
require_relative 'rubocop/cop/lint/
|
310
|
+
require_relative 'rubocop/cop/lint/incompatible_io_select_with_fiber_scheduler'
|
309
311
|
require_relative 'rubocop/cop/lint/ineffective_access_modifier'
|
312
|
+
require_relative 'rubocop/cop/lint/inherit_exception'
|
310
313
|
require_relative 'rubocop/cop/lint/interpolation_check'
|
311
314
|
require_relative 'rubocop/cop/lint/lambda_without_literal_block'
|
312
315
|
require_relative 'rubocop/cop/lint/literal_as_condition'
|
@@ -343,6 +346,7 @@ require_relative 'rubocop/cop/lint/redundant_with_index'
|
|
343
346
|
require_relative 'rubocop/cop/lint/redundant_with_object'
|
344
347
|
require_relative 'rubocop/cop/lint/regexp_as_condition'
|
345
348
|
require_relative 'rubocop/cop/lint/require_parentheses'
|
349
|
+
require_relative 'rubocop/cop/lint/require_relative_self_path'
|
346
350
|
require_relative 'rubocop/cop/lint/rescue_exception'
|
347
351
|
require_relative 'rubocop/cop/lint/rescue_type'
|
348
352
|
require_relative 'rubocop/cop/lint/return_in_void_context'
|
@@ -509,6 +513,7 @@ require_relative 'rubocop/cop/style/line_end_concatenation'
|
|
509
513
|
require_relative 'rubocop/cop/style/method_call_without_args_parentheses'
|
510
514
|
require_relative 'rubocop/cop/style/method_call_with_args_parentheses'
|
511
515
|
require_relative 'rubocop/cop/style/multiline_in_pattern_then'
|
516
|
+
require_relative 'rubocop/cop/style/numbered_parameters'
|
512
517
|
require_relative 'rubocop/cop/style/redundant_assignment'
|
513
518
|
require_relative 'rubocop/cop/style/redundant_fetch_block'
|
514
519
|
require_relative 'rubocop/cop/style/redundant_file_extension_in_require'
|
@@ -545,6 +550,7 @@ require_relative 'rubocop/cop/style/nil_comparison'
|
|
545
550
|
require_relative 'rubocop/cop/style/nil_lambda'
|
546
551
|
require_relative 'rubocop/cop/style/non_nil_check'
|
547
552
|
require_relative 'rubocop/cop/style/not'
|
553
|
+
require_relative 'rubocop/cop/style/numbered_parameters_limit'
|
548
554
|
require_relative 'rubocop/cop/style/numeric_literals'
|
549
555
|
require_relative 'rubocop/cop/style/numeric_literal_prefix'
|
550
556
|
require_relative 'rubocop/cop/style/numeric_predicate'
|
@@ -585,6 +591,7 @@ require_relative 'rubocop/cop/style/rescue_standard_error'
|
|
585
591
|
require_relative 'rubocop/cop/style/return_nil'
|
586
592
|
require_relative 'rubocop/cop/style/safe_navigation'
|
587
593
|
require_relative 'rubocop/cop/style/sample'
|
594
|
+
require_relative 'rubocop/cop/style/select_by_regexp'
|
588
595
|
require_relative 'rubocop/cop/style/self_assignment'
|
589
596
|
require_relative 'rubocop/cop/style/semicolon'
|
590
597
|
require_relative 'rubocop/cop/style/send'
|
@@ -632,6 +639,7 @@ require_relative 'rubocop/cop/style/yoda_condition'
|
|
632
639
|
require_relative 'rubocop/cop/style/zero_length_predicate'
|
633
640
|
|
634
641
|
require_relative 'rubocop/cop/security/eval'
|
642
|
+
require_relative 'rubocop/cop/security/io_methods'
|
635
643
|
require_relative 'rubocop/cop/security/json_load'
|
636
644
|
require_relative 'rubocop/cop/security/marshal_load'
|
637
645
|
require_relative 'rubocop/cop/security/open'
|