aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--activesupport/lib/active_support/current_attributes.rb13
-rw-r--r--activesupport/lib/active_support/railtie.rb5
-rw-r--r--railties/test/application/current_attributes_integration_test.rb26
3 files changed, 22 insertions, 22 deletions
diff --git a/activesupport/lib/active_support/current_attributes.rb b/activesupport/lib/active_support/current_attributes.rb
index 9921241c23..872b0663c7 100644
--- a/activesupport/lib/active_support/current_attributes.rb
+++ b/activesupport/lib/active_support/current_attributes.rb
@@ -87,9 +87,7 @@ module ActiveSupport
class << self
# Returns singleton instance for this class in this thread. If none exists, one is created.
def instance
- Thread.current[:"current_attributes_for_#{name}"] ||= new.tap do |instance|
- current_instances << instance
- end
+ current_instances[name] ||= new
end
# Declares one or more attributes that will be given both class and instance accessor methods.
@@ -125,7 +123,12 @@ module ActiveSupport
delegate :set, :reset, to: :instance
def reset_all # :nodoc:
- current_instances.each(&:reset)
+ current_instances.each_value(&:reset)
+ end
+
+ def clear_all # :nodoc:
+ reset_all
+ current_instances.clear
end
private
@@ -134,7 +137,7 @@ module ActiveSupport
end
def current_instances
- Thread.current[:current_attributes_instances] ||= []
+ Thread.current[:current_attributes_instances] ||= {}
end
def method_missing(name, *args, &block)
diff --git a/activesupport/lib/active_support/railtie.rb b/activesupport/lib/active_support/railtie.rb
index 39c83f65a3..1b4ecf4d72 100644
--- a/activesupport/lib/active_support/railtie.rb
+++ b/activesupport/lib/active_support/railtie.rb
@@ -8,8 +8,9 @@ module ActiveSupport
config.eager_load_namespaces << ActiveSupport
initializer "active_support.reset_all_current_attributes_instances" do |app|
- app.executor.to_run { ActiveSupport::CurrentAttributes.reset_all }
- app.executor.to_complete { ActiveSupport::CurrentAttributes.reset_all }
+ app.reloader.before_class_unload { ActiveSupport::CurrentAttributes.clear_all }
+ app.executor.to_run { ActiveSupport::CurrentAttributes.reset_all }
+ app.executor.to_complete { ActiveSupport::CurrentAttributes.reset_all }
end
initializer "active_support.deprecation_behavior" do |app|
diff --git a/railties/test/application/current_attributes_integration_test.rb b/railties/test/application/current_attributes_integration_test.rb
index b6659f296a..5653ec0be1 100644
--- a/railties/test/application/current_attributes_integration_test.rb
+++ b/railties/test/application/current_attributes_integration_test.rb
@@ -52,19 +52,6 @@ class CurrentAttributesIntegrationTest < ActiveSupport::TestCase
<%= Current.customer.try(:name) || 'noone' %>,<%= Time.zone.name %>
RUBY
- app_file "app/executor_intercept.rb", <<-RUBY
- check_state = -> { puts [ Current.customer.try(:name) || "noone", Time.zone.name ].join(",") }
-
- check_state.call
-
- Rails.application.executor.wrap do
- Current.customer = Customer.new("david")
- check_state.call
- end
-
- check_state.call
- RUBY
-
require "#{app_path}/config/environment"
end
@@ -81,8 +68,17 @@ class CurrentAttributesIntegrationTest < ActiveSupport::TestCase
end
test "resets after execution" do
- Dir.chdir(app_path) do
- assert_equal "noone,UTC\ndavid,Copenhagen\nnoone,UTC\n", `bin/rails runner app/executor_intercept.rb`
+ assert_nil Current.customer
+ assert_equal "UTC", Time.zone.name
+
+ Rails.application.executor.wrap do
+ Current.customer = Customer.new("david")
+
+ assert_equal "david", Current.customer.name
+ assert_equal "Copenhagen", Time.zone.name
end
+
+ assert_nil Current.customer
+ assert_equal "UTC", Time.zone.name
end
end