rubocop 0.89.1 → 0.90.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 +79 -11
- data/lib/rubocop.rb +13 -0
- data/lib/rubocop/cached_data.rb +1 -0
- data/lib/rubocop/cli/command.rb +1 -0
- data/lib/rubocop/cli/command/auto_genenerate_config.rb +1 -0
- data/lib/rubocop/cli/command/base.rb +1 -0
- data/lib/rubocop/cli/command/execute_runner.rb +1 -0
- data/lib/rubocop/cli/command/init_dotfile.rb +1 -0
- data/lib/rubocop/cli/command/show_cops.rb +1 -0
- data/lib/rubocop/cli/command/version.rb +1 -0
- data/lib/rubocop/cli/environment.rb +1 -0
- data/lib/rubocop/comment_config.rb +5 -0
- data/lib/rubocop/config_loader.rb +17 -6
- data/lib/rubocop/config_loader_resolver.rb +1 -0
- data/lib/rubocop/config_obsoletion.rb +1 -0
- data/lib/rubocop/config_validator.rb +3 -0
- data/lib/rubocop/cop/base.rb +23 -0
- data/lib/rubocop/cop/bundler/gem_comment.rb +7 -3
- data/lib/rubocop/cop/commissioner.rb +47 -7
- data/lib/rubocop/cop/correctors/alignment_corrector.rb +4 -4
- data/lib/rubocop/cop/correctors/condition_corrector.rb +3 -5
- data/lib/rubocop/cop/correctors/empty_line_corrector.rb +9 -10
- data/lib/rubocop/cop/correctors/line_break_corrector.rb +2 -2
- data/lib/rubocop/cop/correctors/multiline_literal_brace_corrector.rb +8 -3
- data/lib/rubocop/cop/correctors/parentheses_corrector.rb +5 -8
- data/lib/rubocop/cop/correctors/percent_literal_corrector.rb +4 -9
- data/lib/rubocop/cop/correctors/punctuation_corrector.rb +8 -10
- data/lib/rubocop/cop/documentation.rb +22 -0
- data/lib/rubocop/cop/generator.rb +1 -0
- data/lib/rubocop/cop/layout/block_alignment.rb +23 -19
- data/lib/rubocop/cop/layout/class_structure.rb +10 -9
- data/lib/rubocop/cop/layout/closing_heredoc_indentation.rb +4 -6
- data/lib/rubocop/cop/layout/condition_position.rb +13 -15
- data/lib/rubocop/cop/layout/def_end_alignment.rb +7 -4
- data/lib/rubocop/cop/layout/dot_position.rb +21 -17
- data/lib/rubocop/cop/layout/empty_comment.rb +30 -23
- data/lib/rubocop/cop/layout/empty_line_after_guard_clause.rb +19 -16
- data/lib/rubocop/cop/layout/empty_line_after_magic_comment.rb +13 -13
- data/lib/rubocop/cop/layout/empty_line_after_multiline_condition.rb +144 -0
- data/lib/rubocop/cop/layout/empty_line_between_defs.rb +21 -23
- data/lib/rubocop/cop/layout/empty_lines.rb +6 -7
- data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +4 -6
- data/lib/rubocop/cop/layout/empty_lines_around_arguments.rb +7 -8
- data/lib/rubocop/cop/layout/empty_lines_around_attribute_accessor.rb +3 -6
- data/lib/rubocop/cop/layout/empty_lines_around_begin_body.rb +2 -5
- data/lib/rubocop/cop/layout/empty_lines_around_block_body.rb +2 -5
- data/lib/rubocop/cop/layout/empty_lines_around_class_body.rb +2 -5
- data/lib/rubocop/cop/layout/empty_lines_around_exception_handling_keywords.rb +2 -5
- data/lib/rubocop/cop/layout/empty_lines_around_method_body.rb +2 -5
- data/lib/rubocop/cop/layout/empty_lines_around_module_body.rb +2 -5
- data/lib/rubocop/cop/layout/end_alignment.rb +6 -7
- data/lib/rubocop/cop/layout/first_array_element_line_break.rb +2 -5
- data/lib/rubocop/cop/layout/first_hash_element_line_break.rb +2 -5
- data/lib/rubocop/cop/layout/first_method_argument_line_break.rb +4 -8
- data/lib/rubocop/cop/layout/first_method_parameter_line_break.rb +2 -5
- data/lib/rubocop/cop/layout/hash_alignment.rb +17 -20
- data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +15 -14
- data/lib/rubocop/cop/layout/heredoc_indentation.rb +14 -11
- data/lib/rubocop/cop/layout/initial_indentation.rb +6 -7
- data/lib/rubocop/cop/layout/leading_comment_space.rb +11 -9
- data/lib/rubocop/cop/layout/leading_empty_lines.rb +6 -11
- data/lib/rubocop/cop/layout/multiline_array_brace_layout.rb +2 -5
- data/lib/rubocop/cop/layout/multiline_array_line_breaks.rb +2 -5
- data/lib/rubocop/cop/layout/multiline_assignment_layout.rb +10 -14
- data/lib/rubocop/cop/layout/multiline_block_layout.rb +21 -19
- data/lib/rubocop/cop/layout/multiline_hash_brace_layout.rb +2 -5
- data/lib/rubocop/cop/layout/multiline_hash_key_line_breaks.rb +2 -5
- data/lib/rubocop/cop/layout/multiline_method_argument_line_breaks.rb +5 -9
- data/lib/rubocop/cop/layout/multiline_method_call_brace_layout.rb +2 -5
- data/lib/rubocop/cop/layout/multiline_method_definition_brace_layout.rb +2 -5
- data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +18 -21
- data/lib/rubocop/cop/layout/space_after_colon.rb +11 -7
- data/lib/rubocop/cop/layout/space_after_comma.rb +2 -5
- data/lib/rubocop/cop/layout/space_after_method_name.rb +5 -6
- data/lib/rubocop/cop/layout/space_after_not.rb +9 -11
- data/lib/rubocop/cop/layout/space_after_semicolon.rb +2 -5
- data/lib/rubocop/cop/layout/space_around_equals_in_parameter_default.rb +20 -15
- data/lib/rubocop/cop/layout/space_around_keyword.rb +17 -18
- data/lib/rubocop/cop/layout/space_around_operators.rb +17 -16
- data/lib/rubocop/cop/layout/space_before_block_braces.rb +23 -22
- data/lib/rubocop/cop/layout/space_before_comma.rb +3 -5
- data/lib/rubocop/cop/layout/space_before_comment.rb +10 -7
- data/lib/rubocop/cop/layout/space_before_first_arg.rb +7 -7
- data/lib/rubocop/cop/layout/space_before_semicolon.rb +2 -5
- data/lib/rubocop/cop/layout/space_in_lambda_literal.rb +9 -17
- data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +13 -16
- data/lib/rubocop/cop/layout/space_inside_array_percent_literal.rb +3 -8
- data/lib/rubocop/cop/layout/space_inside_block_braces.rb +17 -16
- data/lib/rubocop/cop/layout/space_inside_hash_literal_braces.rb +16 -19
- data/lib/rubocop/cop/layout/space_inside_parens.rb +9 -14
- data/lib/rubocop/cop/layout/space_inside_percent_literal_delimiters.rb +5 -10
- data/lib/rubocop/cop/layout/space_inside_range_literal.rb +8 -17
- data/lib/rubocop/cop/layout/space_inside_reference_brackets.rb +13 -16
- data/lib/rubocop/cop/layout/space_inside_string_interpolation.rb +10 -11
- data/lib/rubocop/cop/layout/trailing_empty_lines.rb +10 -15
- data/lib/rubocop/cop/layout/trailing_whitespace.rb +11 -11
- data/lib/rubocop/cop/lint/binary_operator_with_identical_operands.rb +1 -1
- data/lib/rubocop/cop/lint/constant_resolution.rb +1 -1
- data/lib/rubocop/cop/lint/duplicate_require.rb +41 -0
- data/lib/rubocop/cop/lint/duplicate_rescue_exception.rb +0 -11
- data/lib/rubocop/cop/lint/empty_file.rb +53 -0
- data/lib/rubocop/cop/lint/missing_super.rb +2 -2
- data/lib/rubocop/cop/lint/mixed_regexp_capture_types.rb +2 -35
- data/lib/rubocop/cop/lint/out_of_range_regexp_ref.rb +9 -19
- data/lib/rubocop/cop/lint/percent_string_array.rb +8 -12
- data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +4 -4
- data/lib/rubocop/cop/lint/top_level_return_with_argument.rb +1 -1
- data/lib/rubocop/cop/lint/trailing_comma_in_attribute_declaration.rb +57 -0
- data/lib/rubocop/cop/lint/useless_method_definition.rb +77 -0
- data/lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +2 -0
- data/lib/rubocop/cop/metrics/utils/code_length_calculator.rb +1 -0
- data/lib/rubocop/cop/mixin/alignment.rb +3 -0
- data/lib/rubocop/cop/mixin/allowed_methods.rb +2 -0
- data/lib/rubocop/cop/mixin/annotation_comment.rb +5 -0
- data/lib/rubocop/cop/mixin/check_line_breakable.rb +16 -7
- data/lib/rubocop/cop/mixin/comments_help.rb +54 -0
- data/lib/rubocop/cop/mixin/empty_lines_around_body.rb +8 -7
- data/lib/rubocop/cop/mixin/empty_parameter.rb +3 -1
- data/lib/rubocop/cop/mixin/end_keyword_alignment.rb +3 -1
- data/lib/rubocop/cop/mixin/first_element_line_break.rb +3 -1
- data/lib/rubocop/cop/mixin/hash_transform_method.rb +17 -0
- data/lib/rubocop/cop/mixin/multiline_element_line_breaks.rb +3 -1
- data/lib/rubocop/cop/mixin/multiline_literal_brace_layout.rb +12 -10
- data/lib/rubocop/cop/mixin/negative_conditional.rb +2 -2
- data/lib/rubocop/cop/mixin/percent_array.rb +14 -3
- data/lib/rubocop/cop/mixin/regexp_literal_help.rb +1 -1
- data/lib/rubocop/cop/mixin/rescue_node.rb +10 -1
- data/lib/rubocop/cop/mixin/space_after_punctuation.rb +4 -3
- data/lib/rubocop/cop/mixin/space_before_punctuation.rb +4 -3
- data/lib/rubocop/cop/mixin/surrounding_space.rb +8 -4
- data/lib/rubocop/cop/mixin/trailing_comma.rb +7 -7
- data/lib/rubocop/cop/offense.rb +1 -0
- data/lib/rubocop/cop/severity.rb +0 -8
- data/lib/rubocop/cop/style/case_equality.rb +8 -3
- data/lib/rubocop/cop/style/case_like_if.rb +20 -4
- data/lib/rubocop/cop/style/class_methods_definitions.rb +131 -0
- data/lib/rubocop/cop/style/combinable_loops.rb +89 -0
- data/lib/rubocop/cop/style/empty_block_parameter.rb +9 -10
- data/lib/rubocop/cop/style/empty_lambda_parameter.rb +9 -10
- data/lib/rubocop/cop/style/guard_clause.rb +1 -0
- data/lib/rubocop/cop/style/hash_syntax.rb +6 -5
- data/lib/rubocop/cop/style/hash_transform_keys.rb +14 -1
- data/lib/rubocop/cop/style/hash_transform_values.rb +14 -1
- data/lib/rubocop/cop/style/if_unless_modifier.rb +2 -2
- data/lib/rubocop/cop/style/keyword_parameters_order.rb +58 -0
- data/lib/rubocop/cop/style/method_called_on_do_end_block.rb +10 -1
- data/lib/rubocop/cop/style/multiline_when_then.rb +2 -2
- data/lib/rubocop/cop/style/negated_if.rb +6 -6
- data/lib/rubocop/cop/style/negated_unless.rb +6 -6
- data/lib/rubocop/cop/style/negated_while.rb +7 -15
- data/lib/rubocop/cop/style/nested_modifier.rb +10 -13
- data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +11 -11
- data/lib/rubocop/cop/style/nested_ternary_operator.rb +14 -16
- data/lib/rubocop/cop/style/next.rb +10 -14
- data/lib/rubocop/cop/style/nil_comparison.rb +11 -11
- data/lib/rubocop/cop/style/non_nil_check.rb +32 -26
- data/lib/rubocop/cop/style/not.rb +19 -26
- data/lib/rubocop/cop/style/numeric_literal_prefix.rb +4 -9
- data/lib/rubocop/cop/style/numeric_predicate.rb +4 -11
- data/lib/rubocop/cop/style/one_line_conditional.rb +71 -23
- data/lib/rubocop/cop/style/option_hash.rb +1 -1
- data/lib/rubocop/cop/style/optional_arguments.rb +1 -1
- data/lib/rubocop/cop/style/or_assignment.rb +13 -10
- data/lib/rubocop/cop/style/parallel_assignment.rb +14 -14
- data/lib/rubocop/cop/style/parentheses_around_condition.rb +6 -6
- data/lib/rubocop/cop/style/percent_literal_delimiters.rb +13 -19
- data/lib/rubocop/cop/style/percent_q_literals.rb +8 -10
- data/lib/rubocop/cop/style/perl_backrefs.rb +8 -10
- data/lib/rubocop/cop/style/preferred_hash_methods.rb +9 -14
- data/lib/rubocop/cop/style/proc.rb +6 -6
- data/lib/rubocop/cop/style/raise_args.rb +13 -24
- data/lib/rubocop/cop/style/random_with_offset.rb +15 -16
- data/lib/rubocop/cop/style/redundant_assignment.rb +8 -10
- data/lib/rubocop/cop/style/redundant_begin.rb +7 -9
- data/lib/rubocop/cop/style/redundant_capital_w.rb +6 -9
- data/lib/rubocop/cop/style/redundant_condition.rb +5 -6
- data/lib/rubocop/cop/style/redundant_fetch_block.rb +3 -12
- data/lib/rubocop/cop/style/redundant_file_extension_in_require.rb +8 -8
- data/lib/rubocop/cop/style/redundant_freeze.rb +3 -6
- data/lib/rubocop/cop/style/redundant_interpolation.rb +25 -24
- data/lib/rubocop/cop/style/redundant_parentheses.rb +7 -9
- data/lib/rubocop/cop/style/redundant_regexp_character_class.rb +6 -13
- data/lib/rubocop/cop/style/redundant_regexp_escape.rb +5 -14
- data/lib/rubocop/cop/style/redundant_self.rb +2 -2
- data/lib/rubocop/cop/style/redundant_self_assignment.rb +116 -0
- data/lib/rubocop/cop/style/regexp_literal.rb +10 -21
- data/lib/rubocop/cop/style/rescue_modifier.rb +29 -9
- data/lib/rubocop/cop/style/return_nil.rb +5 -5
- data/lib/rubocop/cop/style/safe_navigation.rb +13 -12
- data/lib/rubocop/cop/style/sample.rb +10 -13
- data/lib/rubocop/cop/style/self_assignment.rb +26 -22
- data/lib/rubocop/cop/style/semicolon.rb +6 -9
- data/lib/rubocop/cop/style/send.rb +2 -2
- data/lib/rubocop/cop/style/signal_exception.rb +21 -19
- data/lib/rubocop/cop/style/single_line_block_params.rb +4 -2
- data/lib/rubocop/cop/style/single_line_methods.rb +17 -16
- data/lib/rubocop/cop/style/slicing_with_range.rb +4 -7
- data/lib/rubocop/cop/style/sole_nested_conditional.rb +66 -0
- data/lib/rubocop/cop/style/special_global_vars.rb +10 -15
- data/lib/rubocop/cop/style/stabby_lambda_parentheses.rb +17 -21
- data/lib/rubocop/cop/style/stderr_puts.rb +4 -6
- data/lib/rubocop/cop/style/string_hash_keys.rb +6 -7
- data/lib/rubocop/cop/style/string_methods.rb +7 -17
- data/lib/rubocop/cop/style/strip.rb +8 -14
- data/lib/rubocop/cop/style/struct_inheritance.rb +3 -6
- data/lib/rubocop/cop/style/symbol_array.rb +5 -16
- data/lib/rubocop/cop/style/symbol_literal.rb +4 -6
- data/lib/rubocop/cop/style/symbol_proc.rb +14 -18
- data/lib/rubocop/cop/style/ternary_parentheses.rb +21 -20
- data/lib/rubocop/cop/style/trailing_body_on_class.rb +3 -6
- data/lib/rubocop/cop/style/trailing_body_on_method_definition.rb +4 -7
- data/lib/rubocop/cop/style/trailing_body_on_module.rb +3 -6
- data/lib/rubocop/cop/style/trailing_comma_in_arguments.rb +2 -5
- data/lib/rubocop/cop/style/trailing_comma_in_array_literal.rb +2 -5
- data/lib/rubocop/cop/style/trailing_comma_in_block_args.rb +7 -6
- data/lib/rubocop/cop/style/trailing_comma_in_hash_literal.rb +2 -5
- data/lib/rubocop/cop/style/trailing_underscore_variable.rb +8 -17
- data/lib/rubocop/cop/style/trivial_accessors.rb +26 -30
- data/lib/rubocop/cop/style/unless_else.rb +5 -8
- data/lib/rubocop/cop/style/unpack_first.rb +4 -8
- data/lib/rubocop/cop/style/variable_interpolation.rb +7 -10
- data/lib/rubocop/cop/style/when_then.rb +4 -6
- data/lib/rubocop/cop/style/while_until_do.rb +6 -16
- data/lib/rubocop/cop/style/while_until_modifier.rb +6 -20
- data/lib/rubocop/cop/style/word_array.rb +5 -23
- data/lib/rubocop/cop/style/yoda_condition.rb +4 -15
- data/lib/rubocop/cop/style/zero_length_predicate.rb +11 -13
- data/lib/rubocop/cop/team.rb +1 -0
- data/lib/rubocop/cop/util.rb +1 -1
- data/lib/rubocop/cop/utils/format_string.rb +3 -5
- data/lib/rubocop/cop/variable_force.rb +2 -0
- data/lib/rubocop/cops_documentation_generator.rb +4 -2
- data/lib/rubocop/core_ext/string.rb +1 -1
- data/lib/rubocop/ext/regexp_node.rb +46 -0
- data/lib/rubocop/file_finder.rb +1 -0
- data/lib/rubocop/formatter/auto_gen_config_formatter.rb +2 -1
- data/lib/rubocop/formatter/html_formatter.rb +2 -0
- data/lib/rubocop/formatter/progress_formatter.rb +2 -1
- data/lib/rubocop/formatter/quiet_formatter.rb +1 -1
- data/lib/rubocop/formatter/simple_text_formatter.rb +36 -6
- data/lib/rubocop/name_similarity.rb +1 -0
- data/lib/rubocop/options.rb +3 -0
- data/lib/rubocop/remote_config.rb +1 -0
- data/lib/rubocop/result_cache.rb +1 -0
- data/lib/rubocop/rspec/cop_helper.rb +4 -1
- data/lib/rubocop/rspec/expect_offense.rb +10 -5
- data/lib/rubocop/rspec/shared_contexts.rb +12 -0
- data/lib/rubocop/runner.rb +1 -0
- data/lib/rubocop/string_interpreter.rb +3 -0
- data/lib/rubocop/target_finder.rb +1 -0
- data/lib/rubocop/target_ruby.rb +6 -0
- data/lib/rubocop/version.rb +2 -1
- data/lib/rubocop/yaml_duplication_checker.rb +1 -0
- metadata +15 -2
| @@ -16,9 +16,10 @@ module RuboCop | |
| 16 16 | 
             
                  #
         | 
