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
@@ -9,6 +9,8 @@ module RuboCop
|
|
9
9
|
NO_SPACE_COMMAND = 'Do not use'
|
10
10
|
SPACE_COMMAND = 'Use'
|
11
11
|
|
12
|
+
SINGLE_SPACE_REGEXP = /[ \t]/.freeze
|
13
|
+
|
12
14
|
private
|
13
15
|
|
14
16
|
def side_space_range(range:, side:)
|
@@ -18,11 +20,11 @@ module RuboCop
|
|
18
20
|
begin_pos = range.begin_pos
|
19
21
|
end_pos = range.end_pos
|
20
22
|
if side == :left
|
23
|
+
end_pos = begin_pos
|
21
24
|
begin_pos = reposition(src, begin_pos, -1)
|
22
|
-
end_pos -= 1
|
23
25
|
end
|
24
26
|
if side == :right
|
25
|
-
begin_pos
|
27
|
+
begin_pos = end_pos
|
26
28
|
end_pos = reposition(src, end_pos, 1)
|
27
29
|
end
|
28
30
|
Parser::Source::Range.new(buffer, begin_pos, end_pos)
|
@@ -85,15 +87,15 @@ module RuboCop
|
|
85
87
|
return false unless token
|
86
88
|
|
87
89
|
if side == :left
|
88
|
-
String(token.space_after?)
|
90
|
+
String(token.space_after?) =~ SINGLE_SPACE_REGEXP
|
89
91
|
else
|
90
|
-
String(token.space_before?)
|
92
|
+
String(token.space_before?) =~ SINGLE_SPACE_REGEXP
|
91
93
|
end
|
92
94
|
end
|
93
95
|
|
94
96
|
def reposition(src, pos, step)
|
95
97
|
offset = step == -1 ? -1 : 0
|
96
|
-
pos += step while src[pos + offset] =~
|
98
|
+
pos += step while src[pos + offset] =~ SINGLE_SPACE_REGEXP
|
97
99
|
pos.negative? ? 0 : pos
|
98
100
|
end
|
99
101
|
|
@@ -20,7 +20,7 @@ module RuboCop
|
|
20
20
|
OP_LIKE_METHODS = %i[eql? equal?].freeze
|
21
21
|
BLACKLISTED = %i[+@ -@ [] []= << === `].freeze
|
22
22
|
|
23
|
-
def_node_matcher :op_method_candidate?,
|
23
|
+
def_node_matcher :op_method_candidate?, <<~PATTERN
|
24
24
|
(def [#op_method? $_] (args $(arg [!:other !:_other])) _)
|
25
25
|
PATTERN
|
26
26
|
|
@@ -23,7 +23,7 @@ module RuboCop
|
|
23
23
|
# than just standard ASCII characters
|
24
24
|
SNAKE_CASE = /^[[:digit:][:upper:]_]+$/.freeze
|
25
25
|
|
26
|
-
def_node_matcher :class_or_struct_return_method?,
|
26
|
+
def_node_matcher :class_or_struct_return_method?, <<~PATTERN
|
27
27
|
(send
|
28
28
|
(const _ {:Class :Struct}) :new
|
29
29
|
...)
|
@@ -63,7 +63,7 @@ module RuboCop
|
|
63
63
|
(node.receiver.nil? || !literal_receiver?(node))
|
64
64
|
end
|
65
65
|
|
66
|
-
def_node_matcher :literal_receiver?,
|
66
|
+
def_node_matcher :literal_receiver?, <<~PATTERN
|
67
67
|
{(send literal? ...)
|
68
68
|
(send (begin literal?) ...)}
|
69
69
|
PATTERN
|
@@ -6,6 +6,15 @@ module RuboCop
|
|
6
6
|
# This cop makes sure that all methods use the configured style,
|
7
7
|
# snake_case or camelCase, for their names.
|
8
8
|
#
|
9
|
+
# This cop has `IgnoredPatterns` configuration option.
|
10
|
+
#
|
11
|
+
# Naming/MethodName:
|
12
|
+
# IgnoredPatterns:
|
13
|
+
# - '\A\s*onSelectionBulkChange\s*'
|
14
|
+
# - '\A\s*onSelectionCleared\s*'
|
15
|
+
#
|
16
|
+
# Method names matching patterns are always allowed.
|
17
|
+
#
|
9
18
|
# @example EnforcedStyle: snake_case (default)
|
10
19
|
# # bad
|
11
20
|
# def fooBar; end
|
@@ -21,11 +30,13 @@ module RuboCop
|
|
21
30
|
# def fooBar; end
|
22
31
|
class MethodName < Cop
|
23
32
|
include ConfigurableNaming
|
33
|
+
include IgnoredPattern
|
24
34
|
|
25
35
|
MSG = 'Use %<style>s for method names.'
|
26
36
|
|
27
37
|
def on_def(node)
|
28
|
-
return if node.operator_method?
|
38
|
+
return if node.operator_method? ||
|
39
|
+
matches_ignored_pattern?(node.method_name)
|
29
40
|
|
30
41
|
check_name(node, node.method_name, node.loc.name)
|
31
42
|
end
|
@@ -57,24 +57,20 @@ module RuboCop
|
|
57
57
|
MSG = 'Use `%<preferred>s` instead of `%<bad>s`.'
|
58
58
|
|
59
59
|
def on_resbody(node)
|
60
|
-
|
61
|
-
return unless
|
62
|
-
|
63
|
-
@exception_name ||= exception_type.children.first
|
64
|
-
return if @exception_name.const_type? ||
|
65
|
-
variable_name == preferred_name
|
60
|
+
name = variable_name(node)
|
61
|
+
return unless name
|
62
|
+
return if preferred_name(name).to_sym == name
|
66
63
|
|
67
64
|
add_offense(node, location: offense_range(node))
|
68
65
|
end
|
69
66
|
|
70
67
|
def autocorrect(node)
|
71
68
|
lambda do |corrector|
|
72
|
-
offending_name = node
|
69
|
+
offending_name = variable_name(node)
|
70
|
+
preferred_name = preferred_name(offending_name)
|
73
71
|
corrector.replace(offense_range(node), preferred_name)
|
74
72
|
|
75
|
-
|
76
|
-
|
77
|
-
node.body.each_descendant(:lvar) do |var|
|
73
|
+
node.body&.each_descendant(:lvar) do |var|
|
78
74
|
next unless var.children.first == offending_name
|
79
75
|
|
80
76
|
corrector.replace(var.loc.expression, preferred_name)
|
@@ -89,21 +85,26 @@ module RuboCop
|
|
89
85
|
variable.loc.expression
|
90
86
|
end
|
91
87
|
|
92
|
-
def preferred_name
|
93
|
-
|
94
|
-
variable_name.to_s.start_with?('_')
|
88
|
+
def preferred_name(variable_name)
|
89
|
+
preferred_name = cop_config.fetch('PreferredName', 'e')
|
90
|
+
if variable_name.to_s.start_with?('_')
|
91
|
+
"_#{preferred_name}"
|
92
|
+
else
|
93
|
+
preferred_name
|
94
|
+
end
|
95
95
|
end
|
96
96
|
|
97
|
-
def variable_name
|
98
|
-
|
99
|
-
|
97
|
+
def variable_name(node)
|
98
|
+
asgn_node = node.exception_variable
|
99
|
+
return unless asgn_node
|
100
100
|
|
101
|
-
|
102
|
-
@exception_name.loc.expression
|
101
|
+
asgn_node.children.last
|
103
102
|
end
|
104
103
|
|
105
|
-
def message(
|
106
|
-
|
104
|
+
def message(node)
|
105
|
+
offending_name = variable_name(node)
|
106
|
+
preferred_name = preferred_name(offending_name)
|
107
|
+
format(MSG, preferred: preferred_name, bad: offending_name)
|
107
108
|
end
|
108
109
|
end
|
109
110
|
end
|
data/lib/rubocop/cop/offense.rb
CHANGED
@@ -67,23 +67,34 @@ module RuboCop
|
|
67
67
|
|
68
68
|
# @api public
|
69
69
|
#
|
70
|
-
# @!attribute [r] corrected
|
70
|
+
# @!attribute [r] corrected?
|
71
71
|
#
|
72
72
|
# @return [Boolean]
|
73
|
-
# whether this offense is automatically corrected
|
74
|
-
|
75
|
-
|
73
|
+
# whether this offense is automatically corrected via
|
74
|
+
# autocorrect or a todo.
|
75
|
+
def corrected?
|
76
|
+
@status == :corrected || @status == :corrected_with_todo
|
77
|
+
end
|
78
|
+
|
79
|
+
# @api public
|
80
|
+
#
|
81
|
+
# @!attribute [r] corrected_with_todo?
|
82
|
+
#
|
83
|
+
# @return [Boolean]
|
84
|
+
# whether this offense is automatically disabled via a todo.
|
85
|
+
def corrected_with_todo?
|
86
|
+
@status == :corrected_with_todo
|
76
87
|
end
|
77
|
-
alias corrected? corrected
|
78
88
|
|
79
89
|
# @api public
|
80
90
|
#
|
81
91
|
# @!attribute [r] disabled?
|
82
92
|
#
|
83
93
|
# @return [Boolean]
|
84
|
-
# whether this offense was locally disabled
|
94
|
+
# whether this offense was locally disabled with a
|
95
|
+
# disable or todo where it occurred.
|
85
96
|
def disabled?
|
86
|
-
@status == :disabled
|
97
|
+
@status == :disabled || @status == :todo
|
87
98
|
end
|
88
99
|
|
89
100
|
# @api public
|
data/lib/rubocop/cop/registry.rb
CHANGED
@@ -91,8 +91,11 @@ module RuboCop
|
|
91
91
|
# @note Emits a warning if the provided name has an incorrect namespace
|
92
92
|
#
|
93
93
|
# @return [String] Qualified cop name
|
94
|
-
def qualified_cop_name(name, path)
|
94
|
+
def qualified_cop_name(name, path, shall_warn = true)
|
95
95
|
badge = Badge.parse(name)
|
96
|
+
if shall_warn && department_missing?(badge, name)
|
97
|
+
print_warning(name, path)
|
98
|
+
end
|
96
99
|
return name if registered?(badge)
|
97
100
|
|
98
101
|
potential_badges = qualify_badge(badge)
|
@@ -104,6 +107,24 @@ module RuboCop
|
|
104
107
|
end
|
105
108
|
end
|
106
109
|
|
110
|
+
def department_missing?(badge, name)
|
111
|
+
!badge.qualified? && unqualified_cop_names.include?(name)
|
112
|
+
end
|
113
|
+
|
114
|
+
def print_warning(name, path)
|
115
|
+
message = "#{path}: Warning: no department given for #{name}."
|
116
|
+
if path.end_with?('.rb')
|
117
|
+
message += ' Run `rubocop -a --only Migration/DepartmentName` to fix.'
|
118
|
+
end
|
119
|
+
warn message
|
120
|
+
end
|
121
|
+
|
122
|
+
def unqualified_cop_names
|
123
|
+
@unqualified_cop_names ||=
|
124
|
+
Set.new(@cops_by_cop_name.keys.map { |qn| File.basename(qn) }) <<
|
125
|
+
'UnneededCopDisableDirective'
|
126
|
+
end
|
127
|
+
|
107
128
|
# @return [Hash{String => Array<Class>}]
|
108
129
|
def to_h
|
109
130
|
@cops_by_cop_name
|
@@ -21,7 +21,7 @@ module RuboCop
|
|
21
21
|
class MarshalLoad < Cop
|
22
22
|
MSG = 'Avoid using `Marshal.%<method>s`.'
|
23
23
|
|
24
|
-
def_node_matcher :marshal_load,
|
24
|
+
def_node_matcher :marshal_load, <<~PATTERN
|
25
25
|
(send (const {nil? cbase} :Marshal) ${:load :restore}
|
26
26
|
!(send (const {nil? cbase} :Marshal) :dump ...))
|
27
27
|
PATTERN
|
@@ -114,7 +114,8 @@ module RuboCop
|
|
114
114
|
|
115
115
|
def on_send(node)
|
116
116
|
return unless node.arguments?
|
117
|
-
return if node.parenthesized?
|
117
|
+
return if node.parenthesized?
|
118
|
+
return if node.operator_method? || node.assignment_method?
|
118
119
|
|
119
120
|
node.arguments.each do |arg|
|
120
121
|
get_blocks(arg) do |block|
|
@@ -55,10 +55,6 @@ module RuboCop
|
|
55
55
|
end
|
56
56
|
alias on_csend on_send
|
57
57
|
|
58
|
-
# We let AutocorrectUnlessChangingAST#autocorrect work with the send
|
59
|
-
# node, because that context is needed. When parsing the code to see if
|
60
|
-
# the AST has changed, a braceless hash would not be parsed as a hash
|
61
|
-
# otherwise.
|
62
58
|
def autocorrect(send_node)
|
63
59
|
hash_node = send_node.last_argument
|
64
60
|
|
@@ -76,20 +72,32 @@ module RuboCop
|
|
76
72
|
private
|
77
73
|
|
78
74
|
def check(arg, args)
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
75
|
+
case style
|
76
|
+
when :braces
|
77
|
+
check_braces(arg)
|
78
|
+
when :no_braces
|
79
|
+
check_no_braces(arg)
|
80
|
+
when :context_dependent
|
84
81
|
check_context_dependent(arg, args)
|
85
82
|
end
|
86
83
|
end
|
87
84
|
|
85
|
+
def check_braces(arg)
|
86
|
+
add_arg_offense(arg, :missing) unless arg.braces?
|
87
|
+
end
|
88
|
+
|
89
|
+
def check_no_braces(arg)
|
90
|
+
return unless arg.braces? && !braces_needed_for_semantics?(arg)
|
91
|
+
|
92
|
+
add_arg_offense(arg, :redundant)
|
93
|
+
end
|
94
|
+
|
88
95
|
def check_context_dependent(arg, args)
|
89
96
|
braces_around_second_from_end = args.size > 1 && args[-2].hash_type?
|
90
97
|
|
91
98
|
if arg.braces?
|
92
|
-
unless braces_around_second_from_end
|
99
|
+
unless braces_around_second_from_end ||
|
100
|
+
braces_needed_for_semantics?(arg)
|
93
101
|
add_arg_offense(arg, :redundant)
|
94
102
|
end
|
95
103
|
elsif braces_around_second_from_end
|
@@ -97,6 +105,17 @@ module RuboCop
|
|
97
105
|
end
|
98
106
|
end
|
99
107
|
|
108
|
+
# Returns true if there's block inside the braces of the given hash arg
|
109
|
+
# and that block uses do..end. The reason for wanting to check this is
|
110
|
+
# that the do..end could bind to a different method invocation if the
|
111
|
+
# hash braces were removed.
|
112
|
+
def braces_needed_for_semantics?(arg)
|
113
|
+
arg.each_pair do |_key, value|
|
114
|
+
return true if value.block_type? && !value.braces?
|
115
|
+
end
|
116
|
+
false
|
117
|
+
end
|
118
|
+
|
100
119
|
def add_arg_offense(arg, type)
|
101
120
|
add_offense(arg.parent, location: arg.source_range,
|
102
121
|
message: format(MSG,
|
@@ -6,7 +6,8 @@ module RuboCop
|
|
6
6
|
# This cop checks for comments put on the same line as some keywords.
|
7
7
|
# These keywords are: `begin`, `class`, `def`, `end`, `module`.
|
8
8
|
#
|
9
|
-
# Note that some comments
|
9
|
+
# Note that some comments
|
10
|
+
# (`:nodoc:`, `:yields:`, `rubocop:disable` and `rubocop:todo`)
|
10
11
|
# are allowed.
|
11
12
|
#
|
12
13
|
# @example
|
@@ -33,53 +34,38 @@ module RuboCop
|
|
33
34
|
# y
|
34
35
|
# end
|
35
36
|
class CommentedKeyword < Cop
|
36
|
-
include RangeHelp
|
37
|
-
|
38
37
|
MSG = 'Do not place comments on the same line as the ' \
|
39
38
|
'`%<keyword>s` keyword.'
|
40
39
|
|
41
40
|
def investigate(processed_source)
|
42
|
-
heredoc_lines = extract_heredoc_lines(processed_source.ast)
|
43
|
-
|
44
41
|
processed_source.each_comment do |comment|
|
45
|
-
|
46
|
-
line_position = location.line
|
47
|
-
line = processed_source.lines[line_position - 1]
|
48
|
-
next if heredoc_lines.any? { |r| r.include?(line_position) }
|
49
|
-
next unless offensive?(line)
|
50
|
-
|
51
|
-
range = source_range(processed_source.buffer,
|
52
|
-
line_position,
|
53
|
-
(location.column)...(location.last_column))
|
54
|
-
|
55
|
-
add_offense(range, location: range)
|
42
|
+
add_offense(comment) if offensive?(comment)
|
56
43
|
end
|
57
44
|
end
|
58
45
|
|
59
46
|
private
|
60
47
|
|
61
48
|
KEYWORDS = %w[begin class def end module].freeze
|
62
|
-
ALLOWED_COMMENTS = %w[
|
49
|
+
ALLOWED_COMMENTS = %w[
|
50
|
+
:nodoc:
|
51
|
+
:yields:
|
52
|
+
rubocop:disable
|
53
|
+
rubocop:todo
|
54
|
+
].freeze
|
63
55
|
|
64
|
-
def offensive?(
|
65
|
-
line = line
|
66
|
-
KEYWORDS.any? { |word| line =~
|
56
|
+
def offensive?(comment)
|
57
|
+
line = line(comment)
|
58
|
+
KEYWORDS.any? { |word| line =~ /^\s*#{word}\s/ } &&
|
67
59
|
ALLOWED_COMMENTS.none? { |c| line =~ /#\s*#{c}/ }
|
68
60
|
end
|
69
61
|
|
70
|
-
def message(
|
71
|
-
|
72
|
-
keyword = /^\s*(\S+).*#/.match(line)[1]
|
62
|
+
def message(comment)
|
63
|
+
keyword = line(comment).match(/(\S+).*#/)[1]
|
73
64
|
format(MSG, keyword: keyword)
|
74
65
|
end
|
75
66
|
|
76
|
-
def
|
77
|
-
|
78
|
-
|
79
|
-
ast.each_node(:str, :dstr, :xstr).select(&:heredoc?).map do |node|
|
80
|
-
body = node.location.heredoc_body
|
81
|
-
(body.first_line...body.last_line)
|
82
|
-
end
|
67
|
+
def line(comment)
|
68
|
+
comment.location.expression.source_line
|
83
69
|
end
|
84
70
|
end
|
85
71
|
end
|