rubocop 0.82.0 → 0.86.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 +27 -19
- data/config/default.yml +111 -23
- data/lib/rubocop.rb +16 -59
- data/lib/rubocop/ast_aliases.rb +8 -0
- data/lib/rubocop/cli.rb +3 -3
- data/lib/rubocop/cli/command/auto_genenerate_config.rb +2 -2
- 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 +6 -2
- data/lib/rubocop/config_loader.rb +19 -24
- data/lib/rubocop/config_loader_resolver.rb +45 -6
- data/lib/rubocop/config_store.rb +12 -2
- data/lib/rubocop/config_validator.rb +2 -1
- data/lib/rubocop/cop/autocorrect_logic.rb +1 -2
- data/lib/rubocop/cop/bundler/gem_comment.rb +70 -1
- data/lib/rubocop/cop/commissioner.rb +0 -21
- data/lib/rubocop/cop/cop.rb +36 -21
- 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/generator.rb +4 -3
- data/lib/rubocop/cop/generator/configuration_injector.rb +1 -1
- data/lib/rubocop/cop/ignored_node.rb +1 -3
- 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/comment_indentation.rb +3 -3
- data/lib/rubocop/cop/layout/condition_position.rb +12 -2
- 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 +128 -0
- data/lib/rubocop/cop/layout/end_of_line.rb +3 -3
- data/lib/rubocop/cop/layout/first_argument_indentation.rb +2 -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 +7 -7
- 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 +21 -18
- 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_after_colon.rb +1 -1
- 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 +19 -2
- 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/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/constant_resolution.rb +89 -0
- 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/float_out_of_range.rb +1 -1
- data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +38 -2
- data/lib/rubocop/cop/lint/literal_as_condition.rb +10 -13
- 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_percent_literal.rb +1 -1
- data/lib/rubocop/cop/lint/non_local_exit_from_iterator.rb +7 -7
- 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/percent_symbol_array.rb +1 -1
- data/lib/rubocop/cop/lint/raise_exception.rb +12 -4
- data/lib/rubocop/cop/lint/redundant_cop_disable_directive.rb +5 -8
- data/lib/rubocop/cop/lint/redundant_require_statement.rb +3 -3
- 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 +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/unreachable_code.rb +1 -1
- 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/metrics/cyclomatic_complexity.rb +35 -3
- data/lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +1 -1
- 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/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/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/first_element_line_break.rb +1 -1
- data/lib/rubocop/cop/mixin/frozen_string_literal.rb +10 -1
- data/lib/rubocop/cop/mixin/hash_transform_method.rb +8 -1
- 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/multiline_expression_indentation.rb +1 -1
- data/lib/rubocop/cop/mixin/parentheses.rb +1 -2
- data/lib/rubocop/cop/mixin/parser_diagnostic.rb +1 -1
- 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/statement_modifier.rb +7 -23
- data/lib/rubocop/cop/mixin/string_literals_help.rb +1 -1
- data/lib/rubocop/cop/mixin/surrounding_space.rb +3 -3
- 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 +3 -3
- data/lib/rubocop/cop/naming/binary_operator_parameter_name.rb +1 -1
- 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 -5
- data/lib/rubocop/cop/naming/predicate_name.rb +1 -1
- data/lib/rubocop/cop/registry.rb +63 -10
- data/lib/rubocop/cop/severity.rb +1 -3
- 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/block_delimiters.rb +4 -12
- data/lib/rubocop/cop/style/case_equality.rb +1 -1
- data/lib/rubocop/cop/style/class_and_module_children.rb +1 -1
- 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/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 +1 -3
- data/lib/rubocop/cop/style/empty_method.rb +1 -5
- data/lib/rubocop/cop/style/encoding.rb +1 -1
- 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/guard_clause.rb +25 -2
- 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_with_semicolon.rb +16 -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/lambda_call.rb +0 -20
- 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_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/multiline_when_then.rb +16 -1
- 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_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/optional_arguments.rb +1 -1
- data/lib/rubocop/cop/style/percent_literal_delimiters.rb +1 -1
- data/lib/rubocop/cop/style/redundant_conditional.rb +4 -3
- data/lib/rubocop/cop/style/redundant_fetch_block.rb +103 -0
- data/lib/rubocop/cop/style/redundant_parentheses.rb +3 -7
- 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 +121 -0
- data/lib/rubocop/cop/style/redundant_self.rb +6 -9
- 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/slicing_with_range.rb +39 -0
- data/lib/rubocop/cop/style/special_global_vars.rb +2 -6
- data/lib/rubocop/cop/style/struct_inheritance.rb +21 -0
- data/lib/rubocop/cop/style/symbol_array.rb +5 -5
- 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/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/team.rb +69 -25
- data/lib/rubocop/cop/util.rb +27 -3
- 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 +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 +18 -9
- data/lib/rubocop/options.rb +26 -11
- data/lib/rubocop/path_util.rb +2 -2
- data/lib/rubocop/platform.rb +1 -1
- data/lib/rubocop/remote_config.rb +1 -3
- data/lib/rubocop/result_cache.rb +5 -7
- data/lib/rubocop/rspec/cop_helper.rb +2 -25
- data/lib/rubocop/rspec/expect_offense.rb +58 -15
- data/lib/rubocop/rspec/shared_contexts.rb +54 -16
- data/lib/rubocop/runner.rb +20 -13
- data/lib/rubocop/target_finder.rb +8 -8
- data/lib/rubocop/target_ruby.rb +4 -1
- data/lib/rubocop/version.rb +5 -3
- metadata +51 -74
- 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 -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/node_pattern.rb +0 -887
- data/lib/rubocop/processed_source.rb +0 -213
- data/lib/rubocop/string_util.rb +0 -14
- data/lib/rubocop/token.rb +0 -114
@@ -5,7 +5,7 @@ module RuboCop
|
|
5
5
|
module Style
|
6
6
|
# This cop checks for uses of `each_key` and `each_value` Hash methods.
|
7
7
|
#
|
8
|
-
#
|
8
|
+
# NOTE: If you have an array of two-element arrays, you can put
|
9
9
|
# parentheses around the block arguments to indicate that you're not
|
10
10
|
# working with a hash, and suppress RuboCop offenses.
|
11
11
|
#
|
@@ -13,11 +13,11 @@ module RuboCop
|
|
13
13
|
# The supported styles are:
|
14
14
|
#
|
15
15
|
# * ruby19 - forces use of the 1.9 syntax (e.g. `{a: 1}`) when hashes have
|
16
|
-
#
|
16
|
+
# all symbols for keys
|
17
17
|
# * hash_rockets - forces use of hash rockets for all hashes
|
18
18
|
# * no_mixed_keys - simply checks for hashes with mixed syntaxes
|
19
19
|
# * ruby19_no_mixed_keys - forces use of ruby 1.9 syntax and forbids mixed
|
20
|
-
#
|
20
|
+
# syntax hashes
|
21
21
|
#
|
22
22
|
# @example EnforcedStyle: ruby19 (default)
|
23
23
|
# # bad
|
@@ -168,11 +168,7 @@ module RuboCop
|
|
168
168
|
end
|
169
169
|
|
170
170
|
def autocorrect_ruby19(corrector, pair_node)
|
171
|
-
|
172
|
-
op = pair_node.loc.operator
|
173
|
-
|
174
|
-
range = key.join(op)
|
175
|
-
range = range_with_surrounding_space(range: range, side: :right)
|
171
|
+
range = range_for_autocorrect_ruby19(pair_node)
|
176
172
|
|
177
173
|
space = argument_without_space?(pair_node.parent) ? ' ' : ''
|
178
174
|
|
@@ -180,6 +176,19 @@ module RuboCop
|
|
180
176
|
range,
|
181
177
|
range.source.sub(/^:(.*\S)\s*=>\s*$/, space.to_s + '\1: ')
|
182
178
|
)
|
179
|
+
|
180
|
+
hash_node = pair_node.parent
|
181
|
+
return unless hash_node.parent&.return_type? && !hash_node.braces?
|
182
|
+
|
183
|
+
corrector.wrap(hash_node, '{', '}')
|
184
|
+
end
|
185
|
+
|
186
|
+
def range_for_autocorrect_ruby19(pair_node)
|
187
|
+
key = pair_node.key.source_range
|
188
|
+
operator = pair_node.loc.operator
|
189
|
+
|
190
|
+
range = key.join(operator)
|
191
|
+
range_with_surrounding_space(range: range, side: :right)
|
183
192
|
end
|
184
193
|
|
185
194
|
def argument_without_space?(node)
|
@@ -81,7 +81,7 @@ module RuboCop
|
|
81
81
|
|
82
82
|
private
|
83
83
|
|
84
|
-
def check_branches(branches)
|
84
|
+
def check_branches(branches) # rubocop:todo Metrics/CyclomaticComplexity
|
85
85
|
# return if any branch is empty. An empty branch can be an `if`
|
86
86
|
# without an `else` or a branch that contains only comments.
|
87
87
|
return if branches.any?(&:nil?)
|
@@ -61,7 +61,7 @@ module RuboCop
|
|
61
61
|
class IfInsideElse < Cop
|
62
62
|
MSG = 'Convert `if` nested inside `else` to `elsif`.'
|
63
63
|
|
64
|
-
def on_if(node)
|
64
|
+
def on_if(node) # rubocop:todo Metrics/CyclomaticComplexity
|
65
65
|
return if node.ternary? || node.unless?
|
66
66
|
|
67
67
|
else_branch = node.else_branch
|
@@ -19,11 +19,27 @@ module RuboCop
|
|
19
19
|
MSG = 'Do not use if x; Use the ternary operator instead.'
|
20
20
|
|
21
21
|
def on_normal_if_unless(node)
|
22
|
+
return unless node.else_branch
|
23
|
+
|
22
24
|
beginning = node.loc.begin
|
23
25
|
return unless beginning&.is?(';')
|
24
26
|
|
25
27
|
add_offense(node)
|
26
28
|
end
|
29
|
+
|
30
|
+
def autocorrect(node)
|
31
|
+
lambda do |corrector|
|
32
|
+
corrector.replace(node, correct_to_ternary(node))
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
private
|
37
|
+
|
38
|
+
def correct_to_ternary(node)
|
39
|
+
else_code = node.else_branch ? node.else_branch.source : 'nil'
|
40
|
+
|
41
|
+
"#{node.condition.source} ? #{node.if_branch.source} : #{else_code}"
|
42
|
+
end
|
27
43
|
end
|
28
44
|
end
|
29
45
|
end
|
@@ -23,7 +23,7 @@ module RuboCop
|
|
23
23
|
def investigate(processed_source)
|
24
24
|
processed_source.each_comment do |comment|
|
25
25
|
next if comment_line?(processed_source[comment.loc.line - 1]) ||
|
26
|
-
comment.text.match(/\A# rubocop:(enable|disable)/)
|
26
|
+
comment.text.match?(/\A# rubocop:(enable|disable)/)
|
27
27
|
|
28
28
|
add_offense(comment)
|
29
29
|
end
|
@@ -34,7 +34,7 @@ module RuboCop
|
|
34
34
|
# shortcut out if the string does not look like an IP address
|
35
35
|
return false unless could_be_ip?(contents)
|
36
36
|
|
37
|
-
|
37
|
+
::Resolv::IPv4::Regex.match?(contents) || ::Resolv::IPv6::Regex.match?(contents)
|
38
38
|
end
|
39
39
|
|
40
40
|
# Dummy implementation of method in ConfigurableEnforcedStyle that is
|
@@ -52,26 +52,6 @@ module RuboCop
|
|
52
52
|
implicit_style? && !node.implicit_call?
|
53
53
|
end
|
54
54
|
|
55
|
-
def add_parentheses(node, corrector)
|
56
|
-
if node.arguments.empty?
|
57
|
-
corrector.insert_after(node, '()')
|
58
|
-
else
|
59
|
-
corrector.replace(args_begin(node), '(')
|
60
|
-
corrector.insert_after(args_end(node), ')')
|
61
|
-
end
|
62
|
-
end
|
63
|
-
|
64
|
-
def args_begin(node)
|
65
|
-
loc = node.loc
|
66
|
-
selector =
|
67
|
-
node.super_type? || node.yield_type? ? loc.keyword : loc.selector
|
68
|
-
selector.end.resize(1)
|
69
|
-
end
|
70
|
-
|
71
|
-
def args_end(node)
|
72
|
-
node.loc.expression.end
|
73
|
-
end
|
74
|
-
|
75
55
|
def message(_node)
|
76
56
|
if explicit_style?
|
77
57
|
'Prefer the use of `lambda.call(...)` over `lambda.(...)`.'
|
@@ -22,9 +22,7 @@ module RuboCop
|
|
22
22
|
lambda do |corrector|
|
23
23
|
corrector.replace(args_begin(node), '(')
|
24
24
|
|
25
|
-
unless args_parenthesized?(node)
|
26
|
-
corrector.insert_after(args_end(node), ')')
|
27
|
-
end
|
25
|
+
corrector.insert_after(args_end(node), ')') unless args_parenthesized?(node)
|
28
26
|
end
|
29
27
|
end
|
30
28
|
|
@@ -41,9 +41,7 @@ module RuboCop
|
|
41
41
|
|
42
42
|
def same_name_assignment?(node)
|
43
43
|
any_assignment?(node) do |asgn_node|
|
44
|
-
if asgn_node.masgn_type?
|
45
|
-
next variable_in_mass_assignment?(node.method_name, asgn_node)
|
46
|
-
end
|
44
|
+
next variable_in_mass_assignment?(node.method_name, asgn_node) if asgn_node.masgn_type?
|
47
45
|
|
48
46
|
asgn_node.loc.name.source == node.method_name.to_s
|
49
47
|
end
|
@@ -17,12 +17,11 @@ module RuboCop
|
|
17
17
|
#
|
18
18
|
# # good
|
19
19
|
# a = cond ? b : c
|
20
|
-
# a =
|
21
|
-
#
|
22
|
-
#
|
23
|
-
#
|
24
|
-
#
|
25
|
-
# end
|
20
|
+
# a = if cond
|
21
|
+
# b
|
22
|
+
# else
|
23
|
+
# c
|
24
|
+
# end
|
26
25
|
class MultilineTernaryOperator < Cop
|
27
26
|
MSG = 'Avoid multi-line ternary operators, ' \
|
28
27
|
'use `if` or `unless` instead.'
|
@@ -32,6 +31,18 @@ module RuboCop
|
|
32
31
|
|
33
32
|
add_offense(node)
|
34
33
|
end
|
34
|
+
|
35
|
+
def autocorrect(node)
|
36
|
+
lambda do |corrector|
|
37
|
+
corrector.replace(node, <<~RUBY.chop)
|
38
|
+
if #{node.condition.source}
|
39
|
+
#{node.if_branch.source}
|
40
|
+
else
|
41
|
+
#{node.else_branch.source}
|
42
|
+
end
|
43
|
+
RUBY
|
44
|
+
end
|
45
|
+
end
|
35
46
|
end
|
36
47
|
end
|
37
48
|
end
|
@@ -22,6 +22,12 @@ module RuboCop
|
|
22
22
|
# when bar then do_something
|
23
23
|
# end
|
24
24
|
#
|
25
|
+
# # good
|
26
|
+
# case foo
|
27
|
+
# when bar then do_something(arg1,
|
28
|
+
# arg2)
|
29
|
+
# end
|
30
|
+
#
|
25
31
|
class MultilineWhenThen < Cop
|
26
32
|
include RangeHelp
|
27
33
|
|
@@ -32,7 +38,10 @@ module RuboCop
|
|
32
38
|
return unless node.then?
|
33
39
|
|
34
40
|
# Single line usage of `then` is not an offense
|
35
|
-
return if !node.children.last.nil? && !node.multiline?
|
41
|
+
return if !node.children.last.nil? && !node.multiline?
|
42
|
+
|
43
|
+
# Requires `then` for write `when` and its body on the same line.
|
44
|
+
return if require_then?(node)
|
36
45
|
|
37
46
|
# With more than one statements after then, there's not offense
|
38
47
|
return if accept_node_type?(node.body)
|
@@ -50,6 +59,12 @@ module RuboCop
|
|
50
59
|
end
|
51
60
|
end
|
52
61
|
|
62
|
+
def require_then?(when_node)
|
63
|
+
return false unless when_node.body
|
64
|
+
|
65
|
+
when_node.loc.line == when_node.body.loc.line
|
66
|
+
end
|
67
|
+
|
53
68
|
def accept_node_type?(node)
|
54
69
|
node&.begin_type? || node&.array_type? || node&.hash_type?
|
55
70
|
end
|
@@ -6,9 +6,9 @@ module RuboCop
|
|
6
6
|
# Checks for uses of if with a negated condition. Only ifs
|
7
7
|
# without else are considered. There are three different styles:
|
8
8
|
#
|
9
|
-
#
|
10
|
-
#
|
11
|
-
#
|
9
|
+
# * both
|
10
|
+
# * prefix
|
11
|
+
# * postfix
|
12
12
|
#
|
13
13
|
# @example EnforcedStyle: both (default)
|
14
14
|
# # enforces `unless` for `prefix` and `postfix` conditionals
|
@@ -6,9 +6,9 @@ module RuboCop
|
|
6
6
|
# Checks for uses of unless with a negated condition. Only unless
|
7
7
|
# without else are considered. There are three different styles:
|
8
8
|
#
|
9
|
-
#
|
10
|
-
#
|
11
|
-
#
|
9
|
+
# * both
|
10
|
+
# * prefix
|
11
|
+
# * postfix
|
12
12
|
#
|
13
13
|
# @example EnforcedStyle: both (default)
|
14
14
|
# # enforces `if` for `prefix` and `postfix` conditionals
|
@@ -26,6 +26,33 @@ module RuboCop
|
|
26
26
|
add_offense(nested_ternary)
|
27
27
|
end
|
28
28
|
end
|
29
|
+
|
30
|
+
def autocorrect(node)
|
31
|
+
if_node = if_node(node)
|
32
|
+
|
33
|
+
lambda do |corrector|
|
34
|
+
corrector.replace(if_node, <<~RUBY.chop)
|
35
|
+
if #{if_node.condition.source}
|
36
|
+
#{remove_parentheses(if_node.if_branch.source)}
|
37
|
+
else
|
38
|
+
#{if_node.else_branch.source}
|
39
|
+
end
|
40
|
+
RUBY
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
private
|
45
|
+
|
46
|
+
def if_node(node)
|
47
|
+
node = node.parent
|
48
|
+
return node if node.if_type?
|
49
|
+
|
50
|
+
if_node(node)
|
51
|
+
end
|
52
|
+
|
53
|
+
def remove_parentheses(source)
|
54
|
+
source.gsub(/\A\(/, '').gsub(/\)\z/, '')
|
55
|
+
end
|
29
56
|
end
|
30
57
|
end
|
31
58
|
end
|
@@ -191,7 +191,7 @@ module RuboCop
|
|
191
191
|
end
|
192
192
|
|
193
193
|
def end_followed_by_whitespace_only?(source_buffer, end_pos)
|
194
|
-
source_buffer.source[end_pos..-1]
|
194
|
+
/\A\s*$/.match?(source_buffer.source[end_pos..-1])
|
195
195
|
end
|
196
196
|
|
197
197
|
def reindentable_lines(node)
|
@@ -201,7 +201,7 @@ module RuboCop
|
|
201
201
|
lines = (node.source_range.line + 1)...node.loc.end.line
|
202
202
|
lines = lines.to_a - heredoc_lines(node)
|
203
203
|
# Skip blank lines
|
204
|
-
lines.reject { |lineno| buffer.source_line(lineno)
|
204
|
+
lines.reject { |lineno| /\A\s*\z/.match?(buffer.source_line(lineno)) }
|
205
205
|
end
|
206
206
|
|
207
207
|
# Adjust indentation of `lines` to match `node`
|
@@ -11,7 +11,7 @@ module RuboCop
|
|
11
11
|
#
|
12
12
|
# With `IncludeSemanticChanges` set to `true`, this cop reports offenses
|
13
13
|
# for `!x.nil?` and autocorrects that and `x != nil` to solely `x`, which
|
14
|
-
# is
|
14
|
+
# is *usually* OK, but might change behavior.
|
15
15
|
#
|
16
16
|
# @example
|
17
17
|
# # bad
|
@@ -77,9 +77,9 @@ module RuboCop
|
|
77
77
|
end
|
78
78
|
|
79
79
|
def octal_literal_type(literal)
|
80
|
-
if literal
|
80
|
+
if OCTAL_ZERO_ONLY_REGEX.match?(literal) && octal_zero_only?
|
81
81
|
:octal_zero_only
|
82
|
-
elsif literal
|
82
|
+
elsif OCTAL_REGEX.match?(literal) && !octal_zero_only?
|
83
83
|
:octal
|
84
84
|
end
|
85
85
|
end
|
@@ -49,13 +49,9 @@ module RuboCop
|
|
49
49
|
def replacement(node)
|
50
50
|
return to_ternary(node) unless node.parent
|
51
51
|
|
52
|
-
if %i[and or].include?(node.parent.type)
|
53
|
-
return "(#{to_ternary(node)})"
|
54
|
-
end
|
52
|
+
return "(#{to_ternary(node)})" if %i[and or].include?(node.parent.type)
|
55
53
|
|
56
|
-
if node.parent.send_type? && node.parent.operator_method?
|
57
|
-
return "(#{to_ternary(node)})"
|
58
|
-
end
|
54
|
+
return "(#{to_ternary(node)})" if node.parent.send_type? && node.parent.operator_method?
|
59
55
|
|
60
56
|
to_ternary(node)
|
61
57
|
end
|
@@ -27,7 +27,8 @@ module RuboCop
|
|
27
27
|
class RedundantConditional < Cop
|
28
28
|
include Alignment
|
29
29
|
|
30
|
-
|
30
|
+
operators = RuboCop::AST::Node::COMPARISON_OPERATORS.to_a
|
31
|
+
COMPARISON_OPERATOR_MATCHER = "{:#{operators.join(' :')}}"
|
31
32
|
|
32
33
|
MSG = 'This conditional expression can just be replaced ' \
|
33
34
|
'by `%<msg>s`.'
|
@@ -54,11 +55,11 @@ module RuboCop
|
|
54
55
|
end
|
55
56
|
|
56
57
|
def_node_matcher :redundant_condition?, <<~RUBY
|
57
|
-
(if (send _ {
|
58
|
+
(if (send _ #{COMPARISON_OPERATOR_MATCHER} _) true false)
|
58
59
|
RUBY
|
59
60
|
|
60
61
|
def_node_matcher :redundant_condition_inverted?, <<~RUBY
|
61
|
-
(if (send _ {
|
62
|
+
(if (send _ #{COMPARISON_OPERATOR_MATCHER} _) false true)
|
62
63
|
RUBY
|
63
64
|
|
64
65
|
def offense?(node)
|
@@ -0,0 +1,103 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RuboCop
|
4
|
+
module Cop
|
5
|
+
module Style
|
6
|
+
# This cop identifies places where `fetch(key) { value }`
|
7
|
+
# can be replaced by `fetch(key, value)`.
|
8
|
+
#
|
9
|
+
# In such cases `fetch(key, value)` method is faster
|
10
|
+
# than `fetch(key) { value }`.
|
11
|
+
#
|
12
|
+
# @example SafeForConstants: false (default)
|
13
|
+
# # bad
|
14
|
+
# hash.fetch(:key) { 5 }
|
15
|
+
# hash.fetch(:key) { true }
|
16
|
+
# hash.fetch(:key) { nil }
|
17
|
+
# array.fetch(5) { :value }
|
18
|
+
# ENV.fetch(:key) { 'value' }
|
19
|
+
#
|
20
|
+
# # good
|
21
|
+
# hash.fetch(:key, 5)
|
22
|
+
# hash.fetch(:key, true)
|
23
|
+
# hash.fetch(:key, nil)
|
24
|
+
# array.fetch(5, :value)
|
25
|
+
# ENV.fetch(:key, 'value')
|
26
|
+
#
|
27
|
+
# @example SafeForConstants: true
|
28
|
+
# # bad
|
29
|
+
# ENV.fetch(:key) { VALUE }
|
30
|
+
#
|
31
|
+
# # good
|
32
|
+
# ENV.fetch(:key, VALUE)
|
33
|
+
#
|
34
|
+
class RedundantFetchBlock < Cop
|
35
|
+
include FrozenStringLiteral
|
36
|
+
include RangeHelp
|
37
|
+
|
38
|
+
MSG = 'Use `%<good>s` instead of `%<bad>s`.'
|
39
|
+
|
40
|
+
def_node_matcher :redundant_fetch_block_candidate?, <<~PATTERN
|
41
|
+
(block
|
42
|
+
$(send _ :fetch _)
|
43
|
+
(args)
|
44
|
+
${#basic_literal? const_type?})
|
45
|
+
PATTERN
|
46
|
+
|
47
|
+
def on_block(node)
|
48
|
+
redundant_fetch_block_candidate?(node) do |send, body|
|
49
|
+
return if body.const_type? && !check_for_constant?
|
50
|
+
return if body.str_type? && !check_for_string?
|
51
|
+
|
52
|
+
range = fetch_range(send, node)
|
53
|
+
good = build_good_method(send, body)
|
54
|
+
bad = build_bad_method(send, body)
|
55
|
+
|
56
|
+
add_offense(
|
57
|
+
node,
|
58
|
+
location: range,
|
59
|
+
message: format(MSG, good: good, bad: bad)
|
60
|
+
)
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
def autocorrect(node)
|
65
|
+
redundant_fetch_block_candidate?(node) do |send, body|
|
66
|
+
lambda do |corrector|
|
67
|
+
receiver, _, key = send.children
|
68
|
+
corrector.replace(node, "#{receiver.source}.fetch(#{key.source}, #{body.source})")
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
private
|
74
|
+
|
75
|
+
def basic_literal?(node)
|
76
|
+
node.basic_literal?
|
77
|
+
end
|
78
|
+
|
79
|
+
def fetch_range(send, node)
|
80
|
+
range_between(send.loc.selector.begin_pos, node.loc.end.end_pos)
|
81
|
+
end
|
82
|
+
|
83
|
+
def build_good_method(send, body)
|
84
|
+
key = send.children[2].source
|
85
|
+
"fetch(#{key}, #{body.source})"
|
86
|
+
end
|
87
|
+
|
88
|
+
def build_bad_method(send, body)
|
89
|
+
key = send.children[2].source
|
90
|
+
"fetch(#{key}) { #{body.source} }"
|
91
|
+
end
|
92
|
+
|
93
|
+
def check_for_constant?
|
94
|
+
cop_config['SafeForConstants']
|
95
|
+
end
|
96
|
+
|
97
|
+
def check_for_string?
|
98
|
+
frozen_string_literals_enabled?
|
99
|
+
end
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|