rubocop 1.75.7 → 1.75.8
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/lib/rubocop/cop/autocorrect_logic.rb +18 -10
- data/lib/rubocop/cop/layout/class_structure.rb +35 -0
- data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +6 -2
- data/lib/rubocop/cop/layout/first_argument_indentation.rb +1 -1
- data/lib/rubocop/cop/lint/duplicate_methods.rb +1 -1
- data/lib/rubocop/cop/lint/float_comparison.rb +27 -0
- data/lib/rubocop/cop/style/def_with_parentheses.rb +18 -5
- data/lib/rubocop/cop/style/map_to_hash.rb +11 -0
- data/lib/rubocop/cop/style/redundant_format.rb +6 -1
- data/lib/rubocop/cop/team.rb +1 -1
- data/lib/rubocop/version.rb +1 -1
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 31a9b16f521cb4dd8d22db58d5473cd527162b65934d8e210993f7c435a85d26
|
4
|
+
data.tar.gz: 57af5692e8b85aca41224e621a0ba6b54001944a6625edef169a78278066a532
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ef0ab376b3993e9ad1961560911ed5b5e2abf069a2b9acd0187e3d31c03f853a520646f2c421813bc3c03aedd74004dcf057cbadecad0ea86acafbd6670c8e46
|
7
|
+
data.tar.gz: b76bd8b4d7492577429bab8abd02ebcf7f2d9d2f83066e81c48b060abcaad68a2660b064c1f5b0b9c42bc80cc78ce15cd6e10ace393cd636310055515af925db
|
@@ -50,7 +50,7 @@ module RuboCop
|
|
50
50
|
|
51
51
|
def disable_offense(offense_range)
|
52
52
|
unbreakable_range = multiline_ranges(offense_range)&.find do |range|
|
53
|
-
|
53
|
+
eol_comment_would_be_inside_literal?(offense_range, range)
|
54
54
|
end
|
55
55
|
|
56
56
|
if unbreakable_range
|
@@ -75,18 +75,22 @@ module RuboCop
|
|
75
75
|
end
|
76
76
|
|
77
77
|
def disable_offense_with_eol_or_surround_comment(range)
|
78
|
-
|
79
|
-
needed_line_length = (range.source_line + eol_comment).length
|
80
|
-
|
81
|
-
if needed_line_length <= max_line_length
|
82
|
-
disable_offense_at_end_of_line(range_of_first_line(range), eol_comment)
|
83
|
-
else
|
78
|
+
if line_with_eol_comment_too_long?(range)
|
84
79
|
disable_offense_before_and_after(range_by_lines(range))
|
80
|
+
else
|
81
|
+
disable_offense_at_end_of_line(range_of_first_line(range))
|
85
82
|
end
|
86
83
|
end
|
87
84
|
|
88
|
-
def
|
89
|
-
|
85
|
+
def eol_comment_would_be_inside_literal?(offense_range, literal_range)
|
86
|
+
return true if line_with_eol_comment_too_long?(offense_range)
|
87
|
+
|
88
|
+
offense_line = offense_range.line
|
89
|
+
offense_line >= literal_range.first_line && offense_line < literal_range.last_line
|
90
|
+
end
|
91
|
+
|
92
|
+
def line_with_eol_comment_too_long?(range)
|
93
|
+
(range.source_line + eol_comment).length > max_line_length
|
90
94
|
end
|
91
95
|
|
92
96
|
def surrounding_heredoc?(node)
|
@@ -132,10 +136,14 @@ module RuboCop
|
|
132
136
|
config.for_cop('Layout/LineLength')['Max'] || 120
|
133
137
|
end
|
134
138
|
|
135
|
-
def disable_offense_at_end_of_line(range
|
139
|
+
def disable_offense_at_end_of_line(range)
|
136
140
|
Corrector.new(range).insert_after(range, eol_comment)
|
137
141
|
end
|
138
142
|
|
143
|
+
def eol_comment
|
144
|
+
" # rubocop:todo #{cop_name}"
|
145
|
+
end
|
146
|
+
|
139
147
|
def disable_offense_before_and_after(range_by_lines)
|
140
148
|
range_with_newline = range_by_lines.resize(range_by_lines.size + 1)
|
141
149
|
leading_whitespace = range_by_lines.source_line[/^\s*/]
|
@@ -22,6 +22,11 @@ module RuboCop
|
|
22
22
|
# * Private attribute macros (`attr_accessor`, `attr_writer`, `attr_reader`)
|
23
23
|
# * Private instance methods
|
24
24
|
#
|
25
|
+
# NOTE: Simply enabling the cop with `Enabled: true` will not use
|
26
|
+
# the example order shown below.
|
27
|
+
# To enforce the order of macros like `attr_reader`,
|
28
|
+
# you must define both `ExpectedOrder` *and* `Categories`.
|
29
|
+
#
|
25
30
|
# You can configure the following order:
|
26
31
|
#
|
27
32
|
# [source,yaml]
|
@@ -68,6 +73,36 @@ module RuboCop
|
|
68
73
|
# - extend
|
69
74
|
# ----
|
70
75
|
#
|
76
|
+
# If you only set `ExpectedOrder`
|
77
|
+
# without defining `Categories`,
|
78
|
+
# macros such as `attr_reader` or `has_many`
|
79
|
+
# will not be recognized as part of a category, and their order will not be validated.
|
80
|
+
# For example, the following will NOT raise any offenses, even if the order is incorrect:
|
81
|
+
#
|
82
|
+
# [source,yaml]
|
83
|
+
# ----
|
84
|
+
# Layout/ClassStructure:
|
85
|
+
# Enabled: true
|
86
|
+
# ExpectedOrder:
|
87
|
+
# - public_attribute_macros
|
88
|
+
# - initializer
|
89
|
+
# ----
|
90
|
+
#
|
91
|
+
# To make it work as expected, you must also specify `Categories` like this:
|
92
|
+
#
|
93
|
+
# [source,yaml]
|
94
|
+
# ----
|
95
|
+
# Layout/ClassStructure:
|
96
|
+
# ExpectedOrder:
|
97
|
+
# - public_attribute_macros
|
98
|
+
# - initializer
|
99
|
+
# Categories:
|
100
|
+
# attribute_macros:
|
101
|
+
# - attr_reader
|
102
|
+
# - attr_writer
|
103
|
+
# - attr_accessor
|
104
|
+
# ----
|
105
|
+
#
|
71
106
|
# @safety
|
72
107
|
# Autocorrection is unsafe because class methods and module inclusion
|
73
108
|
# can behave differently, based on which methods or constants have
|
@@ -116,7 +116,7 @@ module RuboCop
|
|
116
116
|
def allowed_only_before_style?(node)
|
117
117
|
if node.special_modifier?
|
118
118
|
return true if processed_source[node.last_line] == 'end'
|
119
|
-
return false if
|
119
|
+
return false if next_line_empty_and_exists?(node.last_line)
|
120
120
|
end
|
121
121
|
|
122
122
|
previous_line_empty?(node.first_line)
|
@@ -129,7 +129,7 @@ module RuboCop
|
|
129
129
|
when :around
|
130
130
|
corrector.insert_after(line, "\n") unless next_line_empty?(node.last_line)
|
131
131
|
when :only_before
|
132
|
-
if
|
132
|
+
if next_line_empty_and_exists?(node.last_line)
|
133
133
|
range = next_empty_line_range(node)
|
134
134
|
|
135
135
|
corrector.remove(range)
|
@@ -154,6 +154,10 @@ module RuboCop
|
|
154
154
|
body_end?(last_send_line) || next_line.blank?
|
155
155
|
end
|
156
156
|
|
157
|
+
def next_line_empty_and_exists?(last_send_line)
|
158
|
+
next_line_empty?(last_send_line) && last_send_line.next != processed_source.lines.size
|
159
|
+
end
|
160
|
+
|
157
161
|
def empty_lines_around?(node)
|
158
162
|
previous_line_empty?(node.first_line) && next_line_empty?(node.last_line)
|
159
163
|
end
|
@@ -155,7 +155,7 @@ module RuboCop
|
|
155
155
|
def on_send(node)
|
156
156
|
return unless should_check?(node)
|
157
157
|
return if same_line?(node, node.first_argument)
|
158
|
-
return if
|
158
|
+
return if enforce_first_argument_with_fixed_indentation? &&
|
159
159
|
!enable_layout_first_method_argument_line_break?
|
160
160
|
|
161
161
|
indent = base_indentation(node) + configured_indentation_width
|
@@ -15,6 +15,14 @@ module RuboCop
|
|
15
15
|
# x == 0.1
|
16
16
|
# x != 0.1
|
17
17
|
#
|
18
|
+
# # bad
|
19
|
+
# case value
|
20
|
+
# when 1.0
|
21
|
+
# foo
|
22
|
+
# when 2.0
|
23
|
+
# bar
|
24
|
+
# end
|
25
|
+
#
|
18
26
|
# # good - using BigDecimal
|
19
27
|
# x.to_d == 0.1.to_d
|
20
28
|
#
|
@@ -32,12 +40,21 @@ module RuboCop
|
|
32
40
|
# # good - comparing against nil
|
33
41
|
# Float(x, exception: false) == nil
|
34
42
|
#
|
43
|
+
# # good - using epsilon comparison in case expression
|
44
|
+
# case
|
45
|
+
# when (value - 1.0).abs < Float::EPSILON
|
46
|
+
# foo
|
47
|
+
# when (value - 2.0).abs < Float::EPSILON
|
48
|
+
# bar
|
49
|
+
# end
|
50
|
+
#
|
35
51
|
# # Or some other epsilon based type of comparison:
|
36
52
|
# # https://www.embeddeduse.com/2019/08/26/qt-compare-two-floats/
|
37
53
|
#
|
38
54
|
class FloatComparison < Base
|
39
55
|
MSG_EQUALITY = 'Avoid equality comparisons of floats as they are unreliable.'
|
40
56
|
MSG_INEQUALITY = 'Avoid inequality comparisons of floats as they are unreliable.'
|
57
|
+
MSG_CASE = 'Avoid float literal comparisons in case statements as they are unreliable.'
|
41
58
|
|
42
59
|
EQUALITY_METHODS = %i[== != eql? equal?].freeze
|
43
60
|
FLOAT_RETURNING_METHODS = %i[to_f Float fdiv].freeze
|
@@ -58,6 +75,16 @@ module RuboCop
|
|
58
75
|
end
|
59
76
|
alias on_csend on_send
|
60
77
|
|
78
|
+
def on_case(node)
|
79
|
+
node.when_branches.each do |when_branch|
|
80
|
+
when_branch.each_condition do |condition|
|
81
|
+
next if !float?(condition) || literal_safe?(condition)
|
82
|
+
|
83
|
+
add_offense(condition, message: MSG_CASE)
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
61
88
|
private
|
62
89
|
|
63
90
|
def float?(node)
|
@@ -25,8 +25,9 @@ module RuboCop
|
|
25
25
|
# # good
|
26
26
|
# def foo = do_something
|
27
27
|
#
|
28
|
-
# # good
|
28
|
+
# # good - without parentheses it's a syntax error
|
29
29
|
# def foo() do_something end
|
30
|
+
# def foo()=do_something
|
30
31
|
#
|
31
32
|
# # bad
|
32
33
|
# def Baz.foo()
|
@@ -38,19 +39,31 @@ module RuboCop
|
|
38
39
|
# do_something
|
39
40
|
# end
|
40
41
|
class DefWithParentheses < Base
|
42
|
+
include RangeHelp
|
41
43
|
extend AutoCorrector
|
42
44
|
|
43
45
|
MSG = "Omit the parentheses in defs when the method doesn't accept any arguments."
|
44
46
|
|
45
47
|
def on_def(node)
|
46
|
-
return
|
47
|
-
return
|
48
|
+
return unless !node.arguments? && (arguments_range = node.arguments.source_range)
|
49
|
+
return if parentheses_required?(node, arguments_range)
|
48
50
|
|
49
|
-
add_offense(
|
50
|
-
corrector.remove(
|
51
|
+
add_offense(arguments_range) do |corrector|
|
52
|
+
corrector.remove(arguments_range)
|
51
53
|
end
|
52
54
|
end
|
53
55
|
alias on_defs on_def
|
56
|
+
|
57
|
+
private
|
58
|
+
|
59
|
+
def parentheses_required?(node, arguments_range)
|
60
|
+
return true if node.single_line? && !node.endless?
|
61
|
+
|
62
|
+
end_pos = arguments_range.end.end_pos
|
63
|
+
token_after_argument = range_between(end_pos, end_pos + 1).source
|
64
|
+
|
65
|
+
token_after_argument == '='
|
66
|
+
end
|
54
67
|
end
|
55
68
|
end
|
56
69
|
end
|
@@ -45,6 +45,11 @@ module RuboCop
|
|
45
45
|
}
|
46
46
|
PATTERN
|
47
47
|
|
48
|
+
# @!method destructuring_argument(node)
|
49
|
+
def_node_matcher :destructuring_argument, <<~PATTERN
|
50
|
+
(args $(mlhs (arg _)+))
|
51
|
+
PATTERN
|
52
|
+
|
48
53
|
def self.autocorrect_incompatible_with
|
49
54
|
[Layout::SingleLineBlockChain]
|
50
55
|
end
|
@@ -73,6 +78,12 @@ module RuboCop
|
|
73
78
|
corrector.replace(map_dot, to_h.loc.dot.source)
|
74
79
|
end
|
75
80
|
corrector.replace(map.loc.selector, 'to_h')
|
81
|
+
|
82
|
+
return unless map.parent.block_type?
|
83
|
+
|
84
|
+
if (argument = destructuring_argument(map.parent.arguments))
|
85
|
+
corrector.replace(argument, argument.source[1..-2])
|
86
|
+
end
|
76
87
|
end
|
77
88
|
# rubocop:enable Metrics/AbcSize
|
78
89
|
end
|
@@ -121,7 +121,12 @@ module RuboCop
|
|
121
121
|
def register_all_fields_literal(node, string, arguments)
|
122
122
|
return unless all_fields_literal?(string, arguments.dup)
|
123
123
|
|
124
|
-
|
124
|
+
format_arguments = argument_values(arguments)
|
125
|
+
begin
|
126
|
+
formatted_string = format(string, *format_arguments)
|
127
|
+
rescue ArgumentError
|
128
|
+
return
|
129
|
+
end
|
125
130
|
replacement = quote(formatted_string, node)
|
126
131
|
|
127
132
|
add_offense(node, message: message(node, replacement)) do |corrector|
|
data/lib/rubocop/cop/team.rb
CHANGED
data/lib/rubocop/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rubocop
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.75.
|
4
|
+
version: 1.75.8
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Bozhidar Batsov
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
- Yuji Nakayama
|
10
10
|
bindir: exe
|
11
11
|
cert_chain: []
|
12
|
-
date: 2025-05-
|
12
|
+
date: 2025-05-28 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: json
|
@@ -1080,7 +1080,7 @@ licenses:
|
|
1080
1080
|
- MIT
|
1081
1081
|
metadata:
|
1082
1082
|
homepage_uri: https://rubocop.org/
|
1083
|
-
changelog_uri: https://github.com/rubocop/rubocop/releases/tag/v1.75.
|
1083
|
+
changelog_uri: https://github.com/rubocop/rubocop/releases/tag/v1.75.8
|
1084
1084
|
source_code_uri: https://github.com/rubocop/rubocop/
|
1085
1085
|
documentation_uri: https://docs.rubocop.org/rubocop/1.75/
|
1086
1086
|
bug_tracker_uri: https://github.com/rubocop/rubocop/issues
|