rubocop-performance 1.21.0 → 1.22.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: c00ee718f283199f3c4f53b54071998b356f7239edcd3c84015bac94ad1b05dc
4
- data.tar.gz: a5e7d011cd090fd5d30eb0ef9e12acabb93a993cc3acb46129da46c37294e1ba
3
+ metadata.gz: 786f01d21be4d9f083fc007c02f4138145970d85b68776aca83fc305bd4f5152
4
+ data.tar.gz: b15886f0f524d72de2319644d88a46058fe056476a52eef78eca7349e4e142eb
5
5
  SHA512:
6
- metadata.gz: 711efd2eae8c54dc1b567e198360038fb16eee00c2e6a61db7dbcfb063f219618e36809ac5679cc531e8fe84245ea1f66e6e8eb9fbed5cbb9dcc22f57c10dab6
7
- data.tar.gz: 5618f678392ffb6f93b34388e3ef060c017f7e70b53d992ebe48d2bb49b7ec5570adc7b21f5f22f0511cddc4fb1dead044904d7bcf40949191ee6ed8b884565f
6
+ metadata.gz: 940f52f35280335d6417096c43344e9d582fa22e9a09e7dd60cd08f19f1c68740052a2810dc9d082e5ee66b56c6c631eeb2cc1ee45ccd896bd58d654fdd4b523
7
+ data.tar.gz: 483d5eedb23cc666c15d5c4bdb6b30f0c7b001547d38406c89ecf18547e0a0ae6c73fa9795f00b260921787b4ffee1c4d628434394c587d7744253759071a2b0
data/README.md CHANGED
@@ -1,7 +1,7 @@
1
1
  # RuboCop Performance
2
2
 
