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
 
| 
         @@ -0,0 +1,131 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # frozen_string_literal: true
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            module RuboCop
         
     | 
| 
      
 4 
     | 
    
         
            +
              module Cop
         
     | 
| 
      
 5 
     | 
    
         
            +
                module Style
         
     | 
| 
      
 6 
     | 
    
         
            +
                  # This cop enforces using `def self.method_name` or `class << self` to define class methods.
         
     | 
| 
      
 7 
     | 
    
         
            +
                  #
         
     | 
| 
      
 8 
     | 
    
         
            +
                  # @example EnforcedStyle: def_self (default)
         
     | 
| 
      
 9 
     | 
    
         
            +
                  #   # bad
         
     | 
| 
      
 10 
     | 
    
         
            +
                  #   class SomeClass
         
     | 
| 
      
 11 
     | 
    
         
            +
                  #     class << self
         
     | 
| 
      
 12 
     | 
    
         
            +
                  #       attr_accessor :class_accessor
         
     | 
| 
      
 13 
     | 
    
         
            +
                  #
         
     | 
| 
      
 14 
     | 
    
         
            +
                  #       def class_method
         
     | 
| 
      
 15 
     | 
    
         
            +
                  #         # ...
         
     | 
| 
      
 16 
     | 
    
         
            +
                  #       end
         
     | 
| 
      
 17 
     | 
    
         
            +
                  #     end
         
     | 
| 
      
 18 
     | 
    
         
            +
                  #   end
         
     | 
| 
      
 19 
     | 
    
         
            +
                  #
         
     | 
| 
      
 20 
     | 
    
         
            +
                  #   # good
         
     | 
| 
      
 21 
     | 
    
         
            +
                  #   class SomeClass
         
     | 
| 
      
 22 
     | 
    
         
            +
                  #     def self.class_method
         
     | 
| 
      
 23 
     | 
    
         
            +
                  #       # ...
         
     | 
| 
      
 24 
     | 
    
         
            +
                  #     end
         
     | 
| 
      
 25 
     | 
    
         
            +
                  #
         
     | 
| 
      
 26 
     | 
    
         
            +
                  #     class << self
         
     | 
| 
      
 27 
     | 
    
         
            +
                  #       attr_accessor :class_accessor
         
     | 
| 
      
 28 
     | 
    
         
            +
                  #     end
         
     | 
| 
      
 29 
     | 
    
         
            +
                  #   end
         
     | 
| 
      
 30 
     | 
    
         
            +
                  #
         
     | 
| 
      
 31 
     | 
    
         
            +
                  #   # good - contains private method
         
     | 
| 
      
 32 
     | 
    
         
            +
                  #   class SomeClass
         
     | 
| 
      
 33 
     | 
    
         
            +
                  #     class << self
         
     | 
| 
      
 34 
     | 
    
         
            +
                  #       attr_accessor :class_accessor
         
     | 
| 
      
 35 
     | 
    
         
            +
                  #
         
     | 
| 
      
 36 
     | 
    
         
            +
                  #       private
         
     | 
| 
      
 37 
     | 
    
         
            +
                  #
         
     | 
| 
      
 38 
     | 
    
         
            +
                  #       def private_class_method
         
     | 
| 
      
 39 
     | 
    
         
            +
                  #         # ...
         
     | 
| 
      
 40 
     | 
    
         
            +
                  #       end
         
     | 
| 
      
 41 
     | 
    
         
            +
                  #     end
         
     | 
| 
      
 42 
     | 
    
         
            +
                  #   end
         
     | 
| 
      
 43 
     | 
    
         
            +
                  #
         
     | 
| 
      
 44 
     | 
    
         
            +
                  # @example EnforcedStyle: self_class
         
     | 
| 
      
 45 
     | 
    
         
            +
                  #   # bad
         
     | 
| 
      
 46 
     | 
    
         
            +
                  #   class SomeClass
         
     | 
| 
      
 47 
     | 
    
         
            +
                  #     def self.class_method
         
     | 
| 
      
 48 
     | 
    
         
            +
                  #       # ...
         
     | 
| 
      
 49 
     | 
    
         
            +
                  #     end
         
     | 
| 
      
 50 
     | 
    
         
            +
                  #   end
         
     | 
| 
      
 51 
     | 
    
         
            +
                  #
         
     | 
| 
      
 52 
     | 
    
         
            +
                  #   # good
         
     | 
| 
      
 53 
     | 
    
         
            +
                  #   class SomeClass
         
     | 
| 
      
 54 
     | 
    
         
            +
                  #     class << self
         
     | 
| 
      
 55 
     | 
    
         
            +
                  #       def class_method
         
     | 
| 
      
 56 
     | 
    
         
            +
                  #         # ...
         
     | 
| 
      
 57 
     | 
    
         
            +
                  #       end
         
     | 
| 
      
 58 
     | 
    
         
            +
                  #     end
         
     | 
