rubocop 0.71.0 → 0.75.1
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 +5 -8
- data/bin/console +1 -0
- data/config/default.yml +84 -488
- 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 -8
- data/lib/rubocop/config_loader_resolver.rb +2 -16
- 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/correctors/percent_literal_corrector.rb +1 -1
- 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_line_after_guard_clause.rb +22 -7
- data/lib/rubocop/cop/layout/empty_line_after_magic_comment.rb +2 -2
- data/lib/rubocop/cop/layout/empty_lines_around_class_body.rb +2 -2
- data/lib/rubocop/cop/layout/extra_spacing.rb +14 -59
- data/lib/rubocop/cop/layout/indent_assignment.rb +10 -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/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/unused_block_argument.rb +22 -6
- data/lib/rubocop/cop/lint/unused_method_argument.rb +23 -5
- 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/lint/void.rb +3 -22
- 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/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 +21 -20
- 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 +45 -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 +4 -4
- 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 +18 -69
- 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 +32 -26
- 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_return.rb +12 -0
- 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 +19 -2
- data/lib/rubocop/cop/style/sample.rb +1 -1
- data/lib/rubocop/cop/style/semicolon.rb +11 -0
- 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_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/clang_style_formatter.rb +8 -3
- data/lib/rubocop/formatter/emacs_style_formatter.rb +22 -9
- data/lib/rubocop/formatter/file_list_formatter.rb +1 -1
- data/lib/rubocop/formatter/formatter_set.rb +16 -15
- data/lib/rubocop/formatter/pacman_formatter.rb +80 -0
- data/lib/rubocop/formatter/simple_text_formatter.rb +16 -4
- data/lib/rubocop/formatter/tap_formatter.rb +17 -4
- data/lib/rubocop/magic_comment.rb +4 -0
- data/lib/rubocop/node_pattern.rb +2 -2
- data/lib/rubocop/options.rb +21 -17
- data/lib/rubocop/path_util.rb +1 -1
- data/lib/rubocop/processed_source.rb +6 -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 +14 -25
- 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 +17 -92
- 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
@@ -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, node, method_call)
|
123
124
|
|
124
125
|
add_safe_nav_to_all_methods_in_chain(corrector, method_call, body)
|
125
126
|
end
|
@@ -127,6 +128,22 @@ module RuboCop
|
|
127
128
|
|
128
129
|
private
|
129
130
|
|
131
|
+
def handle_comments(corrector, node, method_call)
|
132
|
+
return if processed_source.comments.empty?
|
133
|
+
|
134
|
+
corrector.insert_before(method_call.loc.expression,
|
135
|
+
"#{comments(node).join("\n")}\n")
|
136
|
+
end
|
137
|
+
|
138
|
+
def comments(node)
|
139
|
+
comments = processed_source.comments.select do |comment|
|
140
|
+
comment.loc.first_line >= node.loc.first_line &&
|
141
|
+
comment.loc.last_line <= node.loc.last_line
|
142
|
+
end
|
143
|
+
|
144
|
+
comments.map(&:text)
|
145
|
+
end
|
146
|
+
|
130
147
|
def allowed_if_condition?(node)
|
131
148
|
node.else? || node.elsif? || node.ternary?
|
132
149
|
end
|
@@ -224,7 +241,7 @@ module RuboCop
|
|
224
241
|
end
|
225
242
|
|
226
243
|
def method_called?(send_node)
|
227
|
-
send_node
|
244
|
+
send_node&.parent&.send_type?
|
228
245
|
end
|
229
246
|
|
230
247
|
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
|
|
@@ -6,6 +6,9 @@ module RuboCop
|
|
6
6
|
# This cop checks for multiple expressions placed on the same line.
|
7
7
|
# It also checks for lines terminated with a semicolon.
|
8
8
|
#
|
9
|
+
# This cop has `AllowAsExpressionSeparator` configuration option.
|
10
|
+
# It allows `;` to separate several expressions on the same line.
|
11
|
+
#
|
9
12
|
# @example
|
10
13
|
# # bad
|
11
14
|
# foo = 1; bar = 2;
|
@@ -15,6 +18,14 @@ module RuboCop
|
|
15
18
|
# foo = 1
|
16
19
|
# bar = 2
|
17
20
|
# baz = 3
|
21
|
+
#
|
22
|
+
# @example AllowAsExpressionSeparator: false (default)
|
23
|
+
# # bad
|
24
|
+
# foo = 1; bar = 2
|
25
|
+
#
|
26
|
+
# @example AllowAsExpressionSeparator: true
|
27
|
+
# # good
|
28
|
+
# foo = 1; bar = 2
|
18
29
|
class Semicolon < Cop
|
19
30
|
include RangeHelp
|
20
31
|
|
@@ -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)
|
@@ -29,9 +29,9 @@ module RuboCop
|
|
29
29
|
add_offense(node, location: node.parent_class.source_range)
|
30
30
|
end
|
31
31
|
|
32
|
-
def_node_matcher :struct_constructor?,
|
33
|
-
|
34
|
-
|
32
|
+
def_node_matcher :struct_constructor?, <<~PATTERN
|
33
|
+
{(send (const nil? :Struct) :new ...)
|
34
|
+
(block (send (const nil? :Struct) :new ...) ...)}
|
35
35
|
PATTERN
|
36
36
|
end
|
37
37
|
end
|
@@ -20,7 +20,7 @@ module RuboCop
|
|
20
20
|
SUPER_TYPES = %i[super zsuper].freeze
|
21
21
|
|
22
22
|
def_node_matcher :proc_node?, '(send (const nil? :Proc) :new)'
|
23
|
-
def_node_matcher :symbol_proc?,
|
23
|
+
def_node_matcher :symbol_proc?, <<~PATTERN
|
24
24
|
(block
|
25
25
|
${(send ...) (super ...) zsuper}
|
26
26
|
$(args (arg _var))
|
@@ -8,6 +8,11 @@ module RuboCop
|
|
8
8
|
# parentheses using `EnforcedStyle`. Omission is only enforced when
|
9
9
|
# removing the parentheses won't cause a different behavior.
|
10
10
|
#
|
11
|
+
# `AllowSafeAssignment` option for safe assignment.
|
12
|
+
# By safe assignment we mean putting parentheses around
|
13
|
+
# an assignment to indicate "I know I'm using an assignment
|
14
|
+
# as a condition. It's not a mistake."
|
15
|
+
#
|
11
16
|
# @example EnforcedStyle: require_no_parentheses (default)
|
12
17
|
# # bad
|
13
18
|
# foo = (bar?) ? a : b
|
@@ -40,6 +45,15 @@ module RuboCop
|
|
40
45
|
# foo = bar? ? a : b
|
41
46
|
# foo = bar.baz? ? a : b
|
42
47
|
# foo = (bar && baz) ? a : b
|
48
|
+
#
|
49
|
+
# @example AllowSafeAssignment: true (default)
|
50
|
+
# # good
|
51
|
+
# foo = (bar = baz) ? a : b
|
52
|
+
#
|
53
|
+
# @example AllowSafeAssignment: false
|
54
|
+
# # bad
|
55
|
+
# foo = (bar = baz) ? a : b
|
56
|
+
#
|
43
57
|
class TernaryParentheses < Cop
|
44
58
|
include SafeAssignment
|
45
59
|
include ConfigurableEnforcedStyle
|
@@ -53,11 +67,16 @@ module RuboCop
|
|
53
67
|
' complex conditions.'
|
54
68
|
|
55
69
|
def on_if(node)
|
70
|
+
return if only_closing_parenthesis_is_last_line?(node.condition)
|
56
71
|
return unless node.ternary? && !infinite_loop? && offense?(node)
|
57
72
|
|
58
73
|
add_offense(node, location: node.source_range)
|
59
74
|
end
|
60
75
|
|
76
|
+
def only_closing_parenthesis_is_last_line?(condition)
|
77
|
+
condition.source.split("\n").last == ')'
|
78
|
+
end
|
79
|
+
|
61
80
|
def autocorrect(node)
|
62
81
|
condition = node.condition
|
63
82
|
|
@@ -108,7 +127,7 @@ module RuboCop
|
|
108
127
|
end
|
109
128
|
|
110
129
|
def non_complex_send?(node)
|
111
|
-
return false unless node.
|
130
|
+
return false unless node.call_type?
|
112
131
|
|
113
132
|
!node.operator_method? || node.method?(:[])
|
114
133
|
end
|
@@ -149,7 +168,8 @@ module RuboCop
|
|
149
168
|
|
150
169
|
def unsafe_autocorrect?(condition)
|
151
170
|
condition.children.any? do |child|
|
152
|
-
unparenthesized_method_call?(child)
|
171
|
+
unparenthesized_method_call?(child) ||
|
172
|
+
below_ternary_precedence?(child)
|
153
173
|
end
|
154
174
|
end
|
155
175
|
|
@@ -157,7 +177,16 @@ module RuboCop
|
|
157
177
|
method_name(child) =~ /^[a-z]/i && !child.parenthesized?
|
158
178
|
end
|
159
179
|
|
160
|
-
|
180
|
+
def below_ternary_precedence?(child)
|
181
|
+
# Handle English "or", e.g. 'foo or bar ? a : b'
|
182
|
+
(child.or_type? && child.semantic_operator?) ||
|
183
|
+
# Handle English "and", e.g. 'foo and bar ? a : b'
|
184
|
+
(child.and_type? && child.semantic_operator?) ||
|
185
|
+
# Handle English "not", e.g. 'not foo ? a : b'
|
186
|
+
(child.send_type? && child.prefix_not?)
|
187
|
+
end
|
188
|
+
|
189
|
+
def_node_matcher :method_name, <<~PATTERN
|
161
190
|
{($:defined? (send nil? _) ...)
|
162
191
|
(send {_ nil?} $_ _ ...)}
|
163
192
|
PATTERN
|
@@ -42,7 +42,7 @@ module RuboCop
|
|
42
42
|
def on_def(node)
|
43
43
|
return unless trailing_end?(node)
|
44
44
|
|
45
|
-
add_offense(node
|
45
|
+
add_offense(node, location: end_token(node).pos)
|
46
46
|
end
|
47
47
|
|
48
48
|
def autocorrect(node)
|
@@ -61,7 +61,7 @@ module RuboCop
|
|
61
61
|
end
|
62
62
|
|
63
63
|
def end_token(node)
|
64
|
-
|
64
|
+
tokens(node).reverse.find(&:end?)
|
65
65
|
end
|
66
66
|
|
67
67
|
def body_and_end_on_same_line?(node)
|
@@ -69,10 +69,8 @@ module RuboCop
|
|
69
69
|
end
|
70
70
|
|
71
71
|
def token_before_end(node)
|
72
|
-
|
73
|
-
|
74
|
-
tokens(node)[i - 1]
|
75
|
-
end
|
72
|
+
i = tokens(node).index(end_token(node))
|
73
|
+
tokens(node)[i - 1]
|
76
74
|
end
|
77
75
|
|
78
76
|
def break_line_before_end(node, corrector)
|
@@ -118,7 +118,7 @@ module RuboCop
|
|
118
118
|
!allowed_method?(node) && !allowed_writer?(node.method_name)
|
119
119
|
end
|
120
120
|
|
121
|
-
def_node_matcher :looks_like_trivial_writer?,
|
121
|
+
def_node_matcher :looks_like_trivial_writer?, <<~PATTERN
|
122
122
|
{(def _ (args (arg ...)) (ivasgn _ (lvar _)))
|
123
123
|
(defs _ _ (args (arg ...)) (ivasgn _ (lvar _)))}
|
124
124
|
PATTERN
|
@@ -55,7 +55,7 @@ module RuboCop
|
|
55
55
|
MSG = 'Use `%<suggestion>s` instead of '\
|
56
56
|
'`%<sorter>s...%<accessor_source>s`.'
|
57
57
|
|
58
|
-
def_node_matcher :unneeded_sort?,
|
58
|
+
def_node_matcher :unneeded_sort?, <<~MATCHER
|
59
59
|
{
|
60
60
|
(send $(send _ $:sort ...) ${:last :first})
|
61
61
|
(send $(send _ $:sort ...) ${:[] :at :slice} {(int 0) (int -1)})
|
@@ -25,7 +25,7 @@ module RuboCop
|
|
25
25
|
MSG = 'Use `%<receiver>s.unpack1(%<format>s)` instead of '\
|
26
26
|
'`%<receiver>s.unpack(%<format>s)%<method>s`.'
|
27
27
|
|
28
|
-
def_node_matcher :unpack_and_first_element?,
|
28
|
+
def_node_matcher :unpack_and_first_element?, <<~PATTERN
|
29
29
|
{
|
30
30
|
(send $(send (...) :unpack $(...)) :first)
|
31
31
|
(send $(send (...) :unpack $(...)) {:[] :slice :at} (int 0))
|
@@ -16,19 +16,15 @@ module RuboCop
|
|
16
16
|
# /check #{$pattern}/
|
17
17
|
# "Let's go to the #{@store}"
|
18
18
|
class VariableInterpolation < Cop
|
19
|
+
include Interpolation
|
20
|
+
|
19
21
|
MSG = 'Replace interpolated variable `%<variable>s` ' \
|
20
22
|
'with expression `#{%<variable>s}`.'
|
21
23
|
|
22
|
-
def
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
def on_regexp(node)
|
27
|
-
check_for_interpolation(node)
|
28
|
-
end
|
29
|
-
|
30
|
-
def on_xstr(node)
|
31
|
-
check_for_interpolation(node)
|
24
|
+
def on_node_with_interpolations(node)
|
25
|
+
var_nodes(node.children).each do |var_node|
|
26
|
+
add_offense(var_node)
|
27
|
+
end
|
32
28
|
end
|
33
29
|
|
34
30
|
def autocorrect(node)
|
@@ -39,12 +35,6 @@ module RuboCop
|
|
39
35
|
|
40
36
|
private
|
41
37
|
|
42
|
-
def check_for_interpolation(node)
|
43
|
-
var_nodes(node.children).each do |var_node|
|
44
|
-
add_offense(var_node)
|
45
|
-
end
|
46
|
-
end
|
47
|
-
|
48
38
|
def message(node)
|
49
39
|
format(MSG, variable: node.source)
|
50
40
|
end
|
@@ -71,8 +71,8 @@ module RuboCop
|
|
71
71
|
|
72
72
|
def complex_content?(strings)
|
73
73
|
strings.any? do |s|
|
74
|
-
string = s.str_content
|
75
|
-
!string.
|
74
|
+
string = s.str_content.dup.force_encoding(::Encoding::UTF_8)
|
75
|
+
!string.valid_encoding? ||
|
76
76
|
string !~ word_regex || string =~ / /
|
77
77
|
end
|
78
78
|
end
|
@@ -7,7 +7,7 @@ module RuboCop
|
|
7
7
|
# by a predicate method, such as receiver.length == 0,
|
8
8
|
# receiver.length > 0, receiver.length != 0,
|
9
9
|
# receiver.length < 1 and receiver.size == 0 that can be
|
10
|
-
# replaced by receiver.empty? and !receiver.empty
|
10
|
+
# replaced by receiver.empty? and !receiver.empty?.
|
11
11
|
#
|
12
12
|
# @example
|
13
13
|
# # bad
|
@@ -73,14 +73,14 @@ module RuboCop
|
|
73
73
|
)
|
74
74
|
end
|
75
75
|
|
76
|
-
def_node_matcher :zero_length_predicate,
|
76
|
+
def_node_matcher :zero_length_predicate, <<~PATTERN
|
77
77
|
{(send (send (...) ${:length :size}) $:== (int $0))
|
78
78
|
(send (int $0) $:== (send (...) ${:length :size}))
|
79
79
|
(send (send (...) ${:length :size}) $:< (int $1))
|
80
80
|
(send (int $1) $:> (send (...) ${:length :size}))}
|
81
81
|
PATTERN
|
82
82
|
|
83
|
-
def_node_matcher :nonzero_length_predicate,
|
83
|
+
def_node_matcher :nonzero_length_predicate, <<~PATTERN
|
84
84
|
{(send (send (...) ${:length :size}) ${:> :!=} (int $0))
|
85
85
|
(send (int $0) ${:< :!=} (send (...) ${:length :size}))}
|
86
86
|
PATTERN
|
@@ -92,14 +92,14 @@ module RuboCop
|
|
92
92
|
"!#{other_receiver(node).source}.empty?"
|
93
93
|
end
|
94
94
|
|
95
|
-
def_node_matcher :zero_length_receiver,
|
95
|
+
def_node_matcher :zero_length_receiver, <<~PATTERN
|
96
96
|
{(send (send $_ _) :== (int 0))
|
97
97
|
(send (int 0) :== (send $_ _))
|
98
98
|
(send (send $_ _) :< (int 1))
|
99
99
|
(send (int 1) :> (send $_ _))}
|
100
100
|
PATTERN
|
101
101
|
|
102
|
-
def_node_matcher :other_receiver,
|
102
|
+
def_node_matcher :other_receiver, <<~PATTERN
|
103
103
|
{(send (send $_ _) _ _)
|
104
104
|
(send _ _ (send $_ _))}
|
105
105
|
PATTERN
|
@@ -107,7 +107,7 @@ module RuboCop
|
|
107
107
|
# Some collection like objects in the Ruby standard library
|
108
108
|
# implement `#size`, but not `#empty`. We ignore those to
|
109
109
|
# reduce false positives.
|
110
|
-
def_node_matcher :non_polymorphic_collection?,
|
110
|
+
def_node_matcher :non_polymorphic_collection?, <<~PATTERN
|
111
111
|
{(send (send (send (const nil? :File) :stat _) ...) ...)
|
112
112
|
(send (send (send (const nil? {:Tempfile :StringIO}) {:new :open} ...) ...) ...)}
|
113
113
|
PATTERN
|