diff --git a/features/step_definitions/evaluation_steps.rb b/features/step_definitions/evaluation_steps.rb index 1c8b7ecb..d55644df 100644 --- a/features/step_definitions/evaluation_steps.rb +++ b/features/step_definitions/evaluation_steps.rb @@ -17,11 +17,8 @@ when "stale" then OpenFeature::SDK::ProviderState::STALE end - registry = OpenFeature::SDK.configuration.send(:instance_variable_get, :@provider_state_registry) - registry.send(:instance_variable_get, :@mutex).synchronize do - states = registry.send(:instance_variable_get, :@states) - states[provider.object_id] = {state: state, details: {}} - end + registry = OpenFeature::SDK.configuration.instance_variable_get(:@provider_state_registry) + registry.set_initial_state(provider, state) @provider = provider end diff --git a/lib/open_feature/sdk/provider_state_registry.rb b/lib/open_feature/sdk/provider_state_registry.rb index b825b2cf..a065973b 100644 --- a/lib/open_feature/sdk/provider_state_registry.rb +++ b/lib/open_feature/sdk/provider_state_registry.rb @@ -9,7 +9,7 @@ module SDK # Tracks provider states class ProviderStateRegistry def initialize - @states = {} + @states = {}.compare_by_identity @mutex = Mutex.new end @@ -17,7 +17,7 @@ def set_initial_state(provider, state = ProviderState::NOT_READY) return unless provider @mutex.synchronize do - @states[provider.object_id] = {state: state, details: {}} + @states[provider] = {state: state, details: {}} end end @@ -29,7 +29,7 @@ def update_state_from_event(provider, event_type, event_details = nil) # Only update state if the event should cause a state change if new_state @mutex.synchronize do - @states[provider.object_id] = {state: new_state, details: event_details || {}} + @states[provider] = {state: new_state, details: event_details || {}} end new_state else @@ -42,7 +42,7 @@ def get_state(provider) return ProviderState::NOT_READY unless provider @mutex.synchronize do - entry = @states[provider.object_id] + entry = @states[provider] entry ? entry[:state] : ProviderState::NOT_READY end end @@ -51,7 +51,7 @@ def get_details(provider) return {} unless provider @mutex.synchronize do - entry = @states[provider.object_id] + entry = @states[provider] entry ? entry[:details] : {} end end @@ -60,7 +60,7 @@ def remove_provider(provider) return unless provider @mutex.synchronize do - @states.delete(provider.object_id) + @states.delete(provider) end end @@ -68,7 +68,7 @@ def tracked?(provider) return false unless provider @mutex.synchronize do - @states.key?(provider.object_id) + @states.key?(provider) end end diff --git a/spec/open_feature/sdk/provider_state_registry_spec.rb b/spec/open_feature/sdk/provider_state_registry_spec.rb index bad74542..7bb3ae34 100644 --- a/spec/open_feature/sdk/provider_state_registry_spec.rb +++ b/spec/open_feature/sdk/provider_state_registry_spec.rb @@ -7,8 +7,8 @@ RSpec.describe OpenFeature::SDK::ProviderStateRegistry do let(:registry) { described_class.new } - let(:provider) { double("Provider", object_id: 12_345) } - let(:provider2) { double("Provider2", object_id: 67_890) } + let(:provider) { double("Provider") } + let(:provider2) { double("Provider2") } describe "#set_initial_state" do it "sets NOT_READY as default state" do