Skip to content

Commit c9abc2a

Browse files
authored
Merge pull request rubocop#862 from r7kamura/feature/dynamic-find-by-and
Ignore if number of arguments does not match on `Rails/DynamicFindBy`
2 parents 86e90c5 + 742cbf3 commit c9abc2a

File tree

3 files changed

+21
-16
lines changed

3 files changed

+21
-16
lines changed
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
* [#862](https://github.com/rubocop/rubocop-rails/pull/862): Ignore if number of arguments does not match on `Rails/DynamicFindBy`. ([@r7kamura][])

lib/rubocop/cop/rails/dynamic_find_by.rb

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ def on_send(node)
5353
method_name = node.method_name
5454
static_name = static_method_name(method_name)
5555
return unless static_name
56-
return if node.arguments.any? { |argument| IGNORED_ARGUMENT_TYPES.include?(argument.type) }
56+
return unless dynamic_find_by_arguments?(node)
5757

5858
message = format(MSG, static_name: static_name, method: method_name)
5959
add_offense(node, message: message) do |corrector|
@@ -65,12 +65,8 @@ def on_send(node)
6565
private
6666

6767
def autocorrect(corrector, node)
68-
keywords = column_keywords(node.method_name)
69-
70-
return if keywords.size != node.arguments.size
71-
7268
autocorrect_method_name(corrector, node)
73-
autocorrect_argument_keywords(corrector, node, keywords)
69+
autocorrect_argument_keywords(corrector, node, column_keywords(node.method_name))
7470
end
7571

7672
def allowed_invocation?(node)
@@ -120,6 +116,20 @@ def static_method_name(method_name)
120116

121117
match[2] ? 'find_by!' : 'find_by'
122118
end
119+
120+
def dynamic_find_by_arguments?(node)
121+
dynamic_find_by_arguments_count?(node) && dynamic_find_by_arguments_type?(node)
122+
end
123+
124+
def dynamic_find_by_arguments_count?(node)
125+
column_keywords(node.method_name).size == node.arguments.size
126+
end
127+
128+
def dynamic_find_by_arguments_type?(node)
129+
node.arguments.none? do |argument|
130+
IGNORED_ARGUMENT_TYPES.include?(argument.type)
131+
end
132+
end
123133
end
124134
end
125135
end

spec/rubocop/cop/rails/dynamic_find_by_spec.rb

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -105,24 +105,18 @@
105105
end
106106

107107
context 'with too much arguments' do
108-
it 'registers an offense and no corrects' do
109-
expect_offense(<<~RUBY)
108+
it 'does not register an offense' do
109+
expect_no_offenses(<<~RUBY)
110110
User.find_by_name_and_email(name, email, token)
111-
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Use `find_by` instead of dynamic `find_by_name_and_email`.
112111
RUBY
113-
114-
expect_no_corrections
115112
end
116113
end
117114

118115
context 'with too few arguments' do
119-
it 'registers an offense and no corrects' do
120-
expect_offense(<<~RUBY)
116+
it 'does not register an offense' do
117+
expect_no_offenses(<<~RUBY)
121118
User.find_by_name_and_email(name)
122-
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Use `find_by` instead of dynamic `find_by_name_and_email`.
123119
RUBY
124-
125-
expect_no_corrections
126120
end
127121
end
128122

0 commit comments

Comments
 (0)