| 17 17 | 
             
                  #   # bad
         | 
| 18 18 | 
             
                  #   %x(  ls -l )
         | 
| 19 | 
            -
                  class SpaceInsidePercentLiteralDelimiters <  | 
| 19 | 
            +
                  class SpaceInsidePercentLiteralDelimiters < Base
         | 
| 20 20 | 
             
                    include MatchRange
         | 
| 21 21 | 
             
                    include PercentLiteral
         | 
| 22 | 
            +
                    extend AutoCorrector
         | 
| 22 23 |  | 
| 23 24 | 
             
                    MSG = 'Do not use spaces inside percent literal delimiters.'
         | 
| 24 25 | 
             
                    BEGIN_REGEX = /\A( +)/.freeze
         | 
| @@ -36,21 +37,15 @@ module RuboCop | |
| 36 37 | 
             
                      add_offenses_for_unnecessary_spaces(node)
         | 
| 37 38 | 
             
                    end
         | 
| 38 39 |  | 
| 39 | 
            -
                    def autocorrect(node)
         | 
| 40 | 
            -
                      lambda do |corrector|
         | 
| 41 | 
            -
                        regex_matches(node) do |match_range|
         | 
| 42 | 
            -
                          corrector.remove(match_range)
         | 
| 43 | 
            -
                        end
         | 