| 
      
 59 
     | 
    
         
            +
                  #   end
         
     | 
| 
      
 60 
     | 
    
         
            +
                  #
         
     | 
| 
      
 61 
     | 
    
         
            +
                  class ClassMethodsDefinitions < Base
         
     | 
| 
      
 62 
     | 
    
         
            +
                    include ConfigurableEnforcedStyle
         
     | 
| 
      
 63 
     | 
    
         
            +
                    include CommentsHelp
         
     | 
| 
      
 64 
     | 
    
         
            +
                    include VisibilityHelp
         
     | 
| 
      
 65 
     | 
    
         
            +
                    extend AutoCorrector
         
     | 
| 
      
 66 
     | 
    
         
            +
             
     | 
| 
      
 67 
     | 
    
         
            +
                    MSG = 'Use `%<preferred>s` to define class method.'
         
     | 
| 
      
 68 
     | 
    
         
            +
             
     | 
| 
      
 69 
     | 
    
         
            +
                    def on_sclass(node)
         
     | 
| 
      
 70 
     | 
    
         
            +
                      return unless def_self_style?
         
     | 
| 
      
 71 
     | 
    
         
            +
                      return unless node.identifier.source == 'self'
         
     | 
| 
      
 72 
     | 
    
         
            +
                      return if contains_non_public_methods?(node)
         
     | 
| 
      
 73 
     | 
    
         
            +
             
     | 
| 
      
 74 
     | 
    
         
            +
                      def_nodes(node).each do |def_node|
         
     | 
| 
      
 75 
     | 
    
         
            +
                        next unless node_visibility(def_node) == :public
         
     | 
| 
      
 76 
     | 
    
         
            +
             
     | 
| 
      
 77 
     | 
    
         
            +
                        message = format(MSG, preferred: "def self.#{def_node.method_name}")
         
     | 
| 
      
 78 
     | 
    
         
            +
                        add_offense(def_node, message: message) do |corrector|
         
     | 
| 
      
 79 
     | 
    
         
            +
                          extract_def_from_sclass(def_node, node, corrector)
         
     | 
| 
      
 80 
     | 
    
         
            +
                        end
         
     | 
| 
      
 81 
     | 
    
         
            +
                      end
         
     | 
| 
      
 82 
     | 
    
         
            +
                    end
         
     | 
| 
      
 83 
     | 
    
         
            +
             
     | 
| 
      
 84 
     | 
    
         
            +
                    def on_defs(node)
         
     | 
| 
      
 85 
     | 
    
         
            +
                      return if def_self_style?
         
     | 
| 
      
 86 
     | 
    
         
            +
             
     | 
| 
      
 87 
     | 
    
         
            +
                      message = format(MSG, preferred: 'class << self')
         
     | 
| 
      
 88 
     | 
    
         
            +
                      add_offense(node, message: message)
         
     | 
| 
      
 89 
     | 
    
         
            +
                    end
         
     | 
| 
      
 90 
     | 
    
         
            +
             
     | 
| 
      
 91 
     | 
    
         
            +
                    private
         
     | 
| 
      
 92 
     | 
    
         
            +
             
     | 
| 
      
 93 
     | 
    
         
            +
                    def def_self_style?
         
     | 
| 
      
 94 
     | 
    
         
            +
                      style == :def_self
         
     | 
| 
      
 95 
     | 
    
         
            +
                    end
         
     | 
| 
      
 96 
     | 
    
         
            +
             
     | 
| 
      
 97 
     | 
    
         
            +
                    def contains_non_public_methods?(sclass_node)
         
     | 
| 
      
 98 
     | 
    
         
            +
                      def_nodes(sclass_node).any? { |def_node| node_visibility(def_node) != :public }
         
     | 
| 
      
 99 
     | 
    
         
            +
                    end
         
     | 
| 
      
 100 
     | 
    
         
            +
             
     | 
| 
      
 101 
     | 
    
         
            +
                    def def_nodes(sclass_node)
         
     | 
| 
      
 102 
     | 
    
         
            +
                      sclass_def = sclass_node.body
         
     | 
| 
      
 103 
     | 
    
         
            +
                      return [] unless sclass_def
         
     | 
| 
      
 104 
     | 
    
         
            +
             
     | 
| 
      
 105 
     | 
    
         
            +
                      if sclass_def.def_type?
         
     | 
| 
      
 106 
     | 
    
         
            +
                        [sclass_def]
         
     | 
| 
      
 107 
     | 
    
         
            +
                      elsif sclass_def.begin_type?
         
     | 
| 
      
 108 
     | 
    
         
            +
                        sclass_def.each_child_node(:def).to_a
         
     | 
| 
      
 109 
     | 
    
         
            +
                      else
         
     | 
| 
      
 110 
     | 
    
         
            +
                        []
         
     | 
| 
      
 111 
     | 
    
         
            +
                      end
         
     | 
