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
@@ -64,8 +64,7 @@ module RuboCop
|
|
64
64
|
NON_COMPLEX_TYPES = [*VARIABLE_TYPES, :const, :defined?, :yield].freeze
|
65
65
|
|
66
66
|
MSG = '%<command>s parentheses for ternary conditions.'
|
67
|
-
MSG_COMPLEX = '%<command>s parentheses for ternary expressions with'
|
68
|
-
' complex conditions.'
|
67
|
+
MSG_COMPLEX = '%<command>s parentheses for ternary expressions with complex conditions.'
|
69
68
|
|
70
69
|
def on_if(node)
|
71
70
|
return if only_closing_parenthesis_is_last_line?(node.condition)
|
@@ -88,8 +87,7 @@ module RuboCop
|
|
88
87
|
condition = node.condition
|
89
88
|
|
90
89
|
return nil if parenthesized?(condition) &&
|
91
|
-
(safe_assignment?(condition) ||
|
92
|
-
unsafe_autocorrect?(condition))
|
90
|
+
(safe_assignment?(condition) || unsafe_autocorrect?(condition))
|
93
91
|
|
94
92
|
if parenthesized?(condition)
|
95
93
|
correct_parenthesized(corrector, condition)
|
@@ -127,8 +125,7 @@ module RuboCop
|
|
127
125
|
# Anything that is not a variable, constant, or method/.method call
|
128
126
|
# will be counted as a complex expression.
|
129
127
|
def non_complex_expression?(condition)
|
130
|
-
NON_COMPLEX_TYPES.include?(condition.type) ||
|
131
|
-
non_complex_send?(condition)
|
128
|
+
NON_COMPLEX_TYPES.include?(condition.type) || non_complex_send?(condition)
|
132
129
|
end
|
133
130
|
|
134
131
|
def non_complex_send?(node)
|
@@ -191,6 +188,7 @@ module RuboCop
|
|
191
188
|
(child.send_type? && child.prefix_not?)
|
192
189
|
end
|
193
190
|
|
191
|
+
# @!method method_name(node)
|
194
192
|
def_node_matcher :method_name, <<~PATTERN
|
195
193
|
{($:defined? _ ...)
|
196
194
|
(send {_ nil?} $_ _ ...)}
|
@@ -5,6 +5,8 @@ module RuboCop
|
|
5
5
|
module Style
|
6
6
|
# This cop checks for trailing code after the method definition.
|
7
7
|
#
|
8
|
+
# NOTE: It always accepts endless method definitions that are basically on the same line.
|
9
|
+
#
|
8
10
|
# @example
|
9
11
|
# # bad
|
10
12
|
# def some_method; do_stuff
|
@@ -24,16 +26,18 @@ module RuboCop
|
|
24
26
|
# b[c: x]
|
25
27
|
# end
|
26
28
|
#
|
29
|
+
# def endless_method = do_stuff
|
30
|
+
#
|
27
31
|
class TrailingBodyOnMethodDefinition < Base
|
28
32
|
include Alignment
|
29
33
|
include TrailingBody
|
30
34
|
extend AutoCorrector
|
31
35
|
|
32
|
-
MSG = "Place the first line of a multi-line method definition's "
|
33
|
-
'body on its own line.'
|
36
|
+
MSG = "Place the first line of a multi-line method definition's body on its own line."
|
34
37
|
|
35
38
|
def on_def(node)
|
36
39
|
return unless trailing_body?(node)
|
40
|
+
return if node.endless?
|
37
41
|
|
38
42
|
add_offense(first_part_of(node.body)) do |corrector|
|
39
43
|
LineBreakCorrector.correct_trailing_body(
|
@@ -52,9 +52,7 @@ module RuboCop
|
|
52
52
|
|
53
53
|
last_comma_pos = last_comma(node).pos
|
54
54
|
|
55
|
-
add_offense(last_comma_pos)
|
56
|
-
corrector.replace(last_comma_pos, '')
|
57
|
-
end
|
55
|
+
add_offense(last_comma_pos) { |corrector| corrector.replace(last_comma_pos, '') }
|
58
56
|
end
|
59
57
|
|
60
58
|
private
|
@@ -78,9 +76,7 @@ module RuboCop
|
|
78
76
|
def argument_tokens(node)
|
79
77
|
tokens = processed_source.tokens_within(node)
|
80
78
|
pipes = tokens.select { |token| token.type == :tPIPE }
|
81
|
-
begin_pos, end_pos = pipes.map
|
82
|
-
tokens.index(pipe)
|
83
|
-
end
|
79
|
+
begin_pos, end_pos = pipes.map { |pipe| tokens.index(pipe) }
|
84
80
|
|
85
81
|
tokens[begin_pos + 1..end_pos - 1]
|
86
82
|
end
|
@@ -36,11 +36,10 @@ module RuboCop
|
|
36
36
|
class TrailingMethodEndStatement < Base
|
37
37
|
extend AutoCorrector
|
38
38
|
|
39
|
-
MSG = 'Place the end statement of a multi-line method on '
|
40
|
-
'its own line.'
|
39
|
+
MSG = 'Place the end statement of a multi-line method on its own line.'
|
41
40
|
|
42
41
|
def on_def(node)
|
43
|
-
return
|
42
|
+
return if node.endless? || !trailing_end?(node)
|
44
43
|
|
45
44
|
add_offense(node.loc.end) do |corrector|
|
46
45
|
corrector.insert_before(
|
@@ -53,9 +52,7 @@ module RuboCop
|
|
53
52
|
private
|
54
53
|
|
55
54
|
def trailing_end?(node)
|
56
|
-
node.body &&
|
57
|
-
node.multiline? &&
|
58
|
-
body_and_end_on_same_line?(node)
|
55
|
+
node.body && node.multiline? && body_and_end_on_same_line?(node)
|
59
56
|
end
|
60
57
|
|
61
58
|
def body_and_end_on_same_line?(node)
|
@@ -33,8 +33,7 @@ module RuboCop
|
|
33
33
|
include RangeHelp
|
34
34
|
extend AutoCorrector
|
35
35
|
|
36
|
-
MSG = 'Do not use trailing `_`s in parallel assignment. '
|
37
|
-
'Prefer `%<code>s`.'
|
36
|
+
MSG = 'Do not use trailing `_`s in parallel assignment. Prefer `%<code>s`.'
|
38
37
|
UNDERSCORE = '_'
|
39
38
|
DISALLOW = %i[lvasgn splat].freeze
|
40
39
|
private_constant :DISALLOW
|
@@ -91,8 +90,7 @@ module RuboCop
|
|
91
90
|
end
|
92
91
|
|
93
92
|
def allow_named_underscore_variables
|
94
|
-
@allow_named_underscore_variables ||=
|
95
|
-
cop_config['AllowNamedUnderscoreVariables']
|
93
|
+
@allow_named_underscore_variables ||= cop_config['AllowNamedUnderscoreVariables']
|
96
94
|
end
|
97
95
|
|
98
96
|
def unneeded_ranges(node)
|
@@ -121,8 +119,7 @@ module RuboCop
|
|
121
119
|
|
122
120
|
return range_for_parentheses(first_offense, mlhs_node) if Util.parentheses?(mlhs_node)
|
123
121
|
|
124
|
-
range_between(first_offense.source_range.begin_pos,
|
125
|
-
node.loc.operator.begin_pos)
|
122
|
+
range_between(first_offense.source_range.begin_pos, node.loc.operator.begin_pos)
|
126
123
|
end
|
127
124
|
|
128
125
|
def children_offenses(variables)
|
@@ -147,10 +144,7 @@ module RuboCop
|
|
147
144
|
end
|
148
145
|
|
149
146
|
def range_for_parentheses(offense, left)
|
150
|
-
range_between(
|
151
|
-
offense.source_range.begin_pos - 1,
|
152
|
-
left.loc.expression.end_pos - 1
|
153
|
-
)
|
147
|
+
range_between(offense.source_range.begin_pos - 1, left.loc.expression.end_pos - 1)
|
154
148
|
end
|
155
149
|
end
|
156
150
|
end
|
@@ -107,8 +107,7 @@ module RuboCop
|
|
107
107
|
end
|
108
108
|
|
109
109
|
def trivial_reader?(node)
|
110
|
-
looks_like_trivial_reader?(node) &&
|
111
|
-
!allowed_method_name?(node) && !allowed_reader?(node)
|
110
|
+
looks_like_trivial_reader?(node) && !allowed_method_name?(node) && !allowed_reader?(node)
|
112
111
|
end
|
113
112
|
|
114
113
|
def looks_like_trivial_reader?(node)
|
@@ -120,6 +119,7 @@ module RuboCop
|
|
120
119
|
!allowed_method_name?(node) && !allowed_writer?(node.method_name)
|
121
120
|
end
|
122
121
|
|
122
|
+
# @!method looks_like_trivial_writer?(node)
|
123
123
|
def_node_matcher :looks_like_trivial_writer?, <<~PATTERN
|
124
124
|
{(def _ (args (arg ...)) (ivasgn _ (lvar _)))
|
125
125
|
(defs _ _ (args (arg ...)) (ivasgn _ (lvar _)))}
|
@@ -145,8 +145,7 @@ module RuboCop
|
|
145
145
|
end
|
146
146
|
|
147
147
|
def trivial_accessor_kind(node)
|
148
|
-
if trivial_writer?(node) &&
|
149
|
-
!dsl_writer?(node.method_name)
|
148
|
+
if trivial_writer?(node) && !dsl_writer?(node.method_name)
|
150
149
|
'writer'
|
151
150
|
elsif trivial_reader?(node)
|
152
151
|
'reader'
|
@@ -23,8 +23,7 @@ module RuboCop
|
|
23
23
|
include RangeHelp
|
24
24
|
extend AutoCorrector
|
25
25
|
|
26
|
-
MSG = 'Do not use `unless` with `else`. Rewrite these with the '
|
27
|
-
'positive case first.'
|
26
|
+
MSG = 'Do not use `unless` with `else`. Rewrite these with the positive case first.'
|
28
27
|
|
29
28
|
def on_if(node)
|
30
29
|
return unless node.unless? && node.else?
|
@@ -0,0 +1,105 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RuboCop
|
4
|
+
module Cop
|
5
|
+
module Style
|
6
|
+
# This cop checks for the use of logical operators in an `unless` condition.
|
7
|
+
# It discourages such code, as the condition becomes more difficult
|
8
|
+
# to read and understand.
|
9
|
+
#
|
10
|
+
# This cop supports two styles:
|
11
|
+
# - `forbid_mixed_logical_operators` (default)
|
12
|
+
# - `forbid_logical_operators`
|
13
|
+
#
|
14
|
+
# `forbid_mixed_logical_operators` style forbids the use of more than one type
|
15
|
+
# of logical operators. This makes the `unless` condition easier to read
|
16
|
+
# because either all conditions need to be met or any condition need to be met
|
17
|
+
# in order for the expression to be truthy or falsey.
|
18
|
+
#
|
19
|
+
# `forbid_logical_operators` style forbids any use of logical operator.
|
20
|
+
# This makes it even more easy to read the `unless` condition as
|
21
|
+
# there is only one condition in the expression.
|
22
|
+
#
|
23
|
+
# @example EnforcedStyle: forbid_mixed_logical_operators (default)
|
24
|
+
# # bad
|
25
|
+
# return unless a || b && c
|
26
|
+
# return unless a && b || c
|
27
|
+
# return unless a && b and c
|
28
|
+
# return unless a || b or c
|
29
|
+
# return unless a && b or c
|
30
|
+
# return unless a || b and c
|
31
|
+
#
|
32
|
+
# # good
|
33
|
+
# return unless a && b && c
|
34
|
+
# return unless a || b || c
|
35
|
+
# return unless a and b and c
|
36
|
+
# return unless a or b or c
|
37
|
+
# return unless a?
|
38
|
+
#
|
39
|
+
# @example EnforcedStyle: forbid_logical_operators
|
40
|
+
# # bad
|
41
|
+
# return unless a || b
|
42
|
+
# return unless a && b
|
43
|
+
# return unless a or b
|
44
|
+
# return unless a and b
|
45
|
+
#
|
46
|
+
# # good
|
47
|
+
# return unless a
|
48
|
+
# return unless a?
|
49
|
+
class UnlessLogicalOperators < Base
|
50
|
+
include ConfigurableEnforcedStyle
|
51
|
+
|
52
|
+
FORBID_MIXED_LOGICAL_OPERATORS = 'Do not use mixed logical operators in an `unless`.'
|
53
|
+
FORBID_LOGICAL_OPERATORS = 'Do not use any logical operator in an `unless`.'
|
54
|
+
|
55
|
+
# @!method or_with_and?(node)
|
56
|
+
def_node_matcher :or_with_and?, <<~PATTERN
|
57
|
+
(if (or <`and ...> ) ...)
|
58
|
+
PATTERN
|
59
|
+
|
60
|
+
# @!method and_with_or?(node)
|
61
|
+
def_node_matcher :and_with_or?, <<~PATTERN
|
62
|
+
(if (and <`or ...> ) ...)
|
63
|
+
PATTERN
|
64
|
+
|
65
|
+
# @!method logical_operator?(node)
|
66
|
+
def_node_matcher :logical_operator?, <<~PATTERN
|
67
|
+
(if ({and or} ... ) ...)
|
68
|
+
PATTERN
|
69
|
+
|
70
|
+
def on_if(node)
|
71
|
+
return unless node.unless?
|
72
|
+
|
73
|
+
if style == :forbid_mixed_logical_operators && mixed_logical_operator?(node)
|
74
|
+
add_offense(node, message: FORBID_MIXED_LOGICAL_OPERATORS)
|
75
|
+
elsif style == :forbid_logical_operators && logical_operator?(node)
|
76
|
+
add_offense(node, message: FORBID_LOGICAL_OPERATORS)
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
private
|
81
|
+
|
82
|
+
def mixed_logical_operator?(node)
|
83
|
+
or_with_and?(node) ||
|
84
|
+
and_with_or?(node) ||
|
85
|
+
mixed_precedence_and?(node) ||
|
86
|
+
mixed_precedence_or?(node)
|
87
|
+
end
|
88
|
+
|
89
|
+
def mixed_precedence_and?(node)
|
90
|
+
and_sources = node.condition.each_descendant(:and).map(&:operator)
|
91
|
+
and_sources << node.condition.operator if node.condition.and_type?
|
92
|
+
|
93
|
+
!(and_sources.all?('&&') || and_sources.all?('and'))
|
94
|
+
end
|
95
|
+
|
96
|
+
def mixed_precedence_or?(node)
|
97
|
+
or_sources = node.condition.each_descendant(:or).map(&:operator)
|
98
|
+
or_sources << node.condition.operator if node.condition.or_type?
|
99
|
+
|
100
|
+
!(or_sources.all?('||') || or_sources.all?('or'))
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
105
|
+
end
|
@@ -24,6 +24,7 @@ module RuboCop
|
|
24
24
|
'`%<receiver>s.unpack(%<format>s)%<method>s`.'
|
25
25
|
RESTRICT_ON_SEND = %i[first [] slice at].freeze
|
26
26
|
|
27
|
+
# @!method unpack_and_first_element?(node)
|
27
28
|
def_node_matcher :unpack_and_first_element?, <<~PATTERN
|
28
29
|
{
|
29
30
|
(send $(send (...) :unpack $(...)) :first)
|
@@ -20,7 +20,7 @@ module RuboCop
|
|
20
20
|
extend AutoCorrector
|
21
21
|
|
22
22
|
MSG = 'Replace interpolated variable `%<variable>s` ' \
|
23
|
-
'with expression `#{%<variable>s}`.'
|
23
|
+
'with expression `#{%<variable>s}`.' # rubocop:disable Lint/InterpolationCheck
|
24
24
|
|
25
25
|
def on_node_with_interpolations(node)
|
26
26
|
var_nodes(node.children).each do |var_node|
|
@@ -25,9 +25,7 @@ module RuboCop
|
|
25
25
|
def on_when(node)
|
26
26
|
return if node.multiline? || node.then? || !node.body
|
27
27
|
|
28
|
-
add_offense(node.loc.begin)
|
29
|
-
corrector.replace(node.loc.begin, ' then')
|
30
|
-
end
|
28
|
+
add_offense(node.loc.begin) { |corrector| corrector.replace(node.loc.begin, ' then') }
|
31
29
|
end
|
32
30
|
end
|
33
31
|
end
|
@@ -37,8 +37,7 @@ module RuboCop
|
|
37
37
|
include StatementModifier
|
38
38
|
extend AutoCorrector
|
39
39
|
|
40
|
-
MSG = 'Favor modifier `%<keyword>s` usage when '
|
41
|
-
'having a single-line body.'
|
40
|
+
MSG = 'Favor modifier `%<keyword>s` usage when having a single-line body.'
|
42
41
|
|
43
42
|
def on_while(node)
|
44
43
|
return unless single_line_as_modifier?(node)
|
@@ -56,8 +56,7 @@ module RuboCop
|
|
56
56
|
def complex_content?(strings)
|
57
57
|
strings.any? do |s|
|
58
58
|
string = s.str_content.dup.force_encoding(::Encoding::UTF_8)
|
59
|
-
!string.valid_encoding? ||
|
60
|
-
!word_regex.match?(string) || / /.match?(string)
|
59
|
+
!string.valid_encoding? || !word_regex.match?(string) || / /.match?(string)
|
61
60
|
end
|
62
61
|
end
|
63
62
|
|
@@ -59,12 +59,7 @@ module RuboCop
|
|
59
59
|
|
60
60
|
MSG = 'Reverse the order of the operands `%<source>s`.'
|
61
61
|
|
62
|
-
REVERSE_COMPARISON = {
|
63
|
-
'<' => '>',
|
64
|
-
'<=' => '>=',
|
65
|
-
'>' => '<',
|
66
|
-
'>=' => '<='
|
67
|
-
}.freeze
|
62
|
+
REVERSE_COMPARISON = { '<' => '>', '<=' => '>=', '>' => '<', '>=' => '<=' }.freeze
|
68
63
|
|
69
64
|
EQUALITY_OPERATORS = %i[== !=].freeze
|
70
65
|
|
@@ -72,6 +67,7 @@ module RuboCop
|
|
72
67
|
|
73
68
|
PROGRAM_NAMES = %i[$0 $PROGRAM_NAME].freeze
|
74
69
|
|
70
|
+
# @!method file_constant_equal_program_name?(node)
|
75
71
|
def_node_matcher :file_constant_equal_program_name?, <<~PATTERN
|
76
72
|
(send #source_file_path_constant? {:== :!=} (gvar #program_name?))
|
77
73
|
PATTERN
|
@@ -99,8 +95,7 @@ module RuboCop
|
|
99
95
|
end
|
100
96
|
|
101
97
|
def yoda_compatible_condition?(node)
|
102
|
-
node.comparison_method? &&
|
103
|
-
!noncommutative_operator?(node)
|
98
|
+
node.comparison_method? && !noncommutative_operator?(node)
|
104
99
|
end
|
105
100
|
|
106
101
|
def valid_yoda?(node)
|
@@ -126,9 +121,7 @@ module RuboCop
|
|
126
121
|
end
|
127
122
|
|
128
123
|
def actual_code_range(node)
|
129
|
-
range_between(
|
130
|
-
node.loc.expression.begin_pos, node.loc.expression.end_pos
|
131
|
-
)
|
124
|
+
range_between(node.loc.expression.begin_pos, node.loc.expression.end_pos)
|
132
125
|
end
|
133
126
|
|
134
127
|
def reverse_comparison(operator)
|
@@ -29,8 +29,7 @@ module RuboCop
|
|
29
29
|
extend AutoCorrector
|
30
30
|
|
31
31
|
ZERO_MSG = 'Use `empty?` instead of `%<lhs>s %<opr>s %<rhs>s`.'
|
32
|
-
NONZERO_MSG = 'Use `!empty?` instead of '
|
33
|
-
'`%<lhs>s %<opr>s %<rhs>s`.'
|
32
|
+
NONZERO_MSG = 'Use `!empty?` instead of `%<lhs>s %<opr>s %<rhs>s`.'
|
34
33
|
|
35
34
|
RESTRICT_ON_SEND = %i[size length].freeze
|
36
35
|
|
@@ -71,6 +70,7 @@ module RuboCop
|
|
71
70
|
end
|
72
71
|
end
|
73
72
|
|
73
|
+
# @!method zero_length_predicate(node)
|
74
74
|
def_node_matcher :zero_length_predicate, <<~PATTERN
|
75
75
|
{(send (send (...) ${:length :size}) $:== (int $0))
|
76
76
|
(send (int $0) $:== (send (...) ${:length :size}))
|
@@ -78,6 +78,7 @@ module RuboCop
|
|
78
78
|
(send (int $1) $:> (send (...) ${:length :size}))}
|
79
79
|
PATTERN
|
80
80
|
|
81
|
+
# @!method nonzero_length_predicate(node)
|
81
82
|
def_node_matcher :nonzero_length_predicate, <<~PATTERN
|
82
83
|
{(send (send (...) ${:length :size}) ${:> :!=} (int $0))
|
83
84
|
(send (int $0) ${:< :!=} (send (...) ${:length :size}))}
|
@@ -90,6 +91,7 @@ module RuboCop
|
|
90
91
|
"!#{other_receiver(node).source}.empty?"
|
91
92
|
end
|
92
93
|
|
94
|
+
# @!method zero_length_receiver(node)
|
93
95
|
def_node_matcher :zero_length_receiver, <<~PATTERN
|
94
96
|
{(send (send $_ _) :== (int 0))
|
95
97
|
(send (int 0) :== (send $_ _))
|
@@ -97,6 +99,7 @@ module RuboCop
|
|
97
99
|
(send (int 1) :> (send $_ _))}
|
98
100
|
PATTERN
|
99
101
|
|
102
|
+
# @!method other_receiver(node)
|
100
103
|
def_node_matcher :other_receiver, <<~PATTERN
|
101
104
|
{(send (send $_ _) _ _)
|
102
105
|
(send _ _ (send $_ _))}
|
@@ -105,6 +108,7 @@ module RuboCop
|
|
105
108
|
# Some collection like objects in the Ruby standard library
|
106
109
|
# implement `#size`, but not `#empty`. We ignore those to
|
107
110
|
# reduce false positives.
|
111
|
+
# @!method non_polymorphic_collection?(node)
|
108
112
|
def_node_matcher :non_polymorphic_collection?, <<~PATTERN
|
109
113
|
{(send (send (send (const {nil? cbase} :File) :stat _) ...) ...)
|
110
114
|
(send (send (send (const {nil? cbase} {:Tempfile :StringIO}) {:new :open} ...) ...) ...)}
|