Skip to content

Commit 9980211

Browse files
committed
Support filter in Rails/CompactBlank
1 parent cbb7257 commit 9980211

File tree

3 files changed

+65
-4
lines changed

3 files changed

+65
-4
lines changed
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
* [#1359](https://github.com/rubocop/rubocop-rails/pull/1359): Support `filter` in `Rails/CompactBlank`. ([@masato-bkn][])

lib/rubocop/cop/rails/compact_blank.rb

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@ module Rails
2525
# collection.reject { |_k, v| v.blank? }
2626
# collection.select(&:present?)
2727
# collection.select { |_k, v| v.present? }
28+
# collection.filter(&:present?)
29+
# collection.filter { |_k, v| v.present? }
2830
#
2931
# # good
3032
# collection.compact_blank
@@ -44,7 +46,8 @@ class CompactBlank < Base
4446
extend TargetRailsVersion
4547

4648
MSG = 'Use `%<preferred_method>s` instead.'
47-
RESTRICT_ON_SEND = %i[reject delete_if select keep_if].freeze
49+
RESTRICT_ON_SEND = %i[reject delete_if select filter keep_if].freeze
50+
DESTRUCTIVE_METHODS = %i[delete_if keep_if].freeze
4851

4952
minimum_target_rails_version 6.1
5053

@@ -64,14 +67,14 @@ class CompactBlank < Base
6467

6568
def_node_matcher :select_with_block?, <<~PATTERN
6669
(block
67-
(send _ {:select :keep_if})
70+
(send _ {:select :filter :keep_if})
6871
$(args ...)
6972
(send
7073
$(lvar _) :present?))
7174
PATTERN
7275

7376
def_node_matcher :select_with_block_pass?, <<~PATTERN
74-
(send _ {:select :keep_if}
77+
(send _ {:select :filter :keep_if}
7578
(block-pass
7679
(sym :present?)))
7780
PATTERN
@@ -120,7 +123,7 @@ def offense_range(node)
120123
end
121124

122125
def preferred_method(node)
123-
node.method?(:reject) || node.method?(:select) ? 'compact_blank' : 'compact_blank!'
126+
DESTRUCTIVE_METHODS.include?(node.method_name) ? 'compact_blank!' : 'compact_blank'
124127
end
125128
end
126129
end

spec/rubocop/cop/rails/compact_blank_spec.rb

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,39 @@
124124
RUBY
125125
end
126126

127+
it 'registers and corrects an offense when using `filter { |e| e.present? }`' do
128+
expect_offense(<<~RUBY)
129+
collection.filter { |e| e.present? }
130+
^^^^^^^^^^^^^^^^^^^^^^^^^ Use `compact_blank` instead.
131+
RUBY
132+
133+
expect_correction(<<~RUBY)
134+
collection.compact_blank
135+
RUBY
136+
end
137+
138+
it 'registers and corrects an offense when using `filter(&:present?)`' do
139+
expect_offense(<<~RUBY)
140+
collection.filter(&:present?)
141+
^^^^^^^^^^^^^^^^^^ Use `compact_blank` instead.
142+
RUBY
143+
144+
expect_correction(<<~RUBY)
145+
collection.compact_blank
146+
RUBY
147+
end
148+
149+
it 'registers and corrects an offense when using `filter { |k, v| v.present? }`' do
150+
expect_offense(<<~RUBY)
151+
collection.filter { |k, v| v.present? }
152+
^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Use `compact_blank` instead.
153+
RUBY
154+
155+
expect_correction(<<~RUBY)
156+
collection.compact_blank
157+
RUBY
158+
end
159+
127160
it 'registers and corrects an offense when using `keep_if { |e| e.present? }`' do
128161
expect_offense(<<~RUBY)
129162
collection.keep_if { |e| e.present? }
@@ -169,6 +202,18 @@
169202
RUBY
170203
end
171204

205+
it 'does not register an offense when using `filter! { |e| e.present? }`' do
206+
expect_no_offenses(<<~RUBY)
207+
collection.filter! { |e| e.present? }
208+
RUBY
209+
end
210+
211+
it 'does not register an offense when using `filter!(&:present?)`' do
212+
expect_no_offenses(<<~RUBY)
213+
collection.filter!(&:present?)
214+
RUBY
215+
end
216+
172217
it 'does not register an offense when using `compact_blank`' do
173218
expect_no_offenses(<<~RUBY)
174219
collection.compact_blank
@@ -206,6 +251,12 @@ def foo(arg)
206251
collection.select { |e| e.blank? }
207252
RUBY
208253
end
254+
255+
it 'does not register an offense when using `filter { |e| e.blank? }`' do
256+
expect_no_offenses(<<~RUBY)
257+
collection.filter { |e| e.blank? }
258+
RUBY
259+
end
209260
end
210261

211262
context 'Rails <= 6.0', :rails60 do
@@ -226,5 +277,11 @@ def foo(arg)
226277
collection.select { |e| e.present? }
227278
RUBY
228279
end
280+
281+
it 'does not register an offense when using `filter { |e| e.present? }`' do
282+
expect_no_offenses(<<~RUBY)
283+
collection.filter { |e| e.present? }
284+
RUBY
285+
end
229286
end
230287
end

0 commit comments

Comments
 (0)