rubocop 1.36.0 → 1.40.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/README.md +1 -1
- data/config/default.yml +78 -12
- data/exe/rubocop +1 -1
- data/lib/rubocop/arguments_env.rb +17 -0
- data/lib/rubocop/arguments_file.rb +17 -0
- data/lib/rubocop/cli/command/execute_runner.rb +7 -7
- data/lib/rubocop/cli/command/suggest_extensions.rb +8 -1
- data/lib/rubocop/comment_config.rb +41 -1
- data/lib/rubocop/config.rb +5 -4
- data/lib/rubocop/config_loader.rb +5 -5
- data/lib/rubocop/config_loader_resolver.rb +1 -1
- data/lib/rubocop/cop/base.rb +2 -9
- data/lib/rubocop/cop/commissioner.rb +3 -1
- data/lib/rubocop/cop/correctors/multiline_literal_brace_corrector.rb +22 -6
- data/lib/rubocop/cop/generator.rb +1 -2
- data/lib/rubocop/cop/internal_affairs/create_empty_file.rb +37 -0
- data/lib/rubocop/cop/internal_affairs/example_heredoc_delimiter.rb +111 -0
- data/lib/rubocop/cop/internal_affairs/lambda_or_proc.rb +46 -0
- data/lib/rubocop/cop/internal_affairs.rb +3 -0
- data/lib/rubocop/cop/layout/first_argument_indentation.rb +1 -0
- data/lib/rubocop/cop/layout/indentation_style.rb +1 -1
- data/lib/rubocop/cop/layout/indentation_width.rb +1 -1
- data/lib/rubocop/cop/layout/line_continuation_leading_space.rb +29 -8
- data/lib/rubocop/cop/layout/line_continuation_spacing.rb +1 -1
- data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +13 -9
- data/lib/rubocop/cop/layout/space_inside_array_percent_literal.rb +3 -0
- data/lib/rubocop/cop/layout/space_inside_hash_literal_braces.rb +30 -3
- data/lib/rubocop/cop/layout/space_inside_percent_literal_delimiters.rb +34 -0
- data/lib/rubocop/cop/layout/space_inside_reference_brackets.rb +6 -2
- data/lib/rubocop/cop/lint/ambiguous_block_association.rb +2 -2
- data/lib/rubocop/cop/lint/assignment_in_condition.rb +11 -1
- data/lib/rubocop/cop/lint/deprecated_constants.rb +8 -1
- data/lib/rubocop/cop/lint/duplicate_magic_comment.rb +73 -0
- data/lib/rubocop/cop/lint/duplicate_methods.rb +28 -9
- data/lib/rubocop/cop/lint/duplicate_regexp_character_class_element.rb +25 -6
- data/lib/rubocop/cop/lint/empty_block.rb +1 -5
- data/lib/rubocop/cop/lint/empty_class.rb +3 -1
- data/lib/rubocop/cop/lint/empty_conditional_body.rb +21 -9
- data/lib/rubocop/cop/lint/interpolation_check.rb +4 -3
- data/lib/rubocop/cop/lint/missing_cop_enable_directive.rb +18 -3
- data/lib/rubocop/cop/lint/nested_method_definition.rb +50 -1
- data/lib/rubocop/cop/lint/number_conversion.rb +1 -1
- data/lib/rubocop/cop/lint/ordered_magic_comments.rb +4 -5
- data/lib/rubocop/cop/lint/out_of_range_regexp_ref.rb +1 -1
- data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +5 -0
- data/lib/rubocop/cop/lint/redundant_cop_disable_directive.rb +36 -4
- data/lib/rubocop/cop/lint/redundant_dir_glob_sort.rb +7 -0
- data/lib/rubocop/cop/lint/redundant_require_statement.rb +38 -10
- data/lib/rubocop/cop/lint/require_parentheses.rb +1 -1
- data/lib/rubocop/cop/lint/safe_navigation_chain.rb +18 -8
- data/lib/rubocop/cop/lint/send_with_mixin_argument.rb +5 -4
- data/lib/rubocop/cop/lint/shadowed_exception.rb +0 -10
- data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +7 -3
- data/lib/rubocop/cop/lint/suppressed_exception.rb +1 -1
- data/lib/rubocop/cop/lint/unreachable_loop.rb +1 -1
- data/lib/rubocop/cop/lint/unused_method_argument.rb +4 -0
- data/lib/rubocop/cop/lint/void.rb +6 -6
- data/lib/rubocop/cop/metrics/abc_size.rb +1 -1
- data/lib/rubocop/cop/metrics/block_length.rb +9 -4
- data/lib/rubocop/cop/metrics/class_length.rb +9 -4
- data/lib/rubocop/cop/metrics/method_length.rb +9 -4
- data/lib/rubocop/cop/metrics/module_length.rb +9 -4
- data/lib/rubocop/cop/metrics/utils/code_length_calculator.rb +5 -2
- data/lib/rubocop/cop/mixin/comments_help.rb +12 -0
- data/lib/rubocop/cop/mixin/frozen_string_literal.rb +4 -0
- data/lib/rubocop/cop/mixin/hash_shorthand_syntax.rb +30 -8
- data/lib/rubocop/cop/mixin/range_help.rb +23 -0
- data/lib/rubocop/cop/mixin/rescue_node.rb +3 -1
- data/lib/rubocop/cop/mixin/statement_modifier.rb +15 -1
- data/lib/rubocop/cop/mixin/surrounding_space.rb +10 -8
- data/lib/rubocop/cop/mixin/visibility_help.rb +40 -5
- data/lib/rubocop/cop/naming/inclusive_language.rb +1 -1
- data/lib/rubocop/cop/registry.rb +32 -14
- data/lib/rubocop/cop/style/access_modifier_declarations.rb +5 -7
- data/lib/rubocop/cop/style/accessor_grouping.rb +7 -3
- data/lib/rubocop/cop/style/array_intersect.rb +111 -0
- data/lib/rubocop/cop/style/block_delimiters.rb +2 -2
- data/lib/rubocop/cop/style/character_literal.rb +1 -1
- data/lib/rubocop/cop/style/class_equality_comparison.rb +8 -6
- data/lib/rubocop/cop/style/collection_compact.rb +12 -3
- data/lib/rubocop/cop/style/empty_method.rb +1 -1
- data/lib/rubocop/cop/style/endless_method.rb +1 -1
- data/lib/rubocop/cop/style/explicit_block_argument.rb +4 -0
- data/lib/rubocop/cop/style/format_string_token.rb +1 -1
- data/lib/rubocop/cop/style/guard_clause.rb +90 -22
- data/lib/rubocop/cop/style/hash_as_last_array_item.rb +1 -0
- data/lib/rubocop/cop/style/hash_each_methods.rb +32 -10
- data/lib/rubocop/cop/style/hash_except.rb +4 -0
- data/lib/rubocop/cop/style/hash_syntax.rb +1 -1
- data/lib/rubocop/cop/style/if_with_boolean_literal_branches.rb +25 -2
- data/lib/rubocop/cop/style/if_with_semicolon.rb +2 -1
- data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +13 -2
- data/lib/rubocop/cop/style/module_function.rb +28 -6
- data/lib/rubocop/cop/style/negated_if_else_condition.rb +7 -1
- data/lib/rubocop/cop/style/nil_lambda.rb +1 -1
- data/lib/rubocop/cop/style/numeric_predicate.rb +1 -1
- data/lib/rubocop/cop/style/object_then.rb +3 -0
- data/lib/rubocop/cop/style/operator_method_call.rb +53 -0
- data/lib/rubocop/cop/style/quoted_symbols.rb +1 -1
- data/lib/rubocop/cop/style/redundant_argument.rb +3 -0
- data/lib/rubocop/cop/style/redundant_begin.rb +1 -0
- data/lib/rubocop/cop/style/redundant_condition.rb +5 -2
- data/lib/rubocop/cop/style/redundant_constant_base.rb +72 -0
- data/lib/rubocop/cop/style/redundant_each.rb +116 -0
- data/lib/rubocop/cop/style/redundant_initialize.rb +3 -1
- data/lib/rubocop/cop/style/redundant_regexp_character_class.rb +8 -1
- data/lib/rubocop/cop/style/redundant_regexp_escape.rb +12 -3
- data/lib/rubocop/cop/style/redundant_return.rb +7 -0
- data/lib/rubocop/cop/style/redundant_sort.rb +1 -1
- data/lib/rubocop/cop/style/redundant_string_escape.rb +181 -0
- data/lib/rubocop/cop/style/require_order.rb +88 -0
- data/lib/rubocop/cop/style/rescue_modifier.rb +1 -1
- data/lib/rubocop/cop/style/safe_navigation.rb +35 -6
- data/lib/rubocop/cop/style/select_by_regexp.rb +8 -4
- data/lib/rubocop/cop/style/static_class.rb +32 -1
- data/lib/rubocop/cop/style/string_literals.rb +1 -5
- data/lib/rubocop/cop/style/symbol_array.rb +2 -0
- data/lib/rubocop/cop/style/symbol_proc.rb +3 -5
- data/lib/rubocop/cop/style/word_array.rb +2 -0
- data/lib/rubocop/cop/team.rb +4 -5
- data/lib/rubocop/cop/util.rb +2 -2
- data/lib/rubocop/cop/variable_force/assignment.rb +1 -1
- data/lib/rubocop/cop/variable_force/variable_table.rb +1 -1
- data/lib/rubocop/cop/variable_force.rb +20 -29
- data/lib/rubocop/cops_documentation_generator.rb +2 -1
- data/lib/rubocop/ext/processed_source.rb +2 -0
- data/lib/rubocop/formatter/disabled_config_formatter.rb +25 -8
- data/lib/rubocop/formatter/html_formatter.rb +1 -1
- data/lib/rubocop/formatter/offense_count_formatter.rb +8 -5
- data/lib/rubocop/formatter/worst_offenders_formatter.rb +6 -3
- data/lib/rubocop/formatter.rb +3 -1
- data/lib/rubocop/optimized_patterns.rb +38 -0
- data/lib/rubocop/options.rb +28 -16
- data/lib/rubocop/path_util.rb +14 -2
- data/lib/rubocop/result_cache.rb +1 -1
- data/lib/rubocop/rspec/cop_helper.rb +24 -1
- data/lib/rubocop/rspec/shared_contexts.rb +14 -1
- data/lib/rubocop/rspec/support.rb +2 -2
- data/lib/rubocop/runner.rb +15 -11
- data/lib/rubocop/server/cache.rb +5 -1
- data/lib/rubocop/server/cli.rb +9 -2
- data/lib/rubocop/server/client_command/exec.rb +5 -0
- data/lib/rubocop/server/core.rb +19 -2
- data/lib/rubocop/server/socket_reader.rb +5 -1
- data/lib/rubocop/server.rb +1 -1
- data/lib/rubocop/target_ruby.rb +1 -1
- data/lib/rubocop/version.rb +8 -3
- data/lib/rubocop.rb +18 -6
- metadata +18 -5
| @@ -108,34 +108,26 @@ module RuboCop | |
| 108 108 | 
             
                    :skip_children
         | 
