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
|
@@ -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
|
|
@@ -11,6 +9,7 @@ module RuboCop
|
|
|
11
9
|
class HTMLFormatter < BaseFormatter
|
|
12
10
|
ELLIPSES = '<span class="extra-code">...</span>'
|
|
13
11
|
TEMPLATE_PATH = File.expand_path('../../../assets/output.html.erb', __dir__)
|
|
12
|
+
CSS_PATH = File.expand_path('../../../assets/output.css.erb', __dir__)
|
|
14
13
|
|
|
15
14
|
Color = Struct.new(:red, :green, :blue, :alpha) do
|
|
16
15
|
def to_s
|
|
@@ -52,8 +51,10 @@ module RuboCop
|
|
|
52
51
|
context = ERBContext.new(files, summary)
|
|
53
52
|
|
|
54
53
|
template = File.read(TEMPLATE_PATH, encoding: Encoding::UTF_8)
|
|
55
|
-
erb = ERB.new(template
|
|
56
|
-
html = erb.result(context.binding)
|
|
54
|
+
erb = ERB.new(template)
|
|
55
|
+
html = erb.result(context.binding).lines.map do |line|
|
|
56
|
+
line.match?(/\A\s*\z/) ? "\n" : line
|
|
57
|
+
end.join
|
|
57
58
|
|
|
58
59
|
output.write html
|
|
59
60
|
end
|
|
@@ -63,14 +64,6 @@ module RuboCop
|
|
|
63
64
|
include PathUtil
|
|
64
65
|
include TextUtil
|
|
65
66
|
|
|
66
|
-
SEVERITY_COLORS = {
|
|
67
|
-
refactor: Color.new(0xED, 0x9C, 0x28, 1.0),
|
|
68
|
-
convention: Color.new(0xED, 0x9C, 0x28, 1.0),
|
|
69
|
-
warning: Color.new(0x96, 0x28, 0xEF, 1.0),
|
|
70
|
-
error: Color.new(0xD2, 0x32, 0x2D, 1.0),
|
|
71
|
-
fatal: Color.new(0xD2, 0x32, 0x2D, 1.0)
|
|
72
|
-
}.freeze
|
|
73
|
-
|
|
74
67
|
LOGO_IMAGE_PATH = File.expand_path('../../../assets/logo.png', __dir__)
|
|
75
68
|
|
|
76
69
|
attr_reader :files, :summary
|
|
@@ -88,7 +81,7 @@ module RuboCop
|
|
|
88
81
|
# rubocop:enable Lint/UselessMethodDefinition
|
|
89
82
|
|
|
90
83
|
def decorated_message(offense)
|
|
91
|
-
offense.message.gsub(/`(.+?)`/) { "<code>#{Regexp.last_match(1)}</code>" }
|
|
84
|
+
offense.message.gsub(/`(.+?)`/) { "<code>#{escape(Regexp.last_match(1))}</code>" }
|
|
92
85
|
end
|
|
93
86
|
|
|
94
87
|
def highlighted_source_line(offense)
|
|
@@ -124,9 +117,39 @@ module RuboCop
|
|
|
124
117
|
|
|
125
118
|
def base64_encoded_logo_image
|
|
126
119
|
image = File.read(LOGO_IMAGE_PATH, binmode: true)
|
|
127
|
-
|
|
120
|
+
|
|
121
|
+
# `Base64.encode64` compatible:
|
|
122
|
+
# https://github.com/ruby/base64/blob/v0.1.1/lib/base64.rb#L27-L40
|
|
123
|
+
[image].pack('m')
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
def render_css
|
|
127
|
+
context = CSSContext.new
|
|
128
|
+
template = File.read(CSS_PATH, encoding: Encoding::UTF_8)
|
|
129
|
+
erb = ERB.new(template, trim_mode: '-')
|
|
130
|
+
erb.result(context.binding).lines.map do |line|
|
|
131
|
+
line == "\n" ? line : " #{line}"
|
|
132
|
+
end.join
|
|
128
133
|
end
|
|
129
134
|
end
|
|
135
|
+
|
|
136
|
+
# This class provides helper methods used in the ERB CSS template.
|
|
137
|
+
class CSSContext
|
|
138
|
+
SEVERITY_COLORS = {
|
|
139
|
+
refactor: Color.new(0xED, 0x9C, 0x28, 1.0),
|
|
140
|
+
convention: Color.new(0xED, 0x9C, 0x28, 1.0),
|
|
141
|
+
warning: Color.new(0x96, 0x28, 0xEF, 1.0),
|
|
142
|
+
error: Color.new(0xD2, 0x32, 0x2D, 1.0),
|
|
143
|
+
fatal: Color.new(0xD2, 0x32, 0x2D, 1.0)
|
|
144
|
+
}.freeze
|
|
145
|
+
|
|
146
|
+
# Make Kernel#binding public.
|
|
147
|
+
# rubocop:disable Lint/UselessMethodDefinition
|
|
148
|
+
def binding
|
|
149
|
+
super
|
|
150
|
+
end
|
|
151
|
+
# rubocop:enable Lint/UselessMethodDefinition
|
|
152
|
+
end
|
|
130
153
|
end
|
|
131
154
|
end
|
|
132
155
|
end
|
|
@@ -61,8 +61,7 @@ module RuboCop
|
|
|
61
61
|
|
|
62
62
|
column_width = total_count.to_s.length + 2
|
|
63
63
|
per_cop_counts.each do |cop_name, count|
|
|
64
|
-
output.puts "#{count.to_s.ljust(column_width)}#{cop_name}"
|
|
65
|
-
"#{@style_guide_links[cop_name]}\n"
|
|
64
|
+
output.puts "#{count.to_s.ljust(column_width)}#{cop_information(cop_name)}"
|
|
66
65
|
end
|
|
67
66
|
output.puts '--'
|
|
68
67
|
output.puts "#{total_count} Total in #{offending_files_count} files"
|
|
@@ -78,6 +77,17 @@ module RuboCop
|
|
|
78
77
|
def total_offense_count(offense_counts)
|
|
79
78
|
offense_counts.values.sum
|
|
80
79
|
end
|
|
80
|
+
|
|
81
|
+
def cop_information(cop_name)
|
|
82
|
+
cop = RuboCop::Cop::Registry.global.find_by_cop_name(cop_name).new
|
|
83
|
+
|
|
84
|
+
if cop.correctable?
|
|
85
|
+
safety = cop.safe_autocorrect? ? 'Safe' : 'Unsafe'
|
|
86
|
+
correctable = Rainbow(" [#{safety} Correctable]").yellow
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
"#{cop_name}#{correctable}#{@style_guide_links[cop_name]}"
|
|
90
|
+
end
|
|
81
91
|
end
|
|
82
92
|
end
|
|
83
93
|
end
|
|
@@ -53,14 +53,10 @@ module RuboCop
|
|
|
53
53
|
message: message(offense)
|
|
54
54
|
)
|
|
55
55
|
|
|
56
|
-
|
|
57
|
-
return unless valid_line?(offense)
|
|
56
|
+
return unless valid_line?(offense)
|
|
58
57
|
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
rescue IndexError
|
|
62
|
-
# range is not on a valid line; perhaps the source file is empty
|
|
63
|
-
end
|
|
58
|
+
report_line(offense.location)
|
|
59
|
+
report_highlighted_area(offense.highlighted_area)
|
|
64
60
|
end
|
|
65
61
|
|
|
66
62
|
def annotate_message(msg)
|
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/lockfile.rb
CHANGED
|
@@ -1,18 +1,39 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
+
begin
|
|
4
|
+
# We might not be running with `bundle exec`, so we need to pull in Bundler ourselves,
|
|
5
|
+
# in order to use `Bundler::LockfileParser`.
|
|
6
|
+
require 'bundler'
|
|
7
|
+
rescue LoadError
|
|
8
|
+
nil
|
|
9
|
+
end
|
|
10
|
+
|
|
3
11
|
module RuboCop
|
|
4
12
|
# Encapsulation of a lockfile for use when checking for gems.
|
|
5
13
|
# Does not actually resolve gems, just parses the lockfile.
|
|
6
14
|
# @api private
|
|
7
15
|
class Lockfile
|
|
8
|
-
#
|
|
16
|
+
# @param [String, Pathname, nil] lockfile_path
|
|
17
|
+
def initialize(lockfile_path = nil)
|
|
18
|
+
lockfile_path ||= begin
|
|
19
|
+
::Bundler.default_lockfile if bundler_lock_parser_defined?
|
|
20
|
+
rescue ::Bundler::GemfileNotFound
|
|
21
|
+
nil # We might not be a folder with a Gemfile, but that's okay.
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
@lockfile_path = lockfile_path
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
# Gems that the bundle directly depends on.
|
|
28
|
+
# @return [Array<Bundler::Dependency>, nil]
|
|
9
29
|
def dependencies
|
|
10
30
|
return [] unless parser
|
|
11
31
|
|
|
12
32
|
parser.dependencies.values
|
|
13
33
|
end
|
|
14
34
|
|
|
15
|
-
# All activated gems, including transitive dependencies
|
|
35
|
+
# All activated gems, including transitive dependencies.
|
|
36
|
+
# @return [Array<Bundler::Dependency>, nil]
|
|
16
37
|
def gems
|
|
17
38
|
return [] unless parser
|
|
18
39
|
|
|
@@ -21,20 +42,48 @@ module RuboCop
|
|
|
21
42
|
parser.dependencies.values.concat(parser.specs.flat_map(&:dependencies))
|
|
22
43
|
end
|
|
23
44
|
|
|
45
|
+
# Returns the locked versions of gems from this lockfile.
|
|
46
|
+
# @param [Boolean] include_transitive_dependencies: When false, only direct dependencies
|
|
47
|
+
# are returned, i.e. those listed explicitly in the `Gemfile`.
|
|
48
|
+
# @returns [Hash{String => Gem::Version}] The locked gem versions, keyed by the gems' names.
|
|
49
|
+
def gem_versions(include_transitive_dependencies: true)
|
|
50
|
+
return {} unless parser
|
|
51
|
+
|
|
52
|
+
all_gem_versions = parser.specs.to_h { |spec| [spec.name, spec.version] }
|
|
53
|
+
|
|
54
|
+
if include_transitive_dependencies
|
|
55
|
+
all_gem_versions
|
|
56
|
+
else
|
|
57
|
+
direct_dep_names = parser.dependencies.keys
|
|
58
|
+
all_gem_versions.slice(*direct_dep_names)
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
# Whether this lockfile includes the named gem, directly or indirectly.
|
|
63
|
+
# @param [String] name
|
|
64
|
+
# @return [Boolean]
|
|
24
65
|
def includes_gem?(name)
|
|
25
66
|
gems.any? { |gem| gem.name == name }
|
|
26
67
|
end
|
|
27
68
|
|
|
28
69
|
private
|
|
29
70
|
|
|
71
|
+
# @return [Bundler::LockfileParser, nil]
|
|
30
72
|
def parser
|
|
31
|
-
return unless defined?(Bundler) && Bundler.default_lockfile
|
|
32
73
|
return @parser if defined?(@parser)
|
|
33
74
|
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
75
|
+
@parser = if @lockfile_path && File.exist?(@lockfile_path) && bundler_lock_parser_defined?
|
|
76
|
+
begin
|
|
77
|
+
lockfile = ::Bundler.read_file(@lockfile_path)
|
|
78
|
+
::Bundler::LockfileParser.new(lockfile) if lockfile
|
|
79
|
+
rescue ::Bundler::BundlerError
|
|
80
|
+
nil
|
|
81
|
+
end
|
|
82
|
+
end
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
def bundler_lock_parser_defined?
|
|
86
|
+
Object.const_defined?(:Bundler) && Bundler.const_defined?(:LockfileParser)
|
|
38
87
|
end
|
|
39
88
|
end
|
|
40
89
|
end
|
data/lib/rubocop/lsp/logger.rb
CHANGED
data/lib/rubocop/lsp/routes.rb
CHANGED
|
@@ -12,12 +12,12 @@ require_relative 'severity'
|
|
|
12
12
|
# https://github.com/standardrb/standard/blob/main/LICENSE.txt
|
|
13
13
|
#
|
|
14
14
|
module RuboCop
|
|
15
|
-
module
|
|
15
|
+
module LSP
|
|
16
16
|
# Routes for Language Server Protocol of 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
|
|
@@ -45,10 +45,6 @@ module RuboCop
|
|
|
45
45
|
result: LanguageServer::Protocol::Interface::InitializeResult.new(
|
|
46
46
|
capabilities: LanguageServer::Protocol::Interface::ServerCapabilities.new(
|
|
47
47
|
document_formatting_provider: true,
|
|
48
|
-
diagnostic_provider: LanguageServer::Protocol::Interface::DiagnosticOptions.new(
|
|
49
|
-
inter_file_dependencies: false,
|
|
50
|
-
workspace_diagnostics: false
|
|
51
|
-
),
|
|
52
48
|
text_document_sync: LanguageServer::Protocol::Interface::TextDocumentSyncOptions.new(
|
|
53
49
|
change: LanguageServer::Protocol::Constant::TextDocumentSyncKind::FULL,
|
|
54
50
|
open_close: true
|
|
@@ -60,8 +56,9 @@ module RuboCop
|
|
|
60
56
|
|
|
61
57
|
handle 'initialized' do |_request|
|
|
62
58
|
version = RuboCop::Version::STRING
|
|
59
|
+
yjit = Object.const_defined?('RubyVM::YJIT') && RubyVM::YJIT.enabled? ? ' +YJIT' : ''
|
|
63
60
|
|
|
64
|
-
Logger.log("RuboCop #{version} language server initialized, PID #{Process.pid}")
|
|
61
|
+
Logger.log("RuboCop #{version} language server#{yjit} initialized, PID #{Process.pid}")
|
|
65
62
|
end
|
|
66
63
|
|
|
67
64
|
handle 'shutdown' do |request|
|
|
@@ -72,12 +69,6 @@ module RuboCop
|
|
|
72
69
|
end
|
|
73
70
|
end
|
|
74
71
|
|
|
75
|
-
handle 'textDocument/diagnostic' do |request|
|
|
76
|
-
doc = request[:params][:textDocument]
|
|
77
|
-
result = diagnostic(doc[:uri], doc[:text])
|
|
78
|
-
@server.write(result)
|
|
79
|
-
end
|
|
80
|
-
|
|
81
72
|
handle 'textDocument/didChange' do |request|
|
|
82
73
|
params = request[:params]
|
|
83
74
|
result = diagnostic(params[:textDocument][:uri], params[:contentChanges][0][:text])
|
|
@@ -126,6 +117,12 @@ module RuboCop
|
|
|
126
117
|
end
|
|
127
118
|
|
|
128
119
|
uri = request[:params][:arguments][0][:uri]
|
|
120
|
+
formatted = nil
|
|
121
|
+
|
|
122
|
+
# The `workspace/executeCommand` is an LSP method triggered by intentional user actions,
|
|
123
|
+
# so the user's intention for autocorrection is respected.
|
|
124
|
+
LSP.disable { formatted = format_file(uri, command: command) }
|
|
125
|
+
|
|
129
126
|
@server.write(
|
|
130
127
|
id: request[:id],
|
|
131
128
|
method: 'workspace/applyEdit',
|
|
@@ -133,7 +130,7 @@ module RuboCop
|
|
|
133
130
|
label: label,
|
|
134
131
|
edit: {
|
|
135
132
|
changes: {
|
|
136
|
-
uri =>
|
|
133
|
+
uri => formatted
|
|
137
134
|
}
|
|
138
135
|
}
|
|
139
136
|
}
|
|
@@ -238,7 +235,7 @@ module RuboCop
|
|
|
238
235
|
def to_range(location)
|
|
239
236
|
{
|
|
240
237
|
start: { character: location[:start_column] - 1, line: location[:start_line] - 1 },
|
|
241
|
-
end: { character: location[:last_column]
|
|
238
|
+
end: { character: location[:last_column], line: location[:last_line] - 1 }
|
|
242
239
|
}
|
|
243
240
|
end
|
|
244
241
|
end
|
data/lib/rubocop/lsp/runtime.rb
CHANGED
data/lib/rubocop/lsp/server.rb
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
3
|
require 'language_server-protocol'
|
|
4
|
+
require_relative '../lsp'
|
|
4
5
|
require_relative 'logger'
|
|
5
6
|
require_relative 'routes'
|
|
6
7
|
require_relative 'runtime'
|
|
@@ -15,14 +16,18 @@ require_relative 'runtime'
|
|
|
15
16
|
# https://github.com/standardrb/standard/blob/main/LICENSE.txt
|
|
16
17
|
#
|
|
17
18
|
module RuboCop
|
|
18
|
-
module
|
|
19
|
+
module LSP
|
|
19
20
|
# Language Server Protocol of RuboCop.
|
|
20
21
|
# @api private
|
|
21
22
|
class Server
|
|
22
23
|
def initialize(config_store)
|
|
24
|
+
$PROGRAM_NAME = "rubocop --lsp #{ConfigFinder.project_root}"
|
|
25
|
+
|
|
26
|
+
RuboCop::LSP.enable
|
|
27
|
+
|
|
23
28
|
@reader = LanguageServer::Protocol::Transport::Io::Reader.new($stdin)
|
|
24
29
|
@writer = LanguageServer::Protocol::Transport::Io::Writer.new($stdout)
|
|
25
|
-
@runtime = RuboCop::
|
|
30
|
+
@runtime = RuboCop::LSP::Runtime.new(config_store)
|
|
26
31
|
@routes = Routes.new(self)
|
|
27
32
|
end
|
|
28
33
|
|
data/lib/rubocop/lsp/severity.rb
CHANGED
data/lib/rubocop/lsp.rb
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module RuboCop
|
|
4
|
+
# The RuboCop's built-in LSP module.
|
|
5
|
+
module LSP
|
|
6
|
+
module_function
|
|
7
|
+
|
|
8
|
+
# Returns true when LSP is enabled, false when disabled.
|
|
9
|
+
#
|
|
10
|
+
# @return [Boolean]
|
|
11
|
+
def enabled?
|
|
12
|
+
@enabled ||= false
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
# Enable LSP.
|
|
16
|
+
#
|
|
17
|
+
# @return [void]
|
|
18
|
+
def enable
|
|
19
|
+
@enabled = true
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
# Disable LSP.
|
|
23
|
+
#
|
|
24
|
+
# @return [void]
|
|
25
|
+
def disable(&block)
|
|
26
|
+
if block
|
|
27
|
+
original = @enabled
|
|
28
|
+
@enabled = false
|
|
29
|
+
yield
|
|
30
|
+
@enabled = original
|
|
31
|
+
else
|
|
32
|
+
@enabled = false
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
end
|
|
@@ -268,7 +268,7 @@ module RuboCop
|
|
|
268
268
|
|
|
269
269
|
# Rewrite the comment without a given token type
|
|
270
270
|
def without(type)
|
|
271
|
-
if @comment.match?(/\A#\s*#{self.class::KEYWORDS[type.to_sym]}/)
|
|
271
|
+
if @comment.match?(/\A#\s*#{self.class::KEYWORDS[type.to_sym]}/io)
|
|
272
272
|
''
|
|
273
273
|
else
|
|
274
274
|
@comment
|
data/lib/rubocop/options.rb
CHANGED
|
@@ -95,6 +95,7 @@ module RuboCop
|
|
|
95
95
|
option(opts, '--ignore-unrecognized-cops')
|
|
96
96
|
option(opts, '--force-default-config')
|
|
97
97
|
option(opts, '-s', '--stdin FILE')
|
|
98
|
+
option(opts, '--editor-mode')
|
|
98
99
|
option(opts, '-P', '--[no-]parallel')
|
|
99
100
|
option(opts, '--raise-cop-error')
|
|
100
101
|
add_severity_option(opts)
|
|
@@ -364,15 +365,12 @@ module RuboCop
|
|
|
364
365
|
raise OptionArgumentError, '-C/--cache argument must be true or false'
|
|
365
366
|
end
|
|
366
367
|
|
|
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
368
|
validate_auto_gen_config
|
|
372
369
|
validate_autocorrect
|
|
373
370
|
validate_display_only_failed
|
|
374
371
|
validate_display_only_failed_and_display_only_correctable
|
|
375
372
|
validate_display_only_correctable_and_autocorrect
|
|
373
|
+
validate_lsp_and_editor_mode
|
|
376
374
|
disable_parallel_when_invalid_option_combo
|
|
377
375
|
|
|
378
376
|
return if incompatible_options.size <= 1
|
|
@@ -420,6 +418,13 @@ module RuboCop
|
|
|
420
418
|
format('--display-only-failed cannot be used together with other display options.')
|
|
421
419
|
end
|
|
422
420
|
|
|
421
|
+
def validate_lsp_and_editor_mode
|
|
422
|
+
return if !@options.key?(:lsp) || !@options.key?(:editor_mode)
|
|
423
|
+
|
|
424
|
+
raise OptionArgumentError,
|
|
425
|
+
format('Do not specify `--editor-mode` as it is redundant in `--lsp`.')
|
|
426
|
+
end
|
|
427
|
+
|
|
423
428
|
def validate_autocorrect
|
|
424
429
|
if @options.key?(:safe_autocorrect) && @options.key?(:autocorrect_all)
|
|
425
430
|
message = Rainbow(<<~MESSAGE).red
|
|
@@ -460,10 +465,6 @@ module RuboCop
|
|
|
460
465
|
(@options[:only] & %w[Lint/RedundantCopDisableDirective RedundantCopDisableDirective]).any?
|
|
461
466
|
end
|
|
462
467
|
|
|
463
|
-
def display_only_fail_level_offenses_with_autocorrect?
|
|
464
|
-
@options.key?(:display_only_fail_level_offenses) && @options.key?(:autocorrect)
|
|
465
|
-
end
|
|
466
|
-
|
|
467
468
|
def except_syntax?
|
|
468
469
|
@options.key?(:except) && (@options[:except] & %w[Lint/Syntax Syntax]).any?
|
|
469
470
|
end
|
|
@@ -572,7 +573,7 @@ module RuboCop
|
|
|
572
573
|
'cops. Only valid for --format junit.'],
|
|
573
574
|
display_only_fail_level_offenses:
|
|
574
575
|
['Only output offense messages at',
|
|
575
|
-
'the specified --fail-level or above'],
|
|
576
|
+
'the specified --fail-level or above.'],
|
|
576
577
|
display_only_correctable: ['Only output correctable offense messages.'],
|
|
577
578
|
display_only_safe_correctable: ['Only output safe-correctable offense messages',
|
|
578
579
|
'when combined with --display-only-correctable.'],
|
|
@@ -617,6 +618,8 @@ module RuboCop
|
|
|
617
618
|
'parallel. Default is true.'],
|
|
618
619
|
stdin: ['Pipe source from STDIN, using FILE in offense',
|
|
619
620
|
'reports. This is useful for editor integration.'],
|
|
621
|
+
editor_mode: ['Optimize real-time feedback in editors,',
|
|
622
|
+
'adjusting behaviors for editing experience.'],
|
|
620
623
|
init: 'Generate a .rubocop.yml file in the current directory.',
|
|
621
624
|
server: ['If a server process has not been started yet, start',
|
|
622
625
|
'the server process and execute inspection with server.',
|
|
@@ -633,8 +636,8 @@ module RuboCop
|
|
|
633
636
|
raise_cop_error: ['Raise cop-related errors with cause and location.',
|
|
634
637
|
'This is used to prevent cops from failing silently.',
|
|
635
638
|
'Default is false.'],
|
|
636
|
-
profile: 'Profile rubocop',
|
|
637
|
-
memory: 'Profile rubocop memory usage'
|
|
639
|
+
profile: 'Profile rubocop.',
|
|
640
|
+
memory: 'Profile rubocop memory usage.'
|
|
638
641
|
}.freeze
|
|
639
642
|
end
|
|
640
643
|
# rubocop:enable Metrics/ModuleLength
|
data/lib/rubocop/path_util.rb
CHANGED
|
@@ -44,7 +44,7 @@ module RuboCop
|
|
|
44
44
|
end
|
|
45
45
|
end
|
|
46
46
|
|
|
47
|
-
# rubocop:disable Metrics/MethodLength, Metrics/CyclomaticComplexity
|
|
47
|
+
# rubocop:disable Metrics/MethodLength, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
|
|
48
48
|
def match_path?(pattern, path)
|
|
49
49
|
case pattern
|
|
50
50
|
when String
|
|
@@ -52,6 +52,10 @@ module RuboCop
|
|
|
52
52
|
if pattern == path
|
|
53
53
|
true
|
|
54
54
|
elsif glob?(pattern)
|
|
55
|
+
# File name matching doesn't really work with relative patterns that start with "..". We
|
|
56
|
+
# get around that problem by converting the pattern to an absolute path.
|
|
57
|
+
pattern = File.expand_path(pattern) if pattern.start_with?('..')
|
|
58
|
+
|
|
55
59
|
File.fnmatch?(pattern, path, File::FNM_PATHNAME | File::FNM_EXTGLOB)
|
|
56
60
|
end
|
|
57
61
|
|
|
@@ -66,7 +70,7 @@ module RuboCop
|
|
|
66
70
|
end
|
|
67
71
|
end
|
|
68
72
|
end
|
|
69
|
-
# rubocop:enable Metrics/MethodLength, Metrics/CyclomaticComplexity
|
|
73
|
+
# rubocop:enable Metrics/MethodLength, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
|
|
70
74
|
|
|
71
75
|
# Returns true for an absolute Unix or Windows path.
|
|
72
76
|
def absolute?(path)
|
data/lib/rubocop/rake_task.rb
CHANGED
|
@@ -44,7 +44,7 @@ module RuboCop
|
|
|
44
44
|
def run_cli(verbose, options)
|
|
45
45
|
# We lazy-load RuboCop so that the task doesn't dramatically impact the
|
|
46
46
|
# load time of your Rakefile.
|
|
47
|
-
|
|
47
|
+
require_relative '../rubocop'
|
|
48
48
|
|
|
49
49
|
cli = CLI.new
|
|
50
50
|
puts 'Running RuboCop...' if verbose
|
data/lib/rubocop/result_cache.rb
CHANGED
|
@@ -6,7 +6,11 @@ require 'tempfile'
|
|
|
6
6
|
module CopHelper
|
|
7
7
|
extend RSpec::SharedContext
|
|
8
8
|
|
|
9
|
-
let(:ruby_version)
|
|
9
|
+
let(:ruby_version) do
|
|
10
|
+
# The minimum version Prism can parse is 3.3.
|
|
11
|
+
ENV['PARSER_ENGINE'] == 'parser_prism' ? 3.3 : RuboCop::TargetRuby::DEFAULT_VERSION
|
|
12
|
+
end
|
|
13
|
+
let(:parser_engine) { ENV.fetch('PARSER_ENGINE', :parser_whitequark).to_sym }
|
|
10
14
|
let(:rails_version) { false }
|
|
11
15
|
|
|
12
16
|
def inspect_source(source, file = nil)
|
|
@@ -28,7 +32,9 @@ module CopHelper
|
|
|
28
32
|
file = file.path
|
|
29
33
|
end
|
|
30
34
|
|
|
31
|
-
processed_source = RuboCop::ProcessedSource.new(
|
|
35
|
+
processed_source = RuboCop::ProcessedSource.new(
|
|
36
|
+
source, ruby_version, file, parser_engine: parser_engine
|
|
37
|
+
)
|
|
32
38
|
processed_source.config = configuration
|
|
33
39
|
processed_source.registry = registry
|
|
34
40
|
processed_source
|
|
@@ -111,6 +111,7 @@ module RuboCop
|
|
|
111
111
|
source
|
|
112
112
|
end
|
|
113
113
|
|
|
114
|
+
# rubocop:disable Metrics/AbcSize
|
|
114
115
|
def expect_offense(source, file = nil, severity: nil, chomp: false, **replacements)
|
|
115
116
|
expected_annotations = parse_annotations(source, **replacements)
|
|
116
117
|
source = expected_annotations.plain_source
|
|
@@ -123,10 +124,17 @@ module RuboCop
|
|
|
123
124
|
expect(actual_annotations).to eq(expected_annotations), ''
|
|
124
125
|
expect(@offenses.map(&:severity).uniq).to eq([severity]) if severity
|
|
125
126
|
|
|
127
|
+
# Validate that all offenses have a range that formatters can display
|
|
128
|
+
expect do
|
|
129
|
+
@offenses.each { |offense| offense.location.source_line }
|
|
130
|
+
end.not_to raise_error, 'One of the offenses has a misconstructed range, for ' \
|
|
131
|
+
'example if the offense is on line 1 and the source is empty'
|
|
132
|
+
|
|
126
133
|
@offenses
|
|
127
134
|
end
|
|
135
|
+
# rubocop:enable Metrics/AbcSize
|
|
128
136
|
|
|
129
|
-
# rubocop:disable Metrics/AbcSize, Metrics/MethodLength, Metrics/CyclomaticComplexity
|
|
137
|
+
# rubocop:disable Metrics/AbcSize, Metrics/MethodLength, Metrics/CyclomaticComplexity
|
|
130
138
|
def expect_correction(correction, loop: true, source: nil)
|
|
131
139
|
if source
|
|
132
140
|
expected_annotations = parse_annotations(source, raise_error: false)
|
|
@@ -148,7 +156,6 @@ module RuboCop
|
|
|
148
156
|
|
|
149
157
|
break corrected_source unless loop
|
|
150
158
|
break corrected_source if @last_corrector.empty?
|
|
151
|
-
break corrected_source if corrected_source == @processed_source.buffer.source
|
|
152
159
|
|
|
153
160
|
if iteration > RuboCop::Runner::MAX_ITERATIONS
|
|
154
161
|
raise RuboCop::Runner::InfiniteCorrectionLoop.new(@processed_source.path, [@offenses])
|
|
@@ -163,19 +170,20 @@ module RuboCop
|
|
|
163
170
|
|
|
164
171
|
expect(new_source).to eq(correction)
|
|
165
172
|
end
|
|
166
|
-
# rubocop:enable Metrics/AbcSize, Metrics/MethodLength, Metrics/CyclomaticComplexity
|
|
173
|
+
# rubocop:enable Metrics/AbcSize, Metrics/MethodLength, Metrics/CyclomaticComplexity
|
|
167
174
|
|
|
168
175
|
def expect_no_corrections
|
|
169
176
|
raise '`expect_no_corrections` must follow `expect_offense`' unless @processed_source
|
|
170
177
|
|
|
171
178
|
return if @last_corrector.empty?
|
|
172
179
|
|
|
173
|
-
#
|
|
174
|
-
# we need to run the actual corrections
|
|
175
|
-
|
|
180
|
+
# This is just here for a pretty diff if the source actually got changed
|
|
176
181
|
new_source = @last_corrector.rewrite
|
|
177
|
-
|
|
178
182
|
expect(new_source).to eq(@processed_source.buffer.source)
|
|
183
|
+
|
|
184
|
+
# There is an infinite loop if a corrector is present that did not make
|
|
185
|
+
# any changes. It will cause the same offense/correction on the next loop.
|
|
186
|
+
raise RuboCop::Runner::InfiniteCorrectionLoop.new(@processed_source.path, [@offenses])
|
|
179
187
|
end
|
|
180
188
|
|
|
181
189
|
def expect_no_offenses(source, file = nil)
|
|
@@ -212,7 +220,7 @@ module RuboCop
|
|
|
212
220
|
|
|
213
221
|
# Parsed representation of code annotated with the `^^^ Message` style
|
|
214
222
|
class AnnotatedSource
|
|
215
|
-
ANNOTATION_PATTERN = /\A\s*(\^+|\^{})
|
|
223
|
+
ANNOTATION_PATTERN = /\A\s*(\^+|\^{}) ?/.freeze
|
|
216
224
|
ABBREV = "[...]\n"
|
|
217
225
|
|
|
218
226
|
# @param annotated_source [String] string passed to the matchers
|