rubocop 1.9.1 → 1.13.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 +15 -14
- data/assets/output.html.erb +1 -1
- data/config/default.yml +77 -17
- data/config/obsoletion.yml +4 -0
- data/exe/rubocop +1 -3
- data/lib/rubocop.rb +5 -1
- data/lib/rubocop/cached_data.rb +1 -3
- data/lib/rubocop/cli.rb +4 -6
- data/lib/rubocop/cli/command/auto_genenerate_config.rb +9 -19
- data/lib/rubocop/cli/command/execute_runner.rb +1 -1
- data/lib/rubocop/cli/command/init_dotfile.rb +1 -3
- data/lib/rubocop/cli/command/show_cops.rb +1 -4
- data/lib/rubocop/cli/command/suggest_extensions.rb +3 -2
- data/lib/rubocop/comment_config.rb +45 -101
- data/lib/rubocop/config.rb +11 -26
- data/lib/rubocop/config_loader.rb +5 -11
- data/lib/rubocop/config_loader_resolver.rb +22 -14
- data/lib/rubocop/config_obsoletion/cop_rule.rb +1 -2
- data/lib/rubocop/config_store.rb +1 -2
- data/lib/rubocop/config_validator.rb +5 -10
- data/lib/rubocop/cop/autocorrect_logic.rb +3 -8
- data/lib/rubocop/cop/badge.rb +1 -2
- data/lib/rubocop/cop/base.rb +8 -6
- data/lib/rubocop/cop/bundler/duplicated_gem.rb +3 -3
- data/lib/rubocop/cop/bundler/gem_comment.rb +43 -8
- data/lib/rubocop/cop/bundler/insecure_protocol_source.rb +1 -0
- data/lib/rubocop/cop/bundler/ordered_gems.rb +2 -4
- data/lib/rubocop/cop/commissioner.rb +2 -8
- data/lib/rubocop/cop/cop.rb +4 -18
- data/lib/rubocop/cop/corrector.rb +1 -4
- data/lib/rubocop/cop/correctors/alignment_corrector.rb +6 -12
- data/lib/rubocop/cop/correctors/each_to_for_corrector.rb +2 -4
- data/lib/rubocop/cop/correctors/for_to_each_corrector.rb +1 -2
- data/lib/rubocop/cop/correctors/line_break_corrector.rb +3 -6
- data/lib/rubocop/cop/correctors/multiline_literal_brace_corrector.rb +1 -3
- data/lib/rubocop/cop/correctors/ordered_gem_corrector.rb +1 -3
- data/lib/rubocop/cop/correctors/percent_literal_corrector.rb +2 -8
- data/lib/rubocop/cop/gemspec/date_assignment.rb +57 -0
- data/lib/rubocop/cop/gemspec/duplicated_assignment.rb +3 -2
- data/lib/rubocop/cop/gemspec/ordered_dependencies.rb +2 -4
- data/lib/rubocop/cop/gemspec/required_ruby_version.rb +2 -0
- data/lib/rubocop/cop/gemspec/ruby_version_globals_usage.rb +2 -0
- data/lib/rubocop/cop/generator.rb +3 -6
- data/lib/rubocop/cop/generator/configuration_injector.rb +1 -2
- data/lib/rubocop/cop/generator/require_file_injector.rb +2 -5
- data/lib/rubocop/cop/internal_affairs.rb +1 -0
- data/lib/rubocop/cop/internal_affairs/example_description.rb +7 -4
- data/lib/rubocop/cop/internal_affairs/method_name_equal.rb +3 -5
- data/lib/rubocop/cop/internal_affairs/node_destructuring.rb +3 -3
- data/lib/rubocop/cop/internal_affairs/node_matcher_directive.rb +151 -0
- data/lib/rubocop/cop/internal_affairs/node_type_predicate.rb +2 -3
- data/lib/rubocop/cop/internal_affairs/offense_location_keyword.rb +3 -2
- data/lib/rubocop/cop/internal_affairs/redundant_described_class_as_subject.rb +1 -0
- data/lib/rubocop/cop/internal_affairs/redundant_let_rubocop_config_new.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 +3 -0
- data/lib/rubocop/cop/internal_affairs/style_detected_api_use.rb +5 -2
- data/lib/rubocop/cop/internal_affairs/useless_message_assertion.rb +3 -3
- data/lib/rubocop/cop/layout/access_modifier_indentation.rb +12 -10
- data/lib/rubocop/cop/layout/argument_alignment.rb +8 -9
- data/lib/rubocop/cop/layout/array_alignment.rb +7 -6
- data/lib/rubocop/cop/layout/assignment_indentation.rb +8 -7
- data/lib/rubocop/cop/layout/begin_end_alignment.rb +1 -4
- data/lib/rubocop/cop/layout/block_alignment.rb +8 -19
- data/lib/rubocop/cop/layout/block_end_newline.rb +4 -8
- data/lib/rubocop/cop/layout/case_indentation.rb +1 -3
- data/lib/rubocop/cop/layout/class_structure.rb +5 -10
- data/lib/rubocop/cop/layout/closing_parenthesis_indentation.rb +18 -30
- data/lib/rubocop/cop/layout/comment_indentation.rb +17 -21
- data/lib/rubocop/cop/layout/def_end_alignment.rb +2 -6
- data/lib/rubocop/cop/layout/dot_position.rb +1 -3
- data/lib/rubocop/cop/layout/else_alignment.rb +10 -9
- data/lib/rubocop/cop/layout/empty_comment.rb +5 -12
- data/lib/rubocop/cop/layout/empty_line_after_guard_clause.rb +22 -8
- data/lib/rubocop/cop/layout/empty_line_between_defs.rb +2 -6
- data/lib/rubocop/cop/layout/empty_lines.rb +1 -3
- data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +8 -18
- data/lib/rubocop/cop/layout/empty_lines_around_exception_handling_keywords.rb +2 -8
- data/lib/rubocop/cop/layout/end_alignment.rb +1 -2
- data/lib/rubocop/cop/layout/end_of_line.rb +1 -1
- data/lib/rubocop/cop/layout/extra_spacing.rb +5 -9
- data/lib/rubocop/cop/layout/first_argument_indentation.rb +12 -6
- data/lib/rubocop/cop/layout/first_array_element_indentation.rb +10 -8
- data/lib/rubocop/cop/layout/first_array_element_line_break.rb +1 -2
- data/lib/rubocop/cop/layout/first_hash_element_indentation.rb +24 -20
- data/lib/rubocop/cop/layout/first_hash_element_line_break.rb +1 -2
- data/lib/rubocop/cop/layout/first_method_argument_line_break.rb +1 -2
- data/lib/rubocop/cop/layout/first_method_parameter_line_break.rb +1 -2
- data/lib/rubocop/cop/layout/first_parameter_indentation.rb +6 -5
- data/lib/rubocop/cop/layout/hash_alignment.rb +3 -6
- data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +2 -9
- data/lib/rubocop/cop/layout/heredoc_indentation.rb +2 -6
- data/lib/rubocop/cop/layout/indentation_consistency.rb +9 -6
- data/lib/rubocop/cop/layout/indentation_style.rb +25 -30
- data/lib/rubocop/cop/layout/indentation_width.rb +21 -11
- data/lib/rubocop/cop/layout/initial_indentation.rb +1 -4
- data/lib/rubocop/cop/layout/line_length.rb +4 -15
- data/lib/rubocop/cop/layout/multiline_array_line_breaks.rb +1 -2
- data/lib/rubocop/cop/layout/multiline_assignment_layout.rb +26 -0
- data/lib/rubocop/cop/layout/multiline_block_layout.rb +7 -15
- data/lib/rubocop/cop/layout/multiline_hash_key_line_breaks.rb +1 -2
- data/lib/rubocop/cop/layout/multiline_method_argument_line_breaks.rb +1 -2
- data/lib/rubocop/cop/layout/multiline_method_call_indentation.rb +22 -15
- data/lib/rubocop/cop/layout/multiline_operation_indentation.rb +10 -5
- data/lib/rubocop/cop/layout/parameter_alignment.rb +6 -5
- data/lib/rubocop/cop/layout/redundant_line_break.rb +125 -0
- data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +3 -6
- data/lib/rubocop/cop/layout/space_after_colon.rb +1 -3
- data/lib/rubocop/cop/layout/space_after_method_name.rb +2 -4
- data/lib/rubocop/cop/layout/space_around_block_parameters.rb +6 -14
- data/lib/rubocop/cop/layout/space_around_equals_in_parameter_default.rb +1 -2
- data/lib/rubocop/cop/layout/space_around_keyword.rb +3 -6
- data/lib/rubocop/cop/layout/space_around_operators.rb +4 -9
- data/lib/rubocop/cop/layout/space_before_block_braces.rb +2 -3
- data/lib/rubocop/cop/layout/space_before_brackets.rb +2 -4
- data/lib/rubocop/cop/layout/space_before_comment.rb +1 -3
- data/lib/rubocop/cop/layout/space_before_first_arg.rb +5 -11
- data/lib/rubocop/cop/layout/space_in_lambda_literal.rb +2 -4
- data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +5 -10
- data/lib/rubocop/cop/layout/space_inside_array_percent_literal.rb +2 -7
- data/lib/rubocop/cop/layout/space_inside_block_braces.rb +6 -11
- data/lib/rubocop/cop/layout/space_inside_hash_literal_braces.rb +1 -2
- data/lib/rubocop/cop/layout/space_inside_reference_brackets.rb +1 -2
- data/lib/rubocop/cop/legacy/corrections_proxy.rb +2 -8
- data/lib/rubocop/cop/legacy/corrector.rb +1 -3
- data/lib/rubocop/cop/lint/ambiguous_assignment.rb +1 -6
- data/lib/rubocop/cop/lint/ambiguous_block_association.rb +14 -7
- data/lib/rubocop/cop/lint/big_decimal_new.rb +1 -0
- data/lib/rubocop/cop/lint/boolean_symbol.rb +2 -2
- data/lib/rubocop/cop/lint/constant_definition_in_block.rb +2 -0
- data/lib/rubocop/cop/lint/constant_resolution.rb +2 -2
- data/lib/rubocop/cop/lint/debugger.rb +60 -14
- data/lib/rubocop/cop/lint/deprecated_class_methods.rb +2 -4
- data/lib/rubocop/cop/lint/deprecated_constants.rb +3 -3
- data/lib/rubocop/cop/lint/deprecated_open_ssl_constant.rb +16 -9
- data/lib/rubocop/cop/lint/duplicate_branch.rb +2 -3
- data/lib/rubocop/cop/lint/duplicate_hash_key.rb +1 -3
- data/lib/rubocop/cop/lint/duplicate_methods.rb +6 -7
- data/lib/rubocop/cop/lint/duplicate_require.rb +3 -2
- data/lib/rubocop/cop/lint/each_with_object_argument.rb +1 -0
- data/lib/rubocop/cop/lint/else_layout.rb +2 -4
- data/lib/rubocop/cop/lint/empty_ensure.rb +1 -3
- data/lib/rubocop/cop/lint/empty_file.rb +1 -3
- data/lib/rubocop/cop/lint/empty_interpolation.rb +1 -3
- data/lib/rubocop/cop/lint/ensure_return.rb +1 -3
- data/lib/rubocop/cop/lint/erb_new_arguments.rb +4 -7
- data/lib/rubocop/cop/lint/float_out_of_range.rb +1 -2
- data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +4 -6
- data/lib/rubocop/cop/lint/hash_compare_by_identity.rb +1 -0
- data/lib/rubocop/cop/lint/heredoc_method_call_position.rb +1 -2
- data/lib/rubocop/cop/lint/implicit_string_concatenation.rb +1 -2
- data/lib/rubocop/cop/lint/ineffective_access_modifier.rb +4 -7
- data/lib/rubocop/cop/lint/inherit_exception.rb +2 -2
- data/lib/rubocop/cop/lint/interpolation_check.rb +3 -11
- data/lib/rubocop/cop/lint/literal_in_interpolation.rb +3 -6
- data/lib/rubocop/cop/lint/loop.rb +1 -2
- data/lib/rubocop/cop/lint/missing_cop_enable_directive.rb +3 -7
- data/lib/rubocop/cop/lint/missing_super.rb +1 -2
- data/lib/rubocop/cop/lint/mixed_regexp_capture_types.rb +1 -2
- data/lib/rubocop/cop/lint/multiple_comparison.rb +5 -4
- data/lib/rubocop/cop/lint/nested_method_definition.rb +4 -2
- data/lib/rubocop/cop/lint/nested_percent_literal.rb +1 -3
- data/lib/rubocop/cop/lint/next_without_accumulator.rb +1 -0
- data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +8 -3
- data/lib/rubocop/cop/lint/non_local_exit_from_iterator.rb +3 -0
- data/lib/rubocop/cop/lint/number_conversion.rb +12 -4
- data/lib/rubocop/cop/lint/ordered_magic_comments.rb +1 -2
- data/lib/rubocop/cop/lint/out_of_range_regexp_ref.rb +1 -3
- data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +1 -3
- data/lib/rubocop/cop/lint/percent_symbol_array.rb +1 -3
- data/lib/rubocop/cop/lint/raise_exception.rb +3 -2
- data/lib/rubocop/cop/lint/rand_one.rb +2 -2
- data/lib/rubocop/cop/lint/redundant_cop_disable_directive.rb +9 -22
- data/lib/rubocop/cop/lint/redundant_require_statement.rb +1 -0
- data/lib/rubocop/cop/lint/redundant_safe_navigation.rb +2 -3
- data/lib/rubocop/cop/lint/redundant_splat_expansion.rb +10 -10
- data/lib/rubocop/cop/lint/redundant_string_coercion.rb +2 -2
- data/lib/rubocop/cop/lint/redundant_with_index.rb +2 -4
- data/lib/rubocop/cop/lint/redundant_with_object.rb +2 -4
- data/lib/rubocop/cop/lint/regexp_as_condition.rb +1 -3
- data/lib/rubocop/cop/lint/require_parentheses.rb +2 -4
- data/lib/rubocop/cop/lint/rescue_exception.rb +1 -2
- data/lib/rubocop/cop/lint/rescue_type.rb +2 -7
- data/lib/rubocop/cop/lint/return_in_void_context.rb +1 -2
- data/lib/rubocop/cop/lint/safe_navigation_chain.rb +2 -2
- data/lib/rubocop/cop/lint/safe_navigation_consistency.rb +4 -10
- data/lib/rubocop/cop/lint/safe_navigation_with_empty.rb +2 -2
- data/lib/rubocop/cop/lint/send_with_mixin_argument.rb +3 -7
- data/lib/rubocop/cop/lint/shadowed_argument.rb +5 -11
- data/lib/rubocop/cop/lint/shadowed_exception.rb +7 -8
- data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +1 -0
- data/lib/rubocop/cop/lint/struct_new_override.rb +2 -2
- data/lib/rubocop/cop/lint/suppressed_exception.rb +44 -1
- data/lib/rubocop/cop/lint/symbol_conversion.rb +91 -6
- data/lib/rubocop/cop/lint/syntax.rb +1 -3
- data/lib/rubocop/cop/lint/to_enum_arguments.rb +3 -0
- data/lib/rubocop/cop/lint/to_json.rb +1 -2
- data/lib/rubocop/cop/lint/trailing_comma_in_attribute_declaration.rb +1 -3
- data/lib/rubocop/cop/lint/underscore_prefixed_variable_name.rb +1 -3
- data/lib/rubocop/cop/lint/unified_integer.rb +1 -0
- data/lib/rubocop/cop/lint/unmodified_reduce_accumulator.rb +5 -0
- data/lib/rubocop/cop/lint/unreachable_code.rb +3 -5
- data/lib/rubocop/cop/lint/unreachable_loop.rb +3 -5
- data/lib/rubocop/cop/lint/unused_block_argument.rb +4 -8
- data/lib/rubocop/cop/lint/unused_method_argument.rb +2 -2
- data/lib/rubocop/cop/lint/uri_escape_unescape.rb +1 -0
- data/lib/rubocop/cop/lint/useless_access_modifier.rb +6 -4
- data/lib/rubocop/cop/lint/useless_assignment.rb +4 -9
- data/lib/rubocop/cop/lint/useless_setter_call.rb +2 -3
- data/lib/rubocop/cop/lint/useless_times.rb +3 -0
- data/lib/rubocop/cop/lint/void.rb +4 -11
- data/lib/rubocop/cop/message_annotator.rb +1 -3
- data/lib/rubocop/cop/metrics/block_nesting.rb +2 -7
- data/lib/rubocop/cop/metrics/class_length.rb +1 -3
- data/lib/rubocop/cop/metrics/cyclomatic_complexity.rb +1 -2
- data/lib/rubocop/cop/metrics/module_length.rb +3 -6
- data/lib/rubocop/cop/metrics/parameter_lists.rb +3 -5
- data/lib/rubocop/cop/metrics/perceived_complexity.rb +1 -2
- data/lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +4 -7
- data/lib/rubocop/cop/metrics/utils/code_length_calculator.rb +6 -4
- data/lib/rubocop/cop/metrics/utils/repeated_attribute_discount.rb +4 -7
- data/lib/rubocop/cop/migration/department_name.rb +3 -7
- data/lib/rubocop/cop/mixin/alignment.rb +12 -7
- data/lib/rubocop/cop/mixin/check_line_breakable.rb +1 -1
- data/lib/rubocop/cop/mixin/code_length.rb +1 -3
- data/lib/rubocop/cop/mixin/comments_help.rb +5 -1
- data/lib/rubocop/cop/mixin/configurable_enforced_style.rb +2 -2
- data/lib/rubocop/cop/mixin/configurable_formatting.rb +3 -8
- data/lib/rubocop/cop/mixin/def_node.rb +3 -5
- data/lib/rubocop/cop/mixin/documentation_comment.rb +3 -6
- data/lib/rubocop/cop/mixin/empty_lines_around_body.rb +6 -7
- data/lib/rubocop/cop/mixin/empty_parameter.rb +2 -3
- data/lib/rubocop/cop/mixin/end_keyword_alignment.rb +1 -3
- data/lib/rubocop/cop/mixin/enforce_superclass.rb +4 -6
- data/lib/rubocop/cop/mixin/first_element_line_break.rb +1 -3
- data/lib/rubocop/cop/mixin/frozen_string_literal.rb +3 -9
- data/lib/rubocop/cop/mixin/hash_alignment_styles.rb +3 -6
- data/lib/rubocop/cop/mixin/hash_transform_method.rb +8 -22
- data/lib/rubocop/cop/mixin/interpolation.rb +1 -3
- data/lib/rubocop/cop/mixin/line_length_help.rb +13 -10
- data/lib/rubocop/cop/mixin/match_range.rb +2 -5
- data/lib/rubocop/cop/mixin/method_complexity.rb +2 -3
- data/lib/rubocop/cop/mixin/method_preference.rb +1 -2
- data/lib/rubocop/cop/mixin/multiline_element_indentation.rb +4 -3
- data/lib/rubocop/cop/mixin/multiline_element_line_breaks.rb +1 -3
- data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +11 -40
- data/lib/rubocop/cop/mixin/multiline_literal_brace_layout.rb +1 -2
- data/lib/rubocop/cop/mixin/negative_conditional.rb +4 -2
- data/lib/rubocop/cop/mixin/ordered_gem_node.rb +1 -4
- data/lib/rubocop/cop/mixin/percent_array.rb +1 -3
- data/lib/rubocop/cop/mixin/percent_literal.rb +0 -6
- data/lib/rubocop/cop/mixin/preceding_following_alignment.rb +5 -11
- data/lib/rubocop/cop/mixin/preferred_delimiters.rb +6 -9
- data/lib/rubocop/cop/mixin/range_help.rb +10 -13
- data/lib/rubocop/cop/mixin/rational_literal.rb +1 -0
- data/lib/rubocop/cop/mixin/rescue_node.rb +2 -6
- data/lib/rubocop/cop/mixin/safe_assignment.rb +6 -2
- data/lib/rubocop/cop/mixin/space_after_punctuation.rb +2 -4
- data/lib/rubocop/cop/mixin/space_before_punctuation.rb +1 -2
- data/lib/rubocop/cop/mixin/statement_modifier.rb +1 -3
- data/lib/rubocop/cop/mixin/trailing_body.rb +1 -2
- data/lib/rubocop/cop/mixin/trailing_comma.rb +1 -2
- data/lib/rubocop/cop/mixin/uncommunicative_name.rb +7 -13
- data/lib/rubocop/cop/mixin/unused_argument.rb +1 -3
- data/lib/rubocop/cop/mixin/visibility_help.rb +1 -0
- data/lib/rubocop/cop/naming/ascii_identifiers.rb +2 -4
- data/lib/rubocop/cop/naming/binary_operator_parameter_name.rb +2 -2
- data/lib/rubocop/cop/naming/constant_name.rb +2 -0
- data/lib/rubocop/cop/naming/file_name.rb +7 -16
- data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +8 -3
- data/lib/rubocop/cop/naming/method_name.rb +4 -2
- data/lib/rubocop/cop/naming/predicate_name.rb +2 -2
- data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +10 -0
- data/lib/rubocop/cop/offense.rb +3 -8
- data/lib/rubocop/cop/registry.rb +13 -12
- 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/style/access_modifier_declarations.rb +4 -5
- data/lib/rubocop/cop/style/accessor_grouping.rb +1 -3
- data/lib/rubocop/cop/style/alias.rb +6 -12
- data/lib/rubocop/cop/style/and_or.rb +3 -1
- data/lib/rubocop/cop/style/arguments_forwarding.rb +4 -3
- data/lib/rubocop/cop/style/array_coercion.rb +2 -0
- data/lib/rubocop/cop/style/array_join.rb +1 -0
- data/lib/rubocop/cop/style/ascii_comments.rb +1 -2
- data/lib/rubocop/cop/style/attr.rb +2 -3
- data/lib/rubocop/cop/style/auto_resource_cleanup.rb +2 -5
- data/lib/rubocop/cop/style/bisected_attr_accessor.rb +59 -71
- data/lib/rubocop/cop/style/bisected_attr_accessor/macro.rb +60 -0
- data/lib/rubocop/cop/style/case_equality.rb +2 -1
- data/lib/rubocop/cop/style/case_like_if.rb +16 -6
- data/lib/rubocop/cop/style/character_literal.rb +2 -4
- data/lib/rubocop/cop/style/class_and_module_children.rb +3 -6
- data/lib/rubocop/cop/style/class_equality_comparison.rb +3 -0
- data/lib/rubocop/cop/style/class_methods.rb +1 -3
- data/lib/rubocop/cop/style/collection_compact.rb +3 -3
- data/lib/rubocop/cop/style/colon_method_call.rb +2 -3
- data/lib/rubocop/cop/style/combinable_loops.rb +3 -2
- data/lib/rubocop/cop/style/command_literal.rb +4 -9
- data/lib/rubocop/cop/style/comment_annotation.rb +3 -6
- data/lib/rubocop/cop/style/commented_keyword.rb +7 -13
- data/lib/rubocop/cop/style/conditional_assignment.rb +12 -24
- data/lib/rubocop/cop/style/constant_visibility.rb +28 -0
- data/lib/rubocop/cop/style/copyright.rb +3 -6
- data/lib/rubocop/cop/style/date_time.rb +5 -5
- data/lib/rubocop/cop/style/def_with_parentheses.rb +1 -2
- data/lib/rubocop/cop/style/dir.rb +1 -0
- data/lib/rubocop/cop/style/disable_cops_within_source_code_directive.rb +2 -2
- data/lib/rubocop/cop/style/documentation.rb +30 -3
- data/lib/rubocop/cop/style/documentation_method.rb +1 -0
- data/lib/rubocop/cop/style/double_negation.rb +3 -2
- data/lib/rubocop/cop/style/each_for_simple_loop.rb +2 -2
- data/lib/rubocop/cop/style/each_with_object.rb +1 -0
- data/lib/rubocop/cop/style/empty_case_condition.rb +2 -7
- data/lib/rubocop/cop/style/empty_else.rb +3 -9
- data/lib/rubocop/cop/style/empty_literal.rb +13 -8
- data/lib/rubocop/cop/style/empty_method.rb +3 -7
- data/lib/rubocop/cop/style/end_block.rb +1 -2
- data/lib/rubocop/cop/style/endless_method.rb +2 -3
- data/lib/rubocop/cop/style/eval_with_location.rb +91 -31
- data/lib/rubocop/cop/style/even_odd.rb +1 -0
- data/lib/rubocop/cop/style/expand_path_arguments.rb +4 -3
- data/lib/rubocop/cop/style/explicit_block_argument.rb +3 -5
- data/lib/rubocop/cop/style/exponential_notation.rb +6 -7
- data/lib/rubocop/cop/style/float_division.rb +4 -0
- data/lib/rubocop/cop/style/format_string.rb +2 -0
- data/lib/rubocop/cop/style/format_string_token.rb +2 -4
- data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +3 -11
- data/lib/rubocop/cop/style/global_std_stream.rb +1 -0
- data/lib/rubocop/cop/style/guard_clause.rb +3 -7
- data/lib/rubocop/cop/style/hash_conversion.rb +133 -0
- data/lib/rubocop/cop/style/hash_each_methods.rb +2 -2
- data/lib/rubocop/cop/style/hash_except.rb +1 -0
- data/lib/rubocop/cop/style/hash_like_case.rb +2 -2
- data/lib/rubocop/cop/style/hash_syntax.rb +20 -24
- data/lib/rubocop/cop/style/hash_transform_keys.rb +4 -0
- data/lib/rubocop/cop/style/hash_transform_values.rb +4 -0
- data/lib/rubocop/cop/style/identical_conditional_branches.rb +1 -3
- data/lib/rubocop/cop/style/if_unless_modifier.rb +41 -13
- data/lib/rubocop/cop/style/if_with_boolean_literal_branches.rb +2 -0
- data/lib/rubocop/cop/style/implicit_runtime_error.rb +1 -0
- data/lib/rubocop/cop/style/infinite_loop.rb +2 -5
- data/lib/rubocop/cop/style/inverse_methods.rb +5 -7
- data/lib/rubocop/cop/style/ip_addresses.rb +1 -2
- data/lib/rubocop/cop/style/lambda.rb +2 -4
- data/lib/rubocop/cop/style/lambda_call.rb +1 -2
- data/lib/rubocop/cop/style/line_end_concatenation.rb +5 -12
- data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +47 -3
- data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +26 -16
- data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +1 -2
- data/lib/rubocop/cop/style/method_called_on_do_end_block.rb +2 -4
- data/lib/rubocop/cop/style/method_def_parentheses.rb +4 -8
- data/lib/rubocop/cop/style/min_max.rb +2 -2
- data/lib/rubocop/cop/style/missing_else.rb +2 -4
- data/lib/rubocop/cop/style/missing_respond_to_missing.rb +1 -2
- data/lib/rubocop/cop/style/mixin_grouping.rb +4 -10
- data/lib/rubocop/cop/style/mixin_usage.rb +3 -2
- data/lib/rubocop/cop/style/module_function.rb +8 -6
- data/lib/rubocop/cop/style/multiline_block_chain.rb +1 -2
- data/lib/rubocop/cop/style/multiline_method_signature.rb +11 -6
- data/lib/rubocop/cop/style/multiline_ternary_operator.rb +1 -2
- data/lib/rubocop/cop/style/multiple_comparison.rb +22 -5
- data/lib/rubocop/cop/style/mutable_constant.rb +7 -10
- data/lib/rubocop/cop/style/negated_if.rb +1 -2
- data/lib/rubocop/cop/style/negated_if_else_condition.rb +16 -2
- data/lib/rubocop/cop/style/negated_unless.rb +1 -2
- data/lib/rubocop/cop/style/nested_modifier.rb +3 -7
- data/lib/rubocop/cop/style/nested_ternary_operator.rb +2 -3
- data/lib/rubocop/cop/style/next.rb +4 -9
- data/lib/rubocop/cop/style/nil_comparison.rb +3 -0
- data/lib/rubocop/cop/style/nil_lambda.rb +1 -0
- data/lib/rubocop/cop/style/non_nil_check.rb +9 -5
- data/lib/rubocop/cop/style/numeric_literals.rb +3 -11
- data/lib/rubocop/cop/style/numeric_predicate.rb +5 -7
- data/lib/rubocop/cop/style/one_line_conditional.rb +1 -2
- data/lib/rubocop/cop/style/option_hash.rb +2 -3
- data/lib/rubocop/cop/style/optional_arguments.rb +2 -5
- data/lib/rubocop/cop/style/or_assignment.rb +4 -6
- data/lib/rubocop/cop/style/parallel_assignment.rb +12 -9
- data/lib/rubocop/cop/style/parentheses_around_condition.rb +1 -0
- data/lib/rubocop/cop/style/percent_literal_delimiters.rb +1 -3
- data/lib/rubocop/cop/style/percent_q_literals.rb +1 -2
- data/lib/rubocop/cop/style/perl_backrefs.rb +2 -9
- data/lib/rubocop/cop/style/preferred_hash_methods.rb +1 -4
- data/lib/rubocop/cop/style/proc.rb +2 -2
- data/lib/rubocop/cop/style/raise_args.rb +4 -8
- data/lib/rubocop/cop/style/random_with_offset.rb +8 -8
- data/lib/rubocop/cop/style/redundant_argument.rb +2 -11
- data/lib/rubocop/cop/style/redundant_assignment.rb +2 -3
- data/lib/rubocop/cop/style/redundant_begin.rb +47 -7
- data/lib/rubocop/cop/style/redundant_capital_w.rb +1 -2
- data/lib/rubocop/cop/style/redundant_condition.rb +2 -5
- data/lib/rubocop/cop/style/redundant_conditional.rb +5 -6
- data/lib/rubocop/cop/style/redundant_exception.rb +5 -6
- data/lib/rubocop/cop/style/redundant_fetch_block.rb +2 -0
- data/lib/rubocop/cop/style/redundant_file_extension_in_require.rb +2 -1
- data/lib/rubocop/cop/style/redundant_freeze.rb +2 -2
- data/lib/rubocop/cop/style/redundant_interpolation.rb +1 -2
- data/lib/rubocop/cop/style/redundant_parentheses.rb +21 -20
- data/lib/rubocop/cop/style/redundant_percent_q.rb +1 -2
- data/lib/rubocop/cop/style/redundant_regexp_escape.rb +1 -4
- data/lib/rubocop/cop/style/redundant_return.rb +6 -4
- data/lib/rubocop/cop/style/redundant_self.rb +9 -9
- data/lib/rubocop/cop/style/redundant_self_assignment.rb +4 -2
- data/lib/rubocop/cop/style/redundant_sort.rb +3 -5
- data/lib/rubocop/cop/style/redundant_sort_by.rb +1 -0
- data/lib/rubocop/cop/style/regexp_literal.rb +4 -8
- data/lib/rubocop/cop/style/rescue_modifier.rb +21 -14
- data/lib/rubocop/cop/style/rescue_standard_error.rb +5 -7
- data/lib/rubocop/cop/style/return_nil.rb +7 -2
- data/lib/rubocop/cop/style/safe_navigation.rb +12 -21
- data/lib/rubocop/cop/style/sample.rb +1 -0
- data/lib/rubocop/cop/style/send.rb +1 -2
- data/lib/rubocop/cop/style/signal_exception.rb +6 -7
- data/lib/rubocop/cop/style/single_argument_dig.rb +2 -2
- data/lib/rubocop/cop/style/single_line_block_params.rb +2 -5
- data/lib/rubocop/cop/style/single_line_methods.rb +16 -4
- data/lib/rubocop/cop/style/slicing_with_range.rb +1 -0
- data/lib/rubocop/cop/style/sole_nested_conditional.rb +17 -2
- data/lib/rubocop/cop/style/special_global_vars.rb +6 -18
- data/lib/rubocop/cop/style/stabby_lambda_parentheses.rb +1 -2
- data/lib/rubocop/cop/style/stderr_puts.rb +3 -6
- data/lib/rubocop/cop/style/string_chars.rb +39 -0
- data/lib/rubocop/cop/style/string_concatenation.rb +9 -10
- data/lib/rubocop/cop/style/string_hash_keys.rb +2 -0
- data/lib/rubocop/cop/style/string_literals.rb +2 -5
- data/lib/rubocop/cop/style/strip.rb +1 -0
- data/lib/rubocop/cop/style/struct_inheritance.rb +11 -0
- data/lib/rubocop/cop/style/symbol_literal.rb +1 -3
- data/lib/rubocop/cop/style/symbol_proc.rb +29 -10
- data/lib/rubocop/cop/style/ternary_parentheses.rb +4 -6
- data/lib/rubocop/cop/style/trailing_body_on_method_definition.rb +6 -2
- data/lib/rubocop/cop/style/trailing_comma_in_block_args.rb +2 -6
- data/lib/rubocop/cop/style/trailing_method_end_statement.rb +3 -6
- data/lib/rubocop/cop/style/trailing_underscore_variable.rb +4 -10
- data/lib/rubocop/cop/style/trivial_accessors.rb +3 -4
- data/lib/rubocop/cop/style/unless_else.rb +1 -2
- data/lib/rubocop/cop/style/unless_logical_operators.rb +105 -0
- data/lib/rubocop/cop/style/unpack_first.rb +1 -0
- data/lib/rubocop/cop/style/variable_interpolation.rb +1 -1
- data/lib/rubocop/cop/style/when_then.rb +1 -3
- data/lib/rubocop/cop/style/while_until_modifier.rb +1 -2
- data/lib/rubocop/cop/style/word_array.rb +1 -2
- data/lib/rubocop/cop/style/yoda_condition.rb +4 -11
- data/lib/rubocop/cop/style/zero_length_predicate.rb +6 -2
- data/lib/rubocop/cop/team.rb +2 -5
- data/lib/rubocop/cop/util.rb +8 -11
- data/lib/rubocop/cop/utils/format_string.rb +1 -3
- data/lib/rubocop/cop/variable_force.rb +6 -15
- data/lib/rubocop/cop/variable_force/assignment.rb +1 -2
- data/lib/rubocop/cop/variable_force/branch.rb +1 -2
- data/lib/rubocop/cop/variable_force/reference.rb +1 -3
- data/lib/rubocop/cop/variable_force/scope.rb +4 -8
- data/lib/rubocop/cop/variable_force/variable.rb +2 -4
- data/lib/rubocop/cops_documentation_generator.rb +7 -21
- data/lib/rubocop/directive_comment.rb +69 -9
- data/lib/rubocop/ext/regexp_parser.rb +3 -6
- data/lib/rubocop/file_finder.rb +1 -3
- data/lib/rubocop/formatter/clang_style_formatter.rb +4 -2
- data/lib/rubocop/formatter/disabled_config_formatter.rb +3 -8
- data/lib/rubocop/formatter/git_hub_actions_formatter.rb +1 -5
- data/lib/rubocop/formatter/html_formatter.rb +4 -10
- data/lib/rubocop/formatter/json_formatter.rb +1 -5
- data/lib/rubocop/formatter/junit_formatter.rb +3 -9
- data/lib/rubocop/formatter/offense_count_formatter.rb +1 -1
- data/lib/rubocop/formatter/progress_formatter.rb +1 -3
- data/lib/rubocop/formatter/tap_formatter.rb +4 -2
- data/lib/rubocop/formatter/worst_offenders_formatter.rb +1 -1
- data/lib/rubocop/magic_comment.rb +1 -1
- data/lib/rubocop/name_similarity.rb +1 -1
- data/lib/rubocop/options.rb +27 -41
- data/lib/rubocop/path_util.rb +1 -3
- data/lib/rubocop/rake_task.rb +3 -0
- data/lib/rubocop/remote_config.rb +4 -7
- data/lib/rubocop/result_cache.rb +5 -12
- data/lib/rubocop/rspec/cop_helper.rb +1 -1
- data/lib/rubocop/rspec/expect_offense.rb +4 -9
- data/lib/rubocop/rspec/shared_contexts.rb +4 -15
- data/lib/rubocop/runner.rb +7 -14
- data/lib/rubocop/target_finder.rb +12 -16
- data/lib/rubocop/target_ruby.rb +25 -21
- data/lib/rubocop/version.rb +1 -1
- metadata +15 -9
- data/lib/rubocop/core_ext/hash.rb +0 -20
@@ -26,6 +26,24 @@ module RuboCop
|
|
26
26
|
# public_constant :BAZ
|
27
27
|
# end
|
28
28
|
#
|
29
|
+
# @example IgnoreModules: false (default)
|
30
|
+
# # bad
|
31
|
+
# class Foo
|
32
|
+
# MyClass = Struct.new()
|
33
|
+
# end
|
34
|
+
#
|
35
|
+
# # good
|
36
|
+
# class Foo
|
37
|
+
# MyClass = Struct.new()
|
38
|
+
# public_constant :MyClass
|
39
|
+
# end
|
40
|
+
#
|
41
|
+
# @example IgnoreModules: true
|
42
|
+
# # good
|
43
|
+
# class Foo
|
44
|
+
# MyClass = Struct.new()
|
45
|
+
# end
|
46
|
+
#
|
29
47
|
class ConstantVisibility < Base
|
30
48
|
MSG = 'Explicitly make `%<constant_name>s` public or private using ' \
|
31
49
|
'either `#public_constant` or `#private_constant`.'
|
@@ -33,6 +51,7 @@ module RuboCop
|
|
33
51
|
def on_casgn(node)
|
34
52
|
return unless class_or_module_scope?(node)
|
35
53
|
return if visibility_declaration?(node)
|
54
|
+
return if ignore_modules? && module?(node)
|
36
55
|
|
37
56
|
message = message(node)
|
38
57
|
add_offense(node, message: message)
|
@@ -40,6 +59,14 @@ module RuboCop
|
|
40
59
|
|
41
60
|
private
|
42
61
|
|
62
|
+
def ignore_modules?
|
63
|
+
cop_config.fetch('IgnoreModules', false)
|
64
|
+
end
|
65
|
+
|
66
|
+
def module?(node)
|
67
|
+
node.children.last.class_constructor?
|
68
|
+
end
|
69
|
+
|
43
70
|
def message(node)
|
44
71
|
_namespace, constant_name, _value = *node
|
45
72
|
|
@@ -65,6 +92,7 @@ module RuboCop
|
|
65
92
|
end
|
66
93
|
end
|
67
94
|
|
95
|
+
# @!method visibility_declaration_for?(node, const_name)
|
68
96
|
def_node_matcher :visibility_declaration_for?, <<~PATTERN
|
69
97
|
(send nil? {:public_constant :private_constant} ({sym str} #match_name?(%1)))
|
70
98
|
PATTERN
|
@@ -19,10 +19,8 @@ module RuboCop
|
|
19
19
|
include RangeHelp
|
20
20
|
extend AutoCorrector
|
21
21
|
|
22
|
-
MSG = 'Include a copyright notice matching /%<notice>s/ before '
|
23
|
-
|
24
|
-
AUTOCORRECT_EMPTY_WARNING = 'An AutocorrectNotice must be defined in ' \
|
25
|
-
'your RuboCop config'
|
22
|
+
MSG = 'Include a copyright notice matching /%<notice>s/ before any code.'
|
23
|
+
AUTOCORRECT_EMPTY_WARNING = 'An AutocorrectNotice must be defined in your RuboCop config'
|
26
24
|
|
27
25
|
def on_new_investigation
|
28
26
|
return if notice.empty? || notice_found?(processed_source)
|
@@ -57,8 +55,7 @@ module RuboCop
|
|
57
55
|
regex = Regexp.new(notice)
|
58
56
|
return if autocorrect_notice&.match?(regex)
|
59
57
|
|
60
|
-
raise Warning, "AutocorrectNotice '#{autocorrect_notice}' must "
|
61
|
-
"match Notice /#{notice}/"
|
58
|
+
raise Warning, "AutocorrectNotice '#{autocorrect_notice}' must match Notice /#{notice}/"
|
62
59
|
end
|
63
60
|
|
64
61
|
def insert_notice_before(processed_source)
|
@@ -47,28 +47,28 @@ module RuboCop
|
|
47
47
|
CLASS_MSG = 'Prefer Time over DateTime.'
|
48
48
|
COERCION_MSG = 'Do not use #to_datetime.'
|
49
49
|
|
50
|
+
# @!method date_time?(node)
|
50
51
|
def_node_matcher :date_time?, <<~PATTERN
|
51
52
|
(send (const {nil? (cbase)} :DateTime) ...)
|
52
53
|
PATTERN
|
53
54
|
|
55
|
+
# @!method historic_date?(node)
|
54
56
|
def_node_matcher :historic_date?, <<~PATTERN
|
55
57
|
(send _ _ _ (const (const {nil? (cbase)} :Date) _))
|
56
58
|
PATTERN
|
57
59
|
|
60
|
+
# @!method to_datetime?(node)
|
58
61
|
def_node_matcher :to_datetime?, <<~PATTERN
|
59
62
|
(send _ :to_datetime)
|
60
63
|
PATTERN
|
61
64
|
|
62
65
|
def on_send(node)
|
63
|
-
return unless date_time?(node) ||
|
64
|
-
(to_datetime?(node) && disallow_coercion?)
|
66
|
+
return unless date_time?(node) || (to_datetime?(node) && disallow_coercion?)
|
65
67
|
return if historic_date?(node)
|
66
68
|
|
67
69
|
message = to_datetime?(node) ? COERCION_MSG : CLASS_MSG
|
68
70
|
|
69
|
-
add_offense(node, message: message)
|
70
|
-
autocorrect(corrector, node)
|
71
|
-
end
|
71
|
+
add_offense(node, message: message) { |corrector| autocorrect(corrector, node) }
|
72
72
|
end
|
73
73
|
|
74
74
|
private
|
@@ -36,8 +36,7 @@ module RuboCop
|
|
36
36
|
class DefWithParentheses < Base
|
37
37
|
extend AutoCorrector
|
38
38
|
|
39
|
-
MSG = "Omit the parentheses in defs when the method doesn't accept "
|
40
|
-
'any arguments.'
|
39
|
+
MSG = "Omit the parentheses in defs when the method doesn't accept any arguments."
|
41
40
|
|
42
41
|
def on_def(node)
|
43
42
|
return if node.single_line?
|
@@ -22,6 +22,7 @@ module RuboCop
|
|
22
22
|
MSG = "Use `__dir__` to get an absolute path to the current file's directory."
|
23
23
|
RESTRICT_ON_SEND = %i[expand_path dirname].freeze
|
24
24
|
|
25
|
+
# @!method dir_replacement?(node)
|
25
26
|
def_node_matcher :dir_replacement?, <<~PATTERN
|
26
27
|
{(send (const {nil? cbase} :File) :expand_path (send (const {nil? cbase} :File) :dirname #file_keyword?))
|
27
28
|
(send (const {nil? cbase} :File) :dirname (send (const {nil? cbase} :File) :realpath #file_keyword?))}
|
@@ -70,8 +70,8 @@ module RuboCop
|
|
70
70
|
end
|
71
71
|
|
72
72
|
def directive_cops(comment)
|
73
|
-
|
74
|
-
|
73
|
+
match_captures = DirectiveComment.new(comment).match_captures
|
74
|
+
match_captures && match_captures[1] ? match_captures[1].split(',').map(&:strip) : []
|
75
75
|
end
|
76
76
|
|
77
77
|
def allowed_cops
|
@@ -60,13 +60,27 @@ module RuboCop
|
|
60
60
|
# extend Foo
|
61
61
|
# end
|
62
62
|
#
|
63
|
+
# @example AllowedConstants: ['ClassMethods']
|
64
|
+
#
|
65
|
+
# # good
|
66
|
+
# module A
|
67
|
+
# module ClassMethods
|
68
|
+
# # ...
|
69
|
+
# end
|
70
|
+
# end
|
71
|
+
#
|
63
72
|
class Documentation < Base
|
64
73
|
include DocumentationComment
|
65
74
|
|
66
75
|
MSG = 'Missing top-level %<type>s documentation comment.'
|
67
76
|
|
77
|
+
# @!method constant_definition?(node)
|
68
78
|
def_node_matcher :constant_definition?, '{class module casgn}'
|
79
|
+
|
80
|
+
# @!method outer_module(node)
|
69
81
|
def_node_search :outer_module, '(const (const nil? _) _)'
|
82
|
+
|
83
|
+
# @!method constant_visibility_declaration?(node)
|
70
84
|
def_node_matcher :constant_visibility_declaration?, <<~PATTERN
|
71
85
|
(send nil? {:public_constant :private_constant} ({sym str} _))
|
72
86
|
PATTERN
|
@@ -85,14 +99,19 @@ module RuboCop
|
|
85
99
|
|
86
100
|
def check(node, body, type)
|
87
101
|
return if namespace?(body)
|
88
|
-
return if documentation_comment?(node)
|
89
|
-
return if
|
90
|
-
|
102
|
+
return if documentation_comment?(node)
|
103
|
+
return if constant_allowed?(node)
|
104
|
+
return if nodoc_self_or_outer_module?(node)
|
91
105
|
return if macro_only?(body)
|
92
106
|
|
93
107
|
add_offense(node.loc.keyword, message: format(MSG, type: type))
|
94
108
|
end
|
95
109
|
|
110
|
+
def nodoc_self_or_outer_module?(node)
|
111
|
+
nodoc_comment?(node) ||
|
112
|
+
compact_namespace?(node) && nodoc_comment?(outer_module(node).first)
|
113
|
+
end
|
114
|
+
|
96
115
|
def macro_only?(body)
|
97
116
|
body.respond_to?(:macro?) && body.macro? ||
|
98
117
|
body.respond_to?(:children) && body.children&.all? { |child| macro_only?(child) }
|
@@ -112,6 +131,10 @@ module RuboCop
|
|
112
131
|
constant_definition?(node) || constant_visibility_declaration?(node)
|
113
132
|
end
|
114
133
|
|
134
|
+
def constant_allowed?(node)
|
135
|
+
allowed_constants.include?(node.identifier.short_name)
|
136
|
+
end
|
137
|
+
|
115
138
|
def compact_namespace?(node)
|
116
139
|
/::/.match?(node.loc.name.source)
|
117
140
|
end
|
@@ -138,6 +161,10 @@ module RuboCop
|
|
138
161
|
def nodoc(node)
|
139
162
|
processed_source.ast_with_comments[node.children.first].first
|
140
163
|
end
|
164
|
+
|
165
|
+
def allowed_constants
|
166
|
+
@allowed_constants ||= cop_config.fetch('AllowedConstants', []).map(&:intern)
|
167
|
+
end
|
141
168
|
end
|
142
169
|
end
|
143
170
|
end
|
@@ -5,8 +5,8 @@ module RuboCop
|
|
5
5
|
module Style
|
6
6
|
# This cop checks for uses of double negation (`!!`) to convert something to a boolean value.
|
7
7
|
#
|
8
|
-
# When using `EnforcedStyle: allowed_in_returns`, allow double
|
9
|
-
# that use boolean as a return value. When using `EnforcedStyle: forbidden`, double
|
8
|
+
# When using `EnforcedStyle: allowed_in_returns`, allow double negation in contexts
|
9
|
+
# that use boolean as a return value. When using `EnforcedStyle: forbidden`, double negation
|
10
10
|
# should be forbidden always.
|
11
11
|
#
|
12
12
|
# @example
|
@@ -39,6 +39,7 @@ module RuboCop
|
|
39
39
|
MSG = 'Avoid the use of double negation (`!!`).'
|
40
40
|
RESTRICT_ON_SEND = %i[!].freeze
|
41
41
|
|
42
|
+
# @!method double_negative?(node)
|
42
43
|
def_node_matcher :double_negative?, '(send (send _ :!) :!)'
|
43
44
|
|
44
45
|
def on_send(node)
|
@@ -25,8 +25,7 @@ module RuboCop
|
|
25
25
|
class EachForSimpleLoop < Base
|
26
26
|
extend AutoCorrector
|
27
27
|
|
28
|
-
MSG = 'Use `Integer#times` for a simple loop which iterates a fixed '
|
29
|
-
'number of times.'
|
28
|
+
MSG = 'Use `Integer#times` for a simple loop which iterates a fixed number of times.'
|
30
29
|
|
31
30
|
def on_block(node)
|
32
31
|
return unless offending_each_range(node)
|
@@ -46,6 +45,7 @@ module RuboCop
|
|
46
45
|
|
47
46
|
private
|
48
47
|
|
48
|
+
# @!method offending_each_range(node)
|
49
49
|
def_node_matcher :offending_each_range, <<~PATTERN
|
50
50
|
(block (send (begin (${irange erange} (int $_) (int $_))) :each) (args) ...)
|
51
51
|
PATTERN
|
@@ -23,6 +23,7 @@ module RuboCop
|
|
23
23
|
MSG = 'Use `each_with_object` instead of `%<method>s`.'
|
24
24
|
METHODS = %i[inject reduce].freeze
|
25
25
|
|
26
|
+
# @!method each_with_object_candidate?(node)
|
26
27
|
def_node_matcher :each_with_object_candidate?, <<~PATTERN
|
27
28
|
(block $(send _ {:inject :reduce} _) $_ $_)
|
28
29
|
PATTERN
|
@@ -44,19 +44,14 @@ module RuboCop
|
|
44
44
|
def on_case(case_node)
|
45
45
|
return if case_node.condition
|
46
46
|
|
47
|
-
branch_bodies = [
|
48
|
-
*case_node.when_branches.map(&:body),
|
49
|
-
case_node.else_branch
|
50
|
-
].compact
|
47
|
+
branch_bodies = [*case_node.when_branches.map(&:body), case_node.else_branch].compact
|
51
48
|
|
52
49
|
return if branch_bodies.any? do |body|
|
53
50
|
body.return_type? ||
|
54
51
|
body.each_descendant.any?(&:return_type?)
|
55
52
|
end
|
56
53
|
|
57
|
-
add_offense(case_node.loc.keyword)
|
58
|
-
autocorrect(corrector, case_node)
|
59
|
-
end
|
54
|
+
add_offense(case_node.loc.keyword) { |corrector| autocorrect(corrector, case_node) }
|
60
55
|
end
|
61
56
|
|
62
57
|
private
|
@@ -123,17 +123,13 @@ module RuboCop
|
|
123
123
|
def empty_check(node)
|
124
124
|
return unless node.else? && !node.else_branch
|
125
125
|
|
126
|
-
add_offense(node.loc.else)
|
127
|
-
autocorrect(corrector, node)
|
128
|
-
end
|
126
|
+
add_offense(node.loc.else) { |corrector| autocorrect(corrector, node) }
|
129
127
|
end
|
130
128
|
|
131
129
|
def nil_check(node)
|
132
130
|
return unless node.else_branch&.nil_type?
|
133
131
|
|
134
|
-
add_offense(node.loc.else)
|
135
|
-
autocorrect(corrector, node)
|
136
|
-
end
|
132
|
+
add_offense(node.loc.else) { |corrector| autocorrect(corrector, node) }
|
137
133
|
end
|
138
134
|
|
139
135
|
def autocorrect(corrector, node)
|
@@ -154,9 +150,7 @@ module RuboCop
|
|
154
150
|
return node if node.case_type?
|
155
151
|
return node unless node.elsif?
|
156
152
|
|
157
|
-
node.each_ancestor(:if, :case, :when).find(-> { node })
|
158
|
-
parent.loc.end
|
159
|
-
end
|
153
|
+
node.each_ancestor(:if, :case, :when).find(-> { node }) { |parent| parent.loc.end }
|
160
154
|
end
|
161
155
|
|
162
156
|
def autocorrect_forbidden?(type)
|
@@ -27,11 +27,19 @@ module RuboCop
|
|
27
27
|
|
28
28
|
RESTRICT_ON_SEND = %i[new].freeze
|
29
29
|
|
30
|
+
# @!method array_node(node)
|
30
31
|
def_node_matcher :array_node, '(send (const {nil? cbase} :Array) :new)'
|
32
|
+
|
33
|
+
# @!method hash_node(node)
|
31
34
|
def_node_matcher :hash_node, '(send (const {nil? cbase} :Hash) :new)'
|
35
|
+
|
36
|
+
# @!method str_node(node)
|
32
37
|
def_node_matcher :str_node, '(send (const {nil? cbase} :String) :new)'
|
33
|
-
|
34
|
-
|
38
|
+
|
39
|
+
# @!method array_with_block(node)
|
40
|
+
def_node_matcher :array_with_block, '(block (send (const {nil? cbase} :Array) :new) args _)'
|
41
|
+
|
42
|
+
# @!method hash_with_block(node)
|
35
43
|
def_node_matcher :hash_with_block, <<~PATTERN
|
36
44
|
{
|
37
45
|
(block (send (const {nil? cbase} :Hash) :new) args _)
|
@@ -75,20 +83,17 @@ module RuboCop
|
|
75
83
|
parent = node.parent
|
76
84
|
return false unless parent && %i[send super zsuper].include?(parent.type)
|
77
85
|
|
78
|
-
node.equal?(parent.arguments.first) &&
|
79
|
-
!parentheses?(node.parent)
|
86
|
+
node.equal?(parent.arguments.first) && !parentheses?(node.parent)
|
80
87
|
end
|
81
88
|
|
82
89
|
def replacement_range(node)
|
83
|
-
if hash_node(node) &&
|
84
|
-
first_argument_unparenthesized?(node)
|
90
|
+
if hash_node(node) && first_argument_unparenthesized?(node)
|
85
91
|
# `some_method {}` is not same as `some_method Hash.new`
|
86
92
|
# because the braces are interpreted as a block. We will have
|
87
93
|
# to rewrite the arguments to wrap them in parenthesis.
|
88
94
|
args = node.parent.arguments
|
89
95
|
|
90
|
-
range_between(args[0].source_range.begin_pos - 1,
|
91
|
-
args[-1].source_range.end_pos)
|
96
|
+
range_between(args[0].source_range.begin_pos - 1, args[-1].source_range.end_pos)
|
92
97
|
else
|
93
98
|
node.source_range
|
94
99
|
end
|
@@ -45,16 +45,13 @@ module RuboCop
|
|
45
45
|
extend AutoCorrector
|
46
46
|
|
47
47
|
MSG_COMPACT = 'Put empty method definitions on a single line.'
|
48
|
-
MSG_EXPANDED = 'Put the `end` of empty method definitions on the '
|
49
|
-
'next line.'
|
48
|
+
MSG_EXPANDED = 'Put the `end` of empty method definitions on the next line.'
|
50
49
|
|
51
50
|
def on_def(node)
|
52
51
|
return if node.body || comment_lines?(node)
|
53
52
|
return if correct_style?(node)
|
54
53
|
|
55
|
-
add_offense(node)
|
56
|
-
corrector.replace(node, corrected(node))
|
57
|
-
end
|
54
|
+
add_offense(node) { |corrector| corrector.replace(node, corrected(node)) }
|
58
55
|
end
|
59
56
|
alias on_defs on_def
|
60
57
|
|
@@ -65,8 +62,7 @@ module RuboCop
|
|
65
62
|
end
|
66
63
|
|
67
64
|
def correct_style?(node)
|
68
|
-
compact_style? && compact?(node) ||
|
69
|
-
expanded_style? && expanded?(node)
|
65
|
+
compact_style? && compact?(node) || expanded_style? && expanded?(node)
|
70
66
|
end
|
71
67
|
|
72
68
|
def corrected(node)
|
@@ -15,8 +15,7 @@ module RuboCop
|
|
15
15
|
class EndBlock < Base
|
16
16
|
extend AutoCorrector
|
17
17
|
|
18
|
-
MSG = 'Avoid the use of `END` blocks. '
|
19
|
-
'Use `Kernel#at_exit` instead.'
|
18
|
+
MSG = 'Avoid the use of `END` blocks. Use `Kernel#at_exit` instead.'
|
20
19
|
|
21
20
|
def on_postexe(node)
|
22
21
|
add_offense(node.loc.keyword) do |corrector|
|
@@ -11,6 +11,7 @@ module RuboCop
|
|
11
11
|
# Other method definition types are not considered by this cop.
|
12
12
|
#
|
13
13
|
# The supported styles are:
|
14
|
+
#
|
14
15
|
# * allow_single_line (default) - only single line endless method definitions are allowed.
|
15
16
|
# * allow_always - all endless method definitions are allowed.
|
16
17
|
# * disallow - all endless method definitions are disallowed.
|
@@ -78,9 +79,7 @@ module RuboCop
|
|
78
79
|
def handle_disallow_style(node)
|
79
80
|
return unless node.endless?
|
80
81
|
|
81
|
-
add_offense(node)
|
82
|
-
correct_to_multiline(corrector, node)
|
83
|
-
end
|
82
|
+
add_offense(node) { |corrector| correct_to_multiline(corrector, node) }
|
84
83
|
end
|
85
84
|
|
86
85
|
def correct_to_multiline(corrector, node)
|
@@ -12,6 +12,11 @@ module RuboCop
|
|
12
12
|
# The cop also checks that the line number given relative to `__LINE__` is
|
13
13
|
# correct.
|
14
14
|
#
|
15
|
+
# This cop will autocorrect incorrect or missing filename and line number
|
16
|
+
# values. However, if `eval` is called without a binding argument, the cop
|
17
|
+
# will not attempt to automatically add a binding, or add filename and
|
18
|
+
# line values.
|
19
|
+
#
|
15
20
|
# @example
|
16
21
|
# # bad
|
17
22
|
# eval <<-RUBY
|
@@ -36,7 +41,21 @@ module RuboCop
|
|
36
41
|
# def do_something
|
37
42
|
# end
|
38
43
|
# RUBY
|
44
|
+
#
|
45
|
+
# This cop works only when a string literal is given as a code string.
|
46
|
+
# No offence is reported if a string variable is given as below:
|
47
|
+
#
|
48
|
+
# @example
|
49
|
+
# # not checked
|
50
|
+
# code = <<-RUBY
|
51
|
+
# def do_something
|
52
|
+
# end
|
53
|
+
# RUBY
|
54
|
+
# eval code
|
55
|
+
#
|
39
56
|
class EvalWithLocation < Base
|
57
|
+
extend AutoCorrector
|
58
|
+
|
40
59
|
MSG = 'Pass `__FILE__` and `__LINE__` to `%<method_name>s`.'
|
41
60
|
MSG_EVAL = 'Pass a binding, `__FILE__` and `__LINE__` to `eval`.'
|
42
61
|
MSG_INCORRECT_FILE = 'Incorrect file for `%<method_name>s`; ' \
|
@@ -46,10 +65,12 @@ module RuboCop
|
|
46
65
|
|
47
66
|
RESTRICT_ON_SEND = %i[eval class_eval module_eval instance_eval].freeze
|
48
67
|
|
68
|
+
# @!method valid_eval_receiver?(node)
|
49
69
|
def_node_matcher :valid_eval_receiver?, <<~PATTERN
|
50
70
|
{ nil? (const {nil? cbase} :Kernel) }
|
51
71
|
PATTERN
|
52
72
|
|
73
|
+
# @!method line_with_offset?(node, sign, num)
|
53
74
|
def_node_matcher :line_with_offset?, <<~PATTERN
|
54
75
|
{
|
55
76
|
(send #special_line_keyword? %1 (int %2))
|
@@ -66,31 +87,36 @@ module RuboCop
|
|
66
87
|
code = node.arguments.first
|
67
88
|
return unless code && (code.str_type? || code.dstr_type?)
|
68
89
|
|
90
|
+
check_location(node, code)
|
91
|
+
end
|
92
|
+
|
93
|
+
private
|
94
|
+
|
95
|
+
def check_location(node, code)
|
69
96
|
file, line = file_and_line(node)
|
70
97
|
|
71
98
|
if line
|
72
99
|
check_file(node, file)
|
73
100
|
check_line(node, code)
|
101
|
+
elsif file
|
102
|
+
check_file(node, file)
|
103
|
+
add_offense_for_missing_line(node, code)
|
74
104
|
else
|
75
|
-
|
105
|
+
add_offense_for_missing_location(node, code)
|
76
106
|
end
|
77
107
|
end
|
78
108
|
|
79
|
-
|
80
|
-
|
81
|
-
def register_offense(node)
|
109
|
+
def register_offense(node, &block)
|
82
110
|
msg = node.method?(:eval) ? MSG_EVAL : format(MSG, method_name: node.method_name)
|
83
|
-
add_offense(node, message: msg)
|
111
|
+
add_offense(node, message: msg, &block)
|
84
112
|
end
|
85
113
|
|
86
114
|
def special_file_keyword?(node)
|
87
|
-
node.str_type? &&
|
88
|
-
node.source == '__FILE__'
|
115
|
+
node.str_type? && node.source == '__FILE__'
|
89
116
|
end
|
90
117
|
|
91
118
|
def special_line_keyword?(node)
|
92
|
-
node.int_type? &&
|
93
|
-
node.source == '__LINE__'
|
119
|
+
node.int_type? && node.source == '__LINE__'
|
94
120
|
end
|
95
121
|
|
96
122
|
def file_and_line(node)
|
@@ -98,6 +124,10 @@ module RuboCop
|
|
98
124
|
[node.arguments[base], node.arguments[base + 1]]
|
99
125
|
end
|
100
126
|
|
127
|
+
def with_binding?(node)
|
128
|
+
node.method?(:eval) ? node.arguments.size >= 2 : true
|
129
|
+
end
|
130
|
+
|
101
131
|
# FIXME: It's a Style/ConditionalAssignment's false positive.
|
102
132
|
# rubocop:disable Style/ConditionalAssignment
|
103
133
|
def with_lineno?(node)
|
@@ -109,18 +139,16 @@ module RuboCop
|
|
109
139
|
end
|
110
140
|
# rubocop:enable Style/ConditionalAssignment
|
111
141
|
|
112
|
-
def
|
113
|
-
expected =
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
end
|
142
|
+
def add_offense_for_incorrect_line(method_name, line_node, sign, line_diff)
|
143
|
+
expected = expected_line(sign, line_diff)
|
144
|
+
message = format(MSG_INCORRECT_LINE,
|
145
|
+
method_name: method_name,
|
146
|
+
actual: line_node.source,
|
147
|
+
expected: expected)
|
119
148
|
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
expected: expected)
|
149
|
+
add_offense(line_node.loc.expression, message: message) do |corrector|
|
150
|
+
corrector.replace(line_node, expected)
|
151
|
+
end
|
124
152
|
end
|
125
153
|
|
126
154
|
def check_file(node, file_node)
|
@@ -131,13 +159,14 @@ module RuboCop
|
|
131
159
|
expected: '__FILE__',
|
132
160
|
actual: file_node.source)
|
133
161
|
|
134
|
-
add_offense(file_node, message: message)
|
162
|
+
add_offense(file_node, message: message) do |corrector|
|
163
|
+
corrector.replace(file_node, '__FILE__')
|
164
|
+
end
|
135
165
|
end
|
136
166
|
|
137
167
|
def check_line(node, code)
|
138
168
|
line_node = node.arguments.last
|
139
|
-
|
140
|
-
line_diff = string_first_line(code) - lineno_range.first_line
|
169
|
+
line_diff = line_difference(line_node, code)
|
141
170
|
if line_diff.zero?
|
142
171
|
add_offense_for_same_line(node, line_node)
|
143
172
|
else
|
@@ -145,6 +174,10 @@ module RuboCop
|
|
145
174
|
end
|
146
175
|
end
|
147
176
|
|
177
|
+
def line_difference(line_node, code)
|
178
|
+
string_first_line(code) - line_node.loc.expression.first_line
|
179
|
+
end
|
180
|
+
|
148
181
|
def string_first_line(str_node)
|
149
182
|
if str_node.heredoc?
|
150
183
|
str_node.loc.heredoc_body.first_line
|
@@ -156,20 +189,47 @@ module RuboCop
|
|
156
189
|
def add_offense_for_same_line(node, line_node)
|
157
190
|
return if special_line_keyword?(line_node)
|
158
191
|
|
159
|
-
|
160
|
-
line_node.loc.expression,
|
161
|
-
message: message_incorrect_line(node.method_name, line_node, nil, 0)
|
162
|
-
)
|
192
|
+
add_offense_for_incorrect_line(node.method_name, line_node, nil, 0)
|
163
193
|
end
|
164
194
|
|
165
195
|
def add_offense_for_different_line(node, line_node, line_diff)
|
166
196
|
sign = line_diff.positive? ? :+ : :-
|
167
197
|
return if line_with_offset?(line_node, sign, line_diff.abs)
|
168
198
|
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
199
|
+
add_offense_for_incorrect_line(node.method_name, line_node, sign, line_diff.abs)
|
200
|
+
end
|
201
|
+
|
202
|
+
def expected_line(sign, line_diff)
|
203
|
+
if line_diff.zero?
|
204
|
+
'__LINE__'
|
205
|
+
else
|
206
|
+
"__LINE__ #{sign} #{line_diff.abs}"
|
207
|
+
end
|
208
|
+
end
|
209
|
+
|
210
|
+
def add_offense_for_missing_line(node, code)
|
211
|
+
register_offense(node) do |corrector|
|
212
|
+
line_str = missing_line(node, code)
|
213
|
+
corrector.insert_after(node.loc.expression.end, ", #{line_str}")
|
214
|
+
end
|
215
|
+
end
|
216
|
+
|
217
|
+
def add_offense_for_missing_location(node, code)
|
218
|
+
if node.method?(:eval) && !with_binding?(node)
|
219
|
+
register_offense(node)
|
220
|
+
return
|
221
|
+
end
|
222
|
+
|
223
|
+
register_offense(node) do |corrector|
|
224
|
+
line_str = missing_line(node, code)
|
225
|
+
corrector.insert_after(node.last_argument.source_range.end, ", __FILE__, #{line_str}")
|
226
|
+
end
|
227
|
+
end
|
228
|
+
|
229
|
+
def missing_line(node, code)
|
230
|
+
line_diff = line_difference(node.arguments.last, code)
|
231
|
+
sign = line_diff.positive? ? :+ : :-
|
232
|
+
expected_line(sign, line_diff)
|
173
233
|
end
|
174
234
|
end
|
175
235
|
end
|