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
@@ -22,9 +22,9 @@ module RuboCop
|
|
22
22
|
|
23
23
|
MSG = 'Duplicate value `%s` found in `%s` enum declaration.'.freeze
|
24
24
|
|
25
|
-
def_node_matcher :enum_declaration, <<-
|
25
|
+
def_node_matcher :enum_declaration, <<-PATTERN
|
26
26
|
(send nil :enum (hash (pair (_ $_) ${array hash})))
|
27
|
-
|
27
|
+
PATTERN
|
28
28
|
|
29
29
|
def on_send(node)
|
30
30
|
enum_declaration(node) do |name, args|
|
@@ -43,7 +43,7 @@ module RuboCop
|
|
43
43
|
|
44
44
|
def check_for_file_join_with_rails_root(node)
|
45
45
|
return unless file_join_nodes?(node)
|
46
|
-
return unless node.
|
46
|
+
return unless node.arguments.any? { |e| rails_root_nodes?(e) }
|
47
47
|
|
48
48
|
register_offense(node)
|
49
49
|
end
|
@@ -51,7 +51,7 @@ module RuboCop
|
|
51
51
|
def check_for_rails_root_join_with_slash_separated_path(node)
|
52
52
|
return unless rails_root_nodes?(node)
|
53
53
|
return unless rails_root_join_nodes?(node)
|
54
|
-
return unless node.
|
54
|
+
return unless node.arguments.any? { |arg| string_with_slash?(arg) }
|
55
55
|
|
56
56
|
register_offense(node)
|
57
57
|
end
|
@@ -65,8 +65,7 @@ module RuboCop
|
|
65
65
|
|
66
66
|
add_offense(
|
67
67
|
node,
|
68
|
-
source_range(processed_source.buffer, node.loc.line, line_range)
|
69
|
-
MSG
|
68
|
+
source_range(processed_source.buffer, node.loc.line, line_range)
|
70
69
|
)
|
71
70
|
end
|
72
71
|
end
|
@@ -24,7 +24,7 @@ module RuboCop
|
|
24
24
|
return unless SCOPE_METHODS.include?(node.receiver.method_name)
|
25
25
|
return if method_chain(node).any? { |m| ignored_by_find_each?(m) }
|
26
26
|
|
27
|
-
add_offense(node,
|
27
|
+
add_offense(node, :selector)
|
28
28
|
end
|
29
29
|
|
30
30
|
def autocorrect(node)
|
@@ -0,0 +1,48 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RuboCop
|
4
|
+
module Cop
|
5
|
+
module Rails
|
6
|
+
# This cop looks for `has_many` or `has_one` associations that don't
|
7
|
+
# specify a `:dependent` option.
|
8
|
+
#
|
9
|
+
# @example
|
10
|
+
# # bad
|
11
|
+
# class User < ActiveRecord::Base
|
12
|
+
# has_many :comments
|
13
|
+
# has_one :avatar
|
14
|
+
# end
|
15
|
+
#
|
16
|
+
# # good
|
17
|
+
# class User < ActiveRecord::Base
|
18
|
+
# has_many :comments, dependent: :restrict_with_exception
|
19
|
+
# has_one :avatar, dependent: :destroy
|
20
|
+
# end
|
21
|
+
class HasManyOrHasOneDependent < Cop
|
22
|
+
MSG = 'Specify a `:dependent` option.'.freeze
|
23
|
+
|
24
|
+
def_node_matcher :is_has_many_or_has_one_without_options?, <<-PATTERN
|
25
|
+
(send nil {:has_many :has_one} _)
|
26
|
+
PATTERN
|
27
|
+
|
28
|
+
def_node_matcher :is_has_many_or_has_one_with_options?, <<-PATTERN
|
29
|
+
(send nil {:has_many :has_one} _ (hash $...))
|
30
|
+
PATTERN
|
31
|
+
|
32
|
+
def_node_matcher :has_dependent?, <<-PATTERN
|
33
|
+
(pair (sym :dependent) !(:nil))
|
34
|
+
PATTERN
|
35
|
+
|
36
|
+
def on_send(node)
|
37
|
+
unless is_has_many_or_has_one_without_options?(node)
|
38
|
+
pairs = is_has_many_or_has_one_with_options?(node)
|
39
|
+
return unless pairs
|
40
|
+
return if pairs.any? { |pair| has_dependent?(pair) }
|
41
|
+
end
|
42
|
+
|
43
|
+
add_offense(node, :selector)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
@@ -6,7 +6,7 @@ module RuboCop
|
|
6
6
|
# This cop is used to identify usages of http methods like `get`, `post`,
|
7
7
|
# `put`, `patch` without the usage of keyword arguments in your tests and
|
8
8
|
# change them to use keyword args. This cop only applies to Rails >= 5 .
|
9
|
-
# If you are
|
9
|
+
# If you are running Rails < 5 you should disable the
|
10
10
|
# Rails/HttpPositionalArguments cop or set your TargetRailsVersion in your
|
11
11
|
# .rubocop.yml file to 4.0, etc.
|
12
12
|
#
|
@@ -28,9 +28,9 @@ module RuboCop
|
|
28
28
|
|
29
29
|
minimum_target_rails_version 5.0
|
30
30
|
|
31
|
-
def_node_matcher :http_request?, <<-
|
31
|
+
def_node_matcher :http_request?, <<-PATTERN
|
32
32
|
(send nil {#{HTTP_METHODS.map(&:inspect).join(' ')}} !nil $_data ...)
|
33
|
-
|
33
|
+
PATTERN
|
34
34
|
|
35
35
|
def on_send(node)
|
36
36
|
data = http_request?(node)
|
@@ -39,7 +39,7 @@ module RuboCop
|
|
39
39
|
return if data.nil?
|
40
40
|
return unless needs_conversion?(data)
|
41
41
|
|
42
|
-
add_offense(node,
|
42
|
+
add_offense(node, :selector, format(MSG, node.method_name))
|
43
43
|
end
|
44
44
|
|
45
45
|
# @return [Boolean] true if the line needs to be converted
|
@@ -81,7 +81,7 @@ module RuboCop
|
|
81
81
|
# @return lambda of auto correct procedure
|
82
82
|
# the result should look like:
|
83
83
|
# get :new, params: { user_id: @user.id }, headers: {}
|
84
|
-
# the http_method is the method
|
84
|
+
# the http_method is the method used to call the controller
|
85
85
|
# the controller node can be a symbol, method, object or string
|
86
86
|
# that represents the path/action on the Rails controller
|
87
87
|
# the data is the http parameters and environment sent in
|
@@ -34,7 +34,7 @@ module RuboCop
|
|
34
34
|
|
35
35
|
return unless offense?(node)
|
36
36
|
|
37
|
-
add_offense(node
|
37
|
+
add_offense(node)
|
38
38
|
end
|
39
39
|
|
40
40
|
private
|
@@ -77,7 +77,7 @@ module RuboCop
|
|
77
77
|
end
|
78
78
|
|
79
79
|
def singular_receiver?(number)
|
80
|
-
number == 1
|
80
|
+
number.abs == 1
|
81
81
|
end
|
82
82
|
|
83
83
|
def plural_receiver?(number)
|
@@ -33,7 +33,7 @@ module RuboCop
|
|
33
33
|
referer?(node) do
|
34
34
|
return unless node.method?(wrong_method_name)
|
35
35
|
|
36
|
-
add_offense(node.source_range, node.source_range
|
36
|
+
add_offense(node.source_range, node.source_range)
|
37
37
|
end
|
38
38
|
end
|
39
39
|
|
@@ -43,7 +43,7 @@ module RuboCop
|
|
43
43
|
|
44
44
|
private
|
45
45
|
|
46
|
-
def message
|
46
|
+
def message(_node)
|
47
47
|
format(MSG, style, wrong_method_name)
|
48
48
|
end
|
49
49
|
|
@@ -131,29 +131,29 @@ module RuboCop
|
|
131
131
|
change change_default remove
|
132
132
|
].freeze
|
133
133
|
|
134
|
-
def_node_matcher :irreversible_schema_statement_call, <<-
|
134
|
+
def_node_matcher :irreversible_schema_statement_call, <<-PATTERN
|
135
135
|
(send nil ${:change_table_comment :execute :remove_belongs_to} ...)
|
136
|
-
|
136
|
+
PATTERN
|
137
137
|
|
138
|
-
def_node_matcher :drop_table_call, <<-
|
138
|
+
def_node_matcher :drop_table_call, <<-PATTERN
|
139
139
|
(send nil :drop_table ...)
|
140
|
-
|
140
|
+
PATTERN
|
141
141
|
|
142
|
-
def_node_matcher :change_column_default_call, <<-
|
142
|
+
def_node_matcher :change_column_default_call, <<-PATTERN
|
143
143
|
(send nil :change_column_default _ _ $...)
|
144
|
-
|
144
|
+
PATTERN
|
145
145
|
|
146
|
-
def_node_matcher :remove_column_call, <<-
|
146
|
+
def_node_matcher :remove_column_call, <<-PATTERN
|
147
147
|
(send nil :remove_column $...)
|
148
|
-
|
148
|
+
PATTERN
|
149
149
|
|
150
|
-
def_node_matcher :remove_foreign_key_call, <<-
|
150
|
+
def_node_matcher :remove_foreign_key_call, <<-PATTERN
|
151
151
|
(send nil :remove_foreign_key _ $_)
|
152
|
-
|
152
|
+
PATTERN
|
153
153
|
|
154
|
-
def_node_matcher :change_table_call, <<-
|
154
|
+
def_node_matcher :change_table_call, <<-PATTERN
|
155
155
|
(send nil :change_table $_ ...)
|
156
|
-
|
156
|
+
PATTERN
|
157
157
|
|
158
158
|
def on_send(node)
|
159
159
|
return unless within_change_method?(node)
|
@@ -56,7 +56,7 @@ module RuboCop
|
|
56
56
|
end
|
57
57
|
|
58
58
|
def after_leaving_scope(scope, _variable_table)
|
59
|
-
scope.variables.
|
59
|
+
scope.variables.each_value do |variable|
|
60
60
|
variable.assignments.each do |assignment|
|
61
61
|
check_assignment(assignment)
|
62
62
|
end
|
@@ -70,7 +70,7 @@ module RuboCop
|
|
70
70
|
return unless expected_signature?(node)
|
71
71
|
return if persisted_referenced?(assignment)
|
72
72
|
|
73
|
-
add_offense(node,
|
73
|
+
add_offense(node, :selector,
|
74
74
|
format(CREATE_MSG,
|
75
75
|
"#{node.method_name}!",
|
76
76
|
node.method_name.to_s,
|
@@ -84,7 +84,7 @@ module RuboCop
|
|
84
84
|
return if check_used_in_conditional(node)
|
85
85
|
return if last_call_of_method?(node)
|
86
86
|
|
87
|
-
add_offense(node,
|
87
|
+
add_offense(node, :selector,
|
88
88
|
format(MSG,
|
89
89
|
"#{node.method_name}!",
|
90
90
|
node.method_name.to_s))
|
@@ -121,7 +121,7 @@ module RuboCop
|
|
121
121
|
return false unless conditional?(node)
|
122
122
|
|
123
123
|
unless MODIFY_PERSIST_METHODS.include?(node.method_name)
|
124
|
-
add_offense(node,
|
124
|
+
add_offense(node, :selector,
|
125
125
|
format(CREATE_CONDITIONAL_MSG,
|
126
126
|
node.method_name.to_s))
|
127
127
|
end
|
@@ -130,8 +130,10 @@ module RuboCop
|
|
130
130
|
end
|
131
131
|
|
132
132
|
def conditional?(node)
|
133
|
-
node.parent && (
|
134
|
-
|
133
|
+
node.parent && (
|
134
|
+
node.parent.if_type? || node.parent.case_type? ||
|
135
|
+
node.parent.or_type? || node.parent.and_type?
|
136
|
+
)
|
135
137
|
end
|
136
138
|
|
137
139
|
def last_call_of_method?(node)
|
@@ -14,9 +14,9 @@ module RuboCop
|
|
14
14
|
class Eval < Cop
|
15
15
|
MSG = 'The use of `eval` is a serious security risk.'.freeze
|
16
16
|
|
17
|
-
def_node_matcher :eval?, <<-
|
17
|
+
def_node_matcher :eval?, <<-PATTERN
|
18
18
|
(send {nil (send nil :binding)} :eval $!str ...)
|
19
|
-
|
19
|
+
PATTERN
|
20
20
|
|
21
21
|
def on_send(node)
|
22
22
|
eval?(node) do |code|
|
@@ -25,9 +25,9 @@ module RuboCop
|
|
25
25
|
class JSONLoad < Cop
|
26
26
|
MSG = 'Prefer `JSON.parse` over `JSON.%s`.'.freeze
|
27
27
|
|
28
|
-
def_node_matcher :json_load, <<-
|
28
|
+
def_node_matcher :json_load, <<-PATTERN
|
29
29
|
(send (const {nil cbase} :JSON) ${:load :restore} ...)
|
30
|
-
|
30
|
+
PATTERN
|
31
31
|
|
32
32
|
def on_send(node)
|
33
33
|
json_load(node) do |method|
|
@@ -21,10 +21,10 @@ module RuboCop
|
|
21
21
|
class MarshalLoad < Cop
|
22
22
|
MSG = 'Avoid using `Marshal.%s`.'.freeze
|
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
|
28
28
|
|
29
29
|
def on_send(node)
|
30
30
|
marshal_load(node) do |method|
|
@@ -18,9 +18,9 @@ module RuboCop
|
|
18
18
|
class YAMLLoad < Cop
|
19
19
|
MSG = 'Prefer using `YAML.safe_load` over `YAML.load`.'.freeze
|
20
20
|
|
21
|
-
def_node_matcher :yaml_load, <<-
|
21
|
+
def_node_matcher :yaml_load, <<-PATTERN
|
22
22
|
(send (const {nil cbase} :YAML) :load ...)
|
23
|
-
|
23
|
+
PATTERN
|
24
24
|
|
25
25
|
def on_send(node)
|
26
26
|
yaml_load(node) do
|
@@ -3,10 +3,30 @@
|
|
3
3
|
module RuboCop
|
4
4
|
module Cop
|
5
5
|
module Style
|
6
|
-
# This cop
|
7
|
-
#
|
8
|
-
#
|
9
|
-
#
|
6
|
+
# This cop enforces the use of either `#alias` or `#alias_method`
|
7
|
+
# depending on configuration.
|
8
|
+
# It also flags uses of `alias :symbol` rather than `alias bareword`.
|
9
|
+
#
|
10
|
+
# @example
|
11
|
+
#
|
12
|
+
# # EnforcedStyle: prefer_alias
|
13
|
+
#
|
14
|
+
# # good
|
15
|
+
# alias bar foo
|
16
|
+
#
|
17
|
+
# # bad
|
18
|
+
# alias_method :bar, :foo
|
19
|
+
# alias :bar :foo
|
20
|
+
#
|
21
|
+
# @example
|
22
|
+
#
|
23
|
+
# # EnforcedStyle: prefer_alias_method
|
24
|
+
#
|
25
|
+
# # good
|
26
|
+
# alias_method :bar, :foo
|
27
|
+
#
|
28
|
+
# # bad
|
29
|
+
# alias bar foo
|
10
30
|
class Alias < Cop
|
11
31
|
include ConfigurableEnforcedStyle
|
12
32
|
|
@@ -16,34 +36,31 @@ module RuboCop
|
|
16
36
|
|
17
37
|
def on_send(node)
|
18
38
|
return unless node.command?(:alias_method)
|
19
|
-
return
|
20
|
-
return if scope_type(node) == :dynamic
|
39
|
+
return unless style == :prefer_alias && alias_keyword_possible?(node)
|
21
40
|
|
22
41
|
msg = format(MSG_ALIAS_METHOD, lexical_scope_type(node))
|
23
42
|
add_offense(node, :selector, msg)
|
24
43
|
end
|
25
44
|
|
26
45
|
def on_alias(node)
|
27
|
-
|
28
|
-
return if node.each_child_node(:gvar).any?
|
29
|
-
# alias_method can't be used in instance_eval blocks
|
30
|
-
scope_type = scope_type(node)
|
31
|
-
return if scope_type == :instance_eval
|
46
|
+
return unless alias_method_possible?(node)
|
32
47
|
|
33
|
-
if scope_type == :dynamic || style == :prefer_alias_method
|
48
|
+
if scope_type(node) == :dynamic || style == :prefer_alias_method
|
34
49
|
add_offense(node, :keyword, MSG_ALIAS)
|
35
50
|
elsif node.children.none? { |arg| bareword?(arg) }
|
36
51
|
add_offense_for_args(node)
|
37
52
|
end
|
38
53
|
end
|
39
54
|
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
55
|
+
private
|
56
|
+
|
57
|
+
def alias_keyword_possible?(node)
|
58
|
+
scope_type(node) != :dynamic && node.arguments.all?(&:sym_type?)
|
59
|
+
end
|
60
|
+
|
61
|
+
def alias_method_possible?(node)
|
62
|
+
scope_type(node) != :instance_eval &&
|
63
|
+
node.children.none?(&:gvar_type?)
|
47
64
|
end
|
48
65
|
|
49
66
|
def autocorrect(node)
|
@@ -56,7 +73,14 @@ module RuboCop
|
|
56
73
|
end
|
57
74
|
end
|
58
75
|
|
59
|
-
|
76
|
+
def add_offense_for_args(node)
|
77
|
+
existing_args = node.children.map(&:source).join(' ')
|
78
|
+
preferred_args = node.children.map { |a| a.source[1..-1] }.join(' ')
|
79
|
+
arg_ranges = node.children.map(&:source_range)
|
80
|
+
msg = format(MSG_SYMBOL_ARGS, preferred_args,
|
81
|
+
existing_args)
|
82
|
+
add_offense(node, arg_ranges.reduce(&:join), msg)
|
83
|
+
end
|
60
84
|
|
61
85
|
# In this expression, will `self` be the same as the innermost enclosing
|
62
86
|
# class or module block (:lexical)? Or will it be something else
|