Extract local cache middleware

Extract LocalCache Middleware, so it can requires rack dependencies,
without adding rack dependencies to `AS::Cache::Strategy::LocalCache`.
This commit is contained in:
Arthur Neves 2014-02-23 14:17:15 -05:00
parent 96759cf6c6
commit cb172db3ff
No known key found for this signature in database
GPG Key ID: 04A390FB1E433E17
2 changed files with 41 additions and 32 deletions

@ -1,6 +1,5 @@
require 'active_support/core_ext/object/duplicable' require 'active_support/core_ext/object/duplicable'
require 'active_support/core_ext/string/inflections' require 'active_support/core_ext/string/inflections'
require 'rack/body_proxy'
module ActiveSupport module ActiveSupport
module Cache module Cache
@ -9,6 +8,8 @@ module Strategy
# duration of a block. Repeated calls to the cache for the same key will hit the # duration of a block. Repeated calls to the cache for the same key will hit the
# in-memory cache for faster access. # in-memory cache for faster access.
module LocalCache module LocalCache
autoload :Middleware, 'active_support/cache/strategy/local_cache_middleware'
# Class for storing and registering the local caches. # Class for storing and registering the local caches.
class LocalCacheRegistry # :nodoc: class LocalCacheRegistry # :nodoc:
extend ActiveSupport::PerThreadRegistry extend ActiveSupport::PerThreadRegistry
@ -64,37 +65,6 @@ def delete_entry(key, options)
def with_local_cache def with_local_cache
use_temporary_local_cache(LocalStore.new) { yield } use_temporary_local_cache(LocalStore.new) { yield }
end end
#--
# This class wraps up local storage for middlewares. Only the middleware method should
# construct them.
class Middleware # :nodoc:
attr_reader :name, :local_cache_key
def initialize(name, local_cache_key)
@name = name
@local_cache_key = local_cache_key
@app = nil
end
def new(app)
@app = app
self
end
def call(env)
LocalCacheRegistry.set_cache_for(local_cache_key, LocalStore.new)
response = @app.call(env)
response[2] = ::Rack::BodyProxy.new(response[2]) do
LocalCacheRegistry.set_cache_for(local_cache_key, nil)
end
response
rescue Exception
LocalCacheRegistry.set_cache_for(local_cache_key, nil)
raise
end
end
# Middleware class can be inserted as a Rack handler to be local cache for the # Middleware class can be inserted as a Rack handler to be local cache for the
# duration of request. # duration of request.
def middleware def middleware

@ -0,0 +1,39 @@
require 'rack/body_proxy'
module ActiveSupport
module Cache
module Strategy
module LocalCache
#--
# This class wraps up local storage for middlewares. Only the middleware method should
# construct them.
class Middleware # :nodoc:
attr_reader :name, :local_cache_key
def initialize(name, local_cache_key)
@name = name
@local_cache_key = local_cache_key
@app = nil
end
def new(app)
@app = app
self
end
def call(env)
LocalCacheRegistry.set_cache_for(local_cache_key, LocalStore.new)
response = @app.call(env)
response[2] = ::Rack::BodyProxy.new(response[2]) do
LocalCacheRegistry.set_cache_for(local_cache_key, nil)
end
response
rescue Exception
LocalCacheRegistry.set_cache_for(local_cache_key, nil)
raise
end
end
end
end
end
end