| 109 109 | 
             
                  end
         | 
| 110 110 |  | 
| 111 | 
            -
                  # rubocop:disable  | 
| 111 | 
            +
                  # rubocop:disable Layout/ClassStructure
         | 
| 112 | 
            +
                  NODE_HANDLER_METHOD_NAMES = [
         | 
| 113 | 
            +
                    [VARIABLE_ASSIGNMENT_TYPE, :process_variable_assignment],
         | 
| 114 | 
            +
                    [REGEXP_NAMED_CAPTURE_TYPE, :process_regexp_named_captures],
         | 
| 115 | 
            +
                    [MULTIPLE_ASSIGNMENT_TYPE, :process_variable_multiple_assignment],
         | 
| 116 | 
            +
                    [VARIABLE_REFERENCE_TYPE, :process_variable_referencing],
         | 
| 117 | 
            +
                    [RESCUE_TYPE, :process_rescue],
         | 
| 118 | 
            +
                    [ZERO_ARITY_SUPER_TYPE, :process_zero_arity_super],
         | 
| 119 | 
            +
                    [SEND_TYPE, :process_send],
         | 
| 120 | 
            +
                    *ARGUMENT_DECLARATION_TYPES.product([:process_variable_declaration]),
         | 
| 121 | 
            +
                    *OPERATOR_ASSIGNMENT_TYPES.product([:process_variable_operator_assignment]),
         | 
| 122 | 
            +
                    *LOOP_TYPES.product([:process_loop]),
         | 
| 123 | 
            +
                    *SCOPE_TYPES.product([:process_scope])
         | 
| 124 | 
            +
                  ].to_h.freeze
         | 
| 125 | 
            +
                  private_constant :NODE_HANDLER_METHOD_NAMES
         | 
| 126 | 
            +
                  # rubocop:enable Layout/ClassStructure
         | 
| 127 | 
            +
             | 
| 112 128 | 
             
                  def node_handler_method_name(node)
         | 
| 113 | 
            -
                     | 
| 114 | 
            -
                    when VARIABLE_ASSIGNMENT_TYPE
         | 
| 115 | 
            -
                      :process_variable_assignment
         | 
| 116 | 
            -
                    when REGEXP_NAMED_CAPTURE_TYPE
         | 
| 117 | 
            -
                      :process_regexp_named_captures
         | 
| 118 | 
            -
                    when MULTIPLE_ASSIGNMENT_TYPE
         | 
