lib/flipper/middleware/memoizer.rb in flipper-0.21.0.rc1 vs lib/flipper/middleware/memoizer.rb in flipper-0.21.0.rc2
- old
+ new
@@ -6,12 +6,11 @@
# setup in the env of the request. You can do this by using the
# Flipper::Middleware::SetupEnv middleware.
#
# app - The app this middleware is included in.
# opts - The Hash of options.
- # :preload_all - Boolean of whether or not to preload all features.
- # :preload - Array of Symbol feature names to preload.
+ # :preload - Boolean to preload all features or Array of Symbol feature names to preload.
#
# Examples
#
# use Flipper::Middleware::Memoizer
#
@@ -24,50 +23,66 @@
def initialize(app, opts = {})
if opts.is_a?(Flipper::DSL) || opts.is_a?(Proc)
raise 'Flipper::Middleware::Memoizer no longer initializes with a flipper instance or block. Read more at: https://git.io/vSo31.'
end
+ if opts[:preload_all]
+ warn "Flipper::Middleware::Memoizer: `preload_all` is deprecated, use `preload: true`"
+ opts[:preload] = true
+ end
+
@app = app
@opts = opts
@env_key = opts.fetch(:env_key, 'flipper')
end
def call(env)
request = Rack::Request.new(env)
- if skip_memoize?(request)
- @app.call(env)
- else
+ if memoize?(request)
memoized_call(env)
+ else
+ @app.call(env)
end
end
private
- def skip_memoize?(request)
- @opts[:unless] && @opts[:unless].call(request)
+ def memoize?(request)
+ if @opts[:if]
+ @opts[:if].call(request)
+ elsif @opts[:unless]
+ !@opts[:unless].call(request)
+ else
+ true
+ end
end
def memoized_call(env)
reset_on_body_close = false
flipper = env.fetch(@env_key) { Flipper }
- original = flipper.memoizing?
- flipper.memoize = true
- flipper.preload_all if @opts[:preload_all]
+ # Already memoizing. This instance does not need to do anything.
+ if flipper.memoizing?
+ warn "Flipper::Middleware::Memoizer appears to be running twice. Read how to resolve this at https://github.com/jnunemaker/flipper/pull/523"
+ return @app.call(env)
+ end
- if (preload = @opts[:preload])
- flipper.preload(preload)
+ flipper.memoize = true
+
+ case @opts[:preload]
+ when true then flipper.preload_all
+ when Array then flipper.preload(@opts[:preload])
end
response = @app.call(env)
response[2] = Rack::BodyProxy.new(response[2]) do
- flipper.memoize = original
+ flipper.memoize = false
end
reset_on_body_close = true
response
ensure
- flipper.memoize = original if flipper && !reset_on_body_close
+ flipper.memoize = false if flipper && !reset_on_body_close
end
end
end
end