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
@@ -120,15 +120,15 @@ module RuboCop
|
|
120
120
|
end
|
121
121
|
end
|
122
122
|
|
123
|
-
def_node_matcher :predicate,
|
123
|
+
def_node_matcher :predicate, <<~PATTERN
|
124
124
|
(send $(...) ${:zero? :positive? :negative?})
|
125
125
|
PATTERN
|
126
126
|
|
127
|
-
def_node_matcher :comparison,
|
127
|
+
def_node_matcher :comparison, <<~PATTERN
|
128
128
|
(send [$(...) !gvar_type?] ${:== :> :<} (int 0))
|
129
129
|
PATTERN
|
130
130
|
|
131
|
-
def_node_matcher :inverted_comparison,
|
131
|
+
def_node_matcher :inverted_comparison, <<~PATTERN
|
132
132
|
(send (int 0) ${:== :> :<} [$(...) !gvar_type?])
|
133
133
|
PATTERN
|
134
134
|
end
|
@@ -29,7 +29,7 @@ module RuboCop
|
|
29
29
|
class OrAssignment < Cop
|
30
30
|
MSG = 'Use the double pipe equals operator `||=` instead.'
|
31
31
|
|
32
|
-
def_node_matcher :ternary_assignment?,
|
32
|
+
def_node_matcher :ternary_assignment?, <<~PATTERN
|
33
33
|
({lvasgn ivasgn cvasgn gvasgn} _var
|
34
34
|
(if
|
35
35
|
({lvar ivar cvar gvar} _var)
|
@@ -37,7 +37,7 @@ module RuboCop
|
|
37
37
|
_))
|
38
38
|
PATTERN
|
39
39
|
|
40
|
-
def_node_matcher :unless_assignment?,
|
40
|
+
def_node_matcher :unless_assignment?, <<~PATTERN
|
41
41
|
(if
|
42
42
|
({lvar ivar cvar gvar} _var) nil?
|
43
43
|
({lvasgn ivasgn cvasgn gvasgn} _var
|
@@ -81,7 +81,12 @@ module RuboCop
|
|
81
81
|
end
|
82
82
|
|
83
83
|
def take_variable_and_default_from_unless(node)
|
84
|
-
|
84
|
+
if node.if_branch
|
85
|
+
variable, default = *node.if_branch
|
86
|
+
else
|
87
|
+
variable, default = *node.else_branch
|
88
|
+
end
|
89
|
+
|
85
90
|
[variable, default]
|
86
91
|
end
|
87
92
|
end
|
@@ -6,6 +6,11 @@ module RuboCop
|
|
6
6
|
# This cop checks for the presence of superfluous parentheses around the
|
7
7
|
# condition of if/unless/while/until.
|
8
8
|
#
|
9
|
+
# `AllowSafeAssignment` option for safe assignment.
|
10
|
+
# By safe assignment we mean putting parentheses around
|
11
|
+
# an assignment to indicate "I know I'm using an assignment
|
12
|
+
# as a condition. It's not a mistake."
|
13
|
+
#
|
9
14
|
# @example
|
10
15
|
# # bad
|
11
16
|
# x += 1 while (x < 10)
|
@@ -23,6 +28,14 @@ module RuboCop
|
|
23
28
|
# elsif x < 3
|
24
29
|
# end
|
25
30
|
#
|
31
|
+
# @example AllowSafeAssignment: true (default)
|
32
|
+
# # good
|
33
|
+
# foo unless (bar = baz)
|
34
|
+
#
|
35
|
+
# @example AllowSafeAssignment: false
|
36
|
+
# # bad
|
37
|
+
# foo unless (bar = baz)
|
38
|
+
#
|
26
39
|
# @example AllowInMultilineConditions: false (default)
|
27
40
|
# # bad
|
28
41
|
# if (x > 10 &&
|
@@ -39,6 +52,7 @@ module RuboCop
|
|
39
52
|
# if (x > 10 &&
|
40
53
|
# y > 10)
|
41
54
|
# end
|
55
|
+
#
|
42
56
|
class ParenthesesAroundCondition < Cop
|
43
57
|
include SafeAssignment
|
44
58
|
include Parentheses
|
@@ -60,7 +74,7 @@ module RuboCop
|
|
60
74
|
|
61
75
|
private
|
62
76
|
|
63
|
-
def_node_matcher :control_op_condition,
|
77
|
+
def_node_matcher :control_op_condition, <<~PATTERN
|
64
78
|
(begin $_ ...)
|
65
79
|
PATTERN
|
66
80
|
|
@@ -27,7 +27,7 @@ module RuboCop
|
|
27
27
|
MSG = 'Prefer ranges when generating random numbers instead of ' \
|
28
28
|
'integers with offsets.'
|
29
29
|
|
30
|
-
def_node_matcher :integer_op_rand?,
|
30
|
+
def_node_matcher :integer_op_rand?, <<~PATTERN
|
31
31
|
(send
|
32
32
|
int {:+ :-}
|
33
33
|
(send
|
@@ -36,7 +36,7 @@ module RuboCop
|
|
36
36
|
{int irange erange}))
|
37
37
|
PATTERN
|
38
38
|
|
39
|
-
def_node_matcher :rand_op_integer?,
|
39
|
+
def_node_matcher :rand_op_integer?, <<~PATTERN
|
40
40
|
(send
|
41
41
|
(send
|
42
42
|
{nil? (const nil? :Random) (const nil? :Kernel)}
|
@@ -46,7 +46,7 @@ module RuboCop
|
|
46
46
|
int)
|
47
47
|
PATTERN
|
48
48
|
|
49
|
-
def_node_matcher :rand_modified?,
|
49
|
+
def_node_matcher :rand_modified?, <<~PATTERN
|
50
50
|
(send
|
51
51
|
(send
|
52
52
|
{nil? (const nil? :Random) (const nil? :Kernel)}
|
@@ -80,7 +80,7 @@ module RuboCop
|
|
80
80
|
|
81
81
|
private
|
82
82
|
|
83
|
-
def_node_matcher :random_call,
|
83
|
+
def_node_matcher :random_call, <<~PATTERN
|
84
84
|
{(send (send $_ _ $_) ...)
|
85
85
|
(send _ _ (send $_ _ $_))}
|
86
86
|
PATTERN
|
@@ -128,7 +128,7 @@ module RuboCop
|
|
128
128
|
end
|
129
129
|
end
|
130
130
|
|
131
|
-
def_node_matcher :namespace,
|
131
|
+
def_node_matcher :namespace, <<~PATTERN
|
132
132
|
{$nil? (const nil? $_)}
|
133
133
|
PATTERN
|
134
134
|
|
@@ -149,7 +149,7 @@ module RuboCop
|
|
149
149
|
end
|
150
150
|
end
|
151
151
|
|
152
|
-
def_node_matcher :to_int,
|
152
|
+
def_node_matcher :to_int, <<~PATTERN
|
153
153
|
(int $_)
|
154
154
|
PATTERN
|
155
155
|
end
|
@@ -53,11 +53,11 @@ module RuboCop
|
|
53
53
|
format(MSG, msg: msg)
|
54
54
|
end
|
55
55
|
|
56
|
-
def_node_matcher :redundant_condition?,
|
56
|
+
def_node_matcher :redundant_condition?, <<~RUBY
|
57
57
|
(if (send _ {:#{COMPARISON_OPERATORS.join(' :')}} _) true false)
|
58
58
|
RUBY
|
59
59
|
|
60
|
-
def_node_matcher :redundant_condition_inverted?,
|
60
|
+
def_node_matcher :redundant_condition_inverted?, <<~RUBY
|
61
61
|
(if (send _ {:#{COMPARISON_OPERATORS.join(' :')}} _) false true)
|
62
62
|
RUBY
|
63
63
|
|
@@ -47,11 +47,11 @@ module RuboCop
|
|
47
47
|
end
|
48
48
|
end
|
49
49
|
|
50
|
-
def_node_matcher :exploded?,
|
50
|
+
def_node_matcher :exploded?, <<~PATTERN
|
51
51
|
(send nil? ${:raise :fail} (const nil? :RuntimeError) $_)
|
52
52
|
PATTERN
|
53
53
|
|
54
|
-
def_node_matcher :compact?,
|
54
|
+
def_node_matcher :compact?, <<~PATTERN
|
55
55
|
(send nil? {:raise :fail} $(send (const nil? :RuntimeError) :new $_))
|
56
56
|
PATTERN
|
57
57
|
end
|
@@ -51,7 +51,7 @@ module RuboCop
|
|
51
51
|
end
|
52
52
|
end
|
53
53
|
|
54
|
-
def_node_matcher :operation_produces_immutable_object?,
|
54
|
+
def_node_matcher :operation_produces_immutable_object?, <<~PATTERN
|
55
55
|
{
|
56
56
|
(begin (send {float int} {:+ :- :* :** :/ :% :<<} _))
|
57
57
|
(begin (send !(str _) {:+ :- :* :** :/ :%} {float int}))
|
@@ -40,7 +40,7 @@ module RuboCop
|
|
40
40
|
|
41
41
|
def parens_allowed?(node)
|
42
42
|
empty_parentheses?(node) ||
|
43
|
-
|
43
|
+
first_arg_begins_with_hash_literal?(node) ||
|
44
44
|
rescue?(node) ||
|
45
45
|
allowed_expression?(node)
|
46
46
|
end
|
@@ -76,12 +76,21 @@ module RuboCop
|
|
76
76
|
node.children.empty?
|
77
77
|
end
|
78
78
|
|
79
|
-
def
|
80
|
-
# Don't flag `method ({key: value})`
|
81
|
-
node.children.first
|
79
|
+
def first_arg_begins_with_hash_literal?(node)
|
80
|
+
# Don't flag `method ({key: value})` or `method ({key: value}.method)`
|
81
|
+
method_chain_begins_with_hash_literal?(node.children.first) &&
|
82
|
+
first_argument?(node) &&
|
82
83
|
!parentheses?(node.parent)
|
83
84
|
end
|
84
85
|
|
86
|
+
def method_chain_begins_with_hash_literal?(node)
|
87
|
+
return false if node.nil?
|
88
|
+
return true if node.hash_type?
|
89
|
+
return false unless node.send_type?
|
90
|
+
|
91
|
+
method_chain_begins_with_hash_literal?(node.children.first)
|
92
|
+
end
|
93
|
+
|
85
94
|
def check(begin_node)
|
86
95
|
node = begin_node.children.first
|
87
96
|
if keyword_with_redundant_parentheses?(node)
|
@@ -203,11 +212,11 @@ module RuboCop
|
|
203
212
|
first_send_argument?(node) || first_super_argument?(node)
|
204
213
|
end
|
205
214
|
|
206
|
-
def_node_matcher :first_send_argument?,
|
215
|
+
def_node_matcher :first_send_argument?, <<~PATTERN
|
207
216
|
^(send _ _ equal?(%0) ...)
|
208
217
|
PATTERN
|
209
218
|
|
210
|
-
def_node_matcher :first_super_argument?,
|
219
|
+
def_node_matcher :first_super_argument?, <<~PATTERN
|
211
220
|
^(super equal?(%0) ...)
|
212
221
|
PATTERN
|
213
222
|
|
@@ -83,9 +83,16 @@ module RuboCop
|
|
83
83
|
on_argument(node)
|
84
84
|
end
|
85
85
|
|
86
|
+
def on_masgn(node)
|
87
|
+
lhs, rhs = *node
|
88
|
+
lhs.children.each do |child|
|
89
|
+
add_lhs_to_local_variables_scopes(rhs, child.to_a.first)
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
86
93
|
def on_lvasgn(node)
|
87
94
|
lhs, rhs = *node
|
88
|
-
|
95
|
+
add_lhs_to_local_variables_scopes(rhs, lhs)
|
89
96
|
end
|
90
97
|
|
91
98
|
def on_send(node)
|
@@ -148,6 +155,16 @@ module RuboCop
|
|
148
155
|
|
149
156
|
@allowed_send_nodes << node
|
150
157
|
end
|
158
|
+
|
159
|
+
def add_lhs_to_local_variables_scopes(rhs, lhs)
|
160
|
+
if rhs&.send_type? && !rhs.arguments.empty?
|
161
|
+
rhs.arguments.each do |argument|
|
162
|
+
@local_variables_scopes[argument] << lhs
|
163
|
+
end
|
164
|
+
else
|
165
|
+
@local_variables_scopes[rhs] << lhs
|
166
|
+
end
|
167
|
+
end
|
151
168
|
end
|
152
169
|
end
|
153
170
|
end
|
@@ -5,16 +5,40 @@ module RuboCop
|
|
5
5
|
module Style
|
6
6
|
# This cop checks for uses of rescue in its modifier form.
|
7
7
|
#
|
8
|
+
# The cop to check `rescue` in its modifier form is added for following
|
9
|
+
# reasons:
|
10
|
+
#
|
11
|
+
# * The syntax of modifier form `rescue` can be misleading because it
|
12
|
+
# might led us to believe that `rescue` handles the given exception
|
13
|
+
# but it actually rescue all exceptions to return the given rescue
|
14
|
+
# block. In this case, value returned by handle_error or
|
15
|
+
# SomeException.
|
16
|
+
#
|
17
|
+
# * Modifier form `rescue` would rescue all the exceptions. It would
|
18
|
+
# silently skip all exception or errors and handle the error.
|
19
|
+
# Example: If `NoMethodError` is raised, modifier form rescue would
|
20
|
+
# handle the exception.
|
21
|
+
#
|
8
22
|
# @example
|
9
23
|
# # bad
|
10
24
|
# some_method rescue handle_error
|
11
25
|
#
|
26
|
+
# # bad
|
27
|
+
# some_method rescue SomeException
|
28
|
+
#
|
12
29
|
# # good
|
13
30
|
# begin
|
14
31
|
# some_method
|
15
32
|
# rescue
|
16
33
|
# handle_error
|
17
34
|
# end
|
35
|
+
#
|
36
|
+
# # good
|
37
|
+
# begin
|
38
|
+
# some_method
|
39
|
+
# rescue SomeException
|
40
|
+
# handle_error
|
41
|
+
# end
|
18
42
|
class RescueModifier < Cop
|
19
43
|
include Alignment
|
20
44
|
include RescueNode
|
@@ -80,11 +80,11 @@ module RuboCop
|
|
80
80
|
MSG_EXPLICIT = 'Avoid rescuing without specifying ' \
|
81
81
|
'an error class.'
|
82
82
|
|
83
|
-
def_node_matcher :rescue_without_error_class?,
|
83
|
+
def_node_matcher :rescue_without_error_class?, <<~PATTERN
|
84
84
|
(resbody nil? _ _)
|
85
85
|
PATTERN
|
86
86
|
|
87
|
-
def_node_matcher :rescue_standard_error?,
|
87
|
+
def_node_matcher :rescue_standard_error?, <<~PATTERN
|
88
88
|
(resbody $(array (const nil? :StandardError)) _ _)
|
89
89
|
PATTERN
|
90
90
|
|
@@ -69,7 +69,7 @@ module RuboCop
|
|
69
69
|
|
70
70
|
# if format: (if checked_variable body nil)
|
71
71
|
# unless format: (if checked_variable nil body)
|
72
|
-
def_node_matcher :modifier_if_safe_navigation_candidate,
|
72
|
+
def_node_matcher :modifier_if_safe_navigation_candidate, <<~PATTERN
|
73
73
|
{
|
74
74
|
(if {
|
75
75
|
(send $_ {:nil? :!})
|
@@ -120,6 +120,7 @@ module RuboCop
|
|
120
120
|
corrector.remove(begin_range(node, body))
|
121
121
|
corrector.remove(end_range(node, body))
|
122
122
|
corrector.insert_before(method_call.loc.dot, '&')
|
123
|
+
handle_comments(corrector, method_call)
|
123
124
|
|
124
125
|
add_safe_nav_to_all_methods_in_chain(corrector, method_call, body)
|
125
126
|
end
|
@@ -127,6 +128,14 @@ module RuboCop
|
|
127
128
|
|
128
129
|
private
|
129
130
|
|
131
|
+
def handle_comments(corrector, method_call)
|
132
|
+
return if processed_source.comments.empty?
|
133
|
+
|
134
|
+
comments = processed_source.comments.map(&:text).join("\n")
|
135
|
+
corrector.insert_before(method_call.loc.expression,
|
136
|
+
comments + "\n")
|
137
|
+
end
|
138
|
+
|
130
139
|
def allowed_if_condition?(node)
|
131
140
|
node.else? || node.elsif? || node.ternary?
|
132
141
|
end
|
@@ -224,7 +233,7 @@ module RuboCop
|
|
224
233
|
end
|
225
234
|
|
226
235
|
def method_called?(send_node)
|
227
|
-
send_node
|
236
|
+
send_node&.parent&.send_type?
|
228
237
|
end
|
229
238
|
|
230
239
|
def begin_range(node, method_call)
|
@@ -30,7 +30,7 @@ module RuboCop
|
|
30
30
|
class Sample < Cop
|
31
31
|
MSG = 'Use `%<correct>s` instead of `%<incorrect>s`.'
|
32
32
|
|
33
|
-
def_node_matcher :sample_candidate?,
|
33
|
+
def_node_matcher :sample_candidate?, <<~PATTERN
|
34
34
|
(send $(send _ :shuffle $...) ${:first :last :[] :at :slice} $...)
|
35
35
|
PATTERN
|
36
36
|
|
@@ -13,10 +13,17 @@ module RuboCop
|
|
13
13
|
# def @table.columns; super; end
|
14
14
|
#
|
15
15
|
# # good
|
16
|
-
# def no_op; end
|
17
16
|
# def self.resource_class=(klass); end
|
18
17
|
# def @table.columns; end
|
19
18
|
#
|
19
|
+
# @example AllowIfMethodIsEmpty: true (default)
|
20
|
+
# # good
|
21
|
+
# def no_op; end
|
22
|
+
#
|
23
|
+
# @example AllowIfMethodIsEmpty: false
|
24
|
+
# # bad
|
25
|
+
# def no_op; end
|
26
|
+
#
|
20
27
|
class SingleLineMethods < Cop
|
21
28
|
include Alignment
|
22
29
|
|
@@ -20,7 +20,7 @@ module RuboCop
|
|
20
20
|
MSG =
|
21
21
|
'Use `warn` instead of `%<bad>s` to allow such output to be disabled.'
|
22
22
|
|
23
|
-
def_node_matcher :stderr_puts?,
|
23
|
+
def_node_matcher :stderr_puts?, <<~PATTERN
|
24
24
|
(send
|
25
25
|
{(gvar #stderr_gvar?) (const nil? :STDERR)}
|
26
26
|
:puts $_
|
@@ -15,11 +15,11 @@ module RuboCop
|
|
15
15
|
class StringHashKeys < Cop
|
16
16
|
MSG = 'Prefer symbols instead of strings as hash keys.'
|
17
17
|
|
18
|
-
def_node_matcher :string_hash_key?,
|
18
|
+
def_node_matcher :string_hash_key?, <<~PATTERN
|
19
19
|
(pair (str _) _)
|
20
20
|
PATTERN
|
21
21
|
|
22
|
-
def_node_matcher :receive_environments_method?,
|
22
|
+
def_node_matcher :receive_environments_method?, <<~PATTERN
|
23
23
|
{
|
24
24
|
^^(send (const {nil? cbase} :IO) :popen ...)
|
25
25
|
^^(send (const {nil? cbase} :Open3)
|