rubocop 0.89.1 → 0.93.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 +2 -2
- data/config/default.yml +160 -14
- data/lib/rubocop.rb +33 -5
- data/lib/rubocop/cached_data.rb +3 -1
- 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 +9 -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 +14 -5
- data/lib/rubocop/config_loader.rb +20 -9
- data/lib/rubocop/config_loader_resolver.rb +1 -0
- data/lib/rubocop/config_obsoletion.rb +1 -0
- data/lib/rubocop/config_regeneration.rb +33 -0
- data/lib/rubocop/config_store.rb +3 -3
- data/lib/rubocop/config_validator.rb +3 -0
- data/lib/rubocop/cop/base.rb +23 -0
- data/lib/rubocop/cop/bundler/duplicated_gem.rb +5 -1
- data/lib/rubocop/cop/bundler/gem_comment.rb +8 -3
- data/lib/rubocop/cop/bundler/insecure_protocol_source.rb +2 -0
- 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 +4 -4
- 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/gemspec/required_ruby_version.rb +10 -10
- data/lib/rubocop/cop/generator.rb +2 -1
- data/lib/rubocop/cop/internal_affairs/method_name_equal.rb +1 -0
- data/lib/rubocop/cop/internal_affairs/node_type_predicate.rb +1 -0
- data/lib/rubocop/cop/internal_affairs/offense_location_keyword.rb +1 -0
- data/lib/rubocop/cop/internal_affairs/redundant_location_argument.rb +1 -0
- data/lib/rubocop/cop/internal_affairs/redundant_message_argument.rb +1 -0
- data/lib/rubocop/cop/layout/array_alignment.rb +1 -0
- data/lib/rubocop/cop/layout/begin_end_alignment.rb +77 -0
- data/lib/rubocop/cop/layout/block_alignment.rb +23 -19
- data/lib/rubocop/cop/layout/case_indentation.rb +4 -7
- data/lib/rubocop/cop/layout/class_structure.rb +11 -10
- 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 +8 -5
- data/lib/rubocop/cop/layout/dot_position.rb +21 -20
- data/lib/rubocop/cop/layout/empty_comment.rb +30 -23
- data/lib/rubocop/cop/layout/empty_line_after_guard_clause.rb +21 -18
- data/lib/rubocop/cop/layout/empty_line_after_magic_comment.rb +13 -13
- data/lib/rubocop/cop/layout/empty_line_after_multiline_condition.rb +136 -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 +17 -14
- data/lib/rubocop/cop/layout/empty_lines_around_arguments.rb +7 -8
- data/lib/rubocop/cop/layout/empty_lines_around_attribute_accessor.rb +5 -8
- 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 +3 -7
- 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 +11 -17
- 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 +41 -22
- 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 +17 -21
- 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 +20 -23
- data/lib/rubocop/cop/layout/space_inside_array_percent_literal.rb +3 -8
- data/lib/rubocop/cop/layout/space_inside_block_braces.rb +13 -16
- data/lib/rubocop/cop/layout/space_inside_hash_literal_braces.rb +19 -37
- 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 +16 -24
- data/lib/rubocop/cop/layout/space_inside_string_interpolation.rb +12 -13
- 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/ambiguous_block_association.rb +2 -0
- data/lib/rubocop/cop/lint/ambiguous_operator.rb +2 -0
- data/lib/rubocop/cop/lint/ambiguous_regexp_literal.rb +15 -1
- data/lib/rubocop/cop/lint/big_decimal_new.rb +1 -2
- data/lib/rubocop/cop/lint/binary_operator_with_identical_operands.rb +1 -1
- data/lib/rubocop/cop/lint/boolean_symbol.rb +3 -0
- data/lib/rubocop/cop/lint/constant_definition_in_block.rb +74 -0
- data/lib/rubocop/cop/lint/constant_resolution.rb +1 -1
- data/lib/rubocop/cop/lint/debugger.rb +2 -3
- data/lib/rubocop/cop/lint/deprecated_class_methods.rb +1 -3
- data/lib/rubocop/cop/lint/duplicate_methods.rb +2 -4
- data/lib/rubocop/cop/lint/duplicate_require.rb +46 -0
- data/lib/rubocop/cop/lint/duplicate_rescue_exception.rb +2 -15
- data/lib/rubocop/cop/lint/each_with_object_argument.rb +1 -0
- data/lib/rubocop/cop/lint/empty_file.rb +50 -0
- data/lib/rubocop/cop/lint/erb_new_arguments.rb +2 -0
- data/lib/rubocop/cop/lint/float_comparison.rb +2 -2
- data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +2 -2
- data/lib/rubocop/cop/lint/hash_compare_by_identity.rb +37 -0
- data/lib/rubocop/cop/lint/identity_comparison.rb +51 -0
- data/lib/rubocop/cop/lint/ineffective_access_modifier.rb +2 -5
- data/lib/rubocop/cop/lint/inherit_exception.rb +2 -2
- data/lib/rubocop/cop/lint/missing_super.rb +2 -2
- data/lib/rubocop/cop/lint/mixed_regexp_capture_types.rb +3 -35
- data/lib/rubocop/cop/lint/multiple_comparison.rb +3 -1
- data/lib/rubocop/cop/lint/number_conversion.rb +1 -0
- data/lib/rubocop/cop/lint/out_of_range_regexp_ref.rb +9 -20
- data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +1 -1
- data/lib/rubocop/cop/lint/percent_string_array.rb +8 -12
- data/lib/rubocop/cop/lint/raise_exception.rb +1 -0
- data/lib/rubocop/cop/lint/rand_one.rb +2 -1
- data/lib/rubocop/cop/lint/redundant_cop_disable_directive.rb +22 -12
- data/lib/rubocop/cop/lint/redundant_cop_enable_directive.rb +14 -4
- data/lib/rubocop/cop/lint/redundant_require_statement.rb +1 -0
- data/lib/rubocop/cop/lint/redundant_safe_navigation.rb +45 -0
- data/lib/rubocop/cop/lint/rescue_type.rb +0 -1
- data/lib/rubocop/cop/lint/send_with_mixin_argument.rb +3 -1
- data/lib/rubocop/cop/lint/shadowed_exception.rb +6 -6
- data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +4 -4
- data/lib/rubocop/cop/lint/struct_new_override.rb +1 -0
- data/lib/rubocop/cop/lint/to_json.rb +16 -5
- 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/unreachable_loop.rb +3 -6
- data/lib/rubocop/cop/lint/uri_escape_unescape.rb +3 -1
- data/lib/rubocop/cop/lint/uri_regexp.rb +2 -1
- data/lib/rubocop/cop/lint/useless_access_modifier.rb +3 -9
- data/lib/rubocop/cop/lint/useless_method_definition.rb +70 -0
- data/lib/rubocop/cop/lint/useless_times.rb +106 -0
- data/lib/rubocop/cop/metrics/block_length.rb +3 -1
- data/lib/rubocop/cop/metrics/class_length.rb +8 -6
- data/lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +27 -16
- 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 +48 -0
- data/lib/rubocop/cop/mixin/configurable_naming.rb +2 -2
- data/lib/rubocop/cop/mixin/configurable_numbering.rb +3 -3
- 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 +12 -1
- data/lib/rubocop/cop/mixin/first_element_line_break.rb +3 -1
- data/lib/rubocop/cop/mixin/hash_transform_method.rb +27 -2
- 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/rescue_node.rb +11 -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/statement_modifier.rb +9 -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/mixin/visibility_help.rb +4 -16
- data/lib/rubocop/cop/naming/binary_operator_parameter_name.rb +1 -1
- data/lib/rubocop/cop/naming/file_name.rb +1 -1
- data/lib/rubocop/cop/offense.rb +16 -2
- data/lib/rubocop/cop/security/eval.rb +1 -0
- data/lib/rubocop/cop/security/json_load.rb +1 -0
- data/lib/rubocop/cop/security/marshal_load.rb +1 -0
- data/lib/rubocop/cop/security/open.rb +1 -0
- data/lib/rubocop/cop/security/yaml_load.rb +1 -0
- data/lib/rubocop/cop/severity.rb +0 -8
- data/lib/rubocop/cop/style/access_modifier_declarations.rb +7 -11
- data/lib/rubocop/cop/style/accessor_grouping.rb +3 -0
- data/lib/rubocop/cop/style/alias.rb +2 -0
- data/lib/rubocop/cop/style/array_coercion.rb +4 -0
- data/lib/rubocop/cop/style/array_join.rb +1 -0
- data/lib/rubocop/cop/style/attr.rb +1 -0
- data/lib/rubocop/cop/style/auto_resource_cleanup.rb +2 -0
- data/lib/rubocop/cop/style/case_equality.rb +11 -3
- data/lib/rubocop/cop/style/case_like_if.rb +40 -8
- data/lib/rubocop/cop/style/class_and_module_children.rb +2 -0
- data/lib/rubocop/cop/style/class_check.rb +6 -9
- data/lib/rubocop/cop/style/class_equality_comparison.rb +49 -0
- data/lib/rubocop/cop/style/class_methods_definitions.rb +157 -0
- data/lib/rubocop/cop/style/class_vars.rb +1 -2
- data/lib/rubocop/cop/style/combinable_loops.rb +91 -0
- data/lib/rubocop/cop/style/comment_annotation.rb +6 -0
- data/lib/rubocop/cop/style/commented_keyword.rb +7 -8
- data/lib/rubocop/cop/style/conditional_assignment.rb +49 -60
- data/lib/rubocop/cop/style/date_time.rb +12 -1
- data/lib/rubocop/cop/style/dir.rb +1 -0
- data/lib/rubocop/cop/style/double_negation.rb +1 -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/empty_literal.rb +3 -1
- data/lib/rubocop/cop/style/eval_with_location.rb +1 -3
- data/lib/rubocop/cop/style/even_odd.rb +1 -0
- data/lib/rubocop/cop/style/expand_path_arguments.rb +2 -2
- data/lib/rubocop/cop/style/explicit_block_argument.rb +7 -3
- data/lib/rubocop/cop/style/float_division.rb +2 -0
- data/lib/rubocop/cop/style/for.rb +0 -4
- data/lib/rubocop/cop/style/format_string.rb +1 -4
- data/lib/rubocop/cop/style/format_string_token.rb +1 -1
- data/lib/rubocop/cop/style/guard_clause.rb +1 -0
- data/lib/rubocop/cop/style/hash_as_last_array_item.rb +24 -5
- data/lib/rubocop/cop/style/hash_syntax.rb +6 -5
- data/lib/rubocop/cop/style/hash_transform_keys.rb +16 -9
- data/lib/rubocop/cop/style/hash_transform_values.rb +16 -9
- data/lib/rubocop/cop/style/if_unless_modifier.rb +2 -6
- data/lib/rubocop/cop/style/implicit_runtime_error.rb +1 -0
- data/lib/rubocop/cop/style/keyword_parameters_order.rb +53 -0
- data/lib/rubocop/cop/style/lambda_call.rb +3 -1
- data/lib/rubocop/cop/style/method_called_on_do_end_block.rb +10 -1
- data/lib/rubocop/cop/style/method_def_parentheses.rb +0 -4
- data/lib/rubocop/cop/style/mixin_usage.rb +8 -27
- data/lib/rubocop/cop/style/multiline_block_chain.rb +2 -2
- data/lib/rubocop/cop/style/multiline_ternary_operator.rb +14 -1
- data/lib/rubocop/cop/style/multiline_when_then.rb +3 -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 +16 -16
- data/lib/rubocop/cop/style/next.rb +10 -14
- data/lib/rubocop/cop/style/nil_comparison.rb +13 -11
- data/lib/rubocop/cop/style/non_nil_check.rb +34 -26
- data/lib/rubocop/cop/style/not.rb +20 -26
- data/lib/rubocop/cop/style/numeric_literal_prefix.rb +4 -9
- data/lib/rubocop/cop/style/numeric_predicate.rb +5 -14
- data/lib/rubocop/cop/style/one_line_conditional.rb +73 -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/optional_boolean_parameter.rb +12 -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 +11 -14
- data/lib/rubocop/cop/style/proc.rb +6 -6
- data/lib/rubocop/cop/style/raise_args.rb +12 -24
- data/lib/rubocop/cop/style/random_with_offset.rb +19 -19
- data/lib/rubocop/cop/style/redundant_assignment.rb +8 -18
- data/lib/rubocop/cop/style/redundant_begin.rb +28 -12
- data/lib/rubocop/cop/style/redundant_capital_w.rb +6 -9
- data/lib/rubocop/cop/style/redundant_condition.rb +10 -7
- data/lib/rubocop/cop/style/redundant_conditional.rb +4 -5
- data/lib/rubocop/cop/style/redundant_exception.rb +1 -3
- data/lib/rubocop/cop/style/redundant_fetch_block.rb +3 -12
- data/lib/rubocop/cop/style/redundant_file_extension_in_require.rb +9 -8
- data/lib/rubocop/cop/style/redundant_freeze.rb +5 -7
- data/lib/rubocop/cop/style/redundant_interpolation.rb +31 -25
- data/lib/rubocop/cop/style/redundant_parentheses.rb +21 -15
- data/lib/rubocop/cop/style/redundant_percent_q.rb +9 -11
- data/lib/rubocop/cop/style/redundant_regexp_character_class.rb +44 -36
- data/lib/rubocop/cop/style/redundant_regexp_escape.rb +13 -29
- data/lib/rubocop/cop/style/redundant_return.rb +17 -17
- data/lib/rubocop/cop/style/redundant_self.rb +9 -11
- data/lib/rubocop/cop/style/redundant_self_assignment.rb +116 -0
- data/lib/rubocop/cop/style/redundant_sort.rb +12 -29
- data/lib/rubocop/cop/style/redundant_sort_by.rb +5 -9
- 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/rescue_standard_error.rb +20 -16
- data/lib/rubocop/cop/style/return_nil.rb +5 -5
- data/lib/rubocop/cop/style/safe_navigation.rb +18 -12
- data/lib/rubocop/cop/style/sample.rb +12 -14
- 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 +4 -5
- data/lib/rubocop/cop/style/signal_exception.rb +23 -19
- data/lib/rubocop/cop/style/single_argument_dig.rb +1 -0
- 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 +6 -8
- 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 +5 -6
- data/lib/rubocop/cop/style/string_concatenation.rb +17 -3
- 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 +9 -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 +22 -22
- 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 +11 -9
- 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 +5 -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 +12 -18
- data/lib/rubocop/cop/team.rb +1 -0
- data/lib/rubocop/cop/util.rb +1 -2
- data/lib/rubocop/cop/utils/format_string.rb +3 -5
- data/lib/rubocop/cop/variable_force.rb +2 -0
- data/lib/rubocop/cop/variable_force/branch.rb +0 -4
- data/lib/rubocop/cops_documentation_generator.rb +4 -2
- data/lib/rubocop/core_ext/string.rb +2 -2
- data/lib/rubocop/directive_comment.rb +32 -0
- data/lib/rubocop/ext/regexp_node.rb +62 -0
- data/lib/rubocop/file_finder.rb +1 -0
- data/lib/rubocop/formatter/auto_gen_config_formatter.rb +2 -1
- data/lib/rubocop/formatter/disabled_config_formatter.rb +12 -5
- 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 +40 -17
- data/lib/rubocop/remote_config.rb +1 -0
- data/lib/rubocop/result_cache.rb +39 -15
- data/lib/rubocop/rspec/cop_helper.rb +5 -2
- data/lib/rubocop/rspec/expect_offense.rb +14 -9
- data/lib/rubocop/rspec/shared_contexts.rb +12 -0
- data/lib/rubocop/runner.rb +38 -18
- data/lib/rubocop/string_interpreter.rb +3 -0
- data/lib/rubocop/target_finder.rb +28 -26
- data/lib/rubocop/target_ruby.rb +7 -1
- data/lib/rubocop/version.rb +7 -1
- data/lib/rubocop/yaml_duplication_checker.rb +1 -0
- metadata +31 -17
- data/lib/rubocop/cop/mixin/regexp_literal_help.rb +0 -43
- data/lib/rubocop/cop/tokens_util.rb +0 -84
@@ -6,6 +6,11 @@ module RuboCop
|
|
6
6
|
# This cop checks for places where string concatenation
|
7
7
|
# can be replaced with string interpolation.
|
8
8
|
#
|
9
|
+
# The cop can autocorrect simple cases but will skip autocorrecting
|
10
|
+
# more complex cases where the resulting code would be harder to read.
|
11
|
+
# In those cases, it might be useful to extract statements to local
|
12
|
+
# variables or methods which you can then interpolate in a string.
|
13
|
+
#
|
9
14
|
# @example
|
10
15
|
# # bad
|
11
16
|
# email_with_name = user.name + ' <' + user.email + '>'
|
@@ -19,6 +24,7 @@ module RuboCop
|
|
19
24
|
extend AutoCorrector
|
20
25
|
|
21
26
|
MSG = 'Prefer string interpolation to string concatenation.'
|
27
|
+
RESTRICT_ON_SEND = %i[+].freeze
|
22
28
|
|
23
29
|
def_node_matcher :string_concatenation?, <<~PATTERN
|
24
30
|
{
|
@@ -28,7 +34,6 @@ module RuboCop
|
|
28
34
|
PATTERN
|
29
35
|
|
30
36
|
def on_send(node)
|
31
|
-
return unless node.method?(:+)
|
32
37
|
return unless string_concatenation?(node)
|
33
38
|
|
34
39
|
topmost_plus_node = find_topmost_plus_node(node)
|
@@ -37,7 +42,9 @@ module RuboCop
|
|
37
42
|
collect_parts(topmost_plus_node, parts)
|
38
43
|
|
39
44
|
add_offense(topmost_plus_node) do |corrector|
|
40
|
-
|
45
|
+
if parts.none? { |part| uncorrectable?(part) }
|
46
|
+
corrector.replace(topmost_plus_node, replacement(parts))
|
47
|
+
end
|
41
48
|
end
|
42
49
|
end
|
43
50
|
|
@@ -66,6 +73,13 @@ module RuboCop
|
|
66
73
|
node.send_type? && node.method?(:+)
|
67
74
|
end
|
68
75
|
|
76
|
+
def uncorrectable?(part)
|
77
|
+
part.multiline? ||
|
78
|
+
part.dstr_type? ||
|
79
|
+
(part.str_type? && part.heredoc?) ||
|
80
|
+
part.each_descendant(:block).any?
|
81
|
+
end
|
82
|
+
|
69
83
|
def replacement(parts)
|
70
84
|
interpolated_parts =
|
71
85
|
parts.map do |part|
|
@@ -73,7 +87,7 @@ module RuboCop
|
|
73
87
|
if single_quoted?(part)
|
74
88
|
part.value.gsub('\\') { '\\\\' }
|
75
89
|
else
|
76
|
-
|
90
|
+
part.value.inspect[1..-2]
|
77
91
|
end
|
78
92
|
else
|
79
93
|
"\#{#{part.source}}"
|
@@ -12,7 +12,9 @@ module RuboCop
|
|
12
12
|
#
|
13
13
|
# # good
|
14
14
|
# { one: 1, two: 2, three: 3 }
|
15
|
-
class StringHashKeys <
|
15
|
+
class StringHashKeys < Base
|
16
|
+
extend AutoCorrector
|
17
|
+
|
16
18
|
MSG = 'Prefer symbols instead of strings as hash keys.'
|
17
19
|
|
18
20
|
def_node_matcher :string_hash_key?, <<~PATTERN
|
@@ -35,13 +37,10 @@ module RuboCop
|
|
35
37
|
return unless string_hash_key?(node)
|
36
38
|
return if receive_environments_method?(node)
|
37
39
|
|
38
|
-
add_offense(node.key)
|
39
|
-
|
40
|
+
add_offense(node.key) do |corrector|
|
41
|
+
symbol_content = node.key.str_content.to_sym.inspect
|
40
42
|
|
41
|
-
|
42
|
-
lambda do |corrector|
|
43
|
-
symbol_content = node.str_content.to_sym.inspect
|
44
|
-
corrector.replace(node, symbol_content)
|
43
|
+
corrector.replace(node.key, symbol_content)
|
45
44
|
end
|
46
45
|
end
|
47
46
|
end
|
@@ -14,32 +14,22 @@ module RuboCop
|
|
14
14
|
# # good
|
15
15
|
# 'name'.to_sym
|
16
16
|
# 'var'.preferred_method
|
17
|
-
class StringMethods <
|
17
|
+
class StringMethods < Base
|
18
18
|
include MethodPreference
|
19
|
+
extend AutoCorrector
|
19
20
|
|
20
21
|
MSG = 'Prefer `%<prefer>s` over `%<current>s`.'
|
21
22
|
|
22
23
|
def on_send(node)
|
23
|
-
return unless preferred_method(node.method_name)
|
24
|
+
return unless (preferred_method = preferred_method(node.method_name))
|
24
25
|
|
25
|
-
|
26
|
-
end
|
27
|
-
alias on_csend on_send
|
26
|
+
message = format(MSG, prefer: preferred_method, current: node.method_name)
|
28
27
|
|
29
|
-
|
30
|
-
|
31
|
-
corrector.replace(node.loc.selector,
|
32
|
-
preferred_method(node.method_name))
|
28
|
+
add_offense(node.loc.selector, message: message) do |corrector|
|
29
|
+
corrector.replace(node.loc.selector, preferred_method(node.method_name))
|
33
30
|
end
|
34
31
|
end
|
35
|
-
|
36
|
-
private
|
37
|
-
|
38
|
-
def message(node)
|
39
|
-
format(MSG,
|
40
|
-
prefer: preferred_method(node.method_name),
|
41
|
-
current: node.method_name)
|
42
|
-
end
|
32
|
+
alias on_csend on_send
|
43
33
|
end
|
44
34
|
end
|
45
35
|
end
|
@@ -13,10 +13,12 @@ module RuboCop
|
|
13
13
|
#
|
14
14
|
# # good
|
15
15
|
# 'abc'.strip
|
16
|
-
class Strip <
|
16
|
+
class Strip < Base
|
17
17
|
include RangeHelp
|
18
|
+
extend AutoCorrector
|
18
19
|
|
19
20
|
MSG = 'Use `strip` instead of `%<methods>s`.'
|
21
|
+
RESTRICT_ON_SEND = %i[lstrip rstrip].freeze
|
20
22
|
|
21
23
|
def_node_matcher :lstrip_rstrip, <<~PATTERN
|
22
24
|
{(send $(send _ $:rstrip) $:lstrip)
|
@@ -25,20 +27,13 @@ module RuboCop
|
|
25
27
|
|
26
28
|
def on_send(node)
|
27
29
|
lstrip_rstrip(node) do |first_send, method_one, method_two|
|
28
|
-
range = range_between(first_send.loc.selector.begin_pos,
|
29
|
-
|
30
|
-
add_offense(node,
|
31
|
-
location: range,
|
32
|
-
message: format(MSG,
|
33
|
-
methods: "#{method_one}.#{method_two}"))
|
34
|
-
end
|
35
|
-
end
|
30
|
+
range = range_between(first_send.loc.selector.begin_pos, node.source_range.end_pos)
|
31
|
+
message = format(MSG, methods: "#{method_one}.#{method_two}")
|
36
32
|
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
->(corrector) { corrector.replace(range, 'strip') }
|
33
|
+
add_offense(range, message: message) do |corrector|
|
34
|
+
corrector.replace(range, 'strip')
|
35
|
+
end
|
36
|
+
end
|
42
37
|
end
|
43
38
|
end
|
44
39
|
end
|
@@ -19,8 +19,9 @@ module RuboCop
|
|
19
19
|
# 42
|
20
20
|
# end
|
21
21
|
# end
|
22
|
-
class StructInheritance <
|
22
|
+
class StructInheritance < Base
|
23
23
|
include RangeHelp
|
24
|
+
extend AutoCorrector
|
24
25
|
|
25
26
|
MSG = "Don't extend an instance initialized by `Struct.new`. " \
|
26
27
|
'Use a block to customize the struct.'
|
@@ -28,11 +29,7 @@ module RuboCop
|
|
28
29
|
def on_class(node)
|
29
30
|
return unless struct_constructor?(node.parent_class)
|
30
31
|
|
31
|
-
add_offense(node
|
32
|
-
end
|
33
|
-
|
34
|
-
def autocorrect(node)
|
35
|
-
lambda do |corrector|
|
32
|
+
add_offense(node.parent_class.source_range) do |corrector|
|
36
33
|
corrector.remove(range_with_surrounding_space(range: node.loc.keyword, newlines: false))
|
37
34
|
corrector.replace(node.loc.operator, '=')
|
38
35
|
|
@@ -27,11 +27,12 @@ module RuboCop
|
|
27
27
|
#
|
28
28
|
# # bad
|
29
29
|
# %i[foo bar baz]
|
30
|
-
class SymbolArray <
|
30
|
+
class SymbolArray < Base
|
31
31
|
include ArrayMinSize
|
32
32
|
include ArraySyntax
|
33
33
|
include ConfigurableEnforcedStyle
|
34
34
|
include PercentArray
|
35
|
+
extend AutoCorrector
|
35
36
|
|
36
37
|
PERCENT_MSG = 'Use `%i` or `%I` for an array of symbols.'
|
37
38
|
ARRAY_MSG = 'Use `[]` for an array of symbols.'
|
@@ -44,22 +45,12 @@ module RuboCop
|
|
44
45
|
if bracketed_array_of?(:sym, node)
|
45
46
|
return if symbols_contain_spaces?(node)
|
46
47
|
|
47
|
-
check_bracketed_array(node)
|
48
|
+
check_bracketed_array(node, 'i')
|
48
49
|
elsif node.percent_literal?(:symbol)
|
49
50
|
check_percent_array(node)
|
50
51
|
end
|
51
52
|
end
|
52
53
|
|
53
|
-
def autocorrect(node)
|
54
|
-
if style == :percent
|
55
|
-
PercentLiteralCorrector
|
56
|
-
.new(@config, @preferred_delimiters)
|
57
|
-
.correct(node, 'i')
|
58
|
-
else
|
59
|
-
correct_bracketed(node)
|
60
|
-
end
|
61
|
-
end
|
62
|
-
|
63
54
|
private
|
64
55
|
|
65
56
|
def symbols_contain_spaces?(node)
|
@@ -69,7 +60,7 @@ module RuboCop
|
|
69
60
|
end
|
70
61
|
end
|
71
62
|
|
72
|
-
def correct_bracketed(node)
|
63
|
+
def correct_bracketed(corrector, node)
|
73
64
|
syms = node.children.map do |c|
|
74
65
|
if c.dsym_type?
|
75
66
|
string_literal = to_string_literal(c.source)
|
@@ -80,9 +71,7 @@ module RuboCop
|
|
80
71
|
end
|
81
72
|
end
|
82
73
|
|
83
|
-
|
84
|
-
corrector.replace(node, "[#{syms.join(', ')}]")
|
85
|
-
end
|
74
|
+
corrector.replace(node, "[#{syms.join(', ')}]")
|
86
75
|
end
|
87
76
|
|
88
77
|
def to_symbol_literal(string)
|
@@ -12,17 +12,15 @@ module RuboCop
|
|
12
12
|
#
|
13
13
|
# # good
|
14
14
|
# :symbol
|
15
|
-
class SymbolLiteral <
|
15
|
+
class SymbolLiteral < Base
|
16
|
+
extend AutoCorrector
|
17
|
+
|
16
18
|
MSG = 'Do not use strings for word-like symbol literals.'
|
17
19
|
|
18
20
|
def on_sym(node)
|
19
21
|
return unless /\A:["'][A-Za-z_]\w*["']\z/.match?(node.source)
|
20
22
|
|
21
|
-
add_offense(node)
|
22
|
-
end
|
23
|
-
|
24
|
-
def autocorrect(node)
|
25
|
-
lambda do |corrector|
|
23
|
+
add_offense(node) do |corrector|
|
26
24
|
corrector.replace(node, node.source.delete(%q('")))
|
27
25
|
end
|
28
26
|
end
|
@@ -11,9 +11,10 @@ module RuboCop
|
|
11
11
|
#
|
12
12
|
# # good
|
13
13
|
# something.map(&:upcase)
|
14
|
-
class SymbolProc <
|
14
|
+
class SymbolProc < Base
|
15
15
|
include RangeHelp
|
16
16
|
include IgnoredMethods
|
17
|
+
extend AutoCorrector
|
17
18
|
|
18
19
|
MSG = 'Pass `&:%<method>s` as an argument to `%<block_method>s` ' \
|
19
20
|
'instead of a block.'
|
@@ -49,30 +50,25 @@ module RuboCop
|
|
49
50
|
argument_node.one? && argument_node.source.include?(',')
|
50
51
|
end
|
51
52
|
|
52
|
-
def autocorrect(node)
|
53
|
-
lambda do |corrector|
|
54
|
-
if node.send_node.arguments?
|
55
|
-
autocorrect_with_args(corrector, node,
|
56
|
-
node.send_node.arguments,
|
57
|
-
node.body.method_name)
|
58
|
-
else
|
59
|
-
autocorrect_without_args(corrector, node)
|
60
|
-
end
|
61
|
-
end
|
62
|
-
end
|
63
|
-
|
64
53
|
private
|
65
54
|
|
66
55
|
def register_offense(node, method_name, block_method_name)
|
67
56
|
block_start = node.loc.begin.begin_pos
|
68
57
|
block_end = node.loc.end.end_pos
|
69
58
|
range = range_between(block_start, block_end)
|
59
|
+
message = format(MSG, method: method_name, block_method: block_method_name)
|
60
|
+
|
61
|
+
add_offense(range, message: message) do |corrector|
|
62
|
+
autocorrect(corrector, node)
|
63
|
+
end
|
64
|
+
end
|
70
65
|
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
66
|
+
def autocorrect(corrector, node)
|
67
|
+
if node.send_node.arguments?
|
68
|
+
autocorrect_with_args(corrector, node, node.send_node.arguments, node.body.method_name)
|
69
|
+
else
|
70
|
+
autocorrect_without_args(corrector, node)
|
71
|
+
end
|
76
72
|
end
|
77
73
|
|
78
74
|
def autocorrect_without_args(corrector, node)
|
@@ -54,10 +54,11 @@ module RuboCop
|
|
54
54
|
# # bad
|
55
55
|
# foo = (bar = baz) ? a : b
|
56
56
|
#
|
57
|
-
class TernaryParentheses <
|
57
|
+
class TernaryParentheses < Base
|
58
58
|
include SafeAssignment
|
59
59
|
include ConfigurableEnforcedStyle
|
60
60
|
include SurroundingSpace
|
61
|
+
extend AutoCorrector
|
61
62
|
|
62
63
|
VARIABLE_TYPES = AST::Node::VARIABLES
|
63
64
|
NON_COMPLEX_TYPES = [*VARIABLE_TYPES, :const, :defined?, :yield].freeze
|
@@ -70,14 +71,20 @@ module RuboCop
|
|
70
71
|
return if only_closing_parenthesis_is_last_line?(node.condition)
|
71
72
|
return unless node.ternary? && !infinite_loop? && offense?(node)
|
72
73
|
|
73
|
-
|
74
|
+
message = message(node)
|
75
|
+
|
76
|
+
add_offense(node.source_range, message: message) do |corrector|
|
77
|
+
autocorrect(corrector, node)
|
78
|
+
end
|
74
79
|
end
|
75
80
|
|
76
81
|
def only_closing_parenthesis_is_last_line?(condition)
|
77
82
|
condition.source.split("\n").last == ')'
|
78
83
|
end
|
79
84
|
|
80
|
-
|
85
|
+
private
|
86
|
+
|
87
|
+
def autocorrect(corrector, node)
|
81
88
|
condition = node.condition
|
82
89
|
|
83
90
|
return nil if parenthesized?(condition) &&
|
@@ -85,14 +92,12 @@ module RuboCop
|
|
85
92
|
unsafe_autocorrect?(condition))
|
86
93
|
|
87
94
|
if parenthesized?(condition)
|
88
|
-
correct_parenthesized(condition)
|
95
|
+
correct_parenthesized(corrector, condition)
|
89
96
|
else
|
90
|
-
correct_unparenthesized(condition)
|
97
|
+
correct_unparenthesized(corrector, condition)
|
91
98
|
end
|
92
99
|
end
|
93
100
|
|
94
|
-
private
|
95
|
-
|
96
101
|
def offense?(node)
|
97
102
|
condition = node.condition
|
98
103
|
|
@@ -191,27 +196,22 @@ module RuboCop
|
|
191
196
|
(send {_ nil?} $_ _ ...)}
|
192
197
|
PATTERN
|
193
198
|
|
194
|
-
def correct_parenthesized(condition)
|
195
|
-
|
196
|
-
|
197
|
-
corrector.remove(condition.loc.end)
|
199
|
+
def correct_parenthesized(corrector, condition)
|
200
|
+
corrector.remove(condition.loc.begin)
|
201
|
+
corrector.remove(condition.loc.end)
|
198
202
|
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
end
|
203
|
+
# Ruby allows no space between the question mark and parentheses.
|
204
|
+
# If we remove the parentheses, we need to add a space or we'll
|
205
|
+
# generate invalid code.
|
206
|
+
corrector.insert_after(condition.loc.end, ' ') unless whitespace_after?(condition)
|
204
207
|
end
|
205
208
|
|
206
|
-
def correct_unparenthesized(condition)
|
207
|
-
|
208
|
-
corrector.wrap(condition, '(', ')')
|
209
|
-
end
|
209
|
+
def correct_unparenthesized(corrector, condition)
|
210
|
+
corrector.wrap(condition, '(', ')')
|
210
211
|
end
|
211
212
|
|
212
213
|
def whitespace_after?(node)
|
213
|
-
|
214
|
-
last_token = processed_source.tokens[index]
|
214
|
+
last_token = processed_source.last_token_of(node)
|
215
215
|
last_token.space_after?
|
216
216
|
end
|
217
217
|
end
|
@@ -15,20 +15,17 @@ module RuboCop
|
|
15
15
|
# def foo; end
|
16
16
|
# end
|
17
17
|
#
|
18
|
-
class TrailingBodyOnClass <
|
18
|
+
class TrailingBodyOnClass < Base
|
19
19
|
include Alignment
|
20
20
|
include TrailingBody
|
21
|
+
extend AutoCorrector
|
21
22
|
|
22
23
|
MSG = 'Place the first line of class body on its own line.'
|
23
24
|
|
24
25
|
def on_class(node)
|
25
26
|
return unless trailing_body?(node)
|
26
27
|
|
27
|
-
add_offense(
|
28
|
-
end
|
29
|
-
|
30
|
-
def autocorrect(node)
|
31
|
-
lambda do |corrector|
|
28
|
+
add_offense(first_part_of(node.to_a.last)) do |corrector|
|
32
29
|
LineBreakCorrector.correct_trailing_body(
|
33
30
|
configured_width: configured_indentation_width,
|
34
31
|
corrector: corrector,
|
@@ -24,9 +24,10 @@ module RuboCop
|
|
24
24
|
# b[c: x]
|
25
25
|
# end
|
26
26
|
#
|
27
|
-
class TrailingBodyOnMethodDefinition <
|
27
|
+
class TrailingBodyOnMethodDefinition < Base
|
28
28
|
include Alignment
|
29
29
|
include TrailingBody
|
30
|
+
extend AutoCorrector
|
30
31
|
|
31
32
|
MSG = "Place the first line of a multi-line method definition's " \
|
32
33
|
'body on its own line.'
|
@@ -34,12 +35,7 @@ module RuboCop
|
|
34
35
|
def on_def(node)
|
35
36
|
return unless trailing_body?(node)
|
36
37
|
|
37
|
-
add_offense(
|
38
|
-
end
|
39
|
-
alias on_defs on_def
|
40
|
-
|
41
|
-
def autocorrect(node)
|
42
|
-
lambda do |corrector|
|
38
|
+
add_offense(first_part_of(node.body)) do |corrector|
|
43
39
|
LineBreakCorrector.correct_trailing_body(
|
44
40
|
configured_width: configured_indentation_width,
|
45
41
|
corrector: corrector,
|
@@ -48,6 +44,7 @@ module RuboCop
|
|
48
44
|
)
|
49
45
|
end
|
50
46
|
end
|
47
|
+
alias on_defs on_def
|
51
48
|
end
|
52
49
|
end
|
53
50
|
end
|