rubocop-performance 1.22.0 → 1.23.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/config/default.yml +6 -0
- data/lib/rubocop/cop/performance/big_decimal_with_numeric_argument.rb +40 -19
- data/lib/rubocop/cop/performance/string_bytesize.rb +45 -0
- data/lib/rubocop/cop/performance/sum.rb +1 -1
- data/lib/rubocop/cop/performance_cops.rb +1 -0
- data/lib/rubocop/performance/version.rb +1 -1
- metadata +5 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 40d68e8bad13725b44f9a32555e63071765f0d4720439aba66f8b1c2ae61d803
|
4
|
+
data.tar.gz: 02f248b67961365ac64c7f5f99337d03d7a5dc9d57e36dd9ddccd3d2a16b75fb
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0bc99f145e03f6942e915b3edb51280821f66118d86d3b41bc87bc02ca4225ab8696510b7e77575fc2f05601cdc571a207b7d3c9eddc93e7ad238bc606ce3746
|
7
|
+
data.tar.gz: 91b71a5204257159d636b44dc003f2cc1c2b2bc6f67a17d9054bcdef2921926e3e5b729191107422abe807ac9628d3efa9db9550866233e07a88fb67f4d252b6
|
data/config/default.yml
CHANGED
@@ -326,6 +326,12 @@ Performance/StartWith:
|
|
326
326
|
VersionAdded: '0.36'
|
327
327
|
VersionChanged: '1.10'
|
328
328
|
|
329
|
+
Performance/StringBytesize:
|
330
|
+
Description: "Use `String#bytesize` instead of calculating the size of the bytes array."
|
331
|
+
Safe: false
|
332
|
+
Enabled: 'pending'
|
333
|
+
VersionAdded: '1.23'
|
334
|
+
|
329
335
|
Performance/StringIdentifierArgument:
|
330
336
|
Description: 'Use symbol identifier argument instead of string identifier argument.'
|
331
337
|
Enabled: pending
|
@@ -3,22 +3,28 @@
|
|
3
3
|
module RuboCop
|
4
4
|
module Cop
|
5
5
|
module Performance
|
6
|
-
# Identifies places where
|
7
|
-
#
|
8
|
-
#
|
6
|
+
# Identifies places where a float argument to BigDecimal should be converted to a string.
|
7
|
+
# Initializing from String is faster than from Float for BigDecimal.
|
8
|
+
#
|
9
|
+
# Also identifies places where an integer string argument to BigDecimal should be converted to
|
10
|
+
# an integer. Initializing from Integer is faster than from String for BigDecimal.
|
9
11
|
#
|
10
12
|
# @example
|
11
13
|
# # bad
|
12
|
-
# BigDecimal(
|
13
|
-
#
|
14
|
+
# BigDecimal(1.2, 3, exception: true)
|
15
|
+
# 4.5.to_d(6, exception: true)
|
16
|
+
#
|
17
|
+
# # good
|
14
18
|
# BigDecimal('1.2', 3, exception: true)
|
15
19
|
# BigDecimal('4.5', 6, exception: true)
|
16
20
|
#
|
21
|
+
# # bad
|
22
|
+
# BigDecimal('1', 2)
|
23
|
+
# BigDecimal('4', 6)
|
24
|
+
#
|
17
25
|
# # good
|
18
26
|
# BigDecimal(1, 2)
|
19
27
|
# 4.to_d(6)
|
20
|
-
# BigDecimal(1.2, 3, exception: true)
|
21
|
-
# 4.5.to_d(6, exception: true)
|
22
28
|
#
|
23
29
|
class BigDecimalWithNumericArgument < Base
|
24
30
|
extend AutoCorrector
|
@@ -26,30 +32,45 @@ module RuboCop
|
|
26
32
|
|
27
33
|
minimum_target_ruby_version 3.1
|
28
34
|
|
29
|
-
|
35
|
+
MSG_FROM_FLOAT_TO_STRING = 'Convert float literal to string and pass it to `BigDecimal`.'
|
36
|
+
MSG_FROM_INTEGER_TO_STRING = 'Convert string literal to integer and pass it to `BigDecimal`.'
|
30
37
|
RESTRICT_ON_SEND = %i[BigDecimal to_d].freeze
|
31
38
|
|
32
|
-
def_node_matcher :big_decimal_with_numeric_argument
|
33
|
-
(send nil? :BigDecimal $str_type? ...)
|
39
|
+
def_node_matcher :big_decimal_with_numeric_argument, <<~PATTERN
|
40
|
+
(send nil? :BigDecimal ${float_type? str_type?} ...)
|
34
41
|
PATTERN
|
35
42
|
|
36
|
-
def_node_matcher :to_d
|
37
|
-
(send [!nil? $str_type?] :to_d ...)
|
43
|
+
def_node_matcher :to_d, <<~PATTERN
|
44
|
+
(send [!nil? ${float_type? str_type?}] :to_d ...)
|
38
45
|
PATTERN
|
39
46
|
|
47
|
+
# rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity, Metrics/MethodLength
|
40
48
|
def on_send(node)
|
41
|
-
if (
|
42
|
-
|
43
|
-
|
49
|
+
if (numeric = big_decimal_with_numeric_argument(node))
|
50
|
+
if numeric.numeric_type?
|
51
|
+
add_offense(numeric, message: MSG_FROM_FLOAT_TO_STRING) do |corrector|
|
52
|
+
corrector.wrap(numeric, "'", "'")
|
53
|
+
end
|
54
|
+
elsif numeric.value.match?(/\A\d+\z/)
|
55
|
+
add_offense(numeric, message: MSG_FROM_INTEGER_TO_STRING) do |corrector|
|
56
|
+
corrector.replace(numeric, numeric.value)
|
57
|
+
end
|
44
58
|
end
|
45
|
-
elsif (
|
46
|
-
|
47
|
-
|
59
|
+
elsif (numeric_to_d = to_d(node))
|
60
|
+
if numeric_to_d.numeric_type?
|
61
|
+
add_offense(numeric_to_d, message: MSG_FROM_FLOAT_TO_STRING) do |corrector|
|
62
|
+
big_decimal_args = node.arguments.map(&:source).unshift("'#{numeric_to_d.source}'").join(', ')
|
48
63
|
|
49
|
-
|
64
|
+
corrector.replace(node, "BigDecimal(#{big_decimal_args})")
|
65
|
+
end
|
66
|
+
elsif numeric_to_d.value.match?(/\A\d+\z/)
|
67
|
+
add_offense(numeric_to_d, message: MSG_FROM_INTEGER_TO_STRING) do |corrector|
|
68
|
+
corrector.replace(node, "#{numeric_to_d.value}.to_d")
|
69
|
+
end
|
50
70
|
end
|
51
71
|
end
|
52
72
|
end
|
73
|
+
# rubocop:enable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity, Metrics/MethodLength
|
53
74
|
end
|
54
75
|
end
|
55
76
|
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RuboCop
|
4
|
+
module Cop
|
5
|
+
module Performance
|
6
|
+
# Checks for calls to `#bytes` counting method and suggests using `bytesize` instead.
|
7
|
+
# The `bytesize` method is more efficient and directly returns the size in bytes,
|
8
|
+
# avoiding the intermediate array allocation that `bytes.size` incurs.
|
9
|
+
#
|
10
|
+
# @safety
|
11
|
+
# This cop is unsafe because it assumes that the receiver
|
12
|
+
# responds to `#bytesize` method.
|
13
|
+
#
|
14
|
+
# @example
|
15
|
+
# # bad
|
16
|
+
# string_var.bytes.count
|
17
|
+
# "foobar".bytes.size
|
18
|
+
#
|
19
|
+
# # good
|
20
|
+
# string_var.bytesize
|
21
|
+
# "foobar".bytesize
|
22
|
+
class StringBytesize < Base
|
23
|
+
extend AutoCorrector
|
24
|
+
|
25
|
+
MSG = 'Use `String#bytesize` instead of calculating the size of the bytes array.'
|
26
|
+
RESTRICT_ON_SEND = %i[size length count].freeze
|
27
|
+
|
28
|
+
def_node_matcher :string_bytes_method?, <<~MATCHER
|
29
|
+
(call (call !{nil? int} :bytes) {:size :length :count})
|
30
|
+
MATCHER
|
31
|
+
|
32
|
+
def on_send(node)
|
33
|
+
string_bytes_method?(node) do
|
34
|
+
range = node.receiver.loc.selector.begin.join(node.source_range.end)
|
35
|
+
|
36
|
+
add_offense(range) do |corrector|
|
37
|
+
corrector.replace(range, 'bytesize')
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
alias on_csend on_send
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -44,6 +44,7 @@ require_relative 'performance/select_map'
|
|
44
44
|
require_relative 'performance/size'
|
45
45
|
require_relative 'performance/sort_reverse'
|
46
46
|
require_relative 'performance/squeeze'
|
47
|
+
require_relative 'performance/string_bytesize'
|
47
48
|
require_relative 'performance/start_with'
|
48
49
|
require_relative 'performance/string_identifier_argument'
|
49
50
|
require_relative 'performance/string_include'
|
metadata
CHANGED
@@ -1,16 +1,15 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rubocop-performance
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.23.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Bozhidar Batsov
|
8
8
|
- Jonas Arvidsson
|
9
9
|
- Yuji Nakayama
|
10
|
-
autorequire:
|
11
10
|
bindir: bin
|
12
11
|
cert_chain: []
|
13
|
-
date: 2024-
|
12
|
+
date: 2024-11-14 00:00:00.000000000 Z
|
14
13
|
dependencies:
|
15
14
|
- !ruby/object:Gem::Dependency
|
16
15
|
name: rubocop
|
@@ -112,6 +111,7 @@ files:
|
|
112
111
|
- lib/rubocop/cop/performance/sort_reverse.rb
|
113
112
|
- lib/rubocop/cop/performance/squeeze.rb
|
114
113
|
- lib/rubocop/cop/performance/start_with.rb
|
114
|
+
- lib/rubocop/cop/performance/string_bytesize.rb
|
115
115
|
- lib/rubocop/cop/performance/string_identifier_argument.rb
|
116
116
|
- lib/rubocop/cop/performance/string_include.rb
|
117
117
|
- lib/rubocop/cop/performance/string_replacement.rb
|
@@ -130,10 +130,9 @@ metadata:
|
|
130
130
|
homepage_uri: https://docs.rubocop.org/rubocop-performance/
|
131
131
|
changelog_uri: https://github.com/rubocop/rubocop-performance/blob/master/CHANGELOG.md
|
132
132
|
source_code_uri: https://github.com/rubocop/rubocop-performance/
|
133
|
-
documentation_uri: https://docs.rubocop.org/rubocop-performance/1.
|
133
|
+
documentation_uri: https://docs.rubocop.org/rubocop-performance/1.23/
|
134
134
|
bug_tracker_uri: https://github.com/rubocop/rubocop-performance/issues
|
135
135
|
rubygems_mfa_required: 'true'
|
136
|
-
post_install_message:
|
137
136
|
rdoc_options: []
|
138
137
|
require_paths:
|
139
138
|
- lib
|
@@ -148,8 +147,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
148
147
|
- !ruby/object:Gem::Version
|
149
148
|
version: '0'
|
150
149
|
requirements: []
|
151
|
-
rubygems_version: 3.
|
152
|
-
signing_key:
|
150
|
+
rubygems_version: 3.6.0.dev
|
153
151
|
specification_version: 4
|
154
152
|
summary: Automatic performance checking tool for Ruby code.
|
155
153
|
test_files: []
|