3
3
  [![Gem Version](https://badge.fury.io/rb/rubocop-performance.svg)](https://badge.fury.io/rb/rubocop-performance)
4
- [![CircleCI](https://circleci.com/gh/rubocop/rubocop-performance.svg?style=svg)](https://circleci.com/gh/rubocop/rubocop-performance)
4
+ [![CI](https://github.com/rubocop/rubocop-performance/actions/workflows/test.yml/badge.svg)](https://github.com/rubocop/rubocop-performance/actions/workflows/test.yml)
5
5
  [![Discord](https://img.shields.io/badge/chat-on%20discord-7289da.svg?sanitize=true)](https://discord.gg/wJjWvGRDmm)
6
6
 
7
7
  Performance optimization analysis for your projects, as an extension to [RuboCop](https://github.com/rubocop/rubocop).
data/config/default.yml CHANGED
@@ -32,8 +32,11 @@ Performance/BindCall:
32
32
 
33
33
  Performance/BlockGivenWithExplicitBlock:
34
34
  Description: 'Check block argument explicitly instead of using `block_given?`.'
35
- Enabled: pending
35
+ # This cop was created due to a mistake in microbenchmark.
36
+ # https://github.com/rubocop/rubocop-performance/issues/385
37
+ Enabled: false
36
38
  VersionAdded: '1.9'
39
+ VersionChanged: '1.22'
37
40
 
38
41
  Performance/Caller:
39
42
  Description: >-
@@ -3,45 +3,48 @@
3
3
  module RuboCop
4
4
  module Cop
5
5
  module Performance
6
- # Identifies places where numeric argument to BigDecimal should be
7
- # converted to string. Initializing from String is faster
8
- # than from Numeric for BigDecimal.
6
+ # Identifies places where string argument to `BigDecimal` should be
7
+ # converted to numeric. Initializing from Integer is faster
8
+ # than from String for BigDecimal.
9
9
  #
10
10
  # @example
11
11
  # # bad
12
- # BigDecimal(1, 2)
13
- # 4.to_d(6)
14
- # BigDecimal(1.2, 3, exception: true)
15
- # 4.5.to_d(6, exception: true)
16
- #
17
- # # good
18
12
  # BigDecimal('1', 2)
19
13
  # BigDecimal('4', 6)
20
14
  # BigDecimal('1.2', 3, exception: true)
21
15
  # BigDecimal('4.5', 6, exception: true)
22
16
  #
17
+ # # good
18
+ # BigDecimal(1, 2)
19
+ # 4.to_d(6)
20
+ # BigDecimal(1.2, 3, exception: true)
21
+ # 4.5.to_d(6, exception: true)
22
+ #
23
23
  class BigDecimalWithNumericArgument < Base
24
24
  extend AutoCorrector
25
+ extend TargetRubyVersion
26
+
27
+ minimum_target_ruby_version 3.1
25
28
 
26
- MSG = 'Convert numeric literal to string and pass it to `BigDecimal`.'
29
+ MSG = 'Convert string literal to numeric and pass it to `BigDecimal`.'
27
30
  RESTRICT_ON_SEND = %i[BigDecimal to_d].freeze
28
31
 
29
32
  def_node_matcher :big_decimal_with_numeric_argument?, <<~PATTERN
30
- (send nil? :BigDecimal $numeric_type? ...)
33
+ (send nil? :BigDecimal $str_type? ...)
31
34
  PATTERN
32
35
 
33
36
  def_node_matcher :to_d?, <<~PATTERN
34
- (send [!nil? $numeric_type?] :to_d ...)
37
+ (send [!nil? $str_type?] :to_d ...)
35
38
  PATTERN
36
39
 
37
40
  def on_send(node)
38
- if (numeric = big_decimal_with_numeric_argument?(node))
39
- add_offense(numeric.source_range) do |corrector|
40
- corrector.wrap(numeric, "'", "'")
41
+ if (string = big_decimal_with_numeric_argument?(node))
42
+ add_offense(string.source_range) do |corrector|
43
+ corrector.replace(string, string.value)
41
44
  end
42
- elsif (numeric_to_d = to_d?(node))
43
- add_offense(numeric_to_d.source_range) do |corrector|
44
- big_decimal_args = node.arguments.map(&:source).unshift("'#{numeric_to_d.source}'").join(', ')
45
+ elsif (string_to_d = to_d?(node))
46
+ add_offense(string_to_d.source_range) do |corrector|
47
+ big_decimal_args = node.arguments.map(&:source).unshift(string_to_d.value).join(', ')
45
48
 
46
49
  corrector.replace(node, "BigDecimal(#{big_decimal_args})")
47
50
  end
@@ -6,6 +6,9 @@ module RuboCop
6
6
  # Identifies unnecessary use of a `block_given?` where explicit check
7
7
  # of block argument would suffice.
8
8
  #
9
+ # NOTE: This cop produces code with significantly worse performance when a
10
+ # block is being passed to the method and as such should not be enabled.
11
+ #
9
12
  # @example
10
13
  # # bad
11
14
  # def method(&block)
@@ -41,7 +41,7 @@ module RuboCop
41
41
  class DoubleStartEndWith < Base
42
42
  extend AutoCorrector
43
43
 
44
- MSG = 'Use `%<receiver>s.%<method>s(%<combined_args>s)` instead of `%<original_code>s`.'
44
+ MSG = 'Use `%<replacement>s` instead of `%<original_code>s`.'
45
45
 
46
46
  def on_or(node)
47
47
  receiver, method, first_call_args, second_call_args = process_source(node)
@@ -50,7 +50,7 @@ module RuboCop
50
50
 
51
51
  combined_args = combine_args(first_call_args, second_call_args)
52
52
 
53
- add_offense(node, message: message(node, receiver, method, combined_args)) do |corrector|
53
+ add_offense(node, message: message(node, receiver, first_call_args, method, combined_args)) do |corrector|
54
54
  autocorrect(corrector, first_call_args, second_call_args, combined_args)
55
55
  end
56
56
  end
@@ -73,10 +73,10 @@ module RuboCop
73
73
  end
74
74
  end
75
75
 
76
- def message(node, receiver, method, combined_args)
77
- format(
78
- MSG, receiver: receiver.source, method: method, combined_args: combined_args, original_code: node.source
79
- )
76
+ def message(node, receiver, first_call_args, method, combined_args)
77
+ dot = first_call_args.first.parent.send_type? ? '.' : '&.'
78
+ replacement = "#{receiver.source}#{dot}#{method}(#{combined_args})"
79
+ format(MSG, replacement: replacement, original_code: node.source)
80
80
  end
81
81
 
82
82
  def combine_args(first_call_args, second_call_args)
@@ -89,16 +89,16 @@ module RuboCop
89
89
 
90
90
  def_node_matcher :two_start_end_with_calls, <<~PATTERN
91
91
  (or
92
- (send $_recv [{:start_with? :end_with?} $_method] $...)
93
- (send _recv _method $...))
92
+ (call $_recv [{:start_with? :end_with?} $_method] $...)
93
+ (call _recv _method $...))
94
94
  PATTERN
95
95
 
96
96
  def_node_matcher :check_with_active_support_aliases, <<~PATTERN
97
97
  (or
98
- (send $_recv
98
+ (call $_recv
99
99
  [{:start_with? :starts_with? :end_with? :ends_with?} $_method]
100
100
  $...)
101
- (send _recv _method $...))
101
+ (call _recv _method $...))
102
102
  PATTERN
103
103
  end
104
104
  end
@@ -8,8 +8,9 @@ module RuboCop
8
8
  # This cop identifies places where `map { ... }.compact` can be replaced by `filter_map`.
9
9
  #
10
10
  # @safety
11
- # This cop's autocorrection is unsafe because `map { ... }.compact` that is not
12
- # compatible with `filter_map`.
11
+ # This cop's autocorrection is unsafe because `map { ... }.compact` might yield
12
+ # different results than `filter_map`. As illustrated in the example, `filter_map`
13
+ # also filters out falsy values, while `compact` only gets rid of `nil`.
13
14
  #
14
15
  # [source,ruby]
15
16
  # ----
@@ -64,7 +64,7 @@ module RuboCop
64
64
  return unless one_block_argument?(node.arguments)
65
65
 
66
66
  block_argument = node.first_argument
67
- block_body = node.body
67
+ return unless (block_body = node.body)
68
68
  return unless use_equality_comparison_block?(block_body)
69
69
  return if same_block_argument_and_is_a_argument?(block_body, block_argument)
70
70
  return unless (new_argument = new_argument(block_argument, block_body))
@@ -130,9 +130,7 @@ module RuboCop
130
130
  end
131
131
 
132
132
  def rewrite_with_modifier(node, parent, new_source)
133
- # FIXME: `|| 2` can be removed when support is limited to RuboCop 1.44 or higher.
134
- # https://github.com/rubocop/rubocop/commit/02d1e5b
135
- indent = ' ' * (configured_indentation_width || 2)
133
+ indent = ' ' * configured_indentation_width
136
134
  padding = "\n#{indent + leading_spaces(node)}"
137
135
  new_source.gsub!("\n", padding)
138
136
 
@@ -4,7 +4,7 @@ module RuboCop
4
4
  module Performance
5
5
  # This module holds the RuboCop Performance version information.
6
6
  module Version
7
- STRING = '1.21.0'
7
+ STRING = '1.22.0'
8
8
 
9
9
  def self.document_version
10
10
  STRING.match('\d+\.\d+').to_s
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rubocop-performance
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.21.0
4
+ version: 1.22.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Bozhidar Batsov
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2024-03-30 00:00:00.000000000 Z
13
+ date: 2024-09-16 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: rubocop
@@ -130,7 +130,7 @@ 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.21/
133
+ documentation_uri: https://docs.rubocop.org/rubocop-performance/1.22/
134
134
  bug_tracker_uri: https://github.com/rubocop/rubocop-performance/issues
135
135
  rubygems_mfa_required: 'true'
136
136
  post_install_message:
@@ -148,7 +148,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
148
148
  - !ruby/object:Gem::Version
149
149
  version: '0'
150
150
  requirements: []
151
- rubygems_version: 3.5.3
151
+ rubygems_version: 3.2.33
152
152
  signing_key:
153
153
  specification_version: 4
154
154
  summary: Automatic performance checking tool for Ruby code.