rubocop 0.85.0 → 0.88.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 +25 -17
- data/bin/rubocop-profile +31 -0
- data/config/default.yml +132 -11
- data/lib/rubocop.rb +17 -1
- 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 +1 -1
- data/lib/rubocop/config.rb +1 -1
- data/lib/rubocop/config_loader.rb +39 -67
- data/lib/rubocop/config_loader_resolver.rb +1 -1
- data/lib/rubocop/config_obsoletion.rb +0 -1
- data/lib/rubocop/config_store.rb +4 -0
- data/lib/rubocop/cop/autocorrect_logic.rb +14 -24
- data/lib/rubocop/cop/badge.rb +1 -1
- data/lib/rubocop/cop/base.rb +407 -0
- data/lib/rubocop/cop/bundler/insecure_protocol_source.rb +10 -20
- data/lib/rubocop/cop/commissioner.rb +48 -50
- data/lib/rubocop/cop/cop.rb +91 -235
- data/lib/rubocop/cop/corrector.rb +38 -115
- data/lib/rubocop/cop/correctors/multiline_literal_brace_corrector.rb +26 -0
- data/lib/rubocop/cop/gemspec/required_ruby_version.rb +7 -2
- data/lib/rubocop/cop/gemspec/ruby_version_globals_usage.rb +1 -1
- data/lib/rubocop/cop/generator.rb +1 -1
- data/lib/rubocop/cop/generator/configuration_injector.rb +1 -1
- data/lib/rubocop/cop/internal_affairs/node_type_predicate.rb +11 -14
- data/lib/rubocop/cop/layout/case_indentation.rb +18 -19
- data/lib/rubocop/cop/layout/class_structure.rb +2 -37
- 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 +1 -0
- data/lib/rubocop/cop/layout/empty_lines_around_attribute_accessor.rb +3 -8
- data/lib/rubocop/cop/layout/end_alignment.rb +3 -2
- data/lib/rubocop/cop/layout/end_of_line.rb +1 -1
- data/lib/rubocop/cop/layout/first_argument_indentation.rb +5 -1
- data/lib/rubocop/cop/layout/first_array_element_line_break.rb +1 -1
- data/lib/rubocop/cop/layout/hash_alignment.rb +2 -3
- data/lib/rubocop/cop/layout/heredoc_indentation.rb +1 -1
- data/lib/rubocop/cop/layout/multiline_block_layout.rb +17 -7
- data/lib/rubocop/cop/layout/space_after_colon.rb +1 -1
- data/lib/rubocop/cop/layout/space_around_block_parameters.rb +22 -27
- data/lib/rubocop/cop/layout/space_around_keyword.rb +2 -2
- data/lib/rubocop/cop/layout/space_around_method_call_operator.rb +27 -68
- 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_inside_array_literal_brackets.rb +4 -3
- 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/legacy/corrections_proxy.rb +49 -0
- data/lib/rubocop/cop/legacy/corrector.rb +29 -0
- data/lib/rubocop/cop/lint/constant_resolution.rb +89 -0
- data/lib/rubocop/cop/lint/deprecated_open_ssl_constant.rb +4 -4
- data/lib/rubocop/cop/lint/disjunctive_assignment_in_constructor.rb +8 -2
- data/lib/rubocop/cop/lint/duplicate_elsif_condition.rb +39 -0
- data/lib/rubocop/cop/lint/duplicate_methods.rb +2 -2
- 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/implicit_string_concatenation.rb +3 -2
- data/lib/rubocop/cop/lint/interpolation_check.rb +13 -0
- data/lib/rubocop/cop/lint/literal_as_condition.rb +11 -1
- data/lib/rubocop/cop/lint/mixed_regexp_capture_types.rb +8 -1
- data/lib/rubocop/cop/lint/nested_method_definition.rb +14 -20
- data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +69 -2
- data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +8 -3
- data/lib/rubocop/cop/lint/percent_string_array.rb +1 -1
- 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_splat_expansion.rb +2 -2
- data/lib/rubocop/cop/lint/regexp_as_condition.rb +6 -0
- data/lib/rubocop/cop/lint/safe_navigation_with_empty.rb +9 -1
- data/lib/rubocop/cop/lint/suppressed_exception.rb +1 -1
- data/lib/rubocop/cop/lint/syntax.rb +11 -26
- data/lib/rubocop/cop/lint/unused_method_argument.rb +1 -1
- data/lib/rubocop/cop/lint/useless_access_modifier.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/mixin/allowed_methods.rb +19 -0
- data/lib/rubocop/cop/mixin/auto_corrector.rb +12 -0
- data/lib/rubocop/cop/mixin/code_length.rb +4 -0
- data/lib/rubocop/cop/mixin/configurable_formatting.rb +1 -1
- 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/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 +27 -0
- data/lib/rubocop/cop/mixin/statement_modifier.rb +3 -3
- 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 +1 -1
- data/lib/rubocop/cop/mixin/uncommunicative_name.rb +6 -4
- data/lib/rubocop/cop/mixin/visibility_help.rb +50 -0
- 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/file_name.rb +1 -3
- 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 +3 -5
- 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 +62 -7
- data/lib/rubocop/cop/style/accessor_grouping.rb +147 -0
- data/lib/rubocop/cop/style/array_coercion.rb +63 -0
- data/lib/rubocop/cop/style/auto_resource_cleanup.rb +3 -2
- data/lib/rubocop/cop/style/bare_percent_literals.rb +1 -1
- data/lib/rubocop/cop/style/bisected_attr_accessor.rb +146 -0
- data/lib/rubocop/cop/style/block_delimiters.rb +2 -4
- data/lib/rubocop/cop/style/case_like_if.rb +217 -0
- 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 +5 -2
- data/lib/rubocop/cop/style/conditional_assignment.rb +2 -2
- data/lib/rubocop/cop/style/copyright.rb +3 -3
- 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/empty_case_condition.rb +8 -6
- data/lib/rubocop/cop/style/empty_literal.rb +5 -5
- 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 +8 -10
- data/lib/rubocop/cop/style/float_division.rb +7 -10
- data/lib/rubocop/cop/style/format_string_token.rb +5 -5
- data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +1 -1
- data/lib/rubocop/cop/style/hash_as_last_array_item.rb +62 -0
- data/lib/rubocop/cop/style/hash_like_case.rb +76 -0
- 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.rb +11 -11
- data/lib/rubocop/cop/style/if_unless_modifier_of_if_unless.rb +12 -0
- 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/missing_else.rb +1 -11
- 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_ternary_operator.rb +17 -6
- data/lib/rubocop/cop/style/mutable_constant.rb +4 -4
- 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/numeric_literal_prefix.rb +2 -2
- data/lib/rubocop/cop/style/numeric_predicate.rb +3 -4
- data/lib/rubocop/cop/style/parallel_assignment.rb +3 -3
- 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_file_extension_in_require.rb +50 -0
- data/lib/rubocop/cop/style/redundant_freeze.rb +1 -1
- data/lib/rubocop/cop/style/redundant_parentheses.rb +8 -2
- data/lib/rubocop/cop/style/redundant_percent_q.rb +2 -2
- data/lib/rubocop/cop/style/redundant_regexp_character_class.rb +4 -3
- data/lib/rubocop/cop/style/redundant_regexp_escape.rb +14 -23
- data/lib/rubocop/cop/style/redundant_self.rb +6 -9
- data/lib/rubocop/cop/style/redundant_sort.rb +3 -2
- data/lib/rubocop/cop/style/rescue_standard_error.rb +1 -1
- 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/stabby_lambda_parentheses.rb +3 -2
- 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 +1 -1
- data/lib/rubocop/cop/style/trailing_method_end_statement.rb +9 -32
- data/lib/rubocop/cop/style/trivial_accessors.rb +8 -7
- 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 +105 -81
- data/lib/rubocop/cop/util.rb +2 -2
- data/lib/rubocop/cop/utils/format_string.rb +19 -2
- data/lib/rubocop/cop/variable_force/variable.rb +5 -3
- data/lib/rubocop/file_finder.rb +12 -12
- data/lib/rubocop/formatter/disabled_config_formatter.rb +2 -2
- data/lib/rubocop/formatter/formatter_set.rb +1 -1
- data/lib/rubocop/name_similarity.rb +7 -3
- data/lib/rubocop/options.rb +15 -8
- data/lib/rubocop/path_util.rb +4 -19
- data/lib/rubocop/platform.rb +1 -1
- data/lib/rubocop/rake_task.rb +6 -9
- data/lib/rubocop/result_cache.rb +12 -8
- data/lib/rubocop/rspec/cop_helper.rb +4 -4
- data/lib/rubocop/rspec/expect_offense.rb +65 -21
- data/lib/rubocop/rspec/shared_contexts.rb +19 -16
- data/lib/rubocop/runner.rb +34 -33
- data/lib/rubocop/target_finder.rb +3 -3
- data/lib/rubocop/target_ruby.rb +2 -2
- data/lib/rubocop/version.rb +1 -1
- metadata +34 -9
- data/lib/rubocop/cop/mixin/classish_length.rb +0 -37
@@ -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)
|
@@ -16,21 +16,22 @@ module RuboCop
|
|
16
16
|
#
|
17
17
|
# # Good
|
18
18
|
# raise 'message'
|
19
|
-
class RedundantException <
|
19
|
+
class RedundantException < Base
|
20
|
+
extend AutoCorrector
|
21
|
+
|
20
22
|
MSG_1 = 'Redundant `RuntimeError` argument can be removed.'
|
21
23
|
MSG_2 = 'Redundant `RuntimeError.new` call can be replaced with ' \
|
22
24
|
'just the message.'
|
23
25
|
|
26
|
+
# Switch `raise RuntimeError, 'message'` to `raise 'message'`, and
|
27
|
+
# `raise RuntimeError.new('message')` to `raise 'message'`.
|
24
28
|
def on_send(node)
|
25
|
-
|
26
|
-
compact?(node) { add_offense(node, message: MSG_2) }
|
29
|
+
fix_exploded(node) || fix_compact(node)
|
27
30
|
end
|
28
31
|
|
29
|
-
|
30
|
-
# `raise RuntimeError.new('message')` to `raise 'message'`.
|
31
|
-
def autocorrect(node) # rubocop:disable Metrics/MethodLength
|
32
|
+
def fix_exploded(node)
|
32
33
|
exploded?(node) do |command, message|
|
33
|
-
|
34
|
+
add_offense(node, message: MSG_1) do |corrector|
|
34
35
|
if node.parenthesized?
|
35
36
|
corrector.replace(node,
|
36
37
|
"#{command}(#{message.source})")
|
@@ -40,19 +41,22 @@ module RuboCop
|
|
40
41
|
end
|
41
42
|
end
|
42
43
|
end
|
44
|
+
end
|
45
|
+
|
46
|
+
def fix_compact(node)
|
43
47
|
compact?(node) do |new_call, message|
|
44
|
-
|
48
|
+
add_offense(node, message: MSG_2) do |corrector|
|
45
49
|
corrector.replace(new_call, message.source)
|
46
50
|
end
|
47
51
|
end
|
48
52
|
end
|
49
53
|
|
50
54
|
def_node_matcher :exploded?, <<~PATTERN
|
51
|
-
(send nil? ${:raise :fail} (const nil? :RuntimeError) $_)
|
55
|
+
(send nil? ${:raise :fail} (const {nil? cbase} :RuntimeError) $_)
|
52
56
|
PATTERN
|
53
57
|
|
54
58
|
def_node_matcher :compact?, <<~PATTERN
|
55
|
-
(send nil? {:raise :fail} $(send (const nil? :RuntimeError) :new $_))
|
59
|
+
(send nil? {:raise :fail} $(send (const {nil? cbase} :RuntimeError) :new $_))
|
56
60
|
PATTERN
|
57
61
|
end
|
58
62
|
end
|
@@ -0,0 +1,122 @@
|
|
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
|
+
${nil? #basic_literal? #const_type?})
|
45
|
+
PATTERN
|
46
|
+
|
47
|
+
def on_block(node)
|
48
|
+
redundant_fetch_block_candidate?(node) do |send, body|
|
49
|
+
return if should_not_check?(send, body)
|
50
|
+
|
51
|
+
range = fetch_range(send, node)
|
52
|
+
good = build_good_method(send, body)
|
53
|
+
bad = build_bad_method(send, body)
|
54
|
+
|
55
|
+
add_offense(
|
56
|
+
node,
|
57
|
+
location: range,
|
58
|
+
message: format(MSG, good: good, bad: bad)
|
59
|
+
)
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
def autocorrect(node)
|
64
|
+
redundant_fetch_block_candidate?(node) do |send, body|
|
65
|
+
lambda do |corrector|
|
66
|
+
receiver, _, key = send.children
|
67
|
+
default_value = body ? body.source : 'nil'
|
68
|
+
|
69
|
+
corrector.replace(node, "#{receiver.source}.fetch(#{key.source}, #{default_value})")
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
private
|
75
|
+
|
76
|
+
def basic_literal?(node)
|
77
|
+
node&.basic_literal?
|
78
|
+
end
|
79
|
+
|
80
|
+
def const_type?(node)
|
81
|
+
node&.const_type?
|
82
|
+
end
|
83
|
+
|
84
|
+
def should_not_check?(send, body)
|
85
|
+
(body&.const_type? && !check_for_constant?) ||
|
86
|
+
(body&.str_type? && !check_for_string?) ||
|
87
|
+
rails_cache?(send.receiver)
|
88
|
+
end
|
89
|
+
|
90
|
+
def_node_matcher :rails_cache?, <<~PATTERN
|
91
|
+
(send (const _ :Rails) :cache)
|
92
|
+
PATTERN
|
93
|
+
|
94
|
+
def fetch_range(send, node)
|
95
|
+
range_between(send.loc.selector.begin_pos, node.loc.end.end_pos)
|
96
|
+
end
|
97
|
+
|
98
|
+
def build_good_method(send, body)
|
99
|
+
key = send.children[2].source
|
100
|
+
default_value = body ? body.source : 'nil'
|
101
|
+
|
102
|
+
"fetch(#{key}, #{default_value})"
|
103
|
+
end
|
104
|
+
|
105
|
+
def build_bad_method(send, body)
|
106
|
+
key = send.children[2].source
|
107
|
+
block = body ? "{ #{body.source} }" : '{}'
|
108
|
+
|
109
|
+
"fetch(#{key}) #{block}"
|
110
|
+
end
|
111
|
+
|
112
|
+
def check_for_constant?
|
113
|
+
cop_config['SafeForConstants']
|
114
|
+
end
|
115
|
+
|
116
|
+
def check_for_string?
|
117
|
+
frozen_string_literals_enabled?
|
118
|
+
end
|
119
|
+
end
|
120
|
+
end
|
121
|
+
end
|
122
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RuboCop
|
4
|
+
module Cop
|
5
|
+
module Style
|
6
|
+
# This cop checks for the presence of superfluous `.rb` extension in
|
7
|
+
# the filename provided to `require` and `require_relative`.
|
8
|
+
#
|
9
|
+
# Note: If the extension is omitted, Ruby tries adding '.rb', '.so',
|
10
|
+
# and so on to the name until found. If the file named cannot be found,
|
11
|
+
# a `LoadError` will be raised.
|
12
|
+
# There is an edge case where `foo.so` file is loaded instead of a `LoadError`
|
13
|
+
# if `foo.so` file exists when `require 'foo.rb'` will be changed to `require 'foo'`,
|
14
|
+
# but that seems harmless.
|
15
|
+
#
|
16
|
+
# @example
|
17
|
+
# # bad
|
18
|
+
# require 'foo.rb'
|
19
|
+
# require_relative '../foo.rb'
|
20
|
+
#
|
21
|
+
# # good
|
22
|
+
# require 'foo'
|
23
|
+
# require 'foo.so'
|
24
|
+
# require_relative '../foo'
|
25
|
+
# require_relative '../foo.so'
|
26
|
+
#
|
27
|
+
class RedundantFileExtensionInRequire < Cop
|
28
|
+
MSG = 'Redundant `.rb` file extension detected.'
|
29
|
+
|
30
|
+
def_node_matcher :require_call?, <<~PATTERN
|
31
|
+
(send nil? {:require :require_relative} $str_type?)
|
32
|
+
PATTERN
|
33
|
+
|
34
|
+
def on_send(node)
|
35
|
+
require_call?(node) do |name_node|
|
36
|
+
add_offense(name_node) if name_node.value.end_with?('.rb')
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def autocorrect(node)
|
41
|
+
correction = node.value.sub(/\.rb\z/, '')
|
42
|
+
|
43
|
+
lambda do |corrector|
|
44
|
+
corrector.replace(node, "'#{correction}'")
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
@@ -56,7 +56,7 @@ module RuboCop
|
|
56
56
|
(begin (send {float int} {:+ :- :* :** :/ :% :<<} _))
|
57
57
|
(begin (send !(str _) {:+ :- :* :** :/ :%} {float int}))
|
58
58
|
(begin (send _ {:== :=== :!= :<= :>= :< :>} _))
|
59
|
-
(send (const nil? :ENV) :[] _)
|
59
|
+
(send (const {nil? cbase} :ENV) :[] _)
|
60
60
|
(send _ {:count :length :size} ...)
|
61
61
|
(block (send _ {:count :length :size} ...) ...)
|
62
62
|
}
|
@@ -156,7 +156,7 @@ module RuboCop
|
|
156
156
|
source_buffer = node.source_range.source_buffer
|
157
157
|
line_range = source_buffer.line_range(node.loc.end.line)
|
158
158
|
|
159
|
-
|
159
|
+
/^\s*\)\s*,/.match?(line_range.source)
|
160
160
|
end
|
161
161
|
|
162
162
|
def disallowed_literal?(begin_node, node)
|
@@ -205,7 +205,9 @@ module RuboCop
|
|
205
205
|
end
|
206
206
|
|
207
207
|
def first_argument?(node)
|
208
|
-
first_send_argument?(node) ||
|
208
|
+
first_send_argument?(node) ||
|
209
|
+
first_super_argument?(node) ||
|
210
|
+
first_yield_argument?(node)
|
209
211
|
end
|
210
212
|
|
211
213
|
def_node_matcher :first_send_argument?, <<~PATTERN
|
@@ -216,6 +218,10 @@ module RuboCop
|
|
216
218
|
^(super equal?(%0) ...)
|
217
219
|
PATTERN
|
218
220
|
|
221
|
+
def_node_matcher :first_yield_argument?, <<~PATTERN
|
222
|
+
^(yield equal?(%0) ...)
|
223
|
+
PATTERN
|
224
|
+
|
219
225
|
def call_chain_starts_with_int?(begin_node, send_node)
|
220
226
|
recv = first_part_of_call_chain(send_node)
|
221
227
|
recv&.int_type? && (parent = begin_node.parent) &&
|
@@ -97,13 +97,13 @@ module RuboCop
|
|
97
97
|
|
98
98
|
return true if STRING_INTERPOLATION_REGEXP.match?(src)
|
99
99
|
|
100
|
-
src.scan(/\\./).any? { |s| s
|
100
|
+
src.scan(/\\./).any? { |s| ESCAPED_NON_BACKSLASH.match?(s) }
|
101
101
|
end
|
102
102
|
|
103
103
|
def acceptable_capital_q?(node)
|
104
104
|
src = node.source
|
105
105
|
src.include?(QUOTE) &&
|
106
|
-
(src
|
106
|
+
(STRING_INTERPOLATION_REGEXP.match?(src) ||
|
107
107
|
(node.str_type? && double_quotes_required?(src)))
|
108
108
|
end
|
109
109
|
end
|
@@ -34,10 +34,11 @@ module RuboCop
|
|
34
34
|
\[ # Literal [
|
35
35
|
(?!\#\{) # Not (the start of) an interpolation
|
36
36
|
(?: # Either...
|
37
|
-
|
37
|
+
\\[^b] | # Any escaped character except b (which would change behaviour)
|
38
38
|
[^.*+?{}()|$] | # or one that doesn't require escaping outside the character class
|
39
39
|
\\[upP]\{[^}]+\} # or a unicode code-point or property
|
40
40
|
)
|
41
|
+
(?<!\\) # No \-prefix (i.e. not escaped)
|
41
42
|
\] # Literal ]
|
42
43
|
)
|
43
44
|
/x.freeze
|
@@ -67,8 +68,8 @@ module RuboCop
|
|
67
68
|
end
|
68
69
|
|
69
70
|
def each_redundant_character_class(node)
|
70
|
-
|
71
|
-
yield loc
|
71
|
+
pattern_source(node).scan(PATTERN) do
|
72
|
+
yield match_range(node.loc.begin.end, Regexp.last_match)
|
72
73
|
end
|
73
74
|
end
|
74
75
|
|
@@ -18,6 +18,9 @@ module RuboCop
|
|
18
18
|
# # good
|
19
19
|
# %r/foo\/bar/
|
20
20
|
#
|
21
|
+
# # good
|
22
|
+
# %r!foo\!bar!
|
23
|
+
#
|
21
24
|
# # bad
|
22
25
|
# /a\-b/
|
23
26
|
#
|
@@ -63,27 +66,30 @@ module RuboCop
|
|
63
66
|
|
64
67
|
private
|
65
68
|
|
66
|
-
def slash_literal?(node)
|
67
|
-
['/', '%r/'].include?(node.loc.begin.source)
|
68
|
-
end
|
69
|
-
|
70
69
|
def allowed_escape?(node, char, within_character_class)
|
71
70
|
# Strictly speaking a few single-letter metachars are currently
|
72
71
|
# unnecessary to "escape", e.g. g, i, E, F, but enumerating them is
|
73
72
|
# rather difficult, and their behaviour could change over time with
|
74
73
|
# different versions of Ruby so that e.g. /\g/ != /g/
|
75
74
|
return true if /[[:alnum:]]/.match?(char)
|
76
|
-
return true if ALLOWED_ALWAYS_ESCAPES.include?(char)
|
75
|
+
return true if ALLOWED_ALWAYS_ESCAPES.include?(char) || delimiter?(node, char)
|
77
76
|
|
78
|
-
if
|
79
|
-
slash_literal?(node)
|
80
|
-
elsif within_character_class
|
77
|
+
if within_character_class
|
81
78
|
ALLOWED_WITHIN_CHAR_CLASS_METACHAR_ESCAPES.include?(char)
|
82
79
|
else
|
83
80
|
ALLOWED_OUTSIDE_CHAR_CLASS_METACHAR_ESCAPES.include?(char)
|
84
81
|
end
|
85
82
|
end
|
86
83
|
|
84
|
+
def delimiter?(node, char)
|
85
|
+
delimiters = [
|
86
|
+
node.loc.begin.source[-1],
|
87
|
+
node.loc.end.source[0]
|
88
|
+
]
|
89
|
+
|
90
|
+
delimiters.include?(char)
|
91
|
+
end
|
92
|
+
|
87
93
|
def each_escape(node)
|
88
94
|
pattern_source(node).each_char.with_index.reduce(
|
89
95
|
[nil, false]
|
@@ -109,21 +115,6 @@ module RuboCop
|
|
109
115
|
|
110
116
|
range_between(start, start + 2)
|
111
117
|
end
|
112
|
-
|
113
|
-
def pattern_source(node)
|
114
|
-
freespace_mode = freespace_mode_regexp?(node)
|
115
|
-
|
116
|
-
node.children.reject(&:regopt_type?).map do |child|
|
117
|
-
source = child.source
|
118
|
-
|
119
|
-
if freespace_mode
|
120
|
-
# Remove comments to avoid misleading results
|
121
|
-
source.sub(/(?<!\\)#.*/, '')
|
122
|
-
else
|
123
|
-
source
|
124
|
-
end
|
125
|
-
end.join
|
126
|
-
end
|
127
118
|
end
|
128
119
|
end
|
129
120
|
end
|
@@ -44,6 +44,11 @@ module RuboCop
|
|
44
44
|
class RedundantSelf < Cop
|
45
45
|
MSG = 'Redundant `self` detected.'
|
46
46
|
KERNEL_METHODS = Kernel.methods(false)
|
47
|
+
KEYWORDS = %i[alias and begin break case class def defined? do
|
48
|
+
else elsif end ensure false for if in module
|
49
|
+
next nil not or redo rescue retry return self
|
50
|
+
super then true undef unless until when while
|
51
|
+
yield __FILE__ __LINE__ __ENCODING__].freeze
|
47
52
|
|
48
53
|
def self.autocorrect_incompatible_with
|
49
54
|
[ColonMethodCall]
|
@@ -131,7 +136,7 @@ module RuboCop
|
|
131
136
|
|
132
137
|
def regular_method_call?(node)
|
133
138
|
!(node.operator_method? ||
|
134
|
-
|
139
|
+
KEYWORDS.include?(node.method_name) ||
|
135
140
|
node.camel_case_method? ||
|
136
141
|
node.setter_method? ||
|
137
142
|
node.implicit_call?)
|
@@ -142,14 +147,6 @@ module RuboCop
|
|
142
147
|
@local_variables_scopes[node] << name
|
143
148
|
end
|
144
149
|
|
145
|
-
def keyword?(method_name)
|
146
|
-
%i[alias and begin break case class def defined? do
|
147
|
-
else elsif end ensure false for if in module
|
148
|
-
next nil not or redo rescue retry return self
|
149
|
-
super then true undef unless until when while
|
150
|
-
yield __FILE__ __LINE__ __ENCODING__].include?(method_name)
|
151
|
-
end
|
152
|
-
|
153
150
|
def allow_self(node)
|
154
151
|
return unless node.send_type? && node.self_receiver?
|
155
152
|
|