rubocop 1.53.0 → 1.60.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 +4 -4
- data/LICENSE.txt +1 -1
- data/README.md +5 -3
- data/config/default.yml +80 -11
- data/config/obsoletion.yml +5 -0
- data/lib/rubocop/cli/command/auto_generate_config.rb +10 -5
- data/lib/rubocop/cli.rb +1 -1
- data/lib/rubocop/config.rb +0 -2
- data/lib/rubocop/config_finder.rb +2 -2
- data/lib/rubocop/config_loader.rb +0 -1
- data/lib/rubocop/config_obsoletion/parameter_rule.rb +9 -1
- data/lib/rubocop/config_obsoletion.rb +11 -8
- data/lib/rubocop/config_validator.rb +0 -2
- data/lib/rubocop/cop/autocorrect_logic.rb +3 -1
- data/lib/rubocop/cop/base.rb +7 -1
- data/lib/rubocop/cop/bundler/duplicated_gem.rb +1 -0
- data/lib/rubocop/cop/bundler/duplicated_group.rb +127 -0
- data/lib/rubocop/cop/bundler/gem_comment.rb +2 -2
- data/lib/rubocop/cop/bundler/ordered_gems.rb +9 -1
- data/lib/rubocop/cop/correctors/lambda_literal_to_method_corrector.rb +7 -4
- data/lib/rubocop/cop/exclude_limit.rb +1 -1
- data/lib/rubocop/cop/gemspec/deprecated_attribute_assignment.rb +2 -2
- data/lib/rubocop/cop/gemspec/ordered_dependencies.rb +9 -1
- data/lib/rubocop/cop/generator/require_file_injector.rb +1 -1
- data/lib/rubocop/cop/internal_affairs/example_description.rb +42 -21
- data/lib/rubocop/cop/internal_affairs/location_line_equality_comparison.rb +3 -1
- data/lib/rubocop/cop/internal_affairs/method_name_equal.rb +19 -20
- data/lib/rubocop/cop/internal_affairs/node_first_or_last_argument.rb +53 -0
- data/lib/rubocop/cop/internal_affairs/node_matcher_directive.rb +2 -2
- data/lib/rubocop/cop/internal_affairs/redundant_method_dispatch_node.rb +11 -2
- data/lib/rubocop/cop/internal_affairs/useless_message_assertion.rb +2 -0
- data/lib/rubocop/cop/internal_affairs.rb +1 -0
- data/lib/rubocop/cop/layout/argument_alignment.rb +1 -1
- data/lib/rubocop/cop/layout/dot_position.rb +1 -5
- data/lib/rubocop/cop/layout/empty_line_after_guard_clause.rb +42 -9
- data/lib/rubocop/cop/layout/empty_line_between_defs.rb +26 -3
- data/lib/rubocop/cop/layout/end_alignment.rb +12 -2
- data/lib/rubocop/cop/layout/extra_spacing.rb +4 -10
- data/lib/rubocop/cop/layout/first_array_element_indentation.rb +22 -7
- data/lib/rubocop/cop/layout/first_parameter_indentation.rb +1 -1
- data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +2 -2
- data/lib/rubocop/cop/layout/heredoc_indentation.rb +4 -1
- data/lib/rubocop/cop/layout/indentation_width.rb +1 -1
- data/lib/rubocop/cop/layout/leading_comment_space.rb +1 -1
- data/lib/rubocop/cop/layout/line_continuation_leading_space.rb +17 -9
- data/lib/rubocop/cop/layout/line_continuation_spacing.rb +1 -1
- data/lib/rubocop/cop/layout/line_end_string_concatenation_indentation.rb +2 -0
- data/lib/rubocop/cop/layout/multiline_method_call_indentation.rb +18 -3
- data/lib/rubocop/cop/layout/redundant_line_break.rb +15 -4
- data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +4 -4
- data/lib/rubocop/cop/layout/single_line_block_chain.rb +5 -0
- data/lib/rubocop/cop/layout/space_after_comma.rb +9 -1
- data/lib/rubocop/cop/layout/space_after_not.rb +1 -1
- data/lib/rubocop/cop/layout/space_around_method_call_operator.rb +2 -2
- data/lib/rubocop/cop/layout/space_around_operators.rb +53 -21
- data/lib/rubocop/cop/layout/space_inside_parens.rb +1 -1
- data/lib/rubocop/cop/layout/trailing_empty_lines.rb +5 -0
- data/lib/rubocop/cop/lint/assignment_in_condition.rb +4 -4
- data/lib/rubocop/cop/lint/binary_operator_with_identical_operands.rb +2 -2
- data/lib/rubocop/cop/lint/constant_overwritten_in_rescue.rb +1 -1
- data/lib/rubocop/cop/lint/debugger.rb +18 -4
- data/lib/rubocop/cop/lint/duplicate_methods.rb +1 -1
- data/lib/rubocop/cop/lint/empty_block.rb +1 -1
- data/lib/rubocop/cop/lint/erb_new_arguments.rb +3 -3
- data/lib/rubocop/cop/lint/float_comparison.rb +10 -0
- data/lib/rubocop/cop/lint/hash_compare_by_identity.rb +2 -1
- data/lib/rubocop/cop/lint/it_without_arguments_in_block.rb +56 -0
- data/lib/rubocop/cop/lint/literal_assignment_in_condition.rb +85 -0
- data/lib/rubocop/cop/lint/literal_in_interpolation.rb +1 -1
- data/lib/rubocop/cop/lint/mixed_case_range.rb +3 -1
- data/lib/rubocop/cop/lint/next_without_accumulator.rb +6 -21
- data/lib/rubocop/cop/lint/non_atomic_file_operation.rb +10 -7
- data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +3 -5
- data/lib/rubocop/cop/lint/number_conversion.rb +9 -4
- data/lib/rubocop/cop/lint/redundant_regexp_quantifiers.rb +10 -0
- data/lib/rubocop/cop/lint/redundant_require_statement.rb +4 -0
- data/lib/rubocop/cop/lint/redundant_safe_navigation.rb +63 -4
- data/lib/rubocop/cop/lint/redundant_with_index.rb +2 -2
- data/lib/rubocop/cop/lint/redundant_with_object.rb +2 -2
- data/lib/rubocop/cop/lint/safe_navigation_chain.rb +14 -8
- data/lib/rubocop/cop/lint/self_assignment.rb +38 -0
- data/lib/rubocop/cop/lint/shadowed_argument.rb +1 -0
- data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +7 -1
- data/lib/rubocop/cop/lint/struct_new_override.rb +12 -12
- data/lib/rubocop/cop/lint/suppressed_exception.rb +1 -1
- data/lib/rubocop/cop/lint/symbol_conversion.rb +8 -3
- data/lib/rubocop/cop/lint/syntax.rb +6 -3
- data/lib/rubocop/cop/lint/to_enum_arguments.rb +5 -3
- data/lib/rubocop/cop/lint/trailing_comma_in_attribute_declaration.rb +1 -1
- data/lib/rubocop/cop/lint/unmodified_reduce_accumulator.rb +2 -2
- data/lib/rubocop/cop/lint/useless_access_modifier.rb +2 -2
- data/lib/rubocop/cop/lint/useless_assignment.rb +38 -12
- data/lib/rubocop/cop/lint/useless_times.rb +1 -1
- data/lib/rubocop/cop/lint/void.rb +46 -21
- data/lib/rubocop/cop/metrics/abc_size.rb +3 -3
- data/lib/rubocop/cop/metrics/block_length.rb +1 -1
- data/lib/rubocop/cop/metrics/class_length.rb +8 -3
- data/lib/rubocop/cop/metrics/method_length.rb +1 -1
- data/lib/rubocop/cop/metrics/utils/code_length_calculator.rb +32 -4
- data/lib/rubocop/cop/mixin/check_line_breakable.rb +1 -1
- data/lib/rubocop/cop/mixin/comments_help.rb +16 -12
- data/lib/rubocop/cop/mixin/configurable_formatting.rb +1 -0
- data/lib/rubocop/cop/mixin/def_node.rb +1 -1
- data/lib/rubocop/cop/mixin/hash_shorthand_syntax.rb +14 -11
- data/lib/rubocop/cop/mixin/heredoc.rb +6 -2
- data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +3 -2
- data/lib/rubocop/cop/mixin/preceding_following_alignment.rb +6 -8
- data/lib/rubocop/cop/mixin/space_before_punctuation.rb +1 -1
- data/lib/rubocop/cop/mixin/string_help.rb +4 -2
- data/lib/rubocop/cop/mixin/trailing_comma.rb +1 -1
- data/lib/rubocop/cop/naming/block_forwarding.rb +12 -4
- data/lib/rubocop/cop/naming/constant_name.rb +1 -2
- data/lib/rubocop/cop/naming/file_name.rb +1 -1
- data/lib/rubocop/cop/naming/heredoc_delimiter_naming.rb +3 -1
- data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +1 -1
- data/lib/rubocop/cop/registry.rb +4 -4
- data/lib/rubocop/cop/security/open.rb +2 -2
- data/lib/rubocop/cop/style/access_modifier_declarations.rb +2 -2
- data/lib/rubocop/cop/style/accessor_grouping.rb +1 -1
- data/lib/rubocop/cop/style/alias.rb +9 -8
- data/lib/rubocop/cop/style/arguments_forwarding.rb +355 -63
- data/lib/rubocop/cop/style/array_first_last.rb +64 -0
- data/lib/rubocop/cop/style/array_intersect.rb +13 -5
- data/lib/rubocop/cop/style/auto_resource_cleanup.rb +21 -14
- data/lib/rubocop/cop/style/bisected_attr_accessor.rb +2 -2
- data/lib/rubocop/cop/style/block_delimiters.rb +2 -1
- data/lib/rubocop/cop/style/case_like_if.rb +4 -4
- data/lib/rubocop/cop/style/class_check.rb +1 -0
- data/lib/rubocop/cop/style/class_equality_comparison.rb +7 -0
- data/lib/rubocop/cop/style/collection_compact.rb +7 -6
- data/lib/rubocop/cop/style/collection_methods.rb +2 -0
- data/lib/rubocop/cop/style/combinable_loops.rb +17 -9
- data/lib/rubocop/cop/style/concat_array_literals.rb +2 -1
- data/lib/rubocop/cop/style/conditional_assignment.rb +2 -2
- data/lib/rubocop/cop/style/date_time.rb +5 -4
- data/lib/rubocop/cop/style/each_for_simple_loop.rb +7 -7
- data/lib/rubocop/cop/style/each_with_object.rb +2 -2
- data/lib/rubocop/cop/style/empty_case_condition.rb +6 -1
- data/lib/rubocop/cop/style/empty_literal.rb +1 -1
- data/lib/rubocop/cop/style/eval_with_location.rb +3 -14
- data/lib/rubocop/cop/style/exact_regexp_match.rb +2 -1
- data/lib/rubocop/cop/style/explicit_block_argument.rb +2 -2
- data/lib/rubocop/cop/style/for.rb +1 -1
- data/lib/rubocop/cop/style/format_string.rb +24 -3
- data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +3 -1
- data/lib/rubocop/cop/style/guard_clause.rb +26 -0
- data/lib/rubocop/cop/style/hash_conversion.rb +10 -0
- data/lib/rubocop/cop/style/hash_each_methods.rb +83 -10
- data/lib/rubocop/cop/style/hash_except.rb +2 -1
- data/lib/rubocop/cop/style/identical_conditional_branches.rb +28 -3
- data/lib/rubocop/cop/style/if_with_semicolon.rb +2 -2
- data/lib/rubocop/cop/style/inverse_methods.rb +6 -5
- data/lib/rubocop/cop/style/invertible_unless_condition.rb +39 -2
- data/lib/rubocop/cop/style/lambda.rb +3 -3
- data/lib/rubocop/cop/style/lambda_call.rb +5 -0
- data/lib/rubocop/cop/style/map_compact_with_conditional_block.rb +3 -2
- data/lib/rubocop/cop/style/map_to_hash.rb +17 -7
- data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +22 -6
- data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +2 -4
- data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +20 -0
- data/lib/rubocop/cop/style/method_def_parentheses.rb +1 -1
- data/lib/rubocop/cop/style/missing_respond_to_missing.rb +2 -2
- data/lib/rubocop/cop/style/mixin_grouping.rb +1 -1
- data/lib/rubocop/cop/style/multiline_block_chain.rb +1 -1
- data/lib/rubocop/cop/style/multiline_ternary_operator.rb +2 -4
- data/lib/rubocop/cop/style/nested_ternary_operator.rb +3 -11
- data/lib/rubocop/cop/style/next.rb +1 -1
- data/lib/rubocop/cop/style/numeric_literal_prefix.rb +1 -1
- data/lib/rubocop/cop/style/open_struct_use.rb +1 -1
- data/lib/rubocop/cop/style/operator_method_call.rb +8 -2
- data/lib/rubocop/cop/style/parallel_assignment.rb +2 -2
- data/lib/rubocop/cop/style/parentheses_around_condition.rb +8 -0
- data/lib/rubocop/cop/style/redundant_argument.rb +9 -3
- data/lib/rubocop/cop/style/redundant_begin.rb +9 -1
- data/lib/rubocop/cop/style/redundant_conditional.rb +1 -9
- data/lib/rubocop/cop/style/redundant_current_directory_in_path.rb +1 -1
- data/lib/rubocop/cop/style/redundant_double_splat_hash_braces.rb +93 -5
- data/lib/rubocop/cop/style/redundant_each.rb +7 -4
- data/lib/rubocop/cop/style/redundant_exception.rb +32 -12
- data/lib/rubocop/cop/style/redundant_fetch_block.rb +3 -3
- data/lib/rubocop/cop/style/redundant_filter_chain.rb +22 -5
- data/lib/rubocop/cop/style/redundant_line_continuation.rb +10 -1
- data/lib/rubocop/cop/style/redundant_parentheses.rb +63 -21
- data/lib/rubocop/cop/style/redundant_regexp_argument.rb +18 -4
- data/lib/rubocop/cop/style/redundant_return.rb +8 -3
- data/lib/rubocop/cop/style/redundant_self.rb +17 -2
- data/lib/rubocop/cop/style/redundant_self_assignment_branch.rb +5 -0
- data/lib/rubocop/cop/style/redundant_sort.rb +9 -8
- data/lib/rubocop/cop/style/redundant_sort_by.rb +2 -2
- data/lib/rubocop/cop/style/redundant_string_escape.rb +1 -1
- data/lib/rubocop/cop/style/return_nil.rb +6 -2
- data/lib/rubocop/cop/style/return_nil_in_predicate_method_definition.rb +23 -9
- data/lib/rubocop/cop/style/sample.rb +2 -1
- data/lib/rubocop/cop/style/select_by_regexp.rb +7 -6
- data/lib/rubocop/cop/style/self_assignment.rb +1 -1
- data/lib/rubocop/cop/style/semicolon.rb +8 -3
- data/lib/rubocop/cop/style/single_argument_dig.rb +7 -3
- data/lib/rubocop/cop/style/single_line_do_end_block.rb +67 -0
- data/lib/rubocop/cop/style/slicing_with_range.rb +76 -10
- data/lib/rubocop/cop/style/sole_nested_conditional.rb +3 -1
- data/lib/rubocop/cop/style/string_chars.rb +1 -0
- data/lib/rubocop/cop/style/string_literals_in_interpolation.rb +30 -5
- data/lib/rubocop/cop/style/strip.rb +7 -4
- data/lib/rubocop/cop/style/super_with_args_parentheses.rb +35 -0
- data/lib/rubocop/cop/style/symbol_array.rb +35 -15
- data/lib/rubocop/cop/style/symbol_proc.rb +36 -0
- data/lib/rubocop/cop/style/unpack_first.rb +11 -14
- data/lib/rubocop/cop/style/yoda_condition.rb +4 -2
- data/lib/rubocop/cop/style/yoda_expression.rb +8 -7
- data/lib/rubocop/cop/utils/regexp_ranges.rb +26 -13
- data/lib/rubocop/cop/variable_force/assignment.rb +14 -5
- data/lib/rubocop/cops_documentation_generator.rb +11 -1
- data/lib/rubocop/ext/regexp_node.rb +9 -4
- data/lib/rubocop/file_finder.rb +4 -7
- data/lib/rubocop/formatter/disabled_config_formatter.rb +17 -6
- data/lib/rubocop/formatter/html_formatter.rb +5 -4
- data/lib/rubocop/formatter/json_formatter.rb +0 -1
- data/lib/rubocop/formatter/junit_formatter.rb +1 -1
- data/lib/rubocop/formatter.rb +1 -1
- data/lib/rubocop/lsp/routes.rb +42 -19
- data/lib/rubocop/lsp/runtime.rb +22 -2
- data/lib/rubocop/lsp/server.rb +10 -4
- data/lib/rubocop/magic_comment.rb +12 -10
- data/lib/rubocop/options.rb +0 -8
- data/lib/rubocop/result_cache.rb +4 -1
- data/lib/rubocop/rspec/shared_contexts.rb +8 -3
- data/lib/rubocop/rspec/support.rb +1 -0
- data/lib/rubocop/runner.rb +6 -4
- data/lib/rubocop/server/client_command/exec.rb +1 -1
- data/lib/rubocop/string_interpreter.rb +3 -3
- data/lib/rubocop/target_finder.rb +7 -3
- data/lib/rubocop/target_ruby.rb +9 -5
- data/lib/rubocop/version.rb +1 -1
- data/lib/rubocop.rb +6 -0
- metadata +20 -13
- /data/lib/rubocop/formatter/{git_hub_actions_formatter.rb → github_actions_formatter.rb} +0 -0
data/lib/rubocop/file_finder.rb
CHANGED
|
@@ -6,12 +6,8 @@ module RuboCop
|
|
|
6
6
|
# Common methods for finding files.
|
|
7
7
|
# @api private
|
|
8
8
|
module FileFinder
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
end
|
|
12
|
-
|
|
13
|
-
def self.root_level?(path, stop_dir)
|
|
14
|
-
(@root_level || stop_dir) == path.to_s
|
|
9
|
+
class << self
|
|
10
|
+
attr_accessor :root_level
|
|
15
11
|
end
|
|
16
12
|
|
|
17
13
|
def find_file_upwards(filename, start_dir, stop_dir = nil)
|
|
@@ -34,7 +30,8 @@ module RuboCop
|
|
|
34
30
|
file = dir + filename
|
|
35
31
|
yield(file.to_s) if file.exist?
|
|
36
32
|
|
|
37
|
-
|
|
33
|
+
dir = dir.to_s
|
|
34
|
+
break if dir == stop_dir || dir == FileFinder.root_level
|
|
38
35
|
end
|
|
39
36
|
end
|
|
40
37
|
end
|
|
@@ -30,7 +30,8 @@ module RuboCop
|
|
|
30
30
|
@files_with_offenses ||= {}
|
|
31
31
|
end
|
|
32
32
|
|
|
33
|
-
def file_started(_file,
|
|
33
|
+
def file_started(_file, options)
|
|
34
|
+
@config_for_pwd = options[:config_store].for_pwd
|
|
34
35
|
@exclude_limit_option = @options[:exclude_limit]
|
|
35
36
|
@exclude_limit = Integer(@exclude_limit_option ||
|
|
36
37
|
RuboCop::Options::DEFAULT_MAXIMUM_EXCLUSION_ITEMS)
|
|
@@ -115,9 +116,13 @@ module RuboCop
|
|
|
115
116
|
def set_max(cfg, cop_name)
|
|
116
117
|
return unless cfg[:exclude_limit]
|
|
117
118
|
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
if
|
|
119
|
+
max_set_in_user_config =
|
|
120
|
+
@config_for_pwd.for_cop(cop_name)['Max'] != default_config(cop_name)['Max']
|
|
121
|
+
if !max_set_in_user_config &&
|
|
122
|
+
# In case auto_gen_only_exclude is set, only modify the maximum if the files are not
|
|
123
|
+
# excluded one by one.
|
|
124
|
+
(!@options[:auto_gen_only_exclude] ||
|
|
125
|
+
@files_with_offenses[cop_name].size > @exclude_limit)
|
|
121
126
|
cfg.merge!(cfg[:exclude_limit])
|
|
122
127
|
end
|
|
123
128
|
|
|
@@ -192,8 +197,8 @@ module RuboCop
|
|
|
192
197
|
# 'Enabled' option will be put into file only if exclude
|
|
193
198
|
# limit is exceeded.
|
|
194
199
|
rejected_keys = ['Enabled']
|
|
195
|
-
rejected_keys <<
|
|
196
|
-
cfg.reject { |key|
|
|
200
|
+
rejected_keys << /\AEnforcedStyle\w*/ unless auto_gen_enforced_style?
|
|
201
|
+
cfg.reject { |key| include_or_match?(rejected_keys, key) }
|
|
197
202
|
end
|
|
198
203
|
|
|
199
204
|
def output_offending_files(output_buffer, cfg, cop_name)
|
|
@@ -262,6 +267,12 @@ module RuboCop
|
|
|
262
267
|
def no_exclude_limit?
|
|
263
268
|
@options[:no_exclude_limit] == false
|
|
264
269
|
end
|
|
270
|
+
|
|
271
|
+
# Returns true if the given arr include the given elm or if any of the
|
|
272
|
+
# given arr is a regexp that matches the given elm.
|
|
273
|
+
def include_or_match?(arr, elm)
|
|
274
|
+
arr.include?(elm) || arr.any? { |x| x.is_a?(Regexp) && x.match?(elm) }
|
|
275
|
+
end
|
|
265
276
|
end
|
|
266
277
|
end
|
|
267
278
|
end
|
|
@@ -1,9 +1,7 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
-
require 'base64'
|
|
4
3
|
require 'cgi'
|
|
5
4
|
require 'erb'
|
|
6
|
-
require 'ostruct'
|
|
7
5
|
|
|
8
6
|
module RuboCop
|
|
9
7
|
module Formatter
|
|
@@ -88,7 +86,7 @@ module RuboCop
|
|
|
88
86
|
# rubocop:enable Lint/UselessMethodDefinition
|
|
89
87
|
|
|
90
88
|
def decorated_message(offense)
|
|
91
|
-
offense.message.gsub(/`(.+?)`/) { "<code>#{Regexp.last_match(1)}</code>" }
|
|
89
|
+
offense.message.gsub(/`(.+?)`/) { "<code>#{escape(Regexp.last_match(1))}</code>" }
|
|
92
90
|
end
|
|
93
91
|
|
|
94
92
|
def highlighted_source_line(offense)
|
|
@@ -124,7 +122,10 @@ module RuboCop
|
|
|
124
122
|
|
|
125
123
|
def base64_encoded_logo_image
|
|
126
124
|
image = File.read(LOGO_IMAGE_PATH, binmode: true)
|
|
127
|
-
|
|
125
|
+
|
|
126
|
+
# `Base64.encode64` compatible:
|
|
127
|
+
# https://github.com/ruby/base64/blob/v0.1.1/lib/base64.rb#L27-L40
|
|
128
|
+
[image].pack('m')
|
|
128
129
|
end
|
|
129
130
|
end
|
|
130
131
|
end
|
|
@@ -63,7 +63,7 @@ module RuboCop
|
|
|
63
63
|
|
|
64
64
|
def classname_attribute_value(file)
|
|
65
65
|
@classname_attribute_value_cache ||= Hash.new do |hash, key|
|
|
66
|
-
hash[key] = key.
|
|
66
|
+
hash[key] = key.delete_suffix('.rb').gsub("#{Dir.pwd}/", '').tr('/', '.')
|
|
67
67
|
end
|
|
68
68
|
@classname_attribute_value_cache[file]
|
|
69
69
|
end
|
data/lib/rubocop/formatter.rb
CHANGED
|
@@ -14,7 +14,7 @@ module RuboCop
|
|
|
14
14
|
require_relative 'formatter/emacs_style_formatter'
|
|
15
15
|
require_relative 'formatter/file_list_formatter'
|
|
16
16
|
require_relative 'formatter/fuubar_style_formatter'
|
|
17
|
-
require_relative 'formatter/
|
|
17
|
+
require_relative 'formatter/github_actions_formatter'
|
|
18
18
|
require_relative 'formatter/html_formatter'
|
|
19
19
|
require_relative 'formatter/json_formatter'
|
|
20
20
|
require_relative 'formatter/junit_formatter'
|
data/lib/rubocop/lsp/routes.rb
CHANGED
|
@@ -17,7 +17,7 @@ module RuboCop
|
|
|
17
17
|
# @api private
|
|
18
18
|
class Routes
|
|
19
19
|
def self.handle(name, &block)
|
|
20
|
-
define_method("handle_#{name}", &block)
|
|
20
|
+
define_method(:"handle_#{name}", &block)
|
|
21
21
|
end
|
|
22
22
|
|
|
23
23
|
private_class_method :handle
|
|
@@ -36,12 +36,19 @@ module RuboCop
|
|
|
36
36
|
end
|
|
37
37
|
|
|
38
38
|
handle 'initialize' do |request|
|
|
39
|
+
initialization_options = extract_initialization_options_from(request)
|
|
40
|
+
|
|
41
|
+
@server.configure(initialization_options)
|
|
42
|
+
|
|
39
43
|
@server.write(
|
|
40
44
|
id: request[:id],
|
|
41
45
|
result: LanguageServer::Protocol::Interface::InitializeResult.new(
|
|
42
46
|
capabilities: LanguageServer::Protocol::Interface::ServerCapabilities.new(
|
|
43
47
|
document_formatting_provider: true,
|
|
44
|
-
diagnostic_provider:
|
|
48
|
+
diagnostic_provider: LanguageServer::Protocol::Interface::DiagnosticOptions.new(
|
|
49
|
+
inter_file_dependencies: false,
|
|
50
|
+
workspace_diagnostics: false
|
|
51
|
+
),
|
|
45
52
|
text_document_sync: LanguageServer::Protocol::Interface::TextDocumentSyncOptions.new(
|
|
46
53
|
change: LanguageServer::Protocol::Constant::TextDocumentSyncKind::FULL,
|
|
47
54
|
open_close: true
|
|
@@ -108,23 +115,29 @@ module RuboCop
|
|
|
108
115
|
end
|
|
109
116
|
|
|
110
117
|
handle 'workspace/executeCommand' do |request|
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
params: {
|
|
117
|
-
label: 'Format with RuboCop autocorrects',
|
|
118
|
-
edit: {
|
|
119
|
-
changes: {
|
|
120
|
-
uri => format_file(uri)
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
)
|
|
118
|
+
case (command = request[:params][:command])
|
|
119
|
+
when 'rubocop.formatAutocorrects'
|
|
120
|
+
label = 'Format with RuboCop autocorrects'
|
|
121
|
+
when 'rubocop.formatAutocorrectsAll'
|
|
122
|
+
label = 'Format all with RuboCop autocorrects'
|
|
125
123
|
else
|
|
126
|
-
handle_unsupported_method(request,
|
|
124
|
+
handle_unsupported_method(request, command)
|
|
125
|
+
return
|
|
127
126
|
end
|
|
127
|
+
|
|
128
|
+
uri = request[:params][:arguments][0][:uri]
|
|
129
|
+
@server.write(
|
|
130
|
+
id: request[:id],
|
|
131
|
+
method: 'workspace/applyEdit',
|
|
132
|
+
params: {
|
|
133
|
+
label: label,
|
|
134
|
+
edit: {
|
|
135
|
+
changes: {
|
|
136
|
+
uri => format_file(uri, command: command)
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
)
|
|
128
141
|
end
|
|
129
142
|
|
|
130
143
|
handle 'textDocument/willSave' do |_request|
|
|
@@ -162,14 +175,24 @@ module RuboCop
|
|
|
162
175
|
|
|
163
176
|
private
|
|
164
177
|
|
|
165
|
-
def
|
|
178
|
+
def extract_initialization_options_from(request)
|
|
179
|
+
safe_autocorrect = request.dig(:params, :initializationOptions, :safeAutocorrect)
|
|
180
|
+
|
|
181
|
+
{
|
|
182
|
+
safe_autocorrect: safe_autocorrect.nil? || safe_autocorrect == true,
|
|
183
|
+
lint_mode: request.dig(:params, :initializationOptions, :lintMode) == true,
|
|
184
|
+
layout_mode: request.dig(:params, :initializationOptions, :layoutMode) == true
|
|
185
|
+
}
|
|
186
|
+
end
|
|
187
|
+
|
|
188
|
+
def format_file(file_uri, command: nil)
|
|
166
189
|
unless (text = @text_cache[file_uri])
|
|
167
190
|
Logger.log("Format request arrived before text synchronized; skipping: `#{file_uri}'")
|
|
168
191
|
|
|
169
192
|
return []
|
|
170
193
|
end
|
|
171
194
|
|
|
172
|
-
new_text = @server.format(remove_file_protocol_from(file_uri), text)
|
|
195
|
+
new_text = @server.format(remove_file_protocol_from(file_uri), text, command: command)
|
|
173
196
|
|
|
174
197
|
return [] if new_text == text
|
|
175
198
|
|
data/lib/rubocop/lsp/runtime.rb
CHANGED
|
@@ -14,9 +14,14 @@ module RuboCop
|
|
|
14
14
|
# Runtime for Language Server Protocol of RuboCop.
|
|
15
15
|
# @api private
|
|
16
16
|
class Runtime
|
|
17
|
+
attr_writer :safe_autocorrect, :lint_mode, :layout_mode
|
|
18
|
+
|
|
17
19
|
def initialize(config_store)
|
|
18
20
|
@config_store = config_store
|
|
19
21
|
@logged_paths = []
|
|
22
|
+
@safe_autocorrect = true
|
|
23
|
+
@lint_mode = false
|
|
24
|
+
@layout_mode = false
|
|
20
25
|
end
|
|
21
26
|
|
|
22
27
|
# This abuses the `--stdin` option of rubocop and reads the formatted text
|
|
@@ -30,10 +35,17 @@ module RuboCop
|
|
|
30
35
|
# https://github.com/rubocop/rubocop/blob/v1.52.0/lib/rubocop/cli/command/execute_runner.rb#L95
|
|
31
36
|
# Setting `parallel: true` would break this here:
|
|
32
37
|
# https://github.com/rubocop/rubocop/blob/v1.52.0/lib/rubocop/runner.rb#L72
|
|
33
|
-
def format(path, text)
|
|
38
|
+
def format(path, text, command:)
|
|
39
|
+
safe_autocorrect = if command
|
|
40
|
+
command == 'rubocop.formatAutocorrects'
|
|
41
|
+
else
|
|
42
|
+
@safe_autocorrect
|
|
43
|
+
end
|
|
44
|
+
|
|
34
45
|
formatting_options = {
|
|
35
|
-
stdin: text, force_exclusion: true, autocorrect: true, safe_autocorrect:
|
|
46
|
+
stdin: text, force_exclusion: true, autocorrect: true, safe_autocorrect: safe_autocorrect
|
|
36
47
|
}
|
|
48
|
+
formatting_options[:only] = config_only_options if @lint_mode || @layout_mode
|
|
37
49
|
|
|
38
50
|
redirect_stdout { run_rubocop(formatting_options, path) }
|
|
39
51
|
|
|
@@ -44,6 +56,7 @@ module RuboCop
|
|
|
44
56
|
diagnostic_options = {
|
|
45
57
|
stdin: text, force_exclusion: true, formatters: ['json'], format: 'json'
|
|
46
58
|
}
|
|
59
|
+
diagnostic_options[:only] = config_only_options if @lint_mode || @layout_mode
|
|
47
60
|
|
|
48
61
|
json = redirect_stdout { run_rubocop(diagnostic_options, path) }
|
|
49
62
|
results = JSON.parse(json, symbolize_names: true)
|
|
@@ -61,6 +74,13 @@ module RuboCop
|
|
|
61
74
|
|
|
62
75
|
private
|
|
63
76
|
|
|
77
|
+
def config_only_options
|
|
78
|
+
only_options = []
|
|
79
|
+
only_options << 'Lint' if @lint_mode
|
|
80
|
+
only_options << 'Layout' if @layout_mode
|
|
81
|
+
only_options
|
|
82
|
+
end
|
|
83
|
+
|
|
64
84
|
def redirect_stdout(&block)
|
|
65
85
|
stdout = StringIO.new
|
|
66
86
|
|
data/lib/rubocop/lsp/server.rb
CHANGED
|
@@ -36,8 +36,8 @@ module RuboCop
|
|
|
36
36
|
@routes.handle_unsupported_method(request)
|
|
37
37
|
end
|
|
38
38
|
rescue StandardError => e
|
|
39
|
-
log("Error #{e.class} #{e.message[0..100]}")
|
|
40
|
-
log(e.backtrace.inspect)
|
|
39
|
+
Logger.log("Error #{e.class} #{e.message[0..100]}")
|
|
40
|
+
Logger.log(e.backtrace.inspect)
|
|
41
41
|
end
|
|
42
42
|
end
|
|
43
43
|
|
|
@@ -45,14 +45,20 @@ module RuboCop
|
|
|
45
45
|
@writer.write(response)
|
|
46
46
|
end
|
|
47
47
|
|
|
48
|
-
def format(path, text)
|
|
49
|
-
@runtime.format(path, text)
|
|
48
|
+
def format(path, text, command:)
|
|
49
|
+
@runtime.format(path, text, command: command)
|
|
50
50
|
end
|
|
51
51
|
|
|
52
52
|
def offenses(path, text)
|
|
53
53
|
@runtime.offenses(path, text)
|
|
54
54
|
end
|
|
55
55
|
|
|
56
|
+
def configure(options)
|
|
57
|
+
@runtime.safe_autocorrect = options[:safe_autocorrect]
|
|
58
|
+
@runtime.lint_mode = options[:lint_mode]
|
|
59
|
+
@runtime.layout_mode = options[:layout_mode]
|
|
60
|
+
end
|
|
61
|
+
|
|
56
62
|
def stop(&block)
|
|
57
63
|
at_exit(&block) if block
|
|
58
64
|
exit
|
|
@@ -7,7 +7,7 @@ module RuboCop
|
|
|
7
7
|
class MagicComment
|
|
8
8
|
# IRB's pattern for matching magic comment tokens.
|
|
9
9
|
# @see https://github.com/ruby/ruby/blob/b4a55c1/lib/irb/magic-file.rb#L5
|
|
10
|
-
TOKEN =
|
|
10
|
+
TOKEN = '(?<token>[[:alnum:]\-_]+)'
|
|
11
11
|
KEYWORDS = {
|
|
12
12
|
encoding: '(?:en)?coding',
|
|
13
13
|
frozen_string_literal: 'frozen[_-]string[_-]literal',
|
|
@@ -129,7 +129,7 @@ module RuboCop
|
|
|
129
129
|
# @return [String] if pattern matched
|
|
130
130
|
# @return [nil] otherwise
|
|
131
131
|
def extract(pattern)
|
|
132
|
-
@comment[pattern,
|
|
132
|
+
@comment[pattern, :token]
|
|
133
133
|
end
|
|
134
134
|
|
|
135
135
|
# Parent to Vim and Emacs magic comment handling.
|
|
@@ -157,10 +157,10 @@ module RuboCop
|
|
|
157
157
|
# @return [String] extracted value if it is found
|
|
158
158
|
# @return [nil] otherwise
|
|
159
159
|
def match(keyword)
|
|
160
|
-
pattern = /\A#{keyword}\s*#{self.class::OPERATOR}\s
|
|
160
|
+
pattern = /\A#{keyword}\s*#{self.class::OPERATOR}\s*#{TOKEN}\z/
|
|
161
161
|
|
|
162
162
|
tokens.each do |token|
|
|
163
|
-
next unless (value = token[pattern,
|
|
163
|
+
next unless (value = token[pattern, :token])
|
|
164
164
|
|
|
165
165
|
return value.downcase
|
|
166
166
|
end
|
|
@@ -188,7 +188,7 @@ module RuboCop
|
|
|
188
188
|
# @see https://www.gnu.org/software/emacs/manual/html_node/emacs/Specify-Coding.html
|
|
189
189
|
# @see https://github.com/ruby/ruby/blob/3f306dc/parse.y#L6873-L6892 Emacs handling in parse.y
|
|
190
190
|
class EmacsComment < EditorComment
|
|
191
|
-
REGEXP = /-\*-(
|
|
191
|
+
REGEXP = /-\*-(?<token>.+)-\*-/.freeze
|
|
192
192
|
FORMAT = '# -*- %s -*-'
|
|
193
193
|
SEPARATOR = ';'
|
|
194
194
|
OPERATOR = ':'
|
|
@@ -216,7 +216,7 @@ module RuboCop
|
|
|
216
216
|
#
|
|
217
217
|
# comment.encoding # => 'ascii-8bit'
|
|
218
218
|
class VimComment < EditorComment
|
|
219
|
-
REGEXP = /#\s*vim:\s*(
|
|
219
|
+
REGEXP = /#\s*vim:\s*(?<token>.+)/.freeze
|
|
220
220
|
FORMAT = '# vim: %s'
|
|
221
221
|
SEPARATOR = ', '
|
|
222
222
|
OPERATOR = '='
|
|
@@ -259,9 +259,11 @@ module RuboCop
|
|
|
259
259
|
# comment2.frozen_string_literal # => nil
|
|
260
260
|
# comment2.encoding # => 'utf-8'
|
|
261
261
|
class SimpleComment < MagicComment
|
|
262
|
+
FSTRING_LITERAL_COMMENT = 'frozen_string_literal:\s*(true|false)'
|
|
263
|
+
|
|
262
264
|
# Match `encoding` or `coding`
|
|
263
265
|
def encoding
|
|
264
|
-
extract(/\A\s
|
|
266
|
+
extract(/\A\s*\#\s*(#{FSTRING_LITERAL_COMMENT})?\s*#{KEYWORDS[:encoding]}: (#{TOKEN})/io)
|
|
265
267
|
end
|
|
266
268
|
|
|
267
269
|
# Rewrite the comment without a given token type
|
|
@@ -283,15 +285,15 @@ module RuboCop
|
|
|
283
285
|
# Case-insensitive and dashes/underscores are acceptable.
|
|
284
286
|
# @see https://github.com/ruby/ruby/blob/78b95b4/parse.y#L7134-L7138
|
|
285
287
|
def extract_frozen_string_literal
|
|
286
|
-
extract(/\A\s*#\s*#{KEYWORDS[:frozen_string_literal]}:\s
|
|
288
|
+
extract(/\A\s*#\s*#{KEYWORDS[:frozen_string_literal]}:\s*#{TOKEN}\s*\z/io)
|
|
287
289
|
end
|
|
288
290
|
|
|
289
291
|
def extract_shareable_constant_value
|
|
290
|
-
extract(/\A\s*#\s*#{KEYWORDS[:shareable_constant_value]}:\s
|
|
292
|
+
extract(/\A\s*#\s*#{KEYWORDS[:shareable_constant_value]}:\s*#{TOKEN}\s*\z/io)
|
|
291
293
|
end
|
|
292
294
|
|
|
293
295
|
def extract_typed
|
|
294
|
-
extract(/\A\s*#\s*#{KEYWORDS[:typed]}:\s
|
|
296
|
+
extract(/\A\s*#\s*#{KEYWORDS[:typed]}:\s*#{TOKEN}\s*\z/io)
|
|
295
297
|
end
|
|
296
298
|
end
|
|
297
299
|
end
|
data/lib/rubocop/options.rb
CHANGED
|
@@ -364,10 +364,6 @@ module RuboCop
|
|
|
364
364
|
raise OptionArgumentError, '-C/--cache argument must be true or false'
|
|
365
365
|
end
|
|
366
366
|
|
|
367
|
-
if display_only_fail_level_offenses_with_autocorrect?
|
|
368
|
-
raise OptionArgumentError, '--autocorrect cannot be used with ' \
|
|
369
|
-
'--display-only-fail-level-offenses.'
|
|
370
|
-
end
|
|
371
367
|
validate_auto_gen_config
|
|
372
368
|
validate_autocorrect
|
|
373
369
|
validate_display_only_failed
|
|
@@ -460,10 +456,6 @@ module RuboCop
|
|
|
460
456
|
(@options[:only] & %w[Lint/RedundantCopDisableDirective RedundantCopDisableDirective]).any?
|
|
461
457
|
end
|
|
462
458
|
|
|
463
|
-
def display_only_fail_level_offenses_with_autocorrect?
|
|
464
|
-
@options.key?(:display_only_fail_level_offenses) && @options.key?(:autocorrect)
|
|
465
|
-
end
|
|
466
|
-
|
|
467
459
|
def except_syntax?
|
|
468
460
|
@options.key?(:except) && (@options[:except] & %w[Lint/Syntax Syntax]).any?
|
|
469
461
|
end
|
data/lib/rubocop/result_cache.rb
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
3
|
require 'digest/sha1'
|
|
4
|
-
require 'etc'
|
|
5
4
|
require 'find'
|
|
6
5
|
require 'zlib'
|
|
7
6
|
require_relative 'cache_config'
|
|
@@ -202,6 +201,10 @@ module RuboCop
|
|
|
202
201
|
lib_root = File.join(File.dirname(__FILE__), '..')
|
|
203
202
|
exe_root = File.join(lib_root, '..', 'exe')
|
|
204
203
|
|
|
204
|
+
# Make sure to use an absolute path to prevent errors on Windows
|
|
205
|
+
# when traversing the relative paths with symlinks.
|
|
206
|
+
exe_root = File.absolute_path(exe_root)
|
|
207
|
+
|
|
205
208
|
# These are all the files we have `require`d plus everything in the
|
|
206
209
|
# exe directory. A change to any of them could affect the cop output
|
|
207
210
|
# so we include them in the cache hash.
|
|
@@ -11,6 +11,8 @@ RSpec.shared_context 'isolated environment' do # rubocop:disable Metrics/BlockLe
|
|
|
11
11
|
# Make sure to expand all symlinks in the path first. Otherwise we may
|
|
12
12
|
# get mismatched pathnames when loading config files later on.
|
|
13
13
|
tmpdir = File.realpath(tmpdir)
|
|
14
|
+
# Make upwards search for .rubocop.yml files stop at this directory.
|
|
15
|
+
RuboCop::FileFinder.root_level = tmpdir
|
|
14
16
|
|
|
15
17
|
virtual_home = File.expand_path(File.join(tmpdir, 'home'))
|
|
16
18
|
Dir.mkdir(virtual_home)
|
|
@@ -21,9 +23,6 @@ RSpec.shared_context 'isolated environment' do # rubocop:disable Metrics/BlockLe
|
|
|
21
23
|
root = example.metadata[:root]
|
|
22
24
|
working_dir = root ? File.join(base_dir, 'work', root) : File.join(base_dir, 'work')
|
|
23
25
|
|
|
24
|
-
# Make upwards search for .rubocop.yml files stop at this directory.
|
|
25
|
-
RuboCop::FileFinder.root_level = working_dir
|
|
26
|
-
|
|
27
26
|
begin
|
|
28
27
|
FileUtils.mkdir_p(working_dir)
|
|
29
28
|
|
|
@@ -129,6 +128,12 @@ RSpec.shared_context 'mock console output' do
|
|
|
129
128
|
end
|
|
130
129
|
end
|
|
131
130
|
|
|
131
|
+
RSpec.shared_context 'lsp mode' do
|
|
132
|
+
before do
|
|
133
|
+
allow(cop).to receive(:lsp_mode?).and_return(true)
|
|
134
|
+
end
|
|
135
|
+
end
|
|
136
|
+
|
|
132
137
|
RSpec.shared_context 'ruby 2.0' do
|
|
133
138
|
let(:ruby_version) { 2.0 }
|
|
134
139
|
end
|
|
@@ -13,6 +13,7 @@ RSpec.configure do |config|
|
|
|
13
13
|
config.include HostEnvironmentSimulatorHelper
|
|
14
14
|
config.include_context 'config', :config
|
|
15
15
|
config.include_context 'isolated environment', :isolated_environment
|
|
16
|
+
config.include_context 'lsp mode', :lsp_mode
|
|
16
17
|
config.include_context 'maintain registry', :restore_registry
|
|
17
18
|
config.include_context 'ruby 2.0', :ruby20
|
|
18
19
|
config.include_context 'ruby 2.1', :ruby21
|
data/lib/rubocop/runner.rb
CHANGED
|
@@ -20,7 +20,7 @@ module RuboCop
|
|
|
20
20
|
message = 'Infinite loop detected'
|
|
21
21
|
message += " in #{path}" if path
|
|
22
22
|
message += " and caused by #{root_cause}" if root_cause
|
|
23
|
-
super
|
|
23
|
+
super(message)
|
|
24
24
|
end
|
|
25
25
|
end
|
|
26
26
|
|
|
@@ -421,10 +421,10 @@ module RuboCop
|
|
|
421
421
|
end
|
|
422
422
|
|
|
423
423
|
def considered_failure?(offense)
|
|
424
|
-
# For :autocorrect level, any offense - corrected or not - is a failure.
|
|
425
424
|
return false if offense.disabled?
|
|
426
425
|
|
|
427
|
-
|
|
426
|
+
# For :autocorrect level, any correctable offense is a failure, regardless of severity
|
|
427
|
+
return true if @options[:fail_level] == :autocorrect && offense.correctable?
|
|
428
428
|
|
|
429
429
|
!offense.corrected? && offense.severity >= minimum_severity_to_fail
|
|
430
430
|
end
|
|
@@ -461,7 +461,9 @@ module RuboCop
|
|
|
461
461
|
@minimum_severity_to_fail ||= begin
|
|
462
462
|
# Unless given explicitly as `fail_level`, `:info` severity offenses do not fail
|
|
463
463
|
name = @options[:fail_level] || :refactor
|
|
464
|
-
|
|
464
|
+
|
|
465
|
+
# autocorrect is a fake level - use the default
|
|
466
|
+
RuboCop::Cop::Severity.new(name == :autocorrect ? :refactor : name)
|
|
465
467
|
end
|
|
466
468
|
end
|
|
467
469
|
|
|
@@ -32,7 +32,7 @@ module RuboCop
|
|
|
32
32
|
|
|
33
33
|
def ensure_server!
|
|
34
34
|
if incompatible_version?
|
|
35
|
-
|
|
35
|
+
warn 'RuboCop version incompatibility found, RuboCop server restarting...'
|
|
36
36
|
ClientCommand::Stop.new.run
|
|
37
37
|
elsif check_running_server
|
|
38
38
|
return
|
|
@@ -32,9 +32,9 @@ module RuboCop
|
|
|
32
32
|
|
|
33
33
|
def interpret_string_escape(escape)
|
|
34
34
|
case escape[1]
|
|
35
|
-
when 'u'
|
|
36
|
-
when 'x'
|
|
37
|
-
when /\d/
|
|
35
|
+
when 'u' then interpret_unicode(escape)
|
|
36
|
+
when 'x' then interpret_hex(escape)
|
|
37
|
+
when /\d/ then interpret_octal(escape)
|
|
38
38
|
else
|
|
39
39
|
escape[1] # literal escaped char, like \\
|
|
40
40
|
end
|
|
@@ -94,8 +94,12 @@ module RuboCop
|
|
|
94
94
|
end
|
|
95
95
|
|
|
96
96
|
def wanted_dir_patterns(base_dir, exclude_pattern, flags)
|
|
97
|
-
base_dir
|
|
98
|
-
|
|
97
|
+
# Escape glob characters in base_dir to avoid unwanted behavior.
|
|
98
|
+
base_dir = base_dir.gsub(/[\\\{\}\[\]\*\?]/) do |reserved_glob_character|
|
|
99
|
+
"\\#{reserved_glob_character}"
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
dirs = Dir.glob(File.join(base_dir, '*/'), flags)
|
|
99
103
|
.reject do |dir|
|
|
100
104
|
next true if dir.end_with?('/./', '/../')
|
|
101
105
|
next true if File.fnmatch?(exclude_pattern, dir, flags)
|
|
@@ -114,7 +118,7 @@ module RuboCop
|
|
|
114
118
|
end
|
|
115
119
|
|
|
116
120
|
def combined_exclude_glob_patterns(base_dir)
|
|
117
|
-
exclude = @config_store.for(base_dir).for_all_cops['Exclude']
|
|
121
|
+
exclude = @config_store.for(base_dir).for_all_cops['Exclude'] || []
|
|
118
122
|
patterns = exclude.select { |pattern| pattern.is_a?(String) && pattern.end_with?('/**/*') }
|
|
119
123
|
.map { |pattern| pattern.sub("#{base_dir}/", '') }
|
|
120
124
|
"#{base_dir}/{#{patterns.join(',')}}"
|
data/lib/rubocop/target_ruby.rb
CHANGED
|
@@ -155,9 +155,11 @@ module RuboCop
|
|
|
155
155
|
(send _ :required_ruby_version= $_)
|
|
156
156
|
PATTERN
|
|
157
157
|
|
|
158
|
-
# @!method
|
|
159
|
-
def_node_matcher :
|
|
160
|
-
(send (const(const _ :Gem):Requirement) :new
|
|
158
|
+
# @!method gem_requirement_versions(node)
|
|
159
|
+
def_node_matcher :gem_requirement_versions, <<~PATTERN
|
|
160
|
+
(send (const(const _ :Gem):Requirement) :new
|
|
161
|
+
{$str+ | (send $str :freeze)+ | (array $str+) | (array (send $str :freeze)+)}
|
|
162
|
+
)
|
|
161
163
|
PATTERN
|
|
162
164
|
|
|
163
165
|
def name
|
|
@@ -194,10 +196,12 @@ module RuboCop
|
|
|
194
196
|
end
|
|
195
197
|
|
|
196
198
|
def version_from_right_hand_side(right_hand_side)
|
|
199
|
+
gem_requirement_versions = gem_requirement_versions(right_hand_side)
|
|
200
|
+
|
|
197
201
|
if right_hand_side.array_type?
|
|
198
202
|
version_from_array(right_hand_side)
|
|
199
|
-
elsif
|
|
200
|
-
|
|
203
|
+
elsif gem_requirement_versions
|
|
204
|
+
gem_requirement_versions.map(&:value)
|
|
201
205
|
else
|
|
202
206
|
right_hand_side.value
|
|
203
207
|
end
|
data/lib/rubocop/version.rb
CHANGED
data/lib/rubocop.rb
CHANGED
|
@@ -162,6 +162,7 @@ require_relative 'rubocop/cop/correctors/string_literal_corrector'
|
|
|
162
162
|
require_relative 'rubocop/cop/correctors/unused_arg_corrector'
|
|
163
163
|
|
|
164
164
|
require_relative 'rubocop/cop/bundler/duplicated_gem'
|
|
165
|
+
require_relative 'rubocop/cop/bundler/duplicated_group'
|
|
165
166
|
require_relative 'rubocop/cop/bundler/gem_comment'
|
|
166
167
|
require_relative 'rubocop/cop/bundler/gem_filename'
|
|
167
168
|
require_relative 'rubocop/cop/bundler/gem_version'
|
|
@@ -331,8 +332,10 @@ require_relative 'rubocop/cop/lint/incompatible_io_select_with_fiber_scheduler'
|
|
|
331
332
|
require_relative 'rubocop/cop/lint/ineffective_access_modifier'
|
|
332
333
|
require_relative 'rubocop/cop/lint/inherit_exception'
|
|
333
334
|
require_relative 'rubocop/cop/lint/interpolation_check'
|
|
335
|
+
require_relative 'rubocop/cop/lint/it_without_arguments_in_block'
|
|
334
336
|
require_relative 'rubocop/cop/lint/lambda_without_literal_block'
|
|
335
337
|
require_relative 'rubocop/cop/lint/literal_as_condition'
|
|
338
|
+
require_relative 'rubocop/cop/lint/literal_assignment_in_condition'
|
|
336
339
|
require_relative 'rubocop/cop/lint/literal_in_interpolation'
|
|
337
340
|
require_relative 'rubocop/cop/lint/loop'
|
|
338
341
|
require_relative 'rubocop/cop/lint/missing_cop_enable_directive'
|
|
@@ -453,6 +456,7 @@ require_relative 'rubocop/cop/style/alias'
|
|
|
453
456
|
require_relative 'rubocop/cop/style/and_or'
|
|
454
457
|
require_relative 'rubocop/cop/style/arguments_forwarding'
|
|
455
458
|
require_relative 'rubocop/cop/style/array_coercion'
|
|
459
|
+
require_relative 'rubocop/cop/style/array_first_last'
|
|
456
460
|
require_relative 'rubocop/cop/style/array_intersect'
|
|
457
461
|
require_relative 'rubocop/cop/style/array_join'
|
|
458
462
|
require_relative 'rubocop/cop/style/ascii_comments'
|
|
@@ -579,6 +583,7 @@ require_relative 'rubocop/cop/style/redundant_regexp_constructor'
|
|
|
579
583
|
require_relative 'rubocop/cop/style/redundant_self_assignment'
|
|
580
584
|
require_relative 'rubocop/cop/style/redundant_self_assignment_branch'
|
|
581
585
|
require_relative 'rubocop/cop/style/require_order'
|
|
586
|
+
require_relative 'rubocop/cop/style/single_line_do_end_block'
|
|
582
587
|
require_relative 'rubocop/cop/style/sole_nested_conditional'
|
|
583
588
|
require_relative 'rubocop/cop/style/static_class'
|
|
584
589
|
require_relative 'rubocop/cop/style/map_compact_with_conditional_block'
|
|
@@ -676,6 +681,7 @@ require_relative 'rubocop/cop/style/string_literals_in_interpolation'
|
|
|
676
681
|
require_relative 'rubocop/cop/style/string_methods'
|
|
677
682
|
require_relative 'rubocop/cop/style/strip'
|
|
678
683
|
require_relative 'rubocop/cop/style/struct_inheritance'
|
|
684
|
+
require_relative 'rubocop/cop/style/super_with_args_parentheses'
|
|
679
685
|
require_relative 'rubocop/cop/style/swap_values'
|
|
680
686
|
require_relative 'rubocop/cop/style/symbol_array'
|
|
681
687
|
require_relative 'rubocop/cop/style/symbol_literal'
|