Skip to content

Commit 30112c4

Browse files
authored
Prism: Adds support for mailer subjects (#666)
1 parent 5ed8c5a commit 30112c4

File tree

3 files changed

+105
-7
lines changed

3 files changed

+105
-7
lines changed

lib/i18n/tasks/scanners/prism_scanners/nodes.rb

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -224,8 +224,14 @@ def add_child(node)
224224
end
225225

226226
def process # rubocop:disable Metrics/AbcSize,Metrics/CyclomaticComplexity,Metrics/MethodLength,Metrics/PerceivedComplexity
227-
return super unless controller?
227+
if controller?
228+
process_controller
229+
else
230+
super
231+
end
232+
end
228233

234+
def process_controller
229235
methods_by_name = @methods.group_by(&:name)
230236
private_methods_by_name = @private_methods.group_by(&:name)
231237

@@ -283,15 +289,19 @@ def private_methods!
283289
end
284290

285291
def support_relative_keys?
286-
@rails && controller?
292+
controller? || mailer?
287293
end
288294

289295
def path
290296
(@parent&.path || []) + [path_name]
291297
end
292298

293299
def controller?
294-
@node.name.to_s.end_with?("Controller")
300+
@rails && @node.name.to_s.end_with?("Controller")
301+
end
302+
303+
def mailer?
304+
@rails && @node.name.to_s.end_with?("Mailer")
295305
end
296306

297307
def path_name

lib/i18n/tasks/scanners/prism_scanners/visitor.rb

Lines changed: 58 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -163,15 +163,69 @@ def handle_comments(node)
163163
# ---- Rails specific methods ----
164164
# Returns true if the node was handled
165165
def handle_rails_call_node(node, &)
166+
# First, handle calls that should be matched everywhere
166167
case node.name
167-
when :before_action
168-
rails_handle_before_action(node, &)
169168
when :human_attribute_name
170169
rails_handle_human_attribute_name(node)
170+
return true
171171
when :human
172-
return if node.receiver.name != :model_name
173-
172+
return false if node.receiver.nil? || node.receiver.name != :model_name
174173
rails_handle_model_name(node)
174+
return true
175+
end
176+
177+
if @current_class&.controller?
178+
rails_handle_controller_call_node(node, &)
179+
elsif @current_class&.mailer?
180+
rails_handle_mailer_call_node(node, &)
181+
else
182+
false
183+
end
184+
end
185+
186+
def rails_handle_controller_call_node(node, &)
187+
case node.name
188+
when :before_action
189+
rails_handle_before_action(node, &)
190+
true
191+
else
192+
false
193+
end
194+
end
195+
196+
def rails_handle_mailer_call_node(node, &)
197+
case node.name
198+
when :mail
199+
_array_args, keywords = process_arguments(node)
200+
if keywords.key?("subject")
201+
# Let traversal continue so nested calls (e.g., t('.subject') or default_i18n_subject)
202+
# get processed by their own handlers.
203+
false
204+
else
205+
parent.add_translation_call(
206+
TranslationCall.new(
207+
node: node,
208+
receiver: nil,
209+
key: ".subject",
210+
parent: parent,
211+
options: {}
212+
)
213+
)
214+
true
215+
end
216+
when :default_i18n_subject
217+
parent.add_translation_call(
218+
TranslationCall.new(
219+
node: node,
220+
receiver: nil,
221+
key: ".subject",
222+
parent: parent,
223+
options: {}
224+
)
225+
)
226+
true
227+
else
228+
false
175229
end
176230
end
177231

spec/prism_scanner_spec.rb

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -439,6 +439,40 @@ def value
439439
end
440440
end
441441

442+
describe "mailers" do
443+
it "detects mailer" do
444+
source = <<~RUBY
445+
class UserMailer < ApplicationMailer
446+
def welcome_email(user)
447+
@user = user
448+
# Make sure it does not expect `.subject` from this method
449+
mail(to: @user.email, subject: t('.subject_with_other_key'))
450+
end
451+
452+
def notification_email(user)
453+
@user = user
454+
mail(to: @user.email, subject: default_i18n_subject)
455+
end
456+
457+
def other_email(user)
458+
mail(to: user.email)
459+
end
460+
end
461+
RUBY
462+
463+
occurrences =
464+
process_string("app/mailers/user_mailer.rb", source)
465+
466+
expect(occurrences.map(&:first).uniq).to match_array(
467+
%w[
468+
user_mailer.notification_email.subject
469+
user_mailer.other_email.subject
470+
user_mailer.welcome_email.subject_with_other_key
471+
]
472+
)
473+
end
474+
end
475+
442476
describe "magic comments" do
443477
it "i18n-tasks-use" do
444478
source = <<~'RUBY'

0 commit comments

Comments
 (0)