| 
      
 112 
     | 
    
         
            +
                    end
         
     | 
| 
      
 113 
     | 
    
         
            +
             
     | 
| 
      
 114 
     | 
    
         
            +
                    def extract_def_from_sclass(def_node, sclass_node, corrector)
         
     | 
| 
      
 115 
     | 
    
         
            +
                      range = source_range_with_comment(def_node)
         
     | 
| 
      
 116 
     | 
    
         
            +
                      source = range.source.sub!(
         
     | 
| 
      
 117 
     | 
    
         
            +
                        "def #{def_node.method_name}",
         
     | 
| 
      
 118 
     | 
    
         
            +
                        "def self.#{def_node.method_name}"
         
     | 
| 
      
 119 
     | 
    
         
            +
                      )
         
     | 
| 
      
 120 
     | 
    
         
            +
             
     | 
| 
      
 121 
     | 
    
         
            +
                      corrector.insert_before(sclass_node, "#{source}\n#{indent(sclass_node)}")
         
     | 
| 
      
 122 
     | 
    
         
            +
                      corrector.remove(range)
         
     | 
| 
      
 123 
     | 
    
         
            +
                    end
         
     | 
| 
      
 124 
     | 
    
         
            +
             
     | 
| 
      
 125 
     | 
    
         
            +
                    def indent(node)
         
     | 
| 
      
 126 
     | 
    
         
            +
                      ' ' * node.loc.column
         
     | 
| 
      
 127 
     | 
    
         
            +
                    end
         
     | 
| 
      
 128 
     | 
    
         
            +
                  end
         
     | 
| 
      
 129 
     | 
    
         
            +
                end
         
     | 
| 
      
 130 
     | 
    
         
            +
              end
         
     | 
| 
      
 131 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,89 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # frozen_string_literal: true
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            module RuboCop
         
     | 
| 
      
 4 
     | 
    
         
            +
              module Cop
         
     | 
| 
      
 5 
     | 
    
         
            +
                module Style
         
     | 
| 
      
 6 
     | 
    
         
            +
                  # This cop checks for places where multiple consecutive loops over the same data
         
     | 
| 
      
 7 
     | 
    
         
            +
                  # can be combined into a single loop. It is very likely that combining them
         
     | 
| 
      
 8 
     | 
    
         
            +
                  # will make the code more efficient and more concise.
         
     | 
| 
      
 9 
     | 
    
         
            +
                  #
         
     | 
| 
      
 10 
     | 
    
         
            +
                  # It is marked as unsafe, because the first loop might modify
         
     | 
| 
      
 11 
     | 
    
         
            +
                  # a state that the second loop depends on; these two aren't combinable.
         
     | 
| 
      
 12 
     | 
    
         
            +
                  #
         
     | 
| 
      
 13 
     | 
    
         
            +
                  # @example
         
     | 
| 
      
 14 
     | 
    
         
            +
                  #   # bad
         
     | 
| 
      
 15 
     | 
    
         
            +
                  #   def method
         
     | 
| 
      
 16 
     | 
    
         
            +
                  #     items.each do |item|
         
     | 
| 
      
 17 
     | 
    
         
            +
                  #       do_something(item)
         
     | 
| 
      
 18 
     | 
    
         
            +
                  #     end
         
     | 
| 
      
 19 
     | 
    
         
            +
                  #
         
     | 
| 
      
 20 
     | 
    
         
            +
                  #     items.each do |item|
         
     | 
| 
      
 21 
     | 
    
         
            +
                  #       do_something_else(item)
         
     | 
| 
      
 22 
     | 
    
         
            +
                  #     end
         
     | 
| 
      
 23 
     | 
    
         
            +
                  #   end
         
     | 
| 
      
 24 
     | 
    
         
            +
                  #
         
     | 
| 
      
 25 
     | 
    
         
            +
                  #   # good
         
     | 
| 
      
 26 
     | 
    
         
            +
                  #   def method
         
     | 
| 
      
 27 
     | 
    
         
            +
                  #     items.each do |item|
         
     | 
| 
      
 28 
     | 
    
         
            +
                  #       do_something(item)
         
     | 
| 
      
 29 
     | 
    
         
            +
                  #       do_something_else(item)
         
     | 
| 
      
 30 
     | 
    
         
            +
                  #     end
         
     | 
| 
      
 31 
     | 
    
         
            +
                  #   end
         
     | 
| 
      
 32 
     | 
    
         
            +
                  #
         
     | 
| 
      
 33 
     | 
    
         
            +
                  #   # bad
         
     | 
| 
      
 34 
     | 
    
         
            +
                  #   def method
         
     | 
| 
      
 35 
     | 
    
         
            +
                  #     for item in items do
         
     | 
| 
      
 36 
     | 
    
         
            +
                  #       do_something(item)
         
     | 