| 119 | 
            -
                      :process_variable_multiple_assignment
         | 
| 120 | 
            -
                    when VARIABLE_REFERENCE_TYPE
         | 
| 121 | 
            -
                      :process_variable_referencing
         | 
| 122 | 
            -
                    when RESCUE_TYPE
         | 
| 123 | 
            -
                      :process_rescue
         | 
| 124 | 
            -
                    when ZERO_ARITY_SUPER_TYPE
         | 
| 125 | 
            -
                      :process_zero_arity_super
         | 
| 126 | 
            -
                    when SEND_TYPE
         | 
| 127 | 
            -
                      :process_send
         | 
| 128 | 
            -
                    when *ARGUMENT_DECLARATION_TYPES
         | 
| 129 | 
            -
                      :process_variable_declaration
         | 
| 130 | 
            -
                    when *OPERATOR_ASSIGNMENT_TYPES
         | 
| 131 | 
            -
                      :process_variable_operator_assignment
         | 
| 132 | 
            -
                    when *LOOP_TYPES
         | 
| 133 | 
            -
                      :process_loop
         | 
| 134 | 
            -
                    when *SCOPE_TYPES
         | 
| 135 | 
            -
                      :process_scope
         | 
| 136 | 
            -
                    end
         | 
| 129 | 
            +
                    NODE_HANDLER_METHOD_NAMES[node.type]
         | 
| 137 130 | 
             
                  end
         | 
| 138 | 
            -
                  # rubocop:enable Metrics/MethodLength, Metrics/CyclomaticComplexity
         | 
| 139 131 |  | 
| 140 132 | 
             
                  def process_variable_declaration(node)
         | 
| 141 133 | 
             
                    variable_name = node.children.first
         | 
| @@ -358,13 +350,12 @@ module RuboCop | |
| 358 350 | 
             
                    end
         | 
| 359 351 | 
             
                  end
         | 
| 360 352 |  | 
| 361 | 
            -
                  # Use Node#equal? for accurate check.
         | 
| 362 353 | 
             
                  def scanned_node?(node)
         | 
| 363 | 
            -
                    scanned_nodes. | 
| 354 | 
            +
                    scanned_nodes.include?(node)
         | 
| 364 355 | 
             
                  end
         | 
| 365 356 |  | 
| 366 357 | 
             
                  def scanned_nodes
         | 
| 367 | 
            -
                    @scanned_nodes ||=  | 
| 358 | 
            +
                    @scanned_nodes ||= Set.new.compare_by_identity
         | 
| 368 359 | 
             
                  end
         | 
| 369 360 |  | 
| 370 361 | 
             
                  # Hooks invoked by VariableTable.
         | 
| @@ -185,7 +185,8 @@ class CopsDocumentationGenerator # rubocop:disable Metrics/ClassLength | |
| 185 185 | 
             
              def to_table(header, content)
         | 
| 186 186 | 
             
                table = ['|===', "| #{header.join(' | ')}\n\n"].join("\n")
         | 
| 187 187 | 
             
                marked_contents = content.map do |plain_content|
         | 
| 188 | 
            -
                   | 
| 188 | 
            +
                  # Escape `|` with backslash to prevent the regexp `|` is not used as a table separator.
         | 
| 189 | 
            +
                  plain_content.map { |c| "| #{c.gsub(/\|/, '\|')}" }.join("\n")
         | 
| 189 190 | 
             
                end
         | 
| 190 191 | 
             
                table << marked_contents.join("\n\n")
         | 
| 191 192 | 
             
                table << "\n|===\n"
         | 
| @@ -65,18 +65,26 @@ module RuboCop | |
| 65 65 | 
             
                    @options.fetch(:offense_counts, true)
         | 
| 66 66 | 
             
                  end
         | 
| 67 67 |  | 
| 68 | 
            +
                  def auto_gen_enforced_style?
         | 
| 69 | 
            +
                    @options.fetch(:auto_gen_enforced_style, true)
         | 
| 70 | 
            +
                  end
         | 
| 71 | 
            +
             | 
| 68 72 | 
             
                  def command
         | 
| 69 73 | 
             
                    command = 'rubocop --auto-gen-config'
         | 
| 70 74 |  | 
| 71 75 | 
             
                    command += ' --auto-gen-only-exclude' if @options[:auto_gen_only_exclude]
         | 
| 72 76 |  | 
| 73 | 
            -
                    if  | 
| 77 | 
            +
                    if no_exclude_limit?
         | 
| 78 | 
            +
                      command += ' --no-exclude-limit'
         | 
| 79 | 
            +
                    elsif @exclude_limit_option
         | 
| 74 80 | 
             
                      command += format(' --exclude-limit %<limit>d', limit: Integer(@exclude_limit_option))
         | 
| 75 81 | 
             
                    end
         | 
| 76 82 | 
             
                    command += ' --no-offense-counts' unless show_offense_counts?
         | 
| 77 83 |  | 
| 78 84 | 
             
                    command += ' --no-auto-gen-timestamp' unless show_timestamp?
         | 
| 79 85 |  | 
| 86 | 
            +
                    command += ' --no-auto-gen-enforced-style' unless auto_gen_enforced_style?
         | 
| 87 | 
            +
             | 
| 80 88 | 
             
                    command
         | 
| 81 89 | 
             
                  end
         | 
| 82 90 |  | 
| @@ -170,24 +178,29 @@ module RuboCop | |
| 170 178 | 
             
                  end
         | 
| 171 179 |  | 
| 172 180 | 
             
                  def output_cop_config(output_buffer, cfg, cop_name)
         | 
| 173 | 
            -
                     | 
| 174 | 
            -
                    # limit is exceeded.
         | 
| 175 | 
            -
                    cfg_without_enabled = cfg.reject { |key| key == 'Enabled' }
         | 
| 176 | 
            -
             | 
| 181 | 
            +
                    filtered_cfg = filtered_config(cfg)
         | 
| 177 182 | 
             
                    output_buffer.puts "#{cop_name}:"
         | 
| 178 | 
            -
                     | 
| 183 | 
            +
                    filtered_cfg.each do |key, value|
         | 
| 179 184 | 
             
                      value = value[0] if value.is_a?(Array)
         | 
| 180 185 | 
             
                      output_buffer.puts "  #{key}: #{value}"
         | 
| 181 186 | 
             
                    end
         | 
