rubocop 0.87.1 → 0.91.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/bin/rubocop-profile +32 -0
- data/config/default.yml +267 -33
- data/lib/rubocop.rb +45 -5
- data/lib/rubocop/cached_data.rb +1 -0
- data/lib/rubocop/cli.rb +2 -2
- data/lib/rubocop/cli/command.rb +1 -0
- data/lib/rubocop/cli/command/auto_genenerate_config.rb +4 -3
- data/lib/rubocop/cli/command/base.rb +2 -0
- data/lib/rubocop/cli/command/execute_runner.rb +10 -1
- data/lib/rubocop/cli/command/init_dotfile.rb +1 -0
- data/lib/rubocop/cli/command/show_cops.rb +3 -2
- data/lib/rubocop/cli/command/version.rb +3 -2
- data/lib/rubocop/cli/environment.rb +1 -0
- data/lib/rubocop/comment_config.rb +10 -7
- data/lib/rubocop/config.rb +20 -3
- data/lib/rubocop/config_loader.rb +42 -18
- data/lib/rubocop/config_loader_resolver.rb +4 -3
- data/lib/rubocop/config_obsoletion.rb +7 -1
- data/lib/rubocop/config_store.rb +7 -3
- data/lib/rubocop/config_validator.rb +5 -4
- data/lib/rubocop/cop/autocorrect_logic.rb +1 -1
- data/lib/rubocop/cop/badge.rb +1 -1
- data/lib/rubocop/cop/base.rb +37 -6
- 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 -8
- data/lib/rubocop/cop/cop.rb +1 -1
- 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 +6 -6
- data/lib/rubocop/cop/correctors/multiline_literal_brace_corrector.rb +34 -3
- data/lib/rubocop/cop/correctors/parentheses_corrector.rb +5 -8
- data/lib/rubocop/cop/correctors/percent_literal_corrector.rb +6 -11
- data/lib/rubocop/cop/correctors/punctuation_corrector.rb +8 -10
- data/lib/rubocop/cop/correctors/unused_arg_corrector.rb +15 -18
- data/lib/rubocop/cop/documentation.rb +22 -0
- data/lib/rubocop/cop/force.rb +1 -0
- data/lib/rubocop/cop/gemspec/required_ruby_version.rb +38 -12
- data/lib/rubocop/cop/generator.rb +2 -1
- data/lib/rubocop/cop/generator/configuration_injector.rb +2 -2
- data/lib/rubocop/cop/internal_affairs/method_name_equal.rb +5 -12
- data/lib/rubocop/cop/internal_affairs/node_destructuring.rb +1 -1
- data/lib/rubocop/cop/internal_affairs/node_type_predicate.rb +1 -0
- data/lib/rubocop/cop/internal_affairs/offense_location_keyword.rb +9 -8
- data/lib/rubocop/cop/internal_affairs/redundant_location_argument.rb +11 -7
- data/lib/rubocop/cop/internal_affairs/redundant_message_argument.rb +8 -8
- data/lib/rubocop/cop/internal_affairs/useless_message_assertion.rb +2 -2
- data/lib/rubocop/cop/layout/begin_end_alignment.rb +77 -0
- data/lib/rubocop/cop/layout/block_alignment.rb +24 -20
- data/lib/rubocop/cop/layout/class_structure.rb +13 -16
- data/lib/rubocop/cop/layout/closing_heredoc_indentation.rb +4 -6
- data/lib/rubocop/cop/layout/comment_indentation.rb +1 -1
- 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 -17
- data/lib/rubocop/cop/layout/empty_comment.rb +30 -23
- data/lib/rubocop/cop/layout/empty_line_after_guard_clause.rb +19 -16
- data/lib/rubocop/cop/layout/empty_line_after_magic_comment.rb +13 -13
- data/lib/rubocop/cop/layout/empty_line_after_multiline_condition.rb +145 -0
- data/lib/rubocop/cop/layout/empty_line_between_defs.rb +21 -23
- data/lib/rubocop/cop/layout/empty_lines.rb +6 -9
- data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +5 -6
- data/lib/rubocop/cop/layout/empty_lines_around_arguments.rb +7 -8
- data/lib/rubocop/cop/layout/empty_lines_around_attribute_accessor.rb +3 -6
- data/lib/rubocop/cop/layout/empty_lines_around_begin_body.rb +2 -5
- data/lib/rubocop/cop/layout/empty_lines_around_block_body.rb +2 -5
- data/lib/rubocop/cop/layout/empty_lines_around_class_body.rb +2 -5
- data/lib/rubocop/cop/layout/empty_lines_around_exception_handling_keywords.rb +2 -5
- data/lib/rubocop/cop/layout/empty_lines_around_method_body.rb +2 -5
- data/lib/rubocop/cop/layout/empty_lines_around_module_body.rb +2 -5
- data/lib/rubocop/cop/layout/end_alignment.rb +14 -19
- data/lib/rubocop/cop/layout/extra_spacing.rb +22 -36
- 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 +5 -9
- 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 +16 -13
- data/lib/rubocop/cop/layout/indentation_style.rb +0 -2
- data/lib/rubocop/cop/layout/initial_indentation.rb +6 -7
- data/lib/rubocop/cop/layout/leading_comment_space.rb +12 -10
- 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 +37 -24
- 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 +32 -24
- 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_block_parameters.rb +3 -2
- data/lib/rubocop/cop/layout/space_around_equals_in_parameter_default.rb +20 -15
- data/lib/rubocop/cop/layout/space_around_keyword.rb +17 -18
- data/lib/rubocop/cop/layout/space_around_method_call_operator.rb +33 -66
- 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 +16 -18
- data/lib/rubocop/cop/layout/space_inside_array_percent_literal.rb +3 -8
- data/lib/rubocop/cop/layout/space_inside_block_braces.rb +17 -16
- data/lib/rubocop/cop/layout/space_inside_hash_literal_braces.rb +15 -19
- data/lib/rubocop/cop/layout/space_inside_parens.rb +9 -14
- data/lib/rubocop/cop/layout/space_inside_percent_literal_delimiters.rb +5 -10
- data/lib/rubocop/cop/layout/space_inside_range_literal.rb +8 -17
- data/lib/rubocop/cop/layout/space_inside_reference_brackets.rb +14 -22
- data/lib/rubocop/cop/layout/space_inside_string_interpolation.rb +10 -11
- data/lib/rubocop/cop/layout/trailing_empty_lines.rb +10 -15
- data/lib/rubocop/cop/layout/trailing_whitespace.rb +11 -11
- data/lib/rubocop/cop/lint/ambiguous_block_association.rb +7 -4
- data/lib/rubocop/cop/lint/ambiguous_operator.rb +17 -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 +9 -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_definition_in_block.rb +54 -0
- data/lib/rubocop/cop/lint/constant_resolution.rb +2 -2
- data/lib/rubocop/cop/lint/debugger.rb +6 -1
- data/lib/rubocop/cop/lint/deprecated_class_methods.rb +7 -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 +7 -6
- data/lib/rubocop/cop/lint/duplicate_require.rb +46 -0
- data/lib/rubocop/cop/lint/duplicate_rescue_exception.rb +49 -0
- data/lib/rubocop/cop/lint/each_with_object_argument.rb +2 -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_file.rb +50 -0
- 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 +13 -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 +4 -3
- data/lib/rubocop/cop/lint/heredoc_method_call_position.rb +13 -14
- data/lib/rubocop/cop/lint/identity_comparison.rb +49 -0
- 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 +3 -36
- data/lib/rubocop/cop/lint/multiple_comparison.rb +9 -10
- 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 +7 -9
- data/lib/rubocop/cop/lint/ordered_magic_comments.rb +11 -13
- data/lib/rubocop/cop/lint/out_of_range_regexp_ref.rb +79 -0
- data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +4 -10
- data/lib/rubocop/cop/lint/percent_string_array.rb +3 -6
- data/lib/rubocop/cop/lint/percent_symbol_array.rb +13 -12
- data/lib/rubocop/cop/lint/raise_exception.rb +13 -10
- data/lib/rubocop/cop/lint/rand_one.rb +2 -1
- 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 +5 -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 +8 -12
- 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 +7 -7
- data/lib/rubocop/cop/lint/struct_new_override.rb +2 -1
- data/lib/rubocop/cop/lint/suppressed_exception.rb +4 -7
- data/lib/rubocop/cop/lint/to_json.rb +20 -11
- data/lib/rubocop/cop/lint/top_level_return_with_argument.rb +34 -0
- data/lib/rubocop/cop/lint/trailing_comma_in_attribute_declaration.rb +57 -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 +175 -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 +4 -2
- data/lib/rubocop/cop/lint/uri_regexp.rb +12 -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_method_definition.rb +70 -0
- data/lib/rubocop/cop/lint/useless_setter_call.rb +4 -6
- data/lib/rubocop/cop/lint/useless_times.rb +97 -0
- 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 +50 -5
- data/lib/rubocop/cop/metrics/utils/code_length_calculator.rb +53 -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 +5 -1
- 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/array_min_size.rb +1 -1
- data/lib/rubocop/cop/mixin/check_line_breakable.rb +17 -8
- data/lib/rubocop/cop/mixin/code_length.rb +22 -5
- 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/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 +31 -12
- 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_element_line_breaks.rb +3 -1
- data/lib/rubocop/cop/mixin/multiline_literal_brace_layout.rb +13 -12
- data/lib/rubocop/cop/mixin/negative_conditional.rb +2 -2
- data/lib/rubocop/cop/mixin/percent_array.rb +16 -9
- data/lib/rubocop/cop/mixin/range_help.rb +18 -4
- data/lib/rubocop/cop/mixin/regexp_literal_help.rb +1 -1
- data/lib/rubocop/cop/mixin/rescue_node.rb +10 -1
- data/lib/rubocop/cop/mixin/space_after_punctuation.rb +4 -3
- data/lib/rubocop/cop/mixin/space_before_punctuation.rb +4 -3
- data/lib/rubocop/cop/mixin/statement_modifier.rb +39 -10
- data/lib/rubocop/cop/mixin/surrounding_space.rb +8 -29
- data/lib/rubocop/cop/mixin/trailing_comma.rb +9 -11
- 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 +2 -2
- 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 +4 -4
- 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/offense.rb +1 -0
- data/lib/rubocop/cop/registry.rb +3 -3
- data/lib/rubocop/cop/security/eval.rb +3 -2
- data/lib/rubocop/cop/security/json_load.rb +7 -8
- data/lib/rubocop/cop/security/marshal_load.rb +3 -4
- data/lib/rubocop/cop/security/open.rb +3 -2
- data/lib/rubocop/cop/security/yaml_load.rb +7 -6
- data/lib/rubocop/cop/severity.rb +0 -8
- data/lib/rubocop/cop/style/access_modifier_declarations.rb +7 -8
- data/lib/rubocop/cop/style/accessor_grouping.rb +29 -20
- data/lib/rubocop/cop/style/alias.rb +43 -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 +7 -8
- data/lib/rubocop/cop/style/ascii_comments.rb +4 -4
- data/lib/rubocop/cop/style/attr.rb +12 -9
- data/lib/rubocop/cop/style/auto_resource_cleanup.rb +7 -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 +32 -5
- data/lib/rubocop/cop/style/case_like_if.rb +236 -0
- data/lib/rubocop/cop/style/class_and_module_children.rb +16 -11
- data/lib/rubocop/cop/style/class_check.rb +6 -11
- data/lib/rubocop/cop/style/class_methods.rb +7 -11
- data/lib/rubocop/cop/style/class_methods_definitions.rb +157 -0
- data/lib/rubocop/cop/style/class_vars.rb +7 -12
- 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/combinable_loops.rb +89 -0
- 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 +62 -64
- 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 +8 -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 +3 -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_block_parameter.rb +9 -10
- 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_lambda_parameter.rb +9 -10
- data/lib/rubocop/cop/style/empty_literal.rb +18 -17
- 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 +7 -7
- data/lib/rubocop/cop/style/even_odd.rb +8 -11
- data/lib/rubocop/cop/style/expand_path_arguments.rb +22 -21
- 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 +10 -11
- data/lib/rubocop/cop/style/for.rb +11 -15
- data/lib/rubocop/cop/style/format_string.rb +18 -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 +6 -6
- data/lib/rubocop/cop/style/hash_as_last_array_item.rb +79 -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 +10 -8
- data/lib/rubocop/cop/style/hash_transform_keys.rb +19 -11
- data/lib/rubocop/cop/style/hash_transform_values.rb +18 -10
- 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 +19 -41
- 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 +2 -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/keyword_parameters_order.rb +58 -0
- data/lib/rubocop/cop/style/lambda.rb +7 -12
- data/lib/rubocop/cop/style/lambda_call.rb +17 -14
- 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 +12 -3
- 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 +2 -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 +17 -6
- data/lib/rubocop/cop/style/multiline_when_then.rb +9 -11
- 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/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 +14 -12
- data/lib/rubocop/cop/style/nested_ternary_operator.rb +14 -16
- data/lib/rubocop/cop/style/next.rb +10 -14
- data/lib/rubocop/cop/style/nil_comparison.rb +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 +9 -15
- data/lib/rubocop/cop/style/one_line_conditional.rb +71 -23
- data/lib/rubocop/cop/style/option_hash.rb +1 -1
- data/lib/rubocop/cop/style/optional_arguments.rb +1 -1
- data/lib/rubocop/cop/style/optional_boolean_parameter.rb +42 -0
- data/lib/rubocop/cop/style/or_assignment.rb +13 -10
- data/lib/rubocop/cop/style/parallel_assignment.rb +18 -18
- data/lib/rubocop/cop/style/parentheses_around_condition.rb +6 -6
- data/lib/rubocop/cop/style/percent_literal_delimiters.rb +14 -20
- 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 +15 -24
- data/lib/rubocop/cop/style/random_with_offset.rb +17 -16
- data/lib/rubocop/cop/style/redundant_assignment.rb +8 -10
- data/lib/rubocop/cop/style/redundant_begin.rb +7 -9
- data/lib/rubocop/cop/style/redundant_capital_w.rb +6 -9
- data/lib/rubocop/cop/style/redundant_condition.rb +20 -9
- data/lib/rubocop/cop/style/redundant_exception.rb +2 -0
- data/lib/rubocop/cop/style/redundant_fetch_block.rb +3 -12
- data/lib/rubocop/cop/style/redundant_file_extension_in_require.rb +51 -0
- data/lib/rubocop/cop/style/redundant_freeze.rb +5 -7
- data/lib/rubocop/cop/style/redundant_interpolation.rb +25 -24
- data/lib/rubocop/cop/style/redundant_parentheses.rb +19 -12
- data/lib/rubocop/cop/style/redundant_regexp_character_class.rb +6 -13
- data/lib/rubocop/cop/style/redundant_regexp_escape.rb +14 -23
- data/lib/rubocop/cop/style/redundant_self.rb +2 -2
- data/lib/rubocop/cop/style/redundant_self_assignment.rb +116 -0
- data/lib/rubocop/cop/style/redundant_sort.rb +21 -13
- data/lib/rubocop/cop/style/regexp_literal.rb +10 -21
- data/lib/rubocop/cop/style/rescue_modifier.rb +29 -9
- data/lib/rubocop/cop/style/return_nil.rb +5 -5
- data/lib/rubocop/cop/style/safe_navigation.rb +22 -16
- 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 +25 -19
- data/lib/rubocop/cop/style/single_argument_dig.rb +55 -0
- data/lib/rubocop/cop/style/single_line_block_params.rb +4 -2
- data/lib/rubocop/cop/style/single_line_methods.rb +18 -17
- 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 -20
- data/lib/rubocop/cop/style/stderr_puts.rb +5 -6
- data/lib/rubocop/cop/style/string_concatenation.rb +106 -0
- 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 +4 -7
- data/lib/rubocop/cop/style/symbol_array.rb +6 -17
- data/lib/rubocop/cop/style/symbol_literal.rb +4 -6
- data/lib/rubocop/cop/style/symbol_proc.rb +15 -19
- data/lib/rubocop/cop/style/ternary_parentheses.rb +21 -20
- data/lib/rubocop/cop/style/trailing_body_on_class.rb +3 -6
- data/lib/rubocop/cop/style/trailing_body_on_method_definition.rb +4 -7
- data/lib/rubocop/cop/style/trailing_body_on_module.rb +3 -6
- data/lib/rubocop/cop/style/trailing_comma_in_arguments.rb +2 -5
- data/lib/rubocop/cop/style/trailing_comma_in_array_literal.rb +2 -5
- data/lib/rubocop/cop/style/trailing_comma_in_block_args.rb +7 -6
- data/lib/rubocop/cop/style/trailing_comma_in_hash_literal.rb +2 -5
- data/lib/rubocop/cop/style/trailing_method_end_statement.rb +9 -32
- 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 +17 -19
- data/lib/rubocop/cop/team.rb +2 -1
- data/lib/rubocop/cop/tokens_util.rb +84 -0
- data/lib/rubocop/cop/util.rb +3 -13
- data/lib/rubocop/cop/utils/format_string.rb +3 -5
- data/lib/rubocop/cop/variable_force.rb +2 -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 +284 -0
- data/lib/rubocop/core_ext/string.rb +2 -2
- data/lib/rubocop/error.rb +1 -0
- data/lib/rubocop/ext/regexp_node.rb +46 -0
- data/lib/rubocop/file_finder.rb +13 -12
- data/lib/rubocop/formatter/auto_gen_config_formatter.rb +2 -1
- data/lib/rubocop/formatter/disabled_config_formatter.rb +1 -1
- data/lib/rubocop/formatter/formatter_set.rb +1 -0
- data/lib/rubocop/formatter/html_formatter.rb +2 -0
- data/lib/rubocop/formatter/junit_formatter.rb +1 -1
- 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 +25 -4
- data/lib/rubocop/path_util.rb +17 -17
- data/lib/rubocop/rake_task.rb +1 -0
- data/lib/rubocop/remote_config.rb +1 -0
- data/lib/rubocop/result_cache.rb +37 -15
- data/lib/rubocop/rspec/cop_helper.rb +4 -1
- data/lib/rubocop/rspec/expect_offense.rb +37 -6
- data/lib/rubocop/rspec/shared_contexts.rb +25 -14
- data/lib/rubocop/runner.rb +36 -21
- data/lib/rubocop/string_interpreter.rb +3 -0
- data/lib/rubocop/target_finder.rb +14 -10
- data/lib/rubocop/target_ruby.rb +6 -0
- data/lib/rubocop/version.rb +3 -2
- data/lib/rubocop/yaml_duplication_checker.rb +1 -0
- metadata +45 -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
@@ -73,19 +73,20 @@ module RuboCop
|
|
73
73
|
# expect_no_corrections
|
74
74
|
#
|
75
75
|
# If your code has variables of different lengths, you can use `%{foo}`,
|
76
|
-
# `^{foo}`, and `_{foo}` to format your template
|
76
|
+
# `^{foo}`, and `_{foo}` to format your template; you can also abbreviate
|
77
|
+
# offense messages with `[...]`:
|
77
78
|
#
|
78
79
|
# %w[raise fail].each do |keyword|
|
79
80
|
# expect_offense(<<~RUBY, keyword: keyword)
|
80
81
|
# %{keyword}(RuntimeError, msg)
|
81
|
-
# ^{keyword}^^^^^^^^^^^^^^^^^^^ Redundant `RuntimeError` argument
|
82
|
+
# ^{keyword}^^^^^^^^^^^^^^^^^^^ Redundant `RuntimeError` argument [...]
|
82
83
|
# RUBY
|
83
84
|
#
|
84
85
|
# %w[has_one has_many].each do |type|
|
85
86
|
# expect_offense(<<~RUBY, type: type)
|
86
87
|
# class Book
|
87
88
|
# %{type} :chapter, foreign_key: 'book_id'
|
88
|
-
# _{type} ^^^^^^^^^^^^^^^^^^^^^^ Specifying the default
|
89
|
+
# _{type} ^^^^^^^^^^^^^^^^^^^^^^ Specifying the default [...]
|
89
90
|
# end
|
90
91
|
# RUBY
|
91
92
|
# end
|
@@ -102,6 +103,7 @@ module RuboCop
|
|
102
103
|
module ExpectOffense
|
103
104
|
def format_offense(source, **replacements)
|
104
105
|
replacements.each do |keyword, value|
|
106
|
+
value = value.to_s
|
105
107
|
source = source.gsub("%{#{keyword}}", value)
|
106
108
|
.gsub("^{#{keyword}}", '^' * value.size)
|
107
109
|
.gsub("_{#{keyword}}", ' ' * value.size)
|
@@ -126,14 +128,19 @@ module RuboCop
|
|
126
128
|
@processed_source = parse_source(expected_annotations.plain_source,
|
127
129
|
file)
|
128
130
|
|
129
|
-
|
131
|
+
unless @processed_source.valid_syntax?
|
132
|
+
raise 'Error parsing example code: ' \
|
133
|
+
"#{@processed_source.diagnostics.map(&:render).join("\n")}"
|
134
|
+
end
|
130
135
|
|
131
136
|
offenses = _investigate(cop, @processed_source)
|
132
137
|
actual_annotations =
|
133
138
|
expected_annotations.with_offense_annotations(offenses)
|
134
139
|
|
135
|
-
expect(actual_annotations
|
140
|
+
expect(actual_annotations).to eq(expected_annotations), ''
|
136
141
|
expect(offenses.map(&:severity).uniq).to eq([severity]) if severity
|
142
|
+
|
143
|
+
offenses
|
137
144
|
end
|
138
145
|
|
139
146
|
def expect_correction(correction, loop: true)
|
@@ -188,6 +195,7 @@ module RuboCop
|
|
188
195
|
# Parsed representation of code annotated with the `^^^ Message` style
|
189
196
|
class AnnotatedSource
|
190
197
|
ANNOTATION_PATTERN = /\A\s*(\^+|\^{}) /.freeze
|
198
|
+
ABBREV = "[...]\n"
|
191
199
|
|
192
200
|
# @param annotated_source [String] string passed to the matchers
|
193
201
|
#
|
@@ -206,6 +214,7 @@ module RuboCop
|
|
206
214
|
source << source_line
|
207
215
|
end
|
208
216
|
end
|
217
|
+
annotations.each { |a| a[0] = 1 } if source.empty?
|
209
218
|
|
210
219
|
new(source, annotations)
|
211
220
|
end
|
@@ -221,6 +230,27 @@ module RuboCop
|
|
221
230
|
@annotations = annotations.sort.freeze
|
222
231
|
end
|
223
232
|
|
233
|
+
def ==(other)
|
234
|
+
other.is_a?(self.class) &&
|
235
|
+
other.lines == lines &&
|
236
|
+
match_annotations?(other)
|
237
|
+
end
|
238
|
+
|
239
|
+
# Dirty hack: expectations with [...] are rewritten when they match
|
240
|
+
# This way the diff is clean.
|
241
|
+
def match_annotations?(other)
|
242
|
+
annotations.zip(other.annotations) do |(_actual_line, actual_annotation),
|
243
|
+
(_expected_line, expected_annotation)|
|
244
|
+
if expected_annotation&.end_with?(ABBREV) &&
|
245
|
+
actual_annotation.start_with?(expected_annotation[0...-ABBREV.length])
|
246
|
+
|
247
|
+
expected_annotation.replace(actual_annotation)
|
248
|
+
end
|
249
|
+
end
|
250
|
+
|
251
|
+
annotations == other.annotations
|
252
|
+
end
|
253
|
+
|
224
254
|
# Construct annotated source string (like what we parse)
|
225
255
|
#
|
226
256
|
# Reconstruct a deterministic annotated source string. This is
|
@@ -253,6 +283,7 @@ module RuboCop
|
|
253
283
|
|
254
284
|
reconstructed.join
|
255
285
|
end
|
286
|
+
alias inspect to_s
|
256
287
|
|
257
288
|
# Return the plain source code without annotations
|
258
289
|
#
|
@@ -279,7 +310,7 @@ module RuboCop
|
|
279
310
|
self.class.new(lines, offense_annotations)
|
280
311
|
end
|
281
312
|
|
282
|
-
|
313
|
+
protected
|
283
314
|
|
284
315
|
attr_reader :lines, :annotations
|
285
316
|
end
|
@@ -12,19 +12,22 @@ RSpec.shared_context 'isolated environment', :isolated_environment do
|
|
12
12
|
# get mismatched pathnames when loading config files later on.
|
13
13
|
tmpdir = File.realpath(tmpdir)
|
14
14
|
|
15
|
+
virtual_home = File.expand_path(File.join(tmpdir, 'home'))
|
16
|
+
Dir.mkdir(virtual_home)
|
17
|
+
ENV['HOME'] = virtual_home
|
18
|
+
ENV.delete('XDG_CONFIG_HOME')
|
19
|
+
|
20
|
+
base_dir = example.metadata[:project_inside_home] ? virtual_home : tmpdir
|
21
|
+
root = example.metadata[:root]
|
22
|
+
working_dir = root ? File.join(base_dir, 'work', root) : File.join(base_dir, 'work')
|
23
|
+
|
15
24
|
# Make upwards search for .rubocop.yml files stop at this directory.
|
16
|
-
RuboCop::FileFinder.root_level =
|
25
|
+
RuboCop::FileFinder.root_level = working_dir
|
17
26
|
|
18
27
|
begin
|
19
|
-
|
20
|
-
Dir.mkdir(virtual_home)
|
21
|
-
ENV['HOME'] = virtual_home
|
22
|
-
ENV.delete('XDG_CONFIG_HOME')
|
23
|
-
|
24
|
-
working_dir = File.join(tmpdir, 'work')
|
25
|
-
Dir.mkdir(working_dir)
|
28
|
+
FileUtils.mkdir_p(working_dir)
|
26
29
|
|
27
|
-
|
30
|
+
Dir.chdir(working_dir) do
|
28
31
|
example.run
|
29
32
|
end
|
30
33
|
ensure
|
@@ -37,12 +40,22 @@ RSpec.shared_context 'isolated environment', :isolated_environment do
|
|
37
40
|
end
|
38
41
|
end
|
39
42
|
|
43
|
+
RSpec.shared_context 'maintain registry', :restore_registry do
|
44
|
+
around(:each) do |example|
|
45
|
+
RuboCop::Cop::Registry.with_temporary_global { example.run }
|
46
|
+
end
|
47
|
+
|
48
|
+
def stub_cop_class(name, inherit: RuboCop::Cop::Base, &block)
|
49
|
+
klass = Class.new(inherit, &block)
|
50
|
+
stub_const(name, klass)
|
51
|
+
klass
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
40
55
|
# This context assumes nothing and defines `cop`, among others.
|
41
56
|
RSpec.shared_context 'config', :config do # rubocop:disable Metrics/BlockLength
|
42
57
|
### Meant to be overridden at will
|
43
58
|
|
44
|
-
let(:source) { 'code = {some: :ruby}' }
|
45
|
-
|
46
59
|
let(:cop_class) do
|
47
60
|
unless described_class.is_a?(Class) && described_class < RuboCop::Cop::Base
|
48
61
|
raise 'Specify which cop class to use (e.g `let(:cop_class) { RuboCop::Cop::Base }`, ' \
|
@@ -94,9 +107,7 @@ RSpec.shared_context 'config', :config do # rubocop:disable Metrics/BlockLength
|
|
94
107
|
end
|
95
108
|
|
96
109
|
let(:cop) do
|
97
|
-
cop_class.new(config, cop_options)
|
98
|
-
cop.send :begin_investigation, processed_source
|
99
|
-
end
|
110
|
+
cop_class.new(config, cop_options)
|
100
111
|
end
|
101
112
|
end
|
102
113
|
|
data/lib/rubocop/runner.rb
CHANGED
@@ -11,12 +11,16 @@ module RuboCop
|
|
11
11
|
class InfiniteCorrectionLoop < RuntimeError
|
12
12
|
attr_reader :offenses
|
13
13
|
|
14
|
-
def initialize(path,
|
15
|
-
|
16
|
-
|
14
|
+
def initialize(path, offenses_by_iteration, loop_start: -1)
|
15
|
+
@offenses = offenses_by_iteration.flatten.uniq
|
16
|
+
root_cause = offenses_by_iteration[loop_start..-1]
|
17
|
+
.map { |x| x.map(&:cop_name).uniq.join(', ') }
|
18
|
+
.join(' -> ')
|
19
|
+
super "Infinite loop detected in #{path} and caused by #{root_cause}"
|
17
20
|
end
|
18
21
|
end
|
19
22
|
|
23
|
+
# @api private
|
20
24
|
MAX_ITERATIONS = 200
|
21
25
|
|
22
26
|
attr_reader :errors, :warnings
|
@@ -80,7 +84,10 @@ module RuboCop
|
|
80
84
|
# OPTIMIZE: Calling `ResultCache.cleanup` takes time. This optimization
|
81
85
|
# mainly targets editors that integrates RuboCop. When RuboCop is run
|
82
86
|
# by an editor, it should be inspecting only one file.
|
83
|
-
|
87
|
+
if files.size > 1 && cached_run?
|
88
|
+
ResultCache.cleanup(@config_store, @options[:debug], @options[:cache_root])
|
89
|
+
end
|
90
|
+
|
84
91
|
formatter_set.finished(inspected_files.freeze)
|
85
92
|
formatter_set.close_output_files
|
86
93
|
end
|
@@ -118,8 +125,7 @@ module RuboCop
|
|
118
125
|
|
119
126
|
def file_offenses(file)
|
120
127
|
file_offense_cache(file) do
|
121
|
-
source =
|
122
|
-
source, offenses = do_inspection_loop(file, source)
|
128
|
+
source, offenses = do_inspection_loop(file)
|
123
129
|
offenses = add_redundant_disables(file, offenses.compact.sort, source)
|
124
130
|
offenses.sort.reject(&:disabled?).freeze
|
125
131
|
end
|
@@ -159,8 +165,7 @@ module RuboCop
|
|
159
165
|
# Do one extra inspection loop if any redundant disables were
|
160
166
|
# removed. This is done in order to find rubocop:enable directives that
|
161
167
|
# have now become useless.
|
162
|
-
_source, new_offenses = do_inspection_loop(file
|
163
|
-
get_processed_source(file))
|
168
|
+
_source, new_offenses = do_inspection_loop(file)
|
164
169
|
offenses |= new_offenses
|
165
170
|
end
|
166
171
|
end
|
@@ -213,7 +218,7 @@ module RuboCop
|
|
213
218
|
@cached_run ||=
|
214
219
|
(@options[:cache] == 'true' ||
|
215
220
|
@options[:cache] != 'false' &&
|
216
|
-
@config_store.
|
221
|
+
@config_store.for_pwd.for_all_cops['UseCache']) &&
|
217
222
|
# When running --auto-gen-config, there's some processing done in the
|
218
223
|
# cops related to calculating the Max parameters for Metrics cops. We
|
219
224
|
# need to do that processing and cannot use caching.
|
@@ -232,19 +237,23 @@ module RuboCop
|
|
232
237
|
cache.save(offenses)
|
233
238
|
end
|
234
239
|
|
235
|
-
def do_inspection_loop(file
|
236
|
-
|
240
|
+
def do_inspection_loop(file)
|
241
|
+
processed_source = get_processed_source(file)
|
242
|
+
# This variable is 2d array used to track corrected offenses after each
|
243
|
+
# inspection iteration. This is used to output meaningful infinite loop
|
244
|
+
# error message.
|
245
|
+
offenses_by_iteration = []
|
237
246
|
|
238
247
|
# When running with --auto-correct, we need to inspect the file (which
|
239
248
|
# includes writing a corrected version of it) until no more corrections
|
240
249
|
# are made. This is because automatic corrections can introduce new
|
241
250
|
# offenses. In the normal case the loop is only executed once.
|
242
|
-
iterate_until_no_changes(processed_source,
|
251
|
+
iterate_until_no_changes(processed_source, offenses_by_iteration) do
|
243
252
|
# The offenses that couldn't be corrected will be found again so we
|
244
253
|
# only keep the corrected ones in order to avoid duplicate reporting.
|
245
|
-
|
254
|
+
!offenses_by_iteration.empty? && offenses_by_iteration.last.select!(&:corrected?)
|
246
255
|
new_offenses, updated_source_file = inspect_file(processed_source)
|
247
|
-
|
256
|
+
offenses_by_iteration.push(new_offenses)
|
248
257
|
|
249
258
|
# We have to reprocess the source to pickup the changes. Since the
|
250
259
|
# change could (theoretically) introduce parsing errors, we break the
|
@@ -254,10 +263,12 @@ module RuboCop
|
|
254
263
|
processed_source = get_processed_source(file)
|
255
264
|
end
|
256
265
|
|
266
|
+
# Return summary of corrected offenses after all iterations
|
267
|
+
offenses = offenses_by_iteration.flatten.uniq
|
257
268
|
[processed_source, offenses]
|
258
269
|
end
|
259
270
|
|
260
|
-
def iterate_until_no_changes(source,
|
271
|
+
def iterate_until_no_changes(source, offenses_by_iteration)
|
261
272
|
# Keep track of the state of the source. If a cop modifies the source
|
262
273
|
# and another cop undoes it producing identical source we have an
|
263
274
|
# infinite loop.
|
@@ -269,10 +280,10 @@ module RuboCop
|
|
269
280
|
iterations = 0
|
270
281
|
|
271
282
|
loop do
|
272
|
-
check_for_infinite_loop(source,
|
283
|
+
check_for_infinite_loop(source, offenses_by_iteration)
|
273
284
|
|
274
285
|
if (iterations += 1) > MAX_ITERATIONS
|
275
|
-
raise InfiniteCorrectionLoop.new(source.path,
|
286
|
+
raise InfiniteCorrectionLoop.new(source.path, offenses_by_iteration)
|
276
287
|
end
|
277
288
|
|
278
289
|
source = yield
|
@@ -282,11 +293,15 @@ module RuboCop
|
|
282
293
|
|
283
294
|
# Check whether a run created source identical to a previous run, which
|
284
295
|
# means that we definitely have an infinite loop.
|
285
|
-
def check_for_infinite_loop(processed_source,
|
296
|
+
def check_for_infinite_loop(processed_source, offenses_by_iteration)
|
286
297
|
checksum = processed_source.checksum
|
287
298
|
|
288
|
-
if @processed_sources.
|
289
|
-
raise InfiniteCorrectionLoop.new(
|
299
|
+
if (loop_start_index = @processed_sources.index(checksum))
|
300
|
+
raise InfiniteCorrectionLoop.new(
|
301
|
+
processed_source.path,
|
302
|
+
offenses_by_iteration,
|
303
|
+
loop_start: loop_start_index
|
304
|
+
)
|
290
305
|
end
|
291
306
|
|
292
307
|
@processed_sources << checksum
|
@@ -307,7 +322,7 @@ module RuboCop
|
|
307
322
|
def mobilized_cop_classes(config)
|
308
323
|
@mobilized_cop_classes ||= {}
|
309
324
|
@mobilized_cop_classes[config.object_id] ||= begin
|
310
|
-
cop_classes = Cop::
|
325
|
+
cop_classes = Cop::Registry.all
|
311
326
|
|
312
327
|
OptionsValidator.new(@options).validate_cop_options
|
313
328
|
|
@@ -1,10 +1,9 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require 'set'
|
4
|
-
|
5
3
|
module RuboCop
|
6
4
|
# This class finds target files to inspect by scanning the directory tree
|
7
5
|
# and picking ruby files.
|
6
|
+
# @api private
|
8
7
|
class TargetFinder
|
9
8
|
def initialize(config_store, options = {})
|
10
9
|
@config_store = config_store
|
@@ -114,10 +113,12 @@ module RuboCop
|
|
114
113
|
end
|
115
114
|
|
116
115
|
def ruby_extensions
|
117
|
-
|
118
|
-
pattern
|
116
|
+
@ruby_extensions ||= begin
|
117
|
+
ext_patterns = all_cops_include.select do |pattern|
|
118
|
+
pattern.start_with?('**/*.')
|
119
|
+
end
|
120
|
+
ext_patterns.map { |pattern| pattern.sub('**/*', '') }
|
119
121
|
end
|
120
|
-
ext_patterns.map { |pattern| pattern.sub('**/*', '') }
|
121
122
|
end
|
122
123
|
|
123
124
|
def ruby_filename?(file)
|
@@ -125,14 +126,17 @@ module RuboCop
|
|
125
126
|
end
|
126
127
|
|
127
128
|
def ruby_filenames
|
128
|
-
|
129
|
-
pattern
|
129
|
+
@ruby_filenames ||= begin
|
130
|
+
file_patterns = all_cops_include.reject do |pattern|
|
131
|
+
pattern.start_with?('**/*.')
|
132
|
+
end
|
133
|
+
file_patterns.map { |pattern| pattern.sub('**/', '') }
|
130
134
|
end
|
131
|
-
file_patterns.map { |pattern| pattern.sub('**/', '') }
|
132
135
|
end
|
133
136
|
|
134
137
|
def all_cops_include
|
135
|
-
@
|
138
|
+
@all_cops_include ||=
|
139
|
+
@config_store.for_pwd.for_all_cops['Include'].map(&:to_s)
|
136
140
|
end
|
137
141
|
|
138
142
|
def ruby_executable?(file)
|
@@ -160,7 +164,7 @@ module RuboCop
|
|
160
164
|
end
|
161
165
|
|
162
166
|
def configured_include?(file)
|
163
|
-
@config_store.
|
167
|
+
@config_store.for_pwd.file_to_include?(file)
|
164
168
|
end
|
165
169
|
|
166
170
|
def included_file?(file)
|
data/lib/rubocop/target_ruby.rb
CHANGED
@@ -2,6 +2,7 @@
|
|
2
2
|
|
3
3
|
module RuboCop
|
4
4
|
# The kind of Ruby that code inspected by RuboCop is written in.
|
5
|
+
# @api private
|
5
6
|
class TargetRuby
|
6
7
|
KNOWN_RUBIES = [2.4, 2.5, 2.6, 2.7, 2.8].freeze
|
7
8
|
DEFAULT_VERSION = KNOWN_RUBIES.first
|
@@ -12,6 +13,7 @@ module RuboCop
|
|
12
13
|
private_constant :KNOWN_RUBIES, :OBSOLETE_RUBIES
|
13
14
|
|
14
15
|
# A place where information about a target ruby version is found.
|
16
|
+
# @api private
|
15
17
|
class Source
|
16
18
|
attr_reader :version, :name
|
17
19
|
|
@@ -26,6 +28,7 @@ module RuboCop
|
|
26
28
|
end
|
27
29
|
|
28
30
|
# The target ruby version may be configured in RuboCop's config.
|
31
|
+
# @api private
|
29
32
|
class RuboCopConfig < Source
|
30
33
|
def name
|
31
34
|
"`TargetRubyVersion` parameter (in #{@config.smart_loaded_path})"
|
@@ -39,6 +42,7 @@ module RuboCop
|
|
39
42
|
end
|
40
43
|
|
41
44
|
# The target ruby version may be found in a .ruby-version file.
|
45
|
+
# @api private
|
42
46
|
class RubyVersionFile < Source
|
43
47
|
FILENAME = '.ruby-version'
|
44
48
|
|
@@ -68,6 +72,7 @@ module RuboCop
|
|
68
72
|
end
|
69
73
|
|
70
74
|
# The lock file of Bundler may identify the target ruby version.
|
75
|
+
# @api private
|
71
76
|
class BundlerLockFile < Source
|
72
77
|
def name
|
73
78
|
"`#{bundler_lock_file_path}`"
|
@@ -108,6 +113,7 @@ module RuboCop
|
|
108
113
|
end
|
109
114
|
|
110
115
|
# If all else fails, a default version will be picked.
|
116
|
+
# @api private
|
111
117
|
class Default < Source
|
112
118
|
def name
|
113
119
|
'default'
|
data/lib/rubocop/version.rb
CHANGED
@@ -3,13 +3,14 @@
|
|
3
3
|
module RuboCop
|
4
4
|
# This module holds the RuboCop version information.
|
5
5
|
module Version
|
6
|
-
STRING = '0.
|
6
|
+
STRING = '0.91.0'
|
7
7
|
|
8
8
|
MSG = '%<version>s (using Parser %<parser_version>s, '\
|
9
9
|
'rubocop-ast %<rubocop_ast_version>s, ' \
|
10
10
|
'running on %<ruby_engine>s %<ruby_version>s %<ruby_platform>s)'
|
11
11
|
|
12
|
-
|
12
|
+
# @api private
|
13
|
+
def self.version(debug: false)
|
13
14
|
if debug
|
14
15
|
format(MSG, version: STRING, parser_version: Parser::VERSION,
|
15
16
|
rubocop_ast_version: RuboCop::AST::Version::STRING,
|