rubocop 0.70.0 → 0.75.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 +6 -10
- data/bin/console +1 -0
- data/config/default.yml +91 -494
- data/lib/rubocop.rb +16 -54
- data/lib/rubocop/ast/builder.rb +2 -0
- data/lib/rubocop/ast/node.rb +9 -15
- data/lib/rubocop/ast/node/float_node.rb +12 -0
- data/lib/rubocop/ast/node/int_node.rb +12 -0
- data/lib/rubocop/ast/node/mixin/method_dispatch_node.rb +4 -4
- data/lib/rubocop/ast/node/mixin/numeric_node.rb +21 -0
- data/lib/rubocop/ast/node/resbody_node.rb +1 -6
- data/lib/rubocop/ast/traversal.rb +3 -3
- data/lib/rubocop/cached_data.rb +1 -1
- data/lib/rubocop/comment_config.rb +3 -2
- data/lib/rubocop/config.rb +21 -508
- data/lib/rubocop/config_loader.rb +22 -4
- data/lib/rubocop/config_loader_resolver.rb +2 -8
- data/lib/rubocop/config_obsoletion.rb +213 -0
- data/lib/rubocop/config_validator.rb +239 -0
- data/lib/rubocop/cop/autocorrect_logic.rb +71 -1
- data/lib/rubocop/cop/bundler/insecure_protocol_source.rb +1 -1
- data/lib/rubocop/cop/bundler/ordered_gems.rb +1 -1
- data/lib/rubocop/cop/commissioner.rb +3 -9
- data/lib/rubocop/cop/cop.rb +39 -12
- data/lib/rubocop/cop/corrector.rb +2 -3
- data/lib/rubocop/cop/correctors/alignment_corrector.rb +43 -17
- data/lib/rubocop/cop/correctors/empty_line_corrector.rb +2 -2
- data/lib/rubocop/cop/correctors/multiline_literal_brace_corrector.rb +2 -2
- data/lib/rubocop/cop/gemspec/duplicated_assignment.rb +2 -2
- data/lib/rubocop/cop/gemspec/ordered_dependencies.rb +1 -1
- data/lib/rubocop/cop/gemspec/required_ruby_version.rb +1 -1
- data/lib/rubocop/cop/gemspec/ruby_version_globals_usage.rb +55 -0
- data/lib/rubocop/cop/generator.rb +4 -4
- data/lib/rubocop/cop/generator/configuration_injector.rb +9 -4
- data/lib/rubocop/cop/generator/require_file_injector.rb +1 -1
- data/lib/rubocop/cop/internal_affairs/node_destructuring.rb +2 -2
- data/lib/rubocop/cop/internal_affairs/node_type_predicate.rb +1 -1
- data/lib/rubocop/cop/internal_affairs/offense_location_keyword.rb +2 -2
- data/lib/rubocop/cop/internal_affairs/redundant_location_argument.rb +1 -1
- data/lib/rubocop/cop/internal_affairs/redundant_message_argument.rb +2 -2
- data/lib/rubocop/cop/internal_affairs/useless_message_assertion.rb +2 -2
- data/lib/rubocop/cop/layout/block_alignment.rb +3 -3
- data/lib/rubocop/cop/layout/class_structure.rb +2 -2
- data/lib/rubocop/cop/layout/closing_parenthesis_indentation.rb +1 -1
- data/lib/rubocop/cop/layout/empty_lines_around_block_body.rb +3 -1
- data/lib/rubocop/cop/layout/extra_spacing.rb +14 -59
- data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +4 -0
- data/lib/rubocop/cop/layout/indent_assignment.rb +9 -1
- data/lib/rubocop/cop/layout/indent_first_argument.rb +7 -3
- data/lib/rubocop/cop/layout/indent_first_parameter.rb +7 -3
- data/lib/rubocop/cop/layout/indent_heredoc.rb +4 -4
- data/lib/rubocop/cop/layout/indentation_consistency.rb +13 -12
- data/lib/rubocop/cop/layout/indentation_width.rb +28 -10
- data/lib/rubocop/cop/layout/leading_comment_space.rb +28 -0
- data/lib/rubocop/cop/layout/multiline_block_layout.rb +24 -2
- data/lib/rubocop/cop/layout/multiline_method_argument_line_breaks.rb +2 -0
- data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +18 -4
- data/lib/rubocop/cop/layout/space_around_block_parameters.rb +5 -1
- data/lib/rubocop/cop/layout/space_around_operators.rb +42 -23
- data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +1 -1
- data/lib/rubocop/cop/layout/space_inside_block_braces.rb +21 -2
- data/lib/rubocop/cop/layout/space_inside_string_interpolation.rb +24 -40
- data/lib/rubocop/cop/layout/tab.rb +10 -22
- data/lib/rubocop/cop/lint/assignment_in_condition.rb +17 -4
- data/lib/rubocop/cop/lint/big_decimal_new.rb +1 -1
- data/lib/rubocop/cop/lint/debugger.rb +4 -6
- data/lib/rubocop/cop/lint/duplicate_methods.rb +3 -3
- data/lib/rubocop/cop/lint/each_with_object_argument.rb +1 -1
- data/lib/rubocop/cop/lint/empty_interpolation.rb +4 -4
- data/lib/rubocop/cop/lint/erb_new_arguments.rb +57 -1
- data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +11 -37
- data/lib/rubocop/cop/lint/ineffective_access_modifier.rb +1 -1
- data/lib/rubocop/cop/lint/inherit_exception.rb +1 -1
- data/lib/rubocop/cop/lint/literal_in_interpolation.rb +7 -8
- data/lib/rubocop/cop/lint/multiple_compare.rb +1 -1
- data/lib/rubocop/cop/lint/nested_method_definition.rb +3 -3
- data/lib/rubocop/cop/lint/next_without_accumulator.rb +1 -1
- data/lib/rubocop/cop/lint/non_local_exit_from_iterator.rb +1 -1
- data/lib/rubocop/cop/lint/number_conversion.rb +4 -4
- data/lib/rubocop/cop/lint/rand_one.rb +1 -1
- data/lib/rubocop/cop/lint/redundant_with_index.rb +1 -1
- data/lib/rubocop/cop/lint/redundant_with_object.rb +1 -1
- data/lib/rubocop/cop/lint/safe_navigation_chain.rb +5 -5
- data/lib/rubocop/cop/lint/safe_navigation_with_empty.rb +1 -1
- data/lib/rubocop/cop/lint/send_with_mixin_argument.rb +91 -0
- data/lib/rubocop/cop/lint/string_conversion_in_interpolation.rb +6 -6
- data/lib/rubocop/cop/lint/unified_integer.rb +1 -1
- data/lib/rubocop/cop/lint/unneeded_cop_disable_directive.rb +1 -1
- data/lib/rubocop/cop/lint/unneeded_require_statement.rb +1 -1
- data/lib/rubocop/cop/lint/unneeded_splat_expansion.rb +7 -2
- data/lib/rubocop/cop/lint/unreachable_code.rb +1 -1
- data/lib/rubocop/cop/lint/uri_escape_unescape.rb +1 -1
- data/lib/rubocop/cop/lint/uri_regexp.rb +2 -2
- data/lib/rubocop/cop/lint/useless_access_modifier.rb +6 -6
- data/lib/rubocop/cop/lint/useless_setter_call.rb +1 -1
- data/lib/rubocop/cop/message_annotator.rb +16 -7
- data/lib/rubocop/cop/metrics/class_length.rb +1 -1
- data/lib/rubocop/cop/metrics/line_length.rb +6 -0
- data/lib/rubocop/cop/metrics/module_length.rb +1 -1
- data/lib/rubocop/cop/metrics/parameter_lists.rb +1 -1
- data/lib/rubocop/cop/migration/department_name.rb +44 -0
- data/lib/rubocop/cop/mixin/alignment.rb +1 -1
- data/lib/rubocop/cop/mixin/def_node.rb +1 -1
- data/lib/rubocop/cop/mixin/documentation_comment.rb +0 -2
- data/lib/rubocop/cop/mixin/empty_parameter.rb +1 -1
- data/lib/rubocop/cop/mixin/enforce_superclass.rb +4 -4
- data/lib/rubocop/cop/mixin/frozen_string_literal.rb +1 -1
- data/lib/rubocop/cop/mixin/hash_alignment.rb +4 -0
- data/lib/rubocop/cop/mixin/interpolation.rb +27 -0
- data/lib/rubocop/cop/mixin/method_complexity.rb +1 -1
- data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +3 -3
- data/lib/rubocop/cop/mixin/preceding_following_alignment.rb +87 -0
- data/lib/rubocop/cop/mixin/safe_mode.rb +2 -0
- data/lib/rubocop/cop/mixin/surrounding_space.rb +7 -5
- data/lib/rubocop/cop/naming/binary_operator_parameter_name.rb +1 -1
- data/lib/rubocop/cop/naming/constant_name.rb +2 -2
- data/lib/rubocop/cop/naming/method_name.rb +12 -1
- data/lib/rubocop/cop/naming/predicate_name.rb +1 -1
- data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +20 -22
- data/lib/rubocop/cop/naming/variable_name.rb +1 -0
- data/lib/rubocop/cop/offense.rb +18 -7
- data/lib/rubocop/cop/registry.rb +22 -1
- data/lib/rubocop/cop/security/eval.rb +1 -1
- data/lib/rubocop/cop/security/json_load.rb +1 -1
- data/lib/rubocop/cop/security/marshal_load.rb +1 -1
- data/lib/rubocop/cop/security/open.rb +1 -1
- data/lib/rubocop/cop/security/yaml_load.rb +1 -1
- data/lib/rubocop/cop/style/access_modifier_declarations.rb +1 -0
- data/lib/rubocop/cop/style/alias.rb +1 -1
- data/lib/rubocop/cop/style/block_delimiters.rb +2 -1
- data/lib/rubocop/cop/style/braces_around_hash_parameters.rb +29 -10
- data/lib/rubocop/cop/style/class_and_module_children.rb +1 -1
- data/lib/rubocop/cop/style/colon_method_call.rb +1 -1
- data/lib/rubocop/cop/style/commented_keyword.rb +16 -30
- data/lib/rubocop/cop/style/conditional_assignment.rb +8 -9
- data/lib/rubocop/cop/style/constant_visibility.rb +14 -3
- data/lib/rubocop/cop/style/date_time.rb +3 -3
- data/lib/rubocop/cop/style/dir.rb +1 -1
- data/lib/rubocop/cop/style/documentation_method.rb +1 -1
- data/lib/rubocop/cop/style/double_cop_disable_directive.rb +55 -0
- data/lib/rubocop/cop/style/each_for_simple_loop.rb +1 -1
- data/lib/rubocop/cop/style/each_with_object.rb +1 -1
- data/lib/rubocop/cop/style/eval_with_location.rb +2 -2
- data/lib/rubocop/cop/style/even_odd.rb +1 -1
- data/lib/rubocop/cop/style/expand_path_arguments.rb +3 -3
- data/lib/rubocop/cop/style/float_division.rb +94 -0
- data/lib/rubocop/cop/style/format_string.rb +13 -9
- data/lib/rubocop/cop/style/format_string_token.rb +10 -40
- data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +18 -33
- data/lib/rubocop/cop/style/guard_clause.rb +39 -10
- data/lib/rubocop/cop/style/hash_syntax.rb +2 -2
- data/lib/rubocop/cop/style/if_inside_else.rb +42 -0
- data/lib/rubocop/cop/style/if_unless_modifier.rb +51 -15
- data/lib/rubocop/cop/style/infinite_loop.rb +1 -1
- data/lib/rubocop/cop/style/inverse_methods.rb +2 -2
- data/lib/rubocop/cop/style/lambda.rb +0 -2
- data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +12 -6
- data/lib/rubocop/cop/style/min_max.rb +1 -1
- data/lib/rubocop/cop/style/mixin_usage.rb +12 -2
- data/lib/rubocop/cop/style/multiline_memoization.rb +1 -1
- data/lib/rubocop/cop/style/multiline_when_then.rb +55 -0
- data/lib/rubocop/cop/style/multiple_comparison.rb +1 -1
- data/lib/rubocop/cop/style/mutable_constant.rb +3 -3
- data/lib/rubocop/cop/style/nested_modifier.rb +18 -2
- data/lib/rubocop/cop/style/numeric_predicate.rb +3 -3
- data/lib/rubocop/cop/style/option_hash.rb +1 -1
- data/lib/rubocop/cop/style/or_assignment.rb +8 -3
- data/lib/rubocop/cop/style/parentheses_around_condition.rb +15 -1
- data/lib/rubocop/cop/style/random_with_offset.rb +6 -6
- data/lib/rubocop/cop/style/redundant_conditional.rb +2 -2
- data/lib/rubocop/cop/style/redundant_exception.rb +2 -2
- data/lib/rubocop/cop/style/redundant_freeze.rb +1 -1
- data/lib/rubocop/cop/style/redundant_parentheses.rb +15 -6
- data/lib/rubocop/cop/style/redundant_self.rb +18 -1
- data/lib/rubocop/cop/style/redundant_sort_by.rb +1 -1
- data/lib/rubocop/cop/style/rescue_modifier.rb +24 -0
- data/lib/rubocop/cop/style/rescue_standard_error.rb +2 -2
- data/lib/rubocop/cop/style/return_nil.rb +1 -1
- data/lib/rubocop/cop/style/safe_navigation.rb +11 -2
- data/lib/rubocop/cop/style/sample.rb +1 -1
- data/lib/rubocop/cop/style/single_line_methods.rb +8 -1
- data/lib/rubocop/cop/style/stderr_puts.rb +1 -1
- data/lib/rubocop/cop/style/string_hash_keys.rb +2 -2
- data/lib/rubocop/cop/style/strip.rb +1 -1
- data/lib/rubocop/cop/style/struct_inheritance.rb +3 -3
- data/lib/rubocop/cop/style/symbol_proc.rb +1 -1
- data/lib/rubocop/cop/style/ternary_parentheses.rb +32 -3
- data/lib/rubocop/cop/style/trailing_comma_in_arguments.rb +4 -0
- data/lib/rubocop/cop/style/trailing_method_end_statement.rb +4 -6
- data/lib/rubocop/cop/style/trivial_accessors.rb +1 -1
- data/lib/rubocop/cop/style/unneeded_sort.rb +1 -1
- data/lib/rubocop/cop/style/unpack_first.rb +1 -1
- data/lib/rubocop/cop/style/variable_interpolation.rb +6 -16
- data/lib/rubocop/cop/style/word_array.rb +2 -2
- data/lib/rubocop/cop/style/zero_length_predicate.rb +6 -6
- data/lib/rubocop/cop/team.rb +15 -14
- data/lib/rubocop/cop/utils/format_string.rb +128 -0
- data/lib/rubocop/cop/variable_force/variable.rb +15 -2
- data/lib/rubocop/core_ext/string.rb +0 -24
- data/lib/rubocop/error.rb +23 -0
- data/lib/rubocop/formatter/emacs_style_formatter.rb +8 -5
- data/lib/rubocop/formatter/formatter_set.rb +2 -1
- data/lib/rubocop/formatter/pacman_formatter.rb +80 -0
- data/lib/rubocop/formatter/simple_text_formatter.rb +9 -1
- data/lib/rubocop/formatter/tap_formatter.rb +9 -1
- data/lib/rubocop/magic_comment.rb +4 -0
- data/lib/rubocop/node_pattern.rb +86 -7
- data/lib/rubocop/options.rb +18 -2
- data/lib/rubocop/path_util.rb +1 -1
- data/lib/rubocop/processed_source.rb +9 -1
- data/lib/rubocop/rspec/cop_helper.rb +0 -1
- data/lib/rubocop/rspec/expect_offense.rb +4 -1
- data/lib/rubocop/rspec/shared_contexts.rb +12 -17
- data/lib/rubocop/rspec/support.rb +0 -1
- data/lib/rubocop/runner.rb +20 -15
- data/lib/rubocop/target_finder.rb +6 -4
- data/lib/rubocop/version.rb +1 -1
- data/lib/rubocop/yaml_duplication_checker.rb +8 -2
- metadata +16 -70
- data/lib/rubocop/cop/mixin/ignored_method_patterns.rb +0 -19
- data/lib/rubocop/cop/mixin/target_rails_version.rb +0 -16
- data/lib/rubocop/cop/rails/action_filter.rb +0 -117
- data/lib/rubocop/cop/rails/active_record_aliases.rb +0 -48
- data/lib/rubocop/cop/rails/active_record_override.rb +0 -82
- data/lib/rubocop/cop/rails/active_support_aliases.rb +0 -69
- data/lib/rubocop/cop/rails/application_job.rb +0 -40
- data/lib/rubocop/cop/rails/application_record.rb +0 -40
- data/lib/rubocop/cop/rails/assert_not.rb +0 -44
- data/lib/rubocop/cop/rails/belongs_to.rb +0 -102
- data/lib/rubocop/cop/rails/blank.rb +0 -164
- data/lib/rubocop/cop/rails/bulk_change_table.rb +0 -289
- data/lib/rubocop/cop/rails/create_table_with_timestamps.rb +0 -91
- data/lib/rubocop/cop/rails/date.rb +0 -161
- data/lib/rubocop/cop/rails/delegate.rb +0 -132
- data/lib/rubocop/cop/rails/delegate_allow_blank.rb +0 -37
- data/lib/rubocop/cop/rails/dynamic_find_by.rb +0 -91
- data/lib/rubocop/cop/rails/enum_uniqueness.rb +0 -45
- data/lib/rubocop/cop/rails/environment_comparison.rb +0 -68
- data/lib/rubocop/cop/rails/exit.rb +0 -67
- data/lib/rubocop/cop/rails/file_path.rb +0 -108
- data/lib/rubocop/cop/rails/find_by.rb +0 -55
- data/lib/rubocop/cop/rails/find_each.rb +0 -51
- data/lib/rubocop/cop/rails/has_and_belongs_to_many.rb +0 -25
- data/lib/rubocop/cop/rails/has_many_or_has_one_dependent.rb +0 -106
- data/lib/rubocop/cop/rails/http_positional_arguments.rb +0 -117
- data/lib/rubocop/cop/rails/http_status.rb +0 -179
- data/lib/rubocop/cop/rails/ignored_skip_action_filter_option.rb +0 -94
- data/lib/rubocop/cop/rails/inverse_of.rb +0 -246
- data/lib/rubocop/cop/rails/lexically_scoped_action_filter.rb +0 -175
- data/lib/rubocop/cop/rails/link_to_blank.rb +0 -98
- data/lib/rubocop/cop/rails/not_null_column.rb +0 -67
- data/lib/rubocop/cop/rails/output.rb +0 -49
- data/lib/rubocop/cop/rails/output_safety.rb +0 -99
- data/lib/rubocop/cop/rails/pluralization_grammar.rb +0 -107
- data/lib/rubocop/cop/rails/presence.rb +0 -124
- data/lib/rubocop/cop/rails/present.rb +0 -153
- data/lib/rubocop/cop/rails/read_write_attribute.rb +0 -74
- data/lib/rubocop/cop/rails/redundant_allow_nil.rb +0 -111
- data/lib/rubocop/cop/rails/redundant_receiver_in_with_options.rb +0 -136
- data/lib/rubocop/cop/rails/reflection_class_name.rb +0 -37
- data/lib/rubocop/cop/rails/refute_methods.rb +0 -76
- data/lib/rubocop/cop/rails/relative_date_constant.rb +0 -93
- data/lib/rubocop/cop/rails/request_referer.rb +0 -56
- data/lib/rubocop/cop/rails/reversible_migration.rb +0 -286
- data/lib/rubocop/cop/rails/safe_navigation.rb +0 -87
- data/lib/rubocop/cop/rails/save_bang.rb +0 -316
- data/lib/rubocop/cop/rails/scope_args.rb +0 -29
- data/lib/rubocop/cop/rails/skips_model_validations.rb +0 -87
- data/lib/rubocop/cop/rails/time_zone.rb +0 -238
- data/lib/rubocop/cop/rails/uniq_before_pluck.rb +0 -105
- data/lib/rubocop/cop/rails/unknown_env.rb +0 -63
- data/lib/rubocop/cop/rails/validation.rb +0 -109
- data/lib/rubocop/rspec/shared_examples.rb +0 -59
@@ -27,6 +27,37 @@ module RuboCop
|
|
27
27
|
# else
|
28
28
|
# action_c
|
29
29
|
# end
|
30
|
+
#
|
31
|
+
# @example AllowIfModifier: false (default)
|
32
|
+
# # bad
|
33
|
+
# if condition_a
|
34
|
+
# action_a
|
35
|
+
# else
|
36
|
+
# action_b if condition_b
|
37
|
+
# end
|
38
|
+
#
|
39
|
+
# # good
|
40
|
+
# if condition_a
|
41
|
+
# action_a
|
42
|
+
# elsif condition_b
|
43
|
+
# action_b
|
44
|
+
# end
|
45
|
+
#
|
46
|
+
# @example AllowIfModifier: true
|
47
|
+
# # good
|
48
|
+
# if condition_a
|
49
|
+
# action_a
|
50
|
+
# else
|
51
|
+
# action_b if condition_b
|
52
|
+
# end
|
53
|
+
#
|
54
|
+
# # good
|
55
|
+
# if condition_a
|
56
|
+
# action_a
|
57
|
+
# elsif condition_b
|
58
|
+
# action_b
|
59
|
+
# end
|
60
|
+
#
|
30
61
|
class IfInsideElse < Cop
|
31
62
|
MSG = 'Convert `if` nested inside `else` to `elsif`.'
|
32
63
|
|
@@ -36,9 +67,20 @@ module RuboCop
|
|
36
67
|
else_branch = node.else_branch
|
37
68
|
|
38
69
|
return unless else_branch&.if_type? && else_branch&.if?
|
70
|
+
return if allow_if_modifier_in_else_branch?(else_branch)
|
39
71
|
|
40
72
|
add_offense(else_branch, location: :keyword)
|
41
73
|
end
|
74
|
+
|
75
|
+
private
|
76
|
+
|
77
|
+
def allow_if_modifier_in_else_branch?(else_branch)
|
78
|
+
allow_if_modifier? && else_branch&.modifier_form?
|
79
|
+
end
|
80
|
+
|
81
|
+
def allow_if_modifier?
|
82
|
+
cop_config['AllowIfModifier']
|
83
|
+
end
|
42
84
|
end
|
43
85
|
end
|
44
86
|
end
|
@@ -3,10 +3,13 @@
|
|
3
3
|
module RuboCop
|
4
4
|
module Cop
|
5
5
|
module Style
|
6
|
-
# Checks for if and unless statements that would fit on one line
|
7
|
-
#
|
8
|
-
#
|
9
|
-
#
|
6
|
+
# Checks for `if` and `unless` statements that would fit on one line if
|
7
|
+
# written as modifier `if`/`unless`. The cop also checks for modifier
|
8
|
+
# `if`/`unless` lines that exceed the maximum line length.
|
9
|
+
#
|
10
|
+
# The maximum line length is configured in the `Metrics/LineLength`
|
11
|
+
# cop. The tab size is configured in the `IndentationWidth` of the
|
12
|
+
# `Layout/Tab` cop.
|
10
13
|
#
|
11
14
|
# @example
|
12
15
|
# # bad
|
@@ -18,35 +21,59 @@ module RuboCop
|
|
18
21
|
# Foo.do_something
|
19
22
|
# end
|
20
23
|
#
|
24
|
+
# do_something_in_a_method_with_a_long_name(arg) if long_condition
|
25
|
+
#
|
21
26
|
# # good
|
22
27
|
# do_stuff(bar) if condition
|
23
28
|
# Foo.do_something unless qux.empty?
|
29
|
+
#
|
30
|
+
# if long_condition
|
31
|
+
# do_something_in_a_method_with_a_long_name(arg)
|
32
|
+
# end
|
24
33
|
class IfUnlessModifier < Cop
|
25
34
|
include StatementModifier
|
26
35
|
|
27
|
-
|
28
|
-
|
29
|
-
|
36
|
+
MSG_USE_MODIFIER = 'Favor modifier `%<keyword>s` usage when having a ' \
|
37
|
+
'single-line body. Another good alternative is ' \
|
38
|
+
'the usage of control flow `&&`/`||`.'
|
39
|
+
MSG_USE_NORMAL =
|
40
|
+
'Modifier form of `%<keyword>s` makes the line too long.'
|
30
41
|
|
31
42
|
ASSIGNMENT_TYPES = %i[lvasgn casgn cvasgn
|
32
43
|
gvasgn ivasgn masgn].freeze
|
33
44
|
|
34
45
|
def on_if(node)
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
46
|
+
msg = if eligible_node?(node)
|
47
|
+
MSG_USE_MODIFIER unless named_capture_in_condition?(node)
|
48
|
+
elsif node.modifier_form? && too_long_single_line?(node)
|
49
|
+
MSG_USE_NORMAL
|
50
|
+
end
|
51
|
+
return unless msg
|
52
|
+
|
53
|
+
add_offense(node,
|
54
|
+
location: :keyword,
|
55
|
+
message: format(msg, keyword: node.keyword))
|
40
56
|
end
|
41
57
|
|
42
58
|
def autocorrect(node)
|
43
|
-
|
44
|
-
|
45
|
-
|
59
|
+
replacement = if node.modifier_form?
|
60
|
+
to_normal_form(node)
|
61
|
+
else
|
62
|
+
to_modifier_form(node)
|
63
|
+
end
|
64
|
+
->(corrector) { corrector.replace(node.source_range, replacement) }
|
46
65
|
end
|
47
66
|
|
48
67
|
private
|
49
68
|
|
69
|
+
def too_long_single_line?(node)
|
70
|
+
return false unless max_line_length
|
71
|
+
|
72
|
+
range = node.source_range
|
73
|
+
range.first_line == range.last_line &&
|
74
|
+
range.last_column > max_line_length
|
75
|
+
end
|
76
|
+
|
50
77
|
def named_capture_in_condition?(node)
|
51
78
|
node.condition.match_with_lvasgn_type?
|
52
79
|
end
|
@@ -79,6 +106,15 @@ module RuboCop
|
|
79
106
|
parenthesize?(node) ? "(#{expression})" : expression
|
80
107
|
end
|
81
108
|
|
109
|
+
def to_normal_form(node)
|
110
|
+
indentation = ' ' * node.source_range.column
|
111
|
+
<<~RUBY.chomp
|
112
|
+
#{node.keyword} #{node.condition.source}
|
113
|
+
#{indentation} #{node.body.source}
|
114
|
+
#{indentation}end
|
115
|
+
RUBY
|
116
|
+
end
|
117
|
+
|
82
118
|
def first_line_comment(node)
|
83
119
|
comment =
|
84
120
|
processed_source.find_comment { |c| c.loc.line == node.loc.line }
|
@@ -47,7 +47,7 @@ module RuboCop
|
|
47
47
|
[Style::Not]
|
48
48
|
end
|
49
49
|
|
50
|
-
def_node_matcher :inverse_candidate?,
|
50
|
+
def_node_matcher :inverse_candidate?, <<~PATTERN
|
51
51
|
{
|
52
52
|
(send $(send $(...) $_ $...) :!)
|
53
53
|
(send (block $(send $(...) $_) $...) :!)
|
@@ -55,7 +55,7 @@ module RuboCop
|
|
55
55
|
}
|
56
56
|
PATTERN
|
57
57
|
|
58
|
-
def_node_matcher :inverse_block?,
|
58
|
+
def_node_matcher :inverse_block?, <<~PATTERN
|
59
59
|
(block $(send (...) $_) ... { $(send ... :!)
|
60
60
|
$(send (...) {:!= :!~} ...)
|
61
61
|
(begin ... $(send ... :!))
|
@@ -9,7 +9,7 @@ module RuboCop
|
|
9
9
|
#
|
10
10
|
# In the default style (require_parentheses), macro methods are ignored.
|
11
11
|
# Additional methods can be added to the `IgnoredMethods`
|
12
|
-
# or `
|
12
|
+
# or `IgnoredPatterns` list. These options are
|
13
13
|
# valid only in the default style. Macros can be included by
|
14
14
|
# either setting `IgnoreMacros` to false or adding specific macros to
|
15
15
|
# the `IncludedMacros` list.
|
@@ -17,7 +17,7 @@ module RuboCop
|
|
17
17
|
# Precedence of options is all follows:
|
18
18
|
#
|
19
19
|
# 1. `IgnoredMethods`
|
20
|
-
# 2. `
|
20
|
+
# 2. `IgnoredPatterns`
|
21
21
|
# 3. `IncludedMacros`
|
22
22
|
#
|
23
23
|
# eg. If a method is listed in both
|
@@ -61,7 +61,7 @@ module RuboCop
|
|
61
61
|
# # okay with `puts` listed in `IgnoredMethods`
|
62
62
|
# puts 'test'
|
63
63
|
#
|
64
|
-
# # okay with `^assert` listed in `
|
64
|
+
# # okay with `^assert` listed in `IgnoredPatterns`
|
65
65
|
# assert_equal 'test', x
|
66
66
|
#
|
67
67
|
# # IgnoreMacros: true (default)
|
@@ -148,7 +148,7 @@ module RuboCop
|
|
148
148
|
class MethodCallWithArgsParentheses < Cop
|
149
149
|
include ConfigurableEnforcedStyle
|
150
150
|
include IgnoredMethods
|
151
|
-
include
|
151
|
+
include IgnoredPattern
|
152
152
|
|
153
153
|
TRAILING_WHITESPACE_REGEX = /\s+\Z/.freeze
|
154
154
|
|
@@ -186,7 +186,7 @@ module RuboCop
|
|
186
186
|
|
187
187
|
def add_offense_for_require_parentheses(node)
|
188
188
|
return if ignored_method?(node.method_name)
|
189
|
-
return if
|
189
|
+
return if matches_ignored_pattern?(node.method_name)
|
190
190
|
return if eligible_for_parentheses_omission?(node)
|
191
191
|
return unless node.arguments? && !node.parenthesized?
|
192
192
|
|
@@ -348,7 +348,8 @@ module RuboCop
|
|
348
348
|
end
|
349
349
|
|
350
350
|
def ambigious_literal?(node)
|
351
|
-
splat?(node) || ternary_if?(node) || regexp_slash_literal?(node)
|
351
|
+
splat?(node) || ternary_if?(node) || regexp_slash_literal?(node) ||
|
352
|
+
unary_literal?(node)
|
352
353
|
end
|
353
354
|
|
354
355
|
def splat?(node)
|
@@ -371,6 +372,11 @@ module RuboCop
|
|
371
372
|
node.regexp_type? && node.loc.begin.source == '/'
|
372
373
|
end
|
373
374
|
|
375
|
+
def unary_literal?(node)
|
376
|
+
node.numeric_type? && node.sign? ||
|
377
|
+
node.parent&.send_type? && node.parent&.unary_operation?
|
378
|
+
end
|
379
|
+
|
374
380
|
def assigned_before?(node, target)
|
375
381
|
node.assignment? &&
|
376
382
|
node.loc.operator.begin < target.loc.begin
|
@@ -44,11 +44,15 @@ module RuboCop
|
|
44
44
|
MSG = '`%<statement>s` is used at the top level. Use inside `class` ' \
|
45
45
|
'or `module`.'
|
46
46
|
|
47
|
-
def_node_matcher :include_statement,
|
47
|
+
def_node_matcher :include_statement, <<~PATTERN
|
48
48
|
(send nil? ${:include :extend :prepend}
|
49
49
|
const)
|
50
50
|
PATTERN
|
51
51
|
|
52
|
+
def_node_matcher :wrapped_macro_scope?, <<~PATTERN
|
53
|
+
{({sclass class module block} ... ({begin if} ...))}
|
54
|
+
PATTERN
|
55
|
+
|
52
56
|
def on_send(node)
|
53
57
|
include_statement(node) do |statement|
|
54
58
|
return if node.argument? ||
|
@@ -62,7 +66,13 @@ module RuboCop
|
|
62
66
|
private
|
63
67
|
|
64
68
|
def accepted_include?(node)
|
65
|
-
node.parent && node.macro?
|
69
|
+
node.parent && (node.macro? || ascend_macro_scope?(node.parent))
|
70
|
+
end
|
71
|
+
|
72
|
+
def ascend_macro_scope?(ancestor)
|
73
|
+
return true if wrapped_macro_scope?(ancestor)
|
74
|
+
|
75
|
+
ancestor.parent && ascend_macro_scope?(ancestor.parent)
|
66
76
|
end
|
67
77
|
|
68
78
|
def belongs_to_class_or_module?(node)
|
@@ -73,7 +73,7 @@ module RuboCop
|
|
73
73
|
end
|
74
74
|
|
75
75
|
def keyword_begin_str(node, node_buf)
|
76
|
-
indent = config.for_cop('IndentationWidth')['Width'] || 2
|
76
|
+
indent = config.for_cop('Layout/IndentationWidth')['Width'] || 2
|
77
77
|
if node_buf.source[node.loc.begin.end_pos] == "\n"
|
78
78
|
'begin'
|
79
79
|
else
|
@@ -0,0 +1,55 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RuboCop
|
4
|
+
module Cop
|
5
|
+
module Style
|
6
|
+
# This cop checks uses of the `then` keyword
|
7
|
+
# in multi-line when statements.
|
8
|
+
#
|
9
|
+
# @example
|
10
|
+
# # bad
|
11
|
+
# case foo
|
12
|
+
# when bar then
|
13
|
+
# end
|
14
|
+
#
|
15
|
+
# # good
|
16
|
+
# case foo
|
17
|
+
# when bar
|
18
|
+
# end
|
19
|
+
#
|
20
|
+
# # good
|
21
|
+
# case foo
|
22
|
+
# when bar then do_something
|
23
|
+
# end
|
24
|
+
#
|
25
|
+
class MultilineWhenThen < Cop
|
26
|
+
include RangeHelp
|
27
|
+
|
28
|
+
MSG = 'Do not use `then` for multiline `when` statement.'
|
29
|
+
|
30
|
+
def on_when(node)
|
31
|
+
# Without `then`, there's no offense
|
32
|
+
return unless node.then?
|
33
|
+
|
34
|
+
# Single line usage of `then` is not an offense
|
35
|
+
return if !node.children.last.nil? && !node.multiline? && node.then?
|
36
|
+
|
37
|
+
# With more than one statements after then, there's not offense
|
38
|
+
return if node.children.last&.begin_type?
|
39
|
+
|
40
|
+
add_offense(node, location: :begin)
|
41
|
+
end
|
42
|
+
|
43
|
+
def autocorrect(node)
|
44
|
+
lambda do |corrector|
|
45
|
+
corrector.remove(
|
46
|
+
range_with_surrounding_space(
|
47
|
+
range: node.loc.begin, side: :left
|
48
|
+
)
|
49
|
+
)
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
@@ -30,7 +30,7 @@ module RuboCop
|
|
30
30
|
private
|
31
31
|
|
32
32
|
def_node_matcher :simple_double_comparison?, '(send $lvar :== $lvar)'
|
33
|
-
def_node_matcher :simple_comparison?,
|
33
|
+
def_node_matcher :simple_comparison?, <<~PATTERN
|
34
34
|
{(send $lvar :== _)
|
35
35
|
(send _ :== $lvar)}
|
36
36
|
PATTERN
|
@@ -143,13 +143,13 @@ module RuboCop
|
|
143
143
|
end
|
144
144
|
end
|
145
145
|
|
146
|
-
def_node_matcher :splat_value,
|
146
|
+
def_node_matcher :splat_value, <<~PATTERN
|
147
147
|
(array (splat $_))
|
148
148
|
PATTERN
|
149
149
|
|
150
150
|
# Some of these patterns may not actually return an immutable object,
|
151
151
|
# but we want to consider them immutable for this cop.
|
152
|
-
def_node_matcher :operation_produces_immutable_object?,
|
152
|
+
def_node_matcher :operation_produces_immutable_object?, <<~PATTERN
|
153
153
|
{
|
154
154
|
(const _ _)
|
155
155
|
(send (const nil? :Struct) :new ...)
|
@@ -165,7 +165,7 @@ module RuboCop
|
|
165
165
|
}
|
166
166
|
PATTERN
|
167
167
|
|
168
|
-
def_node_matcher :range_enclosed_in_parentheses?,
|
168
|
+
def_node_matcher :range_enclosed_in_parentheses?, <<~PATTERN
|
169
169
|
(begin ({irange erange} _ _))
|
170
170
|
PATTERN
|
171
171
|
end
|
@@ -73,12 +73,28 @@ module RuboCop
|
|
73
73
|
end
|
74
74
|
|
75
75
|
def right_hand_operand(node, left_hand_keyword)
|
76
|
-
|
77
|
-
|
76
|
+
condition = node.condition
|
77
|
+
|
78
|
+
expr = if condition.send_type? && !condition.arguments.empty? &&
|
79
|
+
!condition.operator_method?
|
80
|
+
add_parentheses_to_method_arguments(condition)
|
81
|
+
else
|
82
|
+
condition.source
|
83
|
+
end
|
84
|
+
expr = "(#{expr})" if requires_parens?(condition)
|
78
85
|
expr = "!#{expr}" unless left_hand_keyword == node.keyword
|
79
86
|
expr
|
80
87
|
end
|
81
88
|
|
89
|
+
def add_parentheses_to_method_arguments(send_node)
|
90
|
+
expr = +''
|
91
|
+
expr << "#{send_node.receiver.source}." if send_node.receiver
|
92
|
+
expr << send_node.method_name.to_s
|
93
|
+
expr << "(#{send_node.arguments.map(&:source).join(', ')})"
|
94
|
+
|
95
|
+
expr
|
96
|
+
end
|
97
|
+
|
82
98
|
def requires_parens?(node)
|
83
99
|
node.or_type? ||
|
84
100
|
!(RuboCop::AST::Node::COMPARISON_OPERATORS & node.children).empty?
|