| 
      
 37 
     | 
    
         
            +
                  #     end
         
     | 
| 
      
 38 
     | 
    
         
            +
                  #
         
     | 
| 
      
 39 
     | 
    
         
            +
                  #     for item in items do
         
     | 
| 
      
 40 
     | 
    
         
            +
                  #       do_something_else(item)
         
     | 
| 
      
 41 
     | 
    
         
            +
                  #     end
         
     | 
| 
      
 42 
     | 
    
         
            +
                  #   end
         
     | 
| 
      
 43 
     | 
    
         
            +
                  #
         
     | 
| 
      
 44 
     | 
    
         
            +
                  #   # good
         
     | 
| 
      
 45 
     | 
    
         
            +
                  #   def method
         
     | 
| 
      
 46 
     | 
    
         
            +
                  #     for item in items do
         
     | 
| 
      
 47 
     | 
    
         
            +
                  #       do_something(item)
         
     | 
| 
      
 48 
     | 
    
         
            +
                  #       do_something_else(item)
         
     | 
| 
      
 49 
     | 
    
         
            +
                  #     end
         
     | 
| 
      
 50 
     | 
    
         
            +
                  #   end
         
     | 
| 
      
 51 
     | 
    
         
            +
                  #
         
     | 
| 
      
 52 
     | 
    
         
            +
                  class CombinableLoops < Base
         
     | 
| 
      
 53 
     | 
    
         
            +
                    MSG = 'Combine this loop with the previous loop.'
         
     | 
| 
      
 54 
     | 
    
         
            +
             
     | 
| 
      
 55 
     | 
    
         
            +
                    def on_block(node)
         
     | 
| 
      
 56 
     | 
    
         
            +
                      return unless collection_looping_method?(node)
         
     | 
| 
      
 57 
     | 
    
         
            +
             
     | 
| 
      
 58 
     | 
    
         
            +
                      sibling = left_sibling_of(node)
         
     | 
| 
      
 59 
     | 
    
         
            +
                      add_offense(node) if same_collection_looping?(node, sibling)
         
     | 
| 
      
 60 
     | 
    
         
            +
                    end
         
     | 
| 
      
 61 
     | 
    
         
            +
             
     | 
| 
      
 62 
     | 
    
         
            +
                    def on_for(node)
         
     | 
| 
      
 63 
     | 
    
         
            +
                      sibling = left_sibling_of(node)
         
     | 
| 
      
 64 
     | 
    
         
            +
                      add_offense(node) if sibling&.for_type? && node.collection == sibling.collection
         
     | 
| 
      
 65 
     | 
    
         
            +
                    end
         
     | 
| 
      
 66 
     | 
    
         
            +
             
     | 
| 
      
 67 
     | 
    
         
            +
                    private
         
     | 
| 
      
 68 
     | 
    
         
            +
             
     | 
| 
      
 69 
     | 
    
         
            +
                    def collection_looping_method?(node)
         
     | 
| 
      
 70 
     | 
    
         
            +
                      method_name = node.send_node.method_name
         
     | 
| 
      
 71 
     | 
    
         
            +
                      method_name.match?(/^each/) || method_name.match?(/_each$/)
         
     | 
| 
      
 72 
     | 
    
         
            +
                    end
         
     | 
| 
      
 73 
     | 
    
         
            +
             
     | 
| 
      
 74 
     | 
    
         
            +
                    def left_sibling_of(node)
         
     | 
| 
      
 75 
     | 
    
         
            +
                      return unless node.parent&.begin_type?
         
     | 
| 
      
 76 
     | 
    
         
            +
             
     | 
| 
      
 77 
     | 
    
         
            +
                      index = node.sibling_index - 1
         
     | 
| 
      
 78 
     | 
    
         
            +
                      node.parent.children[index] if index >= 0
         
     | 
| 
      
 79 
     | 
    
         
            +
                    end
         
     | 
| 
      
 80 
     | 
    
         
            +
             
     | 
| 
      
 81 
     | 
    
         
            +
                    def same_collection_looping?(node, sibling)
         
     | 
| 
      
 82 
     | 
    
         
            +
                      sibling&.block_type? &&
         
     | 
| 
      
 83 
     | 
    
         
            +
                        sibling.send_node.method?(node.method_name) &&
         
     | 
| 
      
 84 
     | 
    
         
            +
                        sibling.send_node.receiver == node.send_node.receiver
         
     | 
| 
      
 85 
     | 
    
         
            +
                    end
         
     | 
| 
      
 86 
     | 
    
         
            +
                  end
         
     | 
| 
      
 87 
     | 
    
         
            +
                end
         
     | 
| 
      
 88 
     | 
    
         
            +
              end
         
     | 
| 
      
 89 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -21,9 +21,10 @@ module RuboCop 
     | 
|
| 
       21 
21 
     | 
    
         
             
                  #
         
     | 
| 
       22 
22 
     | 
    
         
             
                  #   # good
         
     | 
