From a55636d8d5148adc3a8a0910f693f17df7daf53b Mon Sep 17 00:00:00 2001 From: jose Date: Sat, 17 Feb 2024 13:00:35 -0600 Subject: [PATCH] making all adapters poolable removing idea fixing specs --- lib/flipper/adapter.rb | 3 +++ lib/flipper/adapters/poolable.rb | 31 +++++++++++++++++++++++ lib/flipper/adapters/redis_pool.rb | 32 ------------------------ spec/flipper/adapters/redis_pool_spec.rb | 10 -------- spec/support/examples/redis_adapter.rb | 2 +- test/adapters/redis_pool_test.rb | 15 ----------- 6 files changed, 35 insertions(+), 58 deletions(-) create mode 100644 lib/flipper/adapters/poolable.rb delete mode 100644 lib/flipper/adapters/redis_pool.rb delete mode 100644 spec/flipper/adapters/redis_pool_spec.rb delete mode 100644 test/adapters/redis_pool_test.rb diff --git a/lib/flipper/adapter.rb b/lib/flipper/adapter.rb index 7e59e0502..83aaf3389 100644 --- a/lib/flipper/adapter.rb +++ b/lib/flipper/adapter.rb @@ -1,8 +1,11 @@ +require 'flipper/adapters/poolable' + module Flipper # Adding a module include so we have some hooks for stuff down the road module Adapter def self.included(base) base.extend(ClassMethods) + base.include(::Flipper::Adapters::Poolable) end module ClassMethods diff --git a/lib/flipper/adapters/poolable.rb b/lib/flipper/adapters/poolable.rb new file mode 100644 index 000000000..25c300778 --- /dev/null +++ b/lib/flipper/adapters/poolable.rb @@ -0,0 +1,31 @@ +# frozen_string_literal: true + +module Flipper + module Adapters + module Poolable + def initialize(client_or_pool = nil, key_prefix: nil) + @pool = nil + @client = nil + if client_or_pool.respond_to?(:with) + @pool = client_or_pool + else + @client = client_or_pool + end + @key_prefix = key_prefix + end + + def self.included(klass) + klass.superclass.instance_methods(false).each do |method| + klass.define_method method do |*args| + return super(*args) unless @client.nil? + + @pool.with do |client| + @client = client + super(*args).tap { @client = nil } + end + end + end + end + end + end +end diff --git a/lib/flipper/adapters/redis_pool.rb b/lib/flipper/adapters/redis_pool.rb deleted file mode 100644 index 2538f984f..000000000 --- a/lib/flipper/adapters/redis_pool.rb +++ /dev/null @@ -1,32 +0,0 @@ -require 'flipper/adapters/redis' -require 'connection_pool' - -module Flipper - module Adapters - class RedisPool < Redis - def initialize(pool, key_prefix: nil) - @pool = pool - @key_prefix = key_prefix - end - - superclass.instance_methods(false).each do |method| - define_method method do |*args| - return super(*args) unless @client.nil? - - @pool.with do |client| - @client = client - super(*args).tap { @client = nil } - end - end - end - end - end -end - - -Flipper.configure do |config| - config.adapter do - client = ConnectionPool.new(size: 1) { Redis.new(url: ENV["FLIPPER_REDIS_URL"] || ENV["REDIS_URL"]) } - Flipper::Adapters::RedisPool.new(client) - end -end diff --git a/spec/flipper/adapters/redis_pool_spec.rb b/spec/flipper/adapters/redis_pool_spec.rb deleted file mode 100644 index 2898e381d..000000000 --- a/spec/flipper/adapters/redis_pool_spec.rb +++ /dev/null @@ -1,10 +0,0 @@ -require 'flipper/adapters/redis_pool' - -RSpec.describe Flipper::Adapters::RedisPool do - subject do - pool = ConnectionPool.new(size: 1, &create_client) - described_class.new(pool, key_prefix: key_prefix) - end - - it_behaves_like "a redis adapter" -end diff --git a/spec/support/examples/redis_adapter.rb b/spec/support/examples/redis_adapter.rb index 8cfcdbada..d3f6b0c3b 100644 --- a/spec/support/examples/redis_adapter.rb +++ b/spec/support/examples/redis_adapter.rb @@ -24,7 +24,7 @@ Flipper.configuration = nil Flipper.instance = nil - silence { load 'flipper/adapters/redis_pool.rb' } + silence { load 'flipper/adapters/redis.rb' } expect(Flipper.adapter.adapter).to be_a(described_class) end diff --git a/test/adapters/redis_pool_test.rb b/test/adapters/redis_pool_test.rb deleted file mode 100644 index d4f23c851..000000000 --- a/test/adapters/redis_pool_test.rb +++ /dev/null @@ -1,15 +0,0 @@ -require 'test_helper' -require 'flipper/adapters/redis_pool' - -class RedisPoolTest < MiniTest::Test - prepend Flipper::Test::SharedAdapterTests - - def setup - url = ENV.fetch('REDIS_URL', 'redis://localhost:6379') - pool = ConnectionPool.new(size: 1) { Redis.new(url: url) } - pool.with { |client| client.flushdb } - @adapter = Flipper::Adapters::RedisPool.new(pool) - rescue Redis::CannotConnectError - ENV['CI'] ? raise : skip('Redis not available') - end -end