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
@@ -65,7 +65,7 @@ module RuboCop
|
|
65
65
|
def symbols_contain_spaces?(node)
|
66
66
|
node.children.any? do |sym|
|
67
67
|
content, = *sym
|
68
|
-
|
68
|
+
/ /.match?(content)
|
69
69
|
end
|
70
70
|
end
|
71
71
|
|
@@ -104,12 +104,12 @@ module RuboCop
|
|
104
104
|
)
|
105
105
|
|
106
106
|
# method name
|
107
|
-
|
107
|
+
/\A[a-zA-Z_]\w*[!?]?\z/.match?(string) ||
|
108
108
|
# instance / class variable
|
109
|
-
|
109
|
+
/\A@@?[a-zA-Z_]\w*\z/.match?(string) ||
|
110
110
|
# global variable
|
111
|
-
|
112
|
-
|
111
|
+
/\A\$[1-9]\d*\z/.match?(string) ||
|
112
|
+
/\A\$[a-zA-Z_]\w*\z/.match?(string) ||
|
113
113
|
special_gvars.include?(string) ||
|
114
114
|
redefinable_operators.include?(string)
|
115
115
|
end
|
@@ -19,7 +19,7 @@ module RuboCop
|
|
19
19
|
'instead of a block.'
|
20
20
|
SUPER_TYPES = %i[super zsuper].freeze
|
21
21
|
|
22
|
-
def_node_matcher :proc_node?, '(send (const nil? :Proc) :new)'
|
22
|
+
def_node_matcher :proc_node?, '(send (const {nil? cbase} :Proc) :new)'
|
23
23
|
def_node_matcher :symbol_proc?, <<~PATTERN
|
24
24
|
(block
|
25
25
|
${(send ...) (super ...) zsuper}
|
@@ -174,7 +174,7 @@ module RuboCop
|
|
174
174
|
end
|
175
175
|
|
176
176
|
def unparenthesized_method_call?(child)
|
177
|
-
|
177
|
+
/^[a-z]/i.match?(method_name(child)) && !child.parenthesized?
|
178
178
|
end
|
179
179
|
|
180
180
|
def below_ternary_precedence?(child)
|
@@ -199,9 +199,7 @@ module RuboCop
|
|
199
199
|
# Ruby allows no space between the question mark and parentheses.
|
200
200
|
# If we remove the parentheses, we need to add a space or we'll
|
201
201
|
# generate invalid code.
|
202
|
-
unless whitespace_after?(condition)
|
203
|
-
corrector.insert_after(condition.loc.end, ' ')
|
204
|
-
end
|
202
|
+
corrector.insert_after(condition.loc.end, ' ') unless whitespace_after?(condition)
|
205
203
|
end
|
206
204
|
end
|
207
205
|
|
@@ -6,11 +6,11 @@ module RuboCop
|
|
6
6
|
# This cop checks for trailing comma in argument lists.
|
7
7
|
# The supported styles are:
|
8
8
|
#
|
9
|
-
#
|
9
|
+
# * `consistent_comma`: Requires a comma after the last argument,
|
10
10
|
# for all parenthesized method calls with arguments.
|
11
|
-
#
|
11
|
+
# * `comma`: Requires a comma after the last argument, but only for
|
12
12
|
# parenthesized method calls where each argument is on its own line.
|
13
|
-
#
|
13
|
+
# * `no_comma`: Requires that there is no comma after the last
|
14
14
|
# argument.
|
15
15
|
#
|
16
16
|
# @example EnforcedStyleForMultiline: consistent_comma
|
@@ -6,11 +6,11 @@ module RuboCop
|
|
6
6
|
# This cop checks for trailing comma in array literals.
|
7
7
|
# The configuration options are:
|
8
8
|
#
|
9
|
-
#
|
9
|
+
# * `consistent_comma`: Requires a comma after the
|
10
10
|
# last item of all non-empty, multiline array literals.
|
11
|
-
#
|
11
|
+
# * `comma`: Requires a comma after last item in an array,
|
12
12
|
# but only when each item is on its own line.
|
13
|
-
#
|
13
|
+
# * `no_comma`: Does not requires a comma after the
|
14
14
|
# last item in an array
|
15
15
|
#
|
16
16
|
# @example EnforcedStyleForMultiline: consistent_comma
|
@@ -12,7 +12,7 @@ module RuboCop
|
|
12
12
|
# # bad
|
13
13
|
# add { |foo, bar,| foo + bar }
|
14
14
|
#
|
15
|
-
#
|
15
|
+
# # good
|
16
16
|
# add { |foo, bar| foo + bar }
|
17
17
|
#
|
18
18
|
# # good
|
@@ -22,24 +22,24 @@ module RuboCop
|
|
22
22
|
# add { foo }
|
23
23
|
#
|
24
24
|
# # bad
|
25
|
-
#
|
26
|
-
#
|
25
|
+
# add do |foo, bar,|
|
26
|
+
# foo + bar
|
27
27
|
# end
|
28
28
|
#
|
29
|
-
#
|
30
|
-
#
|
31
|
-
#
|
32
|
-
#
|
29
|
+
# # good
|
30
|
+
# add do |foo, bar|
|
31
|
+
# foo + bar
|
32
|
+
# end
|
33
33
|
#
|
34
|
-
#
|
34
|
+
# # good
|
35
35
|
# add do |foo,|
|
36
|
-
#
|
37
|
-
#
|
36
|
+
# foo
|
37
|
+
# end
|
38
38
|
#
|
39
|
-
#
|
40
|
-
#
|
39
|
+
# # good
|
40
|
+
# add do
|
41
41
|
# foo + bar
|
42
|
-
#
|
42
|
+
# end
|
43
43
|
class TrailingCommaInBlockArgs < Cop
|
44
44
|
MSG = 'Useless trailing comma present in block arguments.'
|
45
45
|
|
@@ -6,11 +6,11 @@ module RuboCop
|
|
6
6
|
# This cop checks for trailing comma in hash literals.
|
7
7
|
# The configuration options are:
|
8
8
|
#
|
9
|
-
#
|
9
|
+
# * `consistent_comma`: Requires a comma after the
|
10
10
|
# last item of all non-empty, multiline hash literals.
|
11
|
-
#
|
11
|
+
# * `comma`: Requires a comma after the last item in a hash,
|
12
12
|
# but only when each item is on its own line.
|
13
|
-
#
|
13
|
+
# * `no_comma`: Does not requires a comma after the
|
14
14
|
# last item in a hash
|
15
15
|
#
|
16
16
|
# @example EnforcedStyleForMultiline: consistent_comma
|
@@ -126,9 +126,7 @@ module RuboCop
|
|
126
126
|
return unused_range(node.type, mlhs_node, right)
|
127
127
|
end
|
128
128
|
|
129
|
-
if Util.parentheses?(mlhs_node)
|
130
|
-
return range_for_parentheses(first_offense, mlhs_node)
|
131
|
-
end
|
129
|
+
return range_for_parentheses(first_offense, mlhs_node) if Util.parentheses?(mlhs_node)
|
132
130
|
|
133
131
|
range_between(first_offense.source_range.begin_pos,
|
134
132
|
node.loc.operator.begin_pos)
|
@@ -28,6 +28,8 @@ module RuboCop
|
|
28
28
|
# attr_reader :baz
|
29
29
|
# end
|
30
30
|
class TrivialAccessors < Cop
|
31
|
+
include AllowedMethods
|
32
|
+
|
31
33
|
MSG = 'Use `attr_%<kind>s` to define trivial %<kind>s methods.'
|
32
34
|
|
33
35
|
def on_def(node)
|
@@ -95,9 +97,8 @@ module RuboCop
|
|
95
97
|
cop_config['IgnoreClassMethods']
|
96
98
|
end
|
97
99
|
|
98
|
-
def
|
99
|
-
allowed_methods
|
100
|
-
Array(allowed_methods).map(&:to_sym) + [:initialize]
|
100
|
+
def allowed_method_names
|
101
|
+
allowed_methods.map(&:to_sym) + [:initialize]
|
101
102
|
end
|
102
103
|
|
103
104
|
def dsl_writer?(method_name)
|
@@ -106,7 +107,7 @@ module RuboCop
|
|
106
107
|
|
107
108
|
def trivial_reader?(node)
|
108
109
|
looks_like_trivial_reader?(node) &&
|
109
|
-
!
|
110
|
+
!allowed_method_name?(node) && !allowed_reader?(node)
|
110
111
|
end
|
111
112
|
|
112
113
|
def looks_like_trivial_reader?(node)
|
@@ -115,7 +116,7 @@ module RuboCop
|
|
115
116
|
|
116
117
|
def trivial_writer?(node)
|
117
118
|
looks_like_trivial_writer?(node) &&
|
118
|
-
!
|
119
|
+
!allowed_method_name?(node) && !allowed_writer?(node.method_name)
|
119
120
|
end
|
120
121
|
|
121
122
|
def_node_matcher :looks_like_trivial_writer?, <<~PATTERN
|
@@ -123,8 +124,8 @@ module RuboCop
|
|
123
124
|
(defs _ _ (args (arg ...)) (ivasgn _ (lvar _)))}
|
124
125
|
PATTERN
|
125
126
|
|
126
|
-
def
|
127
|
-
|
127
|
+
def allowed_method_name?(node)
|
128
|
+
allowed_method_names.include?(node.method_name) ||
|
128
129
|
exact_name_match? && !names_match?(node)
|
129
130
|
end
|
130
131
|
|
@@ -19,6 +19,8 @@ module RuboCop
|
|
19
19
|
# foo == "bar"
|
20
20
|
# foo <= 42
|
21
21
|
# bar > 10
|
22
|
+
# "#{interpolation}" == foo
|
23
|
+
# /#{interpolation}/ == foo
|
22
24
|
#
|
23
25
|
# @example EnforcedStyle: forbid_for_equality_operators_only
|
24
26
|
# # bad
|
@@ -109,7 +111,8 @@ module RuboCop
|
|
109
111
|
rhs = node.first_argument
|
110
112
|
|
111
113
|
return true if lhs.literal? && rhs.literal? ||
|
112
|
-
!lhs.literal? && !rhs.literal?
|
114
|
+
!lhs.literal? && !rhs.literal? ||
|
115
|
+
interpolation?(lhs)
|
113
116
|
|
114
117
|
enforce_yoda? ? lhs.literal? : rhs.literal?
|
115
118
|
end
|
@@ -150,6 +153,20 @@ module RuboCop
|
|
150
153
|
def program_name?(name)
|
151
154
|
PROGRAM_NAMES.include?(name)
|
152
155
|
end
|
156
|
+
|
157
|
+
def interpolation?(node)
|
158
|
+
return true if node.dstr_type?
|
159
|
+
|
160
|
+
# TODO: Use `RegexpNode#interpolation?` when the following is released.
|
161
|
+
# https://github.com/rubocop-hq/rubocop-ast/pull/18
|
162
|
+
if node.regexp_type?
|
163
|
+
return true if node.children.any? do |child|
|
164
|
+
child.respond_to?(:begin_type?) && child.begin_type?
|
165
|
+
end
|
166
|
+
end
|
167
|
+
|
168
|
+
false
|
169
|
+
end
|
153
170
|
end
|
154
171
|
end
|
155
172
|
end
|
@@ -108,8 +108,8 @@ module RuboCop
|
|
108
108
|
# implement `#size`, but not `#empty`. We ignore those to
|
109
109
|
# reduce false positives.
|
110
110
|
def_node_matcher :non_polymorphic_collection?, <<~PATTERN
|
111
|
-
{(send (send (send (const nil? :File) :stat _) ...) ...)
|
112
|
-
(send (send (send (const nil? {:Tempfile :StringIO}) {:new :open} ...) ...) ...)}
|
111
|
+
{(send (send (send (const {nil? cbase} :File) :stat _) ...) ...)
|
112
|
+
(send (send (send (const {nil? cbase} {:Tempfile :StringIO}) {:new :open} ...) ...) ...)}
|
113
113
|
PATTERN
|
114
114
|
end
|
115
115
|
end
|
data/lib/rubocop/cop/team.rb
CHANGED
@@ -2,29 +2,52 @@
|
|
2
2
|
|
3
3
|
module RuboCop
|
4
4
|
module Cop
|
5
|
-
#
|
5
|
+
# A group of cops, ready to be called on duty to inspect files.
|
6
|
+
# Team is responsible for selecting only relevant cops to be sent on duty,
|
7
|
+
# as well as insuring that the needed forces are sent along with them.
|
8
|
+
#
|
9
|
+
# For performance reasons, Team will first dispatch cops & forces in two groups,
|
10
|
+
# first the ones needed for autocorrection (if any), then the rest
|
11
|
+
# (unless autocorrections happened).
|
6
12
|
class Team
|
7
|
-
|
8
|
-
auto_correct: false,
|
9
|
-
debug: false
|
10
|
-
}.freeze
|
11
|
-
|
12
|
-
Investigation = Struct.new(:offenses, :errors)
|
13
|
-
|
14
|
-
attr_reader :errors, :warnings, :updated_source_file
|
13
|
+
attr_reader :errors, :warnings, :updated_source_file, :cops
|
15
14
|
|
16
15
|
alias updated_source_file? updated_source_file
|
17
16
|
|
18
|
-
def initialize(
|
19
|
-
@
|
17
|
+
def initialize(cops, config = nil, options = {})
|
18
|
+
@cops = cops
|
20
19
|
@config = config
|
21
|
-
@options = options
|
22
|
-
|
23
|
-
@
|
20
|
+
@options = options
|
21
|
+
reset
|
22
|
+
@ready = true
|
24
23
|
|
25
24
|
validate_config
|
26
25
|
end
|
27
26
|
|
27
|
+
# @return [Team]
|
28
|
+
def self.new(cop_or_classes, config, options = {})
|
29
|
+
# Support v0 api:
|
30
|
+
return mobilize(cop_or_classes, config, options) if cop_or_classes.first.is_a?(Class)
|
31
|
+
|
32
|
+
super
|
33
|
+
end
|
34
|
+
|
35
|
+
# @return [Team] with cops assembled from the given `cop_classes`
|
36
|
+
def self.mobilize(cop_classes, config, options = {})
|
37
|
+
cops = mobilize_cops(cop_classes, config, options)
|
38
|
+
new(cops, config, options)
|
39
|
+
end
|
40
|
+
|
41
|
+
# @return [Array<Cop::Cop>]
|
42
|
+
def self.mobilize_cops(cop_classes, config, options = {})
|
43
|
+
cop_classes = Registry.new(cop_classes.to_a) unless cop_classes.is_a?(Registry)
|
44
|
+
only = options.fetch(:only, [])
|
45
|
+
safe = options.fetch(:safe, false)
|
46
|
+
cop_classes.enabled(config, only, safe).map do |cop_class|
|
47
|
+
cop_class.new(config, options)
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
28
51
|
def autocorrect?
|
29
52
|
@options[:auto_correct]
|
30
53
|
end
|
@@ -33,124 +56,161 @@ module RuboCop
|
|
33
56
|
@options[:debug]
|
34
57
|
end
|
35
58
|
|
59
|
+
# @deprecated. Use investigate
|
60
|
+
# @return Array<offenses>
|
36
61
|
def inspect_file(processed_source)
|
37
|
-
|
38
|
-
unless processed_source.valid_syntax?
|
39
|
-
return Lint::Syntax.offenses_from_processed_source(
|
40
|
-
processed_source, @config, @options
|
41
|
-
)
|
42
|
-
end
|
43
|
-
|
44
|
-
offenses(processed_source)
|
62
|
+
investigate(processed_source).offenses
|
45
63
|
end
|
46
64
|
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
65
|
+
# @return [Commissioner::InvestigationReport]
|
66
|
+
def investigate(processed_source)
|
67
|
+
be_ready
|
68
|
+
|
69
|
+
# The autocorrection process may have to be repeated multiple times
|
70
|
+
# until there are no corrections left to perform
|
71
|
+
# To speed things up, run auto-correcting cops by themselves, and only
|
72
|
+
# run the other cops when no corrections are left
|
73
|
+
on_duty = roundup_relevant_cops(processed_source.file_path)
|
74
|
+
|
75
|
+
autocorrect_cops, other_cops = on_duty.partition(&:autocorrect?)
|
76
|
+
|
77
|
+
report = investigate_partial(autocorrect_cops, processed_source)
|
78
|
+
|
79
|
+
unless autocorrect(processed_source, report)
|
80
|
+
# If we corrected some errors, another round of inspection will be
|
81
|
+
# done, and any other offenses will be caught then, so only need
|
82
|
+
# to check other_cops if no correction was done
|
83
|
+
report = report.merge(investigate_partial(other_cops, processed_source))
|
52
84
|
end
|
85
|
+
|
86
|
+
process_errors(processed_source.path, report.errors)
|
87
|
+
|
88
|
+
report
|
89
|
+
ensure
|
90
|
+
@ready = false
|
53
91
|
end
|
54
92
|
|
93
|
+
# @deprecated
|
55
94
|
def forces
|
56
|
-
@forces ||= forces_for(cops)
|
95
|
+
@forces ||= self.class.forces_for(cops)
|
57
96
|
end
|
58
97
|
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
98
|
+
# @return [Array<Force>] needed for the given cops
|
99
|
+
def self.forces_for(cops)
|
100
|
+
needed = Hash.new { |h, k| h[k] = [] }
|
101
|
+
cops.each do |cop|
|
102
|
+
Array(cop.class.joining_forces).each { |force| needed[force] << cop }
|
103
|
+
end
|
63
104
|
|
64
|
-
|
105
|
+
needed.map do |force_class, joining_cops|
|
106
|
+
force_class.new(joining_cops)
|
65
107
|
end
|
66
108
|
end
|
67
109
|
|
68
|
-
def
|
110
|
+
def external_dependency_checksum
|
111
|
+
keys = cops.map(&:external_dependency_checksum).compact
|
112
|
+
Digest::SHA1.hexdigest(keys.join)
|
113
|
+
end
|
114
|
+
|
115
|
+
private
|
116
|
+
|
117
|
+
def autocorrect(processed_source, report)
|
69
118
|
@updated_source_file = false
|
70
119
|
return unless autocorrect?
|
71
120
|
|
72
|
-
new_source =
|
121
|
+
new_source = autocorrect_report(report)
|
73
122
|
|
74
|
-
return
|
123
|
+
return unless new_source
|
75
124
|
|
76
125
|
if @options[:stdin]
|
77
126
|
# holds source read in from stdin, when --stdin option is used
|
78
127
|
@options[:stdin] = new_source
|
79
128
|
else
|
80
|
-
filename = buffer.name
|
129
|
+
filename = processed_source.buffer.name
|
81
130
|
File.open(filename, 'w') { |f| f.write(new_source) }
|
82
131
|
end
|
83
132
|
@updated_source_file = true
|
84
|
-
rescue RuboCop::ErrorWithAnalyzedFileLocation => e
|
85
|
-
process_errors(buffer.name, [e])
|
86
|
-
raise e.cause
|
87
133
|
end
|
88
134
|
|
89
|
-
def
|
90
|
-
|
91
|
-
|
135
|
+
def be_ready
|
136
|
+
return if @ready
|
137
|
+
|
138
|
+
reset
|
139
|
+
@cops.map!(&:ready)
|
140
|
+
@ready = true
|
92
141
|
end
|
93
142
|
|
94
|
-
|
143
|
+
def reset
|
144
|
+
@errors = []
|
145
|
+
@warnings = []
|
146
|
+
end
|
95
147
|
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
autocorrect_cops, other_cops = cops.partition(&:autocorrect?)
|
102
|
-
|
103
|
-
autocorrect =
|
104
|
-
investigate(autocorrect_cops, processed_source) do |offenses|
|
105
|
-
# We corrected some errors. Another round of inspection will be
|
106
|
-
# done, and any other offenses will be caught then, so we don't
|
107
|
-
# need to continue.
|
108
|
-
return offenses if autocorrect(processed_source.buffer,
|
109
|
-
autocorrect_cops)
|
110
|
-
end
|
148
|
+
# @return [Commissioner::InvestigationReport]
|
149
|
+
def investigate_partial(cops, processed_source)
|
150
|
+
commissioner = Commissioner.new(cops, self.class.forces_for(cops), @options)
|
151
|
+
commissioner.investigate(processed_source)
|
152
|
+
end
|
111
153
|
|
112
|
-
|
154
|
+
# @return [Array<cop>]
|
155
|
+
def roundup_relevant_cops(filename)
|
156
|
+
cops.reject do |cop|
|
157
|
+
cop.excluded_file?(filename) ||
|
158
|
+
!support_target_ruby_version?(cop) ||
|
159
|
+
!support_target_rails_version?(cop)
|
160
|
+
end
|
161
|
+
end
|
113
162
|
|
114
|
-
|
115
|
-
|
163
|
+
def support_target_ruby_version?(cop)
|
164
|
+
return true unless cop.class.respond_to?(:support_target_ruby_version?)
|
116
165
|
|
117
|
-
|
166
|
+
cop.class.support_target_ruby_version?(cop.target_ruby_version)
|
118
167
|
end
|
119
168
|
|
120
|
-
def
|
121
|
-
return
|
169
|
+
def support_target_rails_version?(cop)
|
170
|
+
return true unless cop.class.respond_to?(:support_target_rails_version?)
|
122
171
|
|
123
|
-
|
124
|
-
offenses = commissioner.investigate(processed_source)
|
125
|
-
yield offenses if block_given?
|
126
|
-
|
127
|
-
Investigation.new(offenses, commissioner.errors)
|
172
|
+
cop.class.support_target_rails_version?(cop.target_rails_version)
|
128
173
|
end
|
129
174
|
|
130
|
-
def
|
131
|
-
corrector =
|
175
|
+
def autocorrect_report(report)
|
176
|
+
corrector = collate_corrections(report)
|
132
177
|
|
133
|
-
|
178
|
+
corrector.rewrite unless corrector.empty?
|
179
|
+
end
|
134
180
|
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
181
|
+
def collate_corrections(report)
|
182
|
+
corrector = Corrector.new(report.processed_source)
|
183
|
+
|
184
|
+
each_corrector(report) do |to_merge|
|
185
|
+
suppress_clobbering do
|
186
|
+
corrector.merge!(to_merge)
|
187
|
+
end
|
139
188
|
end
|
189
|
+
|
190
|
+
corrector
|
140
191
|
end
|
141
192
|
|
142
|
-
def
|
193
|
+
def each_corrector(report)
|
143
194
|
skips = Set.new
|
195
|
+
report.cop_reports.each do |cop_report|
|
196
|
+
cop = cop_report.cop
|
197
|
+
corrector = cop_report.corrector
|
144
198
|
|
145
|
-
|
146
|
-
next if cop.corrections.empty?
|
199
|
+
next if corrector.nil? || corrector.empty?
|
147
200
|
next if skips.include?(cop.class)
|
148
201
|
|
149
|
-
corrector
|
202
|
+
yield corrector
|
203
|
+
|
150
204
|
skips.merge(cop.class.autocorrect_incompatible_with)
|
151
205
|
end
|
152
206
|
end
|
153
207
|
|
208
|
+
def suppress_clobbering
|
209
|
+
yield
|
210
|
+
rescue ::Parser::ClobberingError
|
211
|
+
# ignore Clobbering errors
|
212
|
+
end
|
213
|
+
|
154
214
|
def validate_config
|
155
215
|
cops.each do |cop|
|
156
216
|
cop.validate_config if cop.respond_to?(:validate_config)
|