From 3fb560908e87fe7ca33743d4afe3c12dbc331d7e Mon Sep 17 00:00:00 2001 From: lsylvester Date: Tue, 10 Mar 2015 20:33:43 +1100 Subject: [PATCH 1/4] cache the serializers for a class --- lib/active_model/serializer.rb | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/lib/active_model/serializer.rb b/lib/active_model/serializer.rb index 6652ac44..faab5c77 100644 --- a/lib/active_model/serializer.rb +++ b/lib/active_model/serializer.rb @@ -201,14 +201,20 @@ module ActiveModel private - def self.get_serializer_for(klass) - serializer_class_name = "#{klass.name}Serializer" - serializer_class = serializer_class_name.safe_constantize + def self.serializers_cache + @serializers_cache ||= Threadsafe::Cache.new + end - if serializer_class - serializer_class - elsif klass.superclass - get_serializer_for(klass.superclass) + def self.get_serializer_for(klass) + serializers_cache.fetch_or_store(klass) do + serializer_class_name = "#{klass.name}Serializer" + serializer_class = serializer_class_name.safe_constantize + + if serializer_class + serializer_class + elsif klass.superclass + get_serializer_for(klass.superclass) + end end end From 2b0c5ee084d2e86bd449fbb85b749b7ab382223d Mon Sep 17 00:00:00 2001 From: lsylvester Date: Tue, 10 Mar 2015 20:59:48 +1100 Subject: [PATCH 2/4] clear the cache between requests --- lib/active_model/serializer.rb | 6 +++--- lib/active_model_serializers.rb | 3 +++ 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/lib/active_model/serializer.rb b/lib/active_model/serializer.rb index faab5c77..c4630ab6 100644 --- a/lib/active_model/serializer.rb +++ b/lib/active_model/serializer.rb @@ -199,12 +199,12 @@ module ActiveModel opts end - private - def self.serializers_cache - @serializers_cache ||= Threadsafe::Cache.new + @serializers_cache ||= ThreadSafe::Cache.new end + private + def self.get_serializer_for(klass) serializers_cache.fetch_or_store(klass) do serializer_class_name = "#{klass.name}Serializer" diff --git a/lib/active_model_serializers.rb b/lib/active_model_serializers.rb index f566280e..31925583 100644 --- a/lib/active_model_serializers.rb +++ b/lib/active_model_serializers.rb @@ -9,6 +9,9 @@ begin ActiveSupport.on_load(:action_controller) do include ::ActionController::Serialization + ActionDispatch::Reloader.to_prepare do + ActiveModel::Serializer.serializers_cache.clear + end end rescue LoadError # rails not installed, continuing From 980d1ced8146de9220f8113d1134066cdd6c2d0b Mon Sep 17 00:00:00 2001 From: Lachlan Sylvester Date: Wed, 11 Mar 2015 11:15:17 +1100 Subject: [PATCH 3/4] add explicit thread_safe dependency --- active_model_serializers.gemspec | 2 +- lib/active_model/serializer.rb | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/active_model_serializers.gemspec b/active_model_serializers.gemspec index 3ae91fc1..b39f3bbf 100644 --- a/active_model_serializers.gemspec +++ b/active_model_serializers.gemspec @@ -19,7 +19,7 @@ Gem::Specification.new do |spec| spec.require_paths = ["lib"] spec.add_dependency "activemodel", ">= 4.0" - + spec.add_dependency 'thread_safe','~> 0.3', '>= 0.3.4' spec.add_development_dependency "rails", ">= 4.0" spec.add_development_dependency "bundler", "~> 1.6" spec.add_development_dependency "rake" diff --git a/lib/active_model/serializer.rb b/lib/active_model/serializer.rb index c4630ab6..ef3f31af 100644 --- a/lib/active_model/serializer.rb +++ b/lib/active_model/serializer.rb @@ -1,3 +1,5 @@ +require 'thread_safe' + module ActiveModel class Serializer extend ActiveSupport::Autoload From 270b31258f21bc3ff5045bb17b55aa0cdf63336a Mon Sep 17 00:00:00 2001 From: Lachlan Sylvester Date: Thu, 12 Mar 2015 16:01:09 +1100 Subject: [PATCH 4/4] remove the thread_safe dependency. Relay on rails for this --- active_model_serializers.gemspec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/active_model_serializers.gemspec b/active_model_serializers.gemspec index b39f3bbf..3ae91fc1 100644 --- a/active_model_serializers.gemspec +++ b/active_model_serializers.gemspec @@ -19,7 +19,7 @@ Gem::Specification.new do |spec| spec.require_paths = ["lib"] spec.add_dependency "activemodel", ">= 4.0" - spec.add_dependency 'thread_safe','~> 0.3', '>= 0.3.4' + spec.add_development_dependency "rails", ">= 4.0" spec.add_development_dependency "bundler", "~> 1.6" spec.add_development_dependency "rake"