rubocop 0.51.0 → 0.52.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 +1 -2
- data/config/default.yml +86 -10
- data/config/disabled.yml +9 -4
- data/config/enabled.yml +1105 -1006
- data/lib/rubocop.rb +30 -3
- data/lib/rubocop/ast/builder.rb +2 -0
- data/lib/rubocop/ast/node.rb +24 -2
- data/lib/rubocop/ast/node/args_node.rb +17 -0
- data/lib/rubocop/ast/node/array_node.rb +1 -1
- data/lib/rubocop/ast/node/mixin/basic_literal_node.rb +16 -0
- data/lib/rubocop/ast/node/send_node.rb +20 -0
- data/lib/rubocop/ast/node/str_node.rb +14 -0
- data/lib/rubocop/ast/node/symbol_node.rb +20 -0
- data/lib/rubocop/ast/traversal.rb +4 -4
- data/lib/rubocop/cli.rb +45 -4
- data/lib/rubocop/comment_config.rb +2 -5
- data/lib/rubocop/config.rb +42 -8
- data/lib/rubocop/config_loader.rb +39 -100
- data/lib/rubocop/config_loader_resolver.rb +99 -2
- data/lib/rubocop/cop/autocorrect_logic.rb +1 -1
- data/lib/rubocop/cop/bundler/duplicated_gem.rb +7 -7
- data/lib/rubocop/cop/bundler/insecure_protocol_source.rb +4 -3
- data/lib/rubocop/cop/bundler/ordered_gems.rb +2 -2
- data/lib/rubocop/cop/cop.rb +16 -46
- data/lib/rubocop/cop/gemspec/duplicated_assignment.rb +102 -0
- data/lib/rubocop/cop/gemspec/ordered_dependencies.rb +3 -2
- data/lib/rubocop/cop/gemspec/required_ruby_version.rb +87 -0
- data/lib/rubocop/cop/generator.rb +23 -4
- data/lib/rubocop/cop/internal_affairs.rb +1 -1
- data/lib/rubocop/cop/internal_affairs/node_destructuring.rb +46 -0
- data/lib/rubocop/cop/internal_affairs/node_type_predicate.rb +2 -2
- data/lib/rubocop/cop/internal_affairs/offense_location_keyword.rb +9 -8
- data/lib/rubocop/cop/internal_affairs/redundant_location_argument.rb +1 -1
- data/lib/rubocop/cop/internal_affairs/redundant_message_argument.rb +1 -1
- data/lib/rubocop/cop/layout/access_modifier_indentation.rb +4 -7
- data/lib/rubocop/cop/layout/align_hash.rb +16 -16
- data/lib/rubocop/cop/layout/align_parameters.rb +6 -12
- data/lib/rubocop/cop/layout/block_end_newline.rb +19 -5
- data/lib/rubocop/cop/layout/case_indentation.rb +14 -17
- data/lib/rubocop/cop/layout/class_structure.rb +306 -0
- data/lib/rubocop/cop/layout/closing_parenthesis_indentation.rb +1 -0
- data/lib/rubocop/cop/layout/comment_indentation.rb +39 -2
- data/lib/rubocop/cop/layout/dot_position.rb +22 -13
- data/lib/rubocop/cop/layout/else_alignment.rb +6 -6
- data/lib/rubocop/cop/layout/empty_line_between_defs.rb +17 -17
- data/lib/rubocop/cop/layout/empty_lines.rb +15 -1
- data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +3 -2
- data/lib/rubocop/cop/layout/empty_lines_around_arguments.rb +89 -0
- data/lib/rubocop/cop/layout/empty_lines_around_begin_body.rb +2 -2
- data/lib/rubocop/cop/layout/empty_lines_around_block_body.rb +4 -8
- data/lib/rubocop/cop/layout/empty_lines_around_class_body.rb +30 -5
- data/lib/rubocop/cop/layout/empty_lines_around_exception_handling_keywords.rb +7 -3
- data/lib/rubocop/cop/layout/empty_lines_around_method_body.rb +2 -2
- data/lib/rubocop/cop/layout/empty_lines_around_module_body.rb +22 -7
- data/lib/rubocop/cop/layout/end_of_line.rb +1 -1
- data/lib/rubocop/cop/layout/extra_spacing.rb +21 -24
- data/lib/rubocop/cop/layout/first_parameter_indentation.rb +4 -1
- data/lib/rubocop/cop/layout/indent_array.rb +67 -20
- data/lib/rubocop/cop/layout/indent_hash.rb +70 -25
- data/lib/rubocop/cop/layout/indent_heredoc.rb +51 -11
- data/lib/rubocop/cop/layout/indentation_width.rb +24 -17
- data/lib/rubocop/cop/layout/initial_indentation.rb +7 -5
- data/lib/rubocop/cop/layout/leading_comment_space.rb +2 -2
- data/lib/rubocop/cop/layout/multiline_array_brace_layout.rb +47 -14
- data/lib/rubocop/cop/layout/multiline_assignment_layout.rb +10 -9
- data/lib/rubocop/cop/layout/multiline_block_layout.rb +19 -16
- data/lib/rubocop/cop/layout/multiline_hash_brace_layout.rb +46 -13
- data/lib/rubocop/cop/layout/multiline_method_call_indentation.rb +9 -10
- data/lib/rubocop/cop/layout/multiline_method_definition_brace_layout.rb +4 -0
- data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +9 -3
- data/lib/rubocop/cop/layout/space_after_colon.rb +4 -4
- data/lib/rubocop/cop/layout/space_after_comma.rb +3 -3
- data/lib/rubocop/cop/layout/space_after_method_name.rb +4 -4
- data/lib/rubocop/cop/layout/space_after_semicolon.rb +8 -1
- data/lib/rubocop/cop/layout/space_around_block_parameters.rb +16 -19
- data/lib/rubocop/cop/layout/space_around_equals_in_parameter_default.rb +27 -16
- data/lib/rubocop/cop/layout/space_around_keyword.rb +13 -11
- data/lib/rubocop/cop/layout/space_around_operators.rb +26 -13
- data/lib/rubocop/cop/layout/space_before_block_braces.rb +10 -10
- data/lib/rubocop/cop/layout/space_before_comma.rb +12 -1
- data/lib/rubocop/cop/layout/space_before_comment.rb +2 -4
- data/lib/rubocop/cop/layout/space_before_first_arg.rb +4 -3
- data/lib/rubocop/cop/layout/space_before_semicolon.rb +1 -1
- data/lib/rubocop/cop/layout/space_in_lambda_literal.rb +6 -12
- data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +235 -0
- data/lib/rubocop/cop/layout/space_inside_array_percent_literal.rb +3 -3
- data/lib/rubocop/cop/layout/space_inside_block_braces.rb +87 -16
- data/lib/rubocop/cop/layout/space_inside_hash_literal_braces.rb +57 -34
- data/lib/rubocop/cop/layout/space_inside_parens.rb +31 -3
- data/lib/rubocop/cop/layout/space_inside_range_literal.rb +15 -15
- data/lib/rubocop/cop/layout/space_inside_reference_brackets.rb +81 -0
- data/lib/rubocop/cop/layout/space_inside_string_interpolation.rb +24 -13
- data/lib/rubocop/cop/layout/tab.rb +2 -2
- data/lib/rubocop/cop/layout/trailing_blank_lines.rb +7 -7
- data/lib/rubocop/cop/lint/ambiguous_block_association.rb +11 -20
- data/lib/rubocop/cop/lint/block_alignment.rb +26 -23
- data/lib/rubocop/cop/lint/boolean_symbol.rb +1 -1
- data/lib/rubocop/cop/lint/def_end_alignment.rb +5 -10
- data/lib/rubocop/cop/lint/else_layout.rb +2 -2
- data/lib/rubocop/cop/lint/end_alignment.rb +13 -14
- data/lib/rubocop/cop/lint/ineffective_access_modifier.rb +3 -4
- data/lib/rubocop/cop/lint/inherit_exception.rb +10 -14
- data/lib/rubocop/cop/lint/missing_cop_enable_directive.rb +81 -0
- data/lib/rubocop/cop/lint/nested_percent_literal.rb +58 -0
- data/lib/rubocop/cop/lint/non_local_exit_from_iterator.rb +2 -2
- data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +1 -1
- data/lib/rubocop/cop/lint/percent_string_array.rb +14 -14
- data/lib/rubocop/cop/lint/percent_symbol_array.rb +11 -11
- data/lib/rubocop/cop/lint/redundant_with_index.rb +6 -3
- data/lib/rubocop/cop/lint/redundant_with_object.rb +1 -1
- data/lib/rubocop/cop/lint/require_parentheses.rb +3 -1
- data/lib/rubocop/cop/lint/rescue_type.rb +3 -3
- data/lib/rubocop/cop/lint/script_permission.rb +1 -0
- data/lib/rubocop/cop/lint/shadowed_argument.rb +146 -0
- data/lib/rubocop/cop/lint/string_conversion_in_interpolation.rb +6 -6
- data/lib/rubocop/cop/lint/unneeded_disable.rb +29 -11
- data/lib/rubocop/cop/lint/unneeded_require_statement.rb +2 -1
- data/lib/rubocop/cop/lint/unneeded_splat_expansion.rb +43 -17
- data/lib/rubocop/cop/message_annotator.rb +4 -2
- data/lib/rubocop/cop/metrics/abc_size.rb +2 -2
- data/lib/rubocop/cop/metrics/class_length.rb +3 -1
- data/lib/rubocop/cop/metrics/cyclomatic_complexity.rb +2 -1
- data/lib/rubocop/cop/metrics/line_length.rb +2 -2
- data/lib/rubocop/cop/metrics/module_length.rb +3 -1
- data/lib/rubocop/cop/metrics/parameter_lists.rb +9 -2
- data/lib/rubocop/cop/metrics/perceived_complexity.rb +2 -1
- data/lib/rubocop/cop/mixin/documentation_comment.rb +1 -1
- data/lib/rubocop/cop/mixin/empty_lines_around_body.rb +7 -5
- data/lib/rubocop/cop/mixin/empty_parameter.rb +23 -0
- data/lib/rubocop/cop/mixin/end_keyword_alignment.rb +7 -3
- data/lib/rubocop/cop/mixin/heredoc.rb +19 -19
- data/lib/rubocop/cop/mixin/method_complexity.rb +32 -8
- data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +7 -3
- data/lib/rubocop/cop/mixin/multiline_literal_brace_layout.rb +6 -4
- data/lib/rubocop/cop/mixin/negative_conditional.rb +3 -0
- data/lib/rubocop/cop/mixin/ordered_gem_node.rb +16 -12
- data/lib/rubocop/cop/mixin/parentheses.rb +12 -0
- data/lib/rubocop/cop/mixin/space_after_punctuation.rb +8 -8
- data/lib/rubocop/cop/mixin/space_before_punctuation.rb +10 -10
- data/lib/rubocop/cop/mixin/statement_modifier.rb +7 -17
- data/lib/rubocop/cop/mixin/surrounding_space.rb +95 -8
- data/lib/rubocop/cop/mixin/too_many_lines.rb +2 -2
- data/lib/rubocop/cop/mixin/trailing_comma.rb +22 -14
- data/lib/rubocop/cop/mixin/unused_argument.rb +3 -40
- data/lib/rubocop/cop/naming/accessor_method_name.rb +20 -10
- data/lib/rubocop/cop/naming/ascii_identifiers.rb +33 -0
- data/lib/rubocop/cop/naming/binary_operator_parameter_name.rb +5 -4
- data/lib/rubocop/cop/naming/class_and_module_camel_case.rb +16 -12
- data/lib/rubocop/cop/naming/constant_name.rb +32 -3
- data/lib/rubocop/cop/naming/file_name.rb +19 -8
- data/lib/rubocop/cop/naming/heredoc_delimiter_case.rb +10 -16
- data/lib/rubocop/cop/naming/method_name.rb +20 -14
- data/lib/rubocop/cop/naming/predicate_name.rb +7 -3
- data/lib/rubocop/cop/naming/variable_name.rb +17 -2
- data/lib/rubocop/cop/naming/variable_number.rb +10 -27
- data/lib/rubocop/cop/offense.rb +6 -1
- data/lib/rubocop/cop/performance/case_when_splat.rb +2 -6
- data/lib/rubocop/cop/performance/casecmp.rb +5 -4
- data/lib/rubocop/cop/performance/compare_with_block.rb +13 -7
- data/lib/rubocop/cop/performance/count.rb +5 -4
- data/lib/rubocop/cop/performance/detect.rb +7 -4
- data/lib/rubocop/cop/performance/double_start_end_with.rb +2 -7
- data/lib/rubocop/cop/performance/end_with.rb +2 -2
- data/lib/rubocop/cop/performance/flat_map.rb +3 -2
- data/lib/rubocop/cop/performance/hash_each_methods.rb +41 -40
- data/lib/rubocop/cop/performance/lstrip_rstrip.rb +5 -4
- data/lib/rubocop/cop/performance/redundant_block_call.rb +22 -22
- data/lib/rubocop/cop/performance/redundant_match.rb +2 -2
- data/lib/rubocop/cop/performance/redundant_merge.rb +6 -4
- data/lib/rubocop/cop/performance/redundant_sort_by.rb +4 -4
- data/lib/rubocop/cop/performance/regexp_match.rb +3 -2
- data/lib/rubocop/cop/performance/size.rb +2 -2
- data/lib/rubocop/cop/performance/start_with.rb +2 -2
- data/lib/rubocop/cop/performance/string_replacement.rb +4 -4
- data/lib/rubocop/cop/performance/times_map.rb +14 -15
- data/lib/rubocop/cop/performance/uri_default_parser.rb +3 -3
- data/lib/rubocop/cop/rails/action_filter.rb +22 -0
- data/lib/rubocop/cop/rails/active_support_aliases.rb +2 -2
- data/lib/rubocop/cop/rails/application_job.rb +4 -2
- data/lib/rubocop/cop/rails/application_record.rb +4 -2
- data/lib/rubocop/cop/rails/create_table_with_timestamps.rb +82 -0
- data/lib/rubocop/cop/rails/delegate.rb +20 -25
- data/lib/rubocop/cop/rails/delegate_allow_blank.rb +2 -2
- data/lib/rubocop/cop/rails/environment_comparison.rb +66 -0
- data/lib/rubocop/cop/rails/exit.rb +7 -0
- data/lib/rubocop/cop/rails/has_and_belongs_to_many.rb +7 -0
- data/lib/rubocop/cop/rails/has_many_or_has_one_dependent.rb +6 -2
- data/lib/rubocop/cop/rails/http_positional_arguments.rb +36 -41
- data/lib/rubocop/cop/rails/inverse_of.rb +96 -0
- data/lib/rubocop/cop/rails/lexically_scoped_action_filter.rb +112 -0
- data/lib/rubocop/cop/rails/output.rb +9 -0
- data/lib/rubocop/cop/rails/output_safety.rb +14 -20
- data/lib/rubocop/cop/rails/pluralization_grammar.rb +8 -8
- data/lib/rubocop/cop/rails/presence.rb +105 -0
- data/lib/rubocop/cop/rails/read_write_attribute.rb +10 -10
- data/lib/rubocop/cop/rails/redundant_receiver_in_with_options.rb +91 -0
- data/lib/rubocop/cop/rails/relative_date_constant.rb +9 -9
- data/lib/rubocop/cop/rails/reversible_migration.rb +3 -4
- data/lib/rubocop/cop/rails/safe_navigation.rb +5 -6
- data/lib/rubocop/cop/rails/save_bang.rb +2 -2
- data/lib/rubocop/cop/rails/uniq_before_pluck.rb +1 -1
- data/lib/rubocop/cop/rails/validation.rb +7 -7
- data/lib/rubocop/cop/security/json_load.rb +4 -2
- data/lib/rubocop/cop/security/marshal_load.rb +4 -2
- data/lib/rubocop/cop/style/alias.rb +24 -26
- data/lib/rubocop/cop/style/and_or.rb +34 -28
- data/lib/rubocop/cop/style/array_join.rb +9 -0
- data/lib/rubocop/cop/style/ascii_comments.rb +24 -4
- data/lib/rubocop/cop/style/attr.rb +14 -4
- data/lib/rubocop/cop/style/auto_resource_cleanup.rb +5 -3
- data/lib/rubocop/cop/style/bare_percent_literals.rb +31 -10
- data/lib/rubocop/cop/style/block_comments.rb +14 -2
- data/lib/rubocop/cop/style/block_delimiters.rb +80 -15
- data/lib/rubocop/cop/style/braces_around_hash_parameters.rb +81 -48
- data/lib/rubocop/cop/style/case_equality.rb +12 -0
- data/lib/rubocop/cop/style/character_literal.rb +10 -0
- data/lib/rubocop/cop/style/class_and_module_children.rb +6 -2
- data/lib/rubocop/cop/style/class_check.rb +28 -9
- data/lib/rubocop/cop/style/class_methods.rb +8 -8
- data/lib/rubocop/cop/style/class_vars.rb +4 -3
- data/lib/rubocop/cop/style/collection_methods.rb +4 -2
- data/lib/rubocop/cop/style/colon_method_call.rb +16 -0
- data/lib/rubocop/cop/style/colon_method_definition.rb +36 -0
- data/lib/rubocop/cop/style/command_literal.rb +70 -21
- data/lib/rubocop/cop/style/comment_annotation.rb +35 -10
- data/lib/rubocop/cop/style/commented_keyword.rb +12 -9
- data/lib/rubocop/cop/style/conditional_assignment.rb +10 -12
- data/lib/rubocop/cop/style/copyright.rb +19 -20
- data/lib/rubocop/cop/style/date_time.rb +2 -2
- data/lib/rubocop/cop/style/def_with_parentheses.rb +27 -2
- data/lib/rubocop/cop/style/dir.rb +2 -2
- data/lib/rubocop/cop/style/documentation.rb +17 -2
- data/lib/rubocop/cop/style/each_for_simple_loop.rb +7 -7
- data/lib/rubocop/cop/style/each_with_object.rb +5 -5
- data/lib/rubocop/cop/style/empty_block_parameter.rb +47 -0
- data/lib/rubocop/cop/style/empty_case_condition.rb +2 -2
- data/lib/rubocop/cop/style/empty_else.rb +52 -22
- data/lib/rubocop/cop/style/empty_lambda_parameter.rb +43 -0
- data/lib/rubocop/cop/style/empty_literal.rb +17 -5
- data/lib/rubocop/cop/style/empty_method.rb +4 -10
- data/lib/rubocop/cop/style/encoding.rb +2 -1
- data/lib/rubocop/cop/style/eval_with_location.rb +146 -0
- data/lib/rubocop/cop/style/even_odd.rb +4 -2
- data/lib/rubocop/cop/style/extend_self.rb +92 -0
- data/lib/rubocop/cop/style/flip_flop.rb +11 -0
- data/lib/rubocop/cop/style/format_string.rb +29 -2
- data/lib/rubocop/cop/style/format_string_token.rb +15 -14
- data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +4 -3
- data/lib/rubocop/cop/style/global_vars.rb +11 -1
- data/lib/rubocop/cop/style/hash_syntax.rb +44 -43
- data/lib/rubocop/cop/style/identical_conditional_branches.rb +8 -8
- data/lib/rubocop/cop/style/if_inside_else.rb +10 -10
- data/lib/rubocop/cop/style/if_unless_modifier.rb +7 -7
- data/lib/rubocop/cop/style/if_unless_modifier_of_if_unless.rb +2 -2
- data/lib/rubocop/cop/style/if_with_semicolon.rb +9 -0
- data/lib/rubocop/cop/style/implicit_runtime_error.rb +5 -5
- data/lib/rubocop/cop/style/infinite_loop.rb +2 -2
- data/lib/rubocop/cop/style/lambda.rb +23 -31
- data/lib/rubocop/cop/style/lambda_call.rb +15 -9
- data/lib/rubocop/cop/style/line_end_concatenation.rb +4 -4
- data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +2 -2
- data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +2 -2
- data/lib/rubocop/cop/style/method_def_parentheses.rb +4 -3
- data/lib/rubocop/cop/style/method_missing.rb +8 -8
- data/lib/rubocop/cop/style/min_max.rb +12 -12
- data/lib/rubocop/cop/style/missing_else.rb +5 -4
- data/lib/rubocop/cop/style/mixin_grouping.rb +29 -19
- data/lib/rubocop/cop/style/mixin_usage.rb +8 -10
- data/lib/rubocop/cop/style/module_function.rb +17 -5
- data/lib/rubocop/cop/style/multiline_if_modifier.rb +4 -4
- data/lib/rubocop/cop/style/multiline_if_then.rb +14 -13
- data/lib/rubocop/cop/style/multiline_memoization.rb +8 -14
- data/lib/rubocop/cop/style/mutable_constant.rb +12 -12
- data/lib/rubocop/cop/style/negated_if.rb +22 -30
- data/lib/rubocop/cop/style/negated_while.rb +1 -5
- data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +18 -17
- data/lib/rubocop/cop/style/next.rb +39 -11
- data/lib/rubocop/cop/style/nil_comparison.rb +6 -6
- data/lib/rubocop/cop/style/non_nil_check.rb +25 -22
- data/lib/rubocop/cop/style/not.rb +14 -4
- data/lib/rubocop/cop/style/numeric_literal_prefix.rb +6 -6
- data/lib/rubocop/cop/style/numeric_literals.rb +7 -7
- data/lib/rubocop/cop/style/numeric_predicate.rb +14 -18
- data/lib/rubocop/cop/style/one_line_conditional.rb +4 -4
- data/lib/rubocop/cop/style/option_hash.rb +11 -14
- data/lib/rubocop/cop/style/or_assignment.rb +2 -2
- data/lib/rubocop/cop/style/parallel_assignment.rb +13 -13
- data/lib/rubocop/cop/style/parentheses_around_condition.rb +19 -3
- data/lib/rubocop/cop/style/percent_literal_delimiters.rb +24 -3
- data/lib/rubocop/cop/style/percent_q_literals.rb +27 -6
- data/lib/rubocop/cop/style/perl_backrefs.rb +7 -0
- data/lib/rubocop/cop/style/preferred_hash_methods.rb +6 -10
- data/lib/rubocop/cop/style/proc.rb +8 -0
- data/lib/rubocop/cop/style/raise_args.rb +8 -14
- data/lib/rubocop/cop/style/random_with_offset.rb +160 -0
- data/lib/rubocop/cop/style/redundant_begin.rb +14 -4
- data/lib/rubocop/cop/style/redundant_conditional.rb +9 -8
- data/lib/rubocop/cop/style/redundant_return.rb +5 -4
- data/lib/rubocop/cop/style/redundant_self.rb +25 -26
- data/lib/rubocop/cop/style/regexp_literal.rb +74 -21
- data/lib/rubocop/cop/style/rescue_modifier.rb +11 -0
- data/lib/rubocop/cop/style/rescue_standard_error.rb +122 -0
- data/lib/rubocop/cop/style/return_nil.rb +4 -8
- data/lib/rubocop/cop/style/safe_navigation.rb +20 -2
- data/lib/rubocop/cop/style/self_assignment.rb +13 -13
- data/lib/rubocop/cop/style/semicolon.rb +18 -8
- data/lib/rubocop/cop/style/send.rb +9 -0
- data/lib/rubocop/cop/style/signal_exception.rb +100 -0
- data/lib/rubocop/cop/style/single_line_block_params.rb +2 -2
- data/lib/rubocop/cop/style/single_line_methods.rb +20 -8
- data/lib/rubocop/cop/style/special_global_vars.rb +16 -11
- data/lib/rubocop/cop/style/stabby_lambda_parentheses.rb +7 -12
- data/lib/rubocop/cop/style/stderr_puts.rb +5 -3
- data/lib/rubocop/cop/style/string_hash_keys.rb +36 -0
- data/lib/rubocop/cop/style/string_literals.rb +22 -0
- data/lib/rubocop/cop/style/string_literals_in_interpolation.rb +2 -8
- data/lib/rubocop/cop/style/string_methods.rb +18 -7
- data/lib/rubocop/cop/style/symbol_array.rb +5 -9
- data/lib/rubocop/cop/style/symbol_proc.rb +5 -4
- data/lib/rubocop/cop/style/ternary_parentheses.rb +31 -40
- data/lib/rubocop/cop/style/trailing_body_on_method_definition.rb +101 -0
- data/lib/rubocop/cop/style/trailing_comma_in_arguments.rb +20 -6
- data/lib/rubocop/cop/style/trailing_comma_in_literal.rb +22 -7
- data/lib/rubocop/cop/style/trailing_method_end_statement.rb +95 -0
- data/lib/rubocop/cop/style/trailing_underscore_variable.rb +8 -4
- data/lib/rubocop/cop/style/trivial_accessors.rb +32 -10
- data/lib/rubocop/cop/style/unless_else.rb +15 -0
- data/lib/rubocop/cop/style/unneeded_capital_w.rb +17 -7
- data/lib/rubocop/cop/style/unneeded_interpolation.rb +14 -18
- data/lib/rubocop/cop/style/unneeded_percent_q.rb +13 -12
- data/lib/rubocop/cop/style/variable_interpolation.rb +20 -9
- data/lib/rubocop/cop/style/when_then.rb +13 -0
- data/lib/rubocop/cop/style/while_until_do.rb +26 -4
- data/lib/rubocop/cop/style/while_until_modifier.rb +25 -6
- data/lib/rubocop/cop/style/word_array.rb +4 -8
- data/lib/rubocop/cop/style/yoda_condition.rb +10 -16
- data/lib/rubocop/cop/style/zero_length_predicate.rb +23 -15
- data/lib/rubocop/cop/util.rb +42 -33
- data/lib/rubocop/cop/variable_force.rb +1 -1
- data/lib/rubocop/cop/variable_force/assignment.rb +4 -2
- data/lib/rubocop/cop/variable_force/scope.rb +1 -5
- data/lib/rubocop/cop/variable_force/variable.rb +1 -1
- data/lib/rubocop/formatter/disabled_config_formatter.rb +2 -3
- data/lib/rubocop/formatter/formatter_set.rb +2 -1
- data/lib/rubocop/formatter/json_formatter.rb +9 -3
- data/lib/rubocop/formatter/quiet_formatter.rb +13 -0
- data/lib/rubocop/node_pattern.rb +2 -3
- data/lib/rubocop/options.rb +8 -8
- data/lib/rubocop/path_util.rb +15 -3
- data/lib/rubocop/processed_source.rb +5 -2
- data/lib/rubocop/rspec/shared_contexts.rb +4 -0
- data/lib/rubocop/runner.rb +1 -1
- data/lib/rubocop/token.rb +74 -0
- data/lib/rubocop/version.rb +1 -1
- metadata +37 -10
- data/lib/rubocop/cop/internal_affairs/deprecated_positional_arguments.rb +0 -81
- data/lib/rubocop/cop/layout/space_inside_brackets.rb +0 -20
- data/lib/rubocop/cop/lint/rescue_without_error_class.rb +0 -41
- data/lib/rubocop/cop/mixin/space_inside.rb +0 -76
@@ -26,8 +26,8 @@ module RuboCop
|
|
26
26
|
# # good
|
27
27
|
# gem 'rubocop', groups: [:development, :test]
|
28
28
|
class DuplicatedGem < Cop
|
29
|
-
MSG = 'Gem
|
30
|
-
|
29
|
+
MSG = 'Gem `%<gem_name>s` requirements already given on line '\
|
30
|
+
'%<line_of_first_occurrence>d of the Gemfile.'.freeze
|
31
31
|
|
32
32
|
def investigate(processed_source)
|
33
33
|
return unless processed_source.ast
|
@@ -58,12 +58,12 @@ module RuboCop
|
|
58
58
|
line_range = node.loc.column...node.loc.last_column
|
59
59
|
offense_location =
|
60
60
|
source_range(processed_source.buffer, node.loc.line, line_range)
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
message: format(MSG, gem_name, line_of_first_occurrence)
|
61
|
+
message = format(
|
62
|
+
MSG,
|
63
|
+
gem_name: gem_name,
|
64
|
+
line_of_first_occurrence: line_of_first_occurrence
|
66
65
|
)
|
66
|
+
add_offense(node, location: offense_location, message: message)
|
67
67
|
end
|
68
68
|
end
|
69
69
|
end
|
@@ -26,8 +26,9 @@ module RuboCop
|
|
26
26
|
# source 'https://rubygems.org' # strongly recommended
|
27
27
|
# source 'http://rubygems.org'
|
28
28
|
class InsecureProtocolSource < Cop
|
29
|
-
MSG = 'The source
|
30
|
-
|
29
|
+
MSG = 'The source `:%<source>s` is deprecated because HTTP requests ' \
|
30
|
+
'are insecure. ' \
|
31
|
+
"Please change your source to 'https://rubygems.org' " \
|
31
32
|
"if possible, or 'http://rubygems.org' if not.".freeze
|
32
33
|
|
33
34
|
def_node_matcher :insecure_protocol_source?, <<-PATTERN
|
@@ -37,7 +38,7 @@ module RuboCop
|
|
37
38
|
|
38
39
|
def on_send(node)
|
39
40
|
insecure_protocol_source?(node) do |source|
|
40
|
-
message = format(MSG, source)
|
41
|
+
message = format(MSG, source: source)
|
41
42
|
|
42
43
|
add_offense(
|
43
44
|
node,
|
@@ -30,7 +30,7 @@ module RuboCop
|
|
30
30
|
|
31
31
|
MSG = 'Gems should be sorted in an alphabetical order within their '\
|
32
32
|
'section of the Gemfile. '\
|
33
|
-
'Gem
|
33
|
+
'Gem `%<previous>s` should appear before `%<current>s`.'.freeze
|
34
34
|
|
35
35
|
def investigate(processed_source)
|
36
36
|
return if processed_source.ast.nil?
|
@@ -54,7 +54,7 @@ module RuboCop
|
|
54
54
|
end
|
55
55
|
|
56
56
|
def_node_search :gem_declarations, <<-PATTERN
|
57
|
-
(:send nil? :gem ...)
|
57
|
+
(:send nil? :gem str ...)
|
58
58
|
PATTERN
|
59
59
|
end
|
60
60
|
end
|
data/lib/rubocop/cop/cop.rb
CHANGED
@@ -115,13 +115,23 @@ module RuboCop
|
|
115
115
|
self.class::MSG
|
116
116
|
end
|
117
117
|
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
118
|
+
# rubocop:disable Metrics/CyclomaticComplexity
|
119
|
+
def add_offense(node, location: :expression, message: nil, severity: nil)
|
120
|
+
loc = find_location(node, location)
|
121
|
+
|
122
|
+
return if duplicate_location?(loc)
|
123
|
+
|
124
|
+
severity = custom_severity || severity || default_severity
|
125
|
+
|
126
|
+
message ||= message(node)
|
127
|
+
message = annotate(message)
|
128
|
+
|
129
|
+
status = enabled_line?(loc.line) ? correct(node) : :disabled
|
130
|
+
|
131
|
+
@offenses << Offense.new(severity, loc, message, name, status)
|
132
|
+
yield if block_given? && status != :disabled
|
124
133
|
end
|
134
|
+
# rubocop:enable Metrics/CyclomaticComplexity
|
125
135
|
|
126
136
|
def find_location(node, loc)
|
127
137
|
# Location can be provided as a symbol, e.g.: `:keyword`
|
@@ -222,46 +232,6 @@ module RuboCop
|
|
222
232
|
warn(Rainbow(message).red)
|
223
233
|
end
|
224
234
|
end
|
225
|
-
|
226
|
-
def add_offense_deprecated(node, loc = :expression, message = nil,
|
227
|
-
severity = nil, &block)
|
228
|
-
|
229
|
-
caller = caller_locations(2..2).first
|
230
|
-
path = "#{caller.path}:#{caller.lineno}"
|
231
|
-
warn_message = <<-RUBY.strip_indent
|
232
|
-
#{path}
|
233
|
-
Warning: The usage of positional location, message, and severity
|
234
|
-
parameters to Cop#add_offense is deprecated.
|
235
|
-
Please use keyword arguments instead.
|
236
|
-
|
237
|
-
The positional arguments version of Cop#add_offense will be removed in
|
238
|
-
RuboCop 0.52
|
239
|
-
RUBY
|
240
|
-
|
241
|
-
warn(Rainbow(warn_message).red)
|
242
|
-
|
243
|
-
add_offense_common(node, location: loc, message: message,
|
244
|
-
severity: severity, &block)
|
245
|
-
end
|
246
|
-
|
247
|
-
# rubocop:disable Metrics/CyclomaticComplexity
|
248
|
-
def add_offense_common(node, location: :expression, message: nil,
|
249
|
-
severity: nil)
|
250
|
-
loc = find_location(node, location)
|
251
|
-
|
252
|
-
return if duplicate_location?(loc)
|
253
|
-
|
254
|
-
severity = custom_severity || severity || default_severity
|
255
|
-
|
256
|
-
message ||= message(node)
|
257
|
-
message = annotate(message)
|
258
|
-
|
259
|
-
status = enabled_line?(loc.line) ? correct(node) : :disabled
|
260
|
-
|
261
|
-
@offenses << Offense.new(severity, loc, message, name, status)
|
262
|
-
yield if block_given? && status != :disabled
|
263
|
-
end
|
264
|
-
# rubocop:enable Metrics/CyclomaticComplexity
|
265
235
|
end
|
266
236
|
end
|
267
237
|
end
|
@@ -0,0 +1,102 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RuboCop
|
4
|
+
module Cop
|
5
|
+
module Gemspec
|
6
|
+
# An attribute assignment method calls should be listed only once
|
7
|
+
# in a gemspec.
|
8
|
+
#
|
9
|
+
# Assigning to an attribute with the same name using `spec.foo =` will be
|
10
|
+
# an unintended usage. On the other hand, duplication of methods such
|
11
|
+
# as `spec.requirements`, `spec.add_runtime_dependency` and others are
|
12
|
+
# permitted because it is the intended use of appending values.
|
13
|
+
#
|
14
|
+
# @example
|
15
|
+
# # bad
|
16
|
+
# Gem::Specification.new do |spec|
|
17
|
+
# spec.name = 'rubocop'
|
18
|
+
# spec.name = 'rubocop2'
|
19
|
+
# end
|
20
|
+
#
|
21
|
+
# # good
|
22
|
+
# Gem::Specification.new do |spec|
|
23
|
+
# spec.name = 'rubocop'
|
24
|
+
# end
|
25
|
+
#
|
26
|
+
# # good
|
27
|
+
# Gem::Specification.new do |spec|
|
28
|
+
# spec.requirements << 'libmagick, v6.0'
|
29
|
+
# spec.requirements << 'A good graphics card'
|
30
|
+
# end
|
31
|
+
#
|
32
|
+
# # good
|
33
|
+
# Gem::Specification.new do |spec|
|
34
|
+
# spec.add_runtime_dependency('parallel', '~> 1.10')
|
35
|
+
# spec.add_runtime_dependency('parser', '>= 2.3.3.1', '< 3.0')
|
36
|
+
# end
|
37
|
+
class DuplicatedAssignment < Cop
|
38
|
+
MSG = '`%<assignment>s` method calls already given on line '\
|
39
|
+
'%<line_of_first_occurrence>d of the gemspec.'.freeze
|
40
|
+
|
41
|
+
def_node_search :gem_specification, <<-PATTERN
|
42
|
+
(block
|
43
|
+
(send
|
44
|
+
(const
|
45
|
+
(const {cbase nil?} :Gem) :Specification) :new)
|
46
|
+
(args
|
47
|
+
(arg $_)) ...)
|
48
|
+
PATTERN
|
49
|
+
|
50
|
+
def_node_search :assignment_method_declarations, <<-PATTERN
|
51
|
+
(send
|
52
|
+
(lvar #match_block_variable_name?) #assignment_method? ...)
|
53
|
+
PATTERN
|
54
|
+
|
55
|
+
def investigate(processed_source)
|
56
|
+
return unless processed_source.ast
|
57
|
+
|
58
|
+
duplicated_assignment_method_nodes.each do |nodes|
|
59
|
+
nodes[1..-1].each do |node|
|
60
|
+
register_offense(
|
61
|
+
node,
|
62
|
+
node.method_name,
|
63
|
+
nodes.first.loc.line
|
64
|
+
)
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
private
|
70
|
+
|
71
|
+
def match_block_variable_name?(receiver_name)
|
72
|
+
gem_specification(processed_source.ast) do |block_variable_name|
|
73
|
+
return block_variable_name == receiver_name
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
def assignment_method?(method_name)
|
78
|
+
method_name.to_s.end_with?('=')
|
79
|
+
end
|
80
|
+
|
81
|
+
def duplicated_assignment_method_nodes
|
82
|
+
assignment_method_declarations(processed_source.ast)
|
83
|
+
.group_by(&:method_name)
|
84
|
+
.values
|
85
|
+
.select { |nodes| nodes.size > 1 }
|
86
|
+
end
|
87
|
+
|
88
|
+
def register_offense(node, assignment, line_of_first_occurrence)
|
89
|
+
line_range = node.loc.column...node.loc.last_column
|
90
|
+
offense_location =
|
91
|
+
source_range(processed_source.buffer, node.loc.line, line_range)
|
92
|
+
message = format(
|
93
|
+
MSG,
|
94
|
+
assignment: assignment,
|
95
|
+
line_of_first_occurrence: line_of_first_occurrence
|
96
|
+
)
|
97
|
+
add_offense(node, location: offense_location, message: message)
|
98
|
+
end
|
99
|
+
end
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|
@@ -54,9 +54,10 @@ module RuboCop
|
|
54
54
|
include ConfigurableEnforcedStyle
|
55
55
|
include OrderedGemNode
|
56
56
|
|
57
|
-
MSG = 'Dependencies should be sorted in an alphabetical order within '\
|
57
|
+
MSG = 'Dependencies should be sorted in an alphabetical order within ' \
|
58
58
|
'their section of the gemspec. '\
|
59
|
-
'Dependency
|
59
|
+
'Dependency `%<previous>s` should appear before `%<current>s`.'
|
60
|
+
.freeze
|
60
61
|
|
61
62
|
def investigate(processed_source)
|
62
63
|
return if processed_source.ast.nil?
|
@@ -0,0 +1,87 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RuboCop
|
4
|
+
module Cop
|
5
|
+
module Gemspec
|
6
|
+
# Checks that `required_ruby_version` of gemspec and `TargetRubyVersion`
|
7
|
+
# of .rubocop.yml are equal.
|
8
|
+
# Thereby, RuboCop to perform static analysis working on the version
|
9
|
+
# required by gemspec.
|
10
|
+
#
|
11
|
+
# @example
|
12
|
+
# # When `TargetRubyVersion` of .rubocop.yml is `2.3`.
|
13
|
+
#
|
14
|
+
# # bad
|
15
|
+
# Gem::Specification.new do |spec|
|
16
|
+
# spec.required_ruby_version = '>= 2.2.0'
|
17
|
+
# end
|
18
|
+
#
|
19
|
+
# # bad
|
20
|
+
# Gem::Specification.new do |spec|
|
21
|
+
# spec.required_ruby_version = '>= 2.4.0'
|
22
|
+
# end
|
23
|
+
#
|
24
|
+
# # good
|
25
|
+
# Gem::Specification.new do |spec|
|
26
|
+
# spec.required_ruby_version = '>= 2.3.0'
|
27
|
+
# end
|
28
|
+
#
|
29
|
+
# # good
|
30
|
+
# Gem::Specification.new do |spec|
|
31
|
+
# spec.required_ruby_version = '>= 2.3'
|
32
|
+
# end
|
33
|
+
#
|
34
|
+
# # good
|
35
|
+
# Gem::Specification.new do |spec|
|
36
|
+
# spec.required_ruby_version = ['>= 2.3.0', '< 2.5.0']
|
37
|
+
# end
|
38
|
+
class RequiredRubyVersion < Cop
|
39
|
+
MSG = '`required_ruby_version` (%<required_ruby_version>s, ' \
|
40
|
+
'declared in %<gemspec_filename>s) and `TargetRubyVersion` ' \
|
41
|
+
'(%<target_ruby_version>s, declared in .rubocop.yml) ' \
|
42
|
+
'should be equal.'.freeze
|
43
|
+
|
44
|
+
def_node_search :required_ruby_version, <<-PATTERN
|
45
|
+
(send _ :required_ruby_version= ${(str _) (array (str _))})
|
46
|
+
PATTERN
|
47
|
+
|
48
|
+
def investigate(processed_source)
|
49
|
+
required_ruby_version(processed_source.ast) do |version|
|
50
|
+
ruby_version = extract_ruby_version(version)
|
51
|
+
|
52
|
+
return if ruby_version == target_ruby_version.to_s
|
53
|
+
|
54
|
+
add_offense(
|
55
|
+
processed_source.ast,
|
56
|
+
location: version.loc.expression,
|
57
|
+
message: message(ruby_version, target_ruby_version)
|
58
|
+
)
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
private
|
63
|
+
|
64
|
+
def extract_ruby_version(required_ruby_version)
|
65
|
+
if required_ruby_version.array_type?
|
66
|
+
required_ruby_version = required_ruby_version.children.detect do |v|
|
67
|
+
v.str_content =~ /[>=]/
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
required_ruby_version.str_content.match(/(\d\.\d)/)[1]
|
72
|
+
end
|
73
|
+
|
74
|
+
def message(required_ruby_version, target_ruby_version)
|
75
|
+
file_path = processed_source.buffer.name
|
76
|
+
|
77
|
+
format(
|
78
|
+
MSG,
|
79
|
+
required_ruby_version: required_ruby_version,
|
80
|
+
gemspec_filename: File.basename(file_path),
|
81
|
+
target_ruby_version: target_ruby_version
|
82
|
+
)
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
@@ -35,10 +35,10 @@ module RuboCop
|
|
35
35
|
# See. https://github.com/bbatsov/rubocop/blob/master/lib/rubocop/node_pattern.rb
|
36
36
|
#
|
37
37
|
# For example
|
38
|
-
MSG = '
|
38
|
+
MSG = 'Use `#good_method` instead of `#bad_method`.'.freeze
|
39
39
|
|
40
40
|
def_node_matcher :bad_method?, <<-PATTERN
|
41
|
-
(send nil :bad_method ...)
|
41
|
+
(send nil? :bad_method ...)
|
42
42
|
PATTERN
|
43
43
|
|
44
44
|
def on_send(node)
|
@@ -55,9 +55,10 @@ module RuboCop
|
|
55
55
|
# frozen_string_literal: true
|
56
56
|
|
57
57
|
describe RuboCop::Cop::%<department>s::%<cop_name>s do
|
58
|
-
let(:config) { RuboCop::Config.new }
|
59
58
|
subject(:cop) { described_class.new(config) }
|
60
59
|
|
60
|
+
let(:config) { RuboCop::Config.new }
|
61
|
+
|
61
62
|
# TODO: Write test code
|
62
63
|
#
|
63
64
|
# For example
|
@@ -96,6 +97,22 @@ module RuboCop
|
|
96
97
|
RequireFileInjector.new(require_path).inject
|
97
98
|
end
|
98
99
|
|
100
|
+
def inject_config(path = 'config/enabled.yml')
|
101
|
+
config = File.readlines(path)
|
102
|
+
content = <<-YAML.strip_indent
|
103
|
+
#{badge}:
|
104
|
+
Description: 'TODO: Write a description of the cop.'
|
105
|
+
Enabled: true
|
106
|
+
|
107
|
+
YAML
|
108
|
+
target_line = config.find.with_index(1) do |line, index|
|
109
|
+
next if line =~ /^[\s#]/
|
110
|
+
break index - 1 if badge.to_s < line
|
111
|
+
end
|
112
|
+
config.insert(target_line, content)
|
113
|
+
File.write(path, config.join)
|
114
|
+
end
|
115
|
+
|
99
116
|
def todo
|
100
117
|
<<-TODO.strip_indent
|
101
118
|
Files created:
|
@@ -103,11 +120,13 @@ module RuboCop
|
|
103
120
|
- #{spec_path}
|
104
121
|
File modified:
|
105
122
|
- `require_relative '#{require_path}'` added into lib/rubocop.rb
|
123
|
+
- A configuration for the cop is added into config/enabled.yml
|
124
|
+
- If you want to disable the cop by default, move the added config to config/disabled.yml
|
106
125
|
|
107
126
|
Do 3 steps:
|
108
127
|
1. Add an entry to the "New features" section in CHANGELOG.md,
|
109
128
|
e.g. "Add new `#{badge}` cop. ([@your_id][])"
|
110
|
-
2.
|
129
|
+
2. Modify the description of #{badge} in config/enabled.yml
|
111
130
|
3. Implement your new cop in the generated file!
|
112
131
|
TODO
|
113
132
|
end
|
@@ -1,8 +1,8 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require_relative 'internal_affairs/node_destructuring'
|
3
4
|
require_relative 'internal_affairs/node_type_predicate'
|
4
5
|
require_relative 'internal_affairs/offense_location_keyword'
|
5
6
|
require_relative 'internal_affairs/redundant_message_argument'
|
6
7
|
require_relative 'internal_affairs/redundant_location_argument'
|
7
8
|
require_relative 'internal_affairs/useless_message_assertion'
|
8
|
-
require_relative 'internal_affairs/deprecated_positional_arguments'
|
@@ -0,0 +1,46 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RuboCop
|
4
|
+
module Cop
|
5
|
+
module InternalAffairs
|
6
|
+
# Checks that node destructuring is done either using the node
|
7
|
+
# extensions or using a splat.
|
8
|
+
#
|
9
|
+
# @example Using splat expansion
|
10
|
+
#
|
11
|
+
# # bad
|
12
|
+
# receiver, method_name, arguments = send_node.children
|
13
|
+
#
|
14
|
+
# # good
|
15
|
+
# receiver, method_name, arguments = *send_node
|
16
|
+
#
|
17
|
+
# @example Using node extensions
|
18
|
+
#
|
19
|
+
# # bad
|
20
|
+
# _receiver, method_name, _arguments = send_node.children
|
21
|
+
#
|
22
|
+
# # good
|
23
|
+
# method_name = send_node.method_name
|
24
|
+
class NodeDestructuring < Cop
|
25
|
+
MSG = 'Use the methods provided with the node extensions, or ' \
|
26
|
+
'destructure the node using `*`.'.freeze
|
27
|
+
|
28
|
+
def_node_matcher :node_children_destructuring?, <<-PATTERN
|
29
|
+
(masgn (mlhs ...) (send (send nil? [#node_suffix? _]) :children))
|
30
|
+
PATTERN
|
31
|
+
|
32
|
+
def on_masgn(node)
|
33
|
+
node_children_destructuring?(node) do
|
34
|
+
add_offense(node)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
private
|
39
|
+
|
40
|
+
def node_suffix?(method_name)
|
41
|
+
method_name.to_s.end_with?('node')
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|