rubocop 1.57.1 → 1.65.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 +4 -5
- data/assets/output.css.erb +159 -0
- data/assets/output.html.erb +1 -160
- data/config/default.yml +136 -19
- data/lib/rubocop/cached_data.rb +11 -3
- data/lib/rubocop/cli/command/auto_generate_config.rb +22 -8
- data/lib/rubocop/cli/command/lsp.rb +2 -2
- data/lib/rubocop/cli/command/show_docs_url.rb +2 -2
- data/lib/rubocop/cli.rb +10 -1
- data/lib/rubocop/config.rb +36 -12
- data/lib/rubocop/config_finder.rb +12 -2
- data/lib/rubocop/config_loader.rb +1 -2
- data/lib/rubocop/config_loader_resolver.rb +9 -3
- data/lib/rubocop/config_obsoletion.rb +11 -8
- data/lib/rubocop/config_validator.rb +14 -7
- data/lib/rubocop/cop/autocorrect_logic.rb +6 -1
- data/lib/rubocop/cop/base.rb +63 -16
- data/lib/rubocop/cop/bundler/gem_comment.rb +2 -2
- data/lib/rubocop/cop/bundler/gem_version.rb +3 -5
- data/lib/rubocop/cop/cop.rb +20 -2
- data/lib/rubocop/cop/correctors/each_to_for_corrector.rb +4 -8
- data/lib/rubocop/cop/correctors/for_to_each_corrector.rb +5 -13
- data/lib/rubocop/cop/documentation.rb +16 -6
- data/lib/rubocop/cop/exclude_limit.rb +1 -1
- data/lib/rubocop/cop/force.rb +12 -0
- data/lib/rubocop/cop/gemspec/add_runtime_dependency.rb +38 -0
- data/lib/rubocop/cop/gemspec/dependency_version.rb +3 -5
- data/lib/rubocop/cop/gemspec/deprecated_attribute_assignment.rb +2 -2
- data/lib/rubocop/cop/gemspec/duplicated_assignment.rb +2 -2
- data/lib/rubocop/cop/gemspec/required_ruby_version.rb +5 -1
- data/lib/rubocop/cop/gemspec/ruby_version_globals_usage.rb +3 -3
- data/lib/rubocop/cop/internal_affairs/example_description.rb +6 -5
- data/lib/rubocop/cop/internal_affairs/method_name_end_with.rb +8 -6
- 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 +123 -29
- data/lib/rubocop/cop/internal_affairs/redundant_expect_offense_arguments.rb +34 -0
- data/lib/rubocop/cop/internal_affairs.rb +2 -0
- data/lib/rubocop/cop/layout/argument_alignment.rb +1 -1
- data/lib/rubocop/cop/layout/case_indentation.rb +1 -1
- data/lib/rubocop/cop/layout/comment_indentation.rb +1 -1
- data/lib/rubocop/cop/layout/empty_comment.rb +3 -1
- data/lib/rubocop/cop/layout/empty_line_after_magic_comment.rb +14 -7
- data/lib/rubocop/cop/layout/empty_line_after_multiline_condition.rb +1 -1
- data/lib/rubocop/cop/layout/end_alignment.rb +15 -3
- data/lib/rubocop/cop/layout/extra_spacing.rb +4 -10
- data/lib/rubocop/cop/layout/first_argument_indentation.rb +2 -2
- data/lib/rubocop/cop/layout/first_array_element_indentation.rb +24 -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 +2 -2
- data/lib/rubocop/cop/layout/indentation_width.rb +1 -1
- data/lib/rubocop/cop/layout/line_continuation_leading_space.rb +1 -1
- data/lib/rubocop/cop/layout/line_length.rb +20 -20
- data/lib/rubocop/cop/layout/redundant_line_break.rb +16 -3
- 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_around_operators.rb +53 -20
- data/lib/rubocop/cop/layout/space_before_block_braces.rb +19 -10
- data/lib/rubocop/cop/layout/space_inside_hash_literal_braces.rb +1 -1
- data/lib/rubocop/cop/layout/space_inside_string_interpolation.rb +3 -4
- data/lib/rubocop/cop/legacy/corrector.rb +12 -2
- data/lib/rubocop/cop/lint/assignment_in_condition.rb +6 -6
- 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 +29 -3
- data/lib/rubocop/cop/lint/deprecated_class_methods.rb +1 -1
- data/lib/rubocop/cop/lint/duplicate_case_condition.rb +1 -1
- data/lib/rubocop/cop/lint/duplicate_methods.rb +1 -1
- data/lib/rubocop/cop/lint/empty_conditional_body.rb +2 -2
- data/lib/rubocop/cop/lint/empty_when.rb +1 -1
- data/lib/rubocop/cop/lint/erb_new_arguments.rb +24 -17
- 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/implicit_string_concatenation.rb +14 -7
- data/lib/rubocop/cop/lint/it_without_arguments_in_block.rb +56 -0
- data/lib/rubocop/cop/lint/literal_as_condition.rb +1 -1
- data/lib/rubocop/cop/lint/literal_assignment_in_condition.rb +85 -0
- data/lib/rubocop/cop/lint/mixed_case_range.rb +9 -4
- data/lib/rubocop/cop/lint/nested_method_definition.rb +1 -1
- data/lib/rubocop/cop/lint/next_without_accumulator.rb +6 -21
- 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_safe_navigation.rb +54 -6
- data/lib/rubocop/cop/lint/redundant_with_index.rb +6 -2
- data/lib/rubocop/cop/lint/redundant_with_object.rb +2 -2
- data/lib/rubocop/cop/lint/rescue_type.rb +1 -3
- data/lib/rubocop/cop/lint/safe_navigation_chain.rb +3 -4
- data/lib/rubocop/cop/lint/script_permission.rb +3 -3
- 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/symbol_conversion.rb +7 -2
- data/lib/rubocop/cop/lint/syntax.rb +6 -3
- data/lib/rubocop/cop/lint/to_enum_arguments.rb +1 -3
- data/lib/rubocop/cop/lint/trailing_comma_in_attribute_declaration.rb +1 -1
- data/lib/rubocop/cop/lint/unmodified_reduce_accumulator.rb +3 -2
- data/lib/rubocop/cop/lint/unreachable_code.rb +4 -2
- data/lib/rubocop/cop/lint/unreachable_loop.rb +8 -2
- data/lib/rubocop/cop/lint/useless_access_modifier.rb +2 -2
- data/lib/rubocop/cop/lint/useless_times.rb +2 -2
- data/lib/rubocop/cop/lint/void.rb +53 -12
- data/lib/rubocop/cop/metrics/abc_size.rb +3 -3
- data/lib/rubocop/cop/metrics/block_nesting.rb +19 -7
- data/lib/rubocop/cop/metrics/class_length.rb +6 -1
- data/lib/rubocop/cop/metrics/utils/code_length_calculator.rb +5 -5
- data/lib/rubocop/cop/mixin/alignment.rb +5 -1
- data/lib/rubocop/cop/mixin/allowed_methods.rb +7 -1
- data/lib/rubocop/cop/mixin/allowed_pattern.rb +15 -3
- data/lib/rubocop/cop/mixin/check_line_breakable.rb +1 -1
- data/lib/rubocop/cop/mixin/code_length.rb +12 -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/configurable_max.rb +5 -1
- data/lib/rubocop/cop/mixin/hash_shorthand_syntax.rb +23 -13
- data/lib/rubocop/cop/mixin/method_complexity.rb +15 -6
- data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +1 -1
- data/lib/rubocop/cop/mixin/preceding_following_alignment.rb +1 -1
- data/lib/rubocop/cop/mixin/rescue_node.rb +4 -0
- data/lib/rubocop/cop/mixin/safe_assignment.rb +1 -1
- data/lib/rubocop/cop/mixin/space_before_punctuation.rb +1 -1
- data/lib/rubocop/cop/naming/block_forwarding.rb +34 -7
- data/lib/rubocop/cop/naming/constant_name.rb +1 -2
- data/lib/rubocop/cop/naming/file_name.rb +2 -2
- data/lib/rubocop/cop/naming/inclusive_language.rb +1 -2
- data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +1 -1
- data/lib/rubocop/cop/naming/predicate_name.rb +2 -2
- data/lib/rubocop/cop/registry.rb +1 -1
- data/lib/rubocop/cop/security/compound_hash.rb +2 -2
- data/lib/rubocop/cop/security/open.rb +2 -2
- data/lib/rubocop/cop/style/access_modifier_declarations.rb +52 -2
- data/lib/rubocop/cop/style/accessor_grouping.rb +1 -1
- data/lib/rubocop/cop/style/alias.rb +1 -0
- data/lib/rubocop/cop/style/arguments_forwarding.rb +155 -21
- data/lib/rubocop/cop/style/array_first_last.rb +64 -0
- 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/case_like_if.rb +5 -5
- data/lib/rubocop/cop/style/class_check.rb +1 -0
- data/lib/rubocop/cop/style/class_vars.rb +3 -3
- data/lib/rubocop/cop/style/collection_compact.rb +21 -11
- data/lib/rubocop/cop/style/combinable_loops.rb +13 -7
- data/lib/rubocop/cop/style/commented_keyword.rb +5 -2
- data/lib/rubocop/cop/style/concat_array_literals.rb +1 -0
- data/lib/rubocop/cop/style/conditional_assignment.rb +7 -8
- data/lib/rubocop/cop/style/copyright.rb +31 -21
- data/lib/rubocop/cop/style/date_time.rb +5 -4
- data/lib/rubocop/cop/style/documentation.rb +24 -24
- data/lib/rubocop/cop/style/documentation_method.rb +20 -0
- 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_literal.rb +1 -1
- data/lib/rubocop/cop/style/eval_with_location.rb +6 -15
- data/lib/rubocop/cop/style/exact_regexp_match.rb +4 -2
- data/lib/rubocop/cop/style/explicit_block_argument.rb +2 -2
- data/lib/rubocop/cop/style/for.rb +2 -0
- data/lib/rubocop/cop/style/format_string.rb +9 -9
- data/lib/rubocop/cop/style/hash_each_methods.rb +105 -11
- data/lib/rubocop/cop/style/hash_except.rb +10 -6
- data/lib/rubocop/cop/style/hash_syntax.rb +24 -2
- data/lib/rubocop/cop/style/identical_conditional_branches.rb +12 -1
- data/lib/rubocop/cop/style/if_with_boolean_literal_branches.rb +5 -3
- data/lib/rubocop/cop/style/inverse_methods.rb +14 -13
- data/lib/rubocop/cop/style/invertible_unless_condition.rb +44 -2
- data/lib/rubocop/cop/style/map_compact_with_conditional_block.rb +82 -50
- data/lib/rubocop/cop/style/map_into_array.rb +175 -0
- data/lib/rubocop/cop/style/map_to_hash.rb +18 -8
- data/lib/rubocop/cop/style/map_to_set.rb +1 -1
- data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +19 -5
- 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/multiline_method_signature.rb +10 -1
- data/lib/rubocop/cop/style/multiline_ternary_operator.rb +5 -3
- data/lib/rubocop/cop/style/next.rb +1 -1
- data/lib/rubocop/cop/style/nil_comparison.rb +2 -0
- data/lib/rubocop/cop/style/numeric_literal_prefix.rb +1 -1
- data/lib/rubocop/cop/style/numeric_predicate.rb +10 -2
- data/lib/rubocop/cop/style/object_then.rb +5 -3
- data/lib/rubocop/cop/style/one_line_conditional.rb +1 -1
- data/lib/rubocop/cop/style/operator_method_call.rb +2 -2
- data/lib/rubocop/cop/style/parallel_assignment.rb +3 -5
- data/lib/rubocop/cop/style/parentheses_around_condition.rb +8 -0
- data/lib/rubocop/cop/style/quoted_symbols.rb +1 -1
- data/lib/rubocop/cop/style/raise_args.rb +4 -1
- data/lib/rubocop/cop/style/redundant_argument.rb +27 -3
- data/lib/rubocop/cop/style/redundant_assignment.rb +10 -2
- data/lib/rubocop/cop/style/redundant_begin.rb +1 -1
- data/lib/rubocop/cop/style/redundant_current_directory_in_path.rb +5 -4
- data/lib/rubocop/cop/style/redundant_double_splat_hash_braces.rb +17 -10
- data/lib/rubocop/cop/style/redundant_each.rb +7 -4
- data/lib/rubocop/cop/style/redundant_fetch_block.rb +3 -3
- data/lib/rubocop/cop/style/redundant_file_extension_in_require.rb +1 -1
- data/lib/rubocop/cop/style/redundant_filter_chain.rb +5 -4
- data/lib/rubocop/cop/style/redundant_line_continuation.rb +19 -2
- data/lib/rubocop/cop/style/redundant_parentheses.rb +50 -19
- data/lib/rubocop/cop/style/redundant_percent_q.rb +1 -1
- data/lib/rubocop/cop/style/redundant_return.rb +7 -1
- data/lib/rubocop/cop/style/redundant_self.rb +17 -2
- 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/require_order.rb +1 -1
- data/lib/rubocop/cop/style/sample.rb +3 -4
- 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 -0
- data/lib/rubocop/cop/style/send.rb +4 -4
- data/lib/rubocop/cop/style/send_with_literal_method_name.rb +104 -0
- data/lib/rubocop/cop/style/single_argument_dig.rb +7 -3
- data/lib/rubocop/cop/style/single_line_do_end_block.rb +3 -1
- data/lib/rubocop/cop/style/slicing_with_range.rb +76 -10
- data/lib/rubocop/cop/style/special_global_vars.rb +1 -2
- data/lib/rubocop/cop/style/string_chars.rb +1 -0
- data/lib/rubocop/cop/style/strip.rb +7 -4
- data/lib/rubocop/cop/style/super_arguments.rb +174 -0
- data/lib/rubocop/cop/style/super_with_args_parentheses.rb +35 -0
- data/lib/rubocop/cop/style/symbol_proc.rb +75 -5
- data/lib/rubocop/cop/style/top_level_method_definition.rb +1 -1
- data/lib/rubocop/cop/style/unpack_first.rb +11 -14
- data/lib/rubocop/cop/style/zero_length_predicate.rb +28 -24
- data/lib/rubocop/cop/team.rb +13 -0
- data/lib/rubocop/cop/util.rb +7 -1
- data/lib/rubocop/cop/utils/regexp_ranges.rb +1 -1
- data/lib/rubocop/cops_documentation_generator.rb +16 -4
- data/lib/rubocop/directive_comment.rb +10 -8
- data/lib/rubocop/ext/regexp_node.rb +9 -4
- data/lib/rubocop/ext/regexp_parser.rb +4 -21
- data/lib/rubocop/formatter/clang_style_formatter.rb +3 -7
- data/lib/rubocop/formatter/disabled_config_formatter.rb +23 -8
- data/lib/rubocop/formatter/formatter_set.rb +7 -1
- data/lib/rubocop/formatter/html_formatter.rb +37 -14
- data/lib/rubocop/formatter/json_formatter.rb +0 -1
- data/lib/rubocop/formatter/offense_count_formatter.rb +12 -2
- data/lib/rubocop/formatter/tap_formatter.rb +3 -7
- data/lib/rubocop/formatter.rb +1 -1
- data/lib/rubocop/lockfile.rb +56 -7
- data/lib/rubocop/lsp/logger.rb +1 -1
- data/lib/rubocop/lsp/routes.rb +12 -15
- data/lib/rubocop/lsp/runtime.rb +1 -1
- data/lib/rubocop/lsp/server.rb +7 -2
- data/lib/rubocop/lsp/severity.rb +1 -1
- data/lib/rubocop/lsp.rb +36 -0
- data/lib/rubocop/magic_comment.rb +1 -1
- data/lib/rubocop/options.rb +14 -11
- data/lib/rubocop/path_util.rb +6 -2
- data/lib/rubocop/rake_task.rb +1 -1
- data/lib/rubocop/result_cache.rb +0 -1
- data/lib/rubocop/rspec/cop_helper.rb +8 -2
- data/lib/rubocop/rspec/expect_offense.rb +16 -8
- data/lib/rubocop/rspec/shared_contexts.rb +73 -16
- data/lib/rubocop/rspec/support.rb +3 -0
- data/lib/rubocop/runner.rb +14 -3
- data/lib/rubocop/server/cache.rb +11 -2
- data/lib/rubocop/server/client_command/exec.rb +2 -3
- data/lib/rubocop/server/client_command/start.rb +1 -1
- data/lib/rubocop/server/core.rb +4 -0
- data/lib/rubocop/server/server_command/exec.rb +0 -1
- data/lib/rubocop/target_finder.rb +84 -78
- data/lib/rubocop/target_ruby.rb +82 -80
- data/lib/rubocop/version.rb +19 -4
- data/lib/rubocop.rb +8 -0
- metadata +27 -29
- /data/lib/rubocop/formatter/{git_hub_actions_formatter.rb → github_actions_formatter.rb} +0 -0
|
@@ -50,6 +50,26 @@ RSpec.shared_context 'isolated environment' do # rubocop:disable Metrics/BlockLe
|
|
|
50
50
|
end
|
|
51
51
|
end
|
|
52
52
|
|
|
53
|
+
# Workaround for https://github.com/rubocop/rubocop/issues/12978,
|
|
54
|
+
# there should already be no gemfile in the temp directory
|
|
55
|
+
RSpec.shared_context 'isolated bundler' do
|
|
56
|
+
around do |example|
|
|
57
|
+
# No bundler env and reset cached gemfile path
|
|
58
|
+
Bundler.with_unbundled_env do
|
|
59
|
+
old_values = Bundler.instance_variables.to_h do |name|
|
|
60
|
+
[name, Bundler.instance_variable_get(name)]
|
|
61
|
+
end
|
|
62
|
+
Bundler.instance_variables.each { |name| Bundler.remove_instance_variable(name) }
|
|
63
|
+
example.call
|
|
64
|
+
ensure
|
|
65
|
+
Bundler.instance_variables.each { |name| Bundler.remove_instance_variable(name) }
|
|
66
|
+
old_values.each do |name, value|
|
|
67
|
+
Bundler.instance_variable_set(name, value)
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
end
|
|
71
|
+
end
|
|
72
|
+
|
|
53
73
|
RSpec.shared_context 'maintain registry' do
|
|
54
74
|
around(:each) { |example| RuboCop::Cop::Registry.with_temporary_global { example.run } }
|
|
55
75
|
|
|
@@ -100,17 +120,29 @@ RSpec.shared_context 'config' do # rubocop:disable Metrics/BlockLength
|
|
|
100
120
|
let(:cur_cop_config) do
|
|
101
121
|
RuboCop::ConfigLoader
|
|
102
122
|
.default_configuration.for_cop(cop_class)
|
|
103
|
-
.merge(
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
123
|
+
.merge(
|
|
124
|
+
'Enabled' => true, # in case it is 'pending'
|
|
125
|
+
'AutoCorrect' => 'always' # in case defaults set it to 'disabled' or false
|
|
126
|
+
)
|
|
107
127
|
.merge(cop_config)
|
|
108
128
|
end
|
|
109
129
|
|
|
110
130
|
let(:config) do
|
|
111
131
|
hash = { 'AllCops' => all_cops_config, cop_class.cop_name => cur_cop_config }.merge!(other_cops)
|
|
112
132
|
|
|
113
|
-
RuboCop::Config.new(hash, "#{Dir.pwd}/.rubocop.yml")
|
|
133
|
+
config = RuboCop::Config.new(hash, "#{Dir.pwd}/.rubocop.yml")
|
|
134
|
+
|
|
135
|
+
rails_version_in_gemfile = Gem::Version.new(
|
|
136
|
+
rails_version || RuboCop::Config::DEFAULT_RAILS_VERSION
|
|
137
|
+
)
|
|
138
|
+
|
|
139
|
+
allow(config).to receive(:gem_versions_in_target).and_return(
|
|
140
|
+
{
|
|
141
|
+
'railties' => rails_version_in_gemfile
|
|
142
|
+
}
|
|
143
|
+
)
|
|
144
|
+
|
|
145
|
+
config
|
|
114
146
|
end
|
|
115
147
|
|
|
116
148
|
let(:cop) { cop_class.new(config, cop_options) }
|
|
@@ -128,50 +160,75 @@ RSpec.shared_context 'mock console output' do
|
|
|
128
160
|
end
|
|
129
161
|
end
|
|
130
162
|
|
|
163
|
+
RSpec.shared_context 'lsp' do
|
|
164
|
+
before do
|
|
165
|
+
RuboCop::LSP.enable
|
|
166
|
+
end
|
|
167
|
+
|
|
168
|
+
after do
|
|
169
|
+
RuboCop::LSP.disable
|
|
170
|
+
end
|
|
171
|
+
end
|
|
172
|
+
|
|
131
173
|
RSpec.shared_context 'ruby 2.0' do
|
|
132
|
-
|
|
174
|
+
# Prism supports parsing Ruby 3.3+.
|
|
175
|
+
let(:ruby_version) { ENV['PARSER_ENGINE'] == 'parser_prism' ? 3.3 : 2.0 }
|
|
133
176
|
end
|
|
134
177
|
|
|
135
178
|
RSpec.shared_context 'ruby 2.1' do
|
|
136
|
-
|
|
179
|
+
# Prism supports parsing Ruby 3.3+.
|
|
180
|
+
let(:ruby_version) { ENV['PARSER_ENGINE'] == 'parser_prism' ? 3.3 : 2.1 }
|
|
137
181
|
end
|
|
138
182
|
|
|
139
183
|
RSpec.shared_context 'ruby 2.2' do
|
|
140
|
-
|
|
184
|
+
# Prism supports parsing Ruby 3.3+.
|
|
185
|
+
let(:ruby_version) { ENV['PARSER_ENGINE'] == 'parser_prism' ? 3.3 : 2.2 }
|
|
141
186
|
end
|
|
142
187
|
|
|
143
188
|
RSpec.shared_context 'ruby 2.3' do
|
|
144
|
-
|
|
189
|
+
# Prism supports parsing Ruby 3.3+.
|
|
190
|
+
let(:ruby_version) { ENV['PARSER_ENGINE'] == 'parser_prism' ? 3.3 : 2.3 }
|
|
145
191
|
end
|
|
146
192
|
|
|
147
193
|
RSpec.shared_context 'ruby 2.4' do
|
|
148
|
-
|
|
194
|
+
# Prism supports parsing Ruby 3.3+.
|
|
195
|
+
let(:ruby_version) { ENV['PARSER_ENGINE'] == 'parser_prism' ? 3.3 : 2.4 }
|
|
149
196
|
end
|
|
150
197
|
|
|
151
198
|
RSpec.shared_context 'ruby 2.5' do
|
|
152
|
-
|
|
199
|
+
# Prism supports parsing Ruby 3.3+.
|
|
200
|
+
let(:ruby_version) { ENV['PARSER_ENGINE'] == 'parser_prism' ? 3.3 : 2.5 }
|
|
153
201
|
end
|
|
154
202
|
|
|
155
203
|
RSpec.shared_context 'ruby 2.6' do
|
|
156
|
-
|
|
204
|
+
# Prism supports parsing Ruby 3.3+.
|
|
205
|
+
let(:ruby_version) { ENV['PARSER_ENGINE'] == 'parser_prism' ? 3.3 : 2.6 }
|
|
157
206
|
end
|
|
158
207
|
|
|
159
208
|
RSpec.shared_context 'ruby 2.7' do
|
|
160
|
-
|
|
209
|
+
# Prism supports parsing Ruby 3.3+.
|
|
210
|
+
let(:ruby_version) { ENV['PARSER_ENGINE'] == 'parser_prism' ? 3.3 : 2.7 }
|
|
161
211
|
end
|
|
162
212
|
|
|
163
213
|
RSpec.shared_context 'ruby 3.0' do
|
|
164
|
-
|
|
214
|
+
# Prism supports parsing Ruby 3.3+.
|
|
215
|
+
let(:ruby_version) { ENV['PARSER_ENGINE'] == 'parser_prism' ? 3.3 : 3.0 }
|
|
165
216
|
end
|
|
166
217
|
|
|
167
218
|
RSpec.shared_context 'ruby 3.1' do
|
|
168
|
-
|
|
219
|
+
# Prism supports parsing Ruby 3.3+.
|
|
220
|
+
let(:ruby_version) { ENV['PARSER_ENGINE'] == 'parser_prism' ? 3.3 : 3.1 }
|
|
169
221
|
end
|
|
170
222
|
|
|
171
223
|
RSpec.shared_context 'ruby 3.2' do
|
|
172
|
-
|
|
224
|
+
# Prism supports parsing Ruby 3.3+.
|
|
225
|
+
let(:ruby_version) { ENV['PARSER_ENGINE'] == 'parser_prism' ? 3.3 : 3.2 }
|
|
173
226
|
end
|
|
174
227
|
|
|
175
228
|
RSpec.shared_context 'ruby 3.3' do
|
|
176
229
|
let(:ruby_version) { 3.3 }
|
|
177
230
|
end
|
|
231
|
+
|
|
232
|
+
RSpec.shared_context 'ruby 3.4' do
|
|
233
|
+
let(:ruby_version) { 3.4 }
|
|
234
|
+
end
|
|
@@ -13,6 +13,8 @@ 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 'isolated bundler', :isolated_bundler
|
|
17
|
+
config.include_context 'lsp', :lsp
|
|
16
18
|
config.include_context 'maintain registry', :restore_registry
|
|
17
19
|
config.include_context 'ruby 2.0', :ruby20
|
|
18
20
|
config.include_context 'ruby 2.1', :ruby21
|
|
@@ -26,4 +28,5 @@ RSpec.configure do |config|
|
|
|
26
28
|
config.include_context 'ruby 3.1', :ruby31
|
|
27
29
|
config.include_context 'ruby 3.2', :ruby32
|
|
28
30
|
config.include_context 'ruby 3.3', :ruby33
|
|
31
|
+
config.include_context 'ruby 3.4', :ruby34
|
|
29
32
|
end
|
data/lib/rubocop/runner.rb
CHANGED
|
@@ -20,7 +20,11 @@ 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
|
-
|
|
23
|
+
message += "\n"
|
|
24
|
+
hint = 'Hint: Please update to the latest RuboCop version if not already in use, ' \
|
|
25
|
+
"and report a bug if the issue still occurs on this version.\n" \
|
|
26
|
+
'Please check the latest version at https://rubygems.org/gems/rubocop.'
|
|
27
|
+
super(Rainbow(message).red + Rainbow(hint).yellow)
|
|
24
28
|
end
|
|
25
29
|
end
|
|
26
30
|
|
|
@@ -467,15 +471,21 @@ module RuboCop
|
|
|
467
471
|
end
|
|
468
472
|
end
|
|
469
473
|
|
|
474
|
+
# rubocop:disable Metrics/MethodLength
|
|
470
475
|
def get_processed_source(file)
|
|
471
476
|
config = @config_store.for_file(file)
|
|
472
477
|
ruby_version = config.target_ruby_version
|
|
478
|
+
parser_engine = config.parser_engine
|
|
473
479
|
|
|
474
480
|
processed_source = if @options[:stdin]
|
|
475
|
-
ProcessedSource.new(
|
|
481
|
+
ProcessedSource.new(
|
|
482
|
+
@options[:stdin], ruby_version, file, parser_engine: parser_engine
|
|
483
|
+
)
|
|
476
484
|
else
|
|
477
485
|
begin
|
|
478
|
-
ProcessedSource.from_file(
|
|
486
|
+
ProcessedSource.from_file(
|
|
487
|
+
file, ruby_version, parser_engine: parser_engine
|
|
488
|
+
)
|
|
479
489
|
rescue Errno::ENOENT
|
|
480
490
|
raise RuboCop::Error, "No such file or directory: #{file}"
|
|
481
491
|
end
|
|
@@ -484,6 +494,7 @@ module RuboCop
|
|
|
484
494
|
processed_source.registry = mobilized_cop_classes(config)
|
|
485
495
|
processed_source
|
|
486
496
|
end
|
|
497
|
+
# rubocop:enable Metrics/MethodLength
|
|
487
498
|
|
|
488
499
|
# A Cop::Team instance is stateful and may change when inspecting.
|
|
489
500
|
# The "standby" team for a given config is an initialized but
|
data/lib/rubocop/server/cache.rb
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
-
require '
|
|
3
|
+
require 'digest'
|
|
4
4
|
require 'pathname'
|
|
5
5
|
require_relative '../cache_config'
|
|
6
6
|
require_relative '../config_finder'
|
|
@@ -20,6 +20,7 @@ module RuboCop
|
|
|
20
20
|
# @api private
|
|
21
21
|
class Cache
|
|
22
22
|
GEMFILE_NAMES = %w[Gemfile gems.rb].freeze
|
|
23
|
+
LOCKFILE_NAMES = %w[Gemfile.lock gems.locked].freeze
|
|
23
24
|
|
|
24
25
|
class << self
|
|
25
26
|
attr_accessor :cache_root_path
|
|
@@ -42,6 +43,14 @@ module RuboCop
|
|
|
42
43
|
@project_dir_cache_key ||= project_dir[1..].tr('/', '+')
|
|
43
44
|
end
|
|
44
45
|
|
|
46
|
+
def restart_key
|
|
47
|
+
lockfile_path = LOCKFILE_NAMES.map do |lockfile_name|
|
|
48
|
+
Pathname(project_dir).join(lockfile_name)
|
|
49
|
+
end.find(&:exist?)
|
|
50
|
+
|
|
51
|
+
Digest::SHA1.hexdigest(lockfile_path&.read || RuboCop::Version::STRING)
|
|
52
|
+
end
|
|
53
|
+
|
|
45
54
|
def dir
|
|
46
55
|
Pathname.new(File.join(cache_path, project_dir_cache_key)).tap do |d|
|
|
47
56
|
d.mkpath unless d.exist?
|
|
@@ -117,7 +126,7 @@ module RuboCop
|
|
|
117
126
|
|
|
118
127
|
def pid_running?
|
|
119
128
|
Process.kill(0, pid_path.read.to_i) == 1
|
|
120
|
-
rescue Errno::ESRCH, Errno::ENOENT, Errno::EACCES
|
|
129
|
+
rescue Errno::ESRCH, Errno::ENOENT, Errno::EACCES, Errno::EROFS
|
|
121
130
|
false
|
|
122
131
|
end
|
|
123
132
|
|
|
@@ -17,7 +17,6 @@ module RuboCop
|
|
|
17
17
|
class Exec < Base
|
|
18
18
|
def run
|
|
19
19
|
ensure_server!
|
|
20
|
-
Cache.status_path.delete if Cache.status_path.file?
|
|
21
20
|
read_stdin = ARGV.include?('-s') || ARGV.include?('--stdin')
|
|
22
21
|
send_request(
|
|
23
22
|
command: 'exec',
|
|
@@ -42,7 +41,7 @@ module RuboCop
|
|
|
42
41
|
end
|
|
43
42
|
|
|
44
43
|
def incompatible_version?
|
|
45
|
-
Cache.version_path.read !=
|
|
44
|
+
Cache.version_path.read != Cache.restart_key
|
|
46
45
|
end
|
|
47
46
|
|
|
48
47
|
def stderr
|
|
@@ -55,7 +54,7 @@ module RuboCop
|
|
|
55
54
|
end
|
|
56
55
|
|
|
57
56
|
status = Cache.status_path.read
|
|
58
|
-
raise "RuboCop server: '#{status}' is not a valid status!"
|
|
57
|
+
raise "RuboCop server: '#{status}' is not a valid status!" unless /\A\d+\z/.match?(status)
|
|
59
58
|
|
|
60
59
|
status.to_i
|
|
61
60
|
end
|
data/lib/rubocop/server/core.rb
CHANGED
|
@@ -16,7 +16,6 @@ module RuboCop
|
|
|
16
16
|
# @api private
|
|
17
17
|
class Exec < Base
|
|
18
18
|
def run
|
|
19
|
-
Cache.status_path.delete if Cache.status_path.file?
|
|
20
19
|
# RuboCop output is colorized by default where there is a TTY.
|
|
21
20
|
# We must pass the --color option to preserve this behavior.
|
|
22
21
|
@args.unshift('--color') unless %w[--color --no-color].any? { |f| @args.include?(f) }
|
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
3
|
module RuboCop
|
|
4
|
-
# This class finds target files to inspect by scanning the directory tree
|
|
5
|
-
# and picking ruby files.
|
|
4
|
+
# This class finds target files to inspect by scanning the directory tree and picking ruby files.
|
|
6
5
|
# @api private
|
|
7
6
|
class TargetFinder
|
|
8
7
|
HIDDEN_PATH_SUBSTRING = "#{File::SEPARATOR}."
|
|
@@ -12,21 +11,8 @@ module RuboCop
|
|
|
12
11
|
@options = options
|
|
13
12
|
end
|
|
14
13
|
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
end
|
|
18
|
-
|
|
19
|
-
def debug?
|
|
20
|
-
@options[:debug]
|
|
21
|
-
end
|
|
22
|
-
|
|
23
|
-
def fail_fast?
|
|
24
|
-
@options[:fail_fast]
|
|
25
|
-
end
|
|
26
|
-
|
|
27
|
-
# Generate a list of target files by expanding globbing patterns
|
|
28
|
-
# (if any). If args is empty, recursively find all Ruby source
|
|
29
|
-
# files under the current directory
|
|
14
|
+
# Generate a list of target files by expanding globbing patterns (if any). If args is empty,
|
|
15
|
+
# recursively find all Ruby source files under the current directory
|
|
30
16
|
# @return [Array] array of file paths
|
|
31
17
|
def find(args, mode)
|
|
32
18
|
return target_files_in_dir if args.empty?
|
|
@@ -44,12 +30,11 @@ module RuboCop
|
|
|
44
30
|
files.map { |f| File.expand_path(f) }.uniq
|
|
45
31
|
end
|
|
46
32
|
|
|
47
|
-
# Finds all Ruby source files under the current or other supplied
|
|
48
|
-
#
|
|
49
|
-
#
|
|
50
|
-
#
|
|
51
|
-
#
|
|
52
|
-
# so you can include other Ruby files like Rakefiles and gemspecs.
|
|
33
|
+
# Finds all Ruby source files under the current or other supplied directory. A Ruby source file
|
|
34
|
+
# is defined as a file with the `.rb` extension or a file with no extension that has a ruby
|
|
35
|
+
# shebang line as its first line.
|
|
36
|
+
# It is possible to specify includes and excludes using the config file, so you can include
|
|
37
|
+
# other Ruby files like Rakefiles and gemspecs.
|
|
53
38
|
# @param base_dir Root directory under which to search for
|
|
54
39
|
# ruby source files
|
|
55
40
|
# @return [Array] Array of filenames
|
|
@@ -66,20 +51,10 @@ module RuboCop
|
|
|
66
51
|
target_files.sort_by!(&order)
|
|
67
52
|
end
|
|
68
53
|
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
end && ruby_file?(file)
|
|
74
|
-
|
|
75
|
-
base_dir_config.file_to_include?(file)
|
|
76
|
-
end
|
|
77
|
-
|
|
78
|
-
# Search for files recursively starting at the given base directory using
|
|
79
|
-
# the given flags that determine how the match is made. Excluded files will
|
|
80
|
-
# be removed later by the caller, but as an optimization find_files removes
|
|
81
|
-
# the top level directories that are excluded in configuration in the
|
|
82
|
-
# normal way (dir/**/*).
|
|
54
|
+
# Search for files recursively starting at the given base directory using the given flags that
|
|
55
|
+
# determine how the match is made. Excluded files will be removed later by the caller, but as an
|
|
56
|
+
# optimization find_files removes the top level directories that are excluded in configuration
|
|
57
|
+
# in the normal way (dir/**/*).
|
|
83
58
|
def find_files(base_dir, flags)
|
|
84
59
|
# get all wanted directories first to improve speed of finding all files
|
|
85
60
|
exclude_pattern = combined_exclude_glob_patterns(base_dir)
|
|
@@ -93,6 +68,17 @@ module RuboCop
|
|
|
93
68
|
Dir.glob(patterns, flags).select { |path| FileTest.file?(path) }
|
|
94
69
|
end
|
|
95
70
|
|
|
71
|
+
private
|
|
72
|
+
|
|
73
|
+
def to_inspect?(file, hidden_files, base_dir_config)
|
|
74
|
+
return false if base_dir_config.file_to_exclude?(file)
|
|
75
|
+
return true if !hidden_files.bsearch do |hidden_file|
|
|
76
|
+
file <=> hidden_file
|
|
77
|
+
end && ruby_file?(file)
|
|
78
|
+
|
|
79
|
+
base_dir_config.file_to_include?(file)
|
|
80
|
+
end
|
|
81
|
+
|
|
96
82
|
def wanted_dir_patterns(base_dir, exclude_pattern, flags)
|
|
97
83
|
# Escape glob characters in base_dir to avoid unwanted behavior.
|
|
98
84
|
base_dir = base_dir.gsub(/[\\\{\}\[\]\*\?]/) do |reserved_glob_character|
|
|
@@ -124,21 +110,6 @@ module RuboCop
|
|
|
124
110
|
"#{base_dir}/{#{patterns.join(',')}}"
|
|
125
111
|
end
|
|
126
112
|
|
|
127
|
-
def ruby_extension?(file)
|
|
128
|
-
ruby_extensions.include?(File.extname(file))
|
|
129
|
-
end
|
|
130
|
-
|
|
131
|
-
def ruby_extensions
|
|
132
|
-
@ruby_extensions ||= begin
|
|
133
|
-
ext_patterns = all_cops_include.select { |pattern| pattern.start_with?('**/*.') }
|
|
134
|
-
ext_patterns.map { |pattern| pattern.sub('**/*', '') }
|
|
135
|
-
end
|
|
136
|
-
end
|
|
137
|
-
|
|
138
|
-
def ruby_filename?(file)
|
|
139
|
-
ruby_filenames.include?(File.basename(file))
|
|
140
|
-
end
|
|
141
|
-
|
|
142
113
|
def ruby_filenames
|
|
143
114
|
@ruby_filenames ||= begin
|
|
144
115
|
file_patterns = all_cops_include.reject { |pattern| pattern.start_with?('**/*.') }
|
|
@@ -150,53 +121,72 @@ module RuboCop
|
|
|
150
121
|
@all_cops_include ||= @config_store.for_pwd.for_all_cops['Include'].map(&:to_s)
|
|
151
122
|
end
|
|
152
123
|
|
|
153
|
-
def
|
|
154
|
-
|
|
124
|
+
def process_explicit_path(path, mode)
|
|
125
|
+
files = path.include?('*') ? Dir[path] : [path]
|
|
155
126
|
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
warn("Unprocessable file #{file}: #{e.class}, #{e.message}") if debug?
|
|
127
|
+
if mode == :only_recognized_file_types || force_exclusion?
|
|
128
|
+
files.select! { |file| included_file?(file) }
|
|
129
|
+
end
|
|
160
130
|
|
|
161
|
-
|
|
131
|
+
force_exclusion? ? without_excluded(files) : files
|
|
162
132
|
end
|
|
163
133
|
|
|
164
|
-
def
|
|
165
|
-
|
|
134
|
+
def without_excluded(files)
|
|
135
|
+
files.reject do |file|
|
|
136
|
+
# When --ignore-parent-exclusion is given, we must look at the configuration associated with
|
|
137
|
+
# the file, but in the default case when --ignore-parent-exclusion is not given, can safely
|
|
138
|
+
# look only at the configuration for the current directory, since it's only the Exclude
|
|
139
|
+
# parameters we're going to check.
|
|
140
|
+
config = @config_store.for(ignore_parent_exclusion? ? file : '.')
|
|
141
|
+
config.file_to_exclude?(file)
|
|
142
|
+
end
|
|
166
143
|
end
|
|
167
144
|
|
|
168
|
-
def
|
|
169
|
-
|
|
145
|
+
def included_file?(file)
|
|
146
|
+
ruby_file?(file) || configured_include?(file)
|
|
170
147
|
end
|
|
171
148
|
|
|
172
149
|
def ruby_file?(file)
|
|
173
150
|
stdin? || ruby_extension?(file) || ruby_filename?(file) || ruby_executable?(file)
|
|
174
151
|
end
|
|
175
152
|
|
|
176
|
-
def
|
|
177
|
-
@
|
|
153
|
+
def stdin?
|
|
154
|
+
@options.key?(:stdin)
|
|
178
155
|
end
|
|
179
156
|
|
|
180
|
-
def
|
|
181
|
-
|
|
157
|
+
def ruby_extension?(file)
|
|
158
|
+
ruby_extensions.include?(File.extname(file))
|
|
182
159
|
end
|
|
183
160
|
|
|
184
|
-
def
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
files.select! { |file| included_file?(file) }
|
|
161
|
+
def ruby_extensions
|
|
162
|
+
@ruby_extensions ||= begin
|
|
163
|
+
ext_patterns = all_cops_include.select { |pattern| pattern.start_with?('**/*.') }
|
|
164
|
+
ext_patterns.map { |pattern| pattern.sub('**/*', '') }
|
|
189
165
|
end
|
|
166
|
+
end
|
|
190
167
|
|
|
191
|
-
|
|
168
|
+
def ruby_filename?(file)
|
|
169
|
+
ruby_filenames.include?(File.basename(file))
|
|
170
|
+
end
|
|
192
171
|
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
config.file_to_exclude?(file)
|
|
196
|
-
end
|
|
172
|
+
def configured_include?(file)
|
|
173
|
+
@config_store.for_pwd.file_to_include?(file)
|
|
197
174
|
end
|
|
198
175
|
|
|
199
|
-
|
|
176
|
+
def ruby_executable?(file)
|
|
177
|
+
return false unless File.extname(file).empty? && File.exist?(file)
|
|
178
|
+
|
|
179
|
+
first_line = File.open(file, &:readline)
|
|
180
|
+
/#!.*(#{ruby_interpreters(file).join('|')})/.match?(first_line)
|
|
181
|
+
rescue EOFError, ArgumentError => e
|
|
182
|
+
warn("Unprocessable file #{file}: #{e.class}, #{e.message}") if debug?
|
|
183
|
+
|
|
184
|
+
false
|
|
185
|
+
end
|
|
186
|
+
|
|
187
|
+
def ruby_interpreters(file)
|
|
188
|
+
@config_store.for(file).for_all_cops['RubyInterpreters']
|
|
189
|
+
end
|
|
200
190
|
|
|
201
191
|
def order
|
|
202
192
|
if fail_fast?
|
|
@@ -206,5 +196,21 @@ module RuboCop
|
|
|
206
196
|
:itself
|
|
207
197
|
end
|
|
208
198
|
end
|
|
199
|
+
|
|
200
|
+
def force_exclusion?
|
|
201
|
+
@options[:force_exclusion]
|
|
202
|
+
end
|
|
203
|
+
|
|
204
|
+
def ignore_parent_exclusion?
|
|
205
|
+
@options[:ignore_parent_exclusion]
|
|
206
|
+
end
|
|
207
|
+
|
|
208
|
+
def debug?
|
|
209
|
+
@options[:debug]
|
|
210
|
+
end
|
|
211
|
+
|
|
212
|
+
def fail_fast?
|
|
213
|
+
@options[:fail_fast]
|
|
214
|
+
end
|
|
209
215
|
end
|
|
210
216
|
end
|