rubocop 0.81.0 → 0.85.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +13 -17
- data/config/default.yml +141 -35
- data/lib/rubocop.rb +17 -61
- data/lib/rubocop/ast_aliases.rb +8 -0
- data/lib/rubocop/cli.rb +13 -7
- data/lib/rubocop/cli/command/auto_genenerate_config.rb +2 -2
- data/lib/rubocop/cli/command/show_cops.rb +2 -6
- data/lib/rubocop/comment_config.rb +1 -1
- data/lib/rubocop/config.rb +14 -2
- data/lib/rubocop/config_loader.rb +37 -33
- data/lib/rubocop/config_loader_resolver.rb +45 -6
- data/lib/rubocop/config_obsoletion.rb +1 -0
- data/lib/rubocop/config_store.rb +12 -2
- data/lib/rubocop/config_validator.rb +18 -1
- data/lib/rubocop/cop/autocorrect_logic.rb +1 -2
- data/lib/rubocop/cop/badge.rb +5 -5
- data/lib/rubocop/cop/bundler/gem_comment.rb +70 -1
- data/lib/rubocop/cop/bundler/insecure_protocol_source.rb +1 -1
- data/lib/rubocop/cop/commissioner.rb +0 -21
- data/lib/rubocop/cop/cop.rb +36 -21
- data/lib/rubocop/cop/corrector.rb +48 -24
- data/lib/rubocop/cop/correctors/alignment_corrector.rb +4 -8
- 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 +4 -4
- 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 -3
- data/lib/rubocop/cop/correctors/string_literal_corrector.rb +2 -2
- data/lib/rubocop/cop/gemspec/ordered_dependencies.rb +1 -3
- data/lib/rubocop/cop/generator.rb +4 -3
- data/lib/rubocop/cop/ignored_node.rb +1 -3
- data/lib/rubocop/cop/internal_affairs/offense_location_keyword.rb +1 -1
- data/lib/rubocop/cop/layout/case_indentation.rb +3 -3
- data/lib/rubocop/cop/layout/class_structure.rb +19 -16
- 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/empty_lines_around_access_modifier.rb +2 -6
- data/lib/rubocop/cop/layout/empty_lines_around_attribute_accessor.rb +126 -0
- data/lib/rubocop/cop/layout/end_of_line.rb +2 -2
- data/lib/rubocop/cop/layout/first_argument_indentation.rb +1 -3
- data/lib/rubocop/cop/layout/first_array_element_indentation.rb +14 -10
- data/lib/rubocop/cop/layout/first_array_element_line_break.rb +1 -1
- data/lib/rubocop/cop/layout/first_hash_element_indentation.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 +6 -6
- data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +5 -9
- data/lib/rubocop/cop/layout/heredoc_indentation.rb +21 -104
- data/lib/rubocop/cop/layout/{tab.rb → indentation_style.rb} +48 -6
- data/lib/rubocop/cop/layout/indentation_width.rb +1 -3
- data/lib/rubocop/cop/layout/leading_comment_space.rb +1 -1
- data/lib/rubocop/cop/layout/line_length.rb +23 -20
- data/lib/rubocop/cop/layout/multiline_block_layout.rb +1 -1
- data/lib/rubocop/cop/layout/multiline_method_argument_line_breaks.rb +1 -3
- data/lib/rubocop/cop/layout/multiline_operation_indentation.rb +13 -4
- data/lib/rubocop/cop/layout/space_around_block_parameters.rb +3 -3
- data/lib/rubocop/cop/layout/space_around_keyword.rb +2 -2
- data/lib/rubocop/cop/layout/space_around_method_call_operator.rb +131 -0
- data/lib/rubocop/cop/layout/space_around_operators.rb +19 -2
- data/lib/rubocop/cop/layout/space_before_comment.rb +1 -3
- data/lib/rubocop/cop/layout/space_in_lambda_literal.rb +1 -1
- data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +1 -3
- data/lib/rubocop/cop/layout/space_inside_block_braces.rb +2 -2
- data/lib/rubocop/cop/layout/space_inside_range_literal.rb +2 -2
- data/lib/rubocop/cop/layout/space_inside_reference_brackets.rb +1 -3
- data/lib/rubocop/cop/layout/trailing_whitespace.rb +2 -2
- data/lib/rubocop/cop/lint/ambiguous_operator.rb +41 -0
- data/lib/rubocop/cop/lint/ambiguous_regexp_literal.rb +14 -0
- data/lib/rubocop/cop/lint/boolean_symbol.rb +2 -2
- data/lib/rubocop/cop/lint/debugger.rb +1 -1
- data/lib/rubocop/cop/lint/deprecated_open_ssl_constant.rb +137 -0
- data/lib/rubocop/cop/lint/duplicate_methods.rb +1 -5
- data/lib/rubocop/cop/lint/empty_when.rb +29 -6
- data/lib/rubocop/cop/lint/ensure_return.rb +19 -2
- data/lib/rubocop/cop/lint/erb_new_arguments.rb +1 -3
- data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +33 -2
- data/lib/rubocop/cop/lint/implicit_string_concatenation.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 +1 -1
- data/lib/rubocop/cop/lint/mixed_regexp_capture_types.rb +69 -0
- data/lib/rubocop/cop/lint/multiple_comparison.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/number_conversion.rb +1 -1
- data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +33 -11
- data/lib/rubocop/cop/lint/percent_string_array.rb +2 -4
- data/lib/rubocop/cop/lint/raise_exception.rb +42 -6
- data/lib/rubocop/cop/lint/redundant_cop_disable_directive.rb +1 -6
- data/lib/rubocop/cop/lint/redundant_require_statement.rb +3 -3
- data/lib/rubocop/cop/lint/redundant_string_coercion.rb +1 -1
- data/lib/rubocop/cop/lint/rescue_exception.rb +1 -1
- data/lib/rubocop/cop/lint/suppressed_exception.rb +11 -4
- data/lib/rubocop/cop/lint/syntax.rb +1 -3
- data/lib/rubocop/cop/lint/unified_integer.rb +0 -2
- data/lib/rubocop/cop/lint/unreachable_code.rb +1 -1
- data/lib/rubocop/cop/lint/uri_regexp.rb +4 -4
- data/lib/rubocop/cop/lint/useless_access_modifier.rb +13 -3
- data/lib/rubocop/cop/lint/useless_assignment.rb +3 -2
- data/lib/rubocop/cop/lint/useless_else_without_rescue.rb +6 -1
- data/lib/rubocop/cop/lint/useless_setter_call.rb +1 -1
- data/lib/rubocop/cop/migration/department_name.rb +7 -7
- data/lib/rubocop/cop/mixin/alignment.rb +1 -3
- data/lib/rubocop/cop/mixin/array_min_size.rb +1 -3
- data/lib/rubocop/cop/mixin/check_line_breakable.rb +3 -9
- data/lib/rubocop/cop/mixin/configurable_enforced_style.rb +1 -3
- data/lib/rubocop/cop/mixin/configurable_formatting.rb +2 -4
- data/lib/rubocop/cop/mixin/frozen_string_literal.rb +10 -1
- data/lib/rubocop/cop/mixin/hash_transform_method.rb +9 -2
- data/lib/rubocop/cop/mixin/ignored_pattern.rb +1 -1
- data/lib/rubocop/cop/mixin/line_length_help.rb +3 -2
- data/lib/rubocop/cop/mixin/parser_diagnostic.rb +1 -1
- data/lib/rubocop/cop/mixin/regexp_literal_help.rb +16 -0
- data/lib/rubocop/cop/mixin/statement_modifier.rb +7 -22
- data/lib/rubocop/cop/mixin/target_ruby_version.rb +5 -1
- data/lib/rubocop/cop/mixin/trailing_comma.rb +2 -4
- data/lib/rubocop/cop/mixin/uncommunicative_name.rb +1 -1
- data/lib/rubocop/cop/naming/class_and_module_camel_case.rb +11 -1
- data/lib/rubocop/cop/naming/constant_name.rb +2 -1
- data/lib/rubocop/cop/naming/file_name.rb +27 -14
- data/lib/rubocop/cop/naming/heredoc_delimiter_naming.rb +1 -1
- data/lib/rubocop/cop/naming/method_name.rb +1 -5
- data/lib/rubocop/cop/naming/predicate_name.rb +1 -1
- data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +1 -1
- data/lib/rubocop/cop/registry.rb +74 -14
- data/lib/rubocop/cop/severity.rb +1 -3
- data/lib/rubocop/cop/style/alias.rb +4 -4
- data/lib/rubocop/cop/style/and_or.rb +7 -8
- data/lib/rubocop/cop/style/array_join.rb +2 -2
- data/lib/rubocop/cop/style/attr.rb +1 -3
- data/lib/rubocop/cop/style/bare_percent_literals.rb +1 -1
- data/lib/rubocop/cop/style/block_delimiters.rb +2 -8
- 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/conditional_assignment.rb +9 -11
- data/lib/rubocop/cop/style/copyright.rb +3 -3
- 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/double_cop_disable_directive.rb +1 -1
- data/lib/rubocop/cop/style/double_negation.rb +41 -4
- 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_literal.rb +1 -3
- data/lib/rubocop/cop/style/empty_method.rb +2 -6
- data/lib/rubocop/cop/style/even_odd.rb +1 -1
- 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/format_string_token.rb +2 -3
- data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +3 -6
- data/lib/rubocop/cop/style/guard_clause.rb +25 -2
- data/lib/rubocop/cop/style/hash_each_methods.rb +4 -4
- data/lib/rubocop/cop/style/hash_syntax.rb +19 -12
- data/lib/rubocop/cop/style/hash_transform_values.rb +0 -3
- data/lib/rubocop/cop/style/if_unless_modifier.rb +23 -3
- data/lib/rubocop/cop/style/if_with_semicolon.rb +16 -0
- data/lib/rubocop/cop/style/inline_comment.rb +1 -1
- data/lib/rubocop/cop/style/lambda.rb +2 -2
- data/lib/rubocop/cop/style/lambda_call.rb +1 -21
- 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/mixin_grouping.rb +1 -1
- data/lib/rubocop/cop/style/module_function.rb +2 -2
- 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_when_then.rb +16 -1
- data/lib/rubocop/cop/style/mutable_constant.rb +2 -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/next.rb +2 -2
- data/lib/rubocop/cop/style/nil_comparison.rb +1 -1
- data/lib/rubocop/cop/style/non_nil_check.rb +5 -5
- 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 +1 -1
- data/lib/rubocop/cop/style/numeric_predicate.rb +1 -1
- data/lib/rubocop/cop/style/one_line_conditional.rb +3 -7
- data/lib/rubocop/cop/style/optional_arguments.rb +1 -1
- data/lib/rubocop/cop/style/or_assignment.rb +1 -1
- 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 +3 -4
- data/lib/rubocop/cop/style/redundant_conditional.rb +5 -4
- 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 +2 -6
- data/lib/rubocop/cop/style/redundant_percent_q.rb +3 -3
- data/lib/rubocop/cop/style/redundant_regexp_character_class.rb +89 -0
- data/lib/rubocop/cop/style/redundant_regexp_escape.rb +130 -0
- data/lib/rubocop/cop/style/redundant_return.rb +5 -7
- data/lib/rubocop/cop/style/redundant_self.rb +1 -1
- 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 +3 -7
- 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 +3 -7
- 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 +2 -2
- data/lib/rubocop/cop/style/symbol_literal.rb +2 -2
- data/lib/rubocop/cop/style/ternary_parentheses.rb +2 -5
- data/lib/rubocop/cop/style/trailing_comma_in_arguments.rb +4 -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 +16 -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 +1 -1
- data/lib/rubocop/cop/style/unless_else.rb +1 -1
- 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/when_then.rb +1 -1
- data/lib/rubocop/cop/style/while_until_modifier.rb +1 -1
- data/lib/rubocop/cop/style/word_array.rb +1 -1
- data/lib/rubocop/cop/style/zero_length_predicate.rb +1 -1
- data/lib/rubocop/cop/team.rb +69 -25
- data/lib/rubocop/cop/util.rb +25 -1
- data/lib/rubocop/cop/utils/format_string.rb +18 -0
- data/lib/rubocop/cop/variable_force.rb +3 -9
- data/lib/rubocop/cop/variable_force/assignment.rb +1 -0
- data/lib/rubocop/cop/variable_force/branch.rb +1 -3
- data/lib/rubocop/cop/variable_force/scope.rb +1 -0
- data/lib/rubocop/cop/variable_force/variable.rb +3 -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 +4 -12
- data/lib/rubocop/formatter/formatter_set.rb +1 -4
- data/lib/rubocop/formatter/junit_formatter.rb +14 -4
- data/lib/rubocop/formatter/pacman_formatter.rb +1 -1
- data/lib/rubocop/magic_comment.rb +1 -1
- data/lib/rubocop/name_similarity.rb +12 -9
- data/lib/rubocop/options.rb +33 -12
- data/lib/rubocop/remote_config.rb +1 -3
- data/lib/rubocop/result_cache.rb +5 -7
- data/lib/rubocop/rspec/cop_helper.rb +3 -26
- data/lib/rubocop/rspec/expect_offense.rb +49 -16
- data/lib/rubocop/rspec/shared_contexts.rb +54 -20
- data/lib/rubocop/runner.rb +21 -14
- data/lib/rubocop/target_finder.rb +7 -7
- data/lib/rubocop/target_ruby.rb +5 -2
- data/lib/rubocop/version.rb +5 -3
- metadata +47 -77
- 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 -57
- 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 -261
- 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 -13
- 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/formatter/disabled_lines_formatter.rb +0 -57
- data/lib/rubocop/node_pattern.rb +0 -887
- data/lib/rubocop/processed_source.rb +0 -216
- data/lib/rubocop/string_util.rb +0 -14
- data/lib/rubocop/token.rb +0 -114
@@ -141,9 +141,7 @@ module RuboCop
|
|
141
141
|
arguments = node.arguments
|
142
142
|
overridden_kwargs = kwargs.dup
|
143
143
|
|
144
|
-
if arguments[2]
|
145
|
-
overridden_kwargs[0] = "trim_mode: #{arguments[2].source}"
|
146
|
-
end
|
144
|
+
overridden_kwargs[0] = "trim_mode: #{arguments[2].source}" if arguments[2]
|
147
145
|
|
148
146
|
if arguments[3] && !arguments[3].hash_type?
|
149
147
|
overridden_kwargs[1] = "eoutvar: #{arguments[3].source}"
|
@@ -7,6 +7,10 @@ module RuboCop
|
|
7
7
|
# expected fields for format/sprintf/#% and what is actually
|
8
8
|
# passed as arguments.
|
9
9
|
#
|
10
|
+
# In addition it checks whether different formats are used in the same
|
11
|
+
# format string. Do not mix numbered, unnumbered, and named formats in
|
12
|
+
# the same format string.
|
13
|
+
#
|
10
14
|
# @example
|
11
15
|
#
|
12
16
|
# # bad
|
@@ -18,16 +22,37 @@ module RuboCop
|
|
18
22
|
# # good
|
19
23
|
#
|
20
24
|
# format('A value: %s and another: %i', a_value, another)
|
25
|
+
#
|
26
|
+
# @example
|
27
|
+
#
|
28
|
+
# # bad
|
29
|
+
#
|
30
|
+
# format('Unnumbered format: %s and numbered: %2$s', a_value, another)
|
31
|
+
#
|
32
|
+
# @example
|
33
|
+
#
|
34
|
+
# # good
|
35
|
+
#
|
36
|
+
# format('Numbered format: %1$s and numbered %2$s', a_value, another)
|
21
37
|
class FormatParameterMismatch < Cop
|
22
38
|
# http://rubular.com/r/CvpbxkcTzy
|
23
39
|
MSG = "Number of arguments (%<arg_num>i) to `%<method>s` doesn't " \
|
24
40
|
'match the number of fields (%<field_num>i).'
|
41
|
+
MSG_INVALID = 'Format string is invalid because formatting sequence types ' \
|
42
|
+
'(numbered, named or unnumbered) are mixed.'
|
25
43
|
|
26
44
|
KERNEL = 'Kernel'
|
27
45
|
SHOVEL = '<<'
|
28
46
|
STRING_TYPES = %i[str dstr].freeze
|
29
47
|
|
30
48
|
def on_send(node)
|
49
|
+
return unless format_string?(node)
|
50
|
+
|
51
|
+
if invalid_format_string?(node)
|
52
|
+
add_offense(node, location: :selector, message: MSG_INVALID)
|
53
|
+
return
|
54
|
+
end
|
55
|
+
|
31
56
|
return unless offending_node?(node)
|
32
57
|
|
33
58
|
add_offense(node, location: :selector)
|
@@ -35,9 +60,15 @@ module RuboCop
|
|
35
60
|
|
36
61
|
private
|
37
62
|
|
63
|
+
def format_string?(node)
|
64
|
+
called_on_string?(node) && method_with_format_args?(node)
|
65
|
+
end
|
66
|
+
|
67
|
+
def invalid_format_string?(node)
|
68
|
+
!RuboCop::Cop::Utils::FormatString.new(node.source).valid?
|
69
|
+
end
|
70
|
+
|
38
71
|
def offending_node?(node)
|
39
|
-
return false unless called_on_string?(node)
|
40
|
-
return false unless method_with_format_args?(node)
|
41
72
|
return false if splat_args?(node)
|
42
73
|
|
43
74
|
num_of_format_args, num_of_expected_fields = count_matches(node)
|
@@ -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
|
@@ -0,0 +1,69 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RuboCop
|
4
|
+
module Cop
|
5
|
+
module Lint
|
6
|
+
# Do not mix named captures and numbered captures in a Regexp literal
|
7
|
+
# because numbered capture is ignored if they're mixed.
|
8
|
+
# Replace numbered captures with non-capturing groupings or
|
9
|
+
# named captures.
|
10
|
+
#
|
11
|
+
# # bad
|
12
|
+
# /(?<foo>FOO)(BAR)/
|
13
|
+
#
|
14
|
+
# # good
|
15
|
+
# /(?<foo>FOO)(?<bar>BAR)/
|
16
|
+
#
|
17
|
+
# # good
|
18
|
+
# /(?<foo>FOO)(?:BAR)/
|
19
|
+
#
|
20
|
+
# # good
|
21
|
+
# /(FOO)(BAR)/
|
22
|
+
#
|
23
|
+
class MixedRegexpCaptureTypes < Cop
|
24
|
+
MSG = 'Do not mix named captures and numbered captures ' \
|
25
|
+
'in a Regexp literal.'
|
26
|
+
|
27
|
+
def on_regexp(node)
|
28
|
+
return if contain_non_literal?(node)
|
29
|
+
|
30
|
+
begin
|
31
|
+
tree = Regexp::Parser.parse(node.content)
|
32
|
+
# Returns if a regular expression that cannot be processed by regexp_parser gem.
|
33
|
+
# https://github.com/rubocop-hq/rubocop/issues/8083
|
34
|
+
rescue Regexp::Scanner::ScannerError
|
35
|
+
return
|
36
|
+
end
|
37
|
+
|
38
|
+
return unless named_capture?(tree)
|
39
|
+
return unless numbered_capture?(tree)
|
40
|
+
|
41
|
+
add_offense(node)
|
42
|
+
end
|
43
|
+
|
44
|
+
private
|
45
|
+
|
46
|
+
def contain_non_literal?(node)
|
47
|
+
if node.respond_to?(:type) && (node.variable? || node.send_type? || node.const_type?)
|
48
|
+
return true
|
49
|
+
end
|
50
|
+
return false unless node.respond_to?(:children)
|
51
|
+
|
52
|
+
node.children.any? { |child| contain_non_literal?(child) }
|
53
|
+
end
|
54
|
+
|
55
|
+
def named_capture?(tree)
|
56
|
+
tree.each_expression.any? do |e|
|
57
|
+
e.instance_of?(Regexp::Expression::Group::Capture)
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
def numbered_capture?(tree)
|
62
|
+
tree.each_expression.any? do |e|
|
63
|
+
e.instance_of?(Regexp::Expression::Group::Named)
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
@@ -52,12 +52,12 @@ module RuboCop
|
|
52
52
|
def autocorrect(node)
|
53
53
|
if unsorted_dir_block?(node)
|
54
54
|
lambda do |corrector|
|
55
|
-
corrector.replace(node
|
55
|
+
corrector.replace(node, "#{node.source}.sort.each")
|
56
56
|
end
|
57
57
|
else
|
58
58
|
lambda do |corrector|
|
59
59
|
source = node.receiver.source
|
60
|
-
corrector.replace(node
|
60
|
+
corrector.replace(node, "#{source}.sort.each")
|
61
61
|
end
|
62
62
|
end
|
63
63
|
end
|
@@ -6,13 +6,13 @@ module RuboCop
|
|
6
6
|
# This cop checks for non-local exits from iterators without a return
|
7
7
|
# value. It registers an offense under these conditions:
|
8
8
|
#
|
9
|
-
#
|
10
|
-
#
|
11
|
-
#
|
12
|
-
#
|
13
|
-
#
|
14
|
-
#
|
15
|
-
#
|
9
|
+
# * No value is returned,
|
10
|
+
# * the block is preceded by a method chain,
|
11
|
+
# * the block has arguments,
|
12
|
+
# * the method which receives the block is not `define_method`
|
13
|
+
# or `define_singleton_method`,
|
14
|
+
# * the return is not contained in an inner scope, e.g. a lambda or a
|
15
|
+
# method definition.
|
16
16
|
#
|
17
17
|
# @example
|
18
18
|
#
|
@@ -9,36 +9,58 @@ module RuboCop
|
|
9
9
|
# @example
|
10
10
|
#
|
11
11
|
# # bad
|
12
|
-
#
|
13
|
-
# puts (x + y)
|
14
|
-
#
|
15
|
-
# @example
|
12
|
+
# do_something (foo)
|
16
13
|
#
|
17
14
|
# # good
|
18
|
-
#
|
19
|
-
#
|
15
|
+
# do_something(foo)
|
16
|
+
# do_something (2 + 3) * 4
|
17
|
+
# do_something (foo * bar).baz
|
20
18
|
class ParenthesesAsGroupedExpression < Cop
|
21
19
|
include RangeHelp
|
22
20
|
|
23
21
|
MSG = '`(...)` interpreted as grouped expression.'
|
24
22
|
|
25
23
|
def on_send(node)
|
26
|
-
return
|
27
|
-
return if node.operator_method? || node.setter_method?
|
28
|
-
|
29
|
-
return unless node.first_argument.source.start_with?('(')
|
24
|
+
return if valid_context?(node)
|
30
25
|
|
31
26
|
space_length = spaces_before_left_parenthesis(node)
|
32
27
|
return unless space_length.positive?
|
33
28
|
|
34
29
|
range = space_range(node.first_argument.source_range, space_length)
|
35
30
|
|
36
|
-
add_offense(
|
31
|
+
add_offense(node, location: range)
|
37
32
|
end
|
38
33
|
alias on_csend on_send
|
39
34
|
|
35
|
+
def autocorrect(node)
|
36
|
+
space_length = spaces_before_left_parenthesis(node)
|
37
|
+
range = space_range(node.first_argument.source_range, space_length)
|
38
|
+
|
39
|
+
lambda do |corrector|
|
40
|
+
corrector.remove(range)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
40
44
|
private
|
41
45
|
|
46
|
+
def valid_context?(node)
|
47
|
+
unless node.arguments.one? && first_argument_starts_with_left_parenthesis?(node)
|
48
|
+
return true
|
49
|
+
end
|
50
|
+
|
51
|
+
node.operator_method? || node.setter_method? || grouped_parentheses?(node)
|
52
|
+
end
|
53
|
+
|
54
|
+
def first_argument_starts_with_left_parenthesis?(node)
|
55
|
+
node.first_argument.source.start_with?('(')
|
56
|
+
end
|
57
|
+
|
58
|
+
def grouped_parentheses?(node)
|
59
|
+
first_argument = node.first_argument
|
60
|
+
|
61
|
+
first_argument.send_type? && first_argument.receiver&.begin_type?
|
62
|
+
end
|
63
|
+
|
42
64
|
def spaces_before_left_parenthesis(node)
|
43
65
|
receiver = node.receiver
|
44
66
|
receiver_length = if receiver
|
@@ -42,15 +42,13 @@ module RuboCop
|
|
42
42
|
|
43
43
|
def autocorrect(node)
|
44
44
|
lambda do |corrector|
|
45
|
-
node.
|
45
|
+
node.each_value do |value|
|
46
46
|
range = value.loc.expression
|
47
47
|
|
48
48
|
match = range.source.match(TRAILING_QUOTE)
|
49
49
|
corrector.remove_trailing(range, match[0].length) if match
|
50
50
|
|
51
|
-
if range.source
|
52
|
-
corrector.remove_leading(range, 1)
|
53
|
-
end
|
51
|
+
corrector.remove_leading(range, 1) if LEADING_QUOTE.match?(range.source)
|
54
52
|
end
|
55
53
|
end
|
56
54
|
end
|
@@ -6,32 +6,68 @@ module RuboCop
|
|
6
6
|
# This cop checks for `raise` or `fail` statements which are
|
7
7
|
# raising `Exception` class.
|
8
8
|
#
|
9
|
+
# You can specify a module name that will be an implicit namespace
|
10
|
+
# using `AllowedImplicitNamespaces` option. The cop cause a false positive
|
11
|
+
# for namespaced `Exception` when a namespace is omitted. This option can
|
12
|
+
# prevent the false positive by specifying a namespace to be omitted for
|
13
|
+
# `Exception`. Alternatively, make `Exception` a fully qualified class
|
14
|
+
# name with an explicit namespace.
|
15
|
+
#
|
9
16
|
# @example
|
10
17
|
# # bad
|
11
18
|
# raise Exception, 'Error message here'
|
12
19
|
#
|
13
20
|
# # good
|
14
21
|
# raise StandardError, 'Error message here'
|
22
|
+
#
|
23
|
+
# @example AllowedImplicitNamespaces: ['Gem']
|
24
|
+
# # good
|
25
|
+
# module Gem
|
26
|
+
# def self.foo
|
27
|
+
# raise Exception # This exception means `Gem::Exception`.
|
28
|
+
# end
|
29
|
+
# end
|
15
30
|
class RaiseException < Cop
|
16
31
|
MSG = 'Use `StandardError` over `Exception`.'
|
17
32
|
|
18
33
|
def_node_matcher :exception?, <<~PATTERN
|
19
|
-
(send nil?
|
34
|
+
(send nil? {:raise :fail} (const ${cbase nil?} :Exception) ... )
|
20
35
|
PATTERN
|
21
36
|
|
22
37
|
def_node_matcher :exception_new_with_message?, <<~PATTERN
|
23
|
-
(send nil?
|
24
|
-
(send (const
|
38
|
+
(send nil? {:raise :fail}
|
39
|
+
(send (const ${cbase nil?} :Exception) :new ... ))
|
25
40
|
PATTERN
|
26
41
|
|
27
42
|
def on_send(node)
|
28
|
-
|
43
|
+
exception?(node, &check(node)) ||
|
44
|
+
exception_new_with_message?(node, &check(node))
|
29
45
|
end
|
30
46
|
|
31
47
|
private
|
32
48
|
|
33
|
-
def
|
34
|
-
|
49
|
+
def check(node)
|
50
|
+
lambda do |cbase|
|
51
|
+
return if cbase.nil? && implicit_namespace?(node)
|
52
|
+
|
53
|
+
add_offense(node)
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
def implicit_namespace?(node)
|
58
|
+
return false unless (parent = node.parent)
|
59
|
+
|
60
|
+
if parent.module_type?
|
61
|
+
namespace = parent.identifier.source
|
62
|
+
|
63
|
+
return allow_implicit_namespaces.include?(namespace)
|
64
|
+
end
|
65
|
+
|
66
|
+
implicit_namespace?(parent)
|
67
|
+
end
|
68
|
+
|
69
|
+
def allow_implicit_namespaces
|
70
|
+
cop_config['AllowedImplicitNamespaces'] || []
|
35
71
|
end
|
36
72
|
end
|
37
73
|
end
|