Skip to content

Commit 0be1a60

Browse files
authored
Merge pull request rails#52188 from fatkodima/activejob-rescue_from-i18n
Preserve timezone and locale in ActiveJob exception handlers
2 parents fe0270c + f0c0c31 commit 0be1a60

File tree

8 files changed

+65
-33
lines changed

8 files changed

+65
-33
lines changed

activejob/lib/active_job/base.rb

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,7 @@
1111
require "active_job/log_subscriber"
1212
require "active_job/logging"
1313
require "active_job/instrumentation"
14-
require "active_job/timezones"
15-
require "active_job/translation"
14+
require "active_job/execution_state"
1615

1716
module ActiveJob # :nodoc:
1817
# = Active Job \Base
@@ -71,8 +70,7 @@ class Base
7170
include Exceptions
7271
include Instrumentation
7372
include Logging
74-
include Timezones
75-
include Translation
73+
include ExecutionState
7674

7775
ActiveSupport.run_load_hooks(:active_job, self)
7876
end
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
# frozen_string_literal: true
2+
3+
module ActiveJob
4+
module ExecutionState # :nodoc:
5+
def perform_now
6+
I18n.with_locale(locale) do
7+
Time.use_zone(timezone) { super }
8+
end
9+
end
10+
end
11+
end

activejob/lib/active_job/timezones.rb

Lines changed: 0 additions & 13 deletions
This file was deleted.

activejob/lib/active_job/translation.rb

Lines changed: 0 additions & 13 deletions
This file was deleted.

activejob/test/cases/timezones_test.rb

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
require "helper"
44
require "jobs/timezone_dependent_job"
5+
require "jobs/timezone_raising_job"
56

67
class TimezonesTest < ActiveSupport::TestCase
78
setup do
@@ -35,4 +36,17 @@ class TimezonesTest < ActiveSupport::TestCase
3536
ensure
3637
Time.zone = nil
3738
end
39+
40+
test "it runs the exception handler in the given locale" do
41+
Time.zone = "America/New_York"
42+
43+
Time.use_zone("London") do
44+
job = TimezoneRaisingJob.new
45+
job.perform_now
46+
end
47+
48+
assert_equal "London", JobBuffer.last_value
49+
ensure
50+
Time.zone = nil
51+
end
3852
end

activejob/test/cases/translation_test.rb

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,21 +2,29 @@
22

33
require "helper"
44
require "jobs/translated_hello_job"
5+
require "jobs/translated_raising_job"
56

67
class TranslationTest < ActiveSupport::TestCase
78
setup do
89
JobBuffer.clear
910
I18n.available_locales = [:en, :de]
10-
@job = TranslatedHelloJob.new("Johannes")
1111
end
1212

1313
teardown do
1414
I18n.available_locales = [:en]
1515
end
1616

1717
test "it performs the job in the given locale" do
18-
@job.locale = :de
19-
@job.perform_now
18+
job = TranslatedHelloJob.new("Johannes")
19+
job.locale = :de
20+
job.perform_now
2021
assert_equal "Johannes says Guten Tag", JobBuffer.last_value
2122
end
23+
24+
test "it runs the exception handler in the given locale" do
25+
job = TranslatedRaisingJob.new
26+
job.locale = :de
27+
job.perform_now
28+
assert_equal :de, JobBuffer.last_value
29+
end
2230
end
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
# frozen_string_literal: true
2+
3+
require_relative "../support/job_buffer"
4+
require "active_support/time"
5+
6+
class TimezoneRaisingJob < ActiveJob::Base
7+
rescue_from(StandardError) do
8+
JobBuffer.add(Time.zone.name)
9+
end
10+
11+
def perform
12+
raise "boom"
13+
end
14+
end
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
# frozen_string_literal: true
2+
3+
require_relative "../support/job_buffer"
4+
5+
class TranslatedRaisingJob < ActiveJob::Base
6+
rescue_from(StandardError) do
7+
JobBuffer.add(I18n.locale)
8+
end
9+
10+
def perform
11+
raise "boom"
12+
end
13+
end

0 commit comments

Comments
 (0)