rubocop 0.85.1 → 0.89.1
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 +16 -4
- data/bin/rubocop-profile +32 -0
- data/config/default.yml +227 -26
- data/lib/rubocop/cli/command/auto_genenerate_config.rb +42 -7
- data/lib/rubocop/cli/command/base.rb +1 -0
- 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 +3 -3
- data/lib/rubocop/cli/command/version.rb +2 -2
- data/lib/rubocop/cli.rb +2 -4
- data/lib/rubocop/comment_config.rb +5 -7
- data/lib/rubocop/config.rb +21 -4
- data/lib/rubocop/config_loader.rb +41 -69
- data/lib/rubocop/config_loader_resolver.rb +4 -4
- data/lib/rubocop/config_obsoletion.rb +6 -2
- data/lib/rubocop/config_store.rb +4 -0
- data/lib/rubocop/config_validator.rb +2 -4
- data/lib/rubocop/cop/autocorrect_logic.rb +14 -24
- data/lib/rubocop/cop/badge.rb +1 -1
- data/lib/rubocop/cop/base.rb +407 -0
- data/lib/rubocop/cop/bundler/insecure_protocol_source.rb +10 -20
- data/lib/rubocop/cop/commissioner.rb +47 -50
- data/lib/rubocop/cop/cop.rb +85 -236
- data/lib/rubocop/cop/corrector.rb +38 -115
- data/lib/rubocop/cop/correctors/line_break_corrector.rb +4 -4
- data/lib/rubocop/cop/correctors/multiline_literal_brace_corrector.rb +26 -0
- data/lib/rubocop/cop/correctors/percent_literal_corrector.rb +2 -2
- data/lib/rubocop/cop/correctors/punctuation_corrector.rb +1 -1
- data/lib/rubocop/cop/correctors/unused_arg_corrector.rb +15 -18
- data/lib/rubocop/cop/force.rb +1 -0
- data/lib/rubocop/cop/gemspec/required_ruby_version.rb +39 -13
- data/lib/rubocop/cop/gemspec/ruby_version_globals_usage.rb +1 -1
- data/lib/rubocop/cop/generator/configuration_injector.rb +3 -3
- data/lib/rubocop/cop/generator.rb +1 -1
- data/lib/rubocop/cop/internal_affairs/method_name_equal.rb +4 -12
- data/lib/rubocop/cop/internal_affairs/node_destructuring.rb +1 -1
- data/lib/rubocop/cop/internal_affairs/node_type_predicate.rb +11 -14
- data/lib/rubocop/cop/internal_affairs/offense_location_keyword.rb +8 -8
- data/lib/rubocop/cop/internal_affairs/redundant_location_argument.rb +10 -7
- data/lib/rubocop/cop/internal_affairs/redundant_message_argument.rb +7 -8
- data/lib/rubocop/cop/internal_affairs/useless_message_assertion.rb +2 -2
- data/lib/rubocop/cop/layout/block_alignment.rb +1 -1
- data/lib/rubocop/cop/layout/case_indentation.rb +18 -19
- data/lib/rubocop/cop/layout/class_structure.rb +5 -44
- data/lib/rubocop/cop/layout/comment_indentation.rb +4 -4
- data/lib/rubocop/cop/layout/empty_comment.rb +1 -1
- data/lib/rubocop/cop/layout/empty_lines.rb +0 -2
- data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +1 -0
- data/lib/rubocop/cop/layout/empty_lines_around_attribute_accessor.rb +3 -8
- data/lib/rubocop/cop/layout/end_alignment.rb +3 -2
- data/lib/rubocop/cop/layout/end_of_line.rb +1 -1
- data/lib/rubocop/cop/layout/extra_spacing.rb +22 -36
- data/lib/rubocop/cop/layout/first_argument_indentation.rb +5 -1
- 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 -1
- data/lib/rubocop/cop/layout/hash_alignment.rb +2 -3
- data/lib/rubocop/cop/layout/heredoc_indentation.rb +2 -2
- data/lib/rubocop/cop/layout/indentation_style.rb +0 -2
- data/lib/rubocop/cop/layout/leading_comment_space.rb +1 -1
- data/lib/rubocop/cop/layout/multiline_block_layout.rb +17 -7
- data/lib/rubocop/cop/layout/multiline_method_argument_line_breaks.rb +1 -1
- data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +0 -2
- data/lib/rubocop/cop/layout/space_after_colon.rb +1 -1
- data/lib/rubocop/cop/layout/space_around_block_parameters.rb +22 -27
- data/lib/rubocop/cop/layout/space_around_keyword.rb +2 -2
- data/lib/rubocop/cop/layout/space_around_method_call_operator.rb +33 -66
- 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_inside_array_literal_brackets.rb +4 -3
- 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/legacy/corrections_proxy.rb +49 -0
- data/lib/rubocop/cop/legacy/corrector.rb +29 -0
- data/lib/rubocop/cop/lint/ambiguous_block_association.rb +7 -4
- data/lib/rubocop/cop/lint/ambiguous_operator.rb +15 -10
- data/lib/rubocop/cop/lint/ambiguous_regexp_literal.rb +11 -13
- data/lib/rubocop/cop/lint/assignment_in_condition.rb +2 -2
- data/lib/rubocop/cop/lint/big_decimal_new.rb +10 -10
- data/lib/rubocop/cop/lint/binary_operator_with_identical_operands.rb +50 -0
- data/lib/rubocop/cop/lint/boolean_symbol.rb +16 -11
- data/lib/rubocop/cop/lint/circular_argument_reference.rb +1 -1
- data/lib/rubocop/cop/lint/constant_resolution.rb +89 -0
- data/lib/rubocop/cop/lint/debugger.rb +7 -1
- data/lib/rubocop/cop/lint/deprecated_class_methods.rb +9 -10
- data/lib/rubocop/cop/lint/deprecated_open_ssl_constant.rb +21 -17
- data/lib/rubocop/cop/lint/disjunctive_assignment_in_constructor.rb +8 -2
- data/lib/rubocop/cop/lint/duplicate_case_condition.rb +1 -1
- data/lib/rubocop/cop/lint/duplicate_elsif_condition.rb +39 -0
- data/lib/rubocop/cop/lint/duplicate_hash_key.rb +1 -1
- data/lib/rubocop/cop/lint/duplicate_methods.rb +9 -6
- data/lib/rubocop/cop/lint/duplicate_rescue_exception.rb +60 -0
- data/lib/rubocop/cop/lint/each_with_object_argument.rb +1 -1
- data/lib/rubocop/cop/lint/else_layout.rb +1 -1
- data/lib/rubocop/cop/lint/empty_conditional_body.rb +67 -0
- data/lib/rubocop/cop/lint/empty_ensure.rb +5 -5
- data/lib/rubocop/cop/lint/empty_expression.rb +2 -2
- data/lib/rubocop/cop/lint/empty_interpolation.rb +5 -6
- data/lib/rubocop/cop/lint/empty_when.rb +2 -2
- data/lib/rubocop/cop/lint/ensure_return.rb +27 -29
- data/lib/rubocop/cop/lint/erb_new_arguments.rb +11 -10
- data/lib/rubocop/cop/lint/flip_flop.rb +1 -1
- data/lib/rubocop/cop/lint/float_comparison.rb +93 -0
- data/lib/rubocop/cop/lint/float_out_of_range.rb +2 -2
- data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +11 -5
- data/lib/rubocop/cop/lint/heredoc_method_call_position.rb +13 -14
- data/lib/rubocop/cop/lint/implicit_string_concatenation.rb +5 -4
- data/lib/rubocop/cop/lint/ineffective_access_modifier.rb +8 -8
- data/lib/rubocop/cop/lint/inherit_exception.rb +12 -7
- data/lib/rubocop/cop/lint/interpolation_check.rb +21 -5
- data/lib/rubocop/cop/lint/literal_as_condition.rb +14 -2
- data/lib/rubocop/cop/lint/literal_in_interpolation.rb +7 -7
- data/lib/rubocop/cop/lint/loop.rb +23 -2
- data/lib/rubocop/cop/lint/missing_cop_enable_directive.rb +6 -5
- data/lib/rubocop/cop/lint/missing_super.rb +99 -0
- data/lib/rubocop/cop/lint/mixed_regexp_capture_types.rb +1 -1
- data/lib/rubocop/cop/lint/multiple_comparison.rb +6 -9
- data/lib/rubocop/cop/lint/nested_method_definition.rb +15 -21
- data/lib/rubocop/cop/lint/nested_percent_literal.rb +1 -1
- data/lib/rubocop/cop/lint/next_without_accumulator.rb +1 -1
- data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +84 -13
- data/lib/rubocop/cop/lint/non_local_exit_from_iterator.rb +2 -2
- data/lib/rubocop/cop/lint/number_conversion.rb +6 -9
- data/lib/rubocop/cop/lint/ordered_magic_comments.rb +11 -13
- data/lib/rubocop/cop/lint/out_of_range_regexp_ref.rb +90 -0
- data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +12 -13
- data/lib/rubocop/cop/lint/percent_string_array.rb +14 -13
- data/lib/rubocop/cop/lint/percent_symbol_array.rb +14 -13
- data/lib/rubocop/cop/lint/raise_exception.rb +15 -5
- data/lib/rubocop/cop/lint/rand_one.rb +3 -3
- data/lib/rubocop/cop/lint/redundant_cop_disable_directive.rb +43 -40
- data/lib/rubocop/cop/lint/redundant_cop_enable_directive.rb +7 -11
- data/lib/rubocop/cop/lint/redundant_require_statement.rb +4 -7
- data/lib/rubocop/cop/lint/redundant_splat_expansion.rb +15 -11
- data/lib/rubocop/cop/lint/redundant_string_coercion.rb +6 -13
- data/lib/rubocop/cop/lint/redundant_with_index.rb +11 -14
- data/lib/rubocop/cop/lint/redundant_with_object.rb +11 -14
- data/lib/rubocop/cop/lint/regexp_as_condition.rb +6 -2
- data/lib/rubocop/cop/lint/require_parentheses.rb +2 -2
- data/lib/rubocop/cop/lint/rescue_exception.rb +1 -1
- data/lib/rubocop/cop/lint/rescue_type.rb +8 -8
- data/lib/rubocop/cop/lint/return_in_void_context.rb +2 -4
- data/lib/rubocop/cop/lint/safe_navigation_chain.rb +3 -6
- data/lib/rubocop/cop/lint/safe_navigation_consistency.rb +14 -10
- data/lib/rubocop/cop/lint/safe_navigation_with_empty.rb +10 -2
- data/lib/rubocop/cop/lint/script_permission.rb +10 -7
- data/lib/rubocop/cop/lint/self_assignment.rb +78 -0
- data/lib/rubocop/cop/lint/send_with_mixin_argument.rb +5 -11
- data/lib/rubocop/cop/lint/shadowed_argument.rb +3 -3
- data/lib/rubocop/cop/lint/shadowed_exception.rb +2 -2
- data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +3 -3
- data/lib/rubocop/cop/lint/struct_new_override.rb +1 -1
- data/lib/rubocop/cop/lint/suppressed_exception.rb +4 -7
- data/lib/rubocop/cop/lint/syntax.rb +11 -26
- data/lib/rubocop/cop/lint/to_json.rb +4 -6
- data/lib/rubocop/cop/lint/top_level_return_with_argument.rb +34 -0
- data/lib/rubocop/cop/lint/underscore_prefixed_variable_name.rb +4 -4
- data/lib/rubocop/cop/lint/unified_integer.rb +4 -6
- data/lib/rubocop/cop/lint/unreachable_code.rb +1 -1
- data/lib/rubocop/cop/lint/unreachable_loop.rb +174 -0
- data/lib/rubocop/cop/lint/unused_block_argument.rb +8 -3
- data/lib/rubocop/cop/lint/unused_method_argument.rb +9 -4
- data/lib/rubocop/cop/lint/uri_escape_unescape.rb +1 -1
- data/lib/rubocop/cop/lint/uri_regexp.rb +11 -47
- data/lib/rubocop/cop/lint/useless_access_modifier.rb +26 -16
- data/lib/rubocop/cop/lint/useless_assignment.rb +4 -4
- data/lib/rubocop/cop/lint/useless_else_without_rescue.rb +6 -15
- data/lib/rubocop/cop/lint/useless_setter_call.rb +4 -6
- data/lib/rubocop/cop/lint/void.rb +3 -7
- data/lib/rubocop/cop/metrics/abc_size.rb +1 -1
- data/lib/rubocop/cop/metrics/block_length.rb +24 -2
- data/lib/rubocop/cop/metrics/block_nesting.rb +2 -2
- data/lib/rubocop/cop/metrics/class_length.rb +26 -3
- data/lib/rubocop/cop/metrics/cyclomatic_complexity.rb +37 -4
- data/lib/rubocop/cop/metrics/method_length.rb +25 -2
- data/lib/rubocop/cop/metrics/module_length.rb +26 -3
- data/lib/rubocop/cop/metrics/parameter_lists.rb +2 -6
- data/lib/rubocop/cop/metrics/perceived_complexity.rb +7 -8
- data/lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +47 -4
- data/lib/rubocop/cop/metrics/utils/code_length_calculator.rb +157 -0
- data/lib/rubocop/cop/metrics/utils/iterating_block.rb +61 -0
- data/lib/rubocop/cop/metrics/utils/repeated_csend_discount.rb +37 -0
- data/lib/rubocop/cop/migration/department_name.rb +14 -16
- data/lib/rubocop/cop/mixin/alignment.rb +2 -1
- data/lib/rubocop/cop/mixin/allowed_methods.rb +19 -0
- data/lib/rubocop/cop/mixin/array_min_size.rb +1 -1
- data/lib/rubocop/cop/mixin/auto_corrector.rb +12 -0
- data/lib/rubocop/cop/mixin/check_line_breakable.rb +2 -2
- data/lib/rubocop/cop/mixin/code_length.rb +26 -5
- data/lib/rubocop/cop/mixin/configurable_formatting.rb +1 -1
- 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/hash_transform_method.rb +5 -11
- data/lib/rubocop/cop/mixin/line_length_help.rb +1 -3
- data/lib/rubocop/cop/mixin/method_complexity.rb +10 -2
- data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +1 -1
- data/lib/rubocop/cop/mixin/multiline_literal_brace_layout.rb +1 -2
- 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/percent_array.rb +2 -6
- data/lib/rubocop/cop/mixin/preceding_following_alignment.rb +1 -1
- data/lib/rubocop/cop/mixin/range_help.rb +19 -5
- data/lib/rubocop/cop/mixin/regexp_literal_help.rb +27 -0
- data/lib/rubocop/cop/mixin/statement_modifier.rb +39 -10
- data/lib/rubocop/cop/mixin/string_literals_help.rb +1 -1
- data/lib/rubocop/cop/mixin/surrounding_space.rb +7 -27
- data/lib/rubocop/cop/mixin/trailing_comma.rb +3 -5
- data/lib/rubocop/cop/mixin/uncommunicative_name.rb +12 -17
- data/lib/rubocop/cop/mixin/unused_argument.rb +4 -6
- data/lib/rubocop/cop/mixin/visibility_help.rb +50 -0
- data/lib/rubocop/cop/naming/accessor_method_name.rb +4 -2
- data/lib/rubocop/cop/naming/ascii_identifiers.rb +29 -6
- data/lib/rubocop/cop/naming/binary_operator_parameter_name.rb +4 -4
- data/lib/rubocop/cop/naming/block_parameter_name.rb +1 -1
- data/lib/rubocop/cop/naming/class_and_module_camel_case.rb +2 -2
- data/lib/rubocop/cop/naming/constant_name.rb +2 -2
- data/lib/rubocop/cop/naming/file_name.rb +4 -6
- data/lib/rubocop/cop/naming/heredoc_delimiter_case.rb +2 -2
- data/lib/rubocop/cop/naming/heredoc_delimiter_naming.rb +3 -3
- data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +2 -2
- data/lib/rubocop/cop/naming/method_name.rb +1 -1
- data/lib/rubocop/cop/naming/method_parameter_name.rb +2 -2
- data/lib/rubocop/cop/naming/predicate_name.rb +6 -10
- data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +12 -11
- 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 +3 -3
- data/lib/rubocop/cop/security/eval.rb +2 -2
- data/lib/rubocop/cop/security/json_load.rb +6 -8
- data/lib/rubocop/cop/security/marshal_load.rb +2 -4
- data/lib/rubocop/cop/security/open.rb +2 -2
- data/lib/rubocop/cop/security/yaml_load.rb +6 -6
- data/lib/rubocop/cop/style/access_modifier_declarations.rb +16 -9
- data/lib/rubocop/cop/style/accessor_grouping.rb +149 -0
- data/lib/rubocop/cop/style/alias.rb +41 -36
- data/lib/rubocop/cop/style/and_or.rb +9 -11
- data/lib/rubocop/cop/style/array_coercion.rb +63 -0
- data/lib/rubocop/cop/style/array_join.rb +6 -8
- data/lib/rubocop/cop/style/ascii_comments.rb +4 -4
- data/lib/rubocop/cop/style/attr.rb +11 -9
- data/lib/rubocop/cop/style/auto_resource_cleanup.rb +5 -7
- data/lib/rubocop/cop/style/bare_percent_literals.rb +11 -13
- data/lib/rubocop/cop/style/begin_block.rb +2 -2
- data/lib/rubocop/cop/style/bisected_attr_accessor.rb +141 -0
- data/lib/rubocop/cop/style/block_comments.rb +14 -18
- data/lib/rubocop/cop/style/block_delimiters.rb +25 -27
- data/lib/rubocop/cop/style/case_equality.rb +22 -3
- data/lib/rubocop/cop/style/case_like_if.rb +220 -0
- data/lib/rubocop/cop/style/class_and_module_children.rb +15 -12
- data/lib/rubocop/cop/style/class_check.rb +7 -9
- data/lib/rubocop/cop/style/class_methods.rb +7 -11
- data/lib/rubocop/cop/style/class_vars.rb +24 -7
- data/lib/rubocop/cop/style/collection_methods.rb +11 -17
- data/lib/rubocop/cop/style/colon_method_call.rb +8 -9
- data/lib/rubocop/cop/style/colon_method_definition.rb +6 -6
- data/lib/rubocop/cop/style/command_literal.rb +24 -25
- data/lib/rubocop/cop/style/comment_annotation.rb +15 -15
- data/lib/rubocop/cop/style/commented_keyword.rb +6 -3
- data/lib/rubocop/cop/style/conditional_assignment.rb +12 -3
- data/lib/rubocop/cop/style/constant_visibility.rb +3 -2
- data/lib/rubocop/cop/style/copyright.rb +15 -15
- data/lib/rubocop/cop/style/date_time.rb +2 -2
- data/lib/rubocop/cop/style/def_with_parentheses.rb +8 -10
- data/lib/rubocop/cop/style/dir.rb +9 -12
- data/lib/rubocop/cop/style/disable_cops_within_source_code_directive.rb +8 -10
- data/lib/rubocop/cop/style/documentation.rb +8 -10
- data/lib/rubocop/cop/style/documentation_method.rb +1 -1
- data/lib/rubocop/cop/style/double_cop_disable_directive.rb +12 -15
- data/lib/rubocop/cop/style/double_negation.rb +2 -2
- data/lib/rubocop/cop/style/each_for_simple_loop.rb +5 -8
- data/lib/rubocop/cop/style/each_with_object.rb +16 -19
- data/lib/rubocop/cop/style/empty_case_condition.rb +27 -26
- data/lib/rubocop/cop/style/empty_else.rb +17 -19
- data/lib/rubocop/cop/style/empty_literal.rb +20 -21
- data/lib/rubocop/cop/style/empty_method.rb +10 -13
- data/lib/rubocop/cop/style/encoding.rb +6 -10
- data/lib/rubocop/cop/style/end_block.rb +4 -6
- data/lib/rubocop/cop/style/eval_with_location.rb +9 -7
- data/lib/rubocop/cop/style/even_odd.rb +7 -11
- data/lib/rubocop/cop/style/expand_path_arguments.rb +23 -22
- data/lib/rubocop/cop/style/explicit_block_argument.rb +102 -0
- data/lib/rubocop/cop/style/exponential_notation.rb +9 -11
- data/lib/rubocop/cop/style/float_division.rb +8 -11
- data/lib/rubocop/cop/style/for.rb +11 -15
- data/lib/rubocop/cop/style/format_string.rb +21 -19
- data/lib/rubocop/cop/style/format_string_token.rb +10 -12
- data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +20 -42
- data/lib/rubocop/cop/style/global_std_stream.rb +65 -0
- data/lib/rubocop/cop/style/global_vars.rb +2 -2
- data/lib/rubocop/cop/style/guard_clause.rb +5 -6
- data/lib/rubocop/cop/style/hash_as_last_array_item.rb +69 -0
- data/lib/rubocop/cop/style/hash_each_methods.rb +5 -8
- data/lib/rubocop/cop/style/hash_like_case.rb +76 -0
- data/lib/rubocop/cop/style/hash_syntax.rb +4 -3
- data/lib/rubocop/cop/style/hash_transform_keys.rb +3 -2
- data/lib/rubocop/cop/style/hash_transform_values.rb +2 -1
- data/lib/rubocop/cop/style/identical_conditional_branches.rb +2 -2
- data/lib/rubocop/cop/style/if_inside_else.rb +2 -2
- data/lib/rubocop/cop/style/if_unless_modifier.rb +18 -40
- data/lib/rubocop/cop/style/if_unless_modifier_of_if_unless.rb +11 -3
- data/lib/rubocop/cop/style/if_with_semicolon.rb +3 -6
- data/lib/rubocop/cop/style/implicit_runtime_error.rb +1 -1
- data/lib/rubocop/cop/style/infinite_loop.rb +24 -24
- data/lib/rubocop/cop/style/inline_comment.rb +3 -3
- data/lib/rubocop/cop/style/inverse_methods.rb +23 -33
- data/lib/rubocop/cop/style/ip_addresses.rb +1 -1
- data/lib/rubocop/cop/style/lambda.rb +7 -12
- data/lib/rubocop/cop/style/lambda_call.rb +14 -13
- data/lib/rubocop/cop/style/line_end_concatenation.rb +19 -16
- data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +16 -11
- data/lib/rubocop/cop/style/method_call_with_args_parentheses/require_parentheses.rb +4 -8
- data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +2 -1
- data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +8 -7
- data/lib/rubocop/cop/style/method_called_on_do_end_block.rb +2 -2
- data/lib/rubocop/cop/style/method_def_parentheses.rb +11 -16
- data/lib/rubocop/cop/style/min_max.rb +8 -12
- data/lib/rubocop/cop/style/missing_else.rb +11 -21
- data/lib/rubocop/cop/style/missing_respond_to_missing.rb +10 -3
- data/lib/rubocop/cop/style/mixin_grouping.rb +24 -27
- data/lib/rubocop/cop/style/mixin_usage.rb +1 -1
- data/lib/rubocop/cop/style/module_function.rb +10 -13
- data/lib/rubocop/cop/style/multiline_block_chain.rb +10 -1
- data/lib/rubocop/cop/style/multiline_if_modifier.rb +3 -10
- data/lib/rubocop/cop/style/multiline_if_then.rb +5 -11
- data/lib/rubocop/cop/style/multiline_memoization.rb +14 -12
- data/lib/rubocop/cop/style/multiline_method_signature.rb +2 -2
- data/lib/rubocop/cop/style/multiline_ternary_operator.rb +17 -8
- data/lib/rubocop/cop/style/multiline_when_then.rb +7 -9
- data/lib/rubocop/cop/style/multiple_comparison.rb +1 -1
- data/lib/rubocop/cop/style/mutable_constant.rb +27 -24
- data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +5 -6
- 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/numeric_literal_prefix.rb +2 -2
- data/lib/rubocop/cop/style/numeric_predicate.rb +7 -4
- data/lib/rubocop/cop/style/optional_boolean_parameter.rb +42 -0
- data/lib/rubocop/cop/style/parallel_assignment.rb +5 -5
- data/lib/rubocop/cop/style/percent_literal_delimiters.rb +2 -2
- data/lib/rubocop/cop/style/proc.rb +1 -1
- data/lib/rubocop/cop/style/random_with_offset.rb +5 -10
- data/lib/rubocop/cop/style/redundant_assignment.rb +117 -0
- data/lib/rubocop/cop/style/redundant_condition.rb +15 -3
- data/lib/rubocop/cop/style/redundant_exception.rb +18 -10
- data/lib/rubocop/cop/style/redundant_fetch_block.rb +122 -0
- data/lib/rubocop/cop/style/redundant_file_extension_in_require.rb +50 -0
- data/lib/rubocop/cop/style/redundant_freeze.rb +1 -1
- data/lib/rubocop/cop/style/redundant_parentheses.rb +8 -2
- data/lib/rubocop/cop/style/redundant_percent_q.rb +2 -2
- data/lib/rubocop/cop/style/redundant_regexp_character_class.rb +4 -3
- data/lib/rubocop/cop/style/redundant_regexp_escape.rb +23 -32
- data/lib/rubocop/cop/style/redundant_self.rb +6 -9
- data/lib/rubocop/cop/style/redundant_sort.rb +26 -12
- data/lib/rubocop/cop/style/rescue_standard_error.rb +1 -1
- data/lib/rubocop/cop/style/safe_navigation.rb +4 -4
- 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 +3 -1
- data/lib/rubocop/cop/style/single_argument_dig.rb +54 -0
- data/lib/rubocop/cop/style/single_line_methods.rb +1 -1
- data/lib/rubocop/cop/style/stabby_lambda_parentheses.rb +3 -2
- data/lib/rubocop/cop/style/stderr_puts.rb +1 -1
- data/lib/rubocop/cop/style/string_concatenation.rb +92 -0
- data/lib/rubocop/cop/style/struct_inheritance.rb +23 -2
- data/lib/rubocop/cop/style/symbol_array.rb +6 -6
- data/lib/rubocop/cop/style/symbol_proc.rb +2 -2
- data/lib/rubocop/cop/style/ternary_parentheses.rb +1 -1
- data/lib/rubocop/cop/style/trailing_method_end_statement.rb +9 -32
- data/lib/rubocop/cop/style/trivial_accessors.rb +8 -7
- 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 +12 -8
- data/lib/rubocop/cop/team.rb +98 -82
- data/lib/rubocop/cop/tokens_util.rb +84 -0
- data/lib/rubocop/cop/util.rb +5 -15
- data/lib/rubocop/cop/utils/format_string.rb +2 -3
- data/lib/rubocop/cop/variable_force/branch.rb +1 -0
- data/lib/rubocop/cop/variable_force/variable.rb +7 -5
- data/lib/rubocop/cop/variable_force.rb +0 -2
- data/lib/rubocop/cops_documentation_generator.rb +282 -0
- data/lib/rubocop/error.rb +1 -0
- data/lib/rubocop/file_finder.rb +12 -12
- data/lib/rubocop/formatter/disabled_config_formatter.rb +3 -3
- data/lib/rubocop/formatter/formatter_set.rb +2 -1
- data/lib/rubocop/formatter/junit_formatter.rb +1 -1
- data/lib/rubocop/name_similarity.rb +7 -3
- data/lib/rubocop/options.rb +18 -11
- data/lib/rubocop/path_util.rb +19 -19
- data/lib/rubocop/platform.rb +1 -1
- data/lib/rubocop/rake_task.rb +7 -9
- data/lib/rubocop/result_cache.rb +12 -8
- data/lib/rubocop/rspec/cop_helper.rb +4 -4
- data/lib/rubocop/rspec/expect_offense.rb +63 -22
- data/lib/rubocop/rspec/shared_contexts.rb +16 -17
- data/lib/rubocop/runner.rb +35 -34
- data/lib/rubocop/target_finder.rb +14 -11
- data/lib/rubocop/target_ruby.rb +2 -2
- data/lib/rubocop/version.rb +2 -2
- data/lib/rubocop.rb +33 -5
- metadata +49 -11
- data/lib/rubocop/cop/lint/useless_comparison.rb +0 -28
- data/lib/rubocop/cop/mixin/classish_length.rb +0 -37
- data/lib/rubocop/cop/mixin/parser_diagnostic.rb +0 -37
- data/lib/rubocop/cop/mixin/too_many_lines.rb +0 -35
- data/lib/rubocop/cop/style/method_missing_super.rb +0 -34
|
@@ -6,8 +6,31 @@ module RuboCop
|
|
|
6
6
|
# This cop checks if the length a class exceeds some maximum value.
|
|
7
7
|
# Comment lines can optionally be ignored.
|
|
8
8
|
# The maximum allowed length is configurable.
|
|
9
|
-
|
|
10
|
-
|
|
9
|
+
#
|
|
10
|
+
# You can set literals you want to fold with `CountAsOne`.
|
|
11
|
+
# Available are: 'array', 'hash', and 'heredoc'. Each literal
|
|
12
|
+
# will be counted as one line regardless of its actual size.
|
|
13
|
+
#
|
|
14
|
+
# @example CountAsOne: ['array', 'heredoc']
|
|
15
|
+
#
|
|
16
|
+
# class Foo
|
|
17
|
+
# ARRAY = [ # +1
|
|
18
|
+
# 1,
|
|
19
|
+
# 2
|
|
20
|
+
# ]
|
|
21
|
+
#
|
|
22
|
+
# HASH = { # +3
|
|
23
|
+
# key: 'value'
|
|
24
|
+
# }
|
|
25
|
+
#
|
|
26
|
+
# MSG = <<~HEREDOC # +1
|
|
27
|
+
# Heredoc
|
|
28
|
+
# content.
|
|
29
|
+
# HEREDOC
|
|
30
|
+
# end # 5 points
|
|
31
|
+
#
|
|
32
|
+
class ClassLength < Base
|
|
33
|
+
include CodeLength
|
|
11
34
|
|
|
12
35
|
def on_class(node)
|
|
13
36
|
check_code_length(node)
|
|
@@ -22,7 +45,7 @@ module RuboCop
|
|
|
22
45
|
private
|
|
23
46
|
|
|
24
47
|
def_node_matcher :class_definition?, <<~PATTERN
|
|
25
|
-
(casgn nil? _ (block (send (const nil? :Class) :new) ...))
|
|
48
|
+
(casgn nil? _ (block (send (const {nil? cbase} :Class) :new) ...))
|
|
26
49
|
PATTERN
|
|
27
50
|
|
|
28
51
|
def message(length, max_length)
|
|
@@ -13,19 +13,52 @@ module RuboCop
|
|
|
13
13
|
# operator (or keyword and) can be converted to a nested if statement,
|
|
14
14
|
# and ||/or is shorthand for a sequence of ifs, so they also add one.
|
|
15
15
|
# Loops can be said to have an exit condition, so they add one.
|
|
16
|
-
|
|
16
|
+
# Blocks that are calls to builtin iteration methods
|
|
17
|
+
# (e.g. `ary.map{...}) also add one, others are ignored.
|
|
18
|
+
#
|
|
19
|
+
# def each_child_node(*types) # count begins: 1
|
|
20
|
+
# unless block_given? # unless: +1
|
|
21
|
+
# return to_enum(__method__, *types)
|
|
22
|
+
#
|
|
23
|
+
# children.each do |child| # each{}: +1
|
|
24
|
+
# next unless child.is_a?(Node) # unless: +1
|
|
25
|
+
#
|
|
26
|
+
# yield child if types.empty? || # if: +1, ||: +1
|
|
27
|
+
# types.include?(child.type)
|
|
28
|
+
# end
|
|
29
|
+
#
|
|
30
|
+
# self
|
|
31
|
+
# end # total: 6
|
|
32
|
+
class CyclomaticComplexity < Base
|
|
17
33
|
include MethodComplexity
|
|
34
|
+
include Utils::IteratingBlock
|
|
18
35
|
|
|
19
36
|
MSG = 'Cyclomatic complexity for %<method>s is too high. ' \
|
|
20
37
|
'[%<complexity>d/%<max>d]'
|
|
21
|
-
COUNTED_NODES = %i[if while until for
|
|
22
|
-
rescue when and or].freeze
|
|
38
|
+
COUNTED_NODES = %i[if while until for csend block block_pass
|
|
39
|
+
rescue when and or or_asgn and_asgn].freeze
|
|
23
40
|
|
|
24
41
|
private
|
|
25
42
|
|
|
26
|
-
def complexity_score_for(
|
|
43
|
+
def complexity_score_for(node)
|
|
44
|
+
return 0 if iterating_block?(node) == false
|
|
45
|
+
return 0 if node.csend_type? && discount_for_repeated_csend?(node)
|
|
46
|
+
|
|
27
47
|
1
|
|
28
48
|
end
|
|
49
|
+
|
|
50
|
+
def block_method(node)
|
|
51
|
+
case node.type
|
|
52
|
+
when :block
|
|
53
|
+
node.method_name
|
|
54
|
+
when :block_pass
|
|
55
|
+
node.parent.method_name
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
def count_block?(block)
|
|
60
|
+
KNOWN_ITERATING_METHODS.include? block.method_name
|
|
61
|
+
end
|
|
29
62
|
end
|
|
30
63
|
end
|
|
31
64
|
end
|
|
@@ -6,8 +6,31 @@ module RuboCop
|
|
|
6
6
|
# This cop checks if the length of a method exceeds some maximum value.
|
|
7
7
|
# Comment lines can optionally be ignored.
|
|
8
8
|
# The maximum allowed length is configurable.
|
|
9
|
-
|
|
10
|
-
|
|
9
|
+
#
|
|
10
|
+
# You can set literals you want to fold with `CountAsOne`.
|
|
11
|
+
# Available are: 'array', 'hash', and 'heredoc'. Each literal
|
|
12
|
+
# will be counted as one line regardless of its actual size.
|
|
13
|
+
#
|
|
14
|
+
# @example CountAsOne: ['array', 'heredoc']
|
|
15
|
+
#
|
|
16
|
+
# def m
|
|
17
|
+
# array = [ # +1
|
|
18
|
+
# 1,
|
|
19
|
+
# 2
|
|
20
|
+
# ]
|
|
21
|
+
#
|
|
22
|
+
# hash = { # +3
|
|
23
|
+
# key: 'value'
|
|
24
|
+
# }
|
|
25
|
+
#
|
|
26
|
+
# <<~HEREDOC # +1
|
|
27
|
+
# Heredoc
|
|
28
|
+
# content.
|
|
29
|
+
# HEREDOC
|
|
30
|
+
# end # 5 points
|
|
31
|
+
#
|
|
32
|
+
class MethodLength < Base
|
|
33
|
+
include CodeLength
|
|
11
34
|
|
|
12
35
|
LABEL = 'Method'
|
|
13
36
|
|
|
@@ -6,8 +6,31 @@ module RuboCop
|
|
|
6
6
|
# This cop checks if the length a module exceeds some maximum value.
|
|
7
7
|
# Comment lines can optionally be ignored.
|
|
8
8
|
# The maximum allowed length is configurable.
|
|
9
|
-
|
|
10
|
-
|
|
9
|
+
#
|
|
10
|
+
# You can set literals you want to fold with `CountAsOne`.
|
|
11
|
+
# Available are: 'array', 'hash', and 'heredoc'. Each literal
|
|
12
|
+
# will be counted as one line regardless of its actual size.
|
|
13
|
+
#
|
|
14
|
+
# @example CountAsOne: ['array', 'heredoc']
|
|
15
|
+
#
|
|
16
|
+
# module M
|
|
17
|
+
# ARRAY = [ # +1
|
|
18
|
+
# 1,
|
|
19
|
+
# 2
|
|
20
|
+
# ]
|
|
21
|
+
#
|
|
22
|
+
# HASH = { # +3
|
|
23
|
+
# key: 'value'
|
|
24
|
+
# }
|
|
25
|
+
#
|
|
26
|
+
# MSG = <<~HEREDOC # +1
|
|
27
|
+
# Heredoc
|
|
28
|
+
# content.
|
|
29
|
+
# HEREDOC
|
|
30
|
+
# end # 5 points
|
|
31
|
+
#
|
|
32
|
+
class ModuleLength < Base
|
|
33
|
+
include CodeLength
|
|
11
34
|
|
|
12
35
|
def on_module(node)
|
|
13
36
|
check_code_length(node)
|
|
@@ -22,7 +45,7 @@ module RuboCop
|
|
|
22
45
|
private
|
|
23
46
|
|
|
24
47
|
def_node_matcher :module_definition?, <<~PATTERN
|
|
25
|
-
(casgn nil? _ (block (send (const nil? :Module) :new) ...))
|
|
48
|
+
(casgn nil? _ (block (send (const {nil? cbase} :Module) :new) ...))
|
|
26
49
|
PATTERN
|
|
27
50
|
|
|
28
51
|
def message(length, max_length)
|
|
@@ -6,7 +6,7 @@ module RuboCop
|
|
|
6
6
|
# This cop checks for methods with too many parameters.
|
|
7
7
|
# The maximum number of parameters is configurable.
|
|
8
8
|
# Keyword arguments can optionally be excluded from the total count.
|
|
9
|
-
class ParameterLists <
|
|
9
|
+
class ParameterLists < Base
|
|
10
10
|
include ConfigurableMax
|
|
11
11
|
|
|
12
12
|
MSG = 'Avoid parameter lists longer than %<max>d parameters. ' \
|
|
@@ -18,7 +18,7 @@ module RuboCop
|
|
|
18
18
|
|
|
19
19
|
return if argument_to_lambda_or_proc?(node)
|
|
20
20
|
|
|
21
|
-
add_offense(node) do
|
|
21
|
+
add_offense(node, message: format(MSG, max: max_params, count: args_count(node))) do
|
|
22
22
|
self.max = count
|
|
23
23
|
end
|
|
24
24
|
end
|
|
@@ -29,10 +29,6 @@ module RuboCop
|
|
|
29
29
|
^lambda_or_proc?
|
|
30
30
|
PATTERN
|
|
31
31
|
|
|
32
|
-
def message(node)
|
|
33
|
-
format(MSG, max: max_params, count: args_count(node))
|
|
34
|
-
end
|
|
35
|
-
|
|
36
32
|
def args_count(node)
|
|
37
33
|
if count_keyword_args?
|
|
38
34
|
node.children.size
|
|
@@ -26,13 +26,11 @@ module RuboCop
|
|
|
26
26
|
# do_something until a && b # 2
|
|
27
27
|
# end # ===
|
|
28
28
|
# end # 7 complexity points
|
|
29
|
-
class PerceivedComplexity <
|
|
30
|
-
include MethodComplexity
|
|
31
|
-
|
|
29
|
+
class PerceivedComplexity < CyclomaticComplexity
|
|
32
30
|
MSG = 'Perceived complexity for %<method>s is too high. ' \
|
|
33
31
|
'[%<complexity>d/%<max>d]'
|
|
34
|
-
|
|
35
|
-
|
|
32
|
+
|
|
33
|
+
COUNTED_NODES = (CyclomaticComplexity::COUNTED_NODES - [:when] + [:case]).freeze
|
|
36
34
|
|
|
37
35
|
private
|
|
38
36
|
|
|
@@ -42,17 +40,18 @@ module RuboCop
|
|
|
42
40
|
# If cond is nil, that means each when has an expression that
|
|
43
41
|
# evaluates to true or false. It's just an alternative to
|
|
44
42
|
# if/elsif/elsif... so the when nodes count.
|
|
43
|
+
nb_branches = node.when_branches.length + (node.else_branch ? 1 : 0)
|
|
45
44
|
if node.condition.nil?
|
|
46
|
-
|
|
45
|
+
nb_branches
|
|
47
46
|
else
|
|
48
47
|
# Otherwise, the case node gets 0.8 complexity points and each
|
|
49
48
|
# when gets 0.2.
|
|
50
|
-
(0.8 + 0.2 *
|
|
49
|
+
(0.8 + 0.2 * nb_branches).round
|
|
51
50
|
end
|
|
52
51
|
when :if
|
|
53
52
|
node.else? && !node.elsif? ? 2 : 1
|
|
54
53
|
else
|
|
55
|
-
|
|
54
|
+
super
|
|
56
55
|
end
|
|
57
56
|
end
|
|
58
57
|
end
|
|
@@ -11,10 +11,13 @@ module RuboCop
|
|
|
11
11
|
# We separate the *calculator* from the *cop* so that the calculation,
|
|
12
12
|
# the formula itself, is easier to test.
|
|
13
13
|
class AbcSizeCalculator
|
|
14
|
+
include IteratingBlock
|
|
15
|
+
include RepeatedCsendDiscount
|
|
16
|
+
|
|
14
17
|
# > Branch -- an explicit forward program branch out of scope -- a
|
|
15
18
|
# > function call, class method call ..
|
|
16
19
|
# > http://c2.com/cgi/wiki?AbcMetric
|
|
17
|
-
BRANCH_NODES = %i[send csend].freeze
|
|
20
|
+
BRANCH_NODES = %i[send csend yield].freeze
|
|
18
21
|
|
|
19
22
|
# > Condition -- a logical/Boolean test, == != <= >= < > else case
|
|
20
23
|
# > default try catch ? and unary conditionals.
|
|
@@ -25,18 +28,22 @@ module RuboCop
|
|
|
25
28
|
new(node).calculate
|
|
26
29
|
end
|
|
27
30
|
|
|
31
|
+
# TODO: move to rubocop-ast
|
|
32
|
+
ARGUMENT_TYPES = %i[arg optarg restarg kwarg kwoptarg kwrestarg blockarg].freeze
|
|
33
|
+
|
|
28
34
|
def initialize(node)
|
|
29
35
|
@assignment = 0
|
|
30
36
|
@branch = 0
|
|
31
37
|
@condition = 0
|
|
32
38
|
@node = node
|
|
39
|
+
reset_repeated_csend
|
|
33
40
|
end
|
|
34
41
|
|
|
35
42
|
def calculate
|
|
36
43
|
@node.each_node do |child|
|
|
37
|
-
if
|
|
38
|
-
|
|
39
|
-
|
|
44
|
+
@assignment += 1 if assignment?(child)
|
|
45
|
+
|
|
46
|
+
if branch?(child)
|
|
40
47
|
evaluate_branch_nodes(child)
|
|
41
48
|
elsif condition?(child)
|
|
42
49
|
evaluate_condition_node(child)
|
|
@@ -54,6 +61,7 @@ module RuboCop
|
|
|
54
61
|
@condition += 1
|
|
55
62
|
else
|
|
56
63
|
@branch += 1
|
|
64
|
+
@condition += 1 if node.csend_type? && !discount_for_repeated_csend?(node)
|
|
57
65
|
end
|
|
58
66
|
end
|
|
59
67
|
|
|
@@ -70,11 +78,46 @@ module RuboCop
|
|
|
70
78
|
|
|
71
79
|
private
|
|
72
80
|
|
|
81
|
+
def assignment?(node)
|
|
82
|
+
node.for_type? ||
|
|
83
|
+
node.op_asgn_type? ||
|
|
84
|
+
(node.respond_to?(:setter_method?) && node.setter_method?) ||
|
|
85
|
+
(simple_assignment?(node) && capturing_variable?(node.children.first))
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
def simple_assignment?(node)
|
|
89
|
+
return false if node.masgn_type?
|
|
90
|
+
|
|
91
|
+
if node.equals_asgn?
|
|
92
|
+
reset_on_lvasgn(node) if node.lvasgn_type?
|
|
93
|
+
return true
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
argument?(node)
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
def capturing_variable?(name)
|
|
100
|
+
name && !/^_/.match?(name)
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
# Returns true for nodes which otherwise would be counted
|
|
104
|
+
# as one too many assignment
|
|
105
|
+
def assignment_doubled_in_ast?(node)
|
|
106
|
+
node.masgn_type? || node.or_asgn_type? || node.and_asgn_type?
|
|
107
|
+
end
|
|
108
|
+
|
|
73
109
|
def branch?(node)
|
|
74
110
|
BRANCH_NODES.include?(node.type)
|
|
75
111
|
end
|
|
76
112
|
|
|
113
|
+
# TODO: move to rubocop-ast
|
|
114
|
+
def argument?(node)
|
|
115
|
+
ARGUMENT_TYPES.include?(node.type)
|
|
116
|
+
end
|
|
117
|
+
|
|
77
118
|
def condition?(node)
|
|
119
|
+
return false if iterating_block?(node) == false
|
|
120
|
+
|
|
78
121
|
CONDITION_NODES.include?(node.type)
|
|
79
122
|
end
|
|
80
123
|
end
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module RuboCop
|
|
4
|
+
module Cop
|
|
5
|
+
module Metrics
|
|
6
|
+
module Utils
|
|
7
|
+
# Helps to calculate code length for the provided node.
|
|
8
|
+
class CodeLengthCalculator
|
|
9
|
+
extend NodePattern::Macros
|
|
10
|
+
include Util
|
|
11
|
+
|
|
12
|
+
FOLDABLE_TYPES = %i[array hash heredoc].freeze
|
|
13
|
+
CLASSLIKE_TYPES = %i[class module].freeze
|
|
14
|
+
|
|
15
|
+
def initialize(node, processed_source, count_comments: false, foldable_types: [])
|
|
16
|
+
@node = node
|
|
17
|
+
@processed_source = processed_source
|
|
18
|
+
@count_comments = count_comments
|
|
19
|
+
@foldable_checks = build_foldable_checks(foldable_types)
|
|
20
|
+
@foldable_types = normalize_foldable_types(foldable_types)
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def calculate
|
|
24
|
+
length = code_length(@node)
|
|
25
|
+
return length if @foldable_types.empty?
|
|
26
|
+
|
|
27
|
+
each_top_level_descendant(@node, @foldable_types) do |descendant|
|
|
28
|
+
if foldable_node?(descendant)
|
|
29
|
+
descendant_length = code_length(descendant)
|
|
30
|
+
length = length - descendant_length + 1
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
length
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
private
|
|
38
|
+
|
|
39
|
+
def build_foldable_checks(types)
|
|
40
|
+
types.map do |type|
|
|
41
|
+
case type
|
|
42
|
+
when :array
|
|
43
|
+
->(node) { node.array_type? }
|
|
44
|
+
when :hash
|
|
45
|
+
->(node) { node.hash_type? }
|
|
46
|
+
when :heredoc
|
|
47
|
+
->(node) { heredoc_node?(node) }
|
|
48
|
+
else
|
|
49
|
+
raise ArgumentError, "Unknown foldable type: #{type.inspect}. "\
|
|
50
|
+
"Valid foldable types are: #{FOLDABLE_TYPES.join(', ')}."
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
def normalize_foldable_types(types)
|
|
56
|
+
types.concat(%i[str dstr]) if types.delete(:heredoc)
|
|
57
|
+
types
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
def code_length(node)
|
|
61
|
+
if classlike_node?(node)
|
|
62
|
+
classlike_code_length(node)
|
|
63
|
+
elsif heredoc_node?(node)
|
|
64
|
+
heredoc_length(node)
|
|
65
|
+
else
|
|
66
|
+
body = extract_body(node)
|
|
67
|
+
return 0 unless body
|
|
68
|
+
|
|
69
|
+
body.source.each_line.count { |line| !irrelevant_line?(line) }
|
|
70
|
+
end
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
def heredoc_node?(node)
|
|
74
|
+
node.respond_to?(:heredoc?) && node.heredoc?
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
def classlike_code_length(node)
|
|
78
|
+
return 0 if namespace_module?(node)
|
|
79
|
+
|
|
80
|
+
body_line_numbers = line_range(node).to_a[1...-1]
|
|
81
|
+
|
|
82
|
+
target_line_numbers = body_line_numbers -
|
|
83
|
+
line_numbers_of_inner_nodes(node, :module, :class)
|
|
84
|
+
|
|
85
|
+
target_line_numbers.reduce(0) do |length, line_number|
|
|
86
|
+
source_line = @processed_source[line_number]
|
|
87
|
+
next length if irrelevant_line?(source_line)
|
|
88
|
+
|
|
89
|
+
length + 1
|
|
90
|
+
end
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
def namespace_module?(node)
|
|
94
|
+
classlike_node?(node.body)
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
def line_numbers_of_inner_nodes(node, *types)
|
|
98
|
+
line_numbers = Set.new
|
|
99
|
+
|
|
100
|
+
node.each_descendant(*types) do |inner_node|
|
|
101
|
+
line_range = line_range(inner_node)
|
|
102
|
+
line_numbers.merge(line_range)
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
line_numbers.to_a
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
def heredoc_length(node)
|
|
109
|
+
lines = node.loc.heredoc_body.source.lines
|
|
110
|
+
lines.count { |line| !irrelevant_line?(line) } + 2
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
def each_top_level_descendant(node, types, &block)
|
|
114
|
+
node.each_child_node do |child|
|
|
115
|
+
next if classlike_node?(child)
|
|
116
|
+
|
|
117
|
+
if types.include?(child.type)
|
|
118
|
+
yield child
|
|
119
|
+
else
|
|
120
|
+
each_top_level_descendant(child, types, &block)
|
|
121
|
+
end
|
|
122
|
+
end
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
def classlike_node?(node)
|
|
126
|
+
CLASSLIKE_TYPES.include?(node.type)
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
def foldable_node?(node)
|
|
130
|
+
@foldable_checks.any? { |check| check.call(node) }
|
|
131
|
+
end
|
|
132
|
+
|
|
133
|
+
def extract_body(node)
|
|
134
|
+
case node.type
|
|
135
|
+
when :class, :module, :block, :def, :defs
|
|
136
|
+
node.body
|
|
137
|
+
when :casgn
|
|
138
|
+
_scope, _name, value = *node
|
|
139
|
+
extract_body(value)
|
|
140
|
+
else
|
|
141
|
+
node
|
|
142
|
+
end
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
# Returns true for lines that shall not be included in the count.
|
|
146
|
+
def irrelevant_line?(source_line)
|
|
147
|
+
source_line.blank? || !count_comments? && comment_line?(source_line)
|
|
148
|
+
end
|
|
149
|
+
|
|
150
|
+
def count_comments?
|
|
151
|
+
@count_comments
|
|
152
|
+
end
|
|
153
|
+
end
|
|
154
|
+
end
|
|
155
|
+
end
|
|
156
|
+
end
|
|
157
|
+
end
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module RuboCop
|
|
4
|
+
module Cop
|
|
5
|
+
module Metrics
|
|
6
|
+
module Utils
|
|
7
|
+
# Used to identify iterating blocks like `.map{}` and `.map(&:...)`
|
|
8
|
+
module IteratingBlock
|
|
9
|
+
enumerable = %i[
|
|
10
|
+
all? any? chain chunk chunk_while collect collect_concat count cycle
|
|
11
|
+
detect drop drop_while each each_cons each_entry each_slice
|
|
12
|
+
each_with_index each_with_object entries filter filter_map find
|
|
13
|
+
find_all find_index flat_map grep grep_v group_by inject lazy map
|
|
14
|
+
max max_by min min_by minmax minmax_by none? one? partition reduce
|
|
15
|
+
reject reverse_each select slice_after slice_before slice_when sort
|
|
16
|
+
sort_by sum take take_while tally to_h uniq zip
|
|
17
|
+
]
|
|
18
|
+
|
|
19
|
+
enumerator = %i[with_index with_object]
|
|
20
|
+
|
|
21
|
+
array = %i[
|
|
22
|
+
bsearch bsearch_index collect! combination d_permutation delete_if
|
|
23
|
+
each_index keep_if map! permutation product reject! repeat
|
|
24
|
+
repeated_combination select! sort sort! sort_by sort_by
|
|
25
|
+
]
|
|
26
|
+
|
|
27
|
+
hash = %i[
|
|
28
|
+
each_key each_pair each_value fetch fetch_values has_key? merge
|
|
29
|
+
merge! transform_keys transform_keys! transform_values
|
|
30
|
+
transform_values!
|
|
31
|
+
]
|
|
32
|
+
|
|
33
|
+
KNOWN_ITERATING_METHODS = (Set.new(enumerable) + enumerator + array + hash).freeze
|
|
34
|
+
|
|
35
|
+
# Returns the name of the method called with a block
|
|
36
|
+
# if node is a block node, or a block-pass node.
|
|
37
|
+
def block_method_name(node)
|
|
38
|
+
case node.type
|
|
39
|
+
when :block
|
|
40
|
+
node.method_name
|
|
41
|
+
when :block_pass
|
|
42
|
+
node.parent.method_name
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
# Returns true iff name is a known iterating type (e.g. :each, :transform_values)
|
|
47
|
+
def iterating_method?(name)
|
|
48
|
+
KNOWN_ITERATING_METHODS.include? name
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
# Returns nil if node is neither a block node or a block-pass node.
|
|
52
|
+
# Otherwise returns true/false if method call is a known iterating call
|
|
53
|
+
def iterating_block?(node)
|
|
54
|
+
name = block_method_name(node)
|
|
55
|
+
name && iterating_method?(name)
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
end
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module RuboCop
|
|
4
|
+
module Cop
|
|
5
|
+
module Metrics
|
|
6
|
+
module Utils
|
|
7
|
+
# @api private
|
|
8
|
+
#
|
|
9
|
+
# Helps to calculate code length for the provided node.
|
|
10
|
+
module RepeatedCsendDiscount
|
|
11
|
+
def reset_repeated_csend
|
|
12
|
+
@repeated_csend = {}
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def discount_for_repeated_csend?(csend_node)
|
|
16
|
+
receiver = csend_node.receiver
|
|
17
|
+
|
|
18
|
+
return false unless receiver.lvar_type?
|
|
19
|
+
|
|
20
|
+
var_name = receiver.children.first
|
|
21
|
+
seen = @repeated_csend.fetch(var_name) do
|
|
22
|
+
@repeated_csend[var_name] = csend_node
|
|
23
|
+
return false
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
!seen.equal?(csend_node)
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def reset_on_lvasgn(node)
|
|
30
|
+
var_name = node.children.first
|
|
31
|
+
@repeated_csend.delete(var_name)
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
end
|
|
@@ -5,8 +5,9 @@ module RuboCop
|
|
|
5
5
|
module Migration
|
|
6
6
|
# Check that cop names in rubocop:disable comments are given with
|
|
7
7
|
# department name.
|
|
8
|
-
class DepartmentName <
|
|
8
|
+
class DepartmentName < Base
|
|
9
9
|
include RangeHelp
|
|
10
|
+
extend AutoCorrector
|
|
10
11
|
|
|
11
12
|
MSG = 'Department name is missing.'
|
|
12
13
|
|
|
@@ -18,8 +19,8 @@ module RuboCop
|
|
|
18
19
|
# `DepartmentName/CopName` or` all`.
|
|
19
20
|
DISABLING_COPS_CONTENT_TOKEN = %r{[A-z]+/[A-z]+|all}.freeze
|
|
20
21
|
|
|
21
|
-
def
|
|
22
|
-
processed_source.
|
|
22
|
+
def on_new_investigation
|
|
23
|
+
processed_source.comments.each do |comment|
|
|
23
24
|
next if comment.text !~ DISABLE_COMMENT_FORMAT
|
|
24
25
|
|
|
25
26
|
offset = Regexp.last_match(1).length
|
|
@@ -38,18 +39,6 @@ module RuboCop
|
|
|
38
39
|
end
|
|
39
40
|
end
|
|
40
41
|
|
|
41
|
-
def autocorrect(range)
|
|
42
|
-
shall_warn = false
|
|
43
|
-
cop_name = range.source
|
|
44
|
-
qualified_cop_name = Cop.registry.qualified_cop_name(cop_name,
|
|
45
|
-
nil, shall_warn)
|
|
46
|
-
unless qualified_cop_name.include?('/')
|
|
47
|
-
qualified_cop_name = qualified_legacy_cop_name(cop_name)
|
|
48
|
-
end
|
|
49
|
-
|
|
50
|
-
->(corrector) { corrector.replace(range, qualified_cop_name) }
|
|
51
|
-
end
|
|
52
|
-
|
|
53
42
|
private
|
|
54
43
|
|
|
55
44
|
def disable_comment_offset
|
|
@@ -60,7 +49,16 @@ module RuboCop
|
|
|
60
49
|
start = comment.location.expression.begin_pos + offset
|
|
61
50
|
range = range_between(start, start + name.length)
|
|
62
51
|
|
|
63
|
-
add_offense(range
|
|
52
|
+
add_offense(range) do |corrector|
|
|
53
|
+
cop_name = range.source
|
|
54
|
+
qualified_cop_name = Registry.global.qualified_cop_name(cop_name, nil, warn: false)
|
|
55
|
+
|
|
56
|
+
unless qualified_cop_name.include?('/')
|
|
57
|
+
qualified_cop_name = qualified_legacy_cop_name(cop_name)
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
corrector.replace(range, qualified_cop_name)
|
|
61
|
+
end
|
|
64
62
|
end
|
|
65
63
|
|
|
66
64
|
def valid_content_token?(content_token)
|
|
@@ -64,8 +64,9 @@ module RuboCop
|
|
|
64
64
|
inner.begin_pos >= outer.begin_pos && inner.end_pos <= outer.end_pos
|
|
65
65
|
end
|
|
66
66
|
|
|
67
|
+
# @deprecated Use processed_source.comment_at_line(line)
|
|
67
68
|
def end_of_line_comment(line)
|
|
68
|
-
processed_source.
|
|
69
|
+
processed_source.line_with_comment?(line)
|
|
69
70
|
end
|
|
70
71
|
end
|
|
71
72
|
end
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module RuboCop
|
|
4
|
+
module Cop
|
|
5
|
+
# This module encapsulates the ability to allow certain methods when
|
|
6
|
+
# parsing.
|
|
7
|
+
module AllowedMethods
|
|
8
|
+
private
|
|
9
|
+
|
|
10
|
+
def allowed_method?(name)
|
|
11
|
+
allowed_methods.include?(name.to_s)
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def allowed_methods
|
|
15
|
+
cop_config.fetch('AllowedMethods', [])
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|