| 44 | 
            -
                      end
         | 
| 45 | 
            -
                    end
         | 
| 46 | 
            -
             | 
| 47 40 | 
             
                    private
         | 
| 48 41 |  | 
| 49 42 | 
             
                    def add_offenses_for_unnecessary_spaces(node)
         | 
| 50 43 | 
             
                      return unless node.single_line?
         | 
| 51 44 |  | 
| 52 45 | 
             
                      regex_matches(node) do |match_range|
         | 
| 53 | 
            -
                        add_offense( | 
| 46 | 
            +
                        add_offense(match_range) do |corrector|
         | 
| 47 | 
            +
                          corrector.remove(match_range)
         | 
| 48 | 
            +
                        end
         | 
| 54 49 | 
             
                      end
         | 
| 55 50 | 
             
                    end
         | 
| 56 51 |  | 
| @@ -17,7 +17,9 @@ module RuboCop | |
| 17 17 | 
             
                  #
         | 
| 18 18 | 
             
                  #   # good
         | 
| 19 19 | 
             
                  #   'a'..'z'
         | 
| 20 | 
            -
                  class SpaceInsideRangeLiteral <  | 
| 20 | 
            +
                  class SpaceInsideRangeLiteral < Base
         | 
| 21 | 
            +
                    extend AutoCorrector
         | 
| 22 | 
            +
             | 
| 21 23 | 
             
                    MSG = 'Space inside range literal.'
         | 
| 22 24 |  | 
| 23 25 | 
             
                    def on_irange(node)
         | 
| @@ -28,21 +30,6 @@ module RuboCop | |
| 28 30 | 
             
                      check(node)
         | 
| 29 31 | 
             
                    end
         | 
| 30 32 |  | 
| 31 | 
            -
                    def autocorrect(node)
         | 
| 32 | 
            -
                      expression = node.source
         | 
| 33 | 
            -
                      operator = node.loc.operator.source
         | 
| 34 | 
            -
                      operator_escaped = operator.gsub(/\./, '\.')
         | 
| 35 | 
            -
             | 
| 36 | 
            -
                      lambda do |corrector|
         | 
| 37 | 
            -
                        corrector.replace(
         | 
| 38 | 
            -
                          node,
         | 
| 39 | 
            -
                          expression
         | 
| 40 | 
            -
                            .sub(/\s+#{operator_escaped}/, operator)
         | 
| 41 | 
            -
                            .sub(/#{operator_escaped}\s+/, operator)
         | 
| 42 | 
            -
                        )
         | 
| 43 | 
            -
                      end
         | 
| 44 | 
            -
                    end
         | 
| 45 | 
            -
             | 
| 46 33 | 
             
                    private
         | 
| 47 34 |  | 
| 48 35 | 
             
                    def check(node)
         | 
| @@ -55,7 +42,11 @@ module RuboCop | |
| 55 42 |  | 
| 56 43 | 
             
                      return unless /(\s#{escaped_op})|(#{escaped_op}\s)/.match?(expression)
         | 
| 57 44 |  | 
| 58 | 
            -
                      add_offense(node)
         | 
| 45 | 
            +
                      add_offense(node) do |corrector|
         | 
| 46 | 
            +
                        corrector.replace(
         | 
| 47 | 
            +
                          node, expression.sub(/\s+#{escaped_op}/, op).sub(/#{escaped_op}\s+/, op)
         | 
| 48 | 
            +
                        )
         | 
| 49 | 
            +
                      end
         | 
| 59 50 | 
             
                    end
         | 
| 60 51 | 
             
                  end
         | 
| 61 52 | 
             
                end
         | 
| @@ -53,9 +53,10 @@ module RuboCop | |
| 53 53 | 
             
                  #   # good
         | 
| 54 54 | 
             
                  #   foo[ ]
         | 
| 55 55 | 
             
                  #
         | 
| 56 | 
            -
                  class SpaceInsideReferenceBrackets <  | 
| 56 | 
            +
                  class SpaceInsideReferenceBrackets < Base
         | 
| 57 57 | 
             
                    include SurroundingSpace
         | 
| 58 58 | 
             
                    include ConfigurableEnforcedStyle
         | 
| 59 | 
            +
                    extend AutoCorrector
         | 
| 59 60 |  | 
| 60 61 | 
             
                    MSG = '%<command>s space inside reference brackets.'
         | 
| 61 62 | 
             
                    EMPTY_MSG = '%<command>s space inside empty reference brackets.'
         | 
| @@ -83,24 +84,20 @@ module RuboCop | |
| 83 84 | 
             
                      end
         | 
| 84 85 | 
             
                    end
         | 
| 85 86 |  | 
| 86 | 
            -
                     | 
| 87 | 
            -
             | 
| 88 | 
            -
             | 
| 89 | 
            -
             | 
| 90 | 
            -
             | 
| 91 | 
            -
             | 
| 92 | 
            -
             | 
| 93 | 
            -
             | 
| 94 | 
            -
             | 
| 95 | 
            -
             | 
| 96 | 
            -
                         | 
| 97 | 
            -
                          SpaceCorrector.add_space(processed_source, corrector, left, right)
         | 
| 98 | 
            -
                        end
         | 
| 87 | 
            +
                    private
         | 
| 88 | 
            +
             | 
| 89 | 
            +
                    def autocorrect(corrector, node)
         | 
| 90 | 
            +
                      left, right = reference_brackets(node)
         | 
| 91 | 
            +
             | 
| 92 | 
            +
                      if empty_brackets?(left, right)
         | 
| 93 | 
            +
                        SpaceCorrector.empty_corrections(processed_source, corrector, empty_config, left, right)
         | 
| 94 | 
            +
                      elsif style == :no_space
         | 
| 95 | 
            +
                        SpaceCorrector.remove_space(processed_source, corrector, left, right)
         | 
| 96 | 
            +
                      else
         | 
| 97 | 
            +
                        SpaceCorrector.add_space(processed_source, corrector, left, right)
         | 
| 99 98 | 
             
                      end
         | 
| 100 99 | 
             
                    end
         | 
| 101 100 |  | 
| 102 | 
            -
                    private
         | 
| 103 | 
            -
             | 
| 104 101 | 
             
                    def reference_brackets(node)
         | 
| 105 102 | 
             
                      tokens = tokens(node)
         | 
| 106 103 | 
             
                      left = left_ref_bracket(node, tokens)
         | 
| @@ -18,11 +18,12 @@ module RuboCop | |
| 18 18 | 
             
                  #
         | 
| 19 19 | 
             
                  #   # good
         | 
| 20 20 | 
             
                  #      var = "This is the #{ space } example"
         | 
| 21 | 
            -
                  class SpaceInsideStringInterpolation <  | 
| 21 | 
            +
                  class SpaceInsideStringInterpolation < Base
         | 
| 22 22 | 
             
                    include Interpolation
         | 
| 23 23 | 
             
                    include SurroundingSpace
         | 
| 24 24 | 
             
                    include ConfigurableEnforcedStyle
         | 
| 25 25 | 
             
                    include RangeHelp
         | 
| 26 | 
            +
                    extend AutoCorrector
         | 
| 26 27 |  | 
| 27 28 | 
             
                    NO_SPACE_MSG = 'Space inside string interpolation detected.'
         | 
| 28 29 | 
             
                    SPACE_MSG = 'Missing space inside string interpolation detected.'
         | 
| @@ -40,20 +41,18 @@ module RuboCop | |
| 40 41 | 
             
                      end
         | 
| 41 42 | 
             
                    end
         | 
| 42 43 |  | 
| 43 | 
            -
                     | 
| 44 | 
            -
             | 
| 45 | 
            -
             | 
| 44 | 
            +
                    private
         | 
| 45 | 
            +
             | 
| 46 | 
            +
                    def autocorrect(corrector, begin_node)
         | 
| 47 | 
            +
                      delims = delimiters(begin_node)
         | 
| 46 48 |  | 
| 47 | 
            -
             | 
| 48 | 
            -
             | 
| 49 | 
            -
             | 
| 50 | 
            -
             | 
| 51 | 
            -
                        end
         | 
| 49 | 
            +
                      if style == :no_space
         | 
| 50 | 
            +
                        SpaceCorrector.remove_space(processed_source, corrector, *delims)
         | 
| 51 | 
            +
                      else
         | 
| 52 | 
            +
                        SpaceCorrector.add_space(processed_source, corrector, *delims)
         | 
| 52 53 | 
             
                      end
         | 
| 53 54 | 
             
                    end
         | 
| 54 55 |  | 
| 55 | 
            -
                    private
         | 
| 56 | 
            -
             | 
| 57 56 | 
             
                    def delimiters(begin_node)
         | 
| 58 57 | 
             
                      left = processed_source.tokens[index_of_first_token(begin_node)]
         | 
| 59 58 | 
             
                      right = processed_source.tokens[index_of_last_token(begin_node)]
         | 
| @@ -37,11 +37,12 @@ module RuboCop | |
| 37 37 | 
             
                  #   class Foo; end
         | 
| 38 38 | 
             
                  #   # EOF
         | 
| 39 39 | 
             
                  #
         | 
| 40 | 
            -
                  class TrailingEmptyLines <  | 
| 40 | 
            +
                  class TrailingEmptyLines < Base
         | 
| 41 41 | 
             
                    include ConfigurableEnforcedStyle
         | 
| 42 42 | 
             
                    include RangeHelp
         | 
| 43 | 
            +
                    extend AutoCorrector
         | 
| 43 44 |  | 
| 44 | 
            -
                    def  | 
| 45 | 
            +
                    def on_new_investigation
         | 
| 45 46 | 
             
                      buffer = processed_source.buffer
         | 
| 46 47 | 
             
                      return if buffer.source.empty?
         | 
| 47 48 |  | 
| @@ -57,28 +58,22 @@ module RuboCop | |
| 57 58 |  | 
| 58 59 | 
             
                      return unless blank_lines != wanted_blank_lines
         | 
| 59 60 |  | 
| 60 | 
            -
                      offense_detected(buffer, wanted_blank_lines, blank_lines,
         | 
| 61 | 
            -
                                       whitespace_at_end)
         | 
| 62 | 
            -
                    end
         | 
| 63 | 
            -
             | 
| 64 | 
            -
                    def autocorrect(range)
         | 
| 65 | 
            -
                      lambda do |corrector|
         | 
| 66 | 
            -
                        corrector.replace(range, style == :final_newline ? "\n" : "\n\n")
         | 
| 67 | 
            -
                      end
         | 
| 61 | 
            +
                      offense_detected(buffer, wanted_blank_lines, blank_lines, whitespace_at_end)
         | 
| 68 62 | 
             
                    end
         | 
| 69 63 |  | 
| 70 64 | 
             
                    private
         | 
| 71 65 |  | 
| 72 | 
            -
                    def offense_detected(buffer, wanted_blank_lines, blank_lines,
         | 
| 73 | 
            -
                                         whitespace_at_end)
         | 
| 66 | 
            +
                    def offense_detected(buffer, wanted_blank_lines, blank_lines, whitespace_at_end)
         | 
| 74 67 | 
             
                      begin_pos = buffer.source.length - whitespace_at_end.length
         | 
| 75 68 | 
             
                      autocorrect_range = range_between(begin_pos, buffer.source.length)
         | 
| 76 69 | 
             
                      begin_pos += 1 unless whitespace_at_end.empty?
         | 
| 77 70 | 
             
                      report_range = range_between(begin_pos, buffer.source.length)
         | 
| 78 71 |  | 
| 79 | 
            -
                      add_offense( | 
| 80 | 
            -
             | 
| 81 | 
            -
             | 
| 72 | 
            +
                      add_offense(
         | 
| 73 | 
            +
                        report_range, message: message(wanted_blank_lines, blank_lines)
         | 
| 74 | 
            +
                      ) do |corrector|
         | 
| 75 | 
            +
                        corrector.replace(autocorrect_range, style == :final_newline ? "\n" : "\n\n")
         | 
| 76 | 
            +
                      end
         | 
| 82 77 | 
             
                    end
         | 
| 83 78 |  | 
| 84 79 | 
             
                    def ends_in_end?(processed_source)
         | 
| @@ -28,12 +28,13 @@ module RuboCop | |
| 28 28 | 
             
                  #     x = 0
         | 
| 29 29 | 
             
                  #   RUBY
         | 
| 30 30 | 
             
                  #
         | 
| 31 | 
            -
                  class TrailingWhitespace <  | 
| 31 | 
            +
                  class TrailingWhitespace < Base
         | 
| 32 32 | 
             
                    include RangeHelp
         | 
| 33 | 
            +
                    extend AutoCorrector
         | 
| 33 34 |  | 
| 34 35 | 
             
                    MSG = 'Trailing whitespace detected.'
         | 
| 35 36 |  | 
| 36 | 
            -
                    def  | 
| 37 | 
            +
                    def on_new_investigation
         | 
| 37 38 | 
             
                      heredoc_ranges = extract_heredoc_ranges(processed_source.ast)
         | 
| 38 39 | 
             
                      processed_source.lines.each_with_index do |line, index|
         | 
| 39 40 | 
             
                        lineno = index + 1
         | 
| @@ -41,18 +42,13 @@ module RuboCop | |
| 41 42 | 
             
                        next unless line.end_with?(' ', "\t")
         | 
| 42 43 | 
             
                        next if skip_heredoc? && inside_heredoc?(heredoc_ranges, lineno)
         | 
| 43 44 |  | 
| 44 | 
            -
                        range =  | 
| 45 | 
            -
             | 
| 46 | 
            -
             | 
| 47 | 
            -
             | 
| 48 | 
            -
                        add_offense(range, location: range)
         | 
| 45 | 
            +
                        range = offense_range(lineno, line)
         | 
| 46 | 
            +
                        add_offense(range) do |corrector|
         | 
| 47 | 
            +
                          corrector.remove(range)
         | 
| 48 | 
            +
                        end
         | 
| 49 49 | 
             
                      end
         | 
| 50 50 | 
             
                    end
         | 
| 51 51 |  | 
| 52 | 
            -
                    def autocorrect(range)
         | 
| 53 | 
            -
                      ->(corrector) { corrector.remove(range) }
         | 
| 54 | 
            -
                    end
         | 
| 55 | 
            -
             | 
| 56 52 | 
             
                    private
         | 
| 57 53 |  | 
| 58 54 | 
             
                    def skip_heredoc?
         | 
| @@ -71,6 +67,10 @@ module RuboCop | |
| 71 67 | 
             
                        (body.first_line...body.last_line)
         | 
| 72 68 | 
             
                      end
         | 
| 73 69 | 
             
                    end
         | 
| 70 | 
            +
             | 
| 71 | 
            +
                    def offense_range(lineno, line)
         | 
| 72 | 
            +
                      source_range(processed_source.buffer, lineno, (line.rstrip.length)...(line.length))
         | 
| 73 | 
            +
                    end
         | 
| 74 74 | 
             
                  end
         | 
| 75 75 | 
             
                end
         | 
| 76 76 | 
             
              end
         | 
| @@ -35,7 +35,7 @@ module RuboCop | |
| 35 35 | 
             
                      return unless node.binary_operation?
         | 
| 36 36 |  | 
| 37 37 | 
             
                      lhs, operation, rhs = *node
         | 
| 38 | 
            -
                      return if MATH_OPERATORS.include?(node.method_name) &&  | 
| 38 | 
            +
                      return if MATH_OPERATORS.include?(node.method_name) && lhs.basic_literal?
         | 
| 39 39 |  | 
| 40 40 | 
             
                      add_offense(node, message: format(MSG, op: operation)) if lhs == rhs
         | 
| 41 41 | 
             
                    end
         | 
| @@ -0,0 +1,41 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            module RuboCop
         | 
| 4 | 
            +
              module Cop
         | 
| 5 | 
            +
                module Lint
         | 
| 6 | 
            +
                  # This cop checks for duplicate `require`s and `require_relative`s.
         | 
| 7 | 
            +
                  #
         | 
| 8 | 
            +
                  # @example
         | 
| 9 | 
            +
                  #   # bad
         | 
| 10 | 
            +
                  #   require 'foo'
         | 
| 11 | 
            +
                  #   require 'bar'
         | 
| 12 | 
            +
                  #   require 'foo'
         | 
| 13 | 
            +
                  #
         | 
| 14 | 
            +
                  #   # good
         | 
| 15 | 
            +
                  #   require 'foo'
         | 
| 16 | 
            +
                  #   require 'bar'
         | 
| 17 | 
            +
                  #
         | 
| 18 | 
            +
                  class DuplicateRequire < Base
         | 
| 19 | 
            +
                    MSG = 'Duplicate `%<method>s` detected.'
         | 
| 20 | 
            +
                    REQUIRE_METHODS = %i[require require_relative].freeze
         | 
| 21 | 
            +
             | 
| 22 | 
            +
                    def_node_matcher :require_call?, <<~PATTERN
         | 
| 23 | 
            +
                      (send {nil? (const _ :Kernel)} {:#{REQUIRE_METHODS.join(' :')}} _)
         | 
| 24 | 
            +
                    PATTERN
         | 
| 25 | 
            +
             | 
| 26 | 
            +
                    def on_new_investigation
         | 
| 27 | 
            +
                      # Holds the known required files for a given parent node (used as key)
         | 
| 28 | 
            +
                      @required = Hash.new { |h, k| h[k] = Set.new }.compare_by_identity
         | 
| 29 | 
            +
                      super
         | 
| 30 | 
            +
                    end
         | 
| 31 | 
            +
             | 
| 32 | 
            +
                    def on_send(node)
         | 
| 33 | 
            +
                      return unless REQUIRE_METHODS.include?(node.method_name) && require_call?(node)
         | 
| 34 | 
            +
                      return if @required[node.parent].add?(node.first_argument)
         | 
| 35 | 
            +
             | 
| 36 | 
            +
                      add_offense(node, message: format(MSG, method: node.method_name))
         | 
| 37 | 
            +
                    end
         | 
| 38 | 
            +
                  end
         | 
| 39 | 
            +
                end
         | 
| 40 | 
            +
              end
         | 
| 41 | 
            +
            end
         | 
| @@ -0,0 +1,53 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            module RuboCop
         | 
| 4 | 
            +
              module Cop
         | 
| 5 | 
            +
                module Lint
         | 
| 6 | 
            +
                  # This cop enforces that Ruby source files are not empty.
         | 
| 7 | 
            +
                  #
         | 
| 8 | 
            +
                  # @example
         | 
| 9 | 
            +
                  #   # bad
         | 
| 10 | 
            +
                  #   # Empty file
         | 
| 11 | 
            +
                  #
         | 
| 12 | 
            +
                  #   # good
         | 
| 13 | 
            +
                  #   # File containing non commented source lines
         | 
| 14 | 
            +
                  #
         | 
| 15 | 
            +
                  # @example AllowComments: true (default)
         | 
| 16 | 
            +
                  #   # good
         | 
| 17 | 
            +
                  #   # File consisting only of comments
         | 
| 18 | 
            +
                  #
         | 
| 19 | 
            +
                  # @example AllowComments: false
         | 
| 20 | 
            +
                  #   # bad
         | 
| 21 | 
            +
                  #   # File consisting only of comments
         | 
| 22 | 
            +
                  #
         | 
| 23 | 
            +
                  class EmptyFile < Base
         | 
| 24 | 
            +
                    include RangeHelp
         | 
| 25 | 
            +
             | 
| 26 | 
            +
                    MSG = 'Empty file detected.'
         | 
| 27 | 
            +
             | 
| 28 | 
            +
                    def on_new_investigation
         | 
| 29 | 
            +
                      return unless offending?
         | 
| 30 | 
            +
             | 
| 31 | 
            +
                      range = source_range(processed_source.buffer, 1, 0)
         | 
| 32 | 
            +
                      add_offense(range)
         | 
| 33 | 
            +
                    end
         | 
| 34 | 
            +
             | 
| 35 | 
            +
                    private
         | 
| 36 | 
            +
             | 
| 37 | 
            +
                    def offending?
         | 
| 38 | 
            +
                      empty_file? || (!cop_config['AllowComments'] && contains_only_comments?)
         | 
| 39 | 
            +
                    end
         | 
| 40 | 
            +
             | 
| 41 | 
            +
                    def empty_file?
         | 
| 42 | 
            +
                      processed_source.buffer.source.empty?
         | 
| 43 | 
            +
                    end
         | 
| 44 | 
            +
             | 
| 45 | 
            +
                    def contains_only_comments?
         | 
| 46 | 
            +
                      processed_source.lines.all? do |line|
         | 
| 47 | 
            +
                        line.blank? || comment_line?(line)
         | 
| 48 | 
            +
                      end
         | 
| 49 | 
            +
                    end
         | 
| 50 | 
            +
                  end
         | 
| 51 | 
            +
                end
         | 
| 52 | 
            +
              end
         | 
| 53 | 
            +
            end
         | 
| @@ -56,8 +56,8 @@ module RuboCop | |
| 56 56 | 
             
                    def on_def(node)
         | 
| 57 57 | 
             
                      return unless offender?(node)
         | 
| 58 58 |  | 
| 59 | 
            -
                      if node.method?(:initialize)
         | 
| 60 | 
            -
                        add_offense(node, message: CONSTRUCTOR_MSG) | 
| 59 | 
            +
                      if node.method?(:initialize) && inside_class_with_stateful_parent?(node)
         | 
| 60 | 
            +
                        add_offense(node, message: CONSTRUCTOR_MSG)
         | 
| 61 61 | 
             
                      elsif callback_method_def?(node)
         | 
| 62 62 | 
             
                        add_offense(node, message: CALLBACK_MSG)
         | 
| 63 63 | 
             
                      end
         | 
| @@ -25,44 +25,11 @@ module RuboCop | |
| 25 25 | 
             
                          'in a Regexp literal.'
         | 
| 26 26 |  | 
| 27 27 | 
             
                    def on_regexp(node)
         | 
| 28 | 
            -
                      return if  | 
| 29 | 
            -
             | 
| 30 | 
            -
                      begin
         | 
| 31 | 
            -
                        tree = Regexp::Parser.parse(node.content)
         | 
| 32 | 
            -
                      # Returns if a regular expression that cannot be processed by regexp_parser gem.
         | 
| 33 | 
            -
                      # https://github.com/rubocop-hq/rubocop/issues/8083
         | 
| 34 | 
            -
                      rescue Regexp::Scanner::ScannerError
         | 
| 35 | 
            -
                        return
         | 
| 36 | 
            -
                      end
         | 
| 37 | 
            -
             | 
| 38 | 
            -
                      return unless named_capture?(tree)
         | 
| 39 | 
            -
                      return unless numbered_capture?(tree)
         | 
| 28 | 
            +
                      return if node.each_capture(named: false).none?
         | 
| 29 | 
            +
                      return if node.each_capture(named: true).none?
         | 
| 40 30 |  | 
| 41 31 | 
             
                      add_offense(node)
         | 
| 42 32 | 
             
                    end
         | 
| 43 | 
            -
             | 
| 44 | 
            -
                    private
         | 
| 45 | 
            -
             | 
| 46 | 
            -
                    def contain_non_literal?(node)
         | 
| 47 | 
            -
                      if node.respond_to?(:type) && (node.variable? || node.send_type? || node.const_type?)
         | 
| 48 | 
            -
                        return true
         | 
| 49 | 
            -
                      end
         | 
| 50 | 
            -
                      return false unless node.respond_to?(:children)
         | 
| 51 | 
            -
             | 
| 52 | 
            -
                      node.children.any? { |child| contain_non_literal?(child) }
         | 
| 53 | 
            -
                    end
         | 
| 54 | 
            -
             | 
| 55 | 
            -
                    def named_capture?(tree)
         | 
| 56 | 
            -
                      tree.each_expression.any? do |e|
         | 
| 57 | 
            -
                        e.instance_of?(Regexp::Expression::Group::Capture)
         | 
| 58 | 
            -
                      end
         | 
| 59 | 
            -
                    end
         | 
| 60 | 
            -
             | 
| 61 | 
            -
                    def numbered_capture?(tree)
         | 
| 62 | 
            -
                      tree.each_expression.any? do |e|
         | 
| 63 | 
            -
                        e.instance_of?(Regexp::Expression::Group::Named)
         | 
| 64 | 
            -
                      end
         | 
| 65 | 
            -
                    end
         | 
| 66 33 | 
             
                  end
         | 
| 67 34 | 
             
                end
         | 
| 68 35 | 
             
              end
         |