rubocop 0.49.1 → 0.50.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +5 -3
- data/bin/rubocop +1 -1
- data/config/default.yml +160 -99
- data/config/disabled.yml +4 -5
- data/config/enabled.yml +149 -47
- data/lib/rubocop.rb +41 -14
- data/lib/rubocop/ast/builder.rb +4 -1
- data/lib/rubocop/ast/node.rb +36 -42
- data/lib/rubocop/ast/node/args_node.rb +1 -13
- data/lib/rubocop/ast/node/array_node.rb +9 -0
- data/lib/rubocop/ast/node/block_node.rb +9 -0
- data/lib/rubocop/ast/node/def_node.rb +71 -0
- data/lib/rubocop/ast/node/for_node.rb +8 -0
- data/lib/rubocop/ast/node/if_node.rb +10 -2
- data/lib/rubocop/ast/node/mixin/collection_node.rb +15 -0
- data/lib/rubocop/ast/node/mixin/method_dispatch_node.rb +174 -0
- data/lib/rubocop/ast/node/mixin/method_identifier_predicates.rb +89 -0
- data/lib/rubocop/ast/node/mixin/parameterized_node.rb +18 -31
- data/lib/rubocop/ast/node/regexp_node.rb +35 -0
- data/lib/rubocop/ast/node/send_node.rb +1 -154
- data/lib/rubocop/ast/node/super_node.rb +3 -24
- data/lib/rubocop/ast/node/yield_node.rb +21 -0
- data/lib/rubocop/ast/traversal.rb +6 -6
- data/lib/rubocop/cli.rb +7 -3
- data/lib/rubocop/config.rb +45 -8
- data/lib/rubocop/config_loader.rb +7 -5
- data/lib/rubocop/cop/bundler/duplicated_gem.rb +3 -3
- data/lib/rubocop/cop/bundler/insecure_protocol_source.rb +64 -0
- data/lib/rubocop/cop/bundler/ordered_gems.rb +12 -12
- data/lib/rubocop/cop/commissioner.rb +8 -2
- data/lib/rubocop/cop/cop.rb +3 -1
- data/lib/rubocop/cop/generator.rb +94 -21
- data/lib/rubocop/cop/internal_affairs.rb +3 -0
- data/lib/rubocop/cop/internal_affairs/node_type_predicate.rb +14 -3
- data/lib/rubocop/cop/internal_affairs/offense_location_keyword.rb +43 -0
- data/lib/rubocop/cop/internal_affairs/redundant_location_argument.rb +46 -0
- data/lib/rubocop/cop/internal_affairs/redundant_message_argument.rb +49 -0
- data/lib/rubocop/cop/internal_affairs/useless_message_assertion.rb +1 -1
- data/lib/rubocop/cop/layout/access_modifier_indentation.rb +2 -3
- data/lib/rubocop/cop/layout/align_array.rb +2 -2
- data/lib/rubocop/cop/layout/align_hash.rb +2 -2
- data/lib/rubocop/cop/layout/align_parameters.rb +5 -11
- data/lib/rubocop/cop/layout/closing_parenthesis_indentation.rb +5 -5
- data/lib/rubocop/cop/layout/comment_indentation.rb +1 -1
- data/lib/rubocop/cop/layout/dot_position.rb +9 -0
- data/lib/rubocop/cop/layout/else_alignment.rb +30 -13
- data/lib/rubocop/cop/layout/empty_line_between_defs.rb +4 -0
- data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +20 -4
- data/lib/rubocop/cop/layout/empty_lines_around_exception_handling_keywords.rb +3 -3
- data/lib/rubocop/cop/layout/empty_lines_around_method_body.rb +3 -3
- data/lib/rubocop/cop/layout/first_method_parameter_line_break.rb +3 -3
- data/lib/rubocop/cop/layout/first_parameter_indentation.rb +5 -2
- data/lib/rubocop/cop/layout/indent_heredoc.rb +19 -24
- data/lib/rubocop/cop/layout/indentation_consistency.rb +1 -2
- data/lib/rubocop/cop/layout/indentation_width.rb +12 -8
- data/lib/rubocop/cop/layout/leading_comment_space.rb +33 -18
- data/lib/rubocop/cop/layout/multiline_method_call_indentation.rb +20 -17
- data/lib/rubocop/cop/layout/multiline_method_definition_brace_layout.rb +3 -3
- data/lib/rubocop/cop/layout/multiline_operation_indentation.rb +6 -0
- data/lib/rubocop/cop/layout/space_after_colon.rb +7 -0
- data/lib/rubocop/cop/layout/space_after_comma.rb +10 -0
- data/lib/rubocop/cop/layout/space_after_method_name.rb +5 -3
- data/lib/rubocop/cop/layout/space_after_not.rb +1 -1
- data/lib/rubocop/cop/layout/space_around_block_parameters.rb +13 -4
- data/lib/rubocop/cop/layout/space_around_keyword.rb +9 -5
- data/lib/rubocop/cop/layout/space_before_block_braces.rb +54 -5
- data/lib/rubocop/cop/layout/space_before_comment.rb +7 -0
- data/lib/rubocop/cop/layout/space_before_semicolon.rb +7 -0
- data/lib/rubocop/cop/layout/space_inside_array_percent_literal.rb +1 -1
- data/lib/rubocop/cop/layout/space_inside_percent_literal_delimiters.rb +1 -1
- data/lib/rubocop/cop/layout/space_inside_range_literal.rb +1 -1
- data/lib/rubocop/cop/layout/space_inside_string_interpolation.rb +8 -4
- data/lib/rubocop/cop/layout/tab.rb +1 -1
- data/lib/rubocop/cop/lint/ambiguous_block_association.rb +4 -2
- data/lib/rubocop/cop/lint/assignment_in_condition.rb +15 -1
- data/lib/rubocop/cop/lint/block_alignment.rb +15 -6
- data/lib/rubocop/cop/lint/boolean_symbol.rb +38 -0
- data/lib/rubocop/cop/lint/condition_position.rb +5 -1
- data/lib/rubocop/cop/lint/debugger.rb +16 -9
- data/lib/rubocop/cop/lint/def_end_alignment.rb +4 -4
- data/lib/rubocop/cop/lint/duplicate_case_condition.rb +3 -3
- data/lib/rubocop/cop/lint/duplicate_methods.rb +73 -5
- data/lib/rubocop/cop/lint/duplicated_key.rb +1 -1
- data/lib/rubocop/cop/lint/each_with_object_argument.rb +1 -1
- data/lib/rubocop/cop/lint/else_layout.rb +1 -1
- data/lib/rubocop/cop/lint/empty_expression.rb +1 -1
- data/lib/rubocop/cop/lint/empty_interpolation.rb +1 -1
- data/lib/rubocop/cop/lint/empty_when.rb +1 -1
- data/lib/rubocop/cop/lint/ensure_return.rb +1 -1
- data/lib/rubocop/cop/lint/float_out_of_range.rb +5 -5
- data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +35 -40
- data/lib/rubocop/cop/lint/handle_exceptions.rb +1 -1
- data/lib/rubocop/cop/lint/ineffective_access_modifier.rb +18 -13
- data/lib/rubocop/cop/lint/inherit_exception.rb +8 -7
- data/lib/rubocop/cop/lint/interpolation_check.rb +36 -0
- data/lib/rubocop/cop/lint/literal_in_condition.rb +3 -3
- data/lib/rubocop/cop/lint/literal_in_interpolation.rb +1 -1
- data/lib/rubocop/cop/lint/multiple_compare.rb +1 -1
- data/lib/rubocop/cop/lint/nested_method_definition.rb +5 -7
- data/lib/rubocop/cop/lint/next_without_accumulator.rb +1 -1
- data/lib/rubocop/cop/lint/percent_string_array.rb +3 -12
- data/lib/rubocop/cop/lint/percent_symbol_array.rb +1 -1
- data/lib/rubocop/cop/lint/rand_one.rb +7 -1
- data/lib/rubocop/cop/lint/redundant_with_index.rb +77 -0
- data/lib/rubocop/cop/lint/require_parentheses.rb +1 -1
- data/lib/rubocop/cop/lint/rescue_exception.rb +1 -1
- data/lib/rubocop/cop/lint/rescue_type.rb +13 -6
- data/lib/rubocop/cop/lint/rescue_without_error_class.rb +38 -0
- data/lib/rubocop/cop/lint/return_in_void_context.rb +63 -0
- data/lib/rubocop/cop/lint/script_permission.rb +6 -0
- data/lib/rubocop/cop/lint/syntax.rb +17 -20
- data/lib/rubocop/cop/lint/unified_integer.rb +3 -2
- data/lib/rubocop/cop/lint/unneeded_disable.rb +1 -1
- data/lib/rubocop/cop/lint/unneeded_splat_expansion.rb +1 -1
- data/lib/rubocop/cop/lint/unreachable_code.rb +53 -8
- data/lib/rubocop/cop/lint/uri_escape_unescape.rb +74 -0
- data/lib/rubocop/cop/lint/uri_regexp.rb +73 -0
- data/lib/rubocop/cop/lint/useless_access_modifier.rb +4 -8
- data/lib/rubocop/cop/lint/useless_setter_call.rb +10 -11
- data/lib/rubocop/cop/lint/void.rb +29 -23
- data/lib/rubocop/cop/metrics/line_length.rb +2 -2
- data/lib/rubocop/cop/metrics/method_length.rb +8 -3
- data/lib/rubocop/cop/metrics/parameter_lists.rb +5 -2
- data/lib/rubocop/cop/mixin/autocorrect_alignment.rb +1 -1
- data/lib/rubocop/cop/mixin/enforce_superclass.rb +2 -2
- data/lib/rubocop/cop/mixin/first_element_line_break.rb +12 -3
- data/lib/rubocop/cop/mixin/heredoc.rb +28 -0
- data/lib/rubocop/cop/mixin/method_complexity.rb +9 -6
- data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +68 -31
- data/lib/rubocop/cop/mixin/multiline_literal_brace_layout.rb +18 -0
- data/lib/rubocop/cop/mixin/negative_conditional.rb +1 -1
- data/lib/rubocop/cop/mixin/percent_array.rb +52 -0
- data/lib/rubocop/cop/mixin/string_help.rb +1 -1
- data/lib/rubocop/cop/{style → naming}/accessor_method_name.rb +11 -12
- data/lib/rubocop/cop/{style → naming}/ascii_identifiers.rb +1 -1
- data/lib/rubocop/cop/{style/op_method.rb → naming/binary_operator_parameter_name.rb} +2 -2
- data/lib/rubocop/cop/{style → naming}/class_and_module_camel_case.rb +1 -1
- data/lib/rubocop/cop/{style → naming}/constant_name.rb +1 -1
- data/lib/rubocop/cop/{style → naming}/file_name.rb +8 -4
- data/lib/rubocop/cop/naming/heredoc_delimiter_case.rb +68 -0
- data/lib/rubocop/cop/naming/heredoc_delimiter_naming.rb +58 -0
- data/lib/rubocop/cop/{style → naming}/method_name.rb +1 -1
- data/lib/rubocop/cop/{style → naming}/predicate_name.rb +6 -7
- data/lib/rubocop/cop/{style → naming}/variable_name.rb +11 -15
- data/lib/rubocop/cop/{style → naming}/variable_number.rb +1 -1
- data/lib/rubocop/cop/performance/caller.rb +39 -11
- data/lib/rubocop/cop/performance/casecmp.rb +4 -4
- data/lib/rubocop/cop/performance/compare_with_block.rb +4 -4
- data/lib/rubocop/cop/performance/double_start_end_with.rb +4 -4
- data/lib/rubocop/cop/performance/end_with.rb +3 -3
- data/lib/rubocop/cop/performance/fixed_size.rb +1 -1
- data/lib/rubocop/cop/performance/hash_each_methods.rb +66 -25
- data/lib/rubocop/cop/performance/lstrip_rstrip.rb +2 -2
- data/lib/rubocop/cop/performance/range_include.rb +2 -2
- data/lib/rubocop/cop/performance/redundant_block_call.rb +6 -6
- data/lib/rubocop/cop/performance/redundant_match.rb +5 -5
- data/lib/rubocop/cop/performance/redundant_merge.rb +39 -23
- data/lib/rubocop/cop/performance/redundant_sort_by.rb +2 -2
- data/lib/rubocop/cop/performance/regexp_match.rb +13 -5
- data/lib/rubocop/cop/performance/size.rb +1 -1
- data/lib/rubocop/cop/performance/start_with.rb +3 -3
- data/lib/rubocop/cop/performance/times_map.rb +23 -12
- data/lib/rubocop/cop/performance/unfreeze_string.rb +50 -0
- data/lib/rubocop/cop/performance/uri_default_parser.rb +47 -0
- data/lib/rubocop/cop/rails/active_support_aliases.rb +1 -1
- data/lib/rubocop/cop/rails/delegate.rb +36 -7
- data/lib/rubocop/cop/rails/delegate_allow_blank.rb +1 -1
- data/lib/rubocop/cop/rails/enum_uniqueness.rb +2 -2
- data/lib/rubocop/cop/rails/file_path.rb +3 -4
- data/lib/rubocop/cop/rails/find_each.rb +1 -1
- data/lib/rubocop/cop/rails/has_many_or_has_one_dependent.rb +48 -0
- data/lib/rubocop/cop/rails/http_positional_arguments.rb +5 -5
- data/lib/rubocop/cop/rails/not_null_column.rb +1 -1
- data/lib/rubocop/cop/rails/pluralization_grammar.rb +2 -2
- data/lib/rubocop/cop/rails/relative_date_constant.rb +1 -1
- data/lib/rubocop/cop/rails/request_referer.rb +2 -2
- data/lib/rubocop/cop/rails/reversible_migration.rb +12 -12
- data/lib/rubocop/cop/rails/save_bang.rb +8 -6
- data/lib/rubocop/cop/rails/scope_args.rb +1 -1
- data/lib/rubocop/cop/security/eval.rb +2 -2
- data/lib/rubocop/cop/security/json_load.rb +2 -2
- data/lib/rubocop/cop/security/marshal_load.rb +2 -2
- data/lib/rubocop/cop/security/yaml_load.rb +2 -2
- data/lib/rubocop/cop/style/alias.rb +44 -20
- data/lib/rubocop/cop/style/and_or.rb +48 -34
- data/lib/rubocop/cop/style/auto_resource_cleanup.rb +1 -1
- data/lib/rubocop/cop/style/block_comments.rb +3 -1
- data/lib/rubocop/cop/style/block_delimiters.rb +2 -1
- data/lib/rubocop/cop/style/command_literal.rb +20 -9
- data/lib/rubocop/cop/style/conditional_assignment.rb +30 -28
- data/lib/rubocop/cop/style/copyright.rb +10 -10
- data/lib/rubocop/cop/style/def_with_parentheses.rb +6 -5
- data/lib/rubocop/cop/style/dir.rb +52 -0
- data/lib/rubocop/cop/style/documentation_method.rb +2 -6
- data/lib/rubocop/cop/style/empty_case_condition.rb +1 -1
- data/lib/rubocop/cop/style/empty_else.rb +3 -2
- data/lib/rubocop/cop/style/empty_literal.rb +1 -2
- data/lib/rubocop/cop/style/empty_method.rb +27 -17
- data/lib/rubocop/cop/style/flip_flop.rb +2 -2
- data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +1 -1
- data/lib/rubocop/cop/style/guard_clause.rb +4 -2
- data/lib/rubocop/cop/style/hash_syntax.rb +10 -10
- data/lib/rubocop/cop/style/identical_conditional_branches.rb +5 -1
- data/lib/rubocop/cop/style/if_with_semicolon.rb +1 -1
- data/lib/rubocop/cop/style/implicit_runtime_error.rb +4 -3
- data/lib/rubocop/cop/style/inline_comment.rb +1 -1
- data/lib/rubocop/cop/style/inverse_methods.rb +20 -8
- data/lib/rubocop/cop/style/lambda.rb +19 -9
- data/lib/rubocop/cop/style/lambda_call.rb +22 -1
- data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +4 -20
- data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +6 -4
- data/lib/rubocop/cop/style/method_def_parentheses.rb +18 -26
- data/lib/rubocop/cop/style/method_missing.rb +5 -18
- data/lib/rubocop/cop/style/min_max.rb +67 -0
- data/lib/rubocop/cop/style/missing_else.rb +16 -3
- data/lib/rubocop/cop/style/mixin_grouping.rb +2 -2
- data/lib/rubocop/cop/style/module_function.rb +8 -4
- data/lib/rubocop/cop/style/multiline_if_modifier.rb +5 -1
- data/lib/rubocop/cop/style/multiline_memoization.rb +25 -3
- data/lib/rubocop/cop/style/multiline_ternary_operator.rb +1 -1
- data/lib/rubocop/cop/style/multiple_comparison.rb +1 -1
- data/lib/rubocop/cop/style/mutable_constant.rb +2 -6
- data/lib/rubocop/cop/style/negated_if.rb +8 -4
- data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +8 -8
- data/lib/rubocop/cop/style/nested_ternary_operator.rb +1 -1
- data/lib/rubocop/cop/style/non_nil_check.rb +14 -14
- data/lib/rubocop/cop/style/numeric_literal_prefix.rb +6 -2
- data/lib/rubocop/cop/style/numeric_literals.rb +2 -2
- data/lib/rubocop/cop/style/numeric_predicate.rb +8 -4
- data/lib/rubocop/cop/style/one_line_conditional.rb +8 -3
- data/lib/rubocop/cop/style/option_hash.rb +1 -1
- data/lib/rubocop/cop/style/optional_arguments.rb +1 -2
- data/lib/rubocop/cop/style/or_assignment.rb +88 -0
- data/lib/rubocop/cop/style/parallel_assignment.rb +2 -2
- data/lib/rubocop/cop/style/parentheses_around_condition.rb +12 -11
- data/lib/rubocop/cop/style/percent_literal_delimiters.rb +1 -1
- data/lib/rubocop/cop/style/percent_q_literals.rb +2 -2
- data/lib/rubocop/cop/style/perl_backrefs.rb +1 -1
- data/lib/rubocop/cop/style/proc.rb +1 -1
- data/lib/rubocop/cop/style/raise_args.rb +16 -17
- data/lib/rubocop/cop/style/redundant_begin.rb +6 -5
- data/lib/rubocop/cop/style/redundant_conditional.rb +95 -0
- data/lib/rubocop/cop/style/redundant_freeze.rb +1 -1
- data/lib/rubocop/cop/style/redundant_parentheses.rb +13 -11
- data/lib/rubocop/cop/style/redundant_return.rb +23 -11
- data/lib/rubocop/cop/style/redundant_self.rb +18 -9
- data/lib/rubocop/cop/style/regexp_literal.rb +12 -4
- data/lib/rubocop/cop/style/rescue_modifier.rb +1 -1
- data/lib/rubocop/cop/style/return_nil.rb +98 -0
- data/lib/rubocop/cop/style/safe_navigation.rb +80 -43
- data/lib/rubocop/cop/style/single_line_block_params.rb +14 -13
- data/lib/rubocop/cop/style/single_line_methods.rb +9 -13
- data/lib/rubocop/cop/style/special_global_vars.rb +3 -3
- data/lib/rubocop/cop/style/stabby_lambda_parentheses.rb +17 -39
- data/lib/rubocop/cop/style/string_literals_in_interpolation.rb +22 -1
- data/lib/rubocop/cop/style/struct_inheritance.rb +1 -1
- data/lib/rubocop/cop/style/symbol_array.rb +5 -25
- data/lib/rubocop/cop/style/symbol_literal.rb +1 -1
- data/lib/rubocop/cop/style/symbol_proc.rb +3 -18
- data/lib/rubocop/cop/style/ternary_parentheses.rb +14 -10
- data/lib/rubocop/cop/style/trailing_underscore_variable.rb +28 -9
- data/lib/rubocop/cop/style/trivial_accessors.rb +39 -56
- data/lib/rubocop/cop/style/unless_else.rb +1 -1
- data/lib/rubocop/cop/style/unneeded_capital_w.rb +1 -1
- data/lib/rubocop/cop/style/unneeded_interpolation.rb +1 -1
- data/lib/rubocop/cop/style/unneeded_percent_q.rb +1 -1
- data/lib/rubocop/cop/style/variable_interpolation.rb +8 -3
- data/lib/rubocop/cop/style/word_array.rb +7 -24
- data/lib/rubocop/cop/style/yoda_condition.rb +49 -14
- data/lib/rubocop/cop/style/zero_length_predicate.rb +25 -18
- data/lib/rubocop/cop/team.rb +16 -8
- data/lib/rubocop/cop/util.rb +11 -0
- data/lib/rubocop/formatter/disabled_config_formatter.rb +1 -1
- data/lib/rubocop/formatter/formatter_set.rb +2 -1
- data/lib/rubocop/formatter/offense_count_formatter.rb +2 -0
- data/lib/rubocop/formatter/simple_text_formatter.rb +1 -1
- data/lib/rubocop/formatter/tap_formatter.rb +71 -0
- data/lib/rubocop/formatter/worst_offenders_formatter.rb +2 -0
- data/lib/rubocop/node_pattern.rb +44 -26
- data/lib/rubocop/options.rb +1 -0
- data/lib/rubocop/processed_source.rb +3 -1
- data/lib/rubocop/remote_config.rb +5 -1
- data/lib/rubocop/result_cache.rb +1 -0
- data/lib/rubocop/rspec/cop_helper.rb +10 -10
- data/lib/rubocop/rspec/expect_offense.rb +6 -8
- data/lib/rubocop/rspec/shared_examples.rb +8 -8
- data/lib/rubocop/string_util.rb +2 -0
- data/lib/rubocop/version.rb +1 -1
- metadata +51 -18
- data/lib/rubocop/cop/mixin/access_modifier_node.rb +0 -41
- data/lib/rubocop/cop/mixin/on_method_def.rb +0 -44
@@ -0,0 +1,28 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Common functionality for working with heredoc strings.
|
4
|
+
module Heredoc
|
5
|
+
OPENING_DELIMITER = /<<[~-]?'?(\w+)'?\b/
|
6
|
+
|
7
|
+
def on_str(node)
|
8
|
+
return unless heredoc?(node)
|
9
|
+
|
10
|
+
on_heredoc(node)
|
11
|
+
end
|
12
|
+
alias on_dstr on_str
|
13
|
+
alias on_xstr on_str
|
14
|
+
|
15
|
+
def on_heredoc(_node)
|
16
|
+
raise NotImplementedError
|
17
|
+
end
|
18
|
+
|
19
|
+
private
|
20
|
+
|
21
|
+
def heredoc?(node)
|
22
|
+
node.loc.is_a?(Parser::Source::Map::Heredoc)
|
23
|
+
end
|
24
|
+
|
25
|
+
def delimiter_string(node)
|
26
|
+
node.source.match(OPENING_DELIMITER).captures.first
|
27
|
+
end
|
28
|
+
end
|
@@ -4,21 +4,24 @@ module RuboCop
|
|
4
4
|
module Cop
|
5
5
|
# This module handles measurement and reporting of complexity in methods.
|
6
6
|
module MethodComplexity
|
7
|
-
include OnMethodDef
|
8
7
|
include ConfigurableMax
|
9
8
|
|
10
|
-
|
11
|
-
|
12
|
-
def on_method_def(node, method_name, _args, _body)
|
9
|
+
def on_def(node)
|
13
10
|
max = cop_config['Max']
|
14
11
|
complexity = complexity(node)
|
12
|
+
|
15
13
|
return unless complexity > max
|
16
14
|
|
17
|
-
add_offense(node, :keyword,
|
18
|
-
|
15
|
+
add_offense(node, :keyword, format(self.class::MSG,
|
16
|
+
node.method_name,
|
17
|
+
complexity,
|
18
|
+
max)) do
|
19
19
|
self.max = complexity.ceil
|
20
20
|
end
|
21
21
|
end
|
22
|
+
alias on_defs on_def
|
23
|
+
|
24
|
+
private
|
22
25
|
|
23
26
|
def complexity(node)
|
24
27
|
node.each_node(*self.class::COUNTED_NODES).reduce(1) do |score, n|
|
@@ -5,6 +5,14 @@ module RuboCop
|
|
5
5
|
# Common functionality for checking multiline method calls and binary
|
6
6
|
# operations.
|
7
7
|
module MultilineExpressionIndentation
|
8
|
+
KEYWORD_ANCESTOR_TYPES = [:for, :return, *Util::MODIFIER_NODES].freeze
|
9
|
+
UNALIGNED_RHS_TYPES = %i[if while until for return
|
10
|
+
array kwbegin].freeze
|
11
|
+
ASSIGNMENT_RHS_TYPES = [:send, *Util::ASGN_NODES].freeze
|
12
|
+
DEFAULT_MESSAGE_TAIL = 'an expression'.freeze
|
13
|
+
ASSIGNMENT_MESSAGE_TAIL = 'an expression in an assignment'.freeze
|
14
|
+
KEYWORD_MESSAGE_TAIL = 'a %s in %s `%s` statement'.freeze
|
15
|
+
|
8
16
|
def on_send(node)
|
9
17
|
return if !node.receiver || node.method?(:[])
|
10
18
|
return unless relevant_node?(node)
|
@@ -79,30 +87,46 @@ module RuboCop
|
|
79
87
|
end
|
80
88
|
|
81
89
|
def operation_description(node, rhs)
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
else
|
89
|
-
'an expression' +
|
90
|
-
(part_of_assignment_rhs(node, rhs) ? ' in an assignment' : '')
|
90
|
+
kw_node_with_special_indentation(node) do |ancestor|
|
91
|
+
return keyword_message_tail(ancestor)
|
92
|
+
end
|
93
|
+
|
94
|
+
part_of_assignment_rhs(node, rhs) do |_node|
|
95
|
+
return ASSIGNMENT_MESSAGE_TAIL
|
91
96
|
end
|
97
|
+
|
98
|
+
DEFAULT_MESSAGE_TAIL
|
92
99
|
end
|
93
100
|
|
94
|
-
def
|
95
|
-
node.
|
96
|
-
|
101
|
+
def keyword_message_tail(node)
|
102
|
+
keyword = node.loc.keyword.source
|
103
|
+
kind = keyword == 'for' ? 'collection' : 'condition'
|
104
|
+
article = keyword =~ /^[iu]/ ? 'an' : 'a'
|
97
105
|
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
106
|
+
format(KEYWORD_MESSAGE_TAIL, kind, article, keyword)
|
107
|
+
end
|
108
|
+
|
109
|
+
def kw_node_with_special_indentation(node)
|
110
|
+
keyword_node =
|
111
|
+
node.each_ancestor(*KEYWORD_ANCESTOR_TYPES).find do |ancestor|
|
112
|
+
within_node?(node, indented_keyword_expression(ancestor))
|
102
113
|
end
|
103
114
|
|
104
|
-
|
115
|
+
if keyword_node && block_given?
|
116
|
+
yield keyword_node
|
117
|
+
else
|
118
|
+
keyword_node
|
119
|
+
end
|
120
|
+
end
|
121
|
+
|
122
|
+
def indented_keyword_expression(node)
|
123
|
+
if node.for_type?
|
124
|
+
expression = node.collection
|
125
|
+
else
|
126
|
+
expression, = *node
|
105
127
|
end
|
128
|
+
|
129
|
+
expression
|
106
130
|
end
|
107
131
|
|
108
132
|
def argument_in_method_call(node, kind)
|
@@ -122,17 +146,31 @@ module RuboCop
|
|
122
146
|
end
|
123
147
|
|
124
148
|
def part_of_assignment_rhs(node, candidate)
|
125
|
-
node.each_ancestor.find do |
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
149
|
+
rhs_node = node.each_ancestor.find do |ancestor|
|
150
|
+
break if disqualified_rhs?(candidate, ancestor)
|
151
|
+
|
152
|
+
valid_rhs?(candidate, ancestor)
|
153
|
+
end
|
154
|
+
|
155
|
+
if rhs_node && block_given?
|
156
|
+
yield rhs_node
|
157
|
+
else
|
158
|
+
rhs_node
|
159
|
+
end
|
160
|
+
end
|
161
|
+
|
162
|
+
def disqualified_rhs?(candidate, ancestor)
|
163
|
+
UNALIGNED_RHS_TYPES.include?(ancestor.type) ||
|
164
|
+
ancestor.block_type? && part_of_block_body?(candidate, ancestor)
|
165
|
+
end
|
166
|
+
|
167
|
+
def valid_rhs?(candidate, ancestor)
|
168
|
+
if ancestor.send_type?
|
169
|
+
valid_method_rhs_candidate?(candidate, ancestor)
|
170
|
+
elsif Util::ASGN_NODES.include?(ancestor.type)
|
171
|
+
valid_rhs_candidate?(candidate, assignment_rhs(ancestor))
|
172
|
+
else
|
173
|
+
false
|
136
174
|
end
|
137
175
|
end
|
138
176
|
|
@@ -146,9 +184,8 @@ module RuboCop
|
|
146
184
|
!candidate || within_node?(candidate, node)
|
147
185
|
end
|
148
186
|
|
149
|
-
def part_of_block_body?(candidate,
|
150
|
-
|
151
|
-
body && within_node?(candidate, body)
|
187
|
+
def part_of_block_body?(candidate, block_node)
|
188
|
+
block_node.body && within_node?(candidate, block_node.body)
|
152
189
|
end
|
153
190
|
|
154
191
|
def assignment_rhs(node)
|
@@ -23,6 +23,12 @@ module RuboCop
|
|
23
23
|
corrector.insert_before(node.loc.end, "\n".freeze)
|
24
24
|
end
|
25
25
|
else
|
26
|
+
# When a comment immediately before the closing brace gets in the way
|
27
|
+
# of an easy correction, the offense is reported but not auto-
|
28
|
+
# corrected. The user must handle the delicate decision of where to
|
29
|
+
# put the comment.
|
30
|
+
return if new_line_needed_before_closing_brace?(node)
|
31
|
+
|
26
32
|
lambda do |corrector|
|
27
33
|
corrector.remove(range_with_surrounding_space(node.loc.end,
|
28
34
|
:left))
|
@@ -35,6 +41,18 @@ module RuboCop
|
|
35
41
|
|
36
42
|
private
|
37
43
|
|
44
|
+
# Returns true for the case
|
45
|
+
# [a,
|
46
|
+
# b # comment
|
47
|
+
# ].some_method
|
48
|
+
def new_line_needed_before_closing_brace?(node)
|
49
|
+
return unless node.chained?
|
50
|
+
|
51
|
+
last_element_line =
|
52
|
+
last_element_range_with_trailing_comma(node).last_line
|
53
|
+
processed_source.comments.any? { |c| c.loc.line == last_element_line }
|
54
|
+
end
|
55
|
+
|
38
56
|
def check(node)
|
39
57
|
case style
|
40
58
|
when :symmetrical then check_symmetrical(node)
|
@@ -0,0 +1,52 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RuboCop
|
4
|
+
module Cop
|
5
|
+
# Common functionality for handling percent arrays.
|
6
|
+
module PercentArray
|
7
|
+
private
|
8
|
+
|
9
|
+
# Ruby does not allow percent arrays in an ambiguous block context.
|
10
|
+
#
|
11
|
+
# @example
|
12
|
+
#
|
13
|
+
# foo %i[bar baz] { qux }
|
14
|
+
def invalid_percent_array_context?(node)
|
15
|
+
parent = node.parent
|
16
|
+
|
17
|
+
parent && parent.send_type? && parent.arguments.include?(node) &&
|
18
|
+
!parent.parenthesized? && parent.block_literal?
|
19
|
+
end
|
20
|
+
|
21
|
+
def allowed_bracket_array?(node)
|
22
|
+
comments_in_array?(node) || below_array_length?(node) ||
|
23
|
+
invalid_percent_array_context?(node)
|
24
|
+
end
|
25
|
+
|
26
|
+
def message(_node)
|
27
|
+
style == :percent ? self.class::PERCENT_MSG : self.class::ARRAY_MSG
|
28
|
+
end
|
29
|
+
|
30
|
+
def comments_in_array?(node)
|
31
|
+
comments = processed_source.comments
|
32
|
+
array_range = node.source_range.to_a
|
33
|
+
|
34
|
+
comments.any? do |comment|
|
35
|
+
!(comment.loc.expression.to_a & array_range).empty?
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def check_percent_array(node)
|
40
|
+
array_style_detected(:percent, node.values.size)
|
41
|
+
add_offense(node) if style == :brackets
|
42
|
+
end
|
43
|
+
|
44
|
+
def check_bracketed_array(node)
|
45
|
+
return if allowed_bracket_array?(node)
|
46
|
+
|
47
|
+
array_style_detected(:brackets, node.values.size)
|
48
|
+
add_offense(node) if style == :percent
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
module RuboCop
|
4
4
|
module Cop
|
5
|
-
module
|
5
|
+
module Naming
|
6
6
|
# This cop makes sure that accessor methods are named properly.
|
7
7
|
#
|
8
8
|
# @example
|
@@ -18,26 +18,25 @@ module RuboCop
|
|
18
18
|
# # good
|
19
19
|
# def attribute ...
|
20
20
|
class AccessorMethodName < Cop
|
21
|
-
|
22
|
-
|
23
|
-
private
|
24
|
-
|
25
|
-
def on_method_def(node, method_name, args, _body)
|
26
|
-
if bad_reader_name?(method_name.to_s, args)
|
21
|
+
def on_def(node)
|
22
|
+
if bad_reader_name?(node)
|
27
23
|
add_offense(node, :name,
|
28
24
|
'Do not prefix reader method names with `get_`.')
|
29
|
-
elsif bad_writer_name?(
|
25
|
+
elsif bad_writer_name?(node)
|
30
26
|
add_offense(node, :name,
|
31
27
|
'Do not prefix writer method names with `set_`.')
|
32
28
|
end
|
33
29
|
end
|
30
|
+
alias on_defs on_def
|
31
|
+
|
32
|
+
private
|
34
33
|
|
35
|
-
def bad_reader_name?(
|
36
|
-
method_name.start_with?('get_') &&
|
34
|
+
def bad_reader_name?(node)
|
35
|
+
node.method_name.to_s.start_with?('get_') && !node.arguments?
|
37
36
|
end
|
38
37
|
|
39
|
-
def bad_writer_name?(
|
40
|
-
method_name.start_with?('set_') &&
|
38
|
+
def bad_writer_name?(node)
|
39
|
+
node.method_name.to_s.start_with?('set_') && node.arguments.one?
|
41
40
|
end
|
42
41
|
end
|
43
42
|
end
|
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
module RuboCop
|
4
4
|
module Cop
|
5
|
-
module
|
5
|
+
module Naming
|
6
6
|
# This cop makes sure that certain binary operator methods have their
|
7
7
|
# sole parameter named `other`.
|
8
8
|
#
|
@@ -13,7 +13,7 @@ module RuboCop
|
|
13
13
|
#
|
14
14
|
# # good
|
15
15
|
# def +(other); end
|
16
|
-
class
|
16
|
+
class BinaryOperatorParameterName < Cop
|
17
17
|
MSG = 'When defining the `%s` operator, ' \
|
18
18
|
'name its argument `other`.'.freeze
|
19
19
|
|
@@ -4,7 +4,7 @@ require 'pathname'
|
|
4
4
|
|
5
5
|
module RuboCop
|
6
6
|
module Cop
|
7
|
-
module
|
7
|
+
module Naming
|
8
8
|
# This cop makes sure that Ruby source files have snake_case
|
9
9
|
# names. Ruby scripts (i.e. source files with a shebang in the
|
10
10
|
# first line) are ignored.
|
@@ -87,8 +87,10 @@ module RuboCop
|
|
87
87
|
basename =~ (regex || SNAKE_CASE)
|
88
88
|
end
|
89
89
|
|
90
|
+
# rubocop:disable Metrics/CyclomaticComplexity
|
90
91
|
def find_class_or_module(node, namespace)
|
91
|
-
return nil
|
92
|
+
return nil unless node
|
93
|
+
|
92
94
|
name = namespace.pop
|
93
95
|
|
94
96
|
on_node(%i[class module casgn], node) do |child|
|
@@ -96,13 +98,15 @@ module RuboCop
|
|
96
98
|
|
97
99
|
const_namespace, const_name = *const
|
98
100
|
next if name != const_name && !match_acronym?(name, const_name)
|
101
|
+
next unless namespace.empty? ||
|
102
|
+
match_namespace(child, const_namespace, namespace)
|
99
103
|
|
100
|
-
return node
|
101
|
-
return node if match_namespace(child, const_namespace, namespace)
|
104
|
+
return node
|
102
105
|
end
|
103
106
|
|
104
107
|
nil
|
105
108
|
end
|
109
|
+
# rubocop:enable Metrics/CyclomaticComplexity
|
106
110
|
|
107
111
|
def match_namespace(node, namespace, expected)
|
108
112
|
match_partial = partial_matcher!(expected)
|
@@ -0,0 +1,68 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RuboCop
|
4
|
+
module Cop
|
5
|
+
module Naming
|
6
|
+
# This cop checks that your heredocs are using the configured case.
|
7
|
+
# By default it is configured to enforce uppercase heredocs.
|
8
|
+
#
|
9
|
+
# @example
|
10
|
+
#
|
11
|
+
# # EnforcedStyle: uppercase (default)
|
12
|
+
#
|
13
|
+
# # good
|
14
|
+
# <<-SQL
|
15
|
+
# SELECT * FROM foo
|
16
|
+
# SQL
|
17
|
+
#
|
18
|
+
# # bad
|
19
|
+
# <<-sql
|
20
|
+
# SELECT * FROM foo
|
21
|
+
# sql
|
22
|
+
#
|
23
|
+
# @example
|
24
|
+
#
|
25
|
+
# # EnforcedStyle: lowercase
|
26
|
+
#
|
27
|
+
# # good
|
28
|
+
# <<-sql
|
29
|
+
# SELECT * FROM foo
|
30
|
+
# sql
|
31
|
+
#
|
32
|
+
# # bad
|
33
|
+
# <<-SQL
|
34
|
+
# SELECT * FROM foo
|
35
|
+
# SQL
|
36
|
+
class HeredocDelimiterCase < Cop
|
37
|
+
include Heredoc
|
38
|
+
include ConfigurableEnforcedStyle
|
39
|
+
|
40
|
+
MSG = 'Use %s heredoc delimiters.'.freeze
|
41
|
+
|
42
|
+
def on_heredoc(node)
|
43
|
+
return if correct_case_delimiters?(node)
|
44
|
+
|
45
|
+
add_offense(node, :heredoc_end)
|
46
|
+
end
|
47
|
+
|
48
|
+
private
|
49
|
+
|
50
|
+
def message(_node)
|
51
|
+
format(MSG, style)
|
52
|
+
end
|
53
|
+
|
54
|
+
def correct_case_delimiters?(node)
|
55
|
+
delimiter_string(node) == correct_delimiters(node)
|
56
|
+
end
|
57
|
+
|
58
|
+
def correct_delimiters(node)
|
59
|
+
if style == :uppercase
|
60
|
+
delimiter_string(node).upcase
|
61
|
+
else
|
62
|
+
delimiter_string(node).downcase
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|