| 
       23 
23 
     | 
    
         
             
                  #   a { do_something }
         
     | 
| 
       24 
     | 
    
         
            -
                  class EmptyBlockParameter <  
     | 
| 
      
 24 
     | 
    
         
            +
                  class EmptyBlockParameter < Base
         
     | 
| 
       25 
25 
     | 
    
         
             
                    include EmptyParameter
         
     | 
| 
       26 
26 
     | 
    
         
             
                    include RangeHelp
         
     | 
| 
      
 27 
     | 
    
         
            +
                    extend AutoCorrector
         
     | 
| 
       27 
28 
     | 
    
         | 
| 
       28 
29 
     | 
    
         
             
                    MSG = 'Omit pipes for the empty block parameters.'
         
     | 
| 
       29 
30 
     | 
    
         | 
| 
         @@ -32,15 +33,13 @@ module RuboCop 
     | 
|
| 
       32 
33 
     | 
    
         
             
                      check(node) unless send_node.send_type? && send_node.lambda_literal?
         
     | 
| 
       33 
34 
     | 
    
         
             
                    end
         
     | 
| 
       34 
35 
     | 
    
         | 
| 
       35 
     | 
    
         
            -
                     
     | 
| 
       36 
     | 
    
         
            -
             
     | 
| 
       37 
     | 
    
         
            -
             
     | 
| 
       38 
     | 
    
         
            -
             
     | 
| 
       39 
     | 
    
         
            -
             
     | 
| 
       40 
     | 
    
         
            -
             
     | 
| 
       41 
     | 
    
         
            -
             
     | 
| 
       42 
     | 
    
         
            -
                        corrector.remove(range)
         
     | 
| 
       43 
     | 
    
         
            -
                      end
         
     | 
| 
      
 36 
     | 
    
         
            +
                    private
         
     | 
| 
      
 37 
     | 
    
         
            +
             
     | 
| 
      
 38 
     | 
    
         
            +
                    def autocorrect(corrector, node)
         
     | 
| 
      
 39 
     | 
    
         
            +
                      block = node.parent
         
     | 
| 
      
 40 
     | 
    
         
            +
                      range = range_between(block.loc.begin.end_pos, node.loc.expression.end_pos)
         
     | 
| 
      
 41 
     | 
    
         
            +
             
     | 
| 
      
 42 
     | 
    
         
            +
                      corrector.remove(range)
         
     | 
| 
       44 
43 
     | 
    
         
             
                    end
         
     | 
| 
       45 
44 
     | 
    
         
             
                  end
         
     | 
| 
       46 
45 
     | 
    
         
             
                end
         
     | 
| 
         @@ -16,9 +16,10 @@ module RuboCop 
     | 
|
| 
       16 
16 
     | 
    
         
             
                  #
         
     | 
| 
       17 
17 
     | 
    
         
             
                  #   # good
         
     | 
| 
       18 
18 
     | 
    
         
             
                  #   -> (arg) { do_something(arg) }
         
     | 
| 
       19 
     | 
    
         
            -
                  class EmptyLambdaParameter <  
     | 
| 
      
 19 
     | 
    
         
            +
                  class EmptyLambdaParameter < Base
         
     | 
| 
       20 
20 
     | 
    
         
             
                    include EmptyParameter
         
     | 
| 
       21 
21 
     | 
    
         
             
                    include RangeHelp
         
     | 
| 
      
 22 
     | 
    
         
            +
                    extend AutoCorrector
         
     | 
| 
       22 
23 
     | 
    
         | 
| 
       23 
24 
     | 
    
         
             
                    MSG = 'Omit parentheses for the empty lambda parameters.'
         
     | 
| 
       24 
25 
     | 
    
         | 
| 
         @@ -29,15 +30,13 @@ module RuboCop 
     | 
|
| 
       29 
30 
     | 
    
         
             
                      check(node) if node.send_node.lambda_literal?
         
     | 
| 
       30 
31 
     | 
    
         
             
                    end
         
     | 
| 
       31 
32 
     | 
    
         | 
| 
       32 
     | 
    
         
            -
                     
     | 
| 
       33 
     | 
    
         
            -
             
     | 
| 
       34 
     | 
    
         
            -
             
     | 
| 
       35 
     | 
    
         
            -
             
     | 
| 
       36 
     | 
    
         
            -
             
     | 
| 
       37 
     | 
    
         
            -
             
     | 
| 
       38 
     | 
    
         
            -
             
     | 
| 
       39 
     | 
    
         
            -
                        corrector.remove(range)
         
     | 
| 
       40 
     | 
    
         
            -
                      end
         
     | 
| 
      
 33 
     | 
    
         
            +
                    private
         
     | 
| 
      
 34 
     | 
    
         
            +
             
     | 
| 
      
 35 
     | 
    
         
            +
                    def autocorrect(corrector, node)
         
     | 
