rubocop 0.83.0 → 0.87.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 +26 -18
- data/config/default.yml +128 -23
- data/lib/rubocop.rb +21 -59
- data/lib/rubocop/ast_aliases.rb +8 -0
- data/lib/rubocop/cli.rb +2 -4
- data/lib/rubocop/cli/command/auto_genenerate_config.rb +42 -7
- data/lib/rubocop/cli/command/init_dotfile.rb +1 -1
- data/lib/rubocop/cli/command/show_cops.rb +2 -6
- data/lib/rubocop/comment_config.rb +1 -1
- data/lib/rubocop/config.rb +1 -1
- data/lib/rubocop/config_loader.rb +24 -70
- data/lib/rubocop/config_loader_resolver.rb +21 -9
- data/lib/rubocop/config_obsoletion.rb +0 -1
- data/lib/rubocop/config_store.rb +12 -2
- data/lib/rubocop/cop/autocorrect_logic.rb +14 -25
- data/lib/rubocop/cop/base.rb +399 -0
- data/lib/rubocop/cop/bundler/gem_comment.rb +70 -1
- data/lib/rubocop/cop/bundler/insecure_protocol_source.rb +10 -20
- data/lib/rubocop/cop/commissioner.rb +48 -71
- data/lib/rubocop/cop/cop.rb +91 -227
- data/lib/rubocop/cop/corrector.rb +38 -115
- data/lib/rubocop/cop/correctors/alignment_corrector.rb +2 -6
- data/lib/rubocop/cop/correctors/lambda_literal_to_method_corrector.rb +1 -1
- data/lib/rubocop/cop/correctors/space_corrector.rb +1 -3
- data/lib/rubocop/cop/gemspec/ordered_dependencies.rb +1 -3
- data/lib/rubocop/cop/gemspec/required_ruby_version.rb +1 -1
- data/lib/rubocop/cop/gemspec/ruby_version_globals_usage.rb +1 -1
- data/lib/rubocop/cop/generator.rb +2 -2
- data/lib/rubocop/cop/generator/configuration_injector.rb +1 -1
- data/lib/rubocop/cop/ignored_node.rb +1 -3
- data/lib/rubocop/cop/internal_affairs/node_type_predicate.rb +11 -14
- data/lib/rubocop/cop/layout/case_indentation.rb +21 -22
- data/lib/rubocop/cop/layout/class_structure.rb +19 -16
- data/lib/rubocop/cop/layout/comment_indentation.rb +3 -3
- data/lib/rubocop/cop/layout/empty_comment.rb +1 -1
- data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +2 -6
- data/lib/rubocop/cop/layout/empty_lines_around_attribute_accessor.rb +57 -4
- data/lib/rubocop/cop/layout/end_of_line.rb +3 -3
- data/lib/rubocop/cop/layout/first_argument_indentation.rb +6 -4
- data/lib/rubocop/cop/layout/first_array_element_indentation.rb +1 -3
- data/lib/rubocop/cop/layout/first_array_element_line_break.rb +1 -1
- data/lib/rubocop/cop/layout/first_method_argument_line_break.rb +1 -3
- data/lib/rubocop/cop/layout/first_parameter_indentation.rb +2 -2
- data/lib/rubocop/cop/layout/hash_alignment.rb +8 -9
- data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +3 -7
- data/lib/rubocop/cop/layout/heredoc_indentation.rb +20 -103
- data/lib/rubocop/cop/layout/indentation_width.rb +1 -3
- data/lib/rubocop/cop/layout/line_length.rb +17 -17
- data/lib/rubocop/cop/layout/multiline_block_layout.rb +1 -2
- data/lib/rubocop/cop/layout/multiline_method_argument_line_breaks.rb +1 -3
- data/lib/rubocop/cop/layout/space_after_colon.rb +1 -1
- data/lib/rubocop/cop/layout/space_around_block_parameters.rb +19 -25
- data/lib/rubocop/cop/layout/space_around_keyword.rb +2 -2
- data/lib/rubocop/cop/layout/space_around_method_call_operator.rb +1 -3
- data/lib/rubocop/cop/layout/space_around_operators.rb +1 -1
- data/lib/rubocop/cop/layout/space_before_block_braces.rb +14 -0
- data/lib/rubocop/cop/layout/space_before_comment.rb +1 -3
- data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +2 -4
- data/lib/rubocop/cop/layout/space_inside_block_braces.rb +1 -1
- data/lib/rubocop/cop/layout/space_inside_hash_literal_braces.rb +2 -2
- data/lib/rubocop/cop/layout/space_inside_reference_brackets.rb +1 -3
- data/lib/rubocop/cop/legacy/corrections_proxy.rb +49 -0
- data/lib/rubocop/cop/legacy/corrector.rb +29 -0
- data/lib/rubocop/cop/lint/ambiguous_operator.rb +5 -2
- data/lib/rubocop/cop/lint/constant_resolution.rb +89 -0
- data/lib/rubocop/cop/lint/deprecated_open_ssl_constant.rb +137 -0
- data/lib/rubocop/cop/lint/ensure_return.rb +1 -1
- data/lib/rubocop/cop/lint/erb_new_arguments.rb +1 -3
- data/lib/rubocop/cop/lint/float_out_of_range.rb +1 -1
- data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +38 -2
- data/lib/rubocop/cop/lint/interpolation_check.rb +13 -0
- data/lib/rubocop/cop/lint/loop.rb +1 -1
- data/lib/rubocop/cop/lint/mixed_regexp_capture_types.rb +69 -0
- 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/non_deterministic_require_order.rb +2 -2
- data/lib/rubocop/cop/lint/non_local_exit_from_iterator.rb +7 -7
- data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +20 -5
- data/lib/rubocop/cop/lint/percent_string_array.rb +2 -4
- data/lib/rubocop/cop/lint/percent_symbol_array.rb +1 -1
- data/lib/rubocop/cop/lint/raise_exception.rb +12 -4
- data/lib/rubocop/cop/lint/rand_one.rb +1 -1
- data/lib/rubocop/cop/lint/redundant_cop_disable_directive.rb +31 -25
- data/lib/rubocop/cop/lint/redundant_require_statement.rb +3 -3
- data/lib/rubocop/cop/lint/redundant_splat_expansion.rb +2 -2
- data/lib/rubocop/cop/lint/regexp_as_condition.rb +6 -0
- data/lib/rubocop/cop/lint/rescue_exception.rb +1 -1
- data/lib/rubocop/cop/lint/safe_navigation_with_empty.rb +9 -1
- data/lib/rubocop/cop/lint/suppressed_exception.rb +15 -2
- data/lib/rubocop/cop/lint/syntax.rb +11 -28
- data/lib/rubocop/cop/lint/unreachable_code.rb +1 -1
- data/lib/rubocop/cop/lint/unused_method_argument.rb +1 -1
- data/lib/rubocop/cop/lint/useless_access_modifier.rb +2 -4
- data/lib/rubocop/cop/lint/useless_else_without_rescue.rb +1 -1
- data/lib/rubocop/cop/lint/useless_setter_call.rb +1 -1
- data/lib/rubocop/cop/metrics/block_length.rb +22 -0
- data/lib/rubocop/cop/metrics/class_length.rb +25 -2
- data/lib/rubocop/cop/metrics/cyclomatic_complexity.rb +35 -3
- data/lib/rubocop/cop/metrics/method_length.rb +23 -0
- data/lib/rubocop/cop/metrics/module_length.rb +25 -2
- data/lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +1 -1
- data/lib/rubocop/cop/metrics/utils/code_length_calculator.rb +129 -0
- data/lib/rubocop/cop/metrics/utils/iterating_block.rb +61 -0
- data/lib/rubocop/cop/migration/department_name.rb +7 -7
- data/lib/rubocop/cop/mixin/alignment.rb +1 -3
- data/lib/rubocop/cop/mixin/allowed_methods.rb +19 -0
- data/lib/rubocop/cop/mixin/array_min_size.rb +1 -3
- data/lib/rubocop/cop/mixin/auto_corrector.rb +12 -0
- data/lib/rubocop/cop/mixin/check_line_breakable.rb +3 -9
- data/lib/rubocop/cop/mixin/code_length.rb +4 -0
- data/lib/rubocop/cop/mixin/configurable_enforced_style.rb +1 -3
- data/lib/rubocop/cop/mixin/configurable_formatting.rb +3 -5
- data/lib/rubocop/cop/mixin/configurable_naming.rb +1 -1
- data/lib/rubocop/cop/mixin/documentation_comment.rb +2 -2
- data/lib/rubocop/cop/mixin/end_keyword_alignment.rb +1 -1
- data/lib/rubocop/cop/mixin/enforce_superclass.rb +3 -1
- data/lib/rubocop/cop/mixin/first_element_line_break.rb +1 -1
- data/lib/rubocop/cop/mixin/ignored_pattern.rb +1 -1
- data/lib/rubocop/cop/mixin/line_length_help.rb +1 -1
- data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +1 -1
- data/lib/rubocop/cop/mixin/nil_methods.rb +3 -5
- data/lib/rubocop/cop/mixin/ordered_gem_node.rb +6 -1
- data/lib/rubocop/cop/mixin/parentheses.rb +1 -2
- data/lib/rubocop/cop/mixin/preceding_following_alignment.rb +1 -1
- data/lib/rubocop/cop/mixin/range_help.rb +1 -1
- data/lib/rubocop/cop/mixin/regexp_literal_help.rb +43 -0
- data/lib/rubocop/cop/mixin/string_literals_help.rb +1 -1
- data/lib/rubocop/cop/mixin/surrounding_space.rb +10 -5
- data/lib/rubocop/cop/mixin/too_many_lines.rb +3 -13
- data/lib/rubocop/cop/mixin/trailing_comma.rb +2 -4
- data/lib/rubocop/cop/mixin/uncommunicative_name.rb +7 -5
- data/lib/rubocop/cop/naming/ascii_identifiers.rb +27 -4
- data/lib/rubocop/cop/naming/binary_operator_parameter_name.rb +3 -3
- data/lib/rubocop/cop/naming/class_and_module_camel_case.rb +11 -1
- data/lib/rubocop/cop/naming/file_name.rb +28 -17
- data/lib/rubocop/cop/naming/heredoc_delimiter_naming.rb +1 -1
- data/lib/rubocop/cop/naming/method_name.rb +1 -1
- data/lib/rubocop/cop/naming/method_parameter_name.rb +1 -1
- data/lib/rubocop/cop/naming/predicate_name.rb +4 -6
- data/lib/rubocop/cop/naming/variable_name.rb +1 -1
- data/lib/rubocop/cop/naming/variable_number.rb +1 -1
- data/lib/rubocop/cop/offense.rb +16 -2
- data/lib/rubocop/cop/registry.rb +63 -10
- data/lib/rubocop/cop/severity.rb +1 -3
- data/lib/rubocop/cop/style/accessor_grouping.rb +136 -0
- data/lib/rubocop/cop/style/and_or.rb +2 -2
- data/lib/rubocop/cop/style/array_join.rb +1 -1
- data/lib/rubocop/cop/style/attr.rb +1 -3
- data/lib/rubocop/cop/style/bare_percent_literals.rb +2 -2
- data/lib/rubocop/cop/style/bisected_attr_accessor.rb +121 -0
- data/lib/rubocop/cop/style/block_delimiters.rb +4 -12
- data/lib/rubocop/cop/style/class_and_module_children.rb +1 -1
- data/lib/rubocop/cop/style/class_vars.rb +21 -0
- data/lib/rubocop/cop/style/command_literal.rb +1 -1
- data/lib/rubocop/cop/style/commented_keyword.rb +2 -2
- data/lib/rubocop/cop/style/conditional_assignment.rb +2 -4
- data/lib/rubocop/cop/style/copyright.rb +5 -5
- data/lib/rubocop/cop/style/date_time.rb +1 -1
- data/lib/rubocop/cop/style/dir.rb +2 -2
- data/lib/rubocop/cop/style/disable_cops_within_source_code_directive.rb +1 -1
- data/lib/rubocop/cop/style/documentation.rb +2 -2
- data/lib/rubocop/cop/style/double_negation.rb +41 -4
- data/lib/rubocop/cop/style/empty_case_condition.rb +8 -6
- data/lib/rubocop/cop/style/empty_literal.rb +6 -8
- data/lib/rubocop/cop/style/empty_method.rb +1 -1
- data/lib/rubocop/cop/style/encoding.rb +1 -1
- data/lib/rubocop/cop/style/expand_path_arguments.rb +2 -2
- data/lib/rubocop/cop/style/exponential_notation.rb +5 -5
- data/lib/rubocop/cop/style/format_string_token.rb +2 -3
- data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +3 -6
- data/lib/rubocop/cop/style/hash_each_methods.rb +1 -1
- data/lib/rubocop/cop/style/hash_syntax.rb +16 -7
- data/lib/rubocop/cop/style/identical_conditional_branches.rb +1 -1
- data/lib/rubocop/cop/style/if_inside_else.rb +1 -1
- data/lib/rubocop/cop/style/if_unless_modifier_of_if_unless.rb +12 -0
- data/lib/rubocop/cop/style/inline_comment.rb +1 -1
- data/lib/rubocop/cop/style/inverse_methods.rb +1 -1
- data/lib/rubocop/cop/style/ip_addresses.rb +1 -1
- data/lib/rubocop/cop/style/method_call_with_args_parentheses/require_parentheses.rb +1 -3
- data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +1 -3
- data/lib/rubocop/cop/style/multiline_block_chain.rb +10 -1
- data/lib/rubocop/cop/style/multiline_if_then.rb +1 -1
- data/lib/rubocop/cop/style/multiline_memoization.rb +1 -1
- data/lib/rubocop/cop/style/multiline_ternary_operator.rb +17 -6
- data/lib/rubocop/cop/style/mutable_constant.rb +4 -4
- data/lib/rubocop/cop/style/negated_if.rb +3 -3
- data/lib/rubocop/cop/style/negated_unless.rb +3 -3
- data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +2 -5
- data/lib/rubocop/cop/style/nested_ternary_operator.rb +27 -0
- data/lib/rubocop/cop/style/next.rb +2 -2
- data/lib/rubocop/cop/style/non_nil_check.rb +1 -1
- data/lib/rubocop/cop/style/numeric_literal_prefix.rb +2 -2
- data/lib/rubocop/cop/style/one_line_conditional.rb +2 -6
- data/lib/rubocop/cop/style/percent_literal_delimiters.rb +1 -1
- data/lib/rubocop/cop/style/proc.rb +1 -1
- data/lib/rubocop/cop/style/random_with_offset.rb +4 -10
- data/lib/rubocop/cop/style/redundant_assignment.rb +117 -0
- data/lib/rubocop/cop/style/redundant_conditional.rb +4 -3
- data/lib/rubocop/cop/style/redundant_exception.rb +14 -10
- data/lib/rubocop/cop/style/redundant_fetch_block.rb +122 -0
- data/lib/rubocop/cop/style/redundant_freeze.rb +1 -1
- data/lib/rubocop/cop/style/redundant_parentheses.rb +10 -8
- data/lib/rubocop/cop/style/redundant_percent_q.rb +3 -3
- data/lib/rubocop/cop/style/redundant_regexp_character_class.rb +90 -0
- data/lib/rubocop/cop/style/redundant_regexp_escape.rb +121 -0
- data/lib/rubocop/cop/style/redundant_self.rb +6 -9
- data/lib/rubocop/cop/style/rescue_standard_error.rb +1 -1
- data/lib/rubocop/cop/style/safe_navigation.rb +2 -6
- data/lib/rubocop/cop/style/sample.rb +1 -1
- data/lib/rubocop/cop/style/semicolon.rb +1 -1
- data/lib/rubocop/cop/style/signal_exception.rb +1 -1
- data/lib/rubocop/cop/style/slicing_with_range.rb +1 -1
- data/lib/rubocop/cop/style/special_global_vars.rb +2 -6
- data/lib/rubocop/cop/style/stderr_puts.rb +1 -1
- data/lib/rubocop/cop/style/struct_inheritance.rb +23 -2
- data/lib/rubocop/cop/style/symbol_array.rb +5 -5
- data/lib/rubocop/cop/style/symbol_proc.rb +1 -1
- data/lib/rubocop/cop/style/ternary_parentheses.rb +2 -4
- data/lib/rubocop/cop/style/trailing_comma_in_arguments.rb +3 -3
- data/lib/rubocop/cop/style/trailing_comma_in_array_literal.rb +3 -3
- data/lib/rubocop/cop/style/trailing_comma_in_block_args.rb +13 -13
- data/lib/rubocop/cop/style/trailing_comma_in_hash_literal.rb +3 -3
- data/lib/rubocop/cop/style/trailing_underscore_variable.rb +1 -3
- data/lib/rubocop/cop/style/trivial_accessors.rb +8 -7
- data/lib/rubocop/cop/style/unless_else.rb +1 -1
- data/lib/rubocop/cop/style/when_then.rb +1 -1
- data/lib/rubocop/cop/style/word_array.rb +1 -1
- data/lib/rubocop/cop/style/yoda_condition.rb +18 -1
- data/lib/rubocop/cop/style/zero_length_predicate.rb +2 -2
- data/lib/rubocop/cop/team.rb +141 -81
- data/lib/rubocop/cop/util.rb +3 -3
- data/lib/rubocop/cop/utils/format_string.rb +19 -2
- data/lib/rubocop/cop/variable_force.rb +3 -9
- data/lib/rubocop/cop/variable_force/branch.rb +1 -3
- data/lib/rubocop/cop/variable_force/variable.rb +2 -6
- data/lib/rubocop/ext/processed_source.rb +18 -0
- data/lib/rubocop/formatter/base_formatter.rb +0 -4
- data/lib/rubocop/formatter/disabled_config_formatter.rb +5 -13
- data/lib/rubocop/formatter/formatter_set.rb +2 -4
- data/lib/rubocop/formatter/junit_formatter.rb +14 -4
- data/lib/rubocop/magic_comment.rb +1 -1
- data/lib/rubocop/name_similarity.rb +7 -3
- data/lib/rubocop/options.rb +30 -15
- data/lib/rubocop/path_util.rb +2 -2
- data/lib/rubocop/platform.rb +1 -1
- data/lib/rubocop/rake_task.rb +6 -9
- data/lib/rubocop/remote_config.rb +1 -3
- data/lib/rubocop/result_cache.rb +5 -7
- data/lib/rubocop/rspec/cop_helper.rb +5 -28
- data/lib/rubocop/rspec/expect_offense.rb +60 -23
- data/lib/rubocop/rspec/shared_contexts.rb +55 -17
- data/lib/rubocop/runner.rb +42 -38
- data/lib/rubocop/target_finder.rb +2 -4
- data/lib/rubocop/target_ruby.rb +5 -2
- data/lib/rubocop/version.rb +5 -3
- metadata +60 -62
- data/lib/rubocop/ast/builder.rb +0 -85
- data/lib/rubocop/ast/node.rb +0 -637
- data/lib/rubocop/ast/node/alias_node.rb +0 -24
- data/lib/rubocop/ast/node/and_node.rb +0 -29
- data/lib/rubocop/ast/node/args_node.rb +0 -29
- data/lib/rubocop/ast/node/array_node.rb +0 -70
- data/lib/rubocop/ast/node/block_node.rb +0 -121
- data/lib/rubocop/ast/node/break_node.rb +0 -17
- data/lib/rubocop/ast/node/case_match_node.rb +0 -56
- data/lib/rubocop/ast/node/case_node.rb +0 -56
- data/lib/rubocop/ast/node/class_node.rb +0 -31
- data/lib/rubocop/ast/node/def_node.rb +0 -82
- data/lib/rubocop/ast/node/defined_node.rb +0 -17
- data/lib/rubocop/ast/node/ensure_node.rb +0 -17
- data/lib/rubocop/ast/node/float_node.rb +0 -12
- data/lib/rubocop/ast/node/for_node.rb +0 -53
- data/lib/rubocop/ast/node/forward_args_node.rb +0 -18
- data/lib/rubocop/ast/node/hash_node.rb +0 -109
- data/lib/rubocop/ast/node/if_node.rb +0 -175
- data/lib/rubocop/ast/node/int_node.rb +0 -12
- data/lib/rubocop/ast/node/keyword_splat_node.rb +0 -45
- data/lib/rubocop/ast/node/mixin/basic_literal_node.rb +0 -16
- data/lib/rubocop/ast/node/mixin/binary_operator_node.rb +0 -43
- data/lib/rubocop/ast/node/mixin/collection_node.rb +0 -15
- data/lib/rubocop/ast/node/mixin/conditional_node.rb +0 -45
- data/lib/rubocop/ast/node/mixin/hash_element_node.rb +0 -125
- data/lib/rubocop/ast/node/mixin/method_dispatch_node.rb +0 -269
- data/lib/rubocop/ast/node/mixin/method_identifier_predicates.rb +0 -114
- data/lib/rubocop/ast/node/mixin/modifier_node.rb +0 -17
- data/lib/rubocop/ast/node/mixin/numeric_node.rb +0 -21
- data/lib/rubocop/ast/node/mixin/parameterized_node.rb +0 -61
- data/lib/rubocop/ast/node/mixin/predicate_operator_node.rb +0 -35
- data/lib/rubocop/ast/node/module_node.rb +0 -24
- data/lib/rubocop/ast/node/or_node.rb +0 -29
- data/lib/rubocop/ast/node/pair_node.rb +0 -63
- data/lib/rubocop/ast/node/range_node.rb +0 -18
- data/lib/rubocop/ast/node/regexp_node.rb +0 -33
- data/lib/rubocop/ast/node/resbody_node.rb +0 -24
- data/lib/rubocop/ast/node/retry_node.rb +0 -17
- data/lib/rubocop/ast/node/return_node.rb +0 -24
- data/lib/rubocop/ast/node/self_class_node.rb +0 -24
- data/lib/rubocop/ast/node/send_node.rb +0 -17
- data/lib/rubocop/ast/node/str_node.rb +0 -16
- data/lib/rubocop/ast/node/super_node.rb +0 -21
- data/lib/rubocop/ast/node/symbol_node.rb +0 -12
- data/lib/rubocop/ast/node/until_node.rb +0 -35
- data/lib/rubocop/ast/node/when_node.rb +0 -53
- data/lib/rubocop/ast/node/while_node.rb +0 -35
- data/lib/rubocop/ast/node/yield_node.rb +0 -21
- data/lib/rubocop/ast/sexp.rb +0 -16
- data/lib/rubocop/ast/traversal.rb +0 -202
- data/lib/rubocop/cop/mixin/classish_length.rb +0 -37
- data/lib/rubocop/node_pattern.rb +0 -887
- data/lib/rubocop/processed_source.rb +0 -213
- data/lib/rubocop/token.rb +0 -114
@@ -43,13 +43,15 @@ module RuboCop
|
|
43
43
|
|
44
44
|
def on_case(case_node)
|
45
45
|
return if case_node.condition
|
46
|
-
return if case_node.when_branches.any? do |when_branch|
|
47
|
-
when_branch.each_descendant.any?(&:return_type?)
|
48
|
-
end
|
49
46
|
|
50
|
-
|
51
|
-
|
52
|
-
|
47
|
+
branch_bodies = [
|
48
|
+
*case_node.when_branches.map(&:body),
|
49
|
+
case_node.else_branch
|
50
|
+
].compact
|
51
|
+
|
52
|
+
return if branch_bodies.any? do |body|
|
53
|
+
body.return_type? ||
|
54
|
+
body.each_descendant.any?(&:return_type?)
|
53
55
|
end
|
54
56
|
|
55
57
|
add_offense(case_node, location: :keyword)
|
@@ -25,13 +25,13 @@ module RuboCop
|
|
25
25
|
STR_MSG = 'Use string literal `%<prefer>s` instead of ' \
|
26
26
|
'`String.new`.'
|
27
27
|
|
28
|
-
def_node_matcher :array_node, '(send (const nil? :Array) :new)'
|
29
|
-
def_node_matcher :hash_node, '(send (const nil? :Hash) :new)'
|
30
|
-
def_node_matcher :str_node, '(send (const nil? :String) :new)'
|
28
|
+
def_node_matcher :array_node, '(send (const {nil? cbase} :Array) :new)'
|
29
|
+
def_node_matcher :hash_node, '(send (const {nil? cbase} :Hash) :new)'
|
30
|
+
def_node_matcher :str_node, '(send (const {nil? cbase} :String) :new)'
|
31
31
|
def_node_matcher :array_with_block,
|
32
|
-
'(block (send (const nil? :Array) :new) args _)'
|
32
|
+
'(block (send (const {nil? cbase} :Array) :new) args _)'
|
33
33
|
def_node_matcher :hash_with_block,
|
34
|
-
'(block (send (const nil? :Hash) :new) args _)'
|
34
|
+
'(block (send (const {nil? cbase} :Hash) :new) args _)'
|
35
35
|
|
36
36
|
def on_send(node)
|
37
37
|
add_offense(node, message: ARR_MSG) if offense_array_node?(node)
|
@@ -68,9 +68,7 @@ module RuboCop
|
|
68
68
|
|
69
69
|
def first_argument_unparenthesized?(node)
|
70
70
|
parent = node.parent
|
71
|
-
unless parent && %i[send super zsuper].include?(parent.type)
|
72
|
-
return false
|
73
|
-
end
|
71
|
+
return false unless parent && %i[send super zsuper].include?(parent.type)
|
74
72
|
|
75
73
|
node.object_id == parent.arguments.first.object_id &&
|
76
74
|
!parentheses?(node.parent)
|
@@ -8,7 +8,7 @@ module RuboCop
|
|
8
8
|
# line (compact style), but it can be configured to enforce the `end`
|
9
9
|
# to go on its own line (expanded style).
|
10
10
|
#
|
11
|
-
#
|
11
|
+
# NOTE: A method definition is not considered empty if it contains
|
12
12
|
# comments.
|
13
13
|
#
|
14
14
|
# @example EnforcedStyle: compact (default)
|
@@ -53,7 +53,7 @@ module RuboCop
|
|
53
53
|
|
54
54
|
def_node_matcher :file_expand_path, <<~PATTERN
|
55
55
|
(send
|
56
|
-
(const nil? :File) :expand_path
|
56
|
+
(const {nil? cbase} :File) :expand_path
|
57
57
|
$_
|
58
58
|
$_)
|
59
59
|
PATTERN
|
@@ -69,7 +69,7 @@ module RuboCop
|
|
69
69
|
(send
|
70
70
|
(send
|
71
71
|
(send
|
72
|
-
(const nil? :Pathname) :new
|
72
|
+
(const {nil? cbase} :Pathname) :new
|
73
73
|
$_) :parent) :expand_path)
|
74
74
|
PATTERN
|
75
75
|
|
@@ -5,12 +5,12 @@ module RuboCop
|
|
5
5
|
module Style
|
6
6
|
# This cop enforces consistency when using exponential notation
|
7
7
|
# for numbers in the code (eg 1.2e4). Different styles are supported:
|
8
|
-
#
|
8
|
+
# * `scientific` which enforces a mantissa between 1 (inclusive)
|
9
9
|
# and 10 (exclusive).
|
10
|
-
#
|
10
|
+
# * `engineering` which enforces the exponent to be a multiple of 3
|
11
11
|
# and the mantissa to be between 0.1 (inclusive)
|
12
12
|
# and 10 (exclusive).
|
13
|
-
#
|
13
|
+
# * `integral` which enforces the mantissa to always be a whole number
|
14
14
|
# without trailing zeroes.
|
15
15
|
#
|
16
16
|
# @example EnforcedStyle: scientific (default)
|
@@ -69,7 +69,7 @@ module RuboCop
|
|
69
69
|
|
70
70
|
def scientific?(node)
|
71
71
|
mantissa, = node.source.split('e')
|
72
|
-
|
72
|
+
/^-?[1-9](\.\d*[0-9])?$/.match?(mantissa)
|
73
73
|
end
|
74
74
|
|
75
75
|
def engineering?(node)
|
@@ -85,7 +85,7 @@ module RuboCop
|
|
85
85
|
|
86
86
|
def integral(node)
|
87
87
|
mantissa, = node.source.split('e')
|
88
|
-
|
88
|
+
/^-?[1-9](\d*[1-9])?$/.match?(mantissa)
|
89
89
|
end
|
90
90
|
|
91
91
|
def offense?(node)
|
@@ -5,11 +5,10 @@ module RuboCop
|
|
5
5
|
module Style
|
6
6
|
# Use a consistent style for named format string tokens.
|
7
7
|
#
|
8
|
-
#
|
9
|
-
# `unannotated` style cop only works for strings
|
8
|
+
# NOTE: `unannotated` style cop only works for strings
|
10
9
|
# which are passed as arguments to those methods:
|
11
10
|
# `printf`, `sprintf`, `format`, `%`.
|
12
|
-
# The reason is that
|
11
|
+
# The reason is that _unannotated_ format is very similar
|
13
12
|
# to encoded URLs or Date/Time formatting strings.
|
14
13
|
#
|
15
14
|
# @example EnforcedStyle: annotated (default)
|
@@ -8,8 +8,7 @@ module RuboCop
|
|
8
8
|
# It will add the comment `# frozen_string_literal: true` to the top of
|
9
9
|
# 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.
|
12
|
-
# Ruby 2.3+.
|
11
|
+
# encoding comment.
|
13
12
|
#
|
14
13
|
# Note that the cop will ignore files where the comment exists but is set
|
15
14
|
# to `false` instead of `true`.
|
@@ -149,9 +148,7 @@ module RuboCop
|
|
149
148
|
end
|
150
149
|
|
151
150
|
next_token = processed_source.tokens[token_number]
|
152
|
-
|
153
|
-
token = next_token
|
154
|
-
end
|
151
|
+
token = next_token if Encoding::ENCODING_PATTERN.match?(next_token&.text)
|
155
152
|
|
156
153
|
token
|
157
154
|
end
|
@@ -216,7 +213,7 @@ module RuboCop
|
|
216
213
|
if comment
|
217
214
|
corrector.insert_after(line_range(comment.line), following_comment)
|
218
215
|
else
|
219
|
-
corrector.insert_before(
|
216
|
+
corrector.insert_before(processed_source.buffer.source_range, preceding_comment)
|
220
217
|
end
|
221
218
|
end
|
222
219
|
|
@@ -5,7 +5,7 @@ module RuboCop
|
|
5
5
|
module Style
|
6
6
|
# This cop 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
|
10
10
|
# working with a hash, and suppress RuboCop offenses.
|
11
11
|
#
|
@@ -13,11 +13,11 @@ module RuboCop
|
|
13
13
|
# The supported styles are:
|
14
14
|
#
|
15
15
|
# * ruby19 - forces use of the 1.9 syntax (e.g. `{a: 1}`) when hashes have
|
16
|
-
#
|
16
|
+
# all symbols for keys
|
17
17
|
# * hash_rockets - forces use of hash rockets for all hashes
|
18
18
|
# * no_mixed_keys - simply checks for hashes with mixed syntaxes
|
19
19
|
# * ruby19_no_mixed_keys - forces use of ruby 1.9 syntax and forbids mixed
|
20
|
-
#
|
20
|
+
# syntax hashes
|
21
21
|
#
|
22
22
|
# @example EnforcedStyle: ruby19 (default)
|
23
23
|
# # bad
|
@@ -168,11 +168,7 @@ module RuboCop
|
|
168
168
|
end
|
169
169
|
|
170
170
|
def autocorrect_ruby19(corrector, pair_node)
|
171
|
-
|
172
|
-
op = pair_node.loc.operator
|
173
|
-
|
174
|
-
range = key.join(op)
|
175
|
-
range = range_with_surrounding_space(range: range, side: :right)
|
171
|
+
range = range_for_autocorrect_ruby19(pair_node)
|
176
172
|
|
177
173
|
space = argument_without_space?(pair_node.parent) ? ' ' : ''
|
178
174
|
|
@@ -180,6 +176,19 @@ module RuboCop
|
|
180
176
|
range,
|
181
177
|
range.source.sub(/^:(.*\S)\s*=>\s*$/, space.to_s + '\1: ')
|
182
178
|
)
|
179
|
+
|
180
|
+
hash_node = pair_node.parent
|
181
|
+
return unless hash_node.parent&.return_type? && !hash_node.braces?
|
182
|
+
|
183
|
+
corrector.wrap(hash_node, '{', '}')
|
184
|
+
end
|
185
|
+
|
186
|
+
def range_for_autocorrect_ruby19(pair_node)
|
187
|
+
key = pair_node.key.source_range
|
188
|
+
operator = pair_node.loc.operator
|
189
|
+
|
190
|
+
range = key.join(operator)
|
191
|
+
range_with_surrounding_space(range: range, side: :right)
|
183
192
|
end
|
184
193
|
|
185
194
|
def argument_without_space?(node)
|
@@ -81,7 +81,7 @@ module RuboCop
|
|
81
81
|
|
82
82
|
private
|
83
83
|
|
84
|
-
def check_branches(branches)
|
84
|
+
def check_branches(branches) # rubocop:todo Metrics/CyclomaticComplexity
|
85
85
|
# return if any branch is empty. An empty branch can be an `if`
|
86
86
|
# without an `else` or a branch that contains only comments.
|
87
87
|
return if branches.any?(&:nil?)
|
@@ -61,7 +61,7 @@ module RuboCop
|
|
61
61
|
class IfInsideElse < Cop
|
62
62
|
MSG = 'Convert `if` nested inside `else` to `elsif`.'
|
63
63
|
|
64
|
-
def on_if(node)
|
64
|
+
def on_if(node) # rubocop:todo Metrics/CyclomaticComplexity
|
65
65
|
return if node.ternary? || node.unless?
|
66
66
|
|
67
67
|
else_branch = node.else_branch
|
@@ -33,6 +33,18 @@ module RuboCop
|
|
33
33
|
add_offense(node, location: :keyword,
|
34
34
|
message: format(MSG, keyword: node.keyword))
|
35
35
|
end
|
36
|
+
|
37
|
+
def autocorrect(node)
|
38
|
+
lambda do |corrector|
|
39
|
+
keyword = node.if? ? 'if' : 'unless'
|
40
|
+
|
41
|
+
corrector.replace(node, <<~RUBY.chop)
|
42
|
+
#{keyword} #{node.condition.source}
|
43
|
+
#{node.if_branch.source}
|
44
|
+
end
|
45
|
+
RUBY
|
46
|
+
end
|
47
|
+
end
|
36
48
|
end
|
37
49
|
end
|
38
50
|
end
|
@@ -23,7 +23,7 @@ module RuboCop
|
|
23
23
|
def investigate(processed_source)
|
24
24
|
processed_source.each_comment do |comment|
|
25
25
|
next if comment_line?(processed_source[comment.loc.line - 1]) ||
|
26
|
-
comment.text.match(/\A# rubocop:(enable|disable)/)
|
26
|
+
comment.text.match?(/\A# rubocop:(enable|disable)/)
|
27
27
|
|
28
28
|
add_offense(comment)
|
29
29
|
end
|
@@ -34,7 +34,7 @@ module RuboCop
|
|
34
34
|
# shortcut out if the string does not look like an IP address
|
35
35
|
return false unless could_be_ip?(contents)
|
36
36
|
|
37
|
-
|
37
|
+
::Resolv::IPv4::Regex.match?(contents) || ::Resolv::IPv6::Regex.match?(contents)
|
38
38
|
end
|
39
39
|
|
40
40
|
# Dummy implementation of method in ConfigurableEnforcedStyle that is
|
@@ -22,9 +22,7 @@ module RuboCop
|
|
22
22
|
lambda do |corrector|
|
23
23
|
corrector.replace(args_begin(node), '(')
|
24
24
|
|
25
|
-
unless args_parenthesized?(node)
|
26
|
-
corrector.insert_after(args_end(node), ')')
|
27
|
-
end
|
25
|
+
corrector.insert_after(args_end(node), ')') unless args_parenthesized?(node)
|
28
26
|
end
|
29
27
|
end
|
30
28
|
|
@@ -41,9 +41,7 @@ module RuboCop
|
|
41
41
|
|
42
42
|
def same_name_assignment?(node)
|
43
43
|
any_assignment?(node) do |asgn_node|
|
44
|
-
if asgn_node.masgn_type?
|
45
|
-
next variable_in_mass_assignment?(node.method_name, asgn_node)
|
46
|
-
end
|
44
|
+
next variable_in_mass_assignment?(node.method_name, asgn_node) if asgn_node.masgn_type?
|
47
45
|
|
48
46
|
asgn_node.loc.name.source == node.method_name.to_s
|
49
47
|
end
|
@@ -8,11 +8,20 @@ module RuboCop
|
|
8
8
|
#
|
9
9
|
# @example
|
10
10
|
#
|
11
|
-
#
|
11
|
+
# # bad
|
12
|
+
# Thread.list.select do |t|
|
12
13
|
# t.alive?
|
13
14
|
# end.map do |t|
|
14
15
|
# t.object_id
|
15
16
|
# end
|
17
|
+
#
|
18
|
+
# # good
|
19
|
+
# alive_threads = Thread.list.select do |t|
|
20
|
+
# t.alive?
|
21
|
+
# end
|
22
|
+
# alive_threads.map do |t|
|
23
|
+
# t.object_id
|
24
|
+
# end
|
16
25
|
class MultilineBlockChain < Cop
|
17
26
|
include RangeHelp
|
18
27
|
|
@@ -17,12 +17,11 @@ module RuboCop
|
|
17
17
|
#
|
18
18
|
# # good
|
19
19
|
# a = cond ? b : c
|
20
|
-
# a =
|
21
|
-
#
|
22
|
-
#
|
23
|
-
#
|
24
|
-
#
|
25
|
-
# end
|
20
|
+
# a = if cond
|
21
|
+
# b
|
22
|
+
# else
|
23
|
+
# c
|
24
|
+
# end
|
26
25
|
class MultilineTernaryOperator < Cop
|
27
26
|
MSG = 'Avoid multi-line ternary operators, ' \
|
28
27
|
'use `if` or `unless` instead.'
|
@@ -32,6 +31,18 @@ module RuboCop
|
|
32
31
|
|
33
32
|
add_offense(node)
|
34
33
|
end
|
34
|
+
|
35
|
+
def autocorrect(node)
|
36
|
+
lambda do |corrector|
|
37
|
+
corrector.replace(node, <<~RUBY.chop)
|
38
|
+
if #{node.condition.source}
|
39
|
+
#{node.if_branch.source}
|
40
|
+
else
|
41
|
+
#{node.else_branch.source}
|
42
|
+
end
|
43
|
+
RUBY
|
44
|
+
end
|
45
|
+
end
|
35
46
|
end
|
36
47
|
end
|
37
48
|
end
|
@@ -150,14 +150,14 @@ module RuboCop
|
|
150
150
|
def_node_matcher :operation_produces_immutable_object?, <<~PATTERN
|
151
151
|
{
|
152
152
|
(const _ _)
|
153
|
-
(send (const nil? :Struct) :new ...)
|
154
|
-
(block (send (const nil? :Struct) :new ...) ...)
|
153
|
+
(send (const {nil? cbase} :Struct) :new ...)
|
154
|
+
(block (send (const {nil? cbase} :Struct) :new ...) ...)
|
155
155
|
(send _ :freeze)
|
156
156
|
(send {float int} {:+ :- :* :** :/ :% :<<} _)
|
157
157
|
(send _ {:+ :- :* :** :/ :%} {float int})
|
158
158
|
(send _ {:== :=== :!= :<= :>= :< :>} _)
|
159
|
-
(send (const nil? :ENV) :[] _)
|
160
|
-
(or (send (const nil? :ENV) :[] _) _)
|
159
|
+
(send (const {nil? cbase} :ENV) :[] _)
|
160
|
+
(or (send (const {nil? cbase} :ENV) :[] _) _)
|
161
161
|
(send _ {:count :length :size} ...)
|
162
162
|
(block (send _ {:count :length :size} ...) ...)
|
163
163
|
}
|
@@ -6,9 +6,9 @@ module RuboCop
|
|
6
6
|
# Checks for uses of if with a negated condition. Only ifs
|
7
7
|
# without else are considered. There are three different styles:
|
8
8
|
#
|
9
|
-
#
|
10
|
-
#
|
11
|
-
#
|
9
|
+
# * both
|
10
|
+
# * prefix
|
11
|
+
# * postfix
|
12
12
|
#
|
13
13
|
# @example EnforcedStyle: both (default)
|
14
14
|
# # enforces `unless` for `prefix` and `postfix` conditionals
|
@@ -6,9 +6,9 @@ module RuboCop
|
|
6
6
|
# Checks for uses of unless with a negated condition. Only unless
|
7
7
|
# without else are considered. There are three different styles:
|
8
8
|
#
|
9
|
-
#
|
10
|
-
#
|
11
|
-
#
|
9
|
+
# * both
|
10
|
+
# * prefix
|
11
|
+
# * postfix
|
12
12
|
#
|
13
13
|
# @example EnforcedStyle: both (default)
|
14
14
|
# # enforces `if` for `prefix` and `postfix` conditionals
|
@@ -14,6 +14,7 @@ module RuboCop
|
|
14
14
|
# method1(method2 arg)
|
15
15
|
class NestedParenthesizedCalls < Cop
|
16
16
|
include RangeHelp
|
17
|
+
include AllowedMethods
|
17
18
|
|
18
19
|
MSG = 'Add parentheses to nested method call `%<source>s`.'
|
19
20
|
|
@@ -54,13 +55,9 @@ module RuboCop
|
|
54
55
|
|
55
56
|
def allowed?(send_node)
|
56
57
|
send_node.parent.arguments.one? &&
|
57
|
-
|
58
|
+
allowed_method?(send_node.method_name) &&
|
58
59
|
send_node.arguments.one?
|
59
60
|
end
|
60
|
-
|
61
|
-
def allowed_methods
|
62
|
-
cop_config['AllowedMethods'] || []
|
63
|
-
end
|
64
61
|
end
|
65
62
|
end
|
66
63
|
end
|