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
@@ -68,16 +68,16 @@ module RuboCop
|
|
68
68
|
private
|
69
69
|
|
70
70
|
def expand_elsif(node, elsif_branches = [])
|
71
|
-
return [] if node.nil? || !node.if_type?
|
71
|
+
return [] if node.nil? || !node.if_type? || !node.elsif?
|
72
72
|
|
73
73
|
elsif_branches << node.if_branch
|
74
74
|
|
75
|
-
|
76
|
-
|
75
|
+
else_branch = node.else_branch
|
76
|
+
if else_branch&.if_type? && else_branch&.elsif?
|
77
|
+
expand_elsif(else_branch, elsif_branches)
|
77
78
|
else
|
78
|
-
elsif_branches <<
|
79
|
+
elsif_branches << else_branch
|
79
80
|
end
|
80
|
-
elsif_branches
|
81
81
|
end
|
82
82
|
|
83
83
|
def lhs_for_send(node)
|
@@ -219,11 +219,9 @@ module RuboCop
|
|
219
219
|
SINGLE_LINE_CONDITIONS_ONLY = 'SingleLineConditionsOnly'
|
220
220
|
WIDTH = 'Width'
|
221
221
|
|
222
|
-
def_node_matcher :condition?, '{if case}'
|
223
|
-
|
224
222
|
# The shovel operator `<<` does not have its own type. It is a `send`
|
225
223
|
# type.
|
226
|
-
def_node_matcher :assignment_type?,
|
224
|
+
def_node_matcher :assignment_type?, <<~PATTERN
|
227
225
|
{
|
228
226
|
#{ASSIGNMENT_TYPES.join(' ')}
|
229
227
|
(send _recv {:[]= :<< :=~ :!~ :<=> #end_with_eq?} ...)
|
@@ -596,7 +594,8 @@ module RuboCop
|
|
596
594
|
|
597
595
|
remove_whitespace_in_branches(corrector, branch, condition, column)
|
598
596
|
|
599
|
-
branch_else = branch.parent.loc.else
|
597
|
+
return unless (branch_else = branch.parent.loc.else)
|
598
|
+
|
600
599
|
corrector.remove_preceding(branch_else, branch_else.column - column)
|
601
600
|
end
|
602
601
|
end
|
@@ -46,7 +46,14 @@ module RuboCop
|
|
46
46
|
end
|
47
47
|
|
48
48
|
def class_or_module_scope?(node)
|
49
|
-
|
49
|
+
return false unless node.parent
|
50
|
+
|
51
|
+
case node.parent.type
|
52
|
+
when :begin
|
53
|
+
class_or_module_scope?(node.parent)
|
54
|
+
when :class, :module
|
55
|
+
true
|
56
|
+
end
|
50
57
|
end
|
51
58
|
|
52
59
|
def visibility_declaration?(node)
|
@@ -57,9 +64,13 @@ module RuboCop
|
|
57
64
|
end
|
58
65
|
end
|
59
66
|
|
60
|
-
def_node_matcher :visibility_declaration_for?,
|
61
|
-
(send nil? {:public_constant :private_constant} ({sym str} %1))
|
67
|
+
def_node_matcher :visibility_declaration_for?, <<~PATTERN
|
68
|
+
(send nil? {:public_constant :private_constant} ({sym str} #match_name?(%1)))
|
62
69
|
PATTERN
|
70
|
+
|
71
|
+
def match_name?(name, constant_name)
|
72
|
+
name.to_sym == constant_name.to_sym
|
73
|
+
end
|
63
74
|
end
|
64
75
|
end
|
65
76
|
end
|
@@ -45,15 +45,15 @@ module RuboCop
|
|
45
45
|
CLASS_MSG = 'Prefer Time over DateTime.'
|
46
46
|
COERCION_MSG = 'Do not use #to_datetime.'
|
47
47
|
|
48
|
-
def_node_matcher :date_time?,
|
48
|
+
def_node_matcher :date_time?, <<~PATTERN
|
49
49
|
(send (const {nil? (cbase)} :DateTime) ...)
|
50
50
|
PATTERN
|
51
51
|
|
52
|
-
def_node_matcher :historic_date?,
|
52
|
+
def_node_matcher :historic_date?, <<~PATTERN
|
53
53
|
(send _ _ _ (const (const nil? :Date) _))
|
54
54
|
PATTERN
|
55
55
|
|
56
|
-
def_node_matcher :to_datetime?,
|
56
|
+
def_node_matcher :to_datetime?, <<~PATTERN
|
57
57
|
(send _ :to_datetime)
|
58
58
|
PATTERN
|
59
59
|
|
@@ -20,7 +20,7 @@ module RuboCop
|
|
20
20
|
MSG = 'Use `__dir__` to get an absolute path to the current ' \
|
21
21
|
"file's directory."
|
22
22
|
|
23
|
-
def_node_matcher :dir_replacement?,
|
23
|
+
def_node_matcher :dir_replacement?, <<~PATTERN
|
24
24
|
{(send (const nil? :File) :expand_path (send (const nil? :File) :dirname #file_keyword?))
|
25
25
|
(send (const nil? :File) :dirname (send (const nil? :File) :realpath #file_keyword?))}
|
26
26
|
PATTERN
|
@@ -47,13 +47,57 @@ module RuboCop
|
|
47
47
|
# def foo.bar
|
48
48
|
# puts baz
|
49
49
|
# end
|
50
|
+
#
|
51
|
+
# @example RequireForNonPublicMethods: false (default)
|
52
|
+
# # good
|
53
|
+
# class Foo
|
54
|
+
# protected
|
55
|
+
# def do_something
|
56
|
+
# end
|
57
|
+
# end
|
58
|
+
#
|
59
|
+
# class Foo
|
60
|
+
# private
|
61
|
+
# def do_something
|
62
|
+
# end
|
63
|
+
# end
|
64
|
+
#
|
65
|
+
# @example RequireForNonPublicMethods: true
|
66
|
+
# # bad
|
67
|
+
# class Foo
|
68
|
+
# protected
|
69
|
+
# def do_something
|
70
|
+
# end
|
71
|
+
# end
|
72
|
+
#
|
73
|
+
# class Foo
|
74
|
+
# private
|
75
|
+
# def do_something
|
76
|
+
# end
|
77
|
+
# end
|
78
|
+
#
|
79
|
+
# # good
|
80
|
+
# class Foo
|
81
|
+
# protected
|
82
|
+
# # Documentation
|
83
|
+
# def do_something
|
84
|
+
# end
|
85
|
+
# end
|
86
|
+
#
|
87
|
+
# class Foo
|
88
|
+
# private
|
89
|
+
# # Documentation
|
90
|
+
# def do_something
|
91
|
+
# end
|
92
|
+
# end
|
93
|
+
#
|
50
94
|
class DocumentationMethod < Cop
|
51
95
|
include DocumentationComment
|
52
96
|
include DefNode
|
53
97
|
|
54
98
|
MSG = 'Missing method documentation comment.'
|
55
99
|
|
56
|
-
def_node_matcher :module_function_node?,
|
100
|
+
def_node_matcher :module_function_node?, <<~PATTERN
|
57
101
|
(send nil? :module_function ...)
|
58
102
|
PATTERN
|
59
103
|
|
@@ -0,0 +1,55 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# rubocop:disable Lint/UnneededCopDisableDirective
|
4
|
+
# rubocop:disable Style/DoubleCopDisableDirective
|
5
|
+
|
6
|
+
module RuboCop
|
7
|
+
module Cop
|
8
|
+
module Style
|
9
|
+
# Detects double disable comments on one line. This is mostly to catch
|
10
|
+
# automatically generated comments that need to be regenerated.
|
11
|
+
#
|
12
|
+
# @example
|
13
|
+
# # bad
|
14
|
+
# def f # rubocop:disable Style/For # rubocop:disable Metrics/AbcSize
|
15
|
+
# end
|
16
|
+
#
|
17
|
+
# # good
|
18
|
+
# # rubocop:disable Metrics/AbcSize
|
19
|
+
# def f # rubocop:disable Style/For
|
20
|
+
# end
|
21
|
+
# # rubocop:enable Metrics/AbcSize
|
22
|
+
#
|
23
|
+
# # if both fit on one line
|
24
|
+
# def f # rubocop:disable Style/For, Metrics/AbcSize
|
25
|
+
# end
|
26
|
+
#
|
27
|
+
class DoubleCopDisableDirective < Cop
|
28
|
+
# rubocop:enable Style/For, Style/DoubleCopDisableDirective
|
29
|
+
# rubocop:enable Lint/UnneededCopDisableDirective, Metrics/AbcSize
|
30
|
+
MSG = 'More than one disable comment on one line.'
|
31
|
+
|
32
|
+
def investigate(processed_source)
|
33
|
+
processed_source.comments.each do |comment|
|
34
|
+
next unless comment.text.scan(/# rubocop:(?:disable|todo)/).size > 1
|
35
|
+
|
36
|
+
add_offense(comment)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def autocorrect(comment)
|
41
|
+
prefix = if comment.text.start_with?('# rubocop:disable')
|
42
|
+
'# rubocop:disable'
|
43
|
+
else
|
44
|
+
'# rubocop:todo'
|
45
|
+
end
|
46
|
+
|
47
|
+
lambda do |corrector|
|
48
|
+
corrector.replace(comment.loc.expression,
|
49
|
+
comment.text[/#{prefix} \S+/])
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
@@ -22,7 +22,7 @@ module RuboCop
|
|
22
22
|
MSG = 'Use `each_with_object` instead of `%<method>s`.'
|
23
23
|
METHODS = %i[inject reduce].freeze
|
24
24
|
|
25
|
-
def_node_matcher :each_with_object_candidate?,
|
25
|
+
def_node_matcher :each_with_object_candidate?, <<~PATTERN
|
26
26
|
(block $(send _ {:inject :reduce} _) $_ $_)
|
27
27
|
PATTERN
|
28
28
|
|
@@ -37,7 +37,7 @@ module RuboCop
|
|
37
37
|
MSG_INCORRECT_LINE = 'Use `%<expected>s` instead of `%<actual>s`, ' \
|
38
38
|
'as they are used by backtraces.'
|
39
39
|
|
40
|
-
def_node_matcher :eval_without_location?,
|
40
|
+
def_node_matcher :eval_without_location?, <<~PATTERN
|
41
41
|
{
|
42
42
|
(send nil? :eval ${str dstr})
|
43
43
|
(send nil? :eval ${str dstr} _)
|
@@ -53,7 +53,7 @@ module RuboCop
|
|
53
53
|
}
|
54
54
|
PATTERN
|
55
55
|
|
56
|
-
def_node_matcher :line_with_offset?,
|
56
|
+
def_node_matcher :line_with_offset?, <<~PATTERN
|
57
57
|
{
|
58
58
|
(send #special_line_keyword? %1 (int %2))
|
59
59
|
(send (int %2) %1 #special_line_keyword?)
|
@@ -18,7 +18,7 @@ module RuboCop
|
|
18
18
|
class EvenOdd < Cop
|
19
19
|
MSG = 'Replace with `Integer#%<method>s?`.'
|
20
20
|
|
21
|
-
def_node_matcher :even_odd_candidate?,
|
21
|
+
def_node_matcher :even_odd_candidate?, <<~PATTERN
|
22
22
|
(send
|
23
23
|
{(send $_ :% (int 2))
|
24
24
|
(begin (send $_ :% (int 2)))}
|
@@ -51,21 +51,21 @@ module RuboCop
|
|
51
51
|
'instead of ' \
|
52
52
|
'`Pathname.new(__FILE__).parent.expand_path`.'
|
53
53
|
|
54
|
-
def_node_matcher :file_expand_path,
|
54
|
+
def_node_matcher :file_expand_path, <<~PATTERN
|
55
55
|
(send
|
56
56
|
(const nil? :File) :expand_path
|
57
57
|
$_
|
58
58
|
$_)
|
59
59
|
PATTERN
|
60
60
|
|
61
|
-
def_node_matcher :pathname_parent_expand_path,
|
61
|
+
def_node_matcher :pathname_parent_expand_path, <<~PATTERN
|
62
62
|
(send
|
63
63
|
(send
|
64
64
|
(send nil? :Pathname
|
65
65
|
$_) :parent) :expand_path)
|
66
66
|
PATTERN
|
67
67
|
|
68
|
-
def_node_matcher :pathname_new_parent_expand_path,
|
68
|
+
def_node_matcher :pathname_new_parent_expand_path, <<~PATTERN
|
69
69
|
(send
|
70
70
|
(send
|
71
71
|
(send
|
@@ -160,7 +160,7 @@ module RuboCop
|
|
160
160
|
def depth(current_path)
|
161
161
|
paths = current_path.split(File::SEPARATOR)
|
162
162
|
|
163
|
-
paths.
|
163
|
+
paths.count { |path| path != '.' }
|
164
164
|
end
|
165
165
|
|
166
166
|
def parent_path(current_path)
|
@@ -0,0 +1,94 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RuboCop
|
4
|
+
module Cop
|
5
|
+
module Style
|
6
|
+
# This cop checks for division with integers coerced to floats.
|
7
|
+
# It is recommended to either always use `fdiv` or coerce one side only.
|
8
|
+
# This cop also provides other options for code consistency.
|
9
|
+
#
|
10
|
+
# @example EnforcedStyle: single_coerce (default)
|
11
|
+
# # bad
|
12
|
+
# a.to_f / b.to_f
|
13
|
+
#
|
14
|
+
# # good
|
15
|
+
# a.to_f / b
|
16
|
+
# a / b.to_f
|
17
|
+
#
|
18
|
+
# @example EnforcedStyle: left_coerce
|
19
|
+
# # bad
|
20
|
+
# a / b.to_f
|
21
|
+
# a.to_f / b.to_f
|
22
|
+
#
|
23
|
+
# # good
|
24
|
+
# a.to_f / b
|
25
|
+
#
|
26
|
+
# @example EnforcedStyle: right_coerce
|
27
|
+
# # bad
|
28
|
+
# a.to_f / b
|
29
|
+
# a.to_f / b.to_f
|
30
|
+
#
|
31
|
+
# # good
|
32
|
+
# a / b.to_f
|
33
|
+
#
|
34
|
+
# @example EnforcedStyle: fdiv
|
35
|
+
# # bad
|
36
|
+
# a / b.to_f
|
37
|
+
# a.to_f / b
|
38
|
+
# a.to_f / b.to_f
|
39
|
+
#
|
40
|
+
# # good
|
41
|
+
# a.fdiv(b)
|
42
|
+
class FloatDivision < Cop
|
43
|
+
include ConfigurableEnforcedStyle
|
44
|
+
|
45
|
+
def_node_matcher :right_coerce?, <<~PATTERN
|
46
|
+
(send _ :/ (send _ :to_f))
|
47
|
+
PATTERN
|
48
|
+
def_node_matcher :left_coerce?, <<~PATTERN
|
49
|
+
(send (send _ :to_f) :/ _)
|
50
|
+
PATTERN
|
51
|
+
def_node_matcher :both_coerce?, <<~PATTERN
|
52
|
+
(send (send _ :to_f) :/ (send _ :to_f))
|
53
|
+
PATTERN
|
54
|
+
def_node_matcher :any_coerce?, <<~PATTERN
|
55
|
+
{(send _ :/ (send _ :to_f)) (send (send _ :to_f) :/ _)}
|
56
|
+
PATTERN
|
57
|
+
|
58
|
+
def on_send(node)
|
59
|
+
add_offense(node) if offense_condition?(node)
|
60
|
+
end
|
61
|
+
|
62
|
+
private
|
63
|
+
|
64
|
+
def offense_condition?(node)
|
65
|
+
case style
|
66
|
+
when :left_coerce
|
67
|
+
right_coerce?(node)
|
68
|
+
when :right_coerce
|
69
|
+
left_coerce?(node)
|
70
|
+
when :single_coerce
|
71
|
+
both_coerce?(node)
|
72
|
+
when :fdiv
|
73
|
+
any_coerce?(node)
|
74
|
+
else
|
75
|
+
false
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
def message(_node)
|
80
|
+
case style
|
81
|
+
when :left_coerce
|
82
|
+
'Prefer using `.to_f` on the left side.'
|
83
|
+
when :right_coerce
|
84
|
+
'Prefer using `.to_f` on the right side.'
|
85
|
+
when :single_coerce
|
86
|
+
'Prefer using `.to_f` on one side only.'
|
87
|
+
when :fdiv
|
88
|
+
'Prefer using `fdiv` for float divisions.'
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
@@ -40,12 +40,16 @@ module RuboCop
|
|
40
40
|
|
41
41
|
MSG = 'Favor `%<prefer>s` over `%<current>s`.'
|
42
42
|
|
43
|
-
def_node_matcher :formatter,
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
43
|
+
def_node_matcher :formatter, <<~PATTERN
|
44
|
+
{
|
45
|
+
(send nil? ${:sprintf :format} _ _ ...)
|
46
|
+
(send {str dstr} $:% ... )
|
47
|
+
(send !nil? $:% {array hash})
|
48
|
+
}
|
49
|
+
PATTERN
|
50
|
+
|
51
|
+
def_node_matcher :variable_argument?, <<~PATTERN
|
52
|
+
(send {str dstr} :% {send_type? lvar_type?})
|
49
53
|
PATTERN
|
50
54
|
|
51
55
|
def on_send(node)
|
@@ -70,10 +74,10 @@ module RuboCop
|
|
70
74
|
end
|
71
75
|
|
72
76
|
def autocorrect(node)
|
73
|
-
|
74
|
-
detected_method = node.method_name
|
77
|
+
return if variable_argument?(node)
|
75
78
|
|
76
|
-
|
79
|
+
lambda do |corrector|
|
80
|
+
case node.method_name
|
77
81
|
when :%
|
78
82
|
autocorrect_from_percent(corrector, node)
|
79
83
|
when :format, :sprintf
|
@@ -8,7 +8,7 @@ module RuboCop
|
|
8
8
|
# **Note:**
|
9
9
|
# `unannotated` style cop only works for strings
|
10
10
|
# which are passed as arguments to those methods:
|
11
|
-
# `sprintf`, `format`, `%`.
|
11
|
+
# `printf`, `sprintf`, `format`, `%`.
|
12
12
|
# The reason is that *unannotated* format is very similar
|
13
13
|
# to encoded URLs or Date/Time formatting strings.
|
14
14
|
#
|
@@ -41,17 +41,7 @@ module RuboCop
|
|
41
41
|
class FormatStringToken < Cop
|
42
42
|
include ConfigurableEnforcedStyle
|
43
43
|
|
44
|
-
FIELD_CHARACTERS = Regexp.union(%w[A B E G X a b c d e f g i o p s u x])
|
45
|
-
FORMAT_STRING_METHODS = %i[sprintf format %].freeze
|
46
|
-
|
47
|
-
STYLE_PATTERNS = {
|
48
|
-
annotated: /(?<token>%<[^>]+>#{FIELD_CHARACTERS})/,
|
49
|
-
template: /(?<token>%\{[^\}]+\})/,
|
50
|
-
unannotated: /(?<token>%#{FIELD_CHARACTERS})/
|
51
|
-
}.freeze
|
52
|
-
|
53
44
|
def on_str(node)
|
54
|
-
return if placeholder_argument?(node)
|
55
45
|
return if node.each_ancestor(:xstr, :regexp).any?
|
56
46
|
|
57
47
|
tokens(node) do |detected_style, token_range|
|
@@ -68,14 +58,16 @@ module RuboCop
|
|
68
58
|
|
69
59
|
private
|
70
60
|
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
61
|
+
def_node_matcher :format_string_in_typical_context?, <<~PATTERN
|
62
|
+
{
|
63
|
+
^(send _ {:format :sprintf :printf} %0 ...)
|
64
|
+
^(send %0 :% _)
|
65
|
+
}
|
66
|
+
PATTERN
|
76
67
|
|
77
68
|
def unannotated_format?(node, detected_style)
|
78
|
-
detected_style == :unannotated &&
|
69
|
+
detected_style == :unannotated &&
|
70
|
+
!format_string_in_typical_context?(node)
|
79
71
|
end
|
80
72
|
|
81
73
|
def message(detected_style)
|
@@ -102,67 +94,24 @@ module RuboCop
|
|
102
94
|
if source_map.is_a?(Parser::Source::Map::Heredoc)
|
103
95
|
source_map.heredoc_body
|
104
96
|
elsif source_map.begin
|
105
|
-
|
106
|
-
source_map.expression,
|
107
|
-
source_map.expression.begin_pos + 1,
|
108
|
-
source_map.expression.end_pos - 1
|
109
|
-
)
|
97
|
+
source_map.expression.adjust(begin_pos: +1, end_pos: -1)
|
110
98
|
else
|
111
99
|
source_map.expression
|
112
100
|
end
|
113
101
|
end
|
114
102
|
|
115
103
|
def token_ranges(contents)
|
116
|
-
|
117
|
-
detected_style, *range = *offending_match
|
118
|
-
token, contents = split_token(contents, *range)
|
119
|
-
yield(detected_style, token)
|
120
|
-
end
|
121
|
-
end
|
122
|
-
|
123
|
-
def match_token(source_range)
|
124
|
-
supported_styles.each do |style_name|
|
125
|
-
pattern = STYLE_PATTERNS.fetch(style_name)
|
126
|
-
match = source_range.source.match(pattern)
|
127
|
-
next unless match
|
128
|
-
|
129
|
-
return [style_name, match.begin(:token), match.end(:token)]
|
130
|
-
end
|
104
|
+
format_string = RuboCop::Cop::Utils::FormatString.new(contents.source)
|
131
105
|
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
slice_source(
|
138
|
-
source_range,
|
139
|
-
source_range.begin_pos + match_begin,
|
140
|
-
source_range.begin_pos + match_end
|
141
|
-
)
|
142
|
-
|
143
|
-
remainder =
|
144
|
-
slice_source(
|
145
|
-
source_range,
|
146
|
-
source_range.begin_pos + match_end,
|
147
|
-
source_range.end_pos
|
106
|
+
format_string.format_sequences.each do |seq|
|
107
|
+
detected_style = seq.style
|
108
|
+
token = contents.begin.adjust(
|
109
|
+
begin_pos: seq.begin_pos,
|
110
|
+
end_pos: seq.end_pos
|
148
111
|
)
|
149
112
|
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
def slice_source(source_range, new_begin, new_end)
|
154
|
-
Parser::Source::Range.new(
|
155
|
-
source_range.source_buffer,
|
156
|
-
new_begin,
|
157
|
-
new_end
|
158
|
-
)
|
159
|
-
end
|
160
|
-
|
161
|
-
def placeholder_argument?(node)
|
162
|
-
return false unless node.parent
|
163
|
-
return true if node.parent.pair_type?
|
164
|
-
|
165
|
-
placeholder_argument?(node.parent)
|
113
|
+
yield(detected_style, token)
|
114
|
+
end
|
166
115
|
end
|
167
116
|
end
|
168
117
|
end
|