From 97ce4d842fa07dd468c35244149c95e34f2da4c4 Mon Sep 17 00:00:00 2001 From: Brandon Keepers Date: Mon, 13 Mar 2023 12:21:37 -0400 Subject: [PATCH] Use `memoize` option when using Cloud --- lib/flipper/cloud/configuration.rb | 4 ++++ lib/flipper/cloud/dsl.rb | 5 ++++- lib/flipper/cloud/engine.rb | 3 ++- spec/flipper/cloud/dsl_spec.rb | 23 +++++++++++++++++++++++ 4 files changed, 33 insertions(+), 2 deletions(-) diff --git a/lib/flipper/cloud/configuration.rb b/lib/flipper/cloud/configuration.rb index 810274296..d4d4052b9 100644 --- a/lib/flipper/cloud/configuration.rb +++ b/lib/flipper/cloud/configuration.rb @@ -40,6 +40,9 @@ def self.brow_instances # Public: net/http write timeout for all http requests (default: 5). attr_accessor :write_timeout + # Public: Memoize adapter operations. Defaults to true. + attr_accessor :memoize + # Public: IO stream to send debug output too. Off by default. # # # for example, this would send all http request information to STDOUT @@ -85,6 +88,7 @@ def initialize(options = {}) @sync_interval = options.fetch(:sync_interval) { ENV.fetch("FLIPPER_CLOUD_SYNC_INTERVAL", 10).to_f } @sync_secret = options.fetch(:sync_secret) { ENV["FLIPPER_CLOUD_SYNC_SECRET"] } @local_adapter = options.fetch(:local_adapter) { Adapters::Memory.new } + @memoize = options.fetch(:memoize, true) @debug_output = options[:debug_output] @adapter_block = ->(adapter) { adapter } self.url = options.fetch(:url) { ENV.fetch("FLIPPER_CLOUD_URL", DEFAULT_URL) } diff --git a/lib/flipper/cloud/dsl.rb b/lib/flipper/cloud/dsl.rb index c9ceb2c1c..3f165a8a7 100644 --- a/lib/flipper/cloud/dsl.rb +++ b/lib/flipper/cloud/dsl.rb @@ -7,7 +7,10 @@ class DSL < SimpleDelegator def initialize(cloud_configuration) @cloud_configuration = cloud_configuration - super Flipper.new(@cloud_configuration.adapter, instrumenter: @cloud_configuration.instrumenter) + super Flipper.new(@cloud_configuration.adapter, + instrumenter: @cloud_configuration.instrumenter, + memoize: @cloud_configuration.memoize + ) end def sync diff --git a/lib/flipper/cloud/engine.rb b/lib/flipper/cloud/engine.rb index 60f2636a8..cf4730ab0 100644 --- a/lib/flipper/cloud/engine.rb +++ b/lib/flipper/cloud/engine.rb @@ -15,7 +15,8 @@ class Engine < Rails::Engine if ENV["FLIPPER_CLOUD_TOKEN"] Flipper::Cloud.new( local_adapter: config.adapter, - instrumenter: app.config.flipper.instrumenter + instrumenter: app.config.flipper.instrumenter, + memoize: app.config.flipper.memoize ) else warn "Missing FLIPPER_CLOUD_TOKEN environment variable. Disabling Flipper::Cloud." diff --git a/spec/flipper/cloud/dsl_spec.rb b/spec/flipper/cloud/dsl_spec.rb index 9dec2ac27..ad829e0c9 100644 --- a/spec/flipper/cloud/dsl_spec.rb +++ b/spec/flipper/cloud/dsl_spec.rb @@ -79,4 +79,27 @@ expect(enable_stub).to have_been_requested end end + + context "when memoize = :poll" do + let(:local_adapter) do + Flipper::Adapters::OperationLogger.new Flipper::Adapters::Memory.new + end + + let(:cloud_configuration) do + cloud_configuration = Flipper::Cloud::Configuration.new({ + token: "asdf", + sync_secret: "tasty", + local_adapter: local_adapter, + memoize: :poll + }) + end + + subject do + described_class.new(cloud_configuration) + end + + it "uses a poll adaptor" do + expect(subject.adapter).to be_a(Flipper::Adapters::Poll) + end + end end