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
data/lib/rubocop/cop/util.rb
CHANGED
@@ -14,7 +14,7 @@ module RuboCop
|
|
14
14
|
module_function
|
15
15
|
|
16
16
|
def comment_line?(line_source)
|
17
|
-
|
17
|
+
/^\s*#/.match?(line_source)
|
18
18
|
end
|
19
19
|
|
20
20
|
def comment_lines?(node)
|
@@ -88,7 +88,7 @@ module RuboCop
|
|
88
88
|
|
89
89
|
# Regex matches IF there is a ' or there is a \\ in the string that is
|
90
90
|
# not preceded/followed by another \\ (e.g. "\\x34") but not "\\\\".
|
91
|
-
|
91
|
+
/'|(?<! \\) \\{2}* \\ (?![\\"])/x.match?(string)
|
92
92
|
end
|
93
93
|
|
94
94
|
def needs_escaping?(string)
|
@@ -108,7 +108,7 @@ module RuboCop
|
|
108
108
|
end
|
109
109
|
|
110
110
|
def trim_string_interporation_escape_character(str)
|
111
|
-
str.gsub(
|
111
|
+
str.gsub(/\\\#\{(.*?)\}/) { "\#{#{Regexp.last_match(1)}}" }
|
112
112
|
end
|
113
113
|
|
114
114
|
def interpret_string_escapes(string)
|
@@ -41,8 +41,7 @@ module RuboCop
|
|
41
41
|
#
|
42
42
|
# @see https://ruby-doc.org/core-2.6.3/Kernel.html#method-i-format
|
43
43
|
class FormatSequence
|
44
|
-
attr_reader :begin_pos, :end_pos
|
45
|
-
attr_reader :flags, :width, :precision, :name, :type
|
44
|
+
attr_reader :begin_pos, :end_pos, :flags, :width, :precision, :name, :type
|
46
45
|
|
47
46
|
def initialize(match)
|
48
47
|
@source = match[0]
|
@@ -97,6 +96,10 @@ module RuboCop
|
|
97
96
|
@format_sequences ||= parse
|
98
97
|
end
|
99
98
|
|
99
|
+
def valid?
|
100
|
+
!mixed_formats?
|
101
|
+
end
|
102
|
+
|
100
103
|
def named_interpolation?
|
101
104
|
format_sequences.any?(&:name)
|
102
105
|
end
|
@@ -114,6 +117,20 @@ module RuboCop
|
|
114
117
|
)
|
115
118
|
end
|
116
119
|
end
|
120
|
+
|
121
|
+
def mixed_formats?
|
122
|
+
formats = format_sequences.reject(&:percent?).map do |seq|
|
123
|
+
if seq.name
|
124
|
+
:named
|
125
|
+
elsif seq.max_digit_dollar_num
|
126
|
+
:numbered
|
127
|
+
else
|
128
|
+
:unnumbered
|
129
|
+
end
|
130
|
+
end
|
131
|
+
|
132
|
+
formats.uniq.size > 1
|
133
|
+
end
|
117
134
|
end
|
118
135
|
end
|
119
136
|
end
|
@@ -152,9 +152,7 @@ module RuboCop
|
|
152
152
|
def process_variable_assignment(node)
|
153
153
|
name = node.children.first
|
154
154
|
|
155
|
-
unless variable_table.variable_exist?(name)
|
156
|
-
variable_table.declare_variable(name, node)
|
157
|
-
end
|
155
|
+
variable_table.declare_variable(name, node) unless variable_table.variable_exist?(name)
|
158
156
|
|
159
157
|
# Need to scan rhs before assignment so that we can mark previous
|
160
158
|
# assignments as referenced if rhs has referencing to the variable
|
@@ -211,9 +209,7 @@ module RuboCop
|
|
211
209
|
|
212
210
|
name = asgn_node.children.first
|
213
211
|
|
214
|
-
unless variable_table.variable_exist?(name)
|
215
|
-
variable_table.declare_variable(name, asgn_node)
|
216
|
-
end
|
212
|
+
variable_table.declare_variable(name, asgn_node) unless variable_table.variable_exist?(name)
|
217
213
|
|
218
214
|
# The following statements:
|
219
215
|
#
|
@@ -369,9 +365,7 @@ module RuboCop
|
|
369
365
|
AssignmentReference.new(node)
|
370
366
|
when *OPERATOR_ASSIGNMENT_TYPES
|
371
367
|
asgn_node = node.children.first
|
372
|
-
if asgn_node.lvasgn_type?
|
373
|
-
VariableReference.new(asgn_node.children.first)
|
374
|
-
end
|
368
|
+
VariableReference.new(asgn_node.children.first) if asgn_node.lvasgn_type?
|
375
369
|
end
|
376
370
|
end
|
377
371
|
|
@@ -81,9 +81,7 @@ module RuboCop
|
|
81
81
|
end
|
82
82
|
|
83
83
|
def each_ancestor(include_self: false, &block)
|
84
|
-
unless block_given?
|
85
|
-
return to_enum(__method__, include_self: include_self)
|
86
|
-
end
|
84
|
+
return to_enum(__method__, include_self: include_self) unless block_given?
|
87
85
|
|
88
86
|
yield self if include_self
|
89
87
|
scan_ancestors(&block)
|
@@ -47,9 +47,7 @@ module RuboCop
|
|
47
47
|
@assignments.reverse_each do |assignment|
|
48
48
|
next if consumed_branches.include?(assignment.branch)
|
49
49
|
|
50
|
-
unless assignment.run_exclusively_with?(reference)
|
51
|
-
assignment.reference!(node)
|
52
|
-
end
|
50
|
+
assignment.reference!(node) unless assignment.run_exclusively_with?(reference)
|
53
51
|
|
54
52
|
# Modifier if/unless conditions are special. Assignments made in
|
55
53
|
# them do not put the assigned variable in scope to the left of the
|
@@ -60,9 +58,7 @@ module RuboCop
|
|
60
58
|
|
61
59
|
break if !assignment.branch || assignment.branch == reference.branch
|
62
60
|
|
63
|
-
unless assignment.branch.may_run_incompletely?
|
64
|
-
consumed_branches << assignment.branch
|
65
|
-
end
|
61
|
+
consumed_branches << assignment.branch unless assignment.branch.may_run_incompletely?
|
66
62
|
end
|
67
63
|
end
|
68
64
|
# rubocop:enable Metrics/AbcSize, Metrics/CyclomaticComplexity
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RuboCop
|
4
|
+
module Ext
|
5
|
+
# Extensions to AST::ProcessedSource for our cached comment_config
|
6
|
+
module ProcessedSource
|
7
|
+
def comment_config
|
8
|
+
@comment_config ||= CommentConfig.new(self)
|
9
|
+
end
|
10
|
+
|
11
|
+
def disabled_line_ranges
|
12
|
+
comment_config.cop_disabled_line_ranges
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
RuboCop::ProcessedSource.include RuboCop::Ext::ProcessedSource
|
@@ -1,7 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
# rubocop:disable Layout/LineLength
|
4
|
-
|
5
3
|
module RuboCop
|
6
4
|
module Formatter
|
7
5
|
# Abstract base class for formatter, implements all public API methods.
|
@@ -41,8 +39,6 @@ module RuboCop
|
|
41
39
|
# * `#finished`
|
42
40
|
#
|
43
41
|
class BaseFormatter
|
44
|
-
# rubocop:enable Layout/LineLength
|
45
|
-
|
46
42
|
# @api public
|
47
43
|
#
|
48
44
|
# @!attribute [r] output
|
@@ -59,9 +59,7 @@ module RuboCop
|
|
59
59
|
def command
|
60
60
|
command = 'rubocop --auto-gen-config'
|
61
61
|
|
62
|
-
if @options[:auto_gen_only_exclude]
|
63
|
-
command += ' --auto-gen-only-exclude'
|
64
|
-
end
|
62
|
+
command += ' --auto-gen-only-exclude' if @options[:auto_gen_only_exclude]
|
65
63
|
|
66
64
|
if @exclude_limit_option
|
67
65
|
command +=
|
@@ -70,15 +68,13 @@ module RuboCop
|
|
70
68
|
end
|
71
69
|
command += ' --no-offense-counts' if @options[:no_offense_counts]
|
72
70
|
|
73
|
-
if @options[:no_auto_gen_timestamp]
|
74
|
-
command += ' --no-auto-gen-timestamp'
|
75
|
-
end
|
71
|
+
command += ' --no-auto-gen-timestamp' if @options[:no_auto_gen_timestamp]
|
76
72
|
|
77
73
|
command
|
78
74
|
end
|
79
75
|
|
80
76
|
def timestamp
|
81
|
-
@options[:no_auto_gen_timestamp] ? '' : "on #{Time.now} "
|
77
|
+
@options[:no_auto_gen_timestamp] ? '' : "on #{Time.now.utc} "
|
82
78
|
end
|
83
79
|
|
84
80
|
def output_offenses
|
@@ -116,14 +112,10 @@ module RuboCop
|
|
116
112
|
end
|
117
113
|
|
118
114
|
def output_cop_comments(output_buffer, cfg, cop_name, offense_count)
|
119
|
-
if @show_offense_counts
|
120
|
-
output_buffer.puts "# Offense count: #{offense_count}"
|
121
|
-
end
|
115
|
+
output_buffer.puts "# Offense count: #{offense_count}" if @show_offense_counts
|
122
116
|
|
123
117
|
cop_class = Cop::Cop.registry.find_by_cop_name(cop_name)
|
124
|
-
if cop_class&.new&.support_autocorrect?
|
125
|
-
output_buffer.puts '# Cop supports --auto-correct.'
|
126
|
-
end
|
118
|
+
output_buffer.puts '# Cop supports --auto-correct.' if cop_class&.new&.support_autocorrect?
|
127
119
|
|
128
120
|
default_cfg = default_config(cop_name)
|
129
121
|
return unless default_cfg
|
@@ -82,14 +82,12 @@ module RuboCop
|
|
82
82
|
|
83
83
|
def builtin_formatter_class(specified_key)
|
84
84
|
matching_keys = BUILTIN_FORMATTERS_FOR_KEYS.keys.select do |key|
|
85
|
-
|
85
|
+
/^\[#{specified_key}\]/.match?(key) || specified_key == key.delete('[]')
|
86
86
|
end
|
87
87
|
|
88
88
|
raise %(No formatter for "#{specified_key}") if matching_keys.empty?
|
89
89
|
|
90
|
-
if matching_keys.size > 1
|
91
|
-
raise %(Cannot determine formatter for "#{specified_key}")
|
92
|
-
end
|
90
|
+
raise %(Cannot determine formatter for "#{specified_key}") if matching_keys.size > 1
|
93
91
|
|
94
92
|
BUILTIN_FORMATTERS_FOR_KEYS[matching_keys.first]
|
95
93
|
end
|
@@ -35,19 +35,29 @@ module RuboCop
|
|
35
35
|
#
|
36
36
|
# In the future, it would be preferable to return only enabled cops.
|
37
37
|
Cop::Cop.all.each do |cop|
|
38
|
+
target_offenses = offenses_for_cop(offenses, cop)
|
39
|
+
|
40
|
+
next unless relevant_for_output?(options, target_offenses)
|
41
|
+
|
38
42
|
REXML::Element.new('testcase', @testsuite).tap do |testcase|
|
39
43
|
testcase.attributes['classname'] = classname_attribute_value(file)
|
40
44
|
testcase.attributes['name'] = cop.cop_name
|
41
45
|
|
42
|
-
target_offenses = offenses.select do |offense|
|
43
|
-
offense.cop_name == cop.cop_name
|
44
|
-
end
|
45
|
-
|
46
46
|
add_failure_to(testcase, target_offenses, cop.cop_name)
|
47
47
|
end
|
48
48
|
end
|
49
49
|
end
|
50
50
|
|
51
|
+
def relevant_for_output?(options, target_offenses)
|
52
|
+
!options[:display_only_failed] || target_offenses.any?
|
53
|
+
end
|
54
|
+
|
55
|
+
def offenses_for_cop(all_offenses, cop)
|
56
|
+
all_offenses.select do |offense|
|
57
|
+
offense.cop_name == cop.cop_name
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
51
61
|
def classname_attribute_value(file)
|
52
62
|
file.gsub(/\.rb\Z/, '').gsub("#{Dir.pwd}/", '').tr('/', '.')
|
53
63
|
end
|
@@ -133,7 +133,7 @@ module RuboCop
|
|
133
133
|
# @see https://www.gnu.org/software/emacs/manual/html_node/emacs/Specify-Coding.html
|
134
134
|
# @see https://git.io/vMCXh Emacs handling in Ruby's parse.y
|
135
135
|
class EmacsComment < EditorComment
|
136
|
-
FORMAT =
|
136
|
+
FORMAT = /-\*-(.+)-\*-/.freeze
|
137
137
|
SEPARATOR = ';'
|
138
138
|
OPERATOR = ':'
|
139
139
|
|
@@ -12,13 +12,17 @@ module RuboCop
|
|
12
12
|
end
|
13
13
|
|
14
14
|
def find_similar_names(target_name, names)
|
15
|
+
# DidYouMean::SpellChecker is not available in all versions of Ruby, and
|
16
|
+
# even on versions where it *is* available (>= 2.3), it is not always
|
17
|
+
# required correctly. So we do a feature check first.
|
18
|
+
# See: https://github.com/rubocop-hq/rubocop/issues/7979
|
19
|
+
return [] unless defined?(DidYouMean::SpellChecker)
|
20
|
+
|
15
21
|
names = names.dup
|
16
22
|
names.delete(target_name)
|
17
23
|
|
18
24
|
spell_checker = DidYouMean::SpellChecker.new(dictionary: names)
|
19
|
-
|
20
|
-
|
21
|
-
similar_names
|
25
|
+
spell_checker.correct(target_name)
|
22
26
|
end
|
23
27
|
end
|
24
28
|
end
|
data/lib/rubocop/options.rb
CHANGED
@@ -143,6 +143,8 @@ module RuboCop
|
|
143
143
|
@options[:output_path] = path
|
144
144
|
end
|
145
145
|
end
|
146
|
+
|
147
|
+
option(opts, '--display-only-failed')
|
146
148
|
end
|
147
149
|
|
148
150
|
def add_severity_option(opts)
|
@@ -161,7 +163,7 @@ module RuboCop
|
|
161
163
|
end
|
162
164
|
end
|
163
165
|
|
164
|
-
# rubocop:disable Metrics/MethodLength
|
166
|
+
# rubocop:disable Metrics/MethodLength, Metrics/AbcSize
|
165
167
|
def add_boolean_flags(opts)
|
166
168
|
option(opts, '-F', '--fail-fast')
|
167
169
|
option(opts, '-C', '--cache FLAG')
|
@@ -169,7 +171,16 @@ module RuboCop
|
|
169
171
|
option(opts, '-D', '--[no-]display-cop-names')
|
170
172
|
option(opts, '-E', '--extra-details')
|
171
173
|
option(opts, '-S', '--display-style-guide')
|
172
|
-
option(opts, '-a', '--auto-correct')
|
174
|
+
option(opts, '-a', '--auto-correct') do
|
175
|
+
@options[:safe_auto_correct] = true
|
176
|
+
end
|
177
|
+
option(opts, '--safe-autocorrect') do
|
178
|
+
warn '--safe-autocorrect is deprecated; use --autocorrect'
|
179
|
+
@options[:safe_auto_correct] = @options[:auto_correct] = true
|
180
|
+
end
|
181
|
+
option(opts, '-A', '--auto-correct-all') do
|
182
|
+
@options[:auto_correct] = true
|
183
|
+
end
|
173
184
|
option(opts, '--disable-pending-cops')
|
174
185
|
option(opts, '--enable-pending-cops')
|
175
186
|
option(opts, '--ignore-disable-comments')
|
@@ -182,7 +193,7 @@ module RuboCop
|
|
182
193
|
option(opts, '-V', '--verbose-version')
|
183
194
|
option(opts, '-P', '--parallel')
|
184
195
|
end
|
185
|
-
# rubocop:enable Metrics/MethodLength
|
196
|
+
# rubocop:enable Metrics/MethodLength, Metrics/AbcSize
|
186
197
|
|
187
198
|
def add_aliases(opts)
|
188
199
|
option(opts, '-l', '--lint') do
|
@@ -194,9 +205,6 @@ module RuboCop
|
|
194
205
|
@options[:only] << 'Layout'
|
195
206
|
@options[:auto_correct] = true
|
196
207
|
end
|
197
|
-
option(opts, '--safe-auto-correct') do
|
198
|
-
@options[:auto_correct] = true
|
199
|
-
end
|
200
208
|
end
|
201
209
|
|
202
210
|
def add_list_options(opts)
|
@@ -275,9 +283,7 @@ module RuboCop
|
|
275
283
|
raise OptionArgumentError, 'Lint/RedundantCopDisableDirective cannot ' \
|
276
284
|
'be used with --only.'
|
277
285
|
end
|
278
|
-
if except_syntax?
|
279
|
-
raise OptionArgumentError, 'Syntax checking cannot be turned off.'
|
280
|
-
end
|
286
|
+
raise OptionArgumentError, 'Syntax checking cannot be turned off.' if except_syntax?
|
281
287
|
unless boolean_or_empty_cache?
|
282
288
|
raise OptionArgumentError, '-C/--cache argument must be true or false'
|
283
289
|
end
|
@@ -288,6 +294,7 @@ module RuboCop
|
|
288
294
|
end
|
289
295
|
validate_auto_gen_config
|
290
296
|
validate_auto_correct
|
297
|
+
validate_display_only_failed
|
291
298
|
validate_parallel
|
292
299
|
|
293
300
|
return if incompatible_options.size <= 1
|
@@ -311,13 +318,20 @@ module RuboCop
|
|
311
318
|
end
|
312
319
|
end
|
313
320
|
|
321
|
+
def validate_display_only_failed
|
322
|
+
return unless @options.key?(:display_only_failed)
|
323
|
+
return if @options[:format] == 'junit'
|
324
|
+
|
325
|
+
raise OptionArgumentError,
|
326
|
+
format('--display-only-failed can only be used together with --format junit.')
|
327
|
+
end
|
328
|
+
|
314
329
|
def validate_auto_correct
|
315
330
|
return if @options.key?(:auto_correct)
|
316
331
|
return unless @options.key?(:disable_uncorrectable)
|
317
332
|
|
318
333
|
raise OptionArgumentError,
|
319
|
-
format('
|
320
|
-
flag: '--disable-uncorrectable')
|
334
|
+
format('--disable-uncorrectable can only be used together with --auto-correct.')
|
321
335
|
end
|
322
336
|
|
323
337
|
def validate_parallel
|
@@ -381,7 +395,6 @@ module RuboCop
|
|
381
395
|
# This module contains help texts for command line options.
|
382
396
|
module OptionsHelp
|
383
397
|
MAX_EXCL = RuboCop::Options::DEFAULT_MAXIMUM_EXCLUSION_ITEMS.to_s
|
384
|
-
# rubocop:disable Layout/LineLength
|
385
398
|
FORMATTER_OPTION_LIST = RuboCop::Formatter::FormatterSet::BUILTIN_FORMATTERS_FOR_KEYS.keys
|
386
399
|
|
387
400
|
TEXT = {
|
@@ -434,6 +447,8 @@ module RuboCop
|
|
434
447
|
'if no format is specified.'],
|
435
448
|
fail_level: ['Minimum severity (A/R/C/W/E/F) for exit',
|
436
449
|
'with error code.'],
|
450
|
+
display_only_failed: ['Only output offense messages. Omit passing',
|
451
|
+
'cops. Only valid for --format junit.'],
|
437
452
|
display_only_fail_level_offenses:
|
438
453
|
['Only output offense messages at',
|
439
454
|
'the specified --fail-level or above'],
|
@@ -456,8 +471,9 @@ module RuboCop
|
|
456
471
|
lint: 'Run only lint cops.',
|
457
472
|
safe: 'Run only safe cops.',
|
458
473
|
list_target_files: 'List all files RuboCop will inspect.',
|
459
|
-
auto_correct: 'Auto-correct offenses.',
|
460
|
-
|
474
|
+
auto_correct: 'Auto-correct offenses (only when it\'s safe).',
|
475
|
+
safe_autocorrect: '(same, deprecated)',
|
476
|
+
auto_correct_all: 'Auto-correct offenses (safe and unsafe)',
|
461
477
|
fix_layout: 'Run only layout cops, with auto-correct on.',
|
462
478
|
color: 'Force color output on or off.',
|
463
479
|
version: 'Display version.',
|
@@ -468,6 +484,5 @@ module RuboCop
|
|
468
484
|
'reports. This is useful for editor integration.'],
|
469
485
|
init: 'Generate a .rubocop.yml file in the current directory.'
|
470
486
|
}.freeze
|
471
|
-
# rubocop:enable Layout/LineLength
|
472
487
|
end
|
473
488
|
end
|
data/lib/rubocop/path_util.rb
CHANGED
@@ -40,7 +40,7 @@ module RuboCop
|
|
40
40
|
hidden_file_in_not_hidden_dir?(pattern, path)
|
41
41
|
when Regexp
|
42
42
|
begin
|
43
|
-
path
|
43
|
+
pattern.match?(path)
|
44
44
|
rescue ArgumentError => e
|
45
45
|
return false if e.message.start_with?('invalid byte sequence')
|
46
46
|
|
@@ -51,7 +51,7 @@ module RuboCop
|
|
51
51
|
|
52
52
|
# Returns true for an absolute Unix or Windows path.
|
53
53
|
def absolute?(path)
|
54
|
-
|
54
|
+
%r{\A([A-Z]:)?/}i.match?(path)
|
55
55
|
end
|
56
56
|
|
57
57
|
def self.pwd
|