| 
      
 36 
     | 
    
         
            +
                      send_node = node.parent.send_node
         
     | 
| 
      
 37 
     | 
    
         
            +
                      range = range_between(send_node.loc.expression.end_pos, node.loc.expression.end_pos)
         
     | 
| 
      
 38 
     | 
    
         
            +
             
     | 
| 
      
 39 
     | 
    
         
            +
                      corrector.remove(range)
         
     | 
| 
       41 
40 
     | 
    
         
             
                    end
         
     | 
| 
       42 
41 
     | 
    
         
             
                  end
         
     | 
| 
       43 
42 
     | 
    
         
             
                end
         
     | 
| 
         @@ -140,11 +140,12 @@ module RuboCop 
     | 
|
| 
       140 
140 
     | 
    
         
             
                    def acceptable_19_syntax_symbol?(sym_name)
         
     | 
| 
       141 
141 
     | 
    
         
             
                      sym_name.sub!(/\A:/, '')
         
     | 
| 
       142 
142 
     | 
    
         | 
| 
       143 
     | 
    
         
            -
                      if cop_config['PreferHashRocketsForNonAlnumEndingSymbols']
         
     | 
| 
       144 
     | 
    
         
            -
             
     | 
| 
       145 
     | 
    
         
            -
             
     | 
| 
       146 
     | 
    
         
            -
             
     | 
| 
       147 
     | 
    
         
            -
             
     | 
| 
      
 143 
     | 
    
         
            +
                      if cop_config['PreferHashRocketsForNonAlnumEndingSymbols'] &&
         
     | 
| 
      
 144 
     | 
    
         
            +
                         # Prefer { :production? => false } over { production?: false } and
         
     | 
| 
      
 145 
     | 
    
         
            +
                         # similarly for other non-alnum final characters (except quotes,
         
     | 
| 
      
 146 
     | 
    
         
            +
                         # to prefer { "x y": 1 } over { :"x y" => 1 }).
         
     | 
| 
      
 147 
     | 
    
         
            +
                         !/[\p{Alnum}"']\z/.match?(sym_name)
         
     | 
| 
      
 148 
     | 
    
         
            +
                        return false
         
     | 
| 
       148 
149 
     | 
    
         
             
                      end
         
     | 
| 
       149 
150 
     | 
    
         | 
| 
       150 
151 
     | 
    
         
             
                      # Most hash keys can be matched against a simple regex.
         
     | 
| 
         @@ -18,7 +18,9 @@ module RuboCop 
     | 
|
| 
       18 
18 
     | 
    
         
             
                  # @example
         
     | 
| 
       19 
19 
     | 
    
         
             
                  #   # bad
         
     | 
| 
       20 
20 
     | 
    
         
             
                  #   {a: 1, b: 2}.each_with_object({}) { |(k, v), h| h[foo(k)] = v }
         
     | 
| 
       21 
     | 
    
         
            -
                  #   {a: 1, b: 2}. 
     | 
| 
      
 21 
     | 
    
         
            +
                  #   Hash[{a: 1, b: 2}.collect { |k, v| [foo(k), v] }]
         
     | 
| 
      
 22 
     | 
    
         
            +
                  #   {a: 1, b: 2}.map { |k, v| [k.to_s, v] }.to_h
         
     | 
| 
      
 23 
     | 
    
         
            +
                  #   {a: 1, b: 2}.to_h { |k, v| [k.to_s, v] }
         
     | 
| 
       22 
24 
     | 
    
         
             
                  #
         
     | 
| 
       23 
25 
     | 
    
         
             
                  #   # good
         
     | 
| 
       24 
26 
     | 
    
         
             
                  #   {a: 1, b: 2}.transform_keys { |k| foo(k) }
         
     | 
| 
         @@ -68,6 +70,17 @@ module RuboCop 
     | 
|
| 
       68 
70 
     | 
    
         
             
                        :to_h)
         
     | 
| 
       69 
71 
     | 
    
         
             
                    PATTERN
         
     | 
| 
       70 
72 
     | 
    
         | 
| 
      
 73 
     | 
    
         
            +
                    def_node_matcher :on_bad_to_h, <<~PATTERN
         
     | 
| 
      
 74 
     | 
    
         
            +
                      (block
         
     | 
| 
      
 75 
     | 
    
         
            +
                        ({send csend}
         
     | 
| 
      
 76 
     | 
    
         
            +
                          !{(send _ :each_with_index) (array ...)}
         
     | 
| 
      
 77 
     | 
    
         
            +
                          :to_h)
         
     | 
| 
      
 78 
     | 
    
         
            +
                        (args
         
     | 
| 
      
 79 
     | 
    
         
            +
                          (arg $_)
         
     | 
| 
      
 80 
     | 
    
         
            +
                          (arg _val))
         
     | 
| 
      
 81 
     | 
    
         
            +
                        (array $_ $(lvar _val)))
         
     | 
| 
      
 82 
     | 
    
         
            +
                    PATTERN
         
     | 
| 
      
 83 
     | 
    
         
            +
             
     | 
| 
       71 
84 
     | 
    
         
             
                    private
         
     | 
| 
       72 
85 
     | 
    
         | 
| 
       73 
86 
     | 
    
         
             
                    def extract_captures(match)
         
     | 
| 
         @@ -18,7 +18,9 @@ module RuboCop 
     | 
|
| 
       18 
18 
     | 
    
         
             
                  # @example
         
     | 
| 
       19 
19 
     | 
    
         
             
                  #   # bad
         
     | 
| 
       20 
20 
     | 
    
         
             
                  #   {a: 1, b: 2}.each_with_object({}) { |(k, v), h| h[k] = foo(v) }
         
     | 
| 
       21 
     | 
    
         
            -
                  #   {a: 1, b: 2}. 
     | 
| 
      
 21 
     | 
    
         
            +
                  #   Hash[{a: 1, b: 2}.collect { |k, v| [k, foo(v)] }]
         
     | 
| 
      
 22 
     | 
    
         
            +
                  #   {a: 1, b: 2}.map { |k, v| [k, v * v] }.to_h
         
     | 
| 
      
 23 
     | 
    
         
            +
                  #   {a: 1, b: 2}.to_h { |k, v| [k, v * v] }
         
     | 
| 
       22 
24 
     | 
    
         
             
                  #
         
     | 
| 
       23 
25 
     | 
    
         
             
                  #   # good
         
     | 
| 
       24 
26 
     | 
    
         
             
                  #   {a: 1, b: 2}.transform_values { |v| foo(v) }
         
     | 
| 
         @@ -65,6 +67,17 @@ module RuboCop 
     | 
|
| 
       65 
67 
     | 
    
         
             
                        :to_h)
         
     | 
| 
       66 
68 
     | 
    
         
             
                    PATTERN
         
     | 
| 
       67 
69 
     | 
    
         | 
| 
      
 70 
     | 
    
         
            +
                    def_node_matcher :on_bad_to_h, <<~PATTERN
         
     | 
| 
      
 71 
     | 
    
         
            +
                      (block
         
     | 
| 
      
 72 
     | 
    
         
            +
                        ({send csend}
         
     | 
| 
      
 73 
     | 
    
         
            +
                          !{(send _ :each_with_index) (array ...)}
         
     | 
| 
      
 74 
     | 
    
         
            +
                          :to_h)
         
     | 
| 
      
 75 
     | 
    
         
            +
                        (args
         
     | 
| 
      
 76 
     | 
    
         
            +
                          (arg _key)
         
     | 
| 
      
 77 
     | 
    
         
            +
                          (arg $_))
         
     | 
| 
      
 78 
     | 
    
         
            +
                        (array $(lvar _key) $_))
         
     | 
| 
      
 79 
     | 
    
         
            +
                    PATTERN
         
     | 
| 
      
 80 
     | 
    
         
            +
             
     | 
| 
       68 
81 
     | 
    
         
             
                    private
         
     | 
| 
       69 
82 
     | 
    
         | 
| 
       70 
83 
     | 
    
         
             
                    def extract_captures(match)
         
     | 
| 
         @@ -43,8 +43,8 @@ module RuboCop 
     | 
|
| 
       43 
43 
     | 
    
         
             
                      'Modifier form of `%<keyword>s` makes the line too long.'
         
     | 
| 
       44 
44 
     | 
    
         | 
| 
       45 
45 
     | 
    
         
             
                    def on_if(node)
         
     | 
| 
       46 
     | 
    
         
            -
                      msg = if single_line_as_modifier?(node)
         
     | 
| 
       47 
     | 
    
         
            -
                              MSG_USE_MODIFIER 
     | 
| 
      
 46 
     | 
    
         
            +
                      msg = if single_line_as_modifier?(node) && !named_capture_in_condition?(node)
         
     | 
| 
      
 47 
     | 
    
         
            +
                              MSG_USE_MODIFIER
         
     | 
| 
       48 
48 
     | 
    
         
             
                            elsif too_long_due_to_modifier?(node)
         
     | 
| 
       49 
49 
     | 
    
         
             
                              MSG_USE_NORMAL
         
     | 
| 
       50 
50 
     | 
    
         
             
                            end
         
     | 
| 
         @@ -0,0 +1,58 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # frozen_string_literal: true
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            module RuboCop
         
     | 
| 
      
 4 
     | 
    
         
            +
              module Cop
         
     | 
| 
      
 5 
     | 
    
         
            +
                module Style
         
     | 
| 
      
 6 
     | 
    
         
            +
                  # This cop enforces that optional keyword parameters are placed at the
         
     | 
| 
      
 7 
     | 
    
         
            +
                  # end of the parameters list.
         
     | 
| 
      
 8 
     | 
    
         
            +
                  #
         
     | 
| 
      
 9 
     | 
    
         
            +
                  # This improves readability, because when looking through the source,
         
     | 
| 
      
 10 
     | 
    
         
            +
                  # it is expected to find required parameters at the beginning of parameters list
         
     | 
| 
      
 11 
     | 
    
         
            +
                  # and optional parameters at the end.
         
     | 
| 
      
 12 
     | 
    
         
            +
                  #
         
     | 
| 
      
 13 
     | 
    
         
            +
                  # @example
         
     | 
| 
      
 14 
     | 
    
         
            +
                  #   # bad
         
     | 
| 
      
 15 
     | 
    
         
            +
                  #   def some_method(first: false, second:, third: 10)
         
     | 
| 
      
 16 
     | 
    
         
            +
                  #     # body omitted
         
     | 
| 
      
 17 
     | 
    
         
            +
                  #   end
         
     | 
| 
      
 18 
     | 
    
         
            +
                  #
         
     | 
| 
      
 19 
     | 
    
         
            +
                  #   # good
         
     | 
| 
      
 20 
     | 
    
         
            +
                  #   def some_method(second:, first: false, third: 10)
         
     | 
| 
      
 21 
     | 
    
         
            +
                  #     # body omitted
         
     | 
| 
      
 22 
     | 
    
         
            +
                  #   end
         
     | 
| 
      
 23 
     | 
    
         
            +
                  #
         
     | 
| 
      
 24 
     | 
    
         
            +
                  class KeywordParametersOrder < Base
         
     | 
| 
      
 25 
     | 
    
         
            +
                    include RangeHelp
         
     | 
| 
      
 26 
     | 
    
         
            +
                    extend AutoCorrector
         
     | 
| 
      
 27 
     | 
    
         
            +
             
     | 
| 
      
 28 
     | 
    
         
            +
                    MSG = 'Place optional keyword parameters at the end of the parameters list.'
         
     | 
| 
      
 29 
     | 
    
         
            +
             
     | 
| 
      
 30 
     | 
    
         
            +
                    def on_kwoptarg(node)
         
     | 
| 
      
 31 
     | 
    
         
            +
                      kwarg_nodes = right_siblings_of(node).select(&:kwarg_type?)
         
     | 
| 
      
 32 
     | 
    
         
            +
                      return if kwarg_nodes.empty?
         
     | 
| 
      
 33 
     | 
    
         
            +
             
     | 
| 
      
 34 
     | 
    
         
            +
                      add_offense(node) do |corrector|
         
     | 
| 
      
 35 
     | 
    
         
            +
                        if node.parent.find(&:kwoptarg_type?) == node
         
     | 
| 
      
 36 
     | 
    
         
            +
                          corrector.insert_before(node, "#{kwarg_nodes.map(&:source).join(', ')}, ")
         
     | 
| 
      
 37 
     | 
    
         
            +
                          remove_kwargs(kwarg_nodes, corrector)
         
     | 
| 
      
 38 
     | 
    
         
            +
                        end
         
     | 
| 
      
 39 
     | 
    
         
            +
                      end
         
     | 
| 
      
 40 
     | 
    
         
            +
                    end
         
     | 
| 
      
 41 
     | 
    
         
            +
             
     | 
| 
      
 42 
     | 
    
         
            +
                    private
         
     | 
| 
      
 43 
     | 
    
         
            +
             
     | 
| 
      
 44 
     | 
    
         
            +
                    # TODO: Use API from `rubocop-ast` when released.
         
     | 
| 
      
 45 
     | 
    
         
            +
                    def right_siblings_of(node)
         
     | 
| 
      
 46 
     | 
    
         
            +
                      node.parent.children[node.sibling_index + 1..-1]
         
     | 
| 
      
 47 
     | 
    
         
            +
                    end
         
     | 
| 
      
 48 
     | 
    
         
            +
             
     | 
| 
      
 49 
     | 
    
         
            +
                    def remove_kwargs(kwarg_nodes, corrector)
         
     | 
| 
      
 50 
     | 
    
         
            +
                      kwarg_nodes.each do |kwarg|
         
     | 
| 
      
 51 
     | 
    
         
            +
                        with_space = range_with_surrounding_space(range: kwarg.source_range)
         
     | 
| 
      
 52 
     | 
    
         
            +
                        corrector.remove(range_with_surrounding_comma(with_space, :left))
         
     | 
| 
      
 53 
     | 
    
         
            +
                      end
         
     | 
| 
      
 54 
     | 
    
         
            +
                    end
         
     | 
| 
      
 55 
     | 
    
         
            +
                  end
         
     | 
| 
      
 56 
     | 
    
         
            +
                end
         
     | 
| 
      
 57 
     | 
    
         
            +
              end
         
     | 
| 
      
 58 
     | 
    
         
            +
            end
         
     |