rubocop 1.26.0 → 1.36.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 +7 -5
- data/config/default.yml +254 -47
- data/config/obsoletion.yml +35 -2
- data/exe/rubocop +15 -7
- data/lib/rubocop/cache_config.rb +29 -0
- data/lib/rubocop/cli/command/{auto_genenerate_config.rb → auto_generate_config.rb} +20 -5
- data/lib/rubocop/cli/command/execute_runner.rb +1 -1
- data/lib/rubocop/cli/command/init_dotfile.rb +1 -1
- data/lib/rubocop/cli/command/show_cops.rb +1 -1
- data/lib/rubocop/cli/command/suggest_extensions.rb +54 -16
- data/lib/rubocop/cli.rb +2 -0
- data/lib/rubocop/config.rb +6 -2
- data/lib/rubocop/config_finder.rb +68 -0
- data/lib/rubocop/config_loader.rb +15 -41
- data/lib/rubocop/config_loader_resolver.rb +2 -6
- data/lib/rubocop/config_obsoletion/changed_parameter.rb +5 -0
- data/lib/rubocop/config_obsoletion/extracted_cop.rb +3 -1
- data/lib/rubocop/config_obsoletion/parameter_rule.rb +4 -0
- data/lib/rubocop/config_obsoletion.rb +7 -2
- data/lib/rubocop/config_validator.rb +21 -4
- data/lib/rubocop/cop/autocorrect_logic.rb +8 -2
- data/lib/rubocop/cop/badge.rb +1 -1
- data/lib/rubocop/cop/base.rb +6 -2
- data/lib/rubocop/cop/bundler/duplicated_gem.rb +3 -7
- data/lib/rubocop/cop/bundler/gem_comment.rb +1 -1
- data/lib/rubocop/cop/bundler/gem_filename.rb +5 -5
- data/lib/rubocop/cop/bundler/ordered_gems.rb +2 -2
- data/lib/rubocop/cop/cop.rb +1 -1
- data/lib/rubocop/cop/corrector.rb +2 -2
- data/lib/rubocop/cop/correctors/alignment_corrector.rb +1 -1
- data/lib/rubocop/cop/correctors/condition_corrector.rb +1 -1
- data/lib/rubocop/cop/correctors/each_to_for_corrector.rb +1 -1
- data/lib/rubocop/cop/correctors/empty_line_corrector.rb +1 -1
- data/lib/rubocop/cop/correctors/for_to_each_corrector.rb +4 -2
- data/lib/rubocop/cop/correctors/if_then_corrector.rb +1 -1
- data/lib/rubocop/cop/correctors/lambda_literal_to_method_corrector.rb +1 -1
- data/lib/rubocop/cop/correctors/line_break_corrector.rb +7 -1
- data/lib/rubocop/cop/correctors/multiline_literal_brace_corrector.rb +3 -3
- data/lib/rubocop/cop/correctors/ordered_gem_corrector.rb +1 -1
- data/lib/rubocop/cop/correctors/parentheses_corrector.rb +59 -1
- data/lib/rubocop/cop/correctors/percent_literal_corrector.rb +1 -1
- data/lib/rubocop/cop/correctors/punctuation_corrector.rb +1 -1
- data/lib/rubocop/cop/correctors/space_corrector.rb +1 -1
- data/lib/rubocop/cop/correctors/string_literal_corrector.rb +1 -1
- data/lib/rubocop/cop/correctors/unused_arg_corrector.rb +2 -2
- data/lib/rubocop/cop/gemspec/dependency_version.rb +156 -0
- data/lib/rubocop/cop/gemspec/deprecated_attribute_assignment.rb +92 -0
- data/lib/rubocop/cop/gemspec/duplicated_assignment.rb +5 -12
- data/lib/rubocop/cop/gemspec/ordered_dependencies.rb +1 -1
- data/lib/rubocop/cop/gemspec/require_mfa.rb +21 -21
- data/lib/rubocop/cop/gemspec/ruby_version_globals_usage.rb +1 -1
- data/lib/rubocop/cop/generator/require_file_injector.rb +2 -2
- data/lib/rubocop/cop/generator.rb +5 -1
- data/lib/rubocop/cop/internal_affairs/cop_description.rb +96 -0
- data/lib/rubocop/cop/internal_affairs/empty_line_between_expect_offense_and_correction.rb +1 -1
- data/lib/rubocop/cop/internal_affairs/location_line_equality_comparison.rb +1 -1
- data/lib/rubocop/cop/internal_affairs/method_name_end_with.rb +80 -0
- data/lib/rubocop/cop/internal_affairs/node_matcher_directive.rb +1 -5
- data/lib/rubocop/cop/internal_affairs/numblock_handler.rb +69 -0
- data/lib/rubocop/cop/internal_affairs/redundant_described_class_as_subject.rb +1 -1
- data/lib/rubocop/cop/internal_affairs/redundant_let_rubocop_config_new.rb +1 -1
- 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/internal_affairs/single_line_comparison.rb +62 -0
- data/lib/rubocop/cop/internal_affairs/useless_restrict_on_send.rb +60 -0
- data/lib/rubocop/cop/internal_affairs.rb +5 -0
- data/lib/rubocop/cop/layout/argument_alignment.rb +22 -1
- data/lib/rubocop/cop/layout/assignment_indentation.rb +1 -1
- data/lib/rubocop/cop/layout/begin_end_alignment.rb +1 -1
- data/lib/rubocop/cop/layout/block_alignment.rb +17 -13
- data/lib/rubocop/cop/layout/block_end_newline.rb +36 -6
- data/lib/rubocop/cop/layout/case_indentation.rb +17 -1
- data/lib/rubocop/cop/layout/closing_parenthesis_indentation.rb +1 -1
- data/lib/rubocop/cop/layout/comment_indentation.rb +2 -2
- data/lib/rubocop/cop/layout/condition_position.rb +1 -1
- data/lib/rubocop/cop/layout/def_end_alignment.rb +1 -1
- data/lib/rubocop/cop/layout/dot_position.rb +1 -1
- data/lib/rubocop/cop/layout/else_alignment.rb +1 -1
- data/lib/rubocop/cop/layout/empty_comment.rb +2 -2
- data/lib/rubocop/cop/layout/empty_line_after_guard_clause.rb +1 -1
- data/lib/rubocop/cop/layout/empty_line_after_multiline_condition.rb +1 -1
- data/lib/rubocop/cop/layout/empty_line_between_defs.rb +1 -1
- data/lib/rubocop/cop/layout/empty_lines.rb +1 -1
- data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +5 -2
- data/lib/rubocop/cop/layout/empty_lines_around_arguments.rb +1 -1
- data/lib/rubocop/cop/layout/empty_lines_around_attribute_accessor.rb +25 -4
- data/lib/rubocop/cop/layout/empty_lines_around_begin_body.rb +1 -1
- data/lib/rubocop/cop/layout/empty_lines_around_block_body.rb +7 -5
- data/lib/rubocop/cop/layout/empty_lines_around_class_body.rb +10 -10
- data/lib/rubocop/cop/layout/empty_lines_around_exception_handling_keywords.rb +1 -1
- data/lib/rubocop/cop/layout/empty_lines_around_method_body.rb +1 -1
- data/lib/rubocop/cop/layout/empty_lines_around_module_body.rb +10 -10
- data/lib/rubocop/cop/layout/end_alignment.rb +1 -1
- data/lib/rubocop/cop/layout/end_of_line.rb +5 -5
- data/lib/rubocop/cop/layout/extra_spacing.rb +1 -1
- data/lib/rubocop/cop/layout/first_argument_indentation.rb +34 -29
- data/lib/rubocop/cop/layout/first_array_element_indentation.rb +21 -14
- data/lib/rubocop/cop/layout/first_array_element_line_break.rb +1 -1
- data/lib/rubocop/cop/layout/first_hash_element_indentation.rb +52 -13
- data/lib/rubocop/cop/layout/first_hash_element_line_break.rb +1 -1
- data/lib/rubocop/cop/layout/first_method_argument_line_break.rb +1 -1
- data/lib/rubocop/cop/layout/first_method_parameter_line_break.rb +1 -1
- data/lib/rubocop/cop/layout/first_parameter_indentation.rb +1 -1
- data/lib/rubocop/cop/layout/hash_alignment.rb +2 -0
- data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +1 -1
- data/lib/rubocop/cop/layout/heredoc_indentation.rb +1 -1
- data/lib/rubocop/cop/layout/indentation_consistency.rb +1 -1
- data/lib/rubocop/cop/layout/indentation_style.rb +1 -1
- data/lib/rubocop/cop/layout/indentation_width.rb +16 -10
- data/lib/rubocop/cop/layout/initial_indentation.rb +2 -2
- data/lib/rubocop/cop/layout/leading_comment_space.rb +1 -1
- data/lib/rubocop/cop/layout/leading_empty_lines.rb +1 -1
- data/lib/rubocop/cop/layout/line_continuation_leading_space.rb +112 -0
- data/lib/rubocop/cop/layout/line_continuation_spacing.rb +130 -0
- data/lib/rubocop/cop/layout/line_end_string_concatenation_indentation.rb +2 -2
- data/lib/rubocop/cop/layout/line_length.rb +11 -6
- data/lib/rubocop/cop/layout/multiline_array_brace_layout.rb +1 -1
- data/lib/rubocop/cop/layout/multiline_array_line_breaks.rb +1 -1
- data/lib/rubocop/cop/layout/multiline_assignment_layout.rb +2 -2
- data/lib/rubocop/cop/layout/multiline_block_layout.rb +4 -2
- data/lib/rubocop/cop/layout/multiline_hash_brace_layout.rb +1 -1
- data/lib/rubocop/cop/layout/multiline_hash_key_line_breaks.rb +1 -1
- data/lib/rubocop/cop/layout/multiline_method_argument_line_breaks.rb +5 -2
- data/lib/rubocop/cop/layout/multiline_method_call_brace_layout.rb +1 -1
- data/lib/rubocop/cop/layout/multiline_method_call_indentation.rb +22 -5
- data/lib/rubocop/cop/layout/multiline_method_definition_brace_layout.rb +1 -1
- data/lib/rubocop/cop/layout/multiline_method_parameter_line_breaks.rb +45 -0
- data/lib/rubocop/cop/layout/multiline_operation_indentation.rb +3 -3
- data/lib/rubocop/cop/layout/redundant_line_break.rb +5 -6
- data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +1 -1
- data/lib/rubocop/cop/layout/single_line_block_chain.rb +1 -1
- data/lib/rubocop/cop/layout/space_after_not.rb +1 -1
- data/lib/rubocop/cop/layout/space_around_block_parameters.rb +3 -3
- data/lib/rubocop/cop/layout/space_around_keyword.rb +1 -1
- data/lib/rubocop/cop/layout/space_around_operators.rb +1 -1
- data/lib/rubocop/cop/layout/space_before_block_braces.rb +5 -3
- data/lib/rubocop/cop/layout/space_before_brackets.rb +7 -0
- data/lib/rubocop/cop/layout/space_before_comment.rb +1 -1
- data/lib/rubocop/cop/layout/space_before_first_arg.rb +1 -1
- data/lib/rubocop/cop/layout/space_in_lambda_literal.rb +1 -1
- data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +10 -10
- data/lib/rubocop/cop/layout/space_inside_block_braces.rb +33 -15
- data/lib/rubocop/cop/layout/space_inside_reference_brackets.rb +1 -1
- data/lib/rubocop/cop/layout/space_inside_string_interpolation.rb +1 -1
- data/lib/rubocop/cop/layout/trailing_empty_lines.rb +9 -9
- data/lib/rubocop/cop/layout/trailing_whitespace.rb +3 -3
- data/lib/rubocop/cop/legacy/corrections_proxy.rb +1 -1
- data/lib/rubocop/cop/legacy/corrector.rb +1 -1
- data/lib/rubocop/cop/lint/ambiguous_assignment.rb +1 -1
- data/lib/rubocop/cop/lint/ambiguous_block_association.rb +28 -7
- data/lib/rubocop/cop/lint/ambiguous_operator.rb +7 -7
- data/lib/rubocop/cop/lint/ambiguous_operator_precedence.rb +1 -1
- data/lib/rubocop/cop/lint/ambiguous_range.rb +5 -5
- data/lib/rubocop/cop/lint/ambiguous_regexp_literal.rb +1 -1
- data/lib/rubocop/cop/lint/assignment_in_condition.rb +1 -1
- data/lib/rubocop/cop/lint/binary_operator_with_identical_operands.rb +1 -1
- data/lib/rubocop/cop/lint/boolean_symbol.rb +1 -1
- data/lib/rubocop/cop/lint/circular_argument_reference.rb +1 -1
- data/lib/rubocop/cop/lint/constant_overwritten_in_rescue.rb +51 -0
- data/lib/rubocop/cop/lint/debugger.rb +27 -17
- data/lib/rubocop/cop/lint/deprecated_class_methods.rb +15 -9
- data/lib/rubocop/cop/lint/deprecated_constants.rb +1 -1
- data/lib/rubocop/cop/lint/disjunctive_assignment_in_constructor.rb +1 -1
- data/lib/rubocop/cop/lint/duplicate_branch.rb +1 -1
- data/lib/rubocop/cop/lint/duplicate_case_condition.rb +1 -1
- data/lib/rubocop/cop/lint/duplicate_elsif_condition.rb +1 -1
- data/lib/rubocop/cop/lint/duplicate_hash_key.rb +1 -1
- data/lib/rubocop/cop/lint/duplicate_methods.rb +1 -1
- data/lib/rubocop/cop/lint/duplicate_regexp_character_class_element.rb +1 -1
- data/lib/rubocop/cop/lint/duplicate_require.rb +11 -2
- data/lib/rubocop/cop/lint/duplicate_rescue_exception.rb +1 -1
- data/lib/rubocop/cop/lint/each_with_object_argument.rb +1 -1
- data/lib/rubocop/cop/lint/else_layout.rb +3 -3
- data/lib/rubocop/cop/lint/empty_block.rb +2 -2
- data/lib/rubocop/cop/lint/empty_class.rb +1 -1
- data/lib/rubocop/cop/lint/empty_conditional_body.rb +99 -3
- data/lib/rubocop/cop/lint/empty_ensure.rb +1 -1
- data/lib/rubocop/cop/lint/empty_expression.rb +1 -1
- data/lib/rubocop/cop/lint/empty_file.rb +1 -1
- data/lib/rubocop/cop/lint/empty_in_pattern.rb +4 -2
- data/lib/rubocop/cop/lint/empty_interpolation.rb +1 -1
- data/lib/rubocop/cop/lint/empty_when.rb +4 -2
- data/lib/rubocop/cop/lint/ensure_return.rb +1 -1
- data/lib/rubocop/cop/lint/erb_new_arguments.rb +10 -10
- data/lib/rubocop/cop/lint/flip_flop.rb +1 -1
- data/lib/rubocop/cop/lint/float_comparison.rb +1 -1
- data/lib/rubocop/cop/lint/float_out_of_range.rb +1 -1
- data/lib/rubocop/cop/lint/heredoc_method_call_position.rb +1 -1
- data/lib/rubocop/cop/lint/implicit_string_concatenation.rb +1 -1
- data/lib/rubocop/cop/lint/incompatible_io_select_with_fiber_scheduler.rb +11 -4
- data/lib/rubocop/cop/lint/ineffective_access_modifier.rb +1 -1
- data/lib/rubocop/cop/lint/inherit_exception.rb +1 -1
- data/lib/rubocop/cop/lint/interpolation_check.rb +2 -2
- data/lib/rubocop/cop/lint/lambda_without_literal_block.rb +10 -3
- data/lib/rubocop/cop/lint/literal_as_condition.rb +6 -1
- data/lib/rubocop/cop/lint/literal_in_interpolation.rb +5 -1
- data/lib/rubocop/cop/lint/loop.rb +2 -2
- data/lib/rubocop/cop/lint/missing_cop_enable_directive.rb +1 -1
- data/lib/rubocop/cop/lint/missing_super.rb +1 -1
- data/lib/rubocop/cop/lint/nested_method_definition.rb +1 -1
- data/lib/rubocop/cop/lint/nested_percent_literal.rb +1 -1
- data/lib/rubocop/cop/lint/next_without_accumulator.rb +25 -6
- data/lib/rubocop/cop/lint/non_atomic_file_operation.rb +157 -0
- data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +17 -5
- data/lib/rubocop/cop/lint/non_local_exit_from_iterator.rb +1 -1
- data/lib/rubocop/cop/lint/number_conversion.rb +32 -10
- data/lib/rubocop/cop/lint/numbered_parameter_assignment.rb +1 -1
- data/lib/rubocop/cop/lint/or_assignment_to_constant.rb +2 -3
- data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +2 -2
- data/lib/rubocop/cop/lint/percent_string_array.rb +1 -1
- data/lib/rubocop/cop/lint/percent_symbol_array.rb +1 -1
- data/lib/rubocop/cop/lint/raise_exception.rb +2 -2
- data/lib/rubocop/cop/lint/rand_one.rb +1 -1
- data/lib/rubocop/cop/lint/redundant_cop_disable_directive.rb +6 -6
- data/lib/rubocop/cop/lint/redundant_cop_enable_directive.rb +2 -2
- data/lib/rubocop/cop/lint/redundant_dir_glob_sort.rb +3 -3
- data/lib/rubocop/cop/lint/redundant_require_statement.rb +4 -1
- data/lib/rubocop/cop/lint/redundant_safe_navigation.rb +16 -3
- data/lib/rubocop/cop/lint/redundant_splat_expansion.rb +1 -1
- data/lib/rubocop/cop/lint/redundant_string_coercion.rb +1 -1
- data/lib/rubocop/cop/lint/redundant_with_index.rb +14 -11
- data/lib/rubocop/cop/lint/redundant_with_object.rb +13 -12
- data/lib/rubocop/cop/lint/refinement_import_methods.rb +51 -0
- data/lib/rubocop/cop/lint/regexp_as_condition.rb +3 -3
- data/lib/rubocop/cop/lint/require_parentheses.rb +1 -1
- data/lib/rubocop/cop/lint/require_range_parentheses.rb +57 -0
- data/lib/rubocop/cop/lint/rescue_exception.rb +1 -1
- data/lib/rubocop/cop/lint/return_in_void_context.rb +6 -18
- data/lib/rubocop/cop/lint/safe_navigation_chain.rb +38 -1
- data/lib/rubocop/cop/lint/safe_navigation_consistency.rb +1 -1
- data/lib/rubocop/cop/lint/safe_navigation_with_empty.rb +1 -1
- data/lib/rubocop/cop/lint/script_permission.rb +1 -1
- data/lib/rubocop/cop/lint/self_assignment.rb +1 -1
- data/lib/rubocop/cop/lint/shadowed_argument.rb +1 -1
- data/lib/rubocop/cop/lint/shadowed_exception.rb +16 -1
- data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +32 -1
- data/lib/rubocop/cop/lint/struct_new_override.rb +3 -3
- data/lib/rubocop/cop/lint/suppressed_exception.rb +1 -1
- data/lib/rubocop/cop/lint/symbol_conversion.rb +4 -3
- data/lib/rubocop/cop/lint/syntax.rb +2 -3
- data/lib/rubocop/cop/lint/to_enum_arguments.rb +1 -1
- data/lib/rubocop/cop/lint/to_json.rb +1 -1
- data/lib/rubocop/cop/lint/top_level_return_with_argument.rb +1 -1
- data/lib/rubocop/cop/lint/trailing_comma_in_attribute_declaration.rb +2 -2
- data/lib/rubocop/cop/lint/triple_quotes.rb +1 -1
- data/lib/rubocop/cop/lint/underscore_prefixed_variable_name.rb +1 -1
- data/lib/rubocop/cop/lint/unexpected_block_arity.rb +1 -1
- data/lib/rubocop/cop/lint/unified_integer.rb +3 -1
- data/lib/rubocop/cop/lint/unreachable_code.rb +1 -1
- data/lib/rubocop/cop/lint/unreachable_loop.rb +13 -7
- data/lib/rubocop/cop/lint/unused_block_argument.rb +1 -1
- data/lib/rubocop/cop/lint/unused_method_argument.rb +2 -2
- data/lib/rubocop/cop/lint/uri_escape_unescape.rb +1 -1
- data/lib/rubocop/cop/lint/uri_regexp.rb +1 -1
- data/lib/rubocop/cop/lint/useless_access_modifier.rb +9 -7
- data/lib/rubocop/cop/lint/useless_assignment.rb +1 -1
- data/lib/rubocop/cop/lint/useless_else_without_rescue.rb +2 -3
- data/lib/rubocop/cop/lint/useless_method_definition.rb +1 -1
- data/lib/rubocop/cop/lint/useless_ruby2_keywords.rb +2 -2
- data/lib/rubocop/cop/lint/useless_setter_call.rb +2 -2
- data/lib/rubocop/cop/lint/useless_times.rb +2 -2
- data/lib/rubocop/cop/lint/void.rb +3 -1
- data/lib/rubocop/cop/metrics/abc_size.rb +4 -2
- data/lib/rubocop/cop/metrics/block_length.rb +7 -7
- data/lib/rubocop/cop/metrics/block_nesting.rb +1 -1
- data/lib/rubocop/cop/metrics/class_length.rb +1 -1
- data/lib/rubocop/cop/metrics/cyclomatic_complexity.rb +1 -1
- data/lib/rubocop/cop/metrics/method_length.rb +9 -8
- data/lib/rubocop/cop/metrics/module_length.rb +1 -1
- data/lib/rubocop/cop/metrics/parameter_lists.rb +1 -1
- data/lib/rubocop/cop/metrics/perceived_complexity.rb +1 -1
- data/lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +2 -3
- data/lib/rubocop/cop/metrics/utils/code_length_calculator.rb +22 -3
- data/lib/rubocop/cop/mixin/allowed_methods.rb +20 -1
- data/lib/rubocop/cop/mixin/allowed_pattern.rb +56 -0
- data/lib/rubocop/cop/mixin/check_line_breakable.rb +5 -1
- data/lib/rubocop/cop/mixin/comments_help.rb +28 -2
- data/lib/rubocop/cop/mixin/def_node.rb +2 -7
- data/lib/rubocop/cop/mixin/duplication.rb +1 -1
- data/lib/rubocop/cop/mixin/enforce_superclass.rb +2 -1
- data/lib/rubocop/cop/mixin/hash_shorthand_syntax.rb +83 -4
- data/lib/rubocop/cop/mixin/hash_transform_method.rb +10 -6
- data/lib/rubocop/cop/mixin/line_length_help.rb +17 -6
- data/lib/rubocop/cop/mixin/method_complexity.rb +8 -13
- data/lib/rubocop/cop/mixin/multiline_element_indentation.rb +34 -12
- data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +4 -3
- data/lib/rubocop/cop/mixin/percent_array.rb +60 -1
- data/lib/rubocop/cop/mixin/preferred_delimiters.rb +2 -2
- data/lib/rubocop/cop/mixin/range_help.rb +10 -7
- data/lib/rubocop/cop/mixin/statement_modifier.rb +1 -1
- data/lib/rubocop/cop/mixin/string_help.rb +1 -1
- data/lib/rubocop/cop/mixin/surrounding_space.rb +4 -2
- data/lib/rubocop/cop/mixin/trailing_comma.rb +1 -1
- data/lib/rubocop/cop/naming/accessor_method_name.rb +4 -2
- data/lib/rubocop/cop/naming/ascii_identifiers.rb +1 -1
- data/lib/rubocop/cop/naming/binary_operator_parameter_name.rb +1 -1
- data/lib/rubocop/cop/naming/block_forwarding.rb +4 -4
- data/lib/rubocop/cop/naming/block_parameter_name.rb +2 -2
- data/lib/rubocop/cop/naming/class_and_module_camel_case.rb +1 -1
- data/lib/rubocop/cop/naming/constant_name.rb +3 -3
- data/lib/rubocop/cop/naming/file_name.rb +2 -2
- data/lib/rubocop/cop/naming/heredoc_delimiter_case.rb +1 -1
- data/lib/rubocop/cop/naming/heredoc_delimiter_naming.rb +1 -1
- data/lib/rubocop/cop/naming/inclusive_language.rb +3 -2
- data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +1 -1
- data/lib/rubocop/cop/naming/method_name.rb +6 -6
- data/lib/rubocop/cop/naming/method_parameter_name.rb +1 -1
- data/lib/rubocop/cop/naming/predicate_name.rb +32 -3
- data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +1 -1
- data/lib/rubocop/cop/naming/variable_name.rb +10 -1
- data/lib/rubocop/cop/naming/variable_number.rb +28 -18
- data/lib/rubocop/cop/offense.rb +1 -1
- data/lib/rubocop/cop/security/compound_hash.rb +105 -0
- data/lib/rubocop/cop/security/eval.rb +1 -1
- data/lib/rubocop/cop/security/json_load.rb +1 -1
- data/lib/rubocop/cop/security/marshal_load.rb +1 -1
- data/lib/rubocop/cop/security/open.rb +1 -1
- data/lib/rubocop/cop/security/yaml_load.rb +2 -2
- data/lib/rubocop/cop/style/access_modifier_declarations.rb +77 -1
- data/lib/rubocop/cop/style/accessor_grouping.rb +4 -4
- data/lib/rubocop/cop/style/alias.rb +4 -4
- data/lib/rubocop/cop/style/and_or.rb +12 -12
- data/lib/rubocop/cop/style/arguments_forwarding.rb +3 -3
- data/lib/rubocop/cop/style/array_coercion.rb +1 -1
- data/lib/rubocop/cop/style/array_join.rb +1 -1
- data/lib/rubocop/cop/style/ascii_comments.rb +1 -1
- data/lib/rubocop/cop/style/attr.rb +1 -1
- data/lib/rubocop/cop/style/auto_resource_cleanup.rb +1 -1
- data/lib/rubocop/cop/style/bare_percent_literals.rb +1 -1
- data/lib/rubocop/cop/style/bisected_attr_accessor/macro.rb +1 -1
- data/lib/rubocop/cop/style/bisected_attr_accessor.rb +1 -1
- data/lib/rubocop/cop/style/block_comments.rb +1 -1
- data/lib/rubocop/cop/style/block_delimiters.rb +35 -9
- data/lib/rubocop/cop/style/case_equality.rb +41 -11
- data/lib/rubocop/cop/style/case_like_if.rb +2 -2
- data/lib/rubocop/cop/style/character_literal.rb +1 -1
- data/lib/rubocop/cop/style/class_and_module_children.rb +5 -5
- data/lib/rubocop/cop/style/class_check.rb +1 -1
- data/lib/rubocop/cop/style/class_equality_comparison.rb +51 -4
- data/lib/rubocop/cop/style/class_methods.rb +1 -1
- data/lib/rubocop/cop/style/class_methods_definitions.rb +3 -2
- data/lib/rubocop/cop/style/class_vars.rb +1 -1
- data/lib/rubocop/cop/style/collection_compact.rb +4 -4
- data/lib/rubocop/cop/style/collection_methods.rb +3 -1
- data/lib/rubocop/cop/style/colon_method_call.rb +1 -1
- data/lib/rubocop/cop/style/colon_method_definition.rb +1 -1
- data/lib/rubocop/cop/style/combinable_loops.rb +4 -2
- data/lib/rubocop/cop/style/command_literal.rb +1 -1
- data/lib/rubocop/cop/style/comment_annotation.rb +1 -1
- data/lib/rubocop/cop/style/commented_keyword.rb +4 -4
- data/lib/rubocop/cop/style/conditional_assignment.rb +2 -1
- data/lib/rubocop/cop/style/constant_visibility.rb +1 -1
- data/lib/rubocop/cop/style/date_time.rb +2 -2
- data/lib/rubocop/cop/style/def_with_parentheses.rb +1 -1
- data/lib/rubocop/cop/style/dir.rb +4 -1
- data/lib/rubocop/cop/style/documentation.rb +1 -1
- data/lib/rubocop/cop/style/documentation_method.rb +1 -1
- data/lib/rubocop/cop/style/double_negation.rb +62 -3
- data/lib/rubocop/cop/style/each_for_simple_loop.rb +42 -7
- data/lib/rubocop/cop/style/each_with_object.rb +40 -9
- data/lib/rubocop/cop/style/empty_block_parameter.rb +2 -2
- data/lib/rubocop/cop/style/empty_case_condition.rb +3 -4
- data/lib/rubocop/cop/style/empty_else.rb +40 -3
- data/lib/rubocop/cop/style/empty_heredoc.rb +73 -0
- data/lib/rubocop/cop/style/empty_lambda_parameter.rb +2 -2
- data/lib/rubocop/cop/style/empty_literal.rb +2 -2
- data/lib/rubocop/cop/style/empty_method.rb +17 -2
- data/lib/rubocop/cop/style/encoding.rb +2 -2
- data/lib/rubocop/cop/style/end_block.rb +1 -1
- data/lib/rubocop/cop/style/endless_method.rb +1 -1
- data/lib/rubocop/cop/style/env_home.rb +56 -0
- data/lib/rubocop/cop/style/eval_with_location.rb +1 -1
- data/lib/rubocop/cop/style/even_odd.rb +1 -1
- data/lib/rubocop/cop/style/expand_path_arguments.rb +1 -1
- data/lib/rubocop/cop/style/explicit_block_argument.rb +2 -2
- data/lib/rubocop/cop/style/exponential_notation.rb +1 -1
- data/lib/rubocop/cop/style/fetch_env_var.rb +132 -0
- data/lib/rubocop/cop/style/file_write.rb +12 -0
- data/lib/rubocop/cop/style/float_division.rb +1 -1
- data/lib/rubocop/cop/style/for.rb +3 -1
- data/lib/rubocop/cop/style/format_string.rb +1 -1
- data/lib/rubocop/cop/style/format_string_token.rb +73 -23
- data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +6 -3
- data/lib/rubocop/cop/style/global_std_stream.rb +1 -1
- data/lib/rubocop/cop/style/global_vars.rb +1 -1
- data/lib/rubocop/cop/style/guard_clause.rb +62 -4
- data/lib/rubocop/cop/style/hash_as_last_array_item.rb +1 -1
- data/lib/rubocop/cop/style/hash_conversion.rb +1 -1
- data/lib/rubocop/cop/style/hash_each_methods.rb +4 -2
- data/lib/rubocop/cop/style/hash_except.rb +85 -9
- data/lib/rubocop/cop/style/hash_like_case.rb +1 -1
- data/lib/rubocop/cop/style/hash_syntax.rb +20 -3
- data/lib/rubocop/cop/style/hash_transform_keys.rb +6 -1
- data/lib/rubocop/cop/style/hash_transform_values.rb +4 -1
- data/lib/rubocop/cop/style/identical_conditional_branches.rb +4 -4
- data/lib/rubocop/cop/style/if_unless_modifier.rb +6 -5
- data/lib/rubocop/cop/style/if_with_boolean_literal_branches.rb +4 -2
- data/lib/rubocop/cop/style/implicit_runtime_error.rb +3 -3
- data/lib/rubocop/cop/style/in_pattern_then.rb +1 -1
- data/lib/rubocop/cop/style/inline_comment.rb +1 -1
- data/lib/rubocop/cop/style/inverse_methods.rb +10 -8
- data/lib/rubocop/cop/style/ip_addresses.rb +1 -1
- data/lib/rubocop/cop/style/keyword_parameters_order.rb +2 -2
- data/lib/rubocop/cop/style/lambda.rb +1 -1
- data/lib/rubocop/cop/style/lambda_call.rb +1 -1
- data/lib/rubocop/cop/style/line_end_concatenation.rb +2 -2
- data/lib/rubocop/cop/style/magic_comment_format.rb +307 -0
- data/lib/rubocop/cop/style/map_compact_with_conditional_block.rb +136 -0
- data/lib/rubocop/cop/style/map_to_hash.rb +3 -3
- data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +4 -4
- data/lib/rubocop/cop/style/method_call_with_args_parentheses/require_parentheses.rb +6 -2
- data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +12 -12
- data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +20 -3
- data/lib/rubocop/cop/style/method_called_on_do_end_block.rb +5 -2
- data/lib/rubocop/cop/style/method_def_parentheses.rb +1 -1
- data/lib/rubocop/cop/style/min_max.rb +1 -1
- data/lib/rubocop/cop/style/missing_else.rb +24 -24
- data/lib/rubocop/cop/style/missing_respond_to_missing.rb +1 -1
- data/lib/rubocop/cop/style/mixin_grouping.rb +2 -2
- data/lib/rubocop/cop/style/mixin_usage.rb +1 -1
- data/lib/rubocop/cop/style/module_function.rb +3 -3
- data/lib/rubocop/cop/style/multiline_block_chain.rb +4 -2
- data/lib/rubocop/cop/style/multiline_if_modifier.rb +2 -2
- data/lib/rubocop/cop/style/multiline_if_then.rb +1 -1
- data/lib/rubocop/cop/style/multiline_in_pattern_then.rb +3 -5
- data/lib/rubocop/cop/style/multiline_memoization.rb +1 -1
- data/lib/rubocop/cop/style/multiline_method_signature.rb +2 -2
- data/lib/rubocop/cop/style/multiline_ternary_operator.rb +37 -11
- data/lib/rubocop/cop/style/multiline_when_then.rb +2 -4
- data/lib/rubocop/cop/style/multiple_comparison.rb +1 -1
- data/lib/rubocop/cop/style/mutable_constant.rb +1 -1
- data/lib/rubocop/cop/style/negated_if_else_condition.rb +1 -1
- data/lib/rubocop/cop/style/nested_file_dirname.rb +1 -1
- data/lib/rubocop/cop/style/nested_modifier.rb +1 -1
- data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +11 -2
- data/lib/rubocop/cop/style/nested_ternary_operator.rb +20 -8
- data/lib/rubocop/cop/style/next.rb +4 -6
- data/lib/rubocop/cop/style/nil_comparison.rb +1 -1
- data/lib/rubocop/cop/style/nil_lambda.rb +3 -3
- data/lib/rubocop/cop/style/non_nil_check.rb +1 -1
- data/lib/rubocop/cop/style/not.rb +2 -2
- data/lib/rubocop/cop/style/numbered_parameters.rb +1 -1
- data/lib/rubocop/cop/style/numbered_parameters_limit.rb +1 -1
- data/lib/rubocop/cop/style/numeric_literal_prefix.rb +1 -1
- data/lib/rubocop/cop/style/numeric_literals.rb +16 -1
- data/lib/rubocop/cop/style/numeric_predicate.rb +53 -11
- data/lib/rubocop/cop/style/object_then.rb +71 -0
- data/lib/rubocop/cop/style/one_line_conditional.rb +1 -1
- data/lib/rubocop/cop/style/open_struct_use.rb +1 -1
- data/lib/rubocop/cop/style/option_hash.rb +1 -1
- data/lib/rubocop/cop/style/optional_arguments.rb +2 -2
- data/lib/rubocop/cop/style/optional_boolean_parameter.rb +2 -2
- data/lib/rubocop/cop/style/or_assignment.rb +1 -1
- data/lib/rubocop/cop/style/parentheses_around_condition.rb +1 -1
- data/lib/rubocop/cop/style/percent_literal_delimiters.rb +1 -1
- data/lib/rubocop/cop/style/percent_q_literals.rb +1 -1
- data/lib/rubocop/cop/style/perl_backrefs.rb +23 -2
- data/lib/rubocop/cop/style/preferred_hash_methods.rb +1 -1
- data/lib/rubocop/cop/style/proc.rb +5 -2
- data/lib/rubocop/cop/style/quoted_symbols.rb +1 -1
- data/lib/rubocop/cop/style/raise_args.rb +10 -4
- data/lib/rubocop/cop/style/random_with_offset.rb +1 -1
- data/lib/rubocop/cop/style/redundant_argument.rb +2 -2
- data/lib/rubocop/cop/style/redundant_assignment.rb +1 -1
- data/lib/rubocop/cop/style/redundant_begin.rb +19 -6
- data/lib/rubocop/cop/style/redundant_capital_w.rb +2 -3
- data/lib/rubocop/cop/style/redundant_condition.rb +129 -13
- data/lib/rubocop/cop/style/redundant_conditional.rb +1 -1
- data/lib/rubocop/cop/style/redundant_exception.rb +1 -1
- data/lib/rubocop/cop/style/redundant_fetch_block.rb +2 -2
- data/lib/rubocop/cop/style/redundant_file_extension_in_require.rb +1 -1
- data/lib/rubocop/cop/style/redundant_freeze.rb +1 -1
- data/lib/rubocop/cop/style/redundant_initialize.rb +154 -0
- data/lib/rubocop/cop/style/redundant_interpolation.rb +22 -1
- data/lib/rubocop/cop/style/redundant_parentheses.rb +22 -24
- data/lib/rubocop/cop/style/redundant_percent_q.rb +1 -1
- data/lib/rubocop/cop/style/redundant_regexp_character_class.rb +8 -3
- data/lib/rubocop/cop/style/redundant_regexp_escape.rb +2 -2
- data/lib/rubocop/cop/style/redundant_return.rb +2 -2
- data/lib/rubocop/cop/style/redundant_self.rb +3 -1
- data/lib/rubocop/cop/style/redundant_self_assignment.rb +3 -4
- data/lib/rubocop/cop/style/redundant_self_assignment_branch.rb +1 -1
- data/lib/rubocop/cop/style/redundant_sort.rb +22 -7
- data/lib/rubocop/cop/style/redundant_sort_by.rb +25 -9
- data/lib/rubocop/cop/style/regexp_literal.rb +1 -1
- data/lib/rubocop/cop/style/rescue_modifier.rb +1 -1
- data/lib/rubocop/cop/style/rescue_standard_error.rb +13 -13
- data/lib/rubocop/cop/style/return_nil.rb +1 -1
- data/lib/rubocop/cop/style/safe_navigation.rb +21 -11
- data/lib/rubocop/cop/style/sample.rb +1 -1
- data/lib/rubocop/cop/style/select_by_regexp.rb +7 -2
- data/lib/rubocop/cop/style/self_assignment.rb +1 -1
- data/lib/rubocop/cop/style/semicolon.rb +28 -4
- data/lib/rubocop/cop/style/send.rb +1 -1
- data/lib/rubocop/cop/style/signal_exception.rb +1 -1
- data/lib/rubocop/cop/style/single_argument_dig.rb +5 -0
- data/lib/rubocop/cop/style/single_line_block_params.rb +2 -2
- data/lib/rubocop/cop/style/single_line_methods.rb +2 -2
- data/lib/rubocop/cop/style/slicing_with_range.rb +1 -1
- data/lib/rubocop/cop/style/sole_nested_conditional.rb +96 -30
- data/lib/rubocop/cop/style/special_global_vars.rb +66 -8
- data/lib/rubocop/cop/style/static_class.rb +1 -1
- data/lib/rubocop/cop/style/stderr_puts.rb +1 -1
- data/lib/rubocop/cop/style/string_chars.rb +1 -1
- data/lib/rubocop/cop/style/string_concatenation.rb +6 -7
- data/lib/rubocop/cop/style/string_hash_keys.rb +1 -1
- data/lib/rubocop/cop/style/string_literals_in_interpolation.rb +1 -1
- data/lib/rubocop/cop/style/string_methods.rb +1 -1
- data/lib/rubocop/cop/style/strip.rb +1 -1
- data/lib/rubocop/cop/style/struct_inheritance.rb +4 -4
- data/lib/rubocop/cop/style/swap_values.rb +2 -2
- data/lib/rubocop/cop/style/symbol_array.rb +9 -6
- data/lib/rubocop/cop/style/symbol_literal.rb +1 -1
- data/lib/rubocop/cop/style/symbol_proc.rb +70 -12
- data/lib/rubocop/cop/style/ternary_parentheses.rb +3 -16
- data/lib/rubocop/cop/style/top_level_method_definition.rb +3 -1
- data/lib/rubocop/cop/style/trailing_body_on_class.rb +1 -1
- data/lib/rubocop/cop/style/trailing_body_on_method_definition.rb +1 -1
- data/lib/rubocop/cop/style/trailing_body_on_module.rb +1 -1
- data/lib/rubocop/cop/style/trailing_comma_in_arguments.rb +1 -1
- data/lib/rubocop/cop/style/trailing_comma_in_array_literal.rb +1 -1
- data/lib/rubocop/cop/style/trailing_comma_in_block_args.rb +2 -2
- data/lib/rubocop/cop/style/trailing_comma_in_hash_literal.rb +1 -1
- data/lib/rubocop/cop/style/trailing_method_end_statement.rb +2 -5
- data/lib/rubocop/cop/style/trailing_underscore_variable.rb +1 -1
- data/lib/rubocop/cop/style/trivial_accessors.rb +11 -9
- data/lib/rubocop/cop/style/unless_else.rb +5 -1
- data/lib/rubocop/cop/style/unless_logical_operators.rb +1 -1
- data/lib/rubocop/cop/style/unpack_first.rb +5 -2
- data/lib/rubocop/cop/style/variable_interpolation.rb +1 -1
- data/lib/rubocop/cop/style/when_then.rb +1 -1
- data/lib/rubocop/cop/style/word_array.rb +4 -5
- data/lib/rubocop/cop/style/yoda_condition.rb +1 -1
- data/lib/rubocop/cop/style/zero_length_predicate.rb +1 -1
- data/lib/rubocop/cop/team.rb +2 -2
- data/lib/rubocop/cop/util.rb +3 -3
- data/lib/rubocop/cop/variable_force/branch.rb +1 -1
- data/lib/rubocop/cops_documentation_generator.rb +19 -2
- data/lib/rubocop/ext/range.rb +15 -0
- data/lib/rubocop/feature_loader.rb +94 -0
- data/lib/rubocop/formatter/clang_style_formatter.rb +1 -1
- data/lib/rubocop/formatter/disabled_config_formatter.rb +11 -8
- data/lib/rubocop/formatter/formatter_set.rb +20 -18
- data/lib/rubocop/formatter/git_hub_actions_formatter.rb +15 -2
- data/lib/rubocop/formatter/html_formatter.rb +5 -13
- data/lib/rubocop/formatter/markdown_formatter.rb +78 -0
- data/lib/rubocop/formatter/offense_count_formatter.rb +8 -2
- data/lib/rubocop/formatter/simple_text_formatter.rb +9 -8
- data/lib/rubocop/formatter/tap_formatter.rb +1 -1
- data/lib/rubocop/formatter/worst_offenders_formatter.rb +1 -2
- data/lib/rubocop/formatter.rb +31 -0
- data/lib/rubocop/magic_comment.rb +31 -5
- data/lib/rubocop/options.rb +103 -34
- data/lib/rubocop/rake_task.rb +34 -9
- data/lib/rubocop/result_cache.rb +24 -13
- data/lib/rubocop/rspec/cop_helper.rb +2 -2
- data/lib/rubocop/rspec/expect_offense.rb +3 -3
- data/lib/rubocop/rspec/parallel_formatter.rb +1 -1
- data/lib/rubocop/rspec/shared_contexts.rb +31 -11
- data/lib/rubocop/rspec/support.rb +14 -0
- data/lib/rubocop/runner.rb +41 -7
- data/lib/rubocop/server/cache.rb +144 -0
- data/lib/rubocop/server/cli.rb +121 -0
- data/lib/rubocop/server/client_command/base.rb +44 -0
- data/lib/rubocop/server/client_command/exec.rb +59 -0
- data/lib/rubocop/server/client_command/restart.rb +25 -0
- data/lib/rubocop/server/client_command/start.rb +43 -0
- data/lib/rubocop/server/client_command/status.rb +28 -0
- data/lib/rubocop/server/client_command/stop.rb +31 -0
- data/lib/rubocop/server/client_command.rb +26 -0
- data/lib/rubocop/server/core.rb +79 -0
- data/lib/rubocop/server/errors.rb +23 -0
- data/lib/rubocop/server/helper.rb +34 -0
- data/lib/rubocop/server/server_command/base.rb +50 -0
- data/lib/rubocop/server/server_command/exec.rb +34 -0
- data/lib/rubocop/server/server_command/stop.rb +24 -0
- data/lib/rubocop/server/server_command.rb +21 -0
- data/lib/rubocop/server/socket_reader.rb +65 -0
- data/lib/rubocop/server.rb +53 -0
- data/lib/rubocop/string_interpreter.rb +4 -4
- data/lib/rubocop/target_ruby.rb +14 -6
- data/lib/rubocop/version.rb +17 -9
- data/lib/rubocop.rb +25 -30
- metadata +78 -14
- data/lib/rubocop/cop/gemspec/date_assignment.rb +0 -49
- data/lib/rubocop/cop/mixin/ignored_methods.rb +0 -52
- data/lib/rubocop/cop/mixin/ignored_pattern.rb +0 -29
@@ -0,0 +1,132 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RuboCop
|
4
|
+
module Cop
|
5
|
+
module Style
|
6
|
+
# Suggests `ENV.fetch` for the replacement of `ENV[]`.
|
7
|
+
# `ENV[]` silently fails and returns `nil` when the environment variable is unset,
|
8
|
+
# which may cause unexpected behaviors when the developer forgets to set it.
|
9
|
+
# On the other hand, `ENV.fetch` raises KeyError or returns the explicitly
|
10
|
+
# specified default value.
|
11
|
+
#
|
12
|
+
# @example
|
13
|
+
# # bad
|
14
|
+
# ENV['X']
|
15
|
+
# x = ENV['X']
|
16
|
+
#
|
17
|
+
# # good
|
18
|
+
# ENV.fetch('X')
|
19
|
+
# x = ENV.fetch('X')
|
20
|
+
#
|
21
|
+
# # also good
|
22
|
+
# !ENV['X']
|
23
|
+
# ENV['X'].some_method # (e.g. `.nil?`)
|
24
|
+
#
|
25
|
+
class FetchEnvVar < Base
|
26
|
+
extend AutoCorrector
|
27
|
+
|
28
|
+
MSG = 'Use `ENV.fetch(%<key>s)` or `ENV.fetch(%<key>s, nil)` instead of `ENV[%<key>s]`.'
|
29
|
+
|
30
|
+
# @!method env_with_bracket?(node)
|
31
|
+
def_node_matcher :env_with_bracket?, <<~PATTERN
|
32
|
+
(send (const nil? :ENV) :[] $_)
|
33
|
+
PATTERN
|
34
|
+
|
35
|
+
def on_send(node)
|
36
|
+
env_with_bracket?(node) do |name_node|
|
37
|
+
break unless offensive?(node)
|
38
|
+
|
39
|
+
message = format(MSG, key: name_node.source)
|
40
|
+
add_offense(node, message: message) do |corrector|
|
41
|
+
corrector.replace(node, new_code(name_node))
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
private
|
47
|
+
|
48
|
+
def allowed_var?(node)
|
49
|
+
env_key_node = node.children.last
|
50
|
+
env_key_node.str_type? && cop_config['AllowedVars'].include?(env_key_node.value)
|
51
|
+
end
|
52
|
+
|
53
|
+
def used_as_flag?(node)
|
54
|
+
return false if node.root?
|
55
|
+
return true if used_if_condition_in_body(node)
|
56
|
+
|
57
|
+
node.parent.send_type? && (node.parent.prefix_bang? || node.parent.comparison_method?)
|
58
|
+
end
|
59
|
+
|
60
|
+
def used_if_condition_in_body(node)
|
61
|
+
if_node = node.ancestors.find(&:if_type?)
|
62
|
+
|
63
|
+
return false unless (condition = if_node&.condition)
|
64
|
+
return true if condition.send_type? && (condition.child_nodes == node.child_nodes)
|
65
|
+
|
66
|
+
used_in_condition?(node, condition)
|
67
|
+
end
|
68
|
+
|
69
|
+
def used_in_condition?(node, condition)
|
70
|
+
if condition.send_type?
|
71
|
+
return true if condition.assignment_method? && partial_matched?(node, condition)
|
72
|
+
return false if !condition.comparison_method? && !condition.predicate_method?
|
73
|
+
end
|
74
|
+
|
75
|
+
condition.child_nodes.any?(node)
|
76
|
+
end
|
77
|
+
|
78
|
+
# Avoid offending in the following cases:
|
79
|
+
# `ENV['key'] if ENV['key'] = x`
|
80
|
+
def partial_matched?(node, condition)
|
81
|
+
node.child_nodes == node.child_nodes & condition.child_nodes
|
82
|
+
end
|
83
|
+
|
84
|
+
def offensive?(node)
|
85
|
+
!(allowed_var?(node) || allowable_use?(node))
|
86
|
+
end
|
87
|
+
|
88
|
+
# Check if the node is a receiver and receives a message with dot syntax.
|
89
|
+
def message_chained_with_dot?(node)
|
90
|
+
return false if node.root?
|
91
|
+
|
92
|
+
parent = node.parent
|
93
|
+
return false if !parent.call_type? || parent.children.first != node
|
94
|
+
|
95
|
+
parent.dot? || parent.safe_navigation?
|
96
|
+
end
|
97
|
+
|
98
|
+
# The following are allowed cases:
|
99
|
+
#
|
100
|
+
# - Used as a flag (e.g., `if ENV['X']` or `!ENV['X']`) because
|
101
|
+
# it simply checks whether the variable is set.
|
102
|
+
# - Receiving a message with dot syntax, e.g. `ENV['X'].nil?`.
|
103
|
+
# - `ENV['key']` assigned by logical AND/OR assignment.
|
104
|
+
# - `ENV['key']` is the LHS of a `||`.
|
105
|
+
def allowable_use?(node)
|
106
|
+
used_as_flag?(node) || message_chained_with_dot?(node) || assigned?(node) || or_lhs?(node)
|
107
|
+
end
|
108
|
+
|
109
|
+
# The following are allowed cases:
|
110
|
+
#
|
111
|
+
# - `ENV['key']` is a receiver of `||=`, e.g. `ENV['X'] ||= y`.
|
112
|
+
# - `ENV['key']` is a receiver of `&&=`, e.g. `ENV['X'] &&= y`.
|
113
|
+
def assigned?(node)
|
114
|
+
return false unless (parent = node.parent)&.assignment?
|
115
|
+
|
116
|
+
lhs, _method, _rhs = *parent
|
117
|
+
node == lhs
|
118
|
+
end
|
119
|
+
|
120
|
+
def or_lhs?(node)
|
121
|
+
return false unless (parent = node.parent)&.or_type?
|
122
|
+
|
123
|
+
parent.lhs == node || parent.parent&.or_type?
|
124
|
+
end
|
125
|
+
|
126
|
+
def new_code(name_node)
|
127
|
+
"ENV.fetch(#{name_node.source}, nil)"
|
128
|
+
end
|
129
|
+
end
|
130
|
+
end
|
131
|
+
end
|
132
|
+
end
|
@@ -5,6 +5,17 @@ module RuboCop
|
|
5
5
|
module Style
|
6
6
|
# Favor `File.(bin)write` convenience methods.
|
7
7
|
#
|
8
|
+
# NOTE: There are different method signatures between `File.write` (class method)
|
9
|
+
# and `File#write` (instance method). The following case will be allowed because
|
10
|
+
# static analysis does not know the contents of the splat argument:
|
11
|
+
#
|
12
|
+
# [source,ruby]
|
13
|
+
# ----
|
14
|
+
# File.open(filename, 'w') do |f|
|
15
|
+
# f.write(*objects)
|
16
|
+
# end
|
17
|
+
# ----
|
18
|
+
#
|
8
19
|
# @example
|
9
20
|
# ## text mode
|
10
21
|
# # bad
|
@@ -85,6 +96,7 @@ module RuboCop
|
|
85
96
|
content = send_write?(node) || block_write?(node) do |block_arg, lvar, write_arg|
|
86
97
|
write_arg if block_arg == lvar
|
87
98
|
end
|
99
|
+
return false if content&.splat_type?
|
88
100
|
|
89
101
|
yield(content) if content
|
90
102
|
end
|
@@ -3,7 +3,7 @@
|
|
3
3
|
module RuboCop
|
4
4
|
module Cop
|
5
5
|
module Style
|
6
|
-
#
|
6
|
+
# Checks for division with integers coerced to floats.
|
7
7
|
# It is recommended to either always use `fdiv` or coerce one side only.
|
8
8
|
# This cop also provides other options for code consistency.
|
9
9
|
#
|
@@ -3,7 +3,7 @@
|
|
3
3
|
module RuboCop
|
4
4
|
module Cop
|
5
5
|
module Style
|
6
|
-
#
|
6
|
+
# Looks for uses of the `for` keyword or `each` method. The
|
7
7
|
# preferred alternative is set in the EnforcedStyle configuration
|
8
8
|
# parameter. An `each` call with a block on a single line is always
|
9
9
|
# allowed.
|
@@ -75,6 +75,8 @@ module RuboCop
|
|
75
75
|
end
|
76
76
|
end
|
77
77
|
|
78
|
+
alias on_numblock on_block
|
79
|
+
|
78
80
|
private
|
79
81
|
|
80
82
|
def suspect_enumerable?(node)
|
@@ -3,7 +3,7 @@
|
|
3
3
|
module RuboCop
|
4
4
|
module Cop
|
5
5
|
module Style
|
6
|
-
#
|
6
|
+
# Enforces the use of a single string formatting utility.
|
7
7
|
# Valid options include Kernel#format, Kernel#sprintf and String#%.
|
8
8
|
#
|
9
9
|
# The detection of String#% cannot be implemented in a reliable
|
@@ -11,7 +11,8 @@ module RuboCop
|
|
11
11
|
# The reason is that _unannotated_ format is very similar
|
12
12
|
# to encoded URLs or Date/Time formatting strings.
|
13
13
|
#
|
14
|
-
# This cop can be customized
|
14
|
+
# This cop can be customized allowed methods with `AllowedMethods`.
|
15
|
+
# By default, there are no methods to allowed.
|
15
16
|
#
|
16
17
|
# @example EnforcedStyle: annotated (default)
|
17
18
|
#
|
@@ -61,29 +62,41 @@ module RuboCop
|
|
61
62
|
# # good
|
62
63
|
# format('%06d', 10)
|
63
64
|
#
|
64
|
-
# @example
|
65
|
+
# @example AllowedMethods: [] (default)
|
66
|
+
#
|
67
|
+
# # bad
|
68
|
+
# redirect('foo/%{bar_id}')
|
69
|
+
#
|
70
|
+
# @example AllowedMethods: [redirect]
|
71
|
+
#
|
72
|
+
# # good
|
73
|
+
# redirect('foo/%{bar_id}')
|
74
|
+
#
|
75
|
+
# @example AllowedPatterns: [] (default)
|
76
|
+
#
|
77
|
+
# # bad
|
78
|
+
# redirect('foo/%{bar_id}')
|
79
|
+
#
|
80
|
+
# @example AllowedPatterns: [/redirect/]
|
65
81
|
#
|
66
82
|
# # good
|
67
83
|
# redirect('foo/%{bar_id}')
|
68
84
|
#
|
69
85
|
class FormatStringToken < Base
|
70
86
|
include ConfigurableEnforcedStyle
|
71
|
-
include
|
87
|
+
include AllowedMethods
|
88
|
+
include AllowedPattern
|
89
|
+
extend AutoCorrector
|
72
90
|
|
73
91
|
def on_str(node)
|
74
|
-
return if format_string_token?(node) ||
|
92
|
+
return if format_string_token?(node) || use_allowed_method?(node)
|
75
93
|
|
76
94
|
detections = collect_detections(node)
|
77
95
|
return if detections.empty?
|
78
96
|
return if allowed_unannotated?(detections)
|
79
97
|
|
80
|
-
detections.each do |
|
81
|
-
|
82
|
-
correct_style_detected
|
83
|
-
else
|
84
|
-
style_detected(detected_style)
|
85
|
-
add_offense(token_range, message: message(detected_style))
|
86
|
-
end
|
98
|
+
detections.each do |detected_sequence, token_range|
|
99
|
+
check_sequence(detected_sequence, token_range)
|
87
100
|
end
|
88
101
|
end
|
89
102
|
|
@@ -101,9 +114,43 @@ module RuboCop
|
|
101
114
|
!node.value.include?('%') || node.each_ancestor(:xstr, :regexp).any?
|
102
115
|
end
|
103
116
|
|
104
|
-
def
|
117
|
+
def use_allowed_method?(node)
|
105
118
|
send_parent = node.each_ancestor(:send).first
|
106
|
-
send_parent &&
|
119
|
+
send_parent &&
|
120
|
+
(allowed_method?(send_parent.method_name) ||
|
121
|
+
matches_allowed_pattern?(send_parent.method_name))
|
122
|
+
end
|
123
|
+
|
124
|
+
def check_sequence(detected_sequence, token_range)
|
125
|
+
if detected_sequence.style == style
|
126
|
+
correct_style_detected
|
127
|
+
elsif correctable_sequence?(detected_sequence.type)
|
128
|
+
style_detected(detected_sequence.style)
|
129
|
+
add_offense(token_range, message: message(detected_sequence.style)) do |corrector|
|
130
|
+
autocorrect_sequence(corrector, detected_sequence, token_range)
|
131
|
+
end
|
132
|
+
end
|
133
|
+
end
|
134
|
+
|
135
|
+
def correctable_sequence?(detected_type)
|
136
|
+
detected_type == 's' || style == :annotated || style == :unannotated
|
137
|
+
end
|
138
|
+
|
139
|
+
def autocorrect_sequence(corrector, detected_sequence, token_range)
|
140
|
+
return if style == :unannotated
|
141
|
+
|
142
|
+
name = detected_sequence.name
|
143
|
+
return if name.nil?
|
144
|
+
|
145
|
+
flags = detected_sequence.flags
|
146
|
+
width = detected_sequence.width
|
147
|
+
precision = detected_sequence.precision
|
148
|
+
type = detected_sequence.style == :template ? 's' : detected_sequence.type
|
149
|
+
correction = case style
|
150
|
+
when :annotated then "%<#{name}>#{flags}#{width}#{precision}#{type}"
|
151
|
+
when :template then "%#{flags}#{width}#{precision}{#{name}}"
|
152
|
+
end
|
153
|
+
corrector.replace(token_range, correction)
|
107
154
|
end
|
108
155
|
|
109
156
|
def unannotated_format?(node, detected_style)
|
@@ -143,30 +190,33 @@ module RuboCop
|
|
143
190
|
def token_ranges(contents)
|
144
191
|
format_string = RuboCop::Cop::Utils::FormatString.new(contents.source)
|
145
192
|
|
146
|
-
format_string.format_sequences.each do |
|
147
|
-
next if
|
193
|
+
format_string.format_sequences.each do |detected_sequence|
|
194
|
+
next if detected_sequence.percent?
|
148
195
|
|
149
|
-
|
150
|
-
|
196
|
+
token = contents.begin.adjust(begin_pos: detected_sequence.begin_pos,
|
197
|
+
end_pos: detected_sequence.end_pos)
|
151
198
|
|
152
|
-
yield(
|
199
|
+
yield(detected_sequence, token)
|
153
200
|
end
|
154
201
|
end
|
155
202
|
|
156
203
|
def collect_detections(node)
|
157
204
|
detections = []
|
158
|
-
tokens(node) do |
|
159
|
-
unless unannotated_format?(node,
|
160
|
-
detections << [
|
205
|
+
tokens(node) do |detected_sequence, token_range|
|
206
|
+
unless unannotated_format?(node, detected_sequence.style)
|
207
|
+
detections << [detected_sequence, token_range]
|
161
208
|
end
|
162
209
|
end
|
163
210
|
detections
|
164
211
|
end
|
165
212
|
|
166
213
|
def allowed_unannotated?(detections)
|
167
|
-
return false
|
214
|
+
return false unless detections.all? do |detected_sequence,|
|
215
|
+
detected_sequence.style == :unannotated
|
216
|
+
end
|
217
|
+
return true if detections.size <= max_unannotated_placeholders_allowed
|
168
218
|
|
169
|
-
detections.
|
219
|
+
detections.any? { |detected_sequence,| !correctable_sequence?(detected_sequence.type) }
|
170
220
|
end
|
171
221
|
|
172
222
|
def max_unannotated_placeholders_allowed
|
@@ -3,12 +3,12 @@
|
|
3
3
|
module RuboCop
|
4
4
|
module Cop
|
5
5
|
module Style
|
6
|
-
#
|
6
|
+
# Helps you transition from mutable string literals
|
7
7
|
# to frozen string literals.
|
8
8
|
# It will add the `# frozen_string_literal: true` magic comment to the top
|
9
9
|
# of files to enable frozen string literals. Frozen string literals may be
|
10
10
|
# default in future Ruby. The comment will be added below a shebang and
|
11
|
-
# encoding comment.
|
11
|
+
# encoding comment. The frozen string literal comment is only valid in Ruby 2.3+.
|
12
12
|
#
|
13
13
|
# Note that the cop will accept files where the comment exists but is set
|
14
14
|
# to `false` instead of `true`.
|
@@ -86,6 +86,9 @@ module RuboCop
|
|
86
86
|
include FrozenStringLiteral
|
87
87
|
include RangeHelp
|
88
88
|
extend AutoCorrector
|
89
|
+
extend TargetRubyVersion
|
90
|
+
|
91
|
+
minimum_target_ruby_version 2.3
|
89
92
|
|
90
93
|
MSG_MISSING_TRUE = 'Missing magic comment `# frozen_string_literal: true`.'
|
91
94
|
MSG_MISSING = 'Missing frozen string literal comment.'
|
@@ -179,7 +182,7 @@ module RuboCop
|
|
179
182
|
end
|
180
183
|
|
181
184
|
def remove_comment(corrector, node)
|
182
|
-
corrector.remove(range_with_surrounding_space(
|
185
|
+
corrector.remove(range_with_surrounding_space(node.pos, side: :right))
|
183
186
|
end
|
184
187
|
|
185
188
|
def enable_comment(corrector)
|
@@ -3,7 +3,7 @@
|
|
3
3
|
module RuboCop
|
4
4
|
module Cop
|
5
5
|
module Style
|
6
|
-
#
|
6
|
+
# Enforces the use of `$stdout/$stderr/$stdin` instead of `STDOUT/STDERR/STDIN`.
|
7
7
|
# `STDOUT/STDERR/STDIN` are constants, and while you can actually
|
8
8
|
# reassign (possibly to redirect some stream) constants in Ruby, you'll get
|
9
9
|
# an interpreter warning if you do so.
|
@@ -3,7 +3,7 @@
|
|
3
3
|
module RuboCop
|
4
4
|
module Cop
|
5
5
|
module Style
|
6
|
-
#
|
6
|
+
# Looks for uses of global variables.
|
7
7
|
# It does not report offenses for built-in global variables.
|
8
8
|
# Built-in global variables are allowed by default. Additionally
|
9
9
|
# users can allow additional variables via the AllowedVariables option.
|
@@ -6,6 +6,10 @@ module RuboCop
|
|
6
6
|
# Use a guard clause instead of wrapping the code inside a conditional
|
7
7
|
# expression
|
8
8
|
#
|
9
|
+
# A condition with an `elsif` or `else` branch is allowed unless
|
10
|
+
# one of `return`, `break`, `next`, `raise`, or `fail` is used
|
11
|
+
# in the body of the conditional expression.
|
12
|
+
#
|
9
13
|
# @example
|
10
14
|
# # bad
|
11
15
|
# def test
|
@@ -47,6 +51,44 @@ module RuboCop
|
|
47
51
|
# # good
|
48
52
|
# foo || raise('exception') if something
|
49
53
|
# ok
|
54
|
+
#
|
55
|
+
# @example AllowConsecutiveConditionals: false (default)
|
56
|
+
# # bad
|
57
|
+
# def test
|
58
|
+
# if foo?
|
59
|
+
# work
|
60
|
+
# end
|
61
|
+
#
|
62
|
+
# if bar? # <- reports an offense
|
63
|
+
# work
|
64
|
+
# end
|
65
|
+
# end
|
66
|
+
#
|
67
|
+
# @example AllowConsecutiveConditionals: true
|
68
|
+
# # good
|
69
|
+
# def test
|
70
|
+
# if foo?
|
71
|
+
# work
|
72
|
+
# end
|
73
|
+
#
|
74
|
+
# if bar?
|
75
|
+
# work
|
76
|
+
# end
|
77
|
+
# end
|
78
|
+
#
|
79
|
+
# # bad
|
80
|
+
# def test
|
81
|
+
# if foo?
|
82
|
+
# work
|
83
|
+
# end
|
84
|
+
#
|
85
|
+
# do_something
|
86
|
+
#
|
87
|
+
# if bar? # <- reports an offense
|
88
|
+
# work
|
89
|
+
# end
|
90
|
+
# end
|
91
|
+
#
|
50
92
|
class GuardClause < Base
|
51
93
|
include MinBodyLength
|
52
94
|
include StatementModifier
|
@@ -79,7 +121,7 @@ module RuboCop
|
|
79
121
|
kw = if guard_clause_in_if
|
80
122
|
node.loc.keyword.source
|
81
123
|
else
|
82
|
-
|
124
|
+
node.inverse_keyword
|
83
125
|
end
|
84
126
|
|
85
127
|
register_offense(node, guard_clause_source(guard_clause), kw)
|
@@ -89,18 +131,26 @@ module RuboCop
|
|
89
131
|
|
90
132
|
def check_ending_if(node)
|
91
133
|
return if accepted_form?(node, ending: true) || !min_body_length?(node)
|
134
|
+
return if allowed_consecutive_conditionals? &&
|
135
|
+
consecutive_conditionals?(node.parent, node)
|
92
136
|
|
93
|
-
register_offense(node, 'return',
|
137
|
+
register_offense(node, 'return', node.inverse_keyword)
|
94
138
|
end
|
95
139
|
|
96
|
-
def
|
97
|
-
|
140
|
+
def consecutive_conditionals?(parent, node)
|
141
|
+
parent.each_child_node.inject(false) do |if_type, child|
|
142
|
+
break if_type if node == child
|
143
|
+
|
144
|
+
child.if_type?
|
145
|
+
end
|
98
146
|
end
|
99
147
|
|
100
148
|
def register_offense(node, scope_exiting_keyword, conditional_keyword)
|
101
149
|
condition, = node.node_parts
|
102
150
|
example = [scope_exiting_keyword, conditional_keyword, condition.source].join(' ')
|
103
151
|
if too_long_for_single_line?(node, example)
|
152
|
+
return if trivial?(node)
|
153
|
+
|
104
154
|
example = "#{conditional_keyword} #{condition.source}; #{scope_exiting_keyword}; end"
|
105
155
|
end
|
106
156
|
|
@@ -126,6 +176,10 @@ module RuboCop
|
|
126
176
|
accepted_if?(node, ending) || node.condition.multiline? || node.parent&.assignment?
|
127
177
|
end
|
128
178
|
|
179
|
+
def trivial?(node)
|
180
|
+
node.branches.one? && !node.if_branch.if_type? && !node.if_branch.begin_type?
|
181
|
+
end
|
182
|
+
|
129
183
|
def accepted_if?(node, ending)
|
130
184
|
return true if node.modifier_form? || node.ternary?
|
131
185
|
|
@@ -135,6 +189,10 @@ module RuboCop
|
|
135
189
|
!node.else? || node.elsif?
|
136
190
|
end
|
137
191
|
end
|
192
|
+
|
193
|
+
def allowed_consecutive_conditionals?
|
194
|
+
cop_config.fetch('AllowConsecutiveConditionals', false)
|
195
|
+
end
|
138
196
|
end
|
139
197
|
end
|
140
198
|
end
|
@@ -3,7 +3,7 @@
|
|
3
3
|
module RuboCop
|
4
4
|
module Cop
|
5
5
|
module Style
|
6
|
-
#
|
6
|
+
# Checks the usage of pre-2.1 `Hash[args]` method of converting enumerables and
|
7
7
|
# sequences of values to hashes.
|
8
8
|
#
|
9
9
|
# Correction code from splat argument (`Hash[*ary]`) is not simply determined. For example,
|
@@ -3,7 +3,7 @@
|
|
3
3
|
module RuboCop
|
4
4
|
module Cop
|
5
5
|
module Style
|
6
|
-
#
|
6
|
+
# Checks for uses of `each_key` and `each_value` Hash methods.
|
7
7
|
#
|
8
8
|
# NOTE: If you have an array of two-element arrays, you can put
|
9
9
|
# parentheses around the block arguments to indicate that you're not
|
@@ -35,13 +35,15 @@ module RuboCop
|
|
35
35
|
|
36
36
|
# @!method kv_each(node)
|
37
37
|
def_node_matcher :kv_each, <<~PATTERN
|
38
|
-
(block $(send (send _ ${:keys :values}) :each) ...)
|
38
|
+
({block numblock} $(send (send _ ${:keys :values}) :each) ...)
|
39
39
|
PATTERN
|
40
40
|
|
41
41
|
def on_block(node)
|
42
42
|
register_kv_offense(node)
|
43
43
|
end
|
44
44
|
|
45
|
+
alias on_numblock on_block
|
46
|
+
|
45
47
|
private
|
46
48
|
|
47
49
|
def register_kv_offense(node)
|