Backport caching of the constant lookup

This commit is contained in:
Dylan Thacker-Smith 2017-03-15 16:27:44 -04:00
parent c2565ed726
commit 039e6eac34
3 changed files with 16 additions and 6 deletions

View File

@ -4,6 +4,7 @@ module ActiveModel
extend self extend self
def _const_get(const) def _const_get(const)
Serializer.serializers_cache.fetch_or_store(const) do
begin begin
method = RUBY_VERSION >= '2.0' ? :const_get : :qualified_const_get method = RUBY_VERSION >= '2.0' ? :const_get : :qualified_const_get
Object.send method, const Object.send method, const
@ -13,4 +14,5 @@ module ActiveModel
end end
end end
end end
end
end end

View File

@ -4,6 +4,7 @@ require 'active_model/serializer/association'
require 'active_model/serializer/config' require 'active_model/serializer/config'
require 'thread' require 'thread'
require 'concurrent/map'
module ActiveModel module ActiveModel
class Serializer class Serializer
@ -100,6 +101,10 @@ end
associate(Association::HasMany, *attrs) associate(Association::HasMany, *attrs)
end end
def serializers_cache
@serializers_cache ||= Concurrent::Map.new
end
private private
def strip_attribute(attr) def strip_attribute(attr)

View File

@ -14,6 +14,9 @@ begin
ActionController::Base.send(:include, ::ActionController::Serialization) ActionController::Base.send(:include, ::ActionController::Serialization)
ActionController::TestCase.send(:include, ::ActionController::SerializationAssertions) ActionController::TestCase.send(:include, ::ActionController::SerializationAssertions)
end end
ActionDispatch::Reloader.to_prepare do
ActiveModel::Serializer.serializers_cache.clear
end
end end
rescue LoadError rescue LoadError
# rails not installed, continuing # rails not installed, continuing