rubocop 0.89.0 → 0.92.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +2 -2
- data/config/default.yml +128 -14
- data/lib/rubocop.rb +30 -4
- data/lib/rubocop/cached_data.rb +1 -0
- data/lib/rubocop/cli/command.rb +1 -0
- data/lib/rubocop/cli/command/auto_genenerate_config.rb +1 -0
- data/lib/rubocop/cli/command/base.rb +1 -0
- data/lib/rubocop/cli/command/execute_runner.rb +9 -0
- data/lib/rubocop/cli/command/init_dotfile.rb +1 -0
- data/lib/rubocop/cli/command/show_cops.rb +2 -1
- data/lib/rubocop/cli/command/version.rb +1 -0
- data/lib/rubocop/cli/environment.rb +1 -0
- data/lib/rubocop/comment_config.rb +17 -10
- data/lib/rubocop/config.rb +1 -1
- data/lib/rubocop/config_loader.rb +21 -10
- data/lib/rubocop/config_loader_resolver.rb +1 -0
- data/lib/rubocop/config_obsoletion.rb +1 -0
- data/lib/rubocop/config_regeneration.rb +33 -0
- data/lib/rubocop/config_store.rb +3 -3
- data/lib/rubocop/config_validator.rb +4 -1
- data/lib/rubocop/cop/base.rb +23 -0
- data/lib/rubocop/cop/bundler/duplicated_gem.rb +5 -1
- data/lib/rubocop/cop/bundler/gem_comment.rb +8 -3
- data/lib/rubocop/cop/bundler/insecure_protocol_source.rb +2 -0
- data/lib/rubocop/cop/commissioner.rb +47 -7
- data/lib/rubocop/cop/correctors/alignment_corrector.rb +4 -4
- data/lib/rubocop/cop/correctors/condition_corrector.rb +3 -5
- data/lib/rubocop/cop/correctors/empty_line_corrector.rb +9 -10
- data/lib/rubocop/cop/correctors/line_break_corrector.rb +4 -4
- data/lib/rubocop/cop/correctors/multiline_literal_brace_corrector.rb +8 -3
- data/lib/rubocop/cop/correctors/parentheses_corrector.rb +5 -8
- data/lib/rubocop/cop/correctors/percent_literal_corrector.rb +5 -10
- data/lib/rubocop/cop/correctors/punctuation_corrector.rb +8 -10
- data/lib/rubocop/cop/documentation.rb +22 -0
- data/lib/rubocop/cop/generator.rb +2 -1
- data/lib/rubocop/cop/internal_affairs/method_name_equal.rb +1 -0
- data/lib/rubocop/cop/internal_affairs/node_type_predicate.rb +1 -0
- data/lib/rubocop/cop/internal_affairs/offense_location_keyword.rb +1 -0
- data/lib/rubocop/cop/internal_affairs/redundant_location_argument.rb +1 -0
- data/lib/rubocop/cop/internal_affairs/redundant_message_argument.rb +1 -0
- data/lib/rubocop/cop/layout/array_alignment.rb +1 -0
- data/lib/rubocop/cop/layout/begin_end_alignment.rb +77 -0
- data/lib/rubocop/cop/layout/block_alignment.rb +23 -19
- data/lib/rubocop/cop/layout/case_indentation.rb +4 -7
- data/lib/rubocop/cop/layout/class_structure.rb +14 -17
- data/lib/rubocop/cop/layout/closing_heredoc_indentation.rb +4 -6
- data/lib/rubocop/cop/layout/comment_indentation.rb +1 -1
- data/lib/rubocop/cop/layout/condition_position.rb +13 -15
- data/lib/rubocop/cop/layout/def_end_alignment.rb +8 -5
- data/lib/rubocop/cop/layout/dot_position.rb +21 -17
- data/lib/rubocop/cop/layout/empty_comment.rb +30 -23
- data/lib/rubocop/cop/layout/empty_line_after_guard_clause.rb +21 -18
- data/lib/rubocop/cop/layout/empty_line_after_magic_comment.rb +13 -13
- data/lib/rubocop/cop/layout/empty_line_after_multiline_condition.rb +136 -0
- data/lib/rubocop/cop/layout/empty_line_between_defs.rb +21 -23
- data/lib/rubocop/cop/layout/empty_lines.rb +6 -7
- data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +18 -14
- data/lib/rubocop/cop/layout/empty_lines_around_arguments.rb +7 -8
- data/lib/rubocop/cop/layout/empty_lines_around_attribute_accessor.rb +4 -7
- data/lib/rubocop/cop/layout/empty_lines_around_begin_body.rb +2 -5
- data/lib/rubocop/cop/layout/empty_lines_around_block_body.rb +2 -5
- data/lib/rubocop/cop/layout/empty_lines_around_class_body.rb +2 -5
- data/lib/rubocop/cop/layout/empty_lines_around_exception_handling_keywords.rb +3 -7
- data/lib/rubocop/cop/layout/empty_lines_around_method_body.rb +2 -5
- data/lib/rubocop/cop/layout/empty_lines_around_module_body.rb +2 -5
- data/lib/rubocop/cop/layout/end_alignment.rb +11 -17
- data/lib/rubocop/cop/layout/extra_spacing.rb +14 -21
- data/lib/rubocop/cop/layout/first_array_element_line_break.rb +2 -5
- data/lib/rubocop/cop/layout/first_hash_element_line_break.rb +2 -5
- data/lib/rubocop/cop/layout/first_method_argument_line_break.rb +4 -8
- data/lib/rubocop/cop/layout/first_method_parameter_line_break.rb +2 -5
- data/lib/rubocop/cop/layout/hash_alignment.rb +17 -20
- data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +15 -14
- data/lib/rubocop/cop/layout/heredoc_indentation.rb +14 -11
- data/lib/rubocop/cop/layout/initial_indentation.rb +6 -7
- data/lib/rubocop/cop/layout/leading_comment_space.rb +12 -10
- data/lib/rubocop/cop/layout/leading_empty_lines.rb +6 -11
- data/lib/rubocop/cop/layout/multiline_array_brace_layout.rb +2 -5
- data/lib/rubocop/cop/layout/multiline_array_line_breaks.rb +2 -5
- data/lib/rubocop/cop/layout/multiline_assignment_layout.rb +10 -14
- data/lib/rubocop/cop/layout/multiline_block_layout.rb +21 -19
- data/lib/rubocop/cop/layout/multiline_hash_brace_layout.rb +2 -5
- data/lib/rubocop/cop/layout/multiline_hash_key_line_breaks.rb +2 -5
- data/lib/rubocop/cop/layout/multiline_method_argument_line_breaks.rb +5 -9
- data/lib/rubocop/cop/layout/multiline_method_call_brace_layout.rb +2 -5
- data/lib/rubocop/cop/layout/multiline_method_definition_brace_layout.rb +2 -5
- data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +41 -22
- data/lib/rubocop/cop/layout/space_after_colon.rb +11 -7
- data/lib/rubocop/cop/layout/space_after_comma.rb +2 -5
- data/lib/rubocop/cop/layout/space_after_method_name.rb +5 -6
- data/lib/rubocop/cop/layout/space_after_not.rb +9 -11
- data/lib/rubocop/cop/layout/space_after_semicolon.rb +2 -5
- data/lib/rubocop/cop/layout/space_around_equals_in_parameter_default.rb +22 -17
- data/lib/rubocop/cop/layout/space_around_keyword.rb +17 -18
- data/lib/rubocop/cop/layout/space_around_operators.rb +17 -16
- data/lib/rubocop/cop/layout/space_before_block_braces.rb +23 -22
- data/lib/rubocop/cop/layout/space_before_comma.rb +3 -5
- data/lib/rubocop/cop/layout/space_before_comment.rb +10 -7
- data/lib/rubocop/cop/layout/space_before_first_arg.rb +7 -7
- data/lib/rubocop/cop/layout/space_before_semicolon.rb +2 -5
- data/lib/rubocop/cop/layout/space_in_lambda_literal.rb +9 -17
- data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +20 -23
- data/lib/rubocop/cop/layout/space_inside_array_percent_literal.rb +3 -8
- data/lib/rubocop/cop/layout/space_inside_block_braces.rb +17 -16
- data/lib/rubocop/cop/layout/space_inside_hash_literal_braces.rb +19 -37
- data/lib/rubocop/cop/layout/space_inside_parens.rb +9 -14
- data/lib/rubocop/cop/layout/space_inside_percent_literal_delimiters.rb +5 -10
- data/lib/rubocop/cop/layout/space_inside_range_literal.rb +8 -17
- data/lib/rubocop/cop/layout/space_inside_reference_brackets.rb +16 -24
- data/lib/rubocop/cop/layout/space_inside_string_interpolation.rb +12 -13
- data/lib/rubocop/cop/layout/trailing_empty_lines.rb +10 -15
- data/lib/rubocop/cop/layout/trailing_whitespace.rb +11 -11
- data/lib/rubocop/cop/lint/ambiguous_operator.rb +2 -0
- data/lib/rubocop/cop/lint/big_decimal_new.rb +1 -2
- data/lib/rubocop/cop/lint/binary_operator_with_identical_operands.rb +2 -1
- data/lib/rubocop/cop/lint/constant_definition_in_block.rb +74 -0
- data/lib/rubocop/cop/lint/constant_resolution.rb +1 -1
- data/lib/rubocop/cop/lint/debugger.rb +2 -3
- data/lib/rubocop/cop/lint/deprecated_class_methods.rb +1 -3
- data/lib/rubocop/cop/lint/duplicate_methods.rb +2 -4
- data/lib/rubocop/cop/lint/duplicate_require.rb +46 -0
- data/lib/rubocop/cop/lint/duplicate_rescue_exception.rb +2 -15
- data/lib/rubocop/cop/lint/each_with_object_argument.rb +1 -0
- data/lib/rubocop/cop/lint/empty_file.rb +50 -0
- data/lib/rubocop/cop/lint/erb_new_arguments.rb +2 -0
- data/lib/rubocop/cop/lint/float_comparison.rb +2 -2
- data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +2 -2
- data/lib/rubocop/cop/lint/identity_comparison.rb +51 -0
- data/lib/rubocop/cop/lint/ineffective_access_modifier.rb +2 -5
- data/lib/rubocop/cop/lint/inherit_exception.rb +2 -2
- data/lib/rubocop/cop/lint/missing_super.rb +11 -11
- data/lib/rubocop/cop/lint/mixed_regexp_capture_types.rb +2 -35
- data/lib/rubocop/cop/lint/multiple_comparison.rb +3 -1
- data/lib/rubocop/cop/lint/number_conversion.rb +1 -0
- data/lib/rubocop/cop/lint/out_of_range_regexp_ref.rb +33 -15
- data/lib/rubocop/cop/lint/percent_string_array.rb +8 -12
- data/lib/rubocop/cop/lint/raise_exception.rb +1 -0
- data/lib/rubocop/cop/lint/rand_one.rb +2 -1
- data/lib/rubocop/cop/lint/redundant_cop_disable_directive.rb +36 -29
- data/lib/rubocop/cop/lint/redundant_cop_enable_directive.rb +14 -4
- data/lib/rubocop/cop/lint/redundant_require_statement.rb +1 -0
- data/lib/rubocop/cop/lint/rescue_type.rb +0 -1
- data/lib/rubocop/cop/lint/send_with_mixin_argument.rb +3 -1
- data/lib/rubocop/cop/lint/shadowed_exception.rb +6 -6
- data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +4 -4
- data/lib/rubocop/cop/lint/struct_new_override.rb +1 -0
- data/lib/rubocop/cop/lint/to_json.rb +16 -5
- data/lib/rubocop/cop/lint/top_level_return_with_argument.rb +1 -1
- data/lib/rubocop/cop/lint/trailing_comma_in_attribute_declaration.rb +57 -0
- data/lib/rubocop/cop/lint/unreachable_loop.rb +3 -6
- data/lib/rubocop/cop/lint/uri_escape_unescape.rb +3 -1
- data/lib/rubocop/cop/lint/uri_regexp.rb +10 -25
- data/lib/rubocop/cop/lint/useless_access_modifier.rb +3 -9
- data/lib/rubocop/cop/lint/useless_method_definition.rb +70 -0
- data/lib/rubocop/cop/lint/useless_times.rb +106 -0
- data/lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +27 -16
- data/lib/rubocop/cop/metrics/utils/code_length_calculator.rb +1 -0
- data/lib/rubocop/cop/migration/department_name.rb +2 -2
- data/lib/rubocop/cop/mixin/alignment.rb +5 -1
- data/lib/rubocop/cop/mixin/allowed_methods.rb +2 -0
- data/lib/rubocop/cop/mixin/annotation_comment.rb +5 -0
- data/lib/rubocop/cop/mixin/check_line_breakable.rb +17 -8
- data/lib/rubocop/cop/mixin/comments_help.rb +48 -0
- data/lib/rubocop/cop/mixin/configurable_naming.rb +2 -2
- data/lib/rubocop/cop/mixin/configurable_numbering.rb +3 -3
- data/lib/rubocop/cop/mixin/empty_lines_around_body.rb +8 -7
- data/lib/rubocop/cop/mixin/empty_parameter.rb +3 -1
- data/lib/rubocop/cop/mixin/end_keyword_alignment.rb +12 -1
- data/lib/rubocop/cop/mixin/enforce_superclass.rb +0 -2
- data/lib/rubocop/cop/mixin/first_element_line_break.rb +3 -1
- data/lib/rubocop/cop/mixin/hash_transform_method.rb +31 -12
- data/lib/rubocop/cop/mixin/line_length_help.rb +1 -3
- data/lib/rubocop/cop/mixin/multiline_element_line_breaks.rb +3 -1
- data/lib/rubocop/cop/mixin/multiline_literal_brace_layout.rb +13 -12
- data/lib/rubocop/cop/mixin/negative_conditional.rb +2 -2
- data/lib/rubocop/cop/mixin/percent_array.rb +16 -9
- data/lib/rubocop/cop/mixin/range_help.rb +18 -4
- data/lib/rubocop/cop/mixin/regexp_literal_help.rb +1 -1
- data/lib/rubocop/cop/mixin/rescue_node.rb +11 -1
- data/lib/rubocop/cop/mixin/space_after_punctuation.rb +4 -3
- data/lib/rubocop/cop/mixin/space_before_punctuation.rb +4 -3
- data/lib/rubocop/cop/mixin/statement_modifier.rb +12 -6
- data/lib/rubocop/cop/mixin/surrounding_space.rb +8 -4
- data/lib/rubocop/cop/mixin/trailing_comma.rb +9 -11
- data/lib/rubocop/cop/mixin/visibility_help.rb +4 -16
- data/lib/rubocop/cop/naming/binary_operator_parameter_name.rb +1 -1
- data/lib/rubocop/cop/naming/file_name.rb +1 -1
- data/lib/rubocop/cop/offense.rb +1 -0
- data/lib/rubocop/cop/security/eval.rb +1 -0
- data/lib/rubocop/cop/security/json_load.rb +1 -0
- data/lib/rubocop/cop/security/marshal_load.rb +1 -0
- data/lib/rubocop/cop/security/open.rb +1 -0
- data/lib/rubocop/cop/security/yaml_load.rb +1 -0
- data/lib/rubocop/cop/severity.rb +0 -8
- data/lib/rubocop/cop/style/access_modifier_declarations.rb +8 -19
- data/lib/rubocop/cop/style/accessor_grouping.rb +20 -20
- data/lib/rubocop/cop/style/alias.rb +36 -33
- data/lib/rubocop/cop/style/and_or.rb +9 -11
- data/lib/rubocop/cop/style/array_coercion.rb +4 -0
- data/lib/rubocop/cop/style/array_join.rb +7 -8
- data/lib/rubocop/cop/style/ascii_comments.rb +4 -4
- data/lib/rubocop/cop/style/attr.rb +12 -9
- data/lib/rubocop/cop/style/auto_resource_cleanup.rb +4 -5
- data/lib/rubocop/cop/style/bare_percent_literals.rb +10 -12
- data/lib/rubocop/cop/style/begin_block.rb +2 -2
- data/lib/rubocop/cop/style/bisected_attr_accessor.rb +9 -12
- data/lib/rubocop/cop/style/block_comments.rb +14 -18
- data/lib/rubocop/cop/style/block_delimiters.rb +23 -23
- data/lib/rubocop/cop/style/case_equality.rb +11 -3
- data/lib/rubocop/cop/style/case_like_if.rb +37 -18
- data/lib/rubocop/cop/style/class_and_module_children.rb +16 -11
- data/lib/rubocop/cop/style/class_check.rb +6 -11
- data/lib/rubocop/cop/style/class_methods.rb +7 -11
- data/lib/rubocop/cop/style/class_methods_definitions.rb +157 -0
- data/lib/rubocop/cop/style/class_vars.rb +7 -12
- data/lib/rubocop/cop/style/collection_methods.rb +11 -17
- data/lib/rubocop/cop/style/colon_method_call.rb +6 -7
- data/lib/rubocop/cop/style/colon_method_definition.rb +6 -6
- data/lib/rubocop/cop/style/combinable_loops.rb +84 -0
- data/lib/rubocop/cop/style/command_literal.rb +23 -24
- data/lib/rubocop/cop/style/comment_annotation.rb +15 -15
- data/lib/rubocop/cop/style/commented_keyword.rb +8 -9
- data/lib/rubocop/cop/style/conditional_assignment.rb +50 -61
- data/lib/rubocop/cop/style/constant_visibility.rb +3 -2
- data/lib/rubocop/cop/style/copyright.rb +12 -12
- data/lib/rubocop/cop/style/date_time.rb +13 -2
- data/lib/rubocop/cop/style/def_with_parentheses.rb +8 -10
- data/lib/rubocop/cop/style/dir.rb +8 -10
- data/lib/rubocop/cop/style/disable_cops_within_source_code_directive.rb +7 -9
- data/lib/rubocop/cop/style/documentation.rb +2 -4
- data/lib/rubocop/cop/style/documentation_method.rb +1 -1
- data/lib/rubocop/cop/style/double_cop_disable_directive.rb +12 -15
- data/lib/rubocop/cop/style/double_negation.rb +3 -2
- data/lib/rubocop/cop/style/each_for_simple_loop.rb +5 -8
- data/lib/rubocop/cop/style/each_with_object.rb +16 -17
- data/lib/rubocop/cop/style/empty_block_parameter.rb +9 -10
- data/lib/rubocop/cop/style/empty_case_condition.rb +19 -20
- data/lib/rubocop/cop/style/empty_else.rb +17 -19
- data/lib/rubocop/cop/style/empty_lambda_parameter.rb +9 -10
- data/lib/rubocop/cop/style/empty_literal.rb +18 -17
- data/lib/rubocop/cop/style/empty_method.rb +5 -8
- data/lib/rubocop/cop/style/encoding.rb +5 -9
- data/lib/rubocop/cop/style/end_block.rb +4 -6
- data/lib/rubocop/cop/style/eval_with_location.rb +6 -10
- data/lib/rubocop/cop/style/even_odd.rb +8 -11
- data/lib/rubocop/cop/style/expand_path_arguments.rb +23 -26
- data/lib/rubocop/cop/style/explicit_block_argument.rb +1 -1
- data/lib/rubocop/cop/style/exponential_notation.rb +1 -1
- data/lib/rubocop/cop/style/float_division.rb +3 -1
- data/lib/rubocop/cop/style/for.rb +11 -15
- data/lib/rubocop/cop/style/format_string.rb +18 -23
- data/lib/rubocop/cop/style/format_string_token.rb +4 -7
- data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +19 -41
- data/lib/rubocop/cop/style/global_vars.rb +2 -2
- data/lib/rubocop/cop/style/guard_clause.rb +4 -4
- data/lib/rubocop/cop/style/hash_as_last_array_item.rb +24 -5
- data/lib/rubocop/cop/style/hash_each_methods.rb +5 -8
- data/lib/rubocop/cop/style/hash_syntax.rb +6 -7
- data/lib/rubocop/cop/style/hash_transform_keys.rb +19 -11
- data/lib/rubocop/cop/style/hash_transform_values.rb +18 -10
- data/lib/rubocop/cop/style/identical_conditional_branches.rb +1 -1
- data/lib/rubocop/cop/style/if_inside_else.rb +2 -2
- data/lib/rubocop/cop/style/if_unless_modifier.rb +11 -17
- data/lib/rubocop/cop/style/if_unless_modifier_of_if_unless.rb +3 -7
- data/lib/rubocop/cop/style/if_with_semicolon.rb +3 -6
- data/lib/rubocop/cop/style/implicit_runtime_error.rb +2 -1
- data/lib/rubocop/cop/style/infinite_loop.rb +23 -23
- data/lib/rubocop/cop/style/inline_comment.rb +3 -3
- data/lib/rubocop/cop/style/inverse_methods.rb +20 -29
- data/lib/rubocop/cop/style/keyword_parameters_order.rb +53 -0
- data/lib/rubocop/cop/style/lambda.rb +7 -12
- data/lib/rubocop/cop/style/lambda_call.rb +17 -14
- data/lib/rubocop/cop/style/line_end_concatenation.rb +19 -16
- data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +2 -1
- data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +11 -11
- data/lib/rubocop/cop/style/method_call_with_args_parentheses/require_parentheses.rb +4 -8
- data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +7 -6
- data/lib/rubocop/cop/style/method_called_on_do_end_block.rb +12 -3
- data/lib/rubocop/cop/style/method_def_parentheses.rb +11 -16
- data/lib/rubocop/cop/style/min_max.rb +8 -12
- data/lib/rubocop/cop/style/missing_else.rb +13 -13
- data/lib/rubocop/cop/style/missing_respond_to_missing.rb +1 -1
- data/lib/rubocop/cop/style/mixin_grouping.rb +24 -27
- data/lib/rubocop/cop/style/mixin_usage.rb +9 -28
- data/lib/rubocop/cop/style/module_function.rb +10 -13
- data/lib/rubocop/cop/style/multiline_block_chain.rb +2 -2
- data/lib/rubocop/cop/style/multiline_if_modifier.rb +3 -10
- data/lib/rubocop/cop/style/multiline_if_then.rb +4 -10
- data/lib/rubocop/cop/style/multiline_memoization.rb +12 -10
- data/lib/rubocop/cop/style/multiline_method_signature.rb +1 -1
- data/lib/rubocop/cop/style/multiline_ternary_operator.rb +17 -6
- data/lib/rubocop/cop/style/multiline_when_then.rb +10 -11
- data/lib/rubocop/cop/style/multiple_comparison.rb +1 -1
- data/lib/rubocop/cop/style/mutable_constant.rb +23 -20
- data/lib/rubocop/cop/style/negated_if.rb +6 -6
- data/lib/rubocop/cop/style/negated_unless.rb +6 -6
- data/lib/rubocop/cop/style/negated_while.rb +7 -15
- data/lib/rubocop/cop/style/nested_modifier.rb +10 -13
- data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +14 -12
- data/lib/rubocop/cop/style/nested_ternary_operator.rb +14 -16
- data/lib/rubocop/cop/style/next.rb +10 -14
- data/lib/rubocop/cop/style/nil_comparison.rb +13 -11
- data/lib/rubocop/cop/style/non_nil_check.rb +34 -26
- data/lib/rubocop/cop/style/not.rb +20 -26
- data/lib/rubocop/cop/style/numeric_literal_prefix.rb +4 -9
- data/lib/rubocop/cop/style/numeric_predicate.rb +5 -14
- data/lib/rubocop/cop/style/one_line_conditional.rb +73 -23
- data/lib/rubocop/cop/style/option_hash.rb +1 -1
- data/lib/rubocop/cop/style/optional_arguments.rb +1 -1
- data/lib/rubocop/cop/style/optional_boolean_parameter.rb +12 -1
- data/lib/rubocop/cop/style/or_assignment.rb +13 -10
- data/lib/rubocop/cop/style/parallel_assignment.rb +14 -14
- data/lib/rubocop/cop/style/parentheses_around_condition.rb +6 -6
- data/lib/rubocop/cop/style/percent_literal_delimiters.rb +13 -19
- data/lib/rubocop/cop/style/percent_q_literals.rb +8 -10
- data/lib/rubocop/cop/style/perl_backrefs.rb +8 -10
- data/lib/rubocop/cop/style/preferred_hash_methods.rb +11 -14
- data/lib/rubocop/cop/style/proc.rb +6 -6
- data/lib/rubocop/cop/style/raise_args.rb +15 -24
- data/lib/rubocop/cop/style/random_with_offset.rb +19 -19
- data/lib/rubocop/cop/style/redundant_assignment.rb +8 -18
- data/lib/rubocop/cop/style/redundant_begin.rb +7 -9
- data/lib/rubocop/cop/style/redundant_capital_w.rb +6 -9
- data/lib/rubocop/cop/style/redundant_condition.rb +5 -6
- data/lib/rubocop/cop/style/redundant_conditional.rb +4 -5
- data/lib/rubocop/cop/style/redundant_exception.rb +1 -3
- data/lib/rubocop/cop/style/redundant_fetch_block.rb +3 -12
- data/lib/rubocop/cop/style/redundant_file_extension_in_require.rb +9 -8
- data/lib/rubocop/cop/style/redundant_freeze.rb +5 -7
- data/lib/rubocop/cop/style/redundant_interpolation.rb +25 -24
- data/lib/rubocop/cop/style/redundant_parentheses.rb +21 -15
- data/lib/rubocop/cop/style/redundant_percent_q.rb +9 -11
- data/lib/rubocop/cop/style/redundant_regexp_character_class.rb +6 -13
- data/lib/rubocop/cop/style/redundant_regexp_escape.rb +5 -14
- data/lib/rubocop/cop/style/redundant_return.rb +17 -17
- data/lib/rubocop/cop/style/redundant_self.rb +9 -11
- data/lib/rubocop/cop/style/redundant_self_assignment.rb +116 -0
- data/lib/rubocop/cop/style/redundant_sort.rb +12 -31
- data/lib/rubocop/cop/style/redundant_sort_by.rb +5 -9
- data/lib/rubocop/cop/style/regexp_literal.rb +10 -21
- data/lib/rubocop/cop/style/rescue_modifier.rb +29 -9
- data/lib/rubocop/cop/style/rescue_standard_error.rb +20 -16
- data/lib/rubocop/cop/style/return_nil.rb +5 -5
- data/lib/rubocop/cop/style/safe_navigation.rb +22 -16
- data/lib/rubocop/cop/style/sample.rb +12 -14
- data/lib/rubocop/cop/style/self_assignment.rb +26 -22
- data/lib/rubocop/cop/style/semicolon.rb +6 -9
- data/lib/rubocop/cop/style/send.rb +4 -5
- data/lib/rubocop/cop/style/signal_exception.rb +23 -19
- data/lib/rubocop/cop/style/single_argument_dig.rb +1 -0
- data/lib/rubocop/cop/style/single_line_block_params.rb +4 -2
- data/lib/rubocop/cop/style/single_line_methods.rb +18 -17
- data/lib/rubocop/cop/style/slicing_with_range.rb +6 -8
- data/lib/rubocop/cop/style/sole_nested_conditional.rb +66 -0
- data/lib/rubocop/cop/style/special_global_vars.rb +10 -15
- data/lib/rubocop/cop/style/stabby_lambda_parentheses.rb +17 -21
- data/lib/rubocop/cop/style/stderr_puts.rb +5 -6
- data/lib/rubocop/cop/style/string_concatenation.rb +16 -2
- data/lib/rubocop/cop/style/string_hash_keys.rb +6 -7
- data/lib/rubocop/cop/style/string_methods.rb +7 -17
- data/lib/rubocop/cop/style/strip.rb +9 -14
- data/lib/rubocop/cop/style/struct_inheritance.rb +3 -6
- data/lib/rubocop/cop/style/symbol_array.rb +5 -16
- data/lib/rubocop/cop/style/symbol_literal.rb +4 -6
- data/lib/rubocop/cop/style/symbol_proc.rb +14 -18
- data/lib/rubocop/cop/style/ternary_parentheses.rb +22 -22
- data/lib/rubocop/cop/style/trailing_body_on_class.rb +3 -6
- data/lib/rubocop/cop/style/trailing_body_on_method_definition.rb +4 -7
- data/lib/rubocop/cop/style/trailing_body_on_module.rb +3 -6
- data/lib/rubocop/cop/style/trailing_comma_in_arguments.rb +2 -5
- data/lib/rubocop/cop/style/trailing_comma_in_array_literal.rb +2 -5
- data/lib/rubocop/cop/style/trailing_comma_in_block_args.rb +11 -9
- data/lib/rubocop/cop/style/trailing_comma_in_hash_literal.rb +2 -5
- data/lib/rubocop/cop/style/trailing_underscore_variable.rb +8 -17
- data/lib/rubocop/cop/style/trivial_accessors.rb +26 -30
- data/lib/rubocop/cop/style/unless_else.rb +5 -8
- data/lib/rubocop/cop/style/unpack_first.rb +5 -8
- data/lib/rubocop/cop/style/variable_interpolation.rb +7 -10
- data/lib/rubocop/cop/style/when_then.rb +4 -6
- data/lib/rubocop/cop/style/while_until_do.rb +6 -16
- data/lib/rubocop/cop/style/while_until_modifier.rb +6 -20
- data/lib/rubocop/cop/style/word_array.rb +5 -23
- data/lib/rubocop/cop/style/yoda_condition.rb +4 -15
- data/lib/rubocop/cop/style/zero_length_predicate.rb +12 -18
- data/lib/rubocop/cop/team.rb +1 -0
- data/lib/rubocop/cop/util.rb +2 -1
- data/lib/rubocop/cop/utils/format_string.rb +3 -5
- data/lib/rubocop/cop/variable_force.rb +2 -0
- data/lib/rubocop/cops_documentation_generator.rb +5 -3
- data/lib/rubocop/core_ext/string.rb +2 -2
- data/lib/rubocop/directive_comment.rb +32 -0
- data/lib/rubocop/ext/regexp_node.rb +46 -0
- data/lib/rubocop/file_finder.rb +1 -0
- data/lib/rubocop/formatter/auto_gen_config_formatter.rb +2 -1
- data/lib/rubocop/formatter/disabled_config_formatter.rb +13 -6
- data/lib/rubocop/formatter/html_formatter.rb +2 -0
- data/lib/rubocop/formatter/junit_formatter.rb +1 -1
- data/lib/rubocop/formatter/progress_formatter.rb +2 -1
- data/lib/rubocop/formatter/quiet_formatter.rb +1 -1
- data/lib/rubocop/formatter/simple_text_formatter.rb +36 -6
- data/lib/rubocop/name_similarity.rb +1 -0
- data/lib/rubocop/options.rb +43 -20
- data/lib/rubocop/remote_config.rb +1 -0
- data/lib/rubocop/result_cache.rb +31 -13
- data/lib/rubocop/rspec/cop_helper.rb +4 -1
- data/lib/rubocop/rspec/expect_offense.rb +14 -9
- data/lib/rubocop/rspec/shared_contexts.rb +13 -5
- data/lib/rubocop/runner.rb +35 -15
- data/lib/rubocop/string_interpreter.rb +3 -0
- data/lib/rubocop/target_finder.rb +5 -1
- data/lib/rubocop/target_ruby.rb +7 -1
- data/lib/rubocop/version.rb +7 -1
- data/lib/rubocop/yaml_duplication_checker.rb +1 -0
- metadata +26 -14
- data/lib/rubocop/cop/tokens_util.rb +0 -84
@@ -132,14 +132,14 @@ module RuboCop
|
|
132
132
|
# puts foo
|
133
133
|
# end
|
134
134
|
#
|
135
|
-
class BlockDelimiters <
|
135
|
+
class BlockDelimiters < Base
|
136
136
|
include ConfigurableEnforcedStyle
|
137
137
|
include IgnoredMethods
|
138
|
+
extend AutoCorrector
|
138
139
|
|
139
140
|
ALWAYS_BRACES_MESSAGE = 'Prefer `{...}` over `do...end` for blocks.'
|
140
141
|
|
141
|
-
BRACES_REQUIRED_MESSAGE =
|
142
|
-
"'%<method_name>s' method."
|
142
|
+
BRACES_REQUIRED_MESSAGE = "Brace delimiters `{...}` required for '%<method_name>s' method."
|
143
143
|
|
144
144
|
def on_send(node)
|
145
145
|
return unless node.arguments?
|
@@ -158,22 +158,26 @@ module RuboCop
|
|
158
158
|
|
159
159
|
def on_block(node)
|
160
160
|
return if ignored_node?(node)
|
161
|
+
return if proper_block_style?(node)
|
161
162
|
|
162
|
-
|
163
|
+
message = message(node)
|
164
|
+
add_offense(node.loc.begin, message: message) do |corrector|
|
165
|
+
autocorrect(corrector, node)
|
166
|
+
end
|
163
167
|
end
|
164
168
|
|
165
|
-
|
169
|
+
private
|
170
|
+
|
171
|
+
def autocorrect(corrector, node)
|
166
172
|
return if correction_would_break_code?(node)
|
167
173
|
|
168
174
|
if node.braces?
|
169
|
-
replace_braces_with_do_end(node.loc)
|
175
|
+
replace_braces_with_do_end(corrector, node.loc)
|
170
176
|
else
|
171
|
-
replace_do_end_with_braces(node.loc)
|
177
|
+
replace_do_end_with_braces(corrector, node.loc)
|
172
178
|
end
|
173
179
|
end
|
174
180
|
|
175
|
-
private
|
176
|
-
|
177
181
|
def line_count_based_message(node)
|
178
182
|
if node.multiline?
|
179
183
|
'Avoid using `{...}` for multi-line blocks.'
|
@@ -219,29 +223,25 @@ module RuboCop
|
|
219
223
|
end
|
220
224
|
end
|
221
225
|
|
222
|
-
def replace_braces_with_do_end(loc)
|
226
|
+
def replace_braces_with_do_end(corrector, loc)
|
223
227
|
b = loc.begin
|
224
228
|
e = loc.end
|
225
229
|
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
corrector.replace(e, 'end')
|
232
|
-
end
|
230
|
+
corrector.insert_before(b, ' ') unless whitespace_before?(b)
|
231
|
+
corrector.insert_before(e, ' ') unless whitespace_before?(e)
|
232
|
+
corrector.insert_after(b, ' ') unless whitespace_after?(b)
|
233
|
+
corrector.replace(b, 'do')
|
234
|
+
corrector.replace(e, 'end')
|
233
235
|
end
|
234
236
|
|
235
|
-
def replace_do_end_with_braces(loc)
|
237
|
+
def replace_do_end_with_braces(corrector, loc)
|
236
238
|
b = loc.begin
|
237
239
|
e = loc.end
|
238
240
|
|
239
|
-
|
240
|
-
corrector.insert_after(b, ' ') unless whitespace_after?(b, 2)
|
241
|
+
corrector.insert_after(b, ' ') unless whitespace_after?(b, 2)
|
241
242
|
|
242
|
-
|
243
|
-
|
244
|
-
end
|
243
|
+
corrector.replace(b, '{')
|
244
|
+
corrector.replace(e, '}')
|
245
245
|
end
|
246
246
|
|
247
247
|
def whitespace_before?(range)
|
@@ -14,7 +14,7 @@ module RuboCop
|
|
14
14
|
# # good
|
15
15
|
# something.is_a?(Array)
|
16
16
|
# (1..100).include?(7)
|
17
|
-
#
|
17
|
+
# /something/.match?(some_string)
|
18
18
|
#
|
19
19
|
# @example AllowOnConstant
|
20
20
|
# # Style/CaseEquality:
|
@@ -27,17 +27,20 @@ module RuboCop
|
|
27
27
|
# # good
|
28
28
|
# Array === something
|
29
29
|
# (1..100).include?(7)
|
30
|
-
#
|
30
|
+
# /something/.match?(some_string)
|
31
31
|
#
|
32
32
|
class CaseEquality < Base
|
33
33
|
extend AutoCorrector
|
34
34
|
|
35
35
|
MSG = 'Avoid the use of the case equality operator `===`.'
|
36
|
+
RESTRICT_ON_SEND = %i[===].freeze
|
36
37
|
|
37
38
|
def_node_matcher :case_equality?, '(send $#const? :=== $_)'
|
38
39
|
|
39
40
|
def on_send(node)
|
40
41
|
case_equality?(node) do |lhs, rhs|
|
42
|
+
return if lhs.const_type? && !lhs.module_name?
|
43
|
+
|
41
44
|
add_offense(node.loc.selector) do |corrector|
|
42
45
|
replacement = replacement(lhs, rhs)
|
43
46
|
corrector.replace(node, replacement) if replacement
|
@@ -58,7 +61,12 @@ module RuboCop
|
|
58
61
|
def replacement(lhs, rhs)
|
59
62
|
case lhs.type
|
60
63
|
when :regexp
|
61
|
-
|
64
|
+
# The automatic correction from `a === b` to `a.match?(b)` needs to
|
65
|
+
# consider `Regexp.last_match?`, `$~`, `$1`, and etc.
|
66
|
+
# This correction is expected to be supported by `Performance/Regexp` cop.
|
67
|
+
# See: https://github.com/rubocop-hq/rubocop-performance/issues/152
|
68
|
+
#
|
69
|
+
# So here is noop.
|
62
70
|
when :begin
|
63
71
|
child = lhs.children.first
|
64
72
|
"#{lhs.source}.include?(#{rhs.source})" if child&.range_type?
|
@@ -26,8 +26,9 @@ module RuboCop
|
|
26
26
|
# final_action
|
27
27
|
# end
|
28
28
|
#
|
29
|
-
class CaseLikeIf <
|
29
|
+
class CaseLikeIf < Base
|
30
30
|
include RangeHelp
|
31
|
+
extend AutoCorrector
|
31
32
|
|
32
33
|
MSG = 'Convert `if-elsif` to `case-when`.'
|
33
34
|
|
@@ -46,28 +47,30 @@ module RuboCop
|
|
46
47
|
break unless convertible
|
47
48
|
end
|
48
49
|
|
49
|
-
|
50
|
+
return unless convertible
|
51
|
+
|
52
|
+
add_offense(node) do |corrector|
|
53
|
+
autocorrect(corrector, node)
|
54
|
+
end
|
50
55
|
end
|
51
56
|
|
52
|
-
|
57
|
+
private
|
58
|
+
|
59
|
+
def autocorrect(corrector, node)
|
53
60
|
target = find_target(node.condition)
|
54
61
|
|
55
|
-
|
56
|
-
corrector.insert_before(node, "case #{target.source}\n#{indent(node)}")
|
62
|
+
corrector.insert_before(node, "case #{target.source}\n#{indent(node)}")
|
57
63
|
|
58
|
-
|
59
|
-
|
60
|
-
|
64
|
+
branch_conditions(node).each do |branch_condition|
|
65
|
+
conditions = []
|
66
|
+
collect_conditions(branch_condition, target, conditions)
|
61
67
|
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
end
|
68
|
+
range = correction_range(branch_condition)
|
69
|
+
branch_replacement = "when #{conditions.map(&:source).join(', ')}"
|
70
|
+
corrector.replace(range, branch_replacement)
|
66
71
|
end
|
67
72
|
end
|
68
73
|
|
69
|
-
private
|
70
|
-
|
71
74
|
def should_check?(node)
|
72
75
|
!node.unless? && !node.elsif? && !node.modifier_form? && !node.ternary? &&
|
73
76
|
node.elsif_conditional?
|
@@ -112,7 +115,7 @@ module RuboCop
|
|
112
115
|
def find_target_in_equality_node(node)
|
113
116
|
argument = node.arguments.first
|
114
117
|
receiver = node.receiver
|
115
|
-
return unless receiver
|
118
|
+
return unless argument && receiver
|
116
119
|
|
117
120
|
if argument.literal? || const_reference?(argument)
|
118
121
|
receiver
|
@@ -156,9 +159,10 @@ module RuboCop
|
|
156
159
|
case node.method_name
|
157
160
|
when :is_a?
|
158
161
|
node.arguments.first if node.receiver == target
|
159
|
-
when :==, :eql?, :equal
|
160
|
-
|
161
|
-
|
162
|
+
when :==, :eql?, :equal?
|
163
|
+
condition_from_equality_node(node, target)
|
164
|
+
when :=~, :match, :match?
|
165
|
+
condition_from_match_node(node, target)
|
162
166
|
when :===
|
163
167
|
lhs, _method, rhs = *node
|
164
168
|
lhs if rhs == target
|
@@ -169,6 +173,17 @@ module RuboCop
|
|
169
173
|
end
|
170
174
|
# rubocop:enable Metrics/CyclomaticComplexity
|
171
175
|
|
176
|
+
def condition_from_equality_node(node, target)
|
177
|
+
lhs, _method, rhs = *node
|
178
|
+
condition = condition_from_binary_op(lhs, rhs, target)
|
179
|
+
condition if condition && !class_reference?(condition)
|
180
|
+
end
|
181
|
+
|
182
|
+
def condition_from_match_node(node, target)
|
183
|
+
lhs, _method, rhs = *node
|
184
|
+
condition_from_binary_op(lhs, rhs, target)
|
185
|
+
end
|
186
|
+
|
172
187
|
def condition_from_binary_op(lhs, rhs, target)
|
173
188
|
lhs = deparenthesize(lhs)
|
174
189
|
rhs = deparenthesize(rhs)
|
@@ -199,6 +214,10 @@ module RuboCop
|
|
199
214
|
name == name.upcase
|
200
215
|
end
|
201
216
|
|
217
|
+
def class_reference?(node)
|
218
|
+
node.const_type? && node.children[1].match?(/[[:lower:]]/)
|
219
|
+
end
|
220
|
+
|
202
221
|
def deparenthesize(node)
|
203
222
|
node = node.children.last while node.begin_type?
|
204
223
|
node
|
@@ -21,9 +21,10 @@ module RuboCop
|
|
21
21
|
# end
|
22
22
|
#
|
23
23
|
# The compact style is only forced for classes/modules with one child.
|
24
|
-
class ClassAndModuleChildren <
|
24
|
+
class ClassAndModuleChildren < Base
|
25
25
|
include ConfigurableEnforcedStyle
|
26
26
|
include RangeHelp
|
27
|
+
extend AutoCorrector
|
27
28
|
|
28
29
|
NESTED_MSG = 'Use nested module/class definitions instead of ' \
|
29
30
|
'compact style.'
|
@@ -40,14 +41,6 @@ module RuboCop
|
|
40
41
|
check_style(node, node.body)
|
41
42
|
end
|
42
43
|
|
43
|
-
def autocorrect(node)
|
44
|
-
lambda do |corrector|
|
45
|
-
return if node.class_type? && node.parent_class && style != :nested
|
46
|
-
|
47
|
-
nest_or_compact(corrector, node)
|
48
|
-
end
|
49
|
-
end
|
50
|
-
|
51
44
|
private
|
52
45
|
|
53
46
|
def nest_or_compact(corrector, node)
|
@@ -119,6 +112,8 @@ module RuboCop
|
|
119
112
|
end
|
120
113
|
|
121
114
|
def check_style(node, body)
|
115
|
+
return if node.identifier.children[0]&.cbase_type?
|
116
|
+
|
122
117
|
if style == :nested
|
123
118
|
check_nested_style(node)
|
124
119
|
else
|
@@ -129,13 +124,23 @@ module RuboCop
|
|
129
124
|
def check_nested_style(node)
|
130
125
|
return unless compact_node_name?(node)
|
131
126
|
|
132
|
-
add_offense(node
|
127
|
+
add_offense(node.loc.name, message: NESTED_MSG) do |corrector|
|
128
|
+
autocorrect(corrector, node)
|
129
|
+
end
|
133
130
|
end
|
134
131
|
|
135
132
|
def check_compact_style(node, body)
|
136
133
|
return unless one_child?(body) && !compact_node_name?(node)
|
137
134
|
|
138
|
-
add_offense(node
|
135
|
+
add_offense(node.loc.name, message: COMPACT_MSG) do |corrector|
|
136
|
+
autocorrect(corrector, node)
|
137
|
+
end
|
138
|
+
end
|
139
|
+
|
140
|
+
def autocorrect(corrector, node)
|
141
|
+
return if node.class_type? && node.parent_class && style != :nested
|
142
|
+
|
143
|
+
nest_or_compact(corrector, node)
|
139
144
|
end
|
140
145
|
|
141
146
|
def one_child?(body)
|
@@ -23,23 +23,18 @@ module RuboCop
|
|
23
23
|
# var.kind_of?(Time)
|
24
24
|
# var.kind_of?(String)
|
25
25
|
#
|
26
|
-
class ClassCheck <
|
26
|
+
class ClassCheck < Base
|
27
27
|
include ConfigurableEnforcedStyle
|
28
|
+
extend AutoCorrector
|
28
29
|
|
29
30
|
MSG = 'Prefer `Object#%<prefer>s` over `Object#%<current>s`.'
|
30
|
-
|
31
|
-
def_node_matcher :class_check?, '(send _ ${:is_a? :kind_of?} _)'
|
31
|
+
RESTRICT_ON_SEND = %i[is_a? kind_of?].freeze
|
32
32
|
|
33
33
|
def on_send(node)
|
34
|
-
|
35
|
-
return if style == method_name
|
36
|
-
|
37
|
-
add_offense(node, location: :selector)
|
38
|
-
end
|
39
|
-
end
|
34
|
+
return if style == node.method_name
|
40
35
|
|
41
|
-
|
42
|
-
|
36
|
+
message = message(node)
|
37
|
+
add_offense(node.loc.selector, message: message) do |corrector|
|
43
38
|
replacement = node.method?(:is_a?) ? 'kind_of?' : 'is_a?'
|
44
39
|
|
45
40
|
corrector.replace(node.loc.selector, replacement)
|
@@ -20,7 +20,9 @@ module RuboCop
|
|
20
20
|
# # ...
|
21
21
|
# end
|
22
22
|
# end
|
23
|
-
class ClassMethods <
|
23
|
+
class ClassMethods < Base
|
24
|
+
extend AutoCorrector
|
25
|
+
|
24
26
|
MSG = 'Use `self.%<method>s` instead of `%<class>s.%<method>s`.'
|
25
27
|
|
26
28
|
def on_class(node)
|
@@ -36,23 +38,17 @@ module RuboCop
|
|
36
38
|
end
|
37
39
|
alias on_module on_class
|
38
40
|
|
39
|
-
def autocorrect(node)
|
40
|
-
->(corrector) { corrector.replace(node.loc.name, 'self') }
|
41
|
-
end
|
42
|
-
|
43
41
|
private
|
44
42
|
|
45
43
|
def check_defs(name, node)
|
46
44
|
# check if the class/module name matches the definee for the defs node
|
47
45
|
return unless name == node.receiver
|
48
46
|
|
49
|
-
|
50
|
-
end
|
51
|
-
|
52
|
-
def message(node)
|
53
|
-
_, class_name = *node
|
47
|
+
message = format(MSG, method: node.method_name, class: name.source)
|
54
48
|
|
55
|
-
|
49
|
+
add_offense(node.receiver.loc.name, message: message) do |corrector|
|
50
|
+
corrector.replace(node.receiver, 'self')
|
51
|
+
end
|
56
52
|
end
|
57
53
|
end
|
58
54
|
end
|
@@ -0,0 +1,157 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RuboCop
|
4
|
+
module Cop
|
5
|
+
module Style
|
6
|
+
# This cop enforces using `def self.method_name` or `class << self` to define class methods.
|
7
|
+
#
|
8
|
+
# @example EnforcedStyle: def_self (default)
|
9
|
+
# # bad
|
10
|
+
# class SomeClass
|
11
|
+
# class << self
|
12
|
+
# attr_accessor :class_accessor
|
13
|
+
#
|
14
|
+
# def class_method
|
15
|
+
# # ...
|
16
|
+
# end
|
17
|
+
# end
|
18
|
+
# end
|
19
|
+
#
|
20
|
+
# # good
|
21
|
+
# class SomeClass
|
22
|
+
# def self.class_method
|
23
|
+
# # ...
|
24
|
+
# end
|
25
|
+
#
|
26
|
+
# class << self
|
27
|
+
# attr_accessor :class_accessor
|
28
|
+
# end
|
29
|
+
# end
|
30
|
+
#
|
31
|
+
# # good - contains private method
|
32
|
+
# class SomeClass
|
33
|
+
# class << self
|
34
|
+
# attr_accessor :class_accessor
|
35
|
+
#
|
36
|
+
# private
|
37
|
+
#
|
38
|
+
# def private_class_method
|
39
|
+
# # ...
|
40
|
+
# end
|
41
|
+
# end
|
42
|
+
# end
|
43
|
+
#
|
44
|
+
# @example EnforcedStyle: self_class
|
45
|
+
# # bad
|
46
|
+
# class SomeClass
|
47
|
+
# def self.class_method
|
48
|
+
# # ...
|
49
|
+
# end
|
50
|
+
# end
|
51
|
+
#
|
52
|
+
# # good
|
53
|
+
# class SomeClass
|
54
|
+
# class << self
|
55
|
+
# def class_method
|
56
|
+
# # ...
|
57
|
+
# end
|
58
|
+
# end
|
59
|
+
# end
|
60
|
+
#
|
61
|
+
class ClassMethodsDefinitions < Base
|
62
|
+
include ConfigurableEnforcedStyle
|
63
|
+
include CommentsHelp
|
64
|
+
include VisibilityHelp
|
65
|
+
include RangeHelp
|
66
|
+
extend AutoCorrector
|
67
|
+
|
68
|
+
MSG = 'Use `%<preferred>s` to define a class method.'
|
69
|
+
MSG_SCLASS = 'Do not define public methods within class << self.'
|
70
|
+
|
71
|
+
def on_sclass(node)
|
72
|
+
return unless def_self_style?
|
73
|
+
return unless node.identifier.source == 'self'
|
74
|
+
return unless all_methods_public?(node)
|
75
|
+
|
76
|
+
add_offense(node, message: MSG_SCLASS) do |corrector|
|
77
|
+
autocorrect_sclass(node, corrector)
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
def on_defs(node)
|
82
|
+
return if def_self_style?
|
83
|
+
|
84
|
+
message = format(MSG, preferred: 'class << self')
|
85
|
+
add_offense(node, message: message)
|
86
|
+
end
|
87
|
+
|
88
|
+
private
|
89
|
+
|
90
|
+
def def_self_style?
|
91
|
+
style == :def_self
|
92
|
+
end
|
93
|
+
|
94
|
+
def all_methods_public?(sclass_node)
|
95
|
+
def_nodes = def_nodes(sclass_node)
|
96
|
+
return false if def_nodes.empty?
|
97
|
+
|
98
|
+
def_nodes.all? { |def_node| node_visibility(def_node) == :public }
|
99
|
+
end
|
100
|
+
|
101
|
+
def def_nodes(sclass_node)
|
102
|
+
sclass_def = sclass_node.body
|
103
|
+
return [] unless sclass_def
|
104
|
+
|
105
|
+
if sclass_def.def_type?
|
106
|
+
[sclass_def]
|
107
|
+
elsif sclass_def.begin_type?
|
108
|
+
sclass_def.each_child_node(:def).to_a
|
109
|
+
else
|
110
|
+
[]
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
def autocorrect_sclass(node, corrector)
|
115
|
+
rewritten_defs = []
|
116
|
+
|
117
|
+
def_nodes(node).each do |def_node|
|
118
|
+
next unless node_visibility(def_node) == :public
|
119
|
+
|
120
|
+
range, source = extract_def_from_sclass(def_node, node)
|
121
|
+
|
122
|
+
corrector.remove(range)
|
123
|
+
rewritten_defs << source
|
124
|
+
end
|
125
|
+
|
126
|
+
if sclass_only_has_methods?(node)
|
127
|
+
corrector.remove(node)
|
128
|
+
rewritten_defs.first&.strip!
|
129
|
+
else
|
130
|
+
corrector.insert_after(node, "\n")
|
131
|
+
end
|
132
|
+
|
133
|
+
corrector.insert_after(node, rewritten_defs.join("\n"))
|
134
|
+
end
|
135
|
+
|
136
|
+
def sclass_only_has_methods?(node)
|
137
|
+
node.body.def_type? || node.body.each_child_node.all?(&:def_type?)
|
138
|
+
end
|
139
|
+
|
140
|
+
def extract_def_from_sclass(def_node, sclass_node)
|
141
|
+
range = source_range_with_comment(def_node)
|
142
|
+
source = range.source.sub!(
|
143
|
+
"def #{def_node.method_name}",
|
144
|
+
"def self.#{def_node.method_name}"
|
145
|
+
)
|
146
|
+
|
147
|
+
source = source.gsub(/^ {#{indentation_diff(def_node, sclass_node)}}/, '')
|
148
|
+
[range, source.chomp]
|
149
|
+
end
|
150
|
+
|
151
|
+
def indentation_diff(node1, node2)
|
152
|
+
node1.loc.column - node2.loc.column
|
153
|
+
end
|
154
|
+
end
|
155
|
+
end
|
156
|
+
end
|
157
|
+
end
|