| 182 187 |  | 
| 183 | 
            -
                    output_offending_files(output_buffer,  | 
| 188 | 
            +
                    output_offending_files(output_buffer, filtered_cfg, cop_name)
         | 
| 189 | 
            +
                  end
         | 
| 190 | 
            +
             | 
| 191 | 
            +
                  def filtered_config(cfg)
         | 
| 192 | 
            +
                    # 'Enabled' option will be put into file only if exclude
         | 
| 193 | 
            +
                    # limit is exceeded.
         | 
| 194 | 
            +
                    rejected_keys = ['Enabled']
         | 
| 195 | 
            +
                    rejected_keys << 'EnforcedStyle' unless auto_gen_enforced_style?
         | 
| 196 | 
            +
                    cfg.reject { |key| rejected_keys.include?(key) }
         | 
| 184 197 | 
             
                  end
         | 
| 185 198 |  | 
| 186 199 | 
             
                  def output_offending_files(output_buffer, cfg, cop_name)
         | 
| 187 200 | 
             
                    return unless cfg.empty?
         | 
| 188 201 |  | 
| 189 202 | 
             
                    offending_files = @files_with_offenses[cop_name].sort
         | 
| 190 | 
            -
                    if offending_files.count > @exclude_limit
         | 
| 203 | 
            +
                    if !no_exclude_limit? && offending_files.count > @exclude_limit
         | 
| 191 204 | 
             
                      output_buffer.puts '  Enabled: false'
         | 
| 192 205 | 
             
                    else
         | 
| 193 206 | 
             
                      output_exclude_list(output_buffer, offending_files, cop_name)
         | 
| @@ -245,6 +258,10 @@ module RuboCop | |
| 245 258 | 
             
                  def safe_autocorrect?(config)
         | 
| 246 259 | 
             
                    config.fetch('Safe', true) && config.fetch('SafeAutoCorrect', true)
         | 
| 247 260 | 
             
                  end
         | 
| 261 | 
            +
             | 
| 262 | 
            +
                  def no_exclude_limit?
         | 
| 263 | 
            +
                    @options[:no_exclude_limit] == false
         | 
| 264 | 
            +
                  end
         | 
| 248 265 | 
             
                end
         | 
| 249 266 | 
             
              end
         | 
| 250 267 | 
             
            end
         | 
| @@ -12,13 +12,14 @@ module RuboCop | |
| 12 12 | 
             
                # 26  LineLength
         | 
| 13 13 | 
             
                # 3   OneLineConditional
         | 
| 14 14 | 
             
                # --
         | 
| 15 | 
            -
                # 29  Total
         | 
| 15 | 
            +
                # 29  Total in 5 files
         | 
| 16 16 | 
             
                class OffenseCountFormatter < BaseFormatter
         | 
| 17 17 | 
             
                  attr_reader :offense_counts
         | 
| 18 18 |  | 
| 19 19 | 
             
                  def started(target_files)
         | 
| 20 20 | 
             
                    super
         | 
| 21 21 | 
             
                    @offense_counts = Hash.new(0)
         | 
| 22 | 
            +
                    @offending_files_count = 0
         | 
| 22 23 | 
             
                    @style_guide_links = {}
         | 
| 23 24 |  | 
| 24 25 | 
             
                    return unless output.tty?
         | 
| @@ -43,26 +44,28 @@ module RuboCop | |
| 43 44 | 
             
                    if options[:display_style_guide]
         | 
| 44 45 | 
             
                      offenses.each { |o| @style_guide_links[o.cop_name] ||= o.message[/ \(http\S+\)\Z/] }
         | 
| 45 46 | 
             
                    end
         | 
| 47 | 
            +
                    @offending_files_count += 1 unless offenses.empty?
         | 
| 46 48 | 
             
                    @progressbar.increment if instance_variable_defined?(:@progressbar)
         | 
| 47 49 | 
             
                  end
         | 
| 48 50 |  | 
| 49 51 | 
             
                  def finished(_inspected_files)
         | 
| 50 | 
            -
                    report_summary(@offense_counts)
         | 
| 52 | 
            +
                    report_summary(@offense_counts, @offending_files_count)
         | 
| 51 53 | 
             
                  end
         | 
| 52 54 |  | 
| 53 55 | 
             
                  # rubocop:disable Metrics/AbcSize
         | 
| 54 | 
            -
                  def report_summary(offense_counts)
         | 
| 56 | 
            +
                  def report_summary(offense_counts, offending_files_count)
         | 
| 55 57 | 
             
                    per_cop_counts = ordered_offense_counts(offense_counts)
         | 
| 56 58 | 
             
                    total_count = total_offense_count(offense_counts)
         | 
| 57 59 |  | 
| 58 60 | 
             
                    output.puts
         | 
| 59 61 |  | 
| 62 | 
            +
                    column_width = total_count.to_s.length + 2
         | 
| 60 63 | 
             
                    per_cop_counts.each do |cop_name, count|
         | 
| 61 | 
            -
                      output.puts "#{count.to_s.ljust( | 
| 64 | 
            +
                      output.puts "#{count.to_s.ljust(column_width)}#{cop_name}" \
         | 
| 62 65 | 
             
                                  "#{@style_guide_links[cop_name]}\n"
         | 
| 63 66 | 
             
                    end
         | 
| 64 67 | 
             
                    output.puts '--'
         | 
| 65 | 
            -
                    output.puts "#{total_count}  Total"
         | 
| 68 | 
            +
                    output.puts "#{total_count}  Total in #{offending_files_count} files"
         | 
| 66 69 |  | 
| 67 70 | 
             
                    output.puts
         | 
| 68 71 | 
             
                  end
         | 
| @@ -12,7 +12,7 @@ module RuboCop | |
| 12 12 | 
             
                # 26  this/file/is/really/bad.rb
         | 
| 13 13 | 
             
                # 3   just/ok.rb
         | 
| 14 14 | 
             
                # --
         | 
| 15 | 
            -
                # 29  Total
         | 
| 15 | 
            +
                # 29  Total in 2 files
         | 
| 16 16 | 
             
                class WorstOffendersFormatter < BaseFormatter
         | 
| 17 17 | 
             
                  attr_reader :offense_counts
         | 
| 18 18 |  | 
| @@ -36,14 +36,17 @@ module RuboCop | |
| 36 36 | 
             
                  def report_summary(offense_counts)
         | 
| 37 37 | 
             
                    per_file_counts = ordered_offense_counts(offense_counts)
         | 
| 38 38 | 
             
                    total_count = total_offense_count(offense_counts)
         | 
| 39 | 
            +
                    file_count = per_file_counts.size
         | 
| 39 40 |  | 
| 40 41 | 
             
                    output.puts
         | 
| 41 42 |  | 
| 43 | 
            +
                    column_width = total_count.to_s.length + 2
         | 
| 42 44 | 
             
                    per_file_counts.each do |file_name, count|
         | 
| 43 | 
            -
                      output.puts "#{count.to_s.ljust( | 
| 45 | 
            +
                      output.puts "#{count.to_s.ljust(column_width)}#{file_name}\n"
         | 
| 44 46 | 
             
                    end
         | 
| 47 | 
            +
             | 
| 45 48 | 
             
                    output.puts '--'
         | 
| 46 | 
            -
                    output.puts "#{total_count}  Total"
         | 
| 49 | 
            +
                    output.puts "#{total_count}  Total in #{file_count} files"
         | 
| 47 50 |  | 
| 48 51 | 
             
                    output.puts
         | 
| 49 52 | 
             
                  end
         | 
    
        data/lib/rubocop/formatter.rb
    CHANGED
    
    | @@ -6,6 +6,7 @@ module RuboCop | |
| 6 6 |  | 
| 7 7 | 
             
                require_relative 'formatter/base_formatter'
         | 
| 8 8 | 
             
                require_relative 'formatter/simple_text_formatter'
         | 
| 9 | 
            +
             | 
| 9 10 | 
             
                # relies on simple text
         | 
| 10 11 | 
             
                require_relative 'formatter/clang_style_formatter'
         | 
| 11 12 | 
             
                require_relative 'formatter/disabled_config_formatter'
         | 
| @@ -18,11 +19,12 @@ module RuboCop | |
| 18 19 | 
             
                require_relative 'formatter/junit_formatter'
         | 
| 19 20 | 
             
                require_relative 'formatter/markdown_formatter'
         | 
| 20 21 | 
             
                require_relative 'formatter/offense_count_formatter'
         | 
| 22 | 
            +
                require_relative 'formatter/pacman_formatter'
         | 
| 21 23 | 
             
                require_relative 'formatter/progress_formatter'
         | 
| 22 24 | 
             
                require_relative 'formatter/quiet_formatter'
         | 
| 23 25 | 
             
                require_relative 'formatter/tap_formatter'
         | 
| 24 26 | 
             
                require_relative 'formatter/worst_offenders_formatter'
         | 
| 25 | 
            -
             | 
| 27 | 
            +
             | 
| 26 28 | 
             
                # relies on progress formatter
         | 
| 27 29 | 
             
                require_relative 'formatter/auto_gen_config_formatter'
         | 
| 28 30 |  | 
| @@ -0,0 +1,38 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            module RuboCop
         | 
| 4 | 
            +
              # @api private
         | 
| 5 | 
            +
              module OptimizedPatterns
         | 
| 6 | 
            +
                # A wrapper around patterns array to perform optimized search.
         | 
| 7 | 
            +
                # @api private
         | 
| 8 | 
            +
                class PatternsSet
         | 
| 9 | 
            +
                  def initialize(patterns)
         | 
| 10 | 
            +
                    @strings = Set.new
         | 
| 11 | 
            +
                    @patterns = []
         | 
| 12 | 
            +
                    partition_patterns(patterns)
         | 
| 13 | 
            +
                  end
         | 
| 14 | 
            +
             | 
| 15 | 
            +
                  def match?(path)
         | 
| 16 | 
            +
                    @strings.include?(path) || @patterns.any? { |pattern| PathUtil.match_path?(pattern, path) }
         | 
| 17 | 
            +
                  end
         | 
| 18 | 
            +
             | 
| 19 | 
            +
                  private
         | 
| 20 | 
            +
             | 
| 21 | 
            +
                  def partition_patterns(patterns)
         | 
| 22 | 
            +
                    patterns.each do |pattern|
         | 
| 23 | 
            +
                      if pattern.is_a?(String) && !pattern.match?(/[*{\[?]/)
         | 
| 24 | 
            +
                        @strings << pattern
         | 
| 25 | 
            +
                      else
         | 
| 26 | 
            +
                        @patterns << pattern
         | 
| 27 | 
            +
                      end
         | 
| 28 | 
            +
                    end
         | 
| 29 | 
            +
                  end
         | 
| 30 | 
            +
                end
         | 
| 31 | 
            +
             | 
| 32 | 
            +
                @cache = {}.compare_by_identity
         | 
| 33 | 
            +
             | 
| 34 | 
            +
                def self.from(patterns)
         | 
| 35 | 
            +
                  @cache[patterns] ||= PatternsSet.new(patterns)
         | 
| 36 | 
            +
                end
         | 
| 37 | 
            +
              end
         | 
| 38 | 
            +
            end
         | 
    
        data/lib/rubocop/options.rb
    CHANGED
    
    | @@ -1,7 +1,8 @@ | |
| 1 1 | 
             
            # frozen_string_literal: true
         | 
| 2 2 |  | 
| 3 3 | 
             
            require 'optparse'
         | 
| 4 | 
            -
             | 
| 4 | 
            +
            require_relative 'arguments_env'
         | 
| 5 | 
            +
            require_relative 'arguments_file'
         | 
| 5 6 |  | 
| 6 7 | 
             
            module RuboCop
         | 
| 7 8 | 
             
              class IncorrectCopNameError < StandardError; end
         | 
| @@ -24,7 +25,10 @@ module RuboCop | |
| 24 25 | 
             
                end
         | 
| 25 26 |  | 
| 26 27 | 
             
                def parse(command_line_args)
         | 
| 28 | 
            +
                  args_from_file = ArgumentsFile.read_as_arguments
         | 
| 29 | 
            +
                  args_from_env = ArgumentsEnv.read_as_arguments
         | 
| 27 30 | 
             
                  args = args_from_file.concat(args_from_env).concat(command_line_args)
         | 
| 31 | 
            +
             | 
| 28 32 | 
             
                  define_options.parse!(args)
         | 
| 29 33 |  | 
| 30 34 | 
             
                  @validator.validate_compatibility
         | 
| @@ -45,18 +49,6 @@ module RuboCop | |
| 45 49 |  | 
| 46 50 | 
             
                private
         | 
| 47 51 |  | 
| 48 | 
            -
                def args_from_file
         | 
| 49 | 
            -
                  if File.exist?('.rubocop') && !File.directory?('.rubocop')
         | 
| 50 | 
            -
                    File.read('.rubocop').shellsplit
         | 
| 51 | 
            -
                  else
         | 
| 52 | 
            -
                    []
         | 
| 53 | 
            -
                  end
         | 
| 54 | 
            -
                end
         | 
| 55 | 
            -
             | 
| 56 | 
            -
                def args_from_env
         | 
| 57 | 
            -
                  Shellwords.split(ENV.fetch('RUBOCOP_OPTS', ''))
         | 
| 58 | 
            -
                end
         | 
| 59 | 
            -
             | 
| 60 52 | 
             
                def define_options
         | 
| 61 53 | 
             
                  OptionParser.new do |opts|
         | 
| 62 54 | 
             
                    opts.banner = rainbow.wrap('Usage: rubocop [options] [file1, file2, ...]').bright
         | 
| @@ -73,7 +65,7 @@ module RuboCop | |
| 73 65 | 
             
                end
         | 
| 74 66 |  | 
| 75 67 | 
             
                def add_check_options(opts) # rubocop:disable Metrics/AbcSize, Metrics/MethodLength
         | 
| 76 | 
            -
                  section(opts, 'Basic Options') do
         | 
| 68 | 
            +
                  section(opts, 'Basic Options') do # rubocop:disable Metrics/BlockLength
         | 
| 77 69 | 
             
                    option(opts, '-l', '--lint') do
         | 
| 78 70 | 
             
                      @options[:only] ||= []
         | 
| 79 71 | 
             
                      @options[:only] << 'Lint'
         | 
| @@ -98,6 +90,7 @@ module RuboCop | |
| 98 90 | 
             
                    option(opts, '--force-default-config')
         | 
| 99 91 | 
             
                    option(opts, '-s', '--stdin FILE')
         | 
| 100 92 | 
             
                    option(opts, '-P', '--[no-]parallel')
         | 
| 93 | 
            +
                    option(opts, '--raise-cop-error')
         | 
| 101 94 | 
             
                    add_severity_option(opts)
         | 
| 102 95 | 
             
                  end
         | 
| 103 96 | 
             
                end
         | 
| @@ -169,10 +162,12 @@ module RuboCop | |
| 169 162 | 
             
                    end
         | 
| 170 163 |  | 
| 171 164 | 
             
                    option(opts, '--exclude-limit COUNT') { @validator.validate_exclude_limit_option }
         | 
| 165 | 
            +
                    option(opts, '--no-exclude-limit')
         | 
| 172 166 |  | 
| 173 167 | 
             
                    option(opts, '--[no-]offense-counts')
         | 
| 174 168 | 
             
                    option(opts, '--[no-]auto-gen-only-exclude')
         | 
| 175 169 | 
             
                    option(opts, '--[no-]auto-gen-timestamp')
         | 
| 170 | 
            +
                    option(opts, '--[no-]auto-gen-enforced-style')
         | 
| 176 171 | 
             
                  end
         | 
| 177 172 | 
             
                end
         | 
| 178 173 |  | 
| @@ -400,6 +395,12 @@ module RuboCop | |
| 400 395 | 
             
                end
         | 
| 401 396 |  | 
| 402 397 | 
             
                def validate_autocorrect
         | 
| 398 | 
            +
                  if @options.key?(:safe_autocorrect) && @options.key?(:autocorrect_all)
         | 
| 399 | 
            +
                    message = Rainbow(<<~MESSAGE).red
         | 
| 400 | 
            +
                      Error: Both safe and unsafe autocorrect options are specified, use only one.
         | 
| 401 | 
            +
                    MESSAGE
         | 
| 402 | 
            +
                    raise OptionArgumentError, message
         | 
| 403 | 
            +
                  end
         | 
| 403 404 | 
             
                  return if @options.key?(:autocorrect)
         | 
| 404 405 | 
             
                  return unless @options.key?(:disable_uncorrectable)
         | 
| 405 406 |  | 
| @@ -464,7 +465,7 @@ module RuboCop | |
| 464 465 |  | 
| 465 466 | 
             
              # This module contains help texts for command line options.
         | 
| 466 467 | 
             
              # @api private
         | 
| 467 | 
            -
              module OptionsHelp
         | 
| 468 | 
            +
              module OptionsHelp # rubocop:disable Metrics/ModuleLength
         | 
| 468 469 | 
             
                MAX_EXCL = RuboCop::Options::DEFAULT_MAXIMUM_EXCLUSION_ITEMS.to_s
         | 
| 469 470 | 
             
                FORMATTER_OPTION_LIST = RuboCop::Formatter::FormatterSet::BUILTIN_FORMATTERS_FOR_KEYS.keys
         | 
| 470 471 |  | 
| @@ -486,6 +487,13 @@ module RuboCop | |
| 486 487 | 
             
                  auto_gen_timestamp:
         | 
| 487 488 | 
             
                                                    ['Include the date and time when the --auto-gen-config',
         | 
| 488 489 | 
             
                                                     'was run in the file it generates. Default is true.'],
         | 
| 490 | 
            +
                  auto_gen_enforced_style:
         | 
| 491 | 
            +
                                                    ['Add a setting to the TODO configuration file to enforce',
         | 
| 492 | 
            +
                                                     'the style used, rather than a per-file exclusion',
         | 
| 493 | 
            +
                                                     'if one style is used in all files for cop with',
         | 
| 494 | 
            +
                                                     'EnforcedStyle as a configurable option',
         | 
| 495 | 
            +
                                                     'when the --auto-gen-config was run',
         | 
| 496 | 
            +
                                                     'in the file it generates. Default is true.'],
         | 
| 489 497 | 
             
                  auto_gen_only_exclude:
         | 
| 490 498 | 
             
                                                    ['Generate only Exclude parameters and not Max',
         | 
| 491 499 | 
             
                                                     'when running --auto-gen-config, except if the',
         | 
| @@ -497,6 +505,7 @@ module RuboCop | |
| 497 505 | 
             
                  disable_uncorrectable:            ['Used with --autocorrect to annotate any',
         | 
| 498 506 | 
             
                                                     'offenses that do not support autocorrect',
         | 
| 499 507 | 
             
                                                     'with `rubocop:todo` comments.'],
         | 
| 508 | 
            +
                  no_exclude_limit:                 ['Do not set the limit for how many files to exclude.'],
         | 
| 500 509 | 
             
                  force_exclusion:                  ['Any files excluded by `Exclude` in configuration',
         | 
| 501 510 | 
             
                                                     'files will be excluded, even if given explicitly',
         | 
| 502 511 | 
             
                                                     'as arguments.'],
         | 
| @@ -589,7 +598,10 @@ module RuboCop | |
| 589 598 | 
             
                  restart_server:                   'Restart server process.',
         | 
| 590 599 | 
             
                  start_server:                     'Start server process.',
         | 
| 591 600 | 
             
                  stop_server:                      'Stop server process.',
         | 
| 592 | 
            -
                  server_status:                    'Show server status.'
         | 
| 601 | 
            +
                  server_status:                    'Show server status.',
         | 
| 602 | 
            +
                  raise_cop_error:                  ['Raise cop-related errors with cause and location.',
         | 
| 603 | 
            +
                                                     'This is used to prevent cops from failing silently.',
         | 
| 604 | 
            +
                                                     'Default is false.']
         | 
| 593 605 | 
             
                }.freeze
         | 
| 594 606 | 
             
              end
         | 
| 595 607 | 
             
            end
         | 
    
        data/lib/rubocop/path_util.rb
    CHANGED
    
    | @@ -33,11 +33,18 @@ module RuboCop | |
| 33 33 | 
             
                  end
         | 
| 34 34 | 
             
                end
         | 
| 35 35 |  | 
| 36 | 
            +
                # rubocop:disable Metrics/MethodLength, Metrics/CyclomaticComplexity
         | 
| 36 37 | 
             
                def match_path?(pattern, path)
         | 
| 37 38 | 
             
                  case pattern
         | 
| 38 39 | 
             
                  when String
         | 
| 39 | 
            -
                     | 
| 40 | 
            -
                       | 
| 40 | 
            +
                    matches =
         | 
| 41 | 
            +
                      if pattern == path
         | 
| 42 | 
            +
                        true
         | 
| 43 | 
            +
                      elsif pattern.match?(/[*{\[?]/)
         | 
| 44 | 
            +
                        File.fnmatch?(pattern, path, File::FNM_PATHNAME | File::FNM_EXTGLOB)
         | 
| 45 | 
            +
                      end
         | 
| 46 | 
            +
             | 
| 47 | 
            +
                    matches || hidden_file_in_not_hidden_dir?(pattern, path)
         | 
| 41 48 | 
             
                  when Regexp
         | 
| 42 49 | 
             
                    begin
         | 
| 43 50 | 
             
                      pattern.match?(path)
         | 
| @@ -48,6 +55,7 @@ module RuboCop | |
| 48 55 | 
             
                    end
         | 
| 49 56 | 
             
                  end
         | 
| 50 57 | 
             
                end
         | 
| 58 | 
            +
                # rubocop:enable Metrics/MethodLength, Metrics/CyclomaticComplexity
         | 
| 51 59 |  | 
| 52 60 | 
             
                # Returns true for an absolute Unix or Windows path.
         | 
| 53 61 | 
             
                def absolute?(path)
         | 
| @@ -67,8 +75,12 @@ module RuboCop | |
| 67 75 | 
             
                  maybe_hidden_file?(path) && File.basename(path).start_with?('.')
         | 
| 68 76 | 
             
                end
         | 
| 69 77 |  | 
| 78 | 
            +
                HIDDEN_FILE_PATTERN = "#{File::SEPARATOR}."
         | 
| 79 | 
            +
             | 
| 70 80 | 
             
                # Loose check to reduce memory allocations
         | 
| 71 81 | 
             
                def maybe_hidden_file?(path)
         | 
| 82 | 
            +
                  return false unless path.include?(HIDDEN_FILE_PATTERN)
         | 
| 83 | 
            +
             | 
| 72 84 | 
             
                  separator_index = path.rindex(File::SEPARATOR)
         | 
| 73 85 | 
             
                  return false unless separator_index
         | 
| 74 86 |  | 
    
        data/lib/rubocop/result_cache.rb
    CHANGED
    
    
| @@ -28,7 +28,30 @@ module CopHelper | |
| 28 28 | 
             
                  file = file.path
         | 
| 29 29 | 
             
                end
         | 
| 30 30 |  | 
| 31 | 
            -
                RuboCop::ProcessedSource.new(source, ruby_version, file)
         | 
| 31 | 
            +
                processed_source = RuboCop::ProcessedSource.new(source, ruby_version, file)
         | 
| 32 | 
            +
                processed_source.config = configuration
         | 
| 33 | 
            +
                processed_source.registry = registry
         | 
| 34 | 
            +
                processed_source
         | 
| 35 | 
            +
              end
         | 
| 36 | 
            +
             | 
| 37 | 
            +
              def configuration
         | 
| 38 | 
            +
                @configuration ||= if defined?(config)
         | 
| 39 | 
            +
                                     config
         | 
| 40 | 
            +
                                   else
         | 
| 41 | 
            +
                                     RuboCop::Config.new({}, "#{Dir.pwd}/.rubocop.yml")
         | 
| 42 | 
            +
                                   end
         | 
| 43 | 
            +
              end
         | 
| 44 | 
            +
             | 
| 45 | 
            +
              def registry
         | 
| 46 | 
            +
                @registry ||= begin
         | 
| 47 | 
            +
                  keys = configuration.keys
         | 
| 48 | 
            +
                  cops =
         | 
| 49 | 
            +
                    keys.map { |directive| RuboCop::Cop::Registry.global.find_cops_by_directive(directive) }
         | 
| 50 | 
            +
                        .flatten
         | 
| 51 | 
            +
                  cops << cop_class if defined?(cop_class) && !cops.include?(cop_class)
         | 
| 52 | 
            +
                  cops.compact!
         | 
| 53 | 
            +
                  RuboCop::Cop::Registry.new(cops)
         | 
| 54 | 
            +
                end
         | 
| 32 55 | 
             
              end
         | 
| 33 56 |  | 
| 34 57 | 
             
              def autocorrect_source_file(source)
         | 
| @@ -2,7 +2,7 @@ | |
| 2 2 |  | 
| 3 3 | 
             
            require 'tmpdir'
         | 
| 4 4 |  | 
| 5 | 
            -
            RSpec.shared_context 'isolated environment' do
         | 
| 5 | 
            +
            RSpec.shared_context 'isolated environment' do # rubocop:disable Metrics/BlockLength
         | 
| 6 6 | 
             
              around do |example|
         | 
| 7 7 | 
             
                Dir.mktmpdir do |tmpdir|
         | 
| 8 8 | 
             
                  original_home = Dir.home
         | 
| @@ -36,6 +36,19 @@ RSpec.shared_context 'isolated environment' do | |
| 36 36 | 
             
                  end
         | 
| 37 37 | 
             
                end
         | 
| 38 38 | 
             
              end
         | 
| 39 | 
            +
             | 
| 40 | 
            +
              if RuboCop.const_defined?(:Server)
         | 
| 41 | 
            +
                around do |example|
         | 
| 42 | 
            +
                  RuboCop::Server::Cache.cache_root_path = nil
         | 
| 43 | 
            +
                  RuboCop::Server::Cache.instance_variable_set(:@project_dir_cache_key, nil)
         | 
| 44 | 
            +
                  begin
         | 
| 45 | 
            +
                    example.run
         | 
| 46 | 
            +
                  ensure
         | 
| 47 | 
            +
                    RuboCop::Server::Cache.cache_root_path = nil
         | 
| 48 | 
            +
                    RuboCop::Server::Cache.instance_variable_set(:@project_dir_cache_key, nil)
         | 
| 49 | 
            +
                  end
         | 
| 50 | 
            +
                end
         | 
| 51 | 
            +
              end
         | 
| 39 52 | 
             
            end
         | 
| 40 53 |  | 
| 41 54 | 
             
            RSpec.shared_context 'maintain registry' do
         | 
| @@ -3,10 +3,10 @@ | |
| 3 3 | 
             
            # Require this file to load code that supports testing using RSpec.
         | 
| 4 4 |  | 
| 5 5 | 
             
            require_relative 'cop_helper'
         | 
| 6 | 
            -
            require_relative 'host_environment_simulation_helper'
         | 
| 7 | 
            -
            require_relative 'shared_contexts'
         | 
| 8 6 | 
             
            require_relative 'expect_offense'
         | 
| 7 | 
            +
            require_relative 'host_environment_simulation_helper'
         | 
| 9 8 | 
             
            require_relative 'parallel_formatter'
         | 
| 9 | 
            +
            require_relative 'shared_contexts'
         | 
| 10 10 |  | 
| 11 11 | 
             
            RSpec.configure do |config|
         | 
| 12 12 | 
             
              config.include CopHelper
         | 
    
        data/lib/rubocop/runner.rb
    CHANGED
    
    | @@ -423,17 +423,21 @@ module RuboCop | |
| 423 423 | 
             
                end
         | 
| 424 424 |  | 
| 425 425 | 
             
                def get_processed_source(file)
         | 
| 426 | 
            -
                   | 
| 427 | 
            -
             | 
| 428 | 
            -
             | 
| 429 | 
            -
             | 
| 430 | 
            -
             | 
| 431 | 
            -
             | 
| 432 | 
            -
             | 
| 433 | 
            -
             | 
| 434 | 
            -
             | 
| 435 | 
            -
             | 
| 436 | 
            -
             | 
| 426 | 
            +
                  config = @config_store.for_file(file)
         | 
| 427 | 
            +
                  ruby_version = config.target_ruby_version
         | 
| 428 | 
            +
             | 
| 429 | 
            +
                  processed_source = if @options[:stdin]
         | 
| 430 | 
            +
                                       ProcessedSource.new(@options[:stdin], ruby_version, file)
         | 
| 431 | 
            +
                                     else
         | 
| 432 | 
            +
                                       begin
         | 
| 433 | 
            +
                                         ProcessedSource.from_file(file, ruby_version)
         | 
| 434 | 
            +
                                       rescue Errno::ENOENT
         | 
| 435 | 
            +
                                         raise RuboCop::Error, "No such file or directory: #{file}"
         | 
| 436 | 
            +
                                       end
         | 
| 437 | 
            +
                                     end
         | 
| 438 | 
            +
                  processed_source.config = config
         | 
| 439 | 
            +
                  processed_source.registry = mobilized_cop_classes(config)
         | 
| 440 | 
            +
                  processed_source
         | 
| 437 441 | 
             
                end
         | 
| 438 442 |  | 
| 439 443 | 
             
                # A Cop::Team instance is stateful and may change when inspecting.
         | 
    
        data/lib/rubocop/server/cache.rb
    CHANGED
    
    | @@ -103,9 +103,13 @@ module RuboCop | |
| 103 103 | 
             
                      dir.join('version')
         | 
| 104 104 | 
             
                    end
         | 
| 105 105 |  | 
| 106 | 
            +
                    def stderr_path
         | 
| 107 | 
            +
                      dir.join('stderr')
         | 
| 108 | 
            +
                    end
         | 
| 109 | 
            +
             | 
| 106 110 | 
             
                    def pid_running?
         | 
| 107 111 | 
             
                      Process.kill(0, pid_path.read.to_i) == 1
         | 
| 108 | 
            -
                    rescue Errno::ESRCH
         | 
| 112 | 
            +
                    rescue Errno::ESRCH, Errno::ENOENT
         | 
| 109 113 | 
             
                      false
         | 
| 110 114 | 
             
                    end
         | 
| 111 115 |  | 
    
        data/lib/rubocop/server/cli.rb
    CHANGED
    
    | @@ -1,6 +1,8 @@ | |
| 1 1 | 
             
            # frozen_string_literal: true
         | 
| 2 2 |  | 
| 3 3 | 
             
            require 'rainbow'
         | 
| 4 | 
            +
            require_relative '../arguments_env'
         | 
| 5 | 
            +
            require_relative '../arguments_file'
         | 
| 4 6 |  | 
| 5 7 | 
             
            #
         | 
| 6 8 | 
             
            # This code is based on https://github.com/fohte/rubocop-daemon.
         | 
| @@ -29,7 +31,7 @@ module RuboCop | |
| 29 31 | 
             
                    @exit = false
         | 
| 30 32 | 
             
                  end
         | 
| 31 33 |  | 
| 32 | 
            -
                  # rubocop:disable Metrics/MethodLength
         | 
| 34 | 
            +
                  # rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/MethodLength
         | 
| 33 35 | 
             
                  def run(argv = ARGV)
         | 
| 34 36 | 
             
                    unless Server.support_server?
         | 
| 35 37 | 
             
                      return error('RuboCop server is not supported by this Ruby.') if use_server_option?(argv)
         | 
| @@ -50,11 +52,16 @@ module RuboCop | |
| 50 52 | 
             
                      return error("#{server_command} cannot be combined with other options.")
         | 
| 51 53 | 
             
                    end
         | 
| 52 54 |  | 
| 55 | 
            +
                    if server_command.nil?
         | 
| 56 | 
            +
                      server_command = ArgumentsEnv.read_as_arguments.delete('--server') ||
         | 
| 57 | 
            +
                                       ArgumentsFile.read_as_arguments.delete('--server')
         | 
| 58 | 
            +
                    end
         | 
| 59 | 
            +
             | 
| 53 60 | 
             
                    run_command(server_command)
         | 
| 54 61 |  | 
| 55 62 | 
             
                    STATUS_SUCCESS
         | 
| 56 63 | 
             
                  end
         | 
| 57 | 
            -
                  # rubocop:enable Metrics/MethodLength
         | 
| 64 | 
            +
                  # rubocop:enable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/MethodLength
         | 
| 58 65 |  | 
| 59 66 | 
             
                  def exit?
         | 
| 60 67 | 
             
                    @exit
         | 
| @@ -23,6 +23,7 @@ module RuboCop | |
| 23 23 | 
             
                        args: ARGV.dup,
         | 
| 24 24 | 
             
                        body: $stdin.tty? ? '' : $stdin.read
         | 
| 25 25 | 
             
                      )
         | 
| 26 | 
            +
                      warn stderr unless stderr.empty?
         | 
| 26 27 | 
             
                      status
         | 
| 27 28 | 
             
                    end
         | 
| 28 29 |  | 
| @@ -43,6 +44,10 @@ module RuboCop | |
| 43 44 | 
             
                      RuboCop::Version::STRING != Cache.version_path.read
         | 
| 44 45 | 
             
                    end
         | 
| 45 46 |  | 
| 47 | 
            +
                    def stderr
         | 
| 48 | 
            +
                      Cache.stderr_path.read
         | 
| 49 | 
            +
                    end
         | 
| 50 | 
            +
             | 
| 46 51 | 
             
                    def status
         | 
| 47 52 | 
             
                      unless Cache.status_path.file?
         | 
| 48 53 | 
             
                        raise "RuboCop server: Could not find status file at: #{Cache.status_path}"
         |