rubocop 0.51.0 → 0.52.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 -2
- data/config/default.yml +86 -10
- data/config/disabled.yml +9 -4
- data/config/enabled.yml +1105 -1006
- data/lib/rubocop.rb +30 -3
- data/lib/rubocop/ast/builder.rb +2 -0
- data/lib/rubocop/ast/node.rb +24 -2
- data/lib/rubocop/ast/node/args_node.rb +17 -0
- data/lib/rubocop/ast/node/array_node.rb +1 -1
- data/lib/rubocop/ast/node/mixin/basic_literal_node.rb +16 -0
- data/lib/rubocop/ast/node/send_node.rb +20 -0
- data/lib/rubocop/ast/node/str_node.rb +14 -0
- data/lib/rubocop/ast/node/symbol_node.rb +20 -0
- data/lib/rubocop/ast/traversal.rb +4 -4
- data/lib/rubocop/cli.rb +45 -4
- data/lib/rubocop/comment_config.rb +2 -5
- data/lib/rubocop/config.rb +42 -8
- data/lib/rubocop/config_loader.rb +39 -100
- data/lib/rubocop/config_loader_resolver.rb +99 -2
- data/lib/rubocop/cop/autocorrect_logic.rb +1 -1
- data/lib/rubocop/cop/bundler/duplicated_gem.rb +7 -7
- data/lib/rubocop/cop/bundler/insecure_protocol_source.rb +4 -3
- data/lib/rubocop/cop/bundler/ordered_gems.rb +2 -2
- data/lib/rubocop/cop/cop.rb +16 -46
- data/lib/rubocop/cop/gemspec/duplicated_assignment.rb +102 -0
- data/lib/rubocop/cop/gemspec/ordered_dependencies.rb +3 -2
- data/lib/rubocop/cop/gemspec/required_ruby_version.rb +87 -0
- data/lib/rubocop/cop/generator.rb +23 -4
- data/lib/rubocop/cop/internal_affairs.rb +1 -1
- data/lib/rubocop/cop/internal_affairs/node_destructuring.rb +46 -0
- data/lib/rubocop/cop/internal_affairs/node_type_predicate.rb +2 -2
- data/lib/rubocop/cop/internal_affairs/offense_location_keyword.rb +9 -8
- data/lib/rubocop/cop/internal_affairs/redundant_location_argument.rb +1 -1
- data/lib/rubocop/cop/internal_affairs/redundant_message_argument.rb +1 -1
- data/lib/rubocop/cop/layout/access_modifier_indentation.rb +4 -7
- data/lib/rubocop/cop/layout/align_hash.rb +16 -16
- data/lib/rubocop/cop/layout/align_parameters.rb +6 -12
- data/lib/rubocop/cop/layout/block_end_newline.rb +19 -5
- data/lib/rubocop/cop/layout/case_indentation.rb +14 -17
- data/lib/rubocop/cop/layout/class_structure.rb +306 -0
- data/lib/rubocop/cop/layout/closing_parenthesis_indentation.rb +1 -0
- data/lib/rubocop/cop/layout/comment_indentation.rb +39 -2
- data/lib/rubocop/cop/layout/dot_position.rb +22 -13
- data/lib/rubocop/cop/layout/else_alignment.rb +6 -6
- data/lib/rubocop/cop/layout/empty_line_between_defs.rb +17 -17
- data/lib/rubocop/cop/layout/empty_lines.rb +15 -1
- data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +3 -2
- data/lib/rubocop/cop/layout/empty_lines_around_arguments.rb +89 -0
- data/lib/rubocop/cop/layout/empty_lines_around_begin_body.rb +2 -2
- data/lib/rubocop/cop/layout/empty_lines_around_block_body.rb +4 -8
- data/lib/rubocop/cop/layout/empty_lines_around_class_body.rb +30 -5
- data/lib/rubocop/cop/layout/empty_lines_around_exception_handling_keywords.rb +7 -3
- data/lib/rubocop/cop/layout/empty_lines_around_method_body.rb +2 -2
- data/lib/rubocop/cop/layout/empty_lines_around_module_body.rb +22 -7
- data/lib/rubocop/cop/layout/end_of_line.rb +1 -1
- data/lib/rubocop/cop/layout/extra_spacing.rb +21 -24
- data/lib/rubocop/cop/layout/first_parameter_indentation.rb +4 -1
- data/lib/rubocop/cop/layout/indent_array.rb +67 -20
- data/lib/rubocop/cop/layout/indent_hash.rb +70 -25
- data/lib/rubocop/cop/layout/indent_heredoc.rb +51 -11
- data/lib/rubocop/cop/layout/indentation_width.rb +24 -17
- data/lib/rubocop/cop/layout/initial_indentation.rb +7 -5
- data/lib/rubocop/cop/layout/leading_comment_space.rb +2 -2
- data/lib/rubocop/cop/layout/multiline_array_brace_layout.rb +47 -14
- data/lib/rubocop/cop/layout/multiline_assignment_layout.rb +10 -9
- data/lib/rubocop/cop/layout/multiline_block_layout.rb +19 -16
- data/lib/rubocop/cop/layout/multiline_hash_brace_layout.rb +46 -13
- data/lib/rubocop/cop/layout/multiline_method_call_indentation.rb +9 -10
- data/lib/rubocop/cop/layout/multiline_method_definition_brace_layout.rb +4 -0
- data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +9 -3
- data/lib/rubocop/cop/layout/space_after_colon.rb +4 -4
- data/lib/rubocop/cop/layout/space_after_comma.rb +3 -3
- data/lib/rubocop/cop/layout/space_after_method_name.rb +4 -4
- data/lib/rubocop/cop/layout/space_after_semicolon.rb +8 -1
- data/lib/rubocop/cop/layout/space_around_block_parameters.rb +16 -19
- data/lib/rubocop/cop/layout/space_around_equals_in_parameter_default.rb +27 -16
- data/lib/rubocop/cop/layout/space_around_keyword.rb +13 -11
- data/lib/rubocop/cop/layout/space_around_operators.rb +26 -13
- data/lib/rubocop/cop/layout/space_before_block_braces.rb +10 -10
- data/lib/rubocop/cop/layout/space_before_comma.rb +12 -1
- data/lib/rubocop/cop/layout/space_before_comment.rb +2 -4
- data/lib/rubocop/cop/layout/space_before_first_arg.rb +4 -3
- data/lib/rubocop/cop/layout/space_before_semicolon.rb +1 -1
- data/lib/rubocop/cop/layout/space_in_lambda_literal.rb +6 -12
- data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +235 -0
- data/lib/rubocop/cop/layout/space_inside_array_percent_literal.rb +3 -3
- data/lib/rubocop/cop/layout/space_inside_block_braces.rb +87 -16
- data/lib/rubocop/cop/layout/space_inside_hash_literal_braces.rb +57 -34
- data/lib/rubocop/cop/layout/space_inside_parens.rb +31 -3
- data/lib/rubocop/cop/layout/space_inside_range_literal.rb +15 -15
- data/lib/rubocop/cop/layout/space_inside_reference_brackets.rb +81 -0
- data/lib/rubocop/cop/layout/space_inside_string_interpolation.rb +24 -13
- data/lib/rubocop/cop/layout/tab.rb +2 -2
- data/lib/rubocop/cop/layout/trailing_blank_lines.rb +7 -7
- data/lib/rubocop/cop/lint/ambiguous_block_association.rb +11 -20
- data/lib/rubocop/cop/lint/block_alignment.rb +26 -23
- data/lib/rubocop/cop/lint/boolean_symbol.rb +1 -1
- data/lib/rubocop/cop/lint/def_end_alignment.rb +5 -10
- data/lib/rubocop/cop/lint/else_layout.rb +2 -2
- data/lib/rubocop/cop/lint/end_alignment.rb +13 -14
- data/lib/rubocop/cop/lint/ineffective_access_modifier.rb +3 -4
- data/lib/rubocop/cop/lint/inherit_exception.rb +10 -14
- data/lib/rubocop/cop/lint/missing_cop_enable_directive.rb +81 -0
- data/lib/rubocop/cop/lint/nested_percent_literal.rb +58 -0
- data/lib/rubocop/cop/lint/non_local_exit_from_iterator.rb +2 -2
- data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +1 -1
- data/lib/rubocop/cop/lint/percent_string_array.rb +14 -14
- data/lib/rubocop/cop/lint/percent_symbol_array.rb +11 -11
- data/lib/rubocop/cop/lint/redundant_with_index.rb +6 -3
- data/lib/rubocop/cop/lint/redundant_with_object.rb +1 -1
- data/lib/rubocop/cop/lint/require_parentheses.rb +3 -1
- data/lib/rubocop/cop/lint/rescue_type.rb +3 -3
- data/lib/rubocop/cop/lint/script_permission.rb +1 -0
- data/lib/rubocop/cop/lint/shadowed_argument.rb +146 -0
- data/lib/rubocop/cop/lint/string_conversion_in_interpolation.rb +6 -6
- data/lib/rubocop/cop/lint/unneeded_disable.rb +29 -11
- data/lib/rubocop/cop/lint/unneeded_require_statement.rb +2 -1
- data/lib/rubocop/cop/lint/unneeded_splat_expansion.rb +43 -17
- data/lib/rubocop/cop/message_annotator.rb +4 -2
- data/lib/rubocop/cop/metrics/abc_size.rb +2 -2
- data/lib/rubocop/cop/metrics/class_length.rb +3 -1
- data/lib/rubocop/cop/metrics/cyclomatic_complexity.rb +2 -1
- data/lib/rubocop/cop/metrics/line_length.rb +2 -2
- data/lib/rubocop/cop/metrics/module_length.rb +3 -1
- data/lib/rubocop/cop/metrics/parameter_lists.rb +9 -2
- data/lib/rubocop/cop/metrics/perceived_complexity.rb +2 -1
- data/lib/rubocop/cop/mixin/documentation_comment.rb +1 -1
- data/lib/rubocop/cop/mixin/empty_lines_around_body.rb +7 -5
- data/lib/rubocop/cop/mixin/empty_parameter.rb +23 -0
- data/lib/rubocop/cop/mixin/end_keyword_alignment.rb +7 -3
- data/lib/rubocop/cop/mixin/heredoc.rb +19 -19
- data/lib/rubocop/cop/mixin/method_complexity.rb +32 -8
- data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +7 -3
- data/lib/rubocop/cop/mixin/multiline_literal_brace_layout.rb +6 -4
- data/lib/rubocop/cop/mixin/negative_conditional.rb +3 -0
- data/lib/rubocop/cop/mixin/ordered_gem_node.rb +16 -12
- data/lib/rubocop/cop/mixin/parentheses.rb +12 -0
- data/lib/rubocop/cop/mixin/space_after_punctuation.rb +8 -8
- data/lib/rubocop/cop/mixin/space_before_punctuation.rb +10 -10
- data/lib/rubocop/cop/mixin/statement_modifier.rb +7 -17
- data/lib/rubocop/cop/mixin/surrounding_space.rb +95 -8
- data/lib/rubocop/cop/mixin/too_many_lines.rb +2 -2
- data/lib/rubocop/cop/mixin/trailing_comma.rb +22 -14
- data/lib/rubocop/cop/mixin/unused_argument.rb +3 -40
- data/lib/rubocop/cop/naming/accessor_method_name.rb +20 -10
- data/lib/rubocop/cop/naming/ascii_identifiers.rb +33 -0
- data/lib/rubocop/cop/naming/binary_operator_parameter_name.rb +5 -4
- data/lib/rubocop/cop/naming/class_and_module_camel_case.rb +16 -12
- data/lib/rubocop/cop/naming/constant_name.rb +32 -3
- data/lib/rubocop/cop/naming/file_name.rb +19 -8
- data/lib/rubocop/cop/naming/heredoc_delimiter_case.rb +10 -16
- data/lib/rubocop/cop/naming/method_name.rb +20 -14
- data/lib/rubocop/cop/naming/predicate_name.rb +7 -3
- data/lib/rubocop/cop/naming/variable_name.rb +17 -2
- data/lib/rubocop/cop/naming/variable_number.rb +10 -27
- data/lib/rubocop/cop/offense.rb +6 -1
- data/lib/rubocop/cop/performance/case_when_splat.rb +2 -6
- data/lib/rubocop/cop/performance/casecmp.rb +5 -4
- data/lib/rubocop/cop/performance/compare_with_block.rb +13 -7
- data/lib/rubocop/cop/performance/count.rb +5 -4
- data/lib/rubocop/cop/performance/detect.rb +7 -4
- data/lib/rubocop/cop/performance/double_start_end_with.rb +2 -7
- data/lib/rubocop/cop/performance/end_with.rb +2 -2
- data/lib/rubocop/cop/performance/flat_map.rb +3 -2
- data/lib/rubocop/cop/performance/hash_each_methods.rb +41 -40
- data/lib/rubocop/cop/performance/lstrip_rstrip.rb +5 -4
- data/lib/rubocop/cop/performance/redundant_block_call.rb +22 -22
- data/lib/rubocop/cop/performance/redundant_match.rb +2 -2
- data/lib/rubocop/cop/performance/redundant_merge.rb +6 -4
- data/lib/rubocop/cop/performance/redundant_sort_by.rb +4 -4
- data/lib/rubocop/cop/performance/regexp_match.rb +3 -2
- data/lib/rubocop/cop/performance/size.rb +2 -2
- data/lib/rubocop/cop/performance/start_with.rb +2 -2
- data/lib/rubocop/cop/performance/string_replacement.rb +4 -4
- data/lib/rubocop/cop/performance/times_map.rb +14 -15
- data/lib/rubocop/cop/performance/uri_default_parser.rb +3 -3
- data/lib/rubocop/cop/rails/action_filter.rb +22 -0
- data/lib/rubocop/cop/rails/active_support_aliases.rb +2 -2
- data/lib/rubocop/cop/rails/application_job.rb +4 -2
- data/lib/rubocop/cop/rails/application_record.rb +4 -2
- data/lib/rubocop/cop/rails/create_table_with_timestamps.rb +82 -0
- data/lib/rubocop/cop/rails/delegate.rb +20 -25
- data/lib/rubocop/cop/rails/delegate_allow_blank.rb +2 -2
- data/lib/rubocop/cop/rails/environment_comparison.rb +66 -0
- data/lib/rubocop/cop/rails/exit.rb +7 -0
- data/lib/rubocop/cop/rails/has_and_belongs_to_many.rb +7 -0
- data/lib/rubocop/cop/rails/has_many_or_has_one_dependent.rb +6 -2
- data/lib/rubocop/cop/rails/http_positional_arguments.rb +36 -41
- data/lib/rubocop/cop/rails/inverse_of.rb +96 -0
- data/lib/rubocop/cop/rails/lexically_scoped_action_filter.rb +112 -0
- data/lib/rubocop/cop/rails/output.rb +9 -0
- data/lib/rubocop/cop/rails/output_safety.rb +14 -20
- data/lib/rubocop/cop/rails/pluralization_grammar.rb +8 -8
- data/lib/rubocop/cop/rails/presence.rb +105 -0
- data/lib/rubocop/cop/rails/read_write_attribute.rb +10 -10
- data/lib/rubocop/cop/rails/redundant_receiver_in_with_options.rb +91 -0
- data/lib/rubocop/cop/rails/relative_date_constant.rb +9 -9
- data/lib/rubocop/cop/rails/reversible_migration.rb +3 -4
- data/lib/rubocop/cop/rails/safe_navigation.rb +5 -6
- data/lib/rubocop/cop/rails/save_bang.rb +2 -2
- data/lib/rubocop/cop/rails/uniq_before_pluck.rb +1 -1
- data/lib/rubocop/cop/rails/validation.rb +7 -7
- data/lib/rubocop/cop/security/json_load.rb +4 -2
- data/lib/rubocop/cop/security/marshal_load.rb +4 -2
- data/lib/rubocop/cop/style/alias.rb +24 -26
- data/lib/rubocop/cop/style/and_or.rb +34 -28
- data/lib/rubocop/cop/style/array_join.rb +9 -0
- data/lib/rubocop/cop/style/ascii_comments.rb +24 -4
- data/lib/rubocop/cop/style/attr.rb +14 -4
- data/lib/rubocop/cop/style/auto_resource_cleanup.rb +5 -3
- data/lib/rubocop/cop/style/bare_percent_literals.rb +31 -10
- data/lib/rubocop/cop/style/block_comments.rb +14 -2
- data/lib/rubocop/cop/style/block_delimiters.rb +80 -15
- data/lib/rubocop/cop/style/braces_around_hash_parameters.rb +81 -48
- data/lib/rubocop/cop/style/case_equality.rb +12 -0
- data/lib/rubocop/cop/style/character_literal.rb +10 -0
- data/lib/rubocop/cop/style/class_and_module_children.rb +6 -2
- data/lib/rubocop/cop/style/class_check.rb +28 -9
- data/lib/rubocop/cop/style/class_methods.rb +8 -8
- data/lib/rubocop/cop/style/class_vars.rb +4 -3
- data/lib/rubocop/cop/style/collection_methods.rb +4 -2
- data/lib/rubocop/cop/style/colon_method_call.rb +16 -0
- data/lib/rubocop/cop/style/colon_method_definition.rb +36 -0
- data/lib/rubocop/cop/style/command_literal.rb +70 -21
- data/lib/rubocop/cop/style/comment_annotation.rb +35 -10
- data/lib/rubocop/cop/style/commented_keyword.rb +12 -9
- data/lib/rubocop/cop/style/conditional_assignment.rb +10 -12
- data/lib/rubocop/cop/style/copyright.rb +19 -20
- data/lib/rubocop/cop/style/date_time.rb +2 -2
- data/lib/rubocop/cop/style/def_with_parentheses.rb +27 -2
- data/lib/rubocop/cop/style/dir.rb +2 -2
- data/lib/rubocop/cop/style/documentation.rb +17 -2
- data/lib/rubocop/cop/style/each_for_simple_loop.rb +7 -7
- data/lib/rubocop/cop/style/each_with_object.rb +5 -5
- data/lib/rubocop/cop/style/empty_block_parameter.rb +47 -0
- data/lib/rubocop/cop/style/empty_case_condition.rb +2 -2
- data/lib/rubocop/cop/style/empty_else.rb +52 -22
- data/lib/rubocop/cop/style/empty_lambda_parameter.rb +43 -0
- data/lib/rubocop/cop/style/empty_literal.rb +17 -5
- data/lib/rubocop/cop/style/empty_method.rb +4 -10
- data/lib/rubocop/cop/style/encoding.rb +2 -1
- data/lib/rubocop/cop/style/eval_with_location.rb +146 -0
- data/lib/rubocop/cop/style/even_odd.rb +4 -2
- data/lib/rubocop/cop/style/extend_self.rb +92 -0
- data/lib/rubocop/cop/style/flip_flop.rb +11 -0
- data/lib/rubocop/cop/style/format_string.rb +29 -2
- data/lib/rubocop/cop/style/format_string_token.rb +15 -14
- data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +4 -3
- data/lib/rubocop/cop/style/global_vars.rb +11 -1
- data/lib/rubocop/cop/style/hash_syntax.rb +44 -43
- data/lib/rubocop/cop/style/identical_conditional_branches.rb +8 -8
- data/lib/rubocop/cop/style/if_inside_else.rb +10 -10
- data/lib/rubocop/cop/style/if_unless_modifier.rb +7 -7
- data/lib/rubocop/cop/style/if_unless_modifier_of_if_unless.rb +2 -2
- data/lib/rubocop/cop/style/if_with_semicolon.rb +9 -0
- data/lib/rubocop/cop/style/implicit_runtime_error.rb +5 -5
- data/lib/rubocop/cop/style/infinite_loop.rb +2 -2
- data/lib/rubocop/cop/style/lambda.rb +23 -31
- data/lib/rubocop/cop/style/lambda_call.rb +15 -9
- data/lib/rubocop/cop/style/line_end_concatenation.rb +4 -4
- data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +2 -2
- data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +2 -2
- data/lib/rubocop/cop/style/method_def_parentheses.rb +4 -3
- data/lib/rubocop/cop/style/method_missing.rb +8 -8
- data/lib/rubocop/cop/style/min_max.rb +12 -12
- data/lib/rubocop/cop/style/missing_else.rb +5 -4
- data/lib/rubocop/cop/style/mixin_grouping.rb +29 -19
- data/lib/rubocop/cop/style/mixin_usage.rb +8 -10
- data/lib/rubocop/cop/style/module_function.rb +17 -5
- data/lib/rubocop/cop/style/multiline_if_modifier.rb +4 -4
- data/lib/rubocop/cop/style/multiline_if_then.rb +14 -13
- data/lib/rubocop/cop/style/multiline_memoization.rb +8 -14
- data/lib/rubocop/cop/style/mutable_constant.rb +12 -12
- data/lib/rubocop/cop/style/negated_if.rb +22 -30
- data/lib/rubocop/cop/style/negated_while.rb +1 -5
- data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +18 -17
- data/lib/rubocop/cop/style/next.rb +39 -11
- data/lib/rubocop/cop/style/nil_comparison.rb +6 -6
- data/lib/rubocop/cop/style/non_nil_check.rb +25 -22
- data/lib/rubocop/cop/style/not.rb +14 -4
- data/lib/rubocop/cop/style/numeric_literal_prefix.rb +6 -6
- data/lib/rubocop/cop/style/numeric_literals.rb +7 -7
- data/lib/rubocop/cop/style/numeric_predicate.rb +14 -18
- data/lib/rubocop/cop/style/one_line_conditional.rb +4 -4
- data/lib/rubocop/cop/style/option_hash.rb +11 -14
- data/lib/rubocop/cop/style/or_assignment.rb +2 -2
- data/lib/rubocop/cop/style/parallel_assignment.rb +13 -13
- data/lib/rubocop/cop/style/parentheses_around_condition.rb +19 -3
- data/lib/rubocop/cop/style/percent_literal_delimiters.rb +24 -3
- data/lib/rubocop/cop/style/percent_q_literals.rb +27 -6
- data/lib/rubocop/cop/style/perl_backrefs.rb +7 -0
- data/lib/rubocop/cop/style/preferred_hash_methods.rb +6 -10
- data/lib/rubocop/cop/style/proc.rb +8 -0
- data/lib/rubocop/cop/style/raise_args.rb +8 -14
- data/lib/rubocop/cop/style/random_with_offset.rb +160 -0
- data/lib/rubocop/cop/style/redundant_begin.rb +14 -4
- data/lib/rubocop/cop/style/redundant_conditional.rb +9 -8
- data/lib/rubocop/cop/style/redundant_return.rb +5 -4
- data/lib/rubocop/cop/style/redundant_self.rb +25 -26
- data/lib/rubocop/cop/style/regexp_literal.rb +74 -21
- data/lib/rubocop/cop/style/rescue_modifier.rb +11 -0
- data/lib/rubocop/cop/style/rescue_standard_error.rb +122 -0
- data/lib/rubocop/cop/style/return_nil.rb +4 -8
- data/lib/rubocop/cop/style/safe_navigation.rb +20 -2
- data/lib/rubocop/cop/style/self_assignment.rb +13 -13
- data/lib/rubocop/cop/style/semicolon.rb +18 -8
- data/lib/rubocop/cop/style/send.rb +9 -0
- data/lib/rubocop/cop/style/signal_exception.rb +100 -0
- data/lib/rubocop/cop/style/single_line_block_params.rb +2 -2
- data/lib/rubocop/cop/style/single_line_methods.rb +20 -8
- data/lib/rubocop/cop/style/special_global_vars.rb +16 -11
- data/lib/rubocop/cop/style/stabby_lambda_parentheses.rb +7 -12
- data/lib/rubocop/cop/style/stderr_puts.rb +5 -3
- data/lib/rubocop/cop/style/string_hash_keys.rb +36 -0
- data/lib/rubocop/cop/style/string_literals.rb +22 -0
- data/lib/rubocop/cop/style/string_literals_in_interpolation.rb +2 -8
- data/lib/rubocop/cop/style/string_methods.rb +18 -7
- data/lib/rubocop/cop/style/symbol_array.rb +5 -9
- data/lib/rubocop/cop/style/symbol_proc.rb +5 -4
- data/lib/rubocop/cop/style/ternary_parentheses.rb +31 -40
- data/lib/rubocop/cop/style/trailing_body_on_method_definition.rb +101 -0
- data/lib/rubocop/cop/style/trailing_comma_in_arguments.rb +20 -6
- data/lib/rubocop/cop/style/trailing_comma_in_literal.rb +22 -7
- data/lib/rubocop/cop/style/trailing_method_end_statement.rb +95 -0
- data/lib/rubocop/cop/style/trailing_underscore_variable.rb +8 -4
- data/lib/rubocop/cop/style/trivial_accessors.rb +32 -10
- data/lib/rubocop/cop/style/unless_else.rb +15 -0
- data/lib/rubocop/cop/style/unneeded_capital_w.rb +17 -7
- data/lib/rubocop/cop/style/unneeded_interpolation.rb +14 -18
- data/lib/rubocop/cop/style/unneeded_percent_q.rb +13 -12
- data/lib/rubocop/cop/style/variable_interpolation.rb +20 -9
- data/lib/rubocop/cop/style/when_then.rb +13 -0
- data/lib/rubocop/cop/style/while_until_do.rb +26 -4
- data/lib/rubocop/cop/style/while_until_modifier.rb +25 -6
- data/lib/rubocop/cop/style/word_array.rb +4 -8
- data/lib/rubocop/cop/style/yoda_condition.rb +10 -16
- data/lib/rubocop/cop/style/zero_length_predicate.rb +23 -15
- data/lib/rubocop/cop/util.rb +42 -33
- data/lib/rubocop/cop/variable_force.rb +1 -1
- data/lib/rubocop/cop/variable_force/assignment.rb +4 -2
- data/lib/rubocop/cop/variable_force/scope.rb +1 -5
- data/lib/rubocop/cop/variable_force/variable.rb +1 -1
- data/lib/rubocop/formatter/disabled_config_formatter.rb +2 -3
- data/lib/rubocop/formatter/formatter_set.rb +2 -1
- data/lib/rubocop/formatter/json_formatter.rb +9 -3
- data/lib/rubocop/formatter/quiet_formatter.rb +13 -0
- data/lib/rubocop/node_pattern.rb +2 -3
- data/lib/rubocop/options.rb +8 -8
- data/lib/rubocop/path_util.rb +15 -3
- data/lib/rubocop/processed_source.rb +5 -2
- data/lib/rubocop/rspec/shared_contexts.rb +4 -0
- data/lib/rubocop/runner.rb +1 -1
- data/lib/rubocop/token.rb +74 -0
- data/lib/rubocop/version.rb +1 -1
- metadata +37 -10
- data/lib/rubocop/cop/internal_affairs/deprecated_positional_arguments.rb +0 -81
- data/lib/rubocop/cop/layout/space_inside_brackets.rb +0 -20
- data/lib/rubocop/cop/lint/rescue_without_error_class.rb +0 -41
- data/lib/rubocop/cop/mixin/space_inside.rb +0 -76
@@ -56,19 +56,16 @@ module RuboCop
|
|
56
56
|
PERCENT_CAPITAL_W = '%W'.freeze
|
57
57
|
PERCENT_I = '%i'.freeze
|
58
58
|
PERCENT_CAPITAL_I = '%I'.freeze
|
59
|
-
ARRAY_NEW_PATTERN = '$(send (const nil? :Array) :new ...)'.freeze
|
60
59
|
ASSIGNMENT_TYPES = %i[lvasgn ivasgn cvasgn gvasgn].freeze
|
61
60
|
|
62
|
-
def_node_matcher :
|
63
|
-
|
61
|
+
def_node_matcher :array_new?, '$(send (const nil? :Array) :new ...)'
|
62
|
+
|
63
|
+
def_node_matcher :literal_expansion, <<-PATTERN
|
64
|
+
(splat {$({str dstr int float array} ...) (block $#array_new? ...) $#array_new?} ...)
|
64
65
|
PATTERN
|
65
66
|
|
66
67
|
def on_splat(node)
|
67
|
-
|
68
|
-
if object.send_type?
|
69
|
-
return unless ASSIGNMENT_TYPES.include?(node.parent.parent.type)
|
70
|
-
end
|
71
|
-
|
68
|
+
unneeded_splat_expansion(node) do
|
72
69
|
if array_splat?(node) &&
|
73
70
|
(method_argument?(node) || part_of_an_array?(node))
|
74
71
|
add_offense(node, message: ARRAY_PARAM_MSG)
|
@@ -78,20 +75,49 @@ module RuboCop
|
|
78
75
|
end
|
79
76
|
end
|
80
77
|
|
78
|
+
def autocorrect(node)
|
79
|
+
range, content = replacement_range_and_content(node)
|
80
|
+
|
81
|
+
lambda do |corrector|
|
82
|
+
corrector.replace(range, content)
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
81
86
|
private
|
82
87
|
|
83
|
-
def
|
88
|
+
def unneeded_splat_expansion(node)
|
89
|
+
literal_expansion(node) do |expanded_item|
|
90
|
+
if expanded_item.send_type?
|
91
|
+
return if array_new_inside_array_literal?(expanded_item)
|
92
|
+
|
93
|
+
grandparent = node.parent.parent
|
94
|
+
return if grandparent &&
|
95
|
+
!ASSIGNMENT_TYPES.include?(grandparent.type)
|
96
|
+
end
|
97
|
+
|
98
|
+
yield
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
def array_new_inside_array_literal?(array_new_node)
|
103
|
+
return false unless array_new?(array_new_node)
|
104
|
+
|
105
|
+
grandparent = array_new_node.parent.parent
|
106
|
+
grandparent.array_type? && grandparent.children.size > 1
|
107
|
+
end
|
108
|
+
|
109
|
+
def replacement_range_and_content(node)
|
84
110
|
variable, = *node
|
85
111
|
loc = node.loc
|
86
112
|
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
113
|
+
if array_new?(variable)
|
114
|
+
[node.parent.loc.expression, variable.source]
|
115
|
+
elsif !variable.array_type?
|
116
|
+
[loc.expression, "[#{variable.source}]"]
|
117
|
+
elsif unneeded_brackets?(node)
|
118
|
+
[loc.expression, remove_brackets(variable)]
|
119
|
+
else
|
120
|
+
[loc.operator, '']
|
95
121
|
end
|
96
122
|
end
|
97
123
|
|
@@ -103,8 +103,10 @@ module RuboCop
|
|
103
103
|
end
|
104
104
|
|
105
105
|
def display_cop_names?
|
106
|
-
|
107
|
-
|
106
|
+
return true if debug?
|
107
|
+
return false if options[:display_cop_names] == false
|
108
|
+
return true if options[:display_cop_names]
|
109
|
+
config.for_all_cops['DisplayCopNames']
|
108
110
|
end
|
109
111
|
|
110
112
|
def details
|
@@ -9,8 +9,8 @@ module RuboCop
|
|
9
9
|
class AbcSize < Cop
|
10
10
|
include MethodComplexity
|
11
11
|
|
12
|
-
MSG = 'Assignment Branch Condition size for
|
13
|
-
'[
|
12
|
+
MSG = 'Assignment Branch Condition size for %<method>s is too high. ' \
|
13
|
+
'[%<complexity>.4g/%<max>.4g]'.freeze
|
14
14
|
BRANCH_NODES = %i[send csend].freeze
|
15
15
|
CONDITION_NODES = CyclomaticComplexity::COUNTED_NODES.freeze
|
16
16
|
|
@@ -16,7 +16,8 @@ module RuboCop
|
|
16
16
|
class CyclomaticComplexity < Cop
|
17
17
|
include MethodComplexity
|
18
18
|
|
19
|
-
MSG = 'Cyclomatic complexity for
|
19
|
+
MSG = 'Cyclomatic complexity for %<method>s is too high. ' \
|
20
|
+
'[%<complexity>d/%<max>d]'.freeze
|
20
21
|
COUNTED_NODES = %i[if while until for
|
21
22
|
rescue when and or].freeze
|
22
23
|
|
@@ -11,7 +11,7 @@ module RuboCop
|
|
11
11
|
include ConfigurableMax
|
12
12
|
include IgnoredPattern
|
13
13
|
|
14
|
-
MSG = 'Line is too long. [
|
14
|
+
MSG = 'Line is too long. [%<length>d/%<max>d]'.freeze
|
15
15
|
|
16
16
|
def investigate(processed_source)
|
17
17
|
heredocs = extract_heredocs(processed_source.ast) if allow_heredoc?
|
@@ -43,7 +43,7 @@ module RuboCop
|
|
43
43
|
end
|
44
44
|
|
45
45
|
def register_offense(loc, line)
|
46
|
-
message = format(MSG, line.length, max)
|
46
|
+
message = format(MSG, length: line.length, max: max)
|
47
47
|
|
48
48
|
add_offense(nil, location: loc, message: message) do
|
49
49
|
self.max = line.length
|
@@ -9,12 +9,15 @@ module RuboCop
|
|
9
9
|
class ParameterLists < Cop
|
10
10
|
include ConfigurableMax
|
11
11
|
|
12
|
-
MSG = 'Avoid parameter lists longer than
|
12
|
+
MSG = 'Avoid parameter lists longer than %<max>d parameters. ' \
|
13
|
+
'[%<count>d/%<max>d]'.freeze
|
13
14
|
|
14
15
|
def on_args(node)
|
15
16
|
count = args_count(node)
|
16
17
|
return unless count > max_params
|
17
18
|
|
19
|
+
return if argument_to_lambda_or_proc?(node)
|
20
|
+
|
18
21
|
add_offense(node) do
|
19
22
|
self.max = count
|
20
23
|
end
|
@@ -22,8 +25,12 @@ module RuboCop
|
|
22
25
|
|
23
26
|
private
|
24
27
|
|
28
|
+
def_node_matcher :argument_to_lambda_or_proc?, <<-PATTERN
|
29
|
+
^lambda_or_proc?
|
30
|
+
PATTERN
|
31
|
+
|
25
32
|
def message(node)
|
26
|
-
format(MSG, max_params, args_count(node)
|
33
|
+
format(MSG, max: max_params, count: args_count(node))
|
27
34
|
end
|
28
35
|
|
29
36
|
def args_count(node)
|
@@ -29,7 +29,8 @@ module RuboCop
|
|
29
29
|
class PerceivedComplexity < Cop
|
30
30
|
include MethodComplexity
|
31
31
|
|
32
|
-
MSG = 'Perceived complexity for
|
32
|
+
MSG = 'Perceived complexity for %<method>s is too high. ' \
|
33
|
+
'[%<complexity>d/%<max>d]'.freeze
|
33
34
|
COUNTED_NODES = %i[if case while until
|
34
35
|
for rescue and or].freeze
|
35
36
|
|
@@ -9,9 +9,11 @@ module RuboCop
|
|
9
9
|
extend NodePattern::Macros
|
10
10
|
include ConfigurableEnforcedStyle
|
11
11
|
|
12
|
-
MSG_EXTRA = 'Extra empty line detected at
|
13
|
-
|
14
|
-
|
12
|
+
MSG_EXTRA = 'Extra empty line detected at %<kind>s body ' \
|
13
|
+
'%<location>s.'.freeze
|
14
|
+
MSG_MISSING = 'Empty line missing at %<kind>s body %<location>s.'.freeze
|
15
|
+
MSG_DEFERRED = 'Empty line missing before first %<type>s ' \
|
16
|
+
'definition'.freeze
|
15
17
|
|
16
18
|
def_node_matcher :constant_definition?, '{class module}'
|
17
19
|
def_node_matcher :empty_line_required?, '{def defs class module}'
|
@@ -154,11 +156,11 @@ module RuboCop
|
|
154
156
|
end
|
155
157
|
|
156
158
|
def message(type, desc)
|
157
|
-
format(type, self.class::KIND, desc)
|
159
|
+
format(type, kind: self.class::KIND, location: desc)
|
158
160
|
end
|
159
161
|
|
160
162
|
def deferred_message(node)
|
161
|
-
format(MSG_DEFERRED, node.type)
|
163
|
+
format(MSG_DEFERRED, type: node.type)
|
162
164
|
end
|
163
165
|
end
|
164
166
|
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RuboCop
|
4
|
+
module Cop
|
5
|
+
# Common code for empty parameter cops.
|
6
|
+
module EmptyParameter
|
7
|
+
extend NodePattern::Macros
|
8
|
+
|
9
|
+
private
|
10
|
+
|
11
|
+
def_node_matcher :empty_arguments?, <<-PATTERN
|
12
|
+
(block _ $(args) _)
|
13
|
+
PATTERN
|
14
|
+
|
15
|
+
def check(node)
|
16
|
+
empty_arguments?(node) do |args|
|
17
|
+
return if args.empty_and_without_delimiters?
|
18
|
+
add_offense(args)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -6,7 +6,8 @@ module RuboCop
|
|
6
6
|
module EndKeywordAlignment
|
7
7
|
include ConfigurableEnforcedStyle
|
8
8
|
|
9
|
-
MSG = '`end` at
|
9
|
+
MSG = '`end` at %<end_line>d, %<end_col>d is not aligned with ' \
|
10
|
+
'`%<source>s` at %<align_line>d, %<align_col>d.'.freeze
|
10
11
|
|
11
12
|
private
|
12
13
|
|
@@ -39,8 +40,11 @@ module RuboCop
|
|
39
40
|
|
40
41
|
def add_offense_for_misalignment(node, align_with)
|
41
42
|
end_loc = node.loc.end
|
42
|
-
msg = format(MSG, end_loc.line,
|
43
|
-
|
43
|
+
msg = format(MSG, end_line: end_loc.line,
|
44
|
+
end_col: end_loc.column,
|
45
|
+
source: align_with.source,
|
46
|
+
align_line: align_with.line,
|
47
|
+
align_col: align_with.column)
|
44
48
|
add_offense(node, location: end_loc, message: msg)
|
45
49
|
end
|
46
50
|
|
@@ -1,28 +1,28 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
|
4
|
-
module
|
5
|
-
|
3
|
+
module RuboCop
|
4
|
+
module Cop
|
5
|
+
# Common functionality for working with heredoc strings.
|
6
|
+
module Heredoc
|
7
|
+
OPENING_DELIMITER = /<<[~-]?['"`]?([^'"`]+)['"`]?/
|
6
8
|
|
7
|
-
|
8
|
-
|
9
|
+
def on_str(node)
|
10
|
+
return unless node.heredoc?
|
9
11
|
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
def on_heredoc(_node)
|
16
|
-
raise NotImplementedError
|
17
|
-
end
|
12
|
+
on_heredoc(node)
|
13
|
+
end
|
14
|
+
alias on_dstr on_str
|
15
|
+
alias on_xstr on_str
|
18
16
|
|
19
|
-
|
17
|
+
def on_heredoc(_node)
|
18
|
+
raise NotImplementedError
|
19
|
+
end
|
20
20
|
|
21
|
-
|
22
|
-
node.loc.is_a?(Parser::Source::Map::Heredoc)
|
23
|
-
end
|
21
|
+
private
|
24
22
|
|
25
|
-
|
26
|
-
|
23
|
+
def delimiter_string(node)
|
24
|
+
node.source.match(OPENING_DELIMITER).captures.first
|
25
|
+
end
|
26
|
+
end
|
27
27
|
end
|
28
28
|
end
|
@@ -5,25 +5,49 @@ module RuboCop
|
|
5
5
|
# This module handles measurement and reporting of complexity in methods.
|
6
6
|
module MethodComplexity
|
7
7
|
include ConfigurableMax
|
8
|
+
extend NodePattern::Macros
|
8
9
|
|
9
10
|
def on_def(node)
|
11
|
+
check_complexity(node, node.method_name)
|
12
|
+
end
|
13
|
+
alias on_defs on_def
|
14
|
+
|
15
|
+
def on_block(node)
|
16
|
+
define_method?(node) do |name|
|
17
|
+
check_complexity(node, name)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
private
|
22
|
+
|
23
|
+
def_node_matcher :define_method?, <<-PATTERN
|
24
|
+
(block
|
25
|
+
(send nil? :define_method ({sym str} $_))
|
26
|
+
args
|
27
|
+
_)
|
28
|
+
PATTERN
|
29
|
+
|
30
|
+
def check_complexity(node, method_name)
|
31
|
+
# Accepts empty methods always.
|
32
|
+
return unless node.body
|
33
|
+
|
10
34
|
max = cop_config['Max']
|
11
|
-
complexity = complexity(node)
|
35
|
+
complexity = complexity(node.body)
|
12
36
|
|
13
37
|
return unless complexity > max
|
14
38
|
|
15
|
-
msg = format(self.class::MSG,
|
39
|
+
msg = format(self.class::MSG,
|
40
|
+
method: method_name,
|
41
|
+
complexity: complexity,
|
42
|
+
max: max)
|
16
43
|
|
17
|
-
add_offense(node,
|
44
|
+
add_offense(node, message: msg) do
|
18
45
|
self.max = complexity.ceil
|
19
46
|
end
|
20
47
|
end
|
21
|
-
alias on_defs on_def
|
22
|
-
|
23
|
-
private
|
24
48
|
|
25
|
-
def complexity(
|
26
|
-
|
49
|
+
def complexity(body)
|
50
|
+
body.each_node(*self.class::COUNTED_NODES).reduce(1) do |score, n|
|
27
51
|
score + complexity_score_for(n)
|
28
52
|
end
|
29
53
|
end
|
@@ -4,14 +4,15 @@ module RuboCop
|
|
4
4
|
module Cop
|
5
5
|
# Common functionality for checking multiline method calls and binary
|
6
6
|
# operations.
|
7
|
-
module MultilineExpressionIndentation
|
7
|
+
module MultilineExpressionIndentation # rubocop:disable Metrics/ModuleLength
|
8
8
|
KEYWORD_ANCESTOR_TYPES = [:for, :return, *Util::MODIFIER_NODES].freeze
|
9
9
|
UNALIGNED_RHS_TYPES = %i[if while until for return
|
10
10
|
array kwbegin].freeze
|
11
11
|
ASSIGNMENT_RHS_TYPES = [:send, *Util::ASGN_NODES].freeze
|
12
12
|
DEFAULT_MESSAGE_TAIL = 'an expression'.freeze
|
13
13
|
ASSIGNMENT_MESSAGE_TAIL = 'an expression in an assignment'.freeze
|
14
|
-
KEYWORD_MESSAGE_TAIL = 'a
|
14
|
+
KEYWORD_MESSAGE_TAIL = 'a %<kind>s in %<article>s `%<keyword>s` ' \
|
15
|
+
'statement'.freeze
|
15
16
|
|
16
17
|
def on_send(node)
|
17
18
|
return if !node.receiver || node.method?(:[])
|
@@ -103,12 +104,15 @@ module RuboCop
|
|
103
104
|
kind = keyword == 'for' ? 'collection' : 'condition'
|
104
105
|
article = keyword =~ /^[iu]/ ? 'an' : 'a'
|
105
106
|
|
106
|
-
format(KEYWORD_MESSAGE_TAIL, kind
|
107
|
+
format(KEYWORD_MESSAGE_TAIL, kind: kind,
|
108
|
+
article: article,
|
109
|
+
keyword: keyword)
|
107
110
|
end
|
108
111
|
|
109
112
|
def kw_node_with_special_indentation(node)
|
110
113
|
keyword_node =
|
111
114
|
node.each_ancestor(*KEYWORD_ANCESTOR_TYPES).find do |ancestor|
|
115
|
+
next if ancestor.if_type? && ancestor.ternary?
|
112
116
|
within_node?(node, indented_keyword_expression(ancestor))
|
113
117
|
end
|
114
118
|
|
@@ -30,8 +30,8 @@ module RuboCop
|
|
30
30
|
return if new_line_needed_before_closing_brace?(node)
|
31
31
|
|
32
32
|
lambda do |corrector|
|
33
|
-
corrector.remove(range_with_surrounding_space(node.loc.end,
|
34
|
-
:left))
|
33
|
+
corrector.remove(range_with_surrounding_space(range: node.loc.end,
|
34
|
+
side: :left))
|
35
35
|
|
36
36
|
corrector.insert_after(last_element_range_with_trailing_comma(node),
|
37
37
|
node.loc.end.source)
|
@@ -113,8 +113,10 @@ module RuboCop
|
|
113
113
|
end
|
114
114
|
|
115
115
|
def last_element_trailing_comma_range(node)
|
116
|
-
range = range_with_surrounding_space(
|
117
|
-
|
116
|
+
range = range_with_surrounding_space(
|
117
|
+
range: children(node).last.source_range,
|
118
|
+
side: :right
|
119
|
+
).end.resize(1)
|
118
120
|
range.source == ',' ? range : nil
|
119
121
|
end
|
120
122
|
|