rubocop 0.87.1 → 0.89.1
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/bin/rubocop-profile +32 -0
- data/config/default.yml +153 -22
- data/lib/rubocop.rb +22 -4
- data/lib/rubocop/cli.rb +2 -2
- data/lib/rubocop/cli/command/auto_genenerate_config.rb +3 -3
- data/lib/rubocop/cli/command/base.rb +1 -0
- data/lib/rubocop/cli/command/execute_runner.rb +1 -1
- data/lib/rubocop/cli/command/show_cops.rb +2 -2
- data/lib/rubocop/cli/command/version.rb +2 -2
- data/lib/rubocop/comment_config.rb +5 -7
- data/lib/rubocop/config.rb +20 -3
- data/lib/rubocop/config_loader.rb +22 -9
- data/lib/rubocop/config_loader_resolver.rb +3 -3
- data/lib/rubocop/config_obsoletion.rb +6 -1
- data/lib/rubocop/config_store.rb +4 -0
- data/lib/rubocop/config_validator.rb +2 -4
- data/lib/rubocop/cop/autocorrect_logic.rb +1 -1
- data/lib/rubocop/cop/badge.rb +1 -1
- data/lib/rubocop/cop/base.rb +14 -6
- data/lib/rubocop/cop/commissioner.rb +0 -1
- data/lib/rubocop/cop/cop.rb +1 -1
- data/lib/rubocop/cop/correctors/line_break_corrector.rb +4 -4
- data/lib/rubocop/cop/correctors/multiline_literal_brace_corrector.rb +26 -0
- data/lib/rubocop/cop/correctors/percent_literal_corrector.rb +2 -2
- data/lib/rubocop/cop/correctors/punctuation_corrector.rb +1 -1
- data/lib/rubocop/cop/correctors/unused_arg_corrector.rb +15 -18
- data/lib/rubocop/cop/force.rb +1 -0
- data/lib/rubocop/cop/gemspec/required_ruby_version.rb +38 -12
- data/lib/rubocop/cop/generator/configuration_injector.rb +2 -2
- data/lib/rubocop/cop/internal_affairs/method_name_equal.rb +4 -12
- data/lib/rubocop/cop/internal_affairs/node_destructuring.rb +1 -1
- data/lib/rubocop/cop/internal_affairs/offense_location_keyword.rb +8 -8
- data/lib/rubocop/cop/internal_affairs/redundant_location_argument.rb +10 -7
- data/lib/rubocop/cop/internal_affairs/redundant_message_argument.rb +7 -8
- data/lib/rubocop/cop/internal_affairs/useless_message_assertion.rb +2 -2
- data/lib/rubocop/cop/layout/block_alignment.rb +1 -1
- data/lib/rubocop/cop/layout/class_structure.rb +3 -7
- data/lib/rubocop/cop/layout/comment_indentation.rb +1 -1
- data/lib/rubocop/cop/layout/empty_lines.rb +0 -2
- data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +1 -0
- data/lib/rubocop/cop/layout/end_alignment.rb +3 -2
- data/lib/rubocop/cop/layout/extra_spacing.rb +22 -36
- data/lib/rubocop/cop/layout/first_method_argument_line_break.rb +1 -1
- data/lib/rubocop/cop/layout/heredoc_indentation.rb +2 -2
- data/lib/rubocop/cop/layout/indentation_style.rb +0 -2
- data/lib/rubocop/cop/layout/leading_comment_space.rb +1 -1
- data/lib/rubocop/cop/layout/multiline_block_layout.rb +16 -5
- data/lib/rubocop/cop/layout/multiline_method_argument_line_breaks.rb +1 -1
- data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +0 -2
- data/lib/rubocop/cop/layout/space_around_block_parameters.rb +3 -2
- data/lib/rubocop/cop/layout/space_around_method_call_operator.rb +33 -66
- data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +3 -2
- data/lib/rubocop/cop/lint/ambiguous_block_association.rb +7 -4
- data/lib/rubocop/cop/lint/ambiguous_operator.rb +15 -10
- data/lib/rubocop/cop/lint/ambiguous_regexp_literal.rb +11 -13
- data/lib/rubocop/cop/lint/assignment_in_condition.rb +2 -2
- data/lib/rubocop/cop/lint/big_decimal_new.rb +10 -10
- data/lib/rubocop/cop/lint/binary_operator_with_identical_operands.rb +50 -0
- data/lib/rubocop/cop/lint/boolean_symbol.rb +16 -11
- data/lib/rubocop/cop/lint/circular_argument_reference.rb +1 -1
- data/lib/rubocop/cop/lint/constant_resolution.rb +1 -1
- data/lib/rubocop/cop/lint/debugger.rb +7 -1
- data/lib/rubocop/cop/lint/deprecated_class_methods.rb +9 -10
- data/lib/rubocop/cop/lint/deprecated_open_ssl_constant.rb +17 -13
- data/lib/rubocop/cop/lint/disjunctive_assignment_in_constructor.rb +8 -2
- data/lib/rubocop/cop/lint/duplicate_case_condition.rb +1 -1
- data/lib/rubocop/cop/lint/duplicate_elsif_condition.rb +39 -0
- data/lib/rubocop/cop/lint/duplicate_hash_key.rb +1 -1
- data/lib/rubocop/cop/lint/duplicate_methods.rb +9 -6
- data/lib/rubocop/cop/lint/duplicate_rescue_exception.rb +60 -0
- data/lib/rubocop/cop/lint/each_with_object_argument.rb +1 -1
- data/lib/rubocop/cop/lint/else_layout.rb +1 -1
- data/lib/rubocop/cop/lint/empty_conditional_body.rb +67 -0
- data/lib/rubocop/cop/lint/empty_ensure.rb +5 -5
- data/lib/rubocop/cop/lint/empty_expression.rb +2 -2
- data/lib/rubocop/cop/lint/empty_interpolation.rb +5 -6
- data/lib/rubocop/cop/lint/empty_when.rb +2 -2
- data/lib/rubocop/cop/lint/ensure_return.rb +27 -29
- data/lib/rubocop/cop/lint/erb_new_arguments.rb +11 -10
- data/lib/rubocop/cop/lint/flip_flop.rb +1 -1
- data/lib/rubocop/cop/lint/float_comparison.rb +93 -0
- data/lib/rubocop/cop/lint/float_out_of_range.rb +1 -1
- data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +5 -4
- data/lib/rubocop/cop/lint/heredoc_method_call_position.rb +13 -14
- data/lib/rubocop/cop/lint/implicit_string_concatenation.rb +5 -4
- data/lib/rubocop/cop/lint/ineffective_access_modifier.rb +8 -8
- data/lib/rubocop/cop/lint/inherit_exception.rb +12 -7
- data/lib/rubocop/cop/lint/interpolation_check.rb +18 -15
- data/lib/rubocop/cop/lint/literal_as_condition.rb +14 -2
- data/lib/rubocop/cop/lint/literal_in_interpolation.rb +7 -7
- data/lib/rubocop/cop/lint/loop.rb +23 -2
- data/lib/rubocop/cop/lint/missing_cop_enable_directive.rb +6 -5
- data/lib/rubocop/cop/lint/missing_super.rb +99 -0
- data/lib/rubocop/cop/lint/mixed_regexp_capture_types.rb +1 -1
- data/lib/rubocop/cop/lint/multiple_comparison.rb +6 -9
- data/lib/rubocop/cop/lint/nested_method_definition.rb +14 -20
- data/lib/rubocop/cop/lint/nested_percent_literal.rb +1 -1
- data/lib/rubocop/cop/lint/next_without_accumulator.rb +1 -1
- data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +82 -11
- data/lib/rubocop/cop/lint/non_local_exit_from_iterator.rb +2 -2
- data/lib/rubocop/cop/lint/number_conversion.rb +6 -9
- data/lib/rubocop/cop/lint/ordered_magic_comments.rb +11 -13
- data/lib/rubocop/cop/lint/out_of_range_regexp_ref.rb +90 -0
- data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +4 -10
- data/lib/rubocop/cop/lint/percent_string_array.rb +13 -12
- data/lib/rubocop/cop/lint/percent_symbol_array.rb +13 -12
- data/lib/rubocop/cop/lint/raise_exception.rb +12 -10
- data/lib/rubocop/cop/lint/rand_one.rb +2 -2
- data/lib/rubocop/cop/lint/redundant_cop_disable_directive.rb +16 -19
- data/lib/rubocop/cop/lint/redundant_cop_enable_directive.rb +7 -11
- data/lib/rubocop/cop/lint/redundant_require_statement.rb +4 -7
- data/lib/rubocop/cop/lint/redundant_splat_expansion.rb +13 -9
- data/lib/rubocop/cop/lint/redundant_string_coercion.rb +6 -13
- data/lib/rubocop/cop/lint/redundant_with_index.rb +11 -14
- data/lib/rubocop/cop/lint/redundant_with_object.rb +11 -14
- data/lib/rubocop/cop/lint/regexp_as_condition.rb +4 -6
- data/lib/rubocop/cop/lint/require_parentheses.rb +2 -2
- data/lib/rubocop/cop/lint/rescue_exception.rb +1 -1
- data/lib/rubocop/cop/lint/rescue_type.rb +8 -8
- data/lib/rubocop/cop/lint/return_in_void_context.rb +2 -4
- data/lib/rubocop/cop/lint/safe_navigation_chain.rb +3 -6
- data/lib/rubocop/cop/lint/safe_navigation_consistency.rb +14 -10
- data/lib/rubocop/cop/lint/safe_navigation_with_empty.rb +7 -7
- data/lib/rubocop/cop/lint/script_permission.rb +10 -7
- data/lib/rubocop/cop/lint/self_assignment.rb +78 -0
- data/lib/rubocop/cop/lint/send_with_mixin_argument.rb +5 -11
- data/lib/rubocop/cop/lint/shadowed_argument.rb +3 -3
- data/lib/rubocop/cop/lint/shadowed_exception.rb +2 -2
- data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +3 -3
- data/lib/rubocop/cop/lint/struct_new_override.rb +1 -1
- data/lib/rubocop/cop/lint/suppressed_exception.rb +4 -7
- data/lib/rubocop/cop/lint/to_json.rb +4 -6
- data/lib/rubocop/cop/lint/top_level_return_with_argument.rb +34 -0
- data/lib/rubocop/cop/lint/underscore_prefixed_variable_name.rb +4 -4
- data/lib/rubocop/cop/lint/unified_integer.rb +4 -6
- data/lib/rubocop/cop/lint/unreachable_code.rb +1 -1
- data/lib/rubocop/cop/lint/unreachable_loop.rb +174 -0
- data/lib/rubocop/cop/lint/unused_block_argument.rb +8 -3
- data/lib/rubocop/cop/lint/unused_method_argument.rb +8 -3
- data/lib/rubocop/cop/lint/uri_escape_unescape.rb +1 -1
- data/lib/rubocop/cop/lint/uri_regexp.rb +11 -47
- data/lib/rubocop/cop/lint/useless_access_modifier.rb +25 -15
- data/lib/rubocop/cop/lint/useless_assignment.rb +4 -4
- data/lib/rubocop/cop/lint/useless_else_without_rescue.rb +6 -15
- data/lib/rubocop/cop/lint/useless_setter_call.rb +4 -6
- data/lib/rubocop/cop/lint/void.rb +3 -7
- data/lib/rubocop/cop/metrics/abc_size.rb +1 -1
- data/lib/rubocop/cop/metrics/block_length.rb +2 -2
- data/lib/rubocop/cop/metrics/block_nesting.rb +2 -2
- data/lib/rubocop/cop/metrics/class_length.rb +2 -2
- data/lib/rubocop/cop/metrics/cyclomatic_complexity.rb +2 -1
- data/lib/rubocop/cop/metrics/method_length.rb +2 -2
- data/lib/rubocop/cop/metrics/module_length.rb +2 -2
- data/lib/rubocop/cop/metrics/parameter_lists.rb +2 -6
- data/lib/rubocop/cop/metrics/perceived_complexity.rb +7 -8
- data/lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +48 -5
- data/lib/rubocop/cop/metrics/utils/code_length_calculator.rb +52 -24
- data/lib/rubocop/cop/metrics/utils/repeated_csend_discount.rb +37 -0
- data/lib/rubocop/cop/migration/department_name.rb +14 -16
- data/lib/rubocop/cop/mixin/alignment.rb +2 -1
- data/lib/rubocop/cop/mixin/array_min_size.rb +1 -1
- data/lib/rubocop/cop/mixin/check_line_breakable.rb +2 -2
- data/lib/rubocop/cop/mixin/code_length.rb +22 -5
- data/lib/rubocop/cop/mixin/hash_transform_method.rb +5 -11
- data/lib/rubocop/cop/mixin/line_length_help.rb +1 -3
- data/lib/rubocop/cop/mixin/method_complexity.rb +10 -2
- data/lib/rubocop/cop/mixin/multiline_literal_brace_layout.rb +1 -2
- data/lib/rubocop/cop/mixin/percent_array.rb +2 -6
- data/lib/rubocop/cop/mixin/range_help.rb +18 -4
- data/lib/rubocop/cop/mixin/statement_modifier.rb +39 -10
- data/lib/rubocop/cop/mixin/surrounding_space.rb +0 -25
- data/lib/rubocop/cop/mixin/trailing_comma.rb +2 -4
- data/lib/rubocop/cop/mixin/uncommunicative_name.rb +6 -13
- data/lib/rubocop/cop/mixin/unused_argument.rb +4 -6
- data/lib/rubocop/cop/naming/accessor_method_name.rb +4 -2
- data/lib/rubocop/cop/naming/ascii_identifiers.rb +3 -3
- data/lib/rubocop/cop/naming/binary_operator_parameter_name.rb +1 -1
- data/lib/rubocop/cop/naming/block_parameter_name.rb +1 -1
- data/lib/rubocop/cop/naming/class_and_module_camel_case.rb +2 -2
- data/lib/rubocop/cop/naming/constant_name.rb +2 -2
- data/lib/rubocop/cop/naming/file_name.rb +3 -3
- data/lib/rubocop/cop/naming/heredoc_delimiter_case.rb +2 -2
- data/lib/rubocop/cop/naming/heredoc_delimiter_naming.rb +2 -2
- data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +2 -2
- data/lib/rubocop/cop/naming/method_parameter_name.rb +1 -1
- data/lib/rubocop/cop/naming/predicate_name.rb +3 -5
- data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +12 -11
- data/lib/rubocop/cop/registry.rb +3 -3
- data/lib/rubocop/cop/security/eval.rb +2 -2
- data/lib/rubocop/cop/security/json_load.rb +6 -8
- data/lib/rubocop/cop/security/marshal_load.rb +2 -4
- data/lib/rubocop/cop/security/open.rb +2 -2
- data/lib/rubocop/cop/security/yaml_load.rb +6 -6
- data/lib/rubocop/cop/style/access_modifier_declarations.rb +16 -9
- data/lib/rubocop/cop/style/accessor_grouping.rb +29 -20
- data/lib/rubocop/cop/style/alias.rb +41 -36
- data/lib/rubocop/cop/style/and_or.rb +9 -11
- data/lib/rubocop/cop/style/array_coercion.rb +63 -0
- data/lib/rubocop/cop/style/array_join.rb +6 -8
- data/lib/rubocop/cop/style/ascii_comments.rb +4 -4
- data/lib/rubocop/cop/style/attr.rb +11 -9
- data/lib/rubocop/cop/style/auto_resource_cleanup.rb +5 -7
- data/lib/rubocop/cop/style/bare_percent_literals.rb +10 -12
- data/lib/rubocop/cop/style/begin_block.rb +2 -2
- data/lib/rubocop/cop/style/bisected_attr_accessor.rb +14 -18
- data/lib/rubocop/cop/style/block_comments.rb +14 -18
- data/lib/rubocop/cop/style/block_delimiters.rb +23 -23
- data/lib/rubocop/cop/style/case_equality.rb +22 -3
- data/lib/rubocop/cop/style/case_like_if.rb +220 -0
- data/lib/rubocop/cop/style/class_and_module_children.rb +14 -11
- data/lib/rubocop/cop/style/class_check.rb +7 -9
- data/lib/rubocop/cop/style/class_methods.rb +7 -11
- data/lib/rubocop/cop/style/class_vars.rb +6 -10
- data/lib/rubocop/cop/style/collection_methods.rb +11 -17
- data/lib/rubocop/cop/style/colon_method_call.rb +8 -9
- data/lib/rubocop/cop/style/colon_method_definition.rb +6 -6
- data/lib/rubocop/cop/style/command_literal.rb +23 -24
- data/lib/rubocop/cop/style/comment_annotation.rb +15 -15
- data/lib/rubocop/cop/style/commented_keyword.rb +6 -3
- data/lib/rubocop/cop/style/conditional_assignment.rb +13 -4
- data/lib/rubocop/cop/style/constant_visibility.rb +3 -2
- data/lib/rubocop/cop/style/copyright.rb +12 -12
- data/lib/rubocop/cop/style/date_time.rb +1 -1
- data/lib/rubocop/cop/style/def_with_parentheses.rb +8 -10
- data/lib/rubocop/cop/style/dir.rb +7 -10
- data/lib/rubocop/cop/style/disable_cops_within_source_code_directive.rb +7 -9
- data/lib/rubocop/cop/style/documentation.rb +6 -8
- data/lib/rubocop/cop/style/documentation_method.rb +1 -1
- data/lib/rubocop/cop/style/double_cop_disable_directive.rb +12 -15
- data/lib/rubocop/cop/style/double_negation.rb +2 -2
- data/lib/rubocop/cop/style/each_for_simple_loop.rb +5 -8
- data/lib/rubocop/cop/style/each_with_object.rb +16 -19
- data/lib/rubocop/cop/style/empty_case_condition.rb +19 -20
- data/lib/rubocop/cop/style/empty_else.rb +17 -19
- data/lib/rubocop/cop/style/empty_literal.rb +15 -16
- data/lib/rubocop/cop/style/empty_method.rb +10 -13
- data/lib/rubocop/cop/style/encoding.rb +5 -9
- data/lib/rubocop/cop/style/end_block.rb +4 -6
- data/lib/rubocop/cop/style/eval_with_location.rb +9 -7
- data/lib/rubocop/cop/style/even_odd.rb +7 -11
- data/lib/rubocop/cop/style/expand_path_arguments.rb +21 -20
- data/lib/rubocop/cop/style/explicit_block_argument.rb +102 -0
- data/lib/rubocop/cop/style/exponential_notation.rb +7 -9
- data/lib/rubocop/cop/style/float_division.rb +8 -11
- data/lib/rubocop/cop/style/for.rb +11 -15
- data/lib/rubocop/cop/style/format_string.rb +21 -19
- data/lib/rubocop/cop/style/format_string_token.rb +10 -12
- data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +19 -41
- data/lib/rubocop/cop/style/global_std_stream.rb +65 -0
- data/lib/rubocop/cop/style/global_vars.rb +2 -2
- data/lib/rubocop/cop/style/guard_clause.rb +5 -6
- data/lib/rubocop/cop/style/hash_as_last_array_item.rb +69 -0
- data/lib/rubocop/cop/style/hash_each_methods.rb +5 -8
- data/lib/rubocop/cop/style/hash_like_case.rb +76 -0
- data/lib/rubocop/cop/style/hash_syntax.rb +4 -3
- data/lib/rubocop/cop/style/hash_transform_keys.rb +3 -2
- data/lib/rubocop/cop/style/hash_transform_values.rb +2 -1
- data/lib/rubocop/cop/style/identical_conditional_branches.rb +2 -2
- data/lib/rubocop/cop/style/if_inside_else.rb +3 -3
- data/lib/rubocop/cop/style/if_unless_modifier.rb +18 -40
- data/lib/rubocop/cop/style/if_unless_modifier_of_if_unless.rb +3 -7
- data/lib/rubocop/cop/style/if_with_semicolon.rb +3 -6
- data/lib/rubocop/cop/style/implicit_runtime_error.rb +1 -1
- data/lib/rubocop/cop/style/infinite_loop.rb +24 -24
- data/lib/rubocop/cop/style/inline_comment.rb +3 -3
- data/lib/rubocop/cop/style/inverse_methods.rb +22 -32
- data/lib/rubocop/cop/style/lambda.rb +7 -12
- data/lib/rubocop/cop/style/lambda_call.rb +14 -13
- data/lib/rubocop/cop/style/line_end_concatenation.rb +19 -16
- data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +2 -1
- data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +16 -11
- data/lib/rubocop/cop/style/method_call_with_args_parentheses/require_parentheses.rb +4 -8
- data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +8 -7
- data/lib/rubocop/cop/style/method_called_on_do_end_block.rb +2 -2
- data/lib/rubocop/cop/style/method_def_parentheses.rb +11 -16
- data/lib/rubocop/cop/style/min_max.rb +8 -12
- data/lib/rubocop/cop/style/missing_else.rb +11 -21
- data/lib/rubocop/cop/style/missing_respond_to_missing.rb +10 -3
- data/lib/rubocop/cop/style/mixin_grouping.rb +24 -27
- data/lib/rubocop/cop/style/mixin_usage.rb +1 -1
- data/lib/rubocop/cop/style/module_function.rb +10 -13
- data/lib/rubocop/cop/style/multiline_if_modifier.rb +3 -10
- data/lib/rubocop/cop/style/multiline_if_then.rb +4 -10
- data/lib/rubocop/cop/style/multiline_memoization.rb +14 -12
- data/lib/rubocop/cop/style/multiline_method_signature.rb +2 -2
- data/lib/rubocop/cop/style/multiline_ternary_operator.rb +4 -6
- data/lib/rubocop/cop/style/multiline_when_then.rb +7 -9
- data/lib/rubocop/cop/style/multiple_comparison.rb +1 -1
- data/lib/rubocop/cop/style/mutable_constant.rb +23 -20
- data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +3 -1
- data/lib/rubocop/cop/style/numeric_predicate.rb +7 -4
- data/lib/rubocop/cop/style/optional_boolean_parameter.rb +42 -0
- data/lib/rubocop/cop/style/parallel_assignment.rb +5 -5
- data/lib/rubocop/cop/style/percent_literal_delimiters.rb +1 -1
- data/lib/rubocop/cop/style/random_with_offset.rb +1 -0
- data/lib/rubocop/cop/style/redundant_condition.rb +15 -3
- data/lib/rubocop/cop/style/redundant_exception.rb +4 -0
- data/lib/rubocop/cop/style/redundant_file_extension_in_require.rb +50 -0
- data/lib/rubocop/cop/style/redundant_regexp_escape.rb +9 -9
- data/lib/rubocop/cop/style/redundant_sort.rb +26 -12
- data/lib/rubocop/cop/style/safe_navigation.rb +4 -4
- data/lib/rubocop/cop/style/signal_exception.rb +2 -0
- data/lib/rubocop/cop/style/single_argument_dig.rb +54 -0
- data/lib/rubocop/cop/style/single_line_methods.rb +1 -1
- data/lib/rubocop/cop/style/stabby_lambda_parentheses.rb +3 -2
- data/lib/rubocop/cop/style/string_concatenation.rb +92 -0
- data/lib/rubocop/cop/style/struct_inheritance.rb +1 -1
- data/lib/rubocop/cop/style/symbol_array.rb +1 -1
- data/lib/rubocop/cop/style/symbol_proc.rb +1 -1
- data/lib/rubocop/cop/style/trailing_method_end_statement.rb +9 -32
- data/lib/rubocop/cop/style/zero_length_predicate.rb +10 -6
- data/lib/rubocop/cop/team.rb +1 -1
- data/lib/rubocop/cop/tokens_util.rb +84 -0
- data/lib/rubocop/cop/util.rb +3 -13
- data/lib/rubocop/cop/variable_force.rb +0 -2
- data/lib/rubocop/cop/variable_force/branch.rb +1 -0
- data/lib/rubocop/cop/variable_force/variable.rb +7 -5
- data/lib/rubocop/cops_documentation_generator.rb +282 -0
- data/lib/rubocop/error.rb +1 -0
- data/lib/rubocop/file_finder.rb +12 -12
- data/lib/rubocop/formatter/disabled_config_formatter.rb +1 -1
- data/lib/rubocop/formatter/formatter_set.rb +1 -0
- data/lib/rubocop/formatter/junit_formatter.rb +1 -1
- data/lib/rubocop/options.rb +3 -3
- data/lib/rubocop/path_util.rb +17 -17
- data/lib/rubocop/rake_task.rb +1 -0
- data/lib/rubocop/result_cache.rb +12 -8
- data/lib/rubocop/rspec/expect_offense.rb +31 -5
- data/lib/rubocop/rspec/shared_contexts.rb +13 -14
- data/lib/rubocop/runner.rb +6 -7
- data/lib/rubocop/target_finder.rb +13 -10
- data/lib/rubocop/version.rb +2 -2
- metadata +28 -8
- data/lib/rubocop/cop/lint/useless_comparison.rb +0 -28
- data/lib/rubocop/cop/mixin/parser_diagnostic.rb +0 -37
- data/lib/rubocop/cop/mixin/too_many_lines.rb +0 -25
- data/lib/rubocop/cop/style/method_missing_super.rb +0 -34
@@ -16,7 +16,7 @@ module RuboCop
|
|
16
16
|
# File.open('file') do |f|
|
17
17
|
# # ...
|
18
18
|
# end
|
19
|
-
class AutoResourceCleanup <
|
19
|
+
class AutoResourceCleanup < Base
|
20
20
|
MSG = 'Use the block version of `%<class>s.%<method>s`.'
|
21
21
|
|
22
22
|
TARGET_METHODS = {
|
@@ -25,16 +25,14 @@ module RuboCop
|
|
25
25
|
|
26
26
|
def on_send(node)
|
27
27
|
TARGET_METHODS.each do |target_class, target_method|
|
28
|
-
|
28
|
+
next if node.method_name != target_method
|
29
29
|
|
30
|
+
target_receiver = s(:const, nil, target_class)
|
30
31
|
next if node.receiver != target_receiver
|
31
|
-
|
32
|
+
|
32
33
|
next if cleanup?(node)
|
33
34
|
|
34
|
-
add_offense(node,
|
35
|
-
message: format(MSG,
|
36
|
-
class: target_class,
|
37
|
-
method: target_method))
|
35
|
+
add_offense(node, message: format(MSG, class: target_class, method: target_method))
|
38
36
|
end
|
39
37
|
end
|
40
38
|
|
@@ -23,8 +23,9 @@ module RuboCop
|
|
23
23
|
# %Q|He said: "#{greeting}"|
|
24
24
|
# %q/She said: 'Hi'/
|
25
25
|
#
|
26
|
-
class BarePercentLiterals <
|
26
|
+
class BarePercentLiterals < Base
|
27
27
|
include ConfigurableEnforcedStyle
|
28
|
+
extend AutoCorrector
|
28
29
|
|
29
30
|
MSG = 'Use `%%%<good>s` instead of `%%%<bad>s`.'
|
30
31
|
|
@@ -36,14 +37,6 @@ module RuboCop
|
|
36
37
|
check(node)
|
37
38
|
end
|
38
39
|
|
39
|
-
def autocorrect(node)
|
40
|
-
src = node.loc.begin.source
|
41
|
-
replacement = src.start_with?('%Q') ? '%' : '%Q'
|
42
|
-
lambda do |corrector|
|
43
|
-
corrector.replace(node.loc.begin, src.sub(/%Q?/, replacement))
|
44
|
-
end
|
45
|
-
end
|
46
|
-
|
47
40
|
private
|
48
41
|
|
49
42
|
def check(node)
|
@@ -68,9 +61,14 @@ module RuboCop
|
|
68
61
|
end
|
69
62
|
|
70
63
|
def add_offense_for_wrong_style(node, good, bad)
|
71
|
-
|
72
|
-
|
73
|
-
|
64
|
+
location = node.loc.begin
|
65
|
+
|
66
|
+
add_offense(location, message: format(MSG, good: good, bad: bad)) do |corrector|
|
67
|
+
source = location.source
|
68
|
+
replacement = source.start_with?('%Q') ? '%' : '%Q'
|
69
|
+
|
70
|
+
corrector.replace(location, source.sub(/%Q?/, replacement))
|
71
|
+
end
|
74
72
|
end
|
75
73
|
end
|
76
74
|
end
|
@@ -10,11 +10,11 @@ module RuboCop
|
|
10
10
|
# # bad
|
11
11
|
# BEGIN { test }
|
12
12
|
#
|
13
|
-
class BeginBlock <
|
13
|
+
class BeginBlock < Base
|
14
14
|
MSG = 'Avoid the use of `BEGIN` blocks.'
|
15
15
|
|
16
16
|
def on_preexe(node)
|
17
|
-
add_offense(node
|
17
|
+
add_offense(node.loc.keyword)
|
18
18
|
end
|
19
19
|
end
|
20
20
|
end
|
@@ -1,7 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require 'set'
|
4
|
-
|
5
3
|
module RuboCop
|
6
4
|
module Cop
|
7
5
|
module Style
|
@@ -20,14 +18,16 @@ module RuboCop
|
|
20
18
|
# attr_accessor :bar
|
21
19
|
# end
|
22
20
|
#
|
23
|
-
class BisectedAttrAccessor <
|
21
|
+
class BisectedAttrAccessor < Base
|
24
22
|
include VisibilityHelp
|
23
|
+
extend AutoCorrector
|
25
24
|
|
26
25
|
MSG = 'Combine both accessors into `attr_accessor %<name>s`.'
|
27
26
|
|
28
27
|
def on_class(class_node)
|
29
28
|
VISIBILITY_SCOPES.each do |visibility|
|
30
29
|
reader_names, writer_names = accessor_names(class_node, visibility)
|
30
|
+
next unless reader_names && writer_names
|
31
31
|
|
32
32
|
accessor_macroses(class_node, visibility).each do |macro|
|
33
33
|
check(macro, reader_names, writer_names)
|
@@ -37,28 +37,20 @@ module RuboCop
|
|
37
37
|
alias on_sclass on_class
|
38
38
|
alias on_module on_class
|
39
39
|
|
40
|
-
def autocorrect(node)
|
41
|
-
macro = node.parent
|
42
|
-
|
43
|
-
lambda do |corrector|
|
44
|
-
corrector.replace(macro, replacement(macro, node))
|
45
|
-
end
|
46
|
-
end
|
47
|
-
|
48
40
|
private
|
49
41
|
|
50
42
|
def accessor_names(class_node, visibility)
|
51
|
-
reader_names =
|
52
|
-
writer_names =
|
43
|
+
reader_names = nil
|
44
|
+
writer_names = nil
|
53
45
|
|
54
46
|
accessor_macroses(class_node, visibility).each do |macro|
|
55
47
|
names = macro.arguments.map(&:source)
|
56
48
|
|
57
49
|
names.each do |name|
|
58
50
|
if attr_reader?(macro)
|
59
|
-
reader_names.add(name)
|
51
|
+
(reader_names ||= Set.new).add(name)
|
60
52
|
else
|
61
|
-
writer_names.add(name)
|
53
|
+
(writer_names ||= Set.new).add(name)
|
62
54
|
end
|
63
55
|
end
|
64
56
|
end
|
@@ -98,9 +90,13 @@ module RuboCop
|
|
98
90
|
macro.arguments.each do |arg_node|
|
99
91
|
name = arg_node.source
|
100
92
|
|
101
|
-
|
102
|
-
|
103
|
-
|
93
|
+
next unless (attr_reader?(macro) && writer_names.include?(name)) ||
|
94
|
+
(attr_writer?(macro) && reader_names.include?(name))
|
95
|
+
|
96
|
+
add_offense(arg_node, message: format(MSG, name: name)) do |corrector|
|
97
|
+
macro = arg_node.parent
|
98
|
+
|
99
|
+
corrector.replace(macro, replacement(macro, arg_node))
|
104
100
|
end
|
105
101
|
end
|
106
102
|
end
|
@@ -16,34 +16,30 @@ module RuboCop
|
|
16
16
|
# # Multiple lines
|
17
17
|
# # of comments...
|
18
18
|
#
|
19
|
-
class BlockComments <
|
19
|
+
class BlockComments < Base
|
20
20
|
include RangeHelp
|
21
|
+
extend AutoCorrector
|
21
22
|
|
22
23
|
MSG = 'Do not use block comments.'
|
23
24
|
BEGIN_LENGTH = "=begin\n".length
|
24
25
|
END_LENGTH = "\n=end".length
|
25
26
|
|
26
|
-
def
|
27
|
-
processed_source.
|
27
|
+
def on_new_investigation
|
28
|
+
processed_source.comments.each do |comment|
|
28
29
|
next unless comment.document?
|
29
30
|
|
30
|
-
add_offense(comment)
|
31
|
-
|
32
|
-
end
|
33
|
-
|
34
|
-
def autocorrect(comment)
|
35
|
-
eq_begin, eq_end, contents = parts(comment)
|
31
|
+
add_offense(comment) do |corrector|
|
32
|
+
eq_begin, eq_end, contents = parts(comment)
|
36
33
|
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
34
|
+
corrector.remove(eq_begin)
|
35
|
+
unless contents.length.zero?
|
36
|
+
corrector.replace(
|
37
|
+
contents,
|
38
|
+
contents.source.gsub(/\A/, '# ').gsub(/\n\n/, "\n#\n").gsub(/\n(?=[^#])/, "\n# ")
|
39
|
+
)
|
40
|
+
end
|
41
|
+
corrector.remove(eq_end)
|
45
42
|
end
|
46
|
-
corrector.remove(eq_end)
|
47
43
|
end
|
48
44
|
end
|
49
45
|
|
@@ -132,14 +132,14 @@ module RuboCop
|
|
132
132
|
# puts foo
|
133
133
|
# end
|
134
134
|
#
|
135
|
-
class BlockDelimiters <
|
135
|
+
class BlockDelimiters < Base
|
136
136
|
include ConfigurableEnforcedStyle
|
137
137
|
include IgnoredMethods
|
138
|
+
extend AutoCorrector
|
138
139
|
|
139
140
|
ALWAYS_BRACES_MESSAGE = 'Prefer `{...}` over `do...end` for blocks.'
|
140
141
|
|
141
|
-
BRACES_REQUIRED_MESSAGE =
|
142
|
-
"'%<method_name>s' method."
|
142
|
+
BRACES_REQUIRED_MESSAGE = "Brace delimiters `{...}` required for '%<method_name>s' method."
|
143
143
|
|
144
144
|
def on_send(node)
|
145
145
|
return unless node.arguments?
|
@@ -158,22 +158,26 @@ module RuboCop
|
|
158
158
|
|
159
159
|
def on_block(node)
|
160
160
|
return if ignored_node?(node)
|
161
|
+
return if proper_block_style?(node)
|
161
162
|
|
162
|
-
|
163
|
+
message = message(node)
|
164
|
+
add_offense(node.loc.begin, message: message) do |corrector|
|
165
|
+
autocorrect(corrector, node)
|
166
|
+
end
|
163
167
|
end
|
164
168
|
|
165
|
-
|
169
|
+
private
|
170
|
+
|
171
|
+
def autocorrect(corrector, node)
|
166
172
|
return if correction_would_break_code?(node)
|
167
173
|
|
168
174
|
if node.braces?
|
169
|
-
replace_braces_with_do_end(node.loc)
|
175
|
+
replace_braces_with_do_end(corrector, node.loc)
|
170
176
|
else
|
171
|
-
replace_do_end_with_braces(node.loc)
|
177
|
+
replace_do_end_with_braces(corrector, node.loc)
|
172
178
|
end
|
173
179
|
end
|
174
180
|
|
175
|
-
private
|
176
|
-
|
177
181
|
def line_count_based_message(node)
|
178
182
|
if node.multiline?
|
179
183
|
'Avoid using `{...}` for multi-line blocks.'
|
@@ -219,29 +223,25 @@ module RuboCop
|
|
219
223
|
end
|
220
224
|
end
|
221
225
|
|
222
|
-
def replace_braces_with_do_end(loc)
|
226
|
+
def replace_braces_with_do_end(corrector, loc)
|
223
227
|
b = loc.begin
|
224
228
|
e = loc.end
|
225
229
|
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
corrector.replace(e, 'end')
|
232
|
-
end
|
230
|
+
corrector.insert_before(b, ' ') unless whitespace_before?(b)
|
231
|
+
corrector.insert_before(e, ' ') unless whitespace_before?(e)
|
232
|
+
corrector.insert_after(b, ' ') unless whitespace_after?(b)
|
233
|
+
corrector.replace(b, 'do')
|
234
|
+
corrector.replace(e, 'end')
|
233
235
|
end
|
234
236
|
|
235
|
-
def replace_do_end_with_braces(loc)
|
237
|
+
def replace_do_end_with_braces(corrector, loc)
|
236
238
|
b = loc.begin
|
237
239
|
e = loc.end
|
238
240
|
|
239
|
-
|
240
|
-
corrector.insert_after(b, ' ') unless whitespace_after?(b, 2)
|
241
|
+
corrector.insert_after(b, ' ') unless whitespace_after?(b, 2)
|
241
242
|
|
242
|
-
|
243
|
-
|
244
|
-
end
|
243
|
+
corrector.replace(b, '{')
|
244
|
+
corrector.replace(e, '}')
|
245
245
|
end
|
246
246
|
|
247
247
|
def whitespace_before?(range)
|
@@ -29,13 +29,20 @@ module RuboCop
|
|
29
29
|
# (1..100).include?(7)
|
30
30
|
# some_string =~ /something/
|
31
31
|
#
|
32
|
-
class CaseEquality <
|
32
|
+
class CaseEquality < Base
|
33
|
+
extend AutoCorrector
|
34
|
+
|
33
35
|
MSG = 'Avoid the use of the case equality operator `===`.'
|
34
36
|
|
35
|
-
def_node_matcher :case_equality?, '(send
|
37
|
+
def_node_matcher :case_equality?, '(send $#const? :=== $_)'
|
36
38
|
|
37
39
|
def on_send(node)
|
38
|
-
case_equality?(node)
|
40
|
+
case_equality?(node) do |lhs, rhs|
|
41
|
+
add_offense(node.loc.selector) do |corrector|
|
42
|
+
replacement = replacement(lhs, rhs)
|
43
|
+
corrector.replace(node, replacement) if replacement
|
44
|
+
end
|
45
|
+
end
|
39
46
|
end
|
40
47
|
|
41
48
|
private
|
@@ -47,6 +54,18 @@ module RuboCop
|
|
47
54
|
true
|
48
55
|
end
|
49
56
|
end
|
57
|
+
|
58
|
+
def replacement(lhs, rhs)
|
59
|
+
case lhs.type
|
60
|
+
when :regexp
|
61
|
+
"#{rhs.source} =~ #{lhs.source}"
|
62
|
+
when :begin
|
63
|
+
child = lhs.children.first
|
64
|
+
"#{lhs.source}.include?(#{rhs.source})" if child&.range_type?
|
65
|
+
when :const
|
66
|
+
"#{rhs.source}.is_a?(#{lhs.source})"
|
67
|
+
end
|
68
|
+
end
|
50
69
|
end
|
51
70
|
end
|
52
71
|
end
|
@@ -0,0 +1,220 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RuboCop
|
4
|
+
module Cop
|
5
|
+
module Style
|
6
|
+
# This cop identifies places where `if-elsif` constructions
|
7
|
+
# can be replaced with `case-when`.
|
8
|
+
#
|
9
|
+
# @example
|
10
|
+
# # bad
|
11
|
+
# if status == :active
|
12
|
+
# perform_action
|
13
|
+
# elsif status == :inactive || status == :hibernating
|
14
|
+
# check_timeout
|
15
|
+
# else
|
16
|
+
# final_action
|
17
|
+
# end
|
18
|
+
#
|
19
|
+
# # good
|
20
|
+
# case status
|
21
|
+
# when :active
|
22
|
+
# perform_action
|
23
|
+
# when :inactive, :hibernating
|
24
|
+
# check_timeout
|
25
|
+
# else
|
26
|
+
# final_action
|
27
|
+
# end
|
28
|
+
#
|
29
|
+
class CaseLikeIf < Base
|
30
|
+
include RangeHelp
|
31
|
+
extend AutoCorrector
|
32
|
+
|
33
|
+
MSG = 'Convert `if-elsif` to `case-when`.'
|
34
|
+
|
35
|
+
def on_if(node)
|
36
|
+
return unless should_check?(node)
|
37
|
+
|
38
|
+
target = find_target(node.condition)
|
39
|
+
return unless target
|
40
|
+
|
41
|
+
conditions = []
|
42
|
+
convertible = true
|
43
|
+
|
44
|
+
branch_conditions(node).each do |branch_condition|
|
45
|
+
conditions << []
|
46
|
+
convertible = collect_conditions(branch_condition, target, conditions.last)
|
47
|
+
break unless convertible
|
48
|
+
end
|
49
|
+
|
50
|
+
return unless convertible
|
51
|
+
|
52
|
+
add_offense(node) do |corrector|
|
53
|
+
autocorrect(corrector, node)
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
private
|
58
|
+
|
59
|
+
def autocorrect(corrector, node)
|
60
|
+
target = find_target(node.condition)
|
61
|
+
|
62
|
+
corrector.insert_before(node, "case #{target.source}\n#{indent(node)}")
|
63
|
+
|
64
|
+
branch_conditions(node).each do |branch_condition|
|
65
|
+
conditions = []
|
66
|
+
collect_conditions(branch_condition, target, conditions)
|
67
|
+
|
68
|
+
range = correction_range(branch_condition)
|
69
|
+
branch_replacement = "when #{conditions.map(&:source).join(', ')}"
|
70
|
+
corrector.replace(range, branch_replacement)
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
def should_check?(node)
|
75
|
+
!node.unless? && !node.elsif? && !node.modifier_form? && !node.ternary? &&
|
76
|
+
node.elsif_conditional?
|
77
|
+
end
|
78
|
+
|
79
|
+
# rubocop:disable Metrics/MethodLength
|
80
|
+
def find_target(node)
|
81
|
+
case node.type
|
82
|
+
when :begin
|
83
|
+
find_target(node.children.first)
|
84
|
+
when :or
|
85
|
+
find_target(node.lhs)
|
86
|
+
when :match_with_lvasgn
|
87
|
+
lhs, rhs = *node
|
88
|
+
if lhs.regexp_type?
|
89
|
+
rhs
|
90
|
+
elsif rhs.regexp_type?
|
91
|
+
lhs
|
92
|
+
end
|
93
|
+
when :send
|
94
|
+
find_target_in_send_node(node)
|
95
|
+
end
|
96
|
+
end
|
97
|
+
# rubocop:enable Metrics/MethodLength
|
98
|
+
|
99
|
+
def find_target_in_send_node(node)
|
100
|
+
case node.method_name
|
101
|
+
when :is_a?
|
102
|
+
node.receiver
|
103
|
+
when :==, :eql?, :equal?
|
104
|
+
find_target_in_equality_node(node)
|
105
|
+
when :===
|
106
|
+
node.arguments.first
|
107
|
+
when :include?, :cover?
|
108
|
+
receiver = deparenthesize(node.receiver)
|
109
|
+
node.arguments.first if receiver.range_type?
|
110
|
+
when :match, :match?
|
111
|
+
find_target_in_match_node(node)
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
115
|
+
def find_target_in_equality_node(node)
|
116
|
+
argument = node.arguments.first
|
117
|
+
receiver = node.receiver
|
118
|
+
return unless receiver
|
119
|
+
|
120
|
+
if argument.literal? || const_reference?(argument)
|
121
|
+
receiver
|
122
|
+
elsif receiver.literal? || const_reference?(receiver)
|
123
|
+
argument
|
124
|
+
end
|
125
|
+
end
|
126
|
+
|
127
|
+
def find_target_in_match_node(node)
|
128
|
+
argument = node.arguments.first
|
129
|
+
receiver = node.receiver
|
130
|
+
return unless receiver
|
131
|
+
|
132
|
+
if receiver.regexp_type?
|
133
|
+
argument
|
134
|
+
elsif argument.regexp_type?
|
135
|
+
receiver
|
136
|
+
end
|
137
|
+
end
|
138
|
+
|
139
|
+
def collect_conditions(node, target, conditions)
|
140
|
+
condition =
|
141
|
+
case node.type
|
142
|
+
when :begin
|
143
|
+
return collect_conditions(node.children.first, target, conditions)
|
144
|
+
when :or
|
145
|
+
return collect_conditions(node.lhs, target, conditions) &&
|
146
|
+
collect_conditions(node.rhs, target, conditions)
|
147
|
+
when :match_with_lvasgn
|
148
|
+
lhs, rhs = *node
|
149
|
+
condition_from_binary_op(lhs, rhs, target)
|
150
|
+
when :send
|
151
|
+
condition_from_send_node(node, target)
|
152
|
+
end
|
153
|
+
|
154
|
+
conditions << condition if condition
|
155
|
+
end
|
156
|
+
|
157
|
+
# rubocop:disable Metrics/CyclomaticComplexity
|
158
|
+
def condition_from_send_node(node, target)
|
159
|
+
case node.method_name
|
160
|
+
when :is_a?
|
161
|
+
node.arguments.first if node.receiver == target
|
162
|
+
when :==, :eql?, :equal?, :=~, :match, :match?
|
163
|
+
lhs, _method, rhs = *node
|
164
|
+
condition_from_binary_op(lhs, rhs, target)
|
165
|
+
when :===
|
166
|
+
lhs, _method, rhs = *node
|
167
|
+
lhs if rhs == target
|
168
|
+
when :include?, :cover?
|
169
|
+
receiver = deparenthesize(node.receiver)
|
170
|
+
receiver if receiver.range_type? && node.arguments.first == target
|
171
|
+
end
|
172
|
+
end
|
173
|
+
# rubocop:enable Metrics/CyclomaticComplexity
|
174
|
+
|
175
|
+
def condition_from_binary_op(lhs, rhs, target)
|
176
|
+
lhs = deparenthesize(lhs)
|
177
|
+
rhs = deparenthesize(rhs)
|
178
|
+
|
179
|
+
if lhs == target
|
180
|
+
rhs
|
181
|
+
elsif rhs == target
|
182
|
+
lhs
|
183
|
+
end
|
184
|
+
end
|
185
|
+
|
186
|
+
def branch_conditions(node)
|
187
|
+
conditions = []
|
188
|
+
while node&.if_type?
|
189
|
+
conditions << node.condition
|
190
|
+
node = node.else_branch
|
191
|
+
end
|
192
|
+
conditions
|
193
|
+
end
|
194
|
+
|
195
|
+
def const_reference?(node)
|
196
|
+
return false unless node.const_type?
|
197
|
+
|
198
|
+
name = node.children[1].to_s
|
199
|
+
|
200
|
+
# We can no be sure if, e.g. `C`, represents a constant or a class reference
|
201
|
+
name.length > 1 &&
|
202
|
+
name == name.upcase
|
203
|
+
end
|
204
|
+
|
205
|
+
def deparenthesize(node)
|
206
|
+
node = node.children.last while node.begin_type?
|
207
|
+
node
|
208
|
+
end
|
209
|
+
|
210
|
+
def correction_range(node)
|
211
|
+
range_between(node.parent.loc.keyword.begin_pos, node.loc.expression.end_pos)
|
212
|
+
end
|
213
|
+
|
214
|
+
def indent(node)
|
215
|
+
' ' * node.loc.column
|
216
|
+
end
|
217
|
+
end
|
218
|
+
end
|
219
|
+
end
|
220
|
+
end
|