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
data/lib/rubocop/cached_data.rb
CHANGED
@@ -4,6 +4,7 @@ require 'json'
|
|
4
4
|
|
5
5
|
module RuboCop
|
6
6
|
# Converts RuboCop objects to and from the serialization format JSON.
|
7
|
+
# @api private
|
7
8
|
class CachedData
|
8
9
|
def initialize(filename)
|
9
10
|
@filename = filename
|
@@ -20,6 +21,7 @@ module RuboCop
|
|
20
21
|
private
|
21
22
|
|
22
23
|
def serialize_offense(offense)
|
24
|
+
status = :uncorrected if %i[corrected corrected_with_todo].include?(offense.status)
|
23
25
|
{
|
24
26
|
# Calling #to_s here ensures that the serialization works when using
|
25
27
|
# other json serializers such as Oj. Some of these gems do not call
|
@@ -31,7 +33,7 @@ module RuboCop
|
|
31
33
|
},
|
32
34
|
message: message(offense),
|
33
35
|
cop_name: offense.cop_name,
|
34
|
-
status:
|
36
|
+
status: status || offense.status
|
35
37
|
}
|
36
38
|
end
|
37
39
|
|
data/lib/rubocop/cli/command.rb
CHANGED
@@ -4,9 +4,13 @@ module RuboCop
|
|
4
4
|
class CLI
|
5
5
|
module Command
|
6
6
|
# Run all the selected cops and report the result.
|
7
|
+
# @api private
|
7
8
|
class ExecuteRunner < Base
|
8
9
|
include Formatter::TextUtil
|
9
10
|
|
11
|
+
# Combination of short and long formatter names.
|
12
|
+
INTEGRATION_FORMATTERS = %w[h html j json ju junit].freeze
|
13
|
+
|
10
14
|
self.command_name = :execute_runner
|
11
15
|
|
12
16
|
def run
|
@@ -60,6 +64,11 @@ module RuboCop
|
|
60
64
|
end
|
61
65
|
|
62
66
|
def maybe_print_corrected_source
|
67
|
+
# Integration tools (like RubyMine) expect to have only the JSON result
|
68
|
+
# when specifying JSON format. Similar HTML and JUnit are targeted as well.
|
69
|
+
# See: https://github.com/rubocop-hq/rubocop/issues/8673
|
70
|
+
return if INTEGRATION_FORMATTERS.include?(@options[:format])
|
71
|
+
|
63
72
|
# If we are asked to autocorrect source code read from stdin, the only
|
64
73
|
# reasonable place to write it is to stdout
|
65
74
|
# Unfortunately, we also write other information to stdout
|
@@ -4,12 +4,17 @@ module RuboCop
|
|
4
4
|
# This class parses the special `rubocop:disable` comments in a source
|
5
5
|
# and provides a way to check if each cop is enabled at arbitrary line.
|
6
6
|
class CommentConfig
|
7
|
+
# @api private
|
7
8
|
REDUNDANT_DISABLE = 'Lint/RedundantCopDisableDirective'
|
8
9
|
|
10
|
+
# @api private
|
9
11
|
COP_NAME_PATTERN = '([A-Z]\w+/)?(?:[A-Z]\w+)'
|
12
|
+
# @api private
|
10
13
|
COP_NAMES_PATTERN = "(?:#{COP_NAME_PATTERN} , )*#{COP_NAME_PATTERN}"
|
14
|
+
# @api private
|
11
15
|
COPS_PATTERN = "(all|#{COP_NAMES_PATTERN})"
|
12
16
|
|
17
|
+
# @api private
|
13
18
|
COMMENT_DIRECTIVE_REGEXP = Regexp.new(
|
14
19
|
"# rubocop : ((?:disable|enable|todo))\\b #{COPS_PATTERN}"
|
15
20
|
.gsub(' ', '\s*')
|
@@ -36,12 +41,15 @@ module RuboCop
|
|
36
41
|
end
|
37
42
|
|
38
43
|
def extra_enabled_comments
|
39
|
-
extra_enabled_comments_with_names(
|
44
|
+
extra_enabled_comments_with_names(
|
45
|
+
extras: Hash.new { |h, k| h[k] = [] },
|
46
|
+
names: Hash.new(0)
|
47
|
+
)
|
40
48
|
end
|
41
49
|
|
42
50
|
private
|
43
51
|
|
44
|
-
def extra_enabled_comments_with_names(extras
|
52
|
+
def extra_enabled_comments_with_names(extras:, names:)
|
45
53
|
each_directive do |comment, cop_names, disabled|
|
46
54
|
next unless comment_only_line?(comment.loc.expression.line)
|
47
55
|
|
@@ -185,18 +193,19 @@ module RuboCop
|
|
185
193
|
enabled_cops += 1
|
186
194
|
end
|
187
195
|
|
188
|
-
extras <<
|
196
|
+
extras[comment] << 'all' if enabled_cops.zero?
|
189
197
|
end
|
190
198
|
|
199
|
+
# Collect cops that have been disabled or enabled by name in a directive comment
|
200
|
+
# so that `Lint/RedundantCopEnableDirective` can register offenses correctly.
|
191
201
|
def handle_switch(cop_names, names, disabled, extras, comment)
|
192
202
|
cop_names.each do |name|
|
193
|
-
names[name] ||= 0
|
194
203
|
if disabled
|
195
204
|
names[name] += 1
|
196
205
|
elsif (names[name]).positive?
|
197
206
|
names[name] -= 1
|
198
207
|
else
|
199
|
-
extras <<
|
208
|
+
extras[comment] << name
|
200
209
|
end
|
201
210
|
end
|
202
211
|
end
|
@@ -129,9 +129,9 @@ module RuboCop
|
|
129
129
|
|
130
130
|
def default_configuration
|
131
131
|
@default_configuration ||= begin
|
132
|
-
|
133
|
-
|
134
|
-
|
132
|
+
print 'Default ' if debug?
|
133
|
+
load_file(DEFAULT_FILE)
|
134
|
+
end
|
135
135
|
end
|
136
136
|
|
137
137
|
# Returns the path rubocop inferred as the root of the project. No file
|
@@ -140,22 +140,33 @@ module RuboCop
|
|
140
140
|
@project_root ||= find_project_root
|
141
141
|
end
|
142
142
|
|
143
|
+
PENDING_BANNER = <<~BANNER
|
144
|
+
The following cops were added to RuboCop, but are not configured. Please set Enabled to either `true` or `false` in your `.rubocop.yml` file.
|
145
|
+
|
146
|
+
Please also note that can also opt-in to new cops by default by adding this to your config:
|
147
|
+
AllCops:
|
148
|
+
NewCops: enable
|
149
|
+
BANNER
|
150
|
+
|
143
151
|
def warn_on_pending_cops(pending_cops)
|
144
152
|
return if pending_cops.empty?
|
145
153
|
|
146
|
-
warn Rainbow(
|
147
|
-
'configured. Please set Enabled to either `true` or ' \
|
148
|
-
'`false` in your `.rubocop.yml` file:').yellow
|
154
|
+
warn Rainbow(PENDING_BANNER).yellow
|
149
155
|
|
150
156
|
pending_cops.each do |cop|
|
151
|
-
|
152
|
-
|
153
|
-
warn Rainbow(" - #{cop.name} (#{version})").yellow
|
157
|
+
warn_pending_cop cop
|
154
158
|
end
|
155
159
|
|
156
160
|
warn Rainbow('For more information: https://docs.rubocop.org/rubocop/versioning.html').yellow
|
157
161
|
end
|
158
162
|
|
163
|
+
def warn_pending_cop(cop)
|
164
|
+
version = cop.metadata['VersionAdded'] || 'N/A'
|
165
|
+
|
166
|
+
warn Rainbow("#{cop.name}: # (new in #{version})").yellow
|
167
|
+
warn Rainbow(' Enabled: true').yellow
|
168
|
+
end
|
169
|
+
|
159
170
|
# Merges the given configuration with the default one.
|
160
171
|
def merge_with_default(config, config_file, unset_nil: true)
|
161
172
|
resolver.merge_with_default(config, config_file, unset_nil: unset_nil)
|
@@ -0,0 +1,33 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RuboCop
|
4
|
+
# This class handles collecting the options for regenerating a TODO file.
|
5
|
+
# @api private
|
6
|
+
class ConfigRegeneration
|
7
|
+
AUTO_GENERATED_FILE = RuboCop::CLI::Command::AutoGenerateConfig::AUTO_GENERATED_FILE
|
8
|
+
COMMAND_REGEX = /(?<=`rubocop )(.*?)(?=`)/.freeze
|
9
|
+
DEFAULT_OPTIONS = { auto_gen_config: true }.freeze
|
10
|
+
|
11
|
+
# Get options from the comment in the TODO file, and parse them as options
|
12
|
+
def options
|
13
|
+
# If there's no existing TODO file, generate one
|
14
|
+
return DEFAULT_OPTIONS unless todo_exists?
|
15
|
+
|
16
|
+
match = generation_command.match(COMMAND_REGEX)
|
17
|
+
return DEFAULT_OPTIONS unless match
|
18
|
+
|
19
|
+
options = match[1].split(' ')
|
20
|
+
Options.new.parse(options).first
|
21
|
+
end
|
22
|
+
|
23
|
+
private
|
24
|
+
|
25
|
+
def todo_exists?
|
26
|
+
File.exist?(AUTO_GENERATED_FILE) && !File.empty?(AUTO_GENERATED_FILE)
|
27
|
+
end
|
28
|
+
|
29
|
+
def generation_command
|
30
|
+
File.foreach(AUTO_GENERATED_FILE).take(2).last
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
data/lib/rubocop/config_store.rb
CHANGED
@@ -54,9 +54,9 @@ module RuboCop
|
|
54
54
|
@path_cache[dir] ||= ConfigLoader.configuration_file_for(dir)
|
55
55
|
path = @path_cache[dir]
|
56
56
|
@object_cache[path] ||= begin
|
57
|
-
|
58
|
-
|
59
|
-
|
57
|
+
print "For #{dir}: " if ConfigLoader.debug?
|
58
|
+
ConfigLoader.configuration_from_file(path)
|
59
|
+
end
|
60
60
|
end
|
61
61
|
end
|
62
62
|
end
|
@@ -8,11 +8,14 @@ module RuboCop
|
|
8
8
|
class ConfigValidator
|
9
9
|
extend Forwardable
|
10
10
|
|
11
|
+
# @api private
|
11
12
|
COMMON_PARAMS = %w[Exclude Include Severity inherit_mode
|
12
13
|
AutoCorrect StyleGuide Details].freeze
|
14
|
+
# @api private
|
13
15
|
INTERNAL_PARAMS = %w[Description StyleGuide
|
14
16
|
VersionAdded VersionChanged VersionRemoved
|
15
17
|
Reference Safe SafeAutoCorrect].freeze
|
18
|
+
# @api private
|
16
19
|
NEW_COPS_VALUES = %w[pending disable enable].freeze
|
17
20
|
|
18
21
|
def_delegators :@config, :smart_loaded_path, :for_all_cops
|
data/lib/rubocop/cop/base.rb
CHANGED
@@ -46,6 +46,9 @@ module RuboCop
|
|
46
46
|
# Consider creation API private
|
47
47
|
InvestigationReport = Struct.new(:cop, :processed_source, :offenses, :corrector)
|
48
48
|
|
49
|
+
# List of methods names to restrict calls for `on_send` / `on_csend`
|
50
|
+
RESTRICT_ON_SEND = Set[].freeze
|
51
|
+
|
49
52
|
# List of cops that should not try to autocorrect at the same
|
50
53
|
# time as this cop
|
51
54
|
#
|
@@ -56,6 +59,14 @@ module RuboCop
|
|
56
59
|
[]
|
57
60
|
end
|
58
61
|
|
62
|
+
# Cops (other than builtin) are encouraged to implement this
|
63
|
+
# @return [String, nil]
|
64
|
+
#
|
65
|
+
# @api public
|
66
|
+
def self.documentation_url
|
67
|
+
Documentation.url_for(self) if builtin?
|
68
|
+
end
|
69
|
+
|
59
70
|
def initialize(config = nil, options = nil)
|
60
71
|
@config = config || Config.new
|
61
72
|
@options = options || { debug: false }
|
@@ -279,6 +290,10 @@ module RuboCop
|
|
279
290
|
@currently_disabled_lines ||= Set.new
|
280
291
|
end
|
281
292
|
|
293
|
+
private_class_method def self.restrict_on_send
|
294
|
+
@restrict_on_send ||= self::RESTRICT_ON_SEND.to_set.freeze
|
295
|
+
end
|
296
|
+
|
282
297
|
# Called before any investigation
|
283
298
|
def begin_investigation(processed_source)
|
284
299
|
@current_offenses = []
|
@@ -297,6 +312,14 @@ module RuboCop
|
|
297
312
|
|
298
313
|
### Actually private methods
|
299
314
|
|
315
|
+
def self.builtin?
|
316
|
+
return false unless (m = instance_methods(false).first) # any custom method will do
|
317
|
+
|
318
|
+
path, _line = instance_method(m).source_location
|
319
|
+
path.start_with?(__dir__)
|
320
|
+
end
|
321
|
+
private_class_method :builtin?
|
322
|
+
|
300
323
|
def reset_investigation
|
301
324
|
@currently_disabled_lines = @current_offenses = @processed_source = @current_corrector = nil
|
302
325
|
end
|
@@ -53,7 +53,11 @@ module RuboCop
|
|
53
53
|
gem_declarations(processed_source.ast)
|
54
54
|
.group_by(&:first_argument)
|
55
55
|
.values
|
56
|
-
.select { |nodes| nodes.size > 1 }
|
56
|
+
.select { |nodes| nodes.size > 1 && !condition?(nodes) }
|
57
|
+
end
|
58
|
+
|
59
|
+
def condition?(nodes)
|
60
|
+
nodes[0].parent&.if_type? && nodes[0].parent == nodes[1].parent
|
57
61
|
end
|
58
62
|
|
59
63
|
def register_offense(node, gem_name, line_of_first_occurrence)
|
@@ -64,13 +64,14 @@ module RuboCop
|
|
64
64
|
MSG = 'Missing gem description comment.'
|
65
65
|
CHECKED_OPTIONS_CONFIG = 'OnlyFor'
|
66
66
|
VERSION_SPECIFIERS_OPTION = 'version_specifiers'
|
67
|
+
RESTRICT_ON_SEND = %i[gem].freeze
|
67
68
|
|
68
69
|
def_node_matcher :gem_declaration?, '(send nil? :gem str ...)'
|
69
70
|
|
70
71
|
def on_send(node)
|
71
72
|
return unless gem_declaration?(node)
|
72
73
|
return if ignored_gem?(node)
|
73
|
-
return if
|
74
|
+
return if commented_any_descendant?(node)
|
74
75
|
return if cop_config[CHECKED_OPTIONS_CONFIG].any? && !checked_options_present?(node)
|
75
76
|
|
76
77
|
add_offense(node)
|
@@ -78,6 +79,10 @@ module RuboCop
|
|
78
79
|
|
79
80
|
private
|
80
81
|
|
82
|
+
def commented_any_descendant?(node)
|
83
|
+
commented?(node) || node.each_descendant.any? { |n| commented?(n) }
|
84
|
+
end
|
85
|
+
|
81
86
|
def commented?(node)
|
82
87
|
preceding_lines = preceding_lines(node)
|
83
88
|
preceding_comment?(node, preceding_lines.last)
|
@@ -86,12 +91,12 @@ module RuboCop
|
|
86
91
|
# The args node1 & node2 may represent a RuboCop::AST::Node
|
87
92
|
# or a Parser::Source::Comment. Both respond to #loc.
|
88
93
|
def precede?(node1, node2)
|
89
|
-
node2.loc.line - node1.loc.line
|
94
|
+
node2.loc.line - node1.loc.line <= 1
|
90
95
|
end
|
91
96
|
|
92
97
|
def preceding_lines(node)
|
93
98
|
processed_source.ast_with_comments[node].select do |line|
|
94
|
-
line.loc.line
|
99
|
+
line.loc.line <= node.loc.line
|
95
100
|
end
|
96
101
|
end
|
97
102
|
|
@@ -34,6 +34,8 @@ module RuboCop
|
|
34
34
|
"Please change your source to 'https://rubygems.org' " \
|
35
35
|
"if possible, or 'http://rubygems.org' if not."
|
36
36
|
|
37
|
+
RESTRICT_ON_SEND = %i[source].freeze
|
38
|
+
|
37
39
|
def_node_matcher :insecure_protocol_source?, <<~PATTERN
|
38
40
|
(send nil? :source
|
39
41
|
$(sym ${:gemcutter :rubygems :rubyforge}))
|
@@ -7,6 +7,9 @@ module RuboCop
|
|
7
7
|
class Commissioner
|
8
8
|
include RuboCop::AST::Traversal
|
9
9
|
|
10
|
+
RESTRICTED_CALLBACKS = %i[on_send on_csend].freeze
|
11
|
+
private_constant :RESTRICTED_CALLBACKS
|
12
|
+
|
10
13
|
# How a Commissioner returns the results of the investigation
|
11
14
|
# as a list of Cop::InvestigationReport and any errors caught
|
12
15
|
# during the investigation.
|
@@ -42,7 +45,8 @@ module RuboCop
|
|
42
45
|
@cops = cops
|
43
46
|
@forces = forces
|
44
47
|
@options = options
|
45
|
-
@callbacks = {}
|
48
|
+
@callbacks = Hash.new { |h, k| h[k] = cops_callbacks_for(k) }
|
49
|
+
@restricted_map = {}
|
46
50
|
|
47
51
|
reset
|
48
52
|
end
|
@@ -57,10 +61,17 @@ module RuboCop
|
|
57
61
|
method_name = :"on_#{node_type}"
|
58
62
|
next unless method_defined?(method_name)
|
59
63
|
|
60
|
-
|
61
|
-
|
62
|
-
super(node) unless NO_CHILD_NODES.include?(node_type)
|
64
|
+
if RESTRICTED_CALLBACKS.include?(method_name)
|
65
|
+
trigger_restricted = "trigger_restricted_cops(:on_#{node_type}, node)"
|
63
66
|
end
|
67
|
+
|
68
|
+
class_eval(<<~RUBY, __FILE__, __LINE__ + 1)
|
69
|
+
def on_#{node_type}(node)
|
70
|
+
trigger_responding_cops(:on_#{node_type}, node)
|
71
|
+
#{trigger_restricted}
|
72
|
+
#{'super(node)' unless NO_CHILD_NODES.include?(node_type)}
|
73
|
+
end
|
74
|
+
RUBY
|
64
75
|
end
|
65
76
|
|
66
77
|
# @return [InvestigationReport]
|
@@ -83,9 +94,6 @@ module RuboCop
|
|
83
94
|
private
|
84
95
|
|
85
96
|
def trigger_responding_cops(callback, node)
|
86
|
-
@callbacks[callback] ||= @cops.select do |cop|
|
87
|
-
cop.respond_to?(callback)
|
88
|
-
end
|
89
97
|
@callbacks[callback].each do |cop|
|
90
98
|
with_cop_error_handling(cop, node) do
|
91
99
|
cop.send(callback, node)
|
@@ -97,6 +105,38 @@ module RuboCop
|
|
97
105
|
@errors = []
|
98
106
|
end
|
99
107
|
|
108
|
+
def cops_callbacks_for(callback)
|
109
|
+
callbacks = @cops.select do |cop|
|
110
|
+
cop.respond_to?(callback)
|
111
|
+
end
|
112
|
+
if RESTRICTED_CALLBACKS.include?(callback)
|
113
|
+
@restricted_map[callback] = restricted_map(callbacks)
|
114
|
+
end
|
115
|
+
callbacks
|
116
|
+
end
|
117
|
+
|
118
|
+
def trigger_restricted_cops(event, node)
|
119
|
+
name = node.method_name
|
120
|
+
@restricted_map.fetch(event)[name]&.each do |cop|
|
121
|
+
with_cop_error_handling(cop, node) do
|
122
|
+
cop.send(event, node)
|
123
|
+
end
|
124
|
+
end
|
125
|
+
end
|
126
|
+
|
127
|
+
# Note: mutates `callbacks` in place
|
128
|
+
def restricted_map(callbacks)
|
129
|
+
map = {}
|
130
|
+
callbacks.select! do |cop|
|
131
|
+
restrictions = cop.class.send :restrict_on_send
|
132
|
+
restrictions.each do |name|
|
133
|
+
(map[name] ||= []) << cop
|
134
|
+
end
|
135
|
+
restrictions.empty?
|
136
|
+
end
|
137
|
+
map
|
138
|
+
end
|
139
|
+
|
100
140
|
def invoke(callback, cops, *args)
|
101
141
|
cops.each do |cop|
|
102
142
|
with_cop_error_handling(cop) do
|