rubocop 0.76.0 → 0.83.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/LICENSE.txt +1 -1
- data/README.md +6 -6
- data/config/default.yml +466 -306
- data/lib/rubocop/ast/builder.rb +45 -42
- data/lib/rubocop/ast/node/array_node.rb +13 -0
- data/lib/rubocop/ast/node/block_node.rb +7 -1
- data/lib/rubocop/ast/node/case_match_node.rb +56 -0
- data/lib/rubocop/ast/node/def_node.rb +11 -0
- data/lib/rubocop/ast/node/forward_args_node.rb +18 -0
- data/lib/rubocop/ast/node/mixin/method_dispatch_node.rb +8 -0
- data/lib/rubocop/ast/node/regexp_node.rb +2 -4
- data/lib/rubocop/ast/node/send_node.rb +4 -0
- data/lib/rubocop/ast/node.rb +13 -20
- data/lib/rubocop/ast/traversal.rb +29 -10
- data/lib/rubocop/cli/command/auto_genenerate_config.rb +105 -0
- data/lib/rubocop/cli/command/base.rb +33 -0
- data/lib/rubocop/cli/command/execute_runner.rb +76 -0
- data/lib/rubocop/cli/command/init_dotfile.rb +45 -0
- data/lib/rubocop/cli/command/show_cops.rb +80 -0
- data/lib/rubocop/cli/command/version.rb +17 -0
- data/lib/rubocop/cli/command.rb +21 -0
- data/lib/rubocop/cli/environment.rb +21 -0
- data/lib/rubocop/cli.rb +20 -233
- data/lib/rubocop/comment_config.rb +6 -1
- data/lib/rubocop/config.rb +41 -11
- data/lib/rubocop/config_loader.rb +54 -44
- data/lib/rubocop/config_loader_resolver.rb +28 -1
- data/lib/rubocop/config_obsoletion.rb +67 -11
- data/lib/rubocop/config_validator.rb +74 -99
- data/lib/rubocop/cop/autocorrect_logic.rb +7 -4
- data/lib/rubocop/cop/badge.rb +5 -5
- data/lib/rubocop/cop/bundler/gem_comment.rb +4 -4
- data/lib/rubocop/cop/bundler/insecure_protocol_source.rb +3 -3
- data/lib/rubocop/cop/cop.rb +21 -0
- data/lib/rubocop/cop/corrector.rb +48 -24
- data/lib/rubocop/cop/correctors/alignment_corrector.rb +2 -2
- data/lib/rubocop/cop/correctors/condition_corrector.rb +1 -2
- data/lib/rubocop/cop/correctors/empty_line_corrector.rb +1 -1
- data/lib/rubocop/cop/correctors/lambda_literal_to_method_corrector.rb +3 -3
- data/lib/rubocop/cop/correctors/line_break_corrector.rb +2 -2
- data/lib/rubocop/cop/correctors/percent_literal_corrector.rb +1 -1
- data/lib/rubocop/cop/correctors/space_corrector.rb +1 -2
- data/lib/rubocop/cop/correctors/string_literal_corrector.rb +2 -2
- data/lib/rubocop/cop/gemspec/ordered_dependencies.rb +1 -1
- data/lib/rubocop/cop/generator/configuration_injector.rb +1 -1
- data/lib/rubocop/cop/generator.rb +6 -6
- data/lib/rubocop/cop/internal_affairs/method_name_equal.rb +59 -0
- data/lib/rubocop/cop/internal_affairs/offense_location_keyword.rb +1 -1
- data/lib/rubocop/cop/internal_affairs.rb +1 -0
- data/lib/rubocop/cop/layout/{align_arguments.rb → argument_alignment.rb} +1 -1
- data/lib/rubocop/cop/layout/array_alignment.rb +82 -0
- data/lib/rubocop/cop/layout/{indent_assignment.rb → assignment_indentation.rb} +1 -1
- data/lib/rubocop/cop/layout/block_end_newline.rb +5 -3
- data/lib/rubocop/cop/layout/condition_position.rb +12 -2
- data/lib/rubocop/cop/layout/dot_position.rb +1 -1
- data/lib/rubocop/cop/layout/else_alignment.rb +8 -0
- data/lib/rubocop/cop/layout/empty_line_between_defs.rb +2 -1
- data/lib/rubocop/cop/layout/empty_lines_around_attribute_accessor.rb +68 -0
- data/lib/rubocop/cop/layout/end_of_line.rb +2 -2
- data/lib/rubocop/cop/layout/extra_spacing.rb +1 -1
- data/lib/rubocop/cop/layout/{indent_first_argument.rb → first_argument_indentation.rb} +5 -5
- data/lib/rubocop/cop/layout/{indent_first_array_element.rb → first_array_element_indentation.rb} +20 -14
- data/lib/rubocop/cop/layout/{indent_first_hash_element.rb → first_hash_element_indentation.rb} +4 -4
- data/lib/rubocop/cop/layout/{indent_first_parameter.rb → first_parameter_indentation.rb} +3 -3
- data/lib/rubocop/cop/layout/{align_hash.rb → hash_alignment.rb} +10 -6
- data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +2 -2
- data/lib/rubocop/cop/layout/{indent_heredoc.rb → heredoc_indentation.rb} +7 -7
- data/lib/rubocop/cop/layout/{tab.rb → indentation_style.rb} +48 -6
- data/lib/rubocop/cop/layout/leading_comment_space.rb +34 -3
- data/lib/rubocop/cop/layout/{leading_blank_lines.rb → leading_empty_lines.rb} +1 -1
- data/lib/rubocop/cop/{metrics → layout}/line_length.rb +72 -110
- data/lib/rubocop/cop/layout/multiline_block_layout.rb +15 -6
- data/lib/rubocop/cop/layout/multiline_hash_brace_layout.rb +0 -4
- data/lib/rubocop/cop/layout/multiline_method_argument_line_breaks.rb +1 -1
- data/lib/rubocop/cop/layout/multiline_method_call_indentation.rb +1 -1
- data/lib/rubocop/cop/layout/multiline_operation_indentation.rb +13 -4
- data/lib/rubocop/cop/layout/{align_parameters.rb → parameter_alignment.rb} +1 -1
- data/lib/rubocop/cop/layout/space_around_block_parameters.rb +3 -3
- data/lib/rubocop/cop/layout/space_around_keyword.rb +12 -0
- data/lib/rubocop/cop/layout/space_around_method_call_operator.rb +133 -0
- data/lib/rubocop/cop/layout/space_around_operators.rb +69 -9
- data/lib/rubocop/cop/layout/space_before_block_braces.rb +17 -0
- data/lib/rubocop/cop/layout/space_before_first_arg.rb +8 -0
- data/lib/rubocop/cop/layout/space_in_lambda_literal.rb +1 -1
- data/lib/rubocop/cop/layout/space_inside_block_braces.rb +2 -2
- data/lib/rubocop/cop/layout/space_inside_hash_literal_braces.rb +2 -9
- data/lib/rubocop/cop/layout/space_inside_range_literal.rb +2 -2
- data/lib/rubocop/cop/layout/{trailing_blank_lines.rb → trailing_empty_lines.rb} +1 -1
- data/lib/rubocop/cop/layout/trailing_whitespace.rb +2 -2
- data/lib/rubocop/cop/lint/ambiguous_operator.rb +38 -0
- data/lib/rubocop/cop/lint/ambiguous_regexp_literal.rb +14 -0
- data/lib/rubocop/cop/lint/boolean_symbol.rb +12 -0
- data/lib/rubocop/cop/lint/debugger.rb +2 -2
- data/lib/rubocop/cop/lint/disjunctive_assignment_in_constructor.rb +1 -1
- data/lib/rubocop/cop/lint/{duplicated_key.rb → duplicate_hash_key.rb} +1 -1
- data/lib/rubocop/cop/lint/duplicate_methods.rb +1 -5
- data/lib/rubocop/cop/lint/each_with_object_argument.rb +1 -1
- data/lib/rubocop/cop/lint/empty_when.rb +29 -6
- data/lib/rubocop/cop/lint/ensure_return.rb +18 -1
- data/lib/rubocop/cop/lint/erb_new_arguments.rb +1 -1
- data/lib/rubocop/cop/lint/implicit_string_concatenation.rb +1 -1
- 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 +1 -1
- data/lib/rubocop/cop/lint/literal_as_condition.rb +10 -13
- data/lib/rubocop/cop/lint/literal_in_interpolation.rb +1 -1
- data/lib/rubocop/cop/lint/loop.rb +6 -4
- data/lib/rubocop/cop/lint/{multiple_compare.rb → multiple_comparison.rb} +2 -2
- data/lib/rubocop/cop/lint/nested_method_definition.rb +2 -2
- data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +89 -0
- data/lib/rubocop/cop/lint/number_conversion.rb +1 -1
- data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +21 -9
- data/lib/rubocop/cop/lint/percent_string_array.rb +2 -2
- data/lib/rubocop/cop/lint/raise_exception.rb +75 -0
- data/lib/rubocop/cop/lint/redundant_cop_disable_directive.rb +4 -9
- data/lib/rubocop/cop/lint/redundant_cop_enable_directive.rb +13 -8
- data/lib/rubocop/cop/lint/redundant_splat_expansion.rb +1 -1
- data/lib/rubocop/cop/lint/{string_conversion_in_interpolation.rb → redundant_string_coercion.rb} +2 -2
- data/lib/rubocop/cop/lint/redundant_with_index.rb +2 -2
- data/lib/rubocop/cop/lint/redundant_with_object.rb +2 -2
- data/lib/rubocop/cop/lint/safe_navigation_chain.rb +1 -1
- data/lib/rubocop/cop/lint/struct_new_override.rb +58 -0
- data/lib/rubocop/cop/lint/{handle_exceptions.rb → suppressed_exception.rb} +13 -29
- data/lib/rubocop/cop/lint/unified_integer.rb +0 -2
- data/lib/rubocop/cop/lint/unused_method_argument.rb +32 -6
- data/lib/rubocop/cop/lint/uri_regexp.rb +4 -4
- data/lib/rubocop/cop/lint/useless_access_modifier.rb +69 -23
- data/lib/rubocop/cop/lint/useless_assignment.rb +3 -2
- data/lib/rubocop/cop/lint/useless_else_without_rescue.rb +5 -0
- data/lib/rubocop/cop/lint/useless_setter_call.rb +5 -1
- data/lib/rubocop/cop/metrics/method_length.rb +1 -1
- data/lib/rubocop/cop/migration/department_name.rb +47 -6
- data/lib/rubocop/cop/mixin/alignment.rb +1 -1
- data/lib/rubocop/cop/mixin/configurable_enforced_style.rb +4 -0
- data/lib/rubocop/cop/mixin/end_keyword_alignment.rb +6 -1
- data/lib/rubocop/cop/mixin/frozen_string_literal.rb +14 -5
- data/lib/rubocop/cop/mixin/{hash_alignment.rb → hash_alignment_styles.rb} +1 -1
- data/lib/rubocop/cop/mixin/hash_transform_method.rb +178 -0
- data/lib/rubocop/cop/mixin/line_length_help.rb +89 -0
- data/lib/rubocop/cop/mixin/method_complexity.rb +5 -0
- data/lib/rubocop/cop/mixin/nil_methods.rb +4 -4
- data/lib/rubocop/cop/mixin/parser_diagnostic.rb +1 -1
- data/lib/rubocop/cop/mixin/rational_literal.rb +18 -0
- data/lib/rubocop/cop/mixin/statement_modifier.rb +9 -24
- data/lib/rubocop/cop/mixin/target_ruby_version.rb +5 -1
- data/lib/rubocop/cop/mixin/trailing_comma.rb +9 -13
- data/lib/rubocop/cop/naming/{uncommunicative_block_param_name.rb → block_parameter_name.rb} +3 -3
- data/lib/rubocop/cop/naming/class_and_module_camel_case.rb +1 -1
- data/lib/rubocop/cop/naming/constant_name.rb +2 -1
- data/lib/rubocop/cop/naming/heredoc_delimiter_naming.rb +6 -6
- data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +1 -1
- data/lib/rubocop/cop/naming/method_name.rb +26 -0
- data/lib/rubocop/cop/naming/{uncommunicative_method_param_name.rb → method_parameter_name.rb} +4 -4
- data/lib/rubocop/cop/naming/predicate_name.rb +6 -6
- data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +1 -1
- data/lib/rubocop/cop/offense.rb +11 -0
- data/lib/rubocop/cop/registry.rb +15 -3
- data/lib/rubocop/cop/style/access_modifier_declarations.rb +26 -6
- data/lib/rubocop/cop/style/alias.rb +5 -5
- data/lib/rubocop/cop/style/and_or.rb +5 -6
- data/lib/rubocop/cop/style/array_join.rb +2 -2
- data/lib/rubocop/cop/style/attr.rb +8 -0
- data/lib/rubocop/cop/style/block_delimiters.rb +60 -1
- data/lib/rubocop/cop/style/case_equality.rb +24 -1
- data/lib/rubocop/cop/style/character_literal.rb +2 -2
- data/lib/rubocop/cop/style/collection_methods.rb +2 -0
- data/lib/rubocop/cop/style/conditional_assignment.rb +10 -10
- data/lib/rubocop/cop/style/copyright.rb +1 -1
- data/lib/rubocop/cop/style/dir.rb +1 -1
- data/lib/rubocop/cop/style/disable_cops_within_source_code_directive.rb +49 -0
- data/lib/rubocop/cop/style/documentation.rb +43 -5
- data/lib/rubocop/cop/style/double_cop_disable_directive.rb +1 -1
- data/lib/rubocop/cop/style/each_for_simple_loop.rb +1 -1
- data/lib/rubocop/cop/style/each_with_object.rb +3 -3
- data/lib/rubocop/cop/style/empty_method.rb +1 -5
- data/lib/rubocop/cop/style/end_block.rb +6 -0
- data/lib/rubocop/cop/style/eval_with_location.rb +1 -1
- data/lib/rubocop/cop/style/even_odd.rb +2 -2
- data/lib/rubocop/cop/style/expand_path_arguments.rb +3 -3
- data/lib/rubocop/cop/style/exponential_notation.rb +119 -0
- data/lib/rubocop/cop/style/format_string.rb +2 -2
- data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +89 -11
- data/lib/rubocop/cop/style/guard_clause.rb +28 -4
- data/lib/rubocop/cop/style/hash_each_methods.rb +89 -0
- data/lib/rubocop/cop/style/hash_syntax.rb +3 -5
- data/lib/rubocop/cop/style/hash_transform_keys.rb +83 -0
- data/lib/rubocop/cop/style/hash_transform_values.rb +80 -0
- data/lib/rubocop/cop/style/if_unless_modifier.rb +61 -6
- data/lib/rubocop/cop/style/if_with_semicolon.rb +16 -0
- data/lib/rubocop/cop/style/infinite_loop.rb +1 -1
- data/lib/rubocop/cop/style/inverse_methods.rb +9 -5
- data/lib/rubocop/cop/style/ip_addresses.rb +4 -4
- data/lib/rubocop/cop/style/lambda.rb +3 -2
- data/lib/rubocop/cop/style/lambda_call.rb +1 -21
- data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +169 -0
- data/lib/rubocop/cop/style/method_call_with_args_parentheses/require_parentheses.rb +54 -0
- data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +7 -205
- data/lib/rubocop/cop/style/mixin_grouping.rb +2 -2
- data/lib/rubocop/cop/style/module_function.rb +58 -12
- data/lib/rubocop/cop/style/multiline_if_modifier.rb +1 -1
- data/lib/rubocop/cop/style/multiline_memoization.rb +1 -1
- data/lib/rubocop/cop/style/multiline_method_signature.rb +1 -1
- data/lib/rubocop/cop/style/multiline_when_then.rb +21 -2
- data/lib/rubocop/cop/style/mutable_constant.rb +2 -4
- data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +9 -9
- data/lib/rubocop/cop/style/next.rb +7 -7
- data/lib/rubocop/cop/style/nil_comparison.rb +1 -1
- data/lib/rubocop/cop/style/non_nil_check.rb +4 -4
- data/lib/rubocop/cop/style/not.rb +1 -1
- data/lib/rubocop/cop/style/numeric_literal_prefix.rb +1 -1
- data/lib/rubocop/cop/style/numeric_literals.rb +8 -4
- data/lib/rubocop/cop/style/numeric_predicate.rb +5 -4
- data/lib/rubocop/cop/style/one_line_conditional.rb +4 -3
- data/lib/rubocop/cop/style/option_hash.rb +3 -3
- data/lib/rubocop/cop/style/optional_arguments.rb +1 -1
- data/lib/rubocop/cop/style/or_assignment.rb +4 -3
- data/lib/rubocop/cop/style/percent_literal_delimiters.rb +7 -7
- data/lib/rubocop/cop/style/percent_q_literals.rb +1 -1
- data/lib/rubocop/cop/style/perl_backrefs.rb +2 -2
- data/lib/rubocop/cop/style/proc.rb +1 -1
- data/lib/rubocop/cop/style/raise_args.rb +1 -1
- data/lib/rubocop/cop/style/random_with_offset.rb +3 -3
- data/lib/rubocop/cop/style/redundant_condition.rb +18 -6
- data/lib/rubocop/cop/style/redundant_conditional.rb +1 -1
- data/lib/rubocop/cop/style/redundant_exception.rb +3 -3
- data/lib/rubocop/cop/style/redundant_interpolation.rb +2 -2
- data/lib/rubocop/cop/style/redundant_parentheses.rb +3 -3
- data/lib/rubocop/cop/style/redundant_percent_q.rb +2 -2
- data/lib/rubocop/cop/style/redundant_return.rb +7 -15
- data/lib/rubocop/cop/style/redundant_self.rb +1 -1
- data/lib/rubocop/cop/style/redundant_sort.rb +3 -3
- data/lib/rubocop/cop/style/rescue_modifier.rb +1 -1
- data/lib/rubocop/cop/style/return_nil.rb +1 -1
- data/lib/rubocop/cop/style/safe_navigation.rb +1 -1
- data/lib/rubocop/cop/style/self_assignment.rb +1 -1
- data/lib/rubocop/cop/style/slicing_with_range.rb +39 -0
- data/lib/rubocop/cop/style/special_global_vars.rb +1 -1
- data/lib/rubocop/cop/style/stabby_lambda_parentheses.rb +1 -4
- data/lib/rubocop/cop/style/string_hash_keys.rb +1 -1
- data/lib/rubocop/cop/style/symbol_array.rb +3 -3
- data/lib/rubocop/cop/style/symbol_literal.rb +2 -2
- data/lib/rubocop/cop/style/ternary_parentheses.rb +2 -3
- data/lib/rubocop/cop/style/trailing_comma_in_arguments.rb +35 -22
- data/lib/rubocop/cop/style/trailing_comma_in_array_literal.rb +41 -0
- data/lib/rubocop/cop/style/trailing_comma_in_block_args.rb +88 -0
- data/lib/rubocop/cop/style/trailing_comma_in_hash_literal.rb +44 -0
- data/lib/rubocop/cop/style/trailing_underscore_variable.rb +7 -1
- data/lib/rubocop/cop/style/trivial_accessors.rb +6 -6
- data/lib/rubocop/cop/style/unpack_first.rb +0 -4
- data/lib/rubocop/cop/style/variable_interpolation.rb +1 -1
- data/lib/rubocop/cop/style/while_until_modifier.rb +2 -2
- data/lib/rubocop/cop/style/word_array.rb +1 -1
- data/lib/rubocop/cop/style/yoda_condition.rb +16 -1
- data/lib/rubocop/cop/style/zero_length_predicate.rb +1 -1
- data/lib/rubocop/cop/team.rb +5 -0
- data/lib/rubocop/cop/util.rb +24 -0
- data/lib/rubocop/cop/variable_force/assignment.rb +1 -0
- data/lib/rubocop/cop/variable_force/scope.rb +1 -0
- data/lib/rubocop/cop/variable_force/variable.rb +1 -0
- data/lib/rubocop/cop/variable_force.rb +4 -1
- data/lib/rubocop/formatter/base_formatter.rb +2 -2
- data/lib/rubocop/formatter/clang_style_formatter.rb +0 -2
- data/lib/rubocop/formatter/formatter_set.rb +1 -1
- data/lib/rubocop/formatter/json_formatter.rb +6 -5
- data/lib/rubocop/formatter/junit_formatter.rb +74 -0
- data/lib/rubocop/formatter/pacman_formatter.rb +1 -1
- data/lib/rubocop/formatter/tap_formatter.rb +0 -2
- data/lib/rubocop/name_similarity.rb +12 -9
- data/lib/rubocop/node_pattern.rb +97 -11
- data/lib/rubocop/options.rb +26 -13
- data/lib/rubocop/processed_source.rb +1 -4
- data/lib/rubocop/rake_task.rb +1 -0
- data/lib/rubocop/result_cache.rb +23 -7
- data/lib/rubocop/rspec/cop_helper.rb +1 -1
- data/lib/rubocop/rspec/expect_offense.rb +1 -1
- data/lib/rubocop/rspec/shared_contexts.rb +5 -4
- data/lib/rubocop/runner.rb +25 -4
- data/lib/rubocop/target_finder.rb +6 -4
- data/lib/rubocop/target_ruby.rb +151 -0
- data/lib/rubocop/version.rb +1 -1
- data/lib/rubocop.rb +53 -27
- metadata +73 -48
- data/lib/rubocop/cop/layout/align_array.rb +0 -39
- data/lib/rubocop/cop/lint/end_in_method.rb +0 -40
- data/lib/rubocop/cop/mixin/safe_mode.rb +0 -24
- data/lib/rubocop/cop/style/braces_around_hash_parameters.rb +0 -209
- data/lib/rubocop/formatter/disabled_lines_formatter.rb +0 -57
- data/lib/rubocop/string_util.rb +0 -14
@@ -3,24 +3,55 @@
|
|
3
3
|
module RuboCop
|
4
4
|
module Cop
|
5
5
|
module Layout
|
6
|
-
# Checks that operators have space around them, except for **
|
7
|
-
#
|
6
|
+
# Checks that operators have space around them, except for ** which
|
7
|
+
# should or shouldn't have surrounding space depending on configuration.
|
8
|
+
#
|
9
|
+
# This cop has `AllowForAlignment` option. When `true`, allows most
|
10
|
+
# uses of extra spacing if the intent is to align with an operator on
|
11
|
+
# the previous or next line, not counting empty lines or comment lines.
|
8
12
|
#
|
9
13
|
# @example
|
10
14
|
# # bad
|
11
15
|
# total = 3*4
|
12
16
|
# "apple"+"juice"
|
13
17
|
# my_number = 38/4
|
14
|
-
# a ** b
|
15
18
|
#
|
16
19
|
# # good
|
17
20
|
# total = 3 * 4
|
18
21
|
# "apple" + "juice"
|
19
22
|
# my_number = 38 / 4
|
23
|
+
#
|
24
|
+
# @example AllowForAlignment: true (default)
|
25
|
+
# # good
|
26
|
+
# {
|
27
|
+
# 1 => 2,
|
28
|
+
# 11 => 3
|
29
|
+
# }
|
30
|
+
#
|
31
|
+
# @example AllowForAlignment: false
|
32
|
+
# # bad
|
33
|
+
# {
|
34
|
+
# 1 => 2,
|
35
|
+
# 11 => 3
|
36
|
+
# }
|
37
|
+
#
|
38
|
+
# @example EnforcedStyleForExponentOperator: no_space (default)
|
39
|
+
# # bad
|
40
|
+
# a ** b
|
41
|
+
#
|
42
|
+
# # good
|
20
43
|
# a**b
|
44
|
+
#
|
45
|
+
# @example EnforcedStyleForExponentOperator: space
|
46
|
+
# # bad
|
47
|
+
# a**b
|
48
|
+
#
|
49
|
+
# # good
|
50
|
+
# a ** b
|
21
51
|
class SpaceAroundOperators < Cop
|
22
52
|
include PrecedingFollowingAlignment
|
23
53
|
include RangeHelp
|
54
|
+
include RationalLiteral
|
24
55
|
|
25
56
|
IRREGULAR_METHODS = %i[[] ! []=].freeze
|
26
57
|
EXCESSIVE_SPACE = ' '
|
@@ -53,6 +84,8 @@ module RuboCop
|
|
53
84
|
end
|
54
85
|
|
55
86
|
def on_send(node)
|
87
|
+
return if rational_literal?(node)
|
88
|
+
|
56
89
|
if node.setter_method?
|
57
90
|
on_special_asgn(node)
|
58
91
|
elsif regular_operator?(node)
|
@@ -101,12 +134,12 @@ module RuboCop
|
|
101
134
|
|
102
135
|
def autocorrect(range)
|
103
136
|
lambda do |corrector|
|
104
|
-
if range.source =~ /\*\*/
|
137
|
+
if range.source =~ /\*\*/ && !space_around_exponent_operator?
|
105
138
|
corrector.replace(range, '**')
|
106
139
|
elsif range.source.end_with?("\n")
|
107
140
|
corrector.replace(range, " #{range.source.strip}\n")
|
108
141
|
else
|
109
|
-
corrector
|
142
|
+
enclose_operator_with_space(corrector, range)
|
110
143
|
end
|
111
144
|
end
|
112
145
|
end
|
@@ -137,10 +170,25 @@ module RuboCop
|
|
137
170
|
yield msg if msg
|
138
171
|
end
|
139
172
|
|
173
|
+
def enclose_operator_with_space(corrector, range)
|
174
|
+
operator = range.source
|
175
|
+
|
176
|
+
# If `ForceEqualSignAlignment` is true, `Layout/ExtraSpacing` cop
|
177
|
+
# inserts spaces before operator. If `Layout/SpaceAroundOperators` cop
|
178
|
+
# inserts a space, it collides and raises the infinite loop error.
|
179
|
+
if force_equal_sign_alignment?
|
180
|
+
corrector.insert_after(range, ' ') unless operator.end_with?(' ')
|
181
|
+
else
|
182
|
+
corrector.replace(range, " #{operator.strip} ")
|
183
|
+
end
|
184
|
+
end
|
185
|
+
|
140
186
|
def offense_message(type, operator, with_space, right_operand)
|
141
|
-
if
|
142
|
-
|
143
|
-
|
187
|
+
if should_not_have_surrounding_space?(operator)
|
188
|
+
return if with_space.is?(operator.source)
|
189
|
+
|
190
|
+
"Space around operator `#{operator.source}` detected."
|
191
|
+
elsif !/^\s.*\s$/.match?(with_space.source)
|
144
192
|
"Surrounding space missing for operator `#{operator.source}`."
|
145
193
|
elsif excess_leading_space?(type, operator, with_space) ||
|
146
194
|
excess_trailing_space?(right_operand, with_space)
|
@@ -169,13 +217,25 @@ module RuboCop
|
|
169
217
|
end
|
170
218
|
|
171
219
|
def align_hash_cop_config
|
172
|
-
config.for_cop('Layout/
|
220
|
+
config.for_cop('Layout/HashAlignment')
|
173
221
|
end
|
174
222
|
|
175
223
|
def hash_table_style?
|
176
224
|
align_hash_cop_config &&
|
177
225
|
align_hash_cop_config['EnforcedHashRocketStyle'] == 'table'
|
178
226
|
end
|
227
|
+
|
228
|
+
def space_around_exponent_operator?
|
229
|
+
cop_config['EnforcedStyleForExponentOperator'] == 'space'
|
230
|
+
end
|
231
|
+
|
232
|
+
def force_equal_sign_alignment?
|
233
|
+
config.for_cop('Layout/ExtraSpacing')['ForceEqualSignAlignment']
|
234
|
+
end
|
235
|
+
|
236
|
+
def should_not_have_surrounding_space?(operator)
|
237
|
+
operator.is?('**') ? !space_around_exponent_operator? : false
|
238
|
+
end
|
179
239
|
end
|
180
240
|
end
|
181
241
|
end
|
@@ -41,6 +41,14 @@ module RuboCop
|
|
41
41
|
def on_block(node)
|
42
42
|
return if node.keywords?
|
43
43
|
|
44
|
+
# Do not register an offense for multi-line braces when specifying
|
45
|
+
# `EnforcedStyle: no_space`. It will conflict with auto-correction
|
46
|
+
# by `EnforcedStyle: line_count_based` of `Style/BlockDelimiters` cop.
|
47
|
+
# That means preventing auto-correction to incorrect auto-corrected
|
48
|
+
# code.
|
49
|
+
# See: https://github.com/rubocop-hq/rubocop/issues/7534
|
50
|
+
return if conflict_with_block_delimiters?(node)
|
51
|
+
|
44
52
|
left_brace = node.loc.begin
|
45
53
|
space_plus_brace = range_with_surrounding_space(range: left_brace)
|
46
54
|
used_style =
|
@@ -110,6 +118,15 @@ module RuboCop
|
|
110
118
|
end
|
111
119
|
end
|
112
120
|
|
121
|
+
def conflict_with_block_delimiters?(node)
|
122
|
+
block_delimiters_style == 'line_count_based' &&
|
123
|
+
style == :no_space && node.multiline?
|
124
|
+
end
|
125
|
+
|
126
|
+
def block_delimiters_style
|
127
|
+
config.for_cop('Style/BlockDelimiters')['EnforcedStyle']
|
128
|
+
end
|
129
|
+
|
113
130
|
def empty_braces?(loc)
|
114
131
|
loc.begin.end_pos == loc.end.begin_pos
|
115
132
|
end
|
@@ -54,6 +54,7 @@ module RuboCop
|
|
54
54
|
|
55
55
|
def expect_params_after_method_name?(node)
|
56
56
|
return false if node.parenthesized?
|
57
|
+
return true if no_space_between_method_name_and_first_argument?(node)
|
57
58
|
|
58
59
|
first_arg = node.first_argument
|
59
60
|
|
@@ -61,6 +62,13 @@ module RuboCop
|
|
61
62
|
!(allow_for_alignment? &&
|
62
63
|
aligned_with_something?(first_arg.source_range))
|
63
64
|
end
|
65
|
+
|
66
|
+
def no_space_between_method_name_and_first_argument?(node)
|
67
|
+
end_pos_of_method_name = node.loc.selector.end_pos
|
68
|
+
begin_pos_of_argument = node.first_argument.source_range.begin_pos
|
69
|
+
|
70
|
+
end_pos_of_method_name == begin_pos_of_argument
|
71
|
+
end
|
64
72
|
end
|
65
73
|
end
|
66
74
|
end
|
@@ -46,7 +46,7 @@ module RuboCop
|
|
46
46
|
children = lambda_node.parent.children
|
47
47
|
lambda do |corrector|
|
48
48
|
if style == :require_space
|
49
|
-
corrector.insert_before(children[1]
|
49
|
+
corrector.insert_before(children[1], ' ')
|
50
50
|
else
|
51
51
|
corrector.remove(space_after_arrow(lambda_node))
|
52
52
|
end
|
@@ -117,7 +117,7 @@ module RuboCop
|
|
117
117
|
range = range_between(left_brace.end_pos, right_brace.begin_pos)
|
118
118
|
inner = range.source
|
119
119
|
|
120
|
-
if
|
120
|
+
if /\S/.match?(inner)
|
121
121
|
braces_with_contents_inside(node, inner)
|
122
122
|
elsif style_for_empty_braces == :no_space
|
123
123
|
offense(range.begin_pos, range.end_pos,
|
@@ -142,7 +142,7 @@ module RuboCop
|
|
142
142
|
end
|
143
143
|
|
144
144
|
def check_left_brace(inner, left_brace, args_delimiter)
|
145
|
-
if
|
145
|
+
if /\A\S/.match?(inner)
|
146
146
|
no_space_inside_left_brace(left_brace, args_delimiter)
|
147
147
|
else
|
148
148
|
space_inside_left_brace(left_brace, args_delimiter)
|
@@ -83,17 +83,10 @@ module RuboCop
|
|
83
83
|
|
84
84
|
def autocorrect(range)
|
85
85
|
lambda do |corrector|
|
86
|
-
# It is possible that BracesAroundHashParameters will remove the
|
87
|
-
# braces while this cop inserts spaces. This can lead to unwanted
|
88
|
-
# changes to the inspected code. If we replace the brace with a
|
89
|
-
# brace plus space (rather than just inserting a space), then any
|
90
|
-
# removal of the same brace will give us a clobbering error. This
|
91
|
-
# in turn will make RuboCop fall back on cop-by-cop
|
92
|
-
# auto-correction. Problem solved.
|
93
86
|
case range.source
|
94
87
|
when /\s/ then corrector.remove(range)
|
95
|
-
when '{' then corrector.
|
96
|
-
else corrector.
|
88
|
+
when '{' then corrector.insert_after(range, ' ')
|
89
|
+
else corrector.insert_before(range, ' ')
|
97
90
|
end
|
98
91
|
end
|
99
92
|
end
|
@@ -35,7 +35,7 @@ module RuboCop
|
|
35
35
|
|
36
36
|
lambda do |corrector|
|
37
37
|
corrector.replace(
|
38
|
-
node
|
38
|
+
node,
|
39
39
|
expression
|
40
40
|
.sub(/\s+#{operator_escaped}/, operator)
|
41
41
|
.sub(/#{operator_escaped}\s+/, operator)
|
@@ -53,7 +53,7 @@ module RuboCop
|
|
53
53
|
# account for multiline range literals
|
54
54
|
expression.sub!(/#{escaped_op}\n\s*/, op)
|
55
55
|
|
56
|
-
return unless
|
56
|
+
return unless /(\s#{escaped_op})|(#{escaped_op}\s)/.match?(expression)
|
57
57
|
|
58
58
|
add_offense(node)
|
59
59
|
end
|
@@ -14,14 +14,14 @@ module RuboCop
|
|
14
14
|
# # good
|
15
15
|
# x = 0
|
16
16
|
#
|
17
|
-
# @example AllowInHeredoc: false
|
17
|
+
# @example AllowInHeredoc: false
|
18
18
|
# # The line in this example contains spaces after the 0.
|
19
19
|
# # bad
|
20
20
|
# code = <<~RUBY
|
21
21
|
# x = 0
|
22
22
|
# RUBY
|
23
23
|
#
|
24
|
-
# @example AllowInHeredoc: true
|
24
|
+
# @example AllowInHeredoc: true (default)
|
25
25
|
# # The line in this example contains spaces after the 0.
|
26
26
|
# # good
|
27
27
|
# code = <<~RUBY
|
@@ -38,17 +38,55 @@ module RuboCop
|
|
38
38
|
'a whitespace to the right of the `%<operator>s` if it ' \
|
39
39
|
'should be a %<possible>s.'
|
40
40
|
|
41
|
+
def autocorrect(node)
|
42
|
+
lambda do |corrector|
|
43
|
+
add_parentheses(node, corrector)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
41
47
|
private
|
42
48
|
|
43
49
|
def relevant_diagnostic?(diagnostic)
|
44
50
|
diagnostic.reason == :ambiguous_prefix
|
45
51
|
end
|
46
52
|
|
53
|
+
def find_offense_node_by(diagnostic)
|
54
|
+
ast = processed_source.ast
|
55
|
+
ast.each_node(:splat, :block_pass, :kwsplat) do |node|
|
56
|
+
next unless offense_position?(node, diagnostic)
|
57
|
+
|
58
|
+
offense_node = offense_node(node)
|
59
|
+
return offense_node if offense_node
|
60
|
+
end
|
61
|
+
|
62
|
+
ast.each_node(:send).find do |send_node|
|
63
|
+
offense_position?(send_node.first_argument, diagnostic) &&
|
64
|
+
unary_operator?(send_node.first_argument, diagnostic)
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
47
68
|
def alternative_message(diagnostic)
|
48
69
|
operator = diagnostic.location.source
|
49
70
|
hash = AMBIGUITIES[operator]
|
50
71
|
format(MSG_FORMAT, hash)
|
51
72
|
end
|
73
|
+
|
74
|
+
def offense_position?(node, diagnostic)
|
75
|
+
node.source_range.begin_pos == diagnostic.location.begin_pos
|
76
|
+
end
|
77
|
+
|
78
|
+
def offense_node(node)
|
79
|
+
case node.type
|
80
|
+
when :splat, :block_pass
|
81
|
+
node.parent
|
82
|
+
when :kwsplat
|
83
|
+
node.parent.parent
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
def unary_operator?(node, diagnostic)
|
88
|
+
node.source.start_with?(diagnostic.arguments[:prefix])
|
89
|
+
end
|
52
90
|
end
|
53
91
|
end
|
54
92
|
end
|
@@ -28,12 +28,26 @@ module RuboCop
|
|
28
28
|
"if it's surely a regexp literal, or add a whitespace to the " \
|
29
29
|
'right of the `/` if it should be a division.'
|
30
30
|
|
31
|
+
def autocorrect(node)
|
32
|
+
lambda do |corrector|
|
33
|
+
add_parentheses(node, corrector)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
31
37
|
private
|
32
38
|
|
33
39
|
def relevant_diagnostic?(diagnostic)
|
34
40
|
diagnostic.reason == :ambiguous_literal
|
35
41
|
end
|
36
42
|
|
43
|
+
def find_offense_node_by(diagnostic)
|
44
|
+
node = processed_source.ast.each_node(:regexp).find do |regexp_node|
|
45
|
+
regexp_node.source_range.begin_pos == diagnostic.location.begin_pos
|
46
|
+
end
|
47
|
+
|
48
|
+
node.parent
|
49
|
+
end
|
50
|
+
|
37
51
|
def alternative_message(_diagnostic)
|
38
52
|
MSG
|
39
53
|
end
|
@@ -32,6 +32,18 @@ module RuboCop
|
|
32
32
|
|
33
33
|
add_offense(node, message: format(MSG, boolean: node.value))
|
34
34
|
end
|
35
|
+
|
36
|
+
def autocorrect(node)
|
37
|
+
lambda do |corrector|
|
38
|
+
boolean_literal = node.source.delete(':')
|
39
|
+
parent = node.parent
|
40
|
+
if parent&.pair_type? && node.equal?(parent.children[0])
|
41
|
+
corrector.remove(parent.loc.operator)
|
42
|
+
boolean_literal = "#{node.source} =>"
|
43
|
+
end
|
44
|
+
corrector.replace(node, boolean_literal)
|
45
|
+
end
|
46
|
+
end
|
35
47
|
end
|
36
48
|
end
|
37
49
|
end
|
@@ -45,7 +45,7 @@ module RuboCop
|
|
45
45
|
def_node_matcher :debugger_call?, <<~PATTERN
|
46
46
|
{(send {nil? #kernel?} {:debugger :byebug :remote_byebug} ...)
|
47
47
|
(send (send {#kernel? nil?} :binding)
|
48
|
-
{:pry :remote_pry :pry_remote} ...)
|
48
|
+
{:pry :remote_pry :pry_remote :console} ...)
|
49
49
|
(send (const {nil? (cbase)} :Pry) :rescue ...)
|
50
50
|
(send nil? {:save_and_open_page
|
51
51
|
:save_and_open_screenshot
|
@@ -69,7 +69,7 @@ module RuboCop
|
|
69
69
|
end
|
70
70
|
|
71
71
|
def binding_irb?(node)
|
72
|
-
|
72
|
+
binding_irb_call?(node)
|
73
73
|
end
|
74
74
|
end
|
75
75
|
end
|
@@ -95,10 +95,6 @@ module RuboCop
|
|
95
95
|
(send nil? :alias_method (sym $_name) _)
|
96
96
|
PATTERN
|
97
97
|
|
98
|
-
def_node_matcher :attr?, <<~PATTERN
|
99
|
-
(send nil? ${:attr_reader :attr_writer :attr_accessor :attr} $...)
|
100
|
-
PATTERN
|
101
|
-
|
102
98
|
def_node_matcher :sym_name, '(sym $_name)'
|
103
99
|
|
104
100
|
def on_send(node)
|
@@ -108,7 +104,7 @@ module RuboCop
|
|
108
104
|
return if possible_dsl?(node)
|
109
105
|
|
110
106
|
found_instance_method(node, name)
|
111
|
-
elsif (attr =
|
107
|
+
elsif (attr = node.attribute_accessor?)
|
112
108
|
on_attr(node, *attr)
|
113
109
|
end
|
114
110
|
end
|
@@ -22,7 +22,7 @@ module RuboCop
|
|
22
22
|
# num = 0
|
23
23
|
# sum = numbers.each_with_object(num) { |e, a| a += e }
|
24
24
|
class EachWithObjectArgument < Cop
|
25
|
-
MSG = 'The argument to each_with_object
|
25
|
+
MSG = 'The argument to each_with_object cannot be immutable.'
|
26
26
|
|
27
27
|
def_node_matcher :each_with_object?, <<~PATTERN
|
28
28
|
({send csend} _ :each_with_object $_)
|
@@ -8,26 +8,49 @@ module RuboCop
|
|
8
8
|
# @example
|
9
9
|
#
|
10
10
|
# # bad
|
11
|
-
#
|
12
11
|
# case foo
|
13
|
-
# when bar
|
14
|
-
#
|
12
|
+
# when bar
|
13
|
+
# do_something
|
14
|
+
# when baz
|
15
15
|
# end
|
16
16
|
#
|
17
17
|
# @example
|
18
18
|
#
|
19
19
|
# # good
|
20
|
+
# case condition
|
21
|
+
# when foo
|
22
|
+
# do_something
|
23
|
+
# when bar
|
24
|
+
# nil
|
25
|
+
# end
|
20
26
|
#
|
21
|
-
#
|
22
|
-
#
|
23
|
-
#
|
27
|
+
# @example AllowComments: true (default)
|
28
|
+
#
|
29
|
+
# # good
|
30
|
+
# case condition
|
31
|
+
# when foo
|
32
|
+
# do_something
|
33
|
+
# when bar
|
34
|
+
# # noop
|
24
35
|
# end
|
36
|
+
#
|
37
|
+
# @example AllowComments: false
|
38
|
+
#
|
39
|
+
# # bad
|
40
|
+
# case condition
|
41
|
+
# when foo
|
42
|
+
# do_something
|
43
|
+
# when bar
|
44
|
+
# # do nothing
|
45
|
+
# end
|
46
|
+
#
|
25
47
|
class EmptyWhen < Cop
|
26
48
|
MSG = 'Avoid `when` branches without a body.'
|
27
49
|
|
28
50
|
def on_case(node)
|
29
51
|
node.each_when do |when_node|
|
30
52
|
next if when_node.body
|
53
|
+
next if cop_config['AllowComments'] && comment_lines?(node)
|
31
54
|
|
32
55
|
add_offense(when_node, location: when_node.source_range)
|
33
56
|
end
|
@@ -29,6 +29,8 @@ module RuboCop
|
|
29
29
|
# do_something_else
|
30
30
|
# end
|
31
31
|
class EnsureReturn < Cop
|
32
|
+
include RangeHelp
|
33
|
+
|
32
34
|
MSG = 'Do not return from an `ensure` block.'
|
33
35
|
|
34
36
|
def on_ensure(node)
|
@@ -37,7 +39,22 @@ module RuboCop
|
|
37
39
|
return unless ensure_body
|
38
40
|
|
39
41
|
ensure_body.each_node(:return) do |return_node|
|
40
|
-
|
42
|
+
next if return_node.arguments.size >= 2
|
43
|
+
|
44
|
+
add_offense(return_node, location: :keyword)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
def autocorrect(node)
|
49
|
+
lambda do |corrector|
|
50
|
+
if node.arguments?
|
51
|
+
corrector.replace(node, node.source.gsub(/return\s*/, ''))
|
52
|
+
else
|
53
|
+
range = range_by_whole_lines(
|
54
|
+
node.loc.expression, include_final_newline: true
|
55
|
+
)
|
56
|
+
corrector.remove(range)
|
57
|
+
end
|
41
58
|
end
|
42
59
|
end
|
43
60
|
end
|
@@ -84,7 +84,7 @@ module RuboCop
|
|
84
84
|
|
85
85
|
def on_send(node)
|
86
86
|
erb_new_with_non_keyword_arguments(node) do |arguments|
|
87
|
-
return if correct_arguments?(arguments)
|
87
|
+
return if arguments.empty? || correct_arguments?(arguments)
|
88
88
|
|
89
89
|
arguments[1..3].each_with_index do |argument, i|
|
90
90
|
next if !argument || argument.hash_type?
|
@@ -117,7 +117,7 @@ module RuboCop
|
|
117
117
|
end
|
118
118
|
|
119
119
|
def correct_visibility?(node, modifier, ignored_methods)
|
120
|
-
return true if modifier.nil? || modifier.
|
120
|
+
return true if modifier.nil? || modifier.method?(:public)
|
121
121
|
|
122
122
|
ignored_methods.include?(node.method_name)
|
123
123
|
end
|
@@ -10,26 +10,25 @@ module RuboCop
|
|
10
10
|
# @example
|
11
11
|
#
|
12
12
|
# # bad
|
13
|
-
#
|
14
13
|
# if 20
|
15
14
|
# do_something
|
16
15
|
# end
|
17
16
|
#
|
18
|
-
# @example
|
19
|
-
#
|
20
17
|
# # bad
|
21
|
-
#
|
22
18
|
# if some_var && true
|
23
19
|
# do_something
|
24
20
|
# end
|
25
21
|
#
|
26
|
-
# @example
|
27
|
-
#
|
28
22
|
# # good
|
29
|
-
#
|
30
23
|
# if some_var && some_condition
|
31
24
|
# do_something
|
32
25
|
# end
|
26
|
+
#
|
27
|
+
# # good
|
28
|
+
# # When using a boolean value for an infinite loop.
|
29
|
+
# while true
|
30
|
+
# break if condition
|
31
|
+
# end
|
33
32
|
class LiteralAsCondition < Cop
|
34
33
|
MSG = 'Literal `%<literal>s` appeared as a condition.'
|
35
34
|
|
@@ -38,20 +37,18 @@ module RuboCop
|
|
38
37
|
end
|
39
38
|
|
40
39
|
def on_while(node)
|
41
|
-
|
42
|
-
end
|
40
|
+
return if condition(node).true_type?
|
43
41
|
|
44
|
-
def on_while_post(node)
|
45
42
|
check_for_literal(node)
|
46
43
|
end
|
44
|
+
alias on_while_post on_while
|
47
45
|
|
48
46
|
def on_until(node)
|
49
|
-
|
50
|
-
end
|
47
|
+
return if condition(node).false_type?
|
51
48
|
|
52
|
-
def on_until_post(node)
|
53
49
|
check_for_literal(node)
|
54
50
|
end
|
51
|
+
alias on_until_post on_until
|
55
52
|
|
56
53
|
def on_case(case_node)
|
57
54
|
if case_node.condition
|
@@ -37,7 +37,7 @@ module RuboCop
|
|
37
37
|
return if node.dstr_type? # nested, fixed in next iteration
|
38
38
|
|
39
39
|
value = autocorrected_value(node)
|
40
|
-
->(corrector) { corrector.replace(node.parent
|
40
|
+
->(corrector) { corrector.replace(node.parent, value) }
|
41
41
|
end
|
42
42
|
|
43
43
|
private
|