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
@@ -0,0 +1,106 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RuboCop
|
4
|
+
module Cop
|
5
|
+
module Lint
|
6
|
+
# This cop checks for uses of `Integer#times` that will never yield
|
7
|
+
# (when the integer <= 0) or that will only ever yield once
|
8
|
+
# (`1.times`).
|
9
|
+
#
|
10
|
+
# This cop is marked as unsafe as `times` returns its receiver, which
|
11
|
+
# is *usually* OK, but might change behavior.
|
12
|
+
#
|
13
|
+
# @example
|
14
|
+
# # bad
|
15
|
+
# -5.times { do_something }
|
16
|
+
# 0.times { do_something }
|
17
|
+
# 1.times { do_something }
|
18
|
+
# 1.times { |i| do_something(i) }
|
19
|
+
#
|
20
|
+
# # good
|
21
|
+
# do_something
|
22
|
+
# do_something(1)
|
23
|
+
class UselessTimes < Base
|
24
|
+
include RangeHelp
|
25
|
+
extend AutoCorrector
|
26
|
+
|
27
|
+
MSG = 'Useless call to `%<count>i.times` detected.'
|
28
|
+
RESTRICT_ON_SEND = %i[times].freeze
|
29
|
+
|
30
|
+
def_node_matcher :times_call?, <<~PATTERN
|
31
|
+
(send (int $_) :times (block-pass (sym $_))?)
|
32
|
+
PATTERN
|
33
|
+
|
34
|
+
def_node_matcher :block_arg, <<~PATTERN
|
35
|
+
(block _ (args (arg $_)) ...)
|
36
|
+
PATTERN
|
37
|
+
|
38
|
+
def_node_search :block_reassigns_arg?, <<~PATTERN
|
39
|
+
(lvasgn %)
|
40
|
+
PATTERN
|
41
|
+
|
42
|
+
def on_send(node)
|
43
|
+
return unless (count, proc_name = times_call?(node))
|
44
|
+
return if count > 1
|
45
|
+
|
46
|
+
# Get the block node if applicable
|
47
|
+
node = node.block_node if node.block_literal?
|
48
|
+
|
49
|
+
add_offense(node, message: format(MSG, count: count)) do |corrector|
|
50
|
+
next unless own_line?(node)
|
51
|
+
|
52
|
+
if never_process?(count, node)
|
53
|
+
remove_node(corrector, node)
|
54
|
+
elsif !proc_name.empty?
|
55
|
+
autocorrect_block_pass(corrector, node, proc_name)
|
56
|
+
else
|
57
|
+
autocorrect_block(corrector, node)
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
private
|
63
|
+
|
64
|
+
def never_process?(count, node)
|
65
|
+
count < 1 || node.block_type? && node.body.nil?
|
66
|
+
end
|
67
|
+
|
68
|
+
def remove_node(corrector, node)
|
69
|
+
corrector.remove(range_by_whole_lines(node.loc.expression, include_final_newline: true))
|
70
|
+
end
|
71
|
+
|
72
|
+
def autocorrect_block_pass(corrector, node, proc_name)
|
73
|
+
corrector.replace(node, proc_name)
|
74
|
+
end
|
75
|
+
|
76
|
+
def autocorrect_block(corrector, node)
|
77
|
+
block_arg = block_arg(node)
|
78
|
+
return if block_reassigns_arg?(node, block_arg)
|
79
|
+
|
80
|
+
source = node.body.source
|
81
|
+
source.gsub!(/\b#{block_arg}\b/, '1') if block_arg
|
82
|
+
|
83
|
+
corrector.replace(node, fix_indentation(source, node.loc.column...node.body.loc.column))
|
84
|
+
end
|
85
|
+
|
86
|
+
def fix_indentation(source, range)
|
87
|
+
# Cleanup indentation in a multiline block
|
88
|
+
source_lines = source.split("\n")
|
89
|
+
|
90
|
+
source_lines[1..-1].each do |line|
|
91
|
+
next if line.empty?
|
92
|
+
|
93
|
+
line[range] = ''
|
94
|
+
end
|
95
|
+
source_lines.join("\n")
|
96
|
+
end
|
97
|
+
|
98
|
+
def own_line?(node)
|
99
|
+
# If there is anything else on the line other than whitespace,
|
100
|
+
# don't try to autocorrect
|
101
|
+
processed_source.buffer.source_line(node.loc.line)[0...node.loc.column] !~ /\S/
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
105
|
+
end
|
106
|
+
end
|
@@ -29,6 +29,8 @@ module RuboCop
|
|
29
29
|
# content.
|
30
30
|
# HEREDOC
|
31
31
|
# end # 5 points
|
32
|
+
#
|
33
|
+
# NOTE: This cop does not apply for `Struct` definitions.
|
32
34
|
class BlockLength < Base
|
33
35
|
include CodeLength
|
34
36
|
|
@@ -36,7 +38,7 @@ module RuboCop
|
|
36
38
|
|
37
39
|
def on_block(node)
|
38
40
|
return if excluded_method?(node)
|
39
|
-
return if node.class_constructor?
|
41
|
+
return if node.class_constructor? || node.struct_constructor?
|
40
42
|
|
41
43
|
check_code_length(node)
|
42
44
|
end
|
@@ -29,6 +29,8 @@ module RuboCop
|
|
29
29
|
# HEREDOC
|
30
30
|
# end # 5 points
|
31
31
|
#
|
32
|
+
#
|
33
|
+
# NOTE: This cop also applies for `Struct` definitions.
|
32
34
|
class ClassLength < Base
|
33
35
|
include CodeLength
|
34
36
|
|
@@ -37,17 +39,17 @@ module RuboCop
|
|
37
39
|
end
|
38
40
|
|
39
41
|
def on_casgn(node)
|
40
|
-
|
41
|
-
|
42
|
+
if node.parent&.assignment?
|
43
|
+
block_node = node.parent.children[1]
|
44
|
+
else
|
45
|
+
_scope, _name, block_node = *node
|
42
46
|
end
|
47
|
+
|
48
|
+
check_code_length(block_node) if block_node.class_definition?
|
43
49
|
end
|
44
50
|
|
45
51
|
private
|
46
52
|
|
47
|
-
def_node_matcher :class_definition?, <<~PATTERN
|
48
|
-
(casgn nil? _ (block (send (const {nil? cbase} :Class) :new) ...))
|
49
|
-
PATTERN
|
50
|
-
|
51
53
|
def message(length, max_length)
|
52
54
|
format('Class has too many lines. [%<length>d/%<max>d]',
|
53
55
|
length: length,
|
@@ -31,6 +31,8 @@ module RuboCop
|
|
31
31
|
# TODO: move to rubocop-ast
|
32
32
|
ARGUMENT_TYPES = %i[arg optarg restarg kwarg kwoptarg kwrestarg blockarg].freeze
|
33
33
|
|
34
|
+
private_constant :BRANCH_NODES, :CONDITION_NODES, :ARGUMENT_TYPES
|
35
|
+
|
34
36
|
def initialize(node)
|
35
37
|
@assignment = 0
|
36
38
|
@branch = 0
|
@@ -79,40 +81,49 @@ module RuboCop
|
|
79
81
|
private
|
80
82
|
|
81
83
|
def assignment?(node)
|
84
|
+
return compound_assignment(node) if node.masgn_type? || node.shorthand_asgn?
|
85
|
+
|
82
86
|
node.for_type? ||
|
83
|
-
node.op_asgn_type? ||
|
84
87
|
(node.respond_to?(:setter_method?) && node.setter_method?) ||
|
85
|
-
|
88
|
+
simple_assignment?(node) ||
|
89
|
+
argument?(node)
|
86
90
|
end
|
87
91
|
|
88
|
-
def
|
89
|
-
|
92
|
+
def compound_assignment(node)
|
93
|
+
# Methods setter can not be detected for multiple assignments
|
94
|
+
# and shorthand assigns, so we'll count them here instead
|
95
|
+
children = node.masgn_type? ? node.children[0].children : node.children
|
90
96
|
|
91
|
-
|
92
|
-
|
93
|
-
|
97
|
+
will_be_miscounted = children.count do |child|
|
98
|
+
child.respond_to?(:setter_method?) &&
|
99
|
+
!child.setter_method?
|
94
100
|
end
|
101
|
+
@assignment += will_be_miscounted
|
95
102
|
|
96
|
-
|
103
|
+
false
|
97
104
|
end
|
98
105
|
|
99
|
-
def
|
100
|
-
|
106
|
+
def simple_assignment?(node)
|
107
|
+
if !node.equals_asgn?
|
108
|
+
false
|
109
|
+
elsif node.lvasgn_type?
|
110
|
+
reset_on_lvasgn(node)
|
111
|
+
capturing_variable?(node.children.first)
|
112
|
+
else
|
113
|
+
true
|
114
|
+
end
|
101
115
|
end
|
102
116
|
|
103
|
-
|
104
|
-
|
105
|
-
def assignment_doubled_in_ast?(node)
|
106
|
-
node.masgn_type? || node.or_asgn_type? || node.and_asgn_type?
|
117
|
+
def capturing_variable?(name)
|
118
|
+
name && !/^_/.match?(name)
|
107
119
|
end
|
108
120
|
|
109
121
|
def branch?(node)
|
110
122
|
BRANCH_NODES.include?(node.type)
|
111
123
|
end
|
112
124
|
|
113
|
-
# TODO: move to rubocop-ast
|
114
125
|
def argument?(node)
|
115
|
-
ARGUMENT_TYPES.include?(node.type)
|
126
|
+
ARGUMENT_TYPES.include?(node.type) && capturing_variable?(node.children.first)
|
116
127
|
end
|
117
128
|
|
118
129
|
def condition?(node)
|
@@ -11,6 +11,7 @@ module RuboCop
|
|
11
11
|
|
12
12
|
FOLDABLE_TYPES = %i[array hash heredoc].freeze
|
13
13
|
CLASSLIKE_TYPES = %i[class module].freeze
|
14
|
+
private_constant :FOLDABLE_TYPES, :CLASSLIKE_TYPES
|
14
15
|
|
15
16
|
def initialize(node, processed_source, count_comments: false, foldable_types: [])
|
16
17
|
@node = node
|
@@ -42,6 +42,7 @@ module RuboCop
|
|
42
42
|
end
|
43
43
|
end
|
44
44
|
|
45
|
+
# @api private
|
45
46
|
def each_bad_alignment(items, base_column)
|
46
47
|
prev_line = -1
|
47
48
|
items.each do |current|
|
@@ -55,11 +56,13 @@ module RuboCop
|
|
55
56
|
end
|
56
57
|
end
|
57
58
|
|
59
|
+
# @api public
|
58
60
|
def display_column(range)
|
59
61
|
line = processed_source.lines[range.line - 1]
|
60
62
|
Unicode::DisplayWidth.of(line[0, range.column])
|
61
63
|
end
|
62
64
|
|
65
|
+
# @api public
|
63
66
|
def within?(inner, outer)
|
64
67
|
inner.begin_pos >= outer.begin_pos && inner.end_pos <= outer.end_pos
|
65
68
|
end
|
@@ -7,12 +7,14 @@ module RuboCop
|
|
7
7
|
module AnnotationComment
|
8
8
|
private
|
9
9
|
|
10
|
+
# @api public
|
10
11
|
def annotation?(comment)
|
11
12
|
_margin, first_word, colon, space, note = split_comment(comment)
|
12
13
|
keyword_appearance?(first_word, colon, space) &&
|
13
14
|
!just_first_word_of_sentence?(first_word, colon, space, note)
|
14
15
|
end
|
15
16
|
|
17
|
+
# @api public
|
16
18
|
def split_comment(comment)
|
17
19
|
match = comment.text.match(/^(# ?)([A-Za-z]+)(\s*:)?(\s+)?(\S+)?/)
|
18
20
|
return false unless match
|
@@ -20,14 +22,17 @@ module RuboCop
|
|
20
22
|
match.captures
|
21
23
|
end
|
22
24
|
|
25
|
+
# @api public
|
23
26
|
def keyword_appearance?(first_word, colon, space)
|
24
27
|
first_word && keyword?(first_word.upcase) && (colon || space)
|
25
28
|
end
|
26
29
|
|
30
|
+
# @api private
|
27
31
|
def just_first_word_of_sentence?(first_word, colon, space, note)
|
28
32
|
first_word == first_word.capitalize && !colon && space && note
|
29
33
|
end
|
30
34
|
|
35
|
+
# @api public
|
31
36
|
def keyword?(word)
|
32
37
|
config.for_cop('Style/CommentAnnotation')['Keywords'].include?(word)
|
33
38
|
end
|
@@ -54,6 +54,7 @@ module RuboCop
|
|
54
54
|
|
55
55
|
private
|
56
56
|
|
57
|
+
# @api private
|
57
58
|
def extract_breakable_node_from_elements(node, elements, max)
|
58
59
|
return unless breakable_collection?(node, elements)
|
59
60
|
return if safe_to_ignore?(node)
|
@@ -65,6 +66,7 @@ module RuboCop
|
|
65
66
|
extract_first_element_over_column_limit(node, elements, max)
|
66
67
|
end
|
67
68
|
|
69
|
+
# @api private
|
68
70
|
def extract_first_element_over_column_limit(node, elements, max)
|
69
71
|
line = node.first_line
|
70
72
|
i = 0
|
@@ -74,10 +76,12 @@ module RuboCop
|
|
74
76
|
elements[i - 1]
|
75
77
|
end
|
76
78
|
|
79
|
+
# @api private
|
77
80
|
def within_column_limit?(element, max, line)
|
78
81
|
element && element.loc.column < max && element.loc.line == line
|
79
82
|
end
|
80
83
|
|
84
|
+
# @api private
|
81
85
|
def safe_to_ignore?(node)
|
82
86
|
return true unless max
|
83
87
|
return true if already_on_multiple_lines?(node)
|
@@ -93,6 +97,7 @@ module RuboCop
|
|
93
97
|
false
|
94
98
|
end
|
95
99
|
|
100
|
+
# @api private
|
96
101
|
def breakable_collection?(node, elements)
|
97
102
|
# For simplicity we only want to insert breaks in normal
|
98
103
|
# hashes wrapped in a set of curly braces like {foo: 1}.
|
@@ -109,6 +114,7 @@ module RuboCop
|
|
109
114
|
starts_with_bracket && has_second_element
|
110
115
|
end
|
111
116
|
|
117
|
+
# @api private
|
112
118
|
def contained_by_breakable_collection_on_same_line?(node)
|
113
119
|
node.each_ancestor.find do |ancestor|
|
114
120
|
# Ignore ancestors on different lines.
|
@@ -128,12 +134,12 @@ module RuboCop
|
|
128
134
|
false
|
129
135
|
end
|
130
136
|
|
137
|
+
# @api private
|
131
138
|
def contained_by_multiline_collection_that_could_be_broken_up?(node)
|
132
139
|
node.each_ancestor.find do |ancestor|
|
133
|
-
if ancestor.hash_type? || ancestor.array_type?
|
134
|
-
|
135
|
-
|
136
|
-
end
|
140
|
+
if (ancestor.hash_type? || ancestor.array_type?) &&
|
141
|
+
breakable_collection?(ancestor, ancestor.children)
|
142
|
+
return children_could_be_broken_up?(ancestor.children)
|
137
143
|
end
|
138
144
|
|
139
145
|
next unless ancestor.send_type?
|
@@ -145,6 +151,7 @@ module RuboCop
|
|
145
151
|
false
|
146
152
|
end
|
147
153
|
|
154
|
+
# @api private
|
148
155
|
def children_could_be_broken_up?(children)
|
149
156
|
return false if all_on_same_line?(children)
|
150
157
|
|
@@ -157,12 +164,14 @@ module RuboCop
|
|
157
164
|
false
|
158
165
|
end
|
159
166
|
|
167
|
+
# @api private
|
160
168
|
def all_on_same_line?(nodes)
|
161
169
|
return true if nodes.empty?
|
162
170
|
|
163
171
|
nodes.first.first_line == nodes.last.last_line
|
164
172
|
end
|
165
173
|
|
174
|
+
# @api private
|
166
175
|
def process_args(args)
|
167
176
|
# If there is a trailing hash arg without explicit braces, like this:
|
168
177
|
#
|
@@ -170,12 +179,12 @@ module RuboCop
|
|
170
179
|
#
|
171
180
|
# ...then each key/value pair is treated as a method 'argument'
|
172
181
|
# when determining where line breaks should appear.
|
173
|
-
|
174
|
-
|
175
|
-
end
|
182
|
+
last_arg = args.last
|
183
|
+
args = args[0...-1] + last_arg.children if last_arg&.hash_type? && !last_arg&.braces?
|
176
184
|
args
|
177
185
|
end
|
178
186
|
|
187
|
+
# @api private
|
179
188
|
def already_on_multiple_lines?(node)
|
180
189
|
node.first_line != node.last_line
|
181
190
|
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RuboCop
|
4
|
+
module Cop
|
5
|
+
# Help methods for working with nodes containing comments.
|
6
|
+
module CommentsHelp
|
7
|
+
include VisibilityHelp
|
8
|
+
|
9
|
+
def source_range_with_comment(node)
|
10
|
+
begin_pos = begin_pos_with_comment(node)
|
11
|
+
end_pos = end_position_for(node)
|
12
|
+
end_pos += 1 if node.def_type?
|
13
|
+
|
14
|
+
Parser::Source::Range.new(buffer, begin_pos, end_pos)
|
15
|
+
end
|
16
|
+
|
17
|
+
private
|
18
|
+
|
19
|
+
def end_position_for(node)
|
20
|
+
end_line = buffer.line_for_position(node.loc.expression.end_pos)
|
21
|
+
buffer.line_range(end_line).end_pos
|
22
|
+
end
|
23
|
+
|
24
|
+
def begin_pos_with_comment(node)
|
25
|
+
annotation_line = node.first_line - 1
|
26
|
+
first_comment = nil
|
27
|
+
|
28
|
+
processed_source.comments_before_line(annotation_line)
|
29
|
+
.reverse_each do |comment|
|
30
|
+
if comment.location.line == annotation_line
|
31
|
+
first_comment = comment
|
32
|
+
annotation_line -= 1
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
start_line_position(first_comment || node)
|
37
|
+
end
|
38
|
+
|
39
|
+
def start_line_position(node)
|
40
|
+
buffer.line_range(node.loc.line).begin_pos - 1
|
41
|
+
end
|
42
|
+
|
43
|
+
def buffer
|
44
|
+
processed_source.buffer
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|