From 9c1e14bde08bf0f5364a7c9034ec5edf468fae46 Mon Sep 17 00:00:00 2001 From: Max VelDink Date: Fri, 16 Feb 2024 09:12:58 -0500 Subject: [PATCH 1/7] refactor!: Add root provider file and move resolution details up a module Signed-off-by: Max VelDink --- lib/open_feature/sdk/api.rb | 2 +- lib/open_feature/sdk/provider.rb | 9 +++++++++ lib/open_feature/sdk/provider/no_op_provider.rb | 2 -- lib/open_feature/sdk/provider/resolution_details.rb | 7 +++++++ spec/open_feature/sdk/client_spec.rb | 10 +++++----- 5 files changed, 22 insertions(+), 8 deletions(-) create mode 100644 lib/open_feature/sdk/provider.rb create mode 100644 lib/open_feature/sdk/provider/resolution_details.rb diff --git a/lib/open_feature/sdk/api.rb b/lib/open_feature/sdk/api.rb index 3fb2a947..68f10dfe 100644 --- a/lib/open_feature/sdk/api.rb +++ b/lib/open_feature/sdk/api.rb @@ -6,7 +6,7 @@ require_relative "configuration" require_relative "client" require_relative "metadata" -require_relative "provider/no_op_provider" +require_relative "provider" module OpenFeature module SDK diff --git a/lib/open_feature/sdk/provider.rb b/lib/open_feature/sdk/provider.rb new file mode 100644 index 00000000..6342c7dc --- /dev/null +++ b/lib/open_feature/sdk/provider.rb @@ -0,0 +1,9 @@ +require_relative "provider/resolution_details" +require_relative "provider/no_op_provider" + +module OpenFeature + module SDK + module Provider + end + end +end diff --git a/lib/open_feature/sdk/provider/no_op_provider.rb b/lib/open_feature/sdk/provider/no_op_provider.rb index ef2a7507..c80118be 100644 --- a/lib/open_feature/sdk/provider/no_op_provider.rb +++ b/lib/open_feature/sdk/provider/no_op_provider.rb @@ -30,8 +30,6 @@ class NoOpProvider attr_reader :metadata - ResolutionDetails = Struct.new(:value, :reason, :variant, :error_code, :error_message) - def initialize @metadata = Metadata.new(name: NAME).freeze end diff --git a/lib/open_feature/sdk/provider/resolution_details.rb b/lib/open_feature/sdk/provider/resolution_details.rb new file mode 100644 index 00000000..43f25dfb --- /dev/null +++ b/lib/open_feature/sdk/provider/resolution_details.rb @@ -0,0 +1,7 @@ +module OpenFeature + module SDK + module Provider + ResolutionDetails = Struct.new(:value, :reason, :variant, :error_code, :error_message, :flag_metadata) + end + end +end diff --git a/spec/open_feature/sdk/client_spec.rb b/spec/open_feature/sdk/client_spec.rb index d98b8aef..38b6d8ee 100644 --- a/spec/open_feature/sdk/client_spec.rb +++ b/spec/open_feature/sdk/client_spec.rb @@ -103,7 +103,7 @@ end it do - expect(client.fetch_boolean_details(flag_key: flag_key, default_value: false)).is_a?(OpenFeature::SDK::Provider::NoOpProvider::ResolutionDetails) + expect(client.fetch_boolean_details(flag_key: flag_key, default_value: false)).is_a?(OpenFeature::SDK::Provider::ResolutionDetails) end end @@ -136,8 +136,8 @@ end it do - expect(client.fetch_number_details(flag_key: flag_key, default_value: 1.2)).is_a?(OpenFeature::SDK::Provider::NoOpProvider::ResolutionDetails) - expect(client.fetch_number_details(flag_key: flag_key, default_value: 1)).is_a?(OpenFeature::SDK::Provider::NoOpProvider::ResolutionDetails) + expect(client.fetch_number_details(flag_key: flag_key, default_value: 1.2)).is_a?(OpenFeature::SDK::Provider::ResolutionDetails) + expect(client.fetch_number_details(flag_key: flag_key, default_value: 1)).is_a?(OpenFeature::SDK::Provider::ResolutionDetails) end end @@ -166,7 +166,7 @@ end it do - expect(client.fetch_string_details(flag_key: flag_key, default_value: "some-string")).is_a?(OpenFeature::SDK::Provider::NoOpProvider::ResolutionDetails) + expect(client.fetch_string_details(flag_key: flag_key, default_value: "some-string")).is_a?(OpenFeature::SDK::Provider::ResolutionDetails) end end @@ -195,7 +195,7 @@ it do expect(client.fetch_object_details(flag_key: flag_key, - default_value: {name: "some-name"})).is_a?(OpenFeature::SDK::Provider::NoOpProvider::ResolutionDetails) + default_value: {name: "some-name"})).is_a?(OpenFeature::SDK::Provider::ResolutionDetails) end end From c9419823641de2f41fa33ba4ccc1e0af3f9c9eb7 Mon Sep 17 00:00:00 2001 From: Max VelDink Date: Fri, 16 Feb 2024 09:13:15 -0500 Subject: [PATCH 2/7] feat: Add error code and reason constants Signed-off-by: Max VelDink --- lib/open_feature/sdk/provider.rb | 2 ++ lib/open_feature/sdk/provider/error_code.rb | 15 +++++++++++++++ lib/open_feature/sdk/provider/reason.rb | 17 +++++++++++++++++ 3 files changed, 34 insertions(+) create mode 100644 lib/open_feature/sdk/provider/error_code.rb create mode 100644 lib/open_feature/sdk/provider/reason.rb diff --git a/lib/open_feature/sdk/provider.rb b/lib/open_feature/sdk/provider.rb index 6342c7dc..8533cd92 100644 --- a/lib/open_feature/sdk/provider.rb +++ b/lib/open_feature/sdk/provider.rb @@ -1,3 +1,5 @@ +require_relative "provider/error_code" +require_relative "provider/reason" require_relative "provider/resolution_details" require_relative "provider/no_op_provider" diff --git a/lib/open_feature/sdk/provider/error_code.rb b/lib/open_feature/sdk/provider/error_code.rb new file mode 100644 index 00000000..6e10dbda --- /dev/null +++ b/lib/open_feature/sdk/provider/error_code.rb @@ -0,0 +1,15 @@ +module OpenFeature + module SDK + module Provider + module ErrorCode + PROVIDER_NOT_READY = "Provider Not Ready" + FLAG_NOT_FOUND = "Flag Not Found" + PARSE_ERROR = "Parse Error" + TYPE_MISMATCH = "Type Mismatch" + TARGETING_KEY_MISSING = "Targeting Key Missing" + INVALID_CONTEXT = "Invalid Context" + GENERAL = "General" + end + end + end +end diff --git a/lib/open_feature/sdk/provider/reason.rb b/lib/open_feature/sdk/provider/reason.rb new file mode 100644 index 00000000..15e459a9 --- /dev/null +++ b/lib/open_feature/sdk/provider/reason.rb @@ -0,0 +1,17 @@ +module OpenFeature + module SDK + module Provider + module Reason + STATIC = "Static" + DEFAULT = "Default" + TARGETING_MATCH = "Targeting Match" + SPLIT = "Split" + CACHED = "Cached" + DISABLED = "Disabled" + UNKNOWN = "Unknown" + STALE = "Stale" + ERROR = "Error" + end + end + end +end From 70542ef4ada83607369a559962db1243ec225887 Mon Sep 17 00:00:00 2001 From: Max VelDink Date: Fri, 16 Feb 2024 09:16:18 -0500 Subject: [PATCH 3/7] fix: Require name in console binstub Signed-off-by: Max VelDink --- bin/console | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/console b/bin/console index eef3d6c0..86dcbbcc 100755 --- a/bin/console +++ b/bin/console @@ -2,7 +2,7 @@ # frozen_string_literal: true require "bundler/setup" -require "openfeature/sdk" +require "open_feature/sdk" # You can add fixtures and/or initialization code here to make experimenting # with your gem easier. You can also use a different console, if you like. From 3611d76f84f0c2e8e2436085466112199710df3c Mon Sep 17 00:00:00 2001 From: Max VelDink Date: Fri, 16 Feb 2024 09:21:35 -0500 Subject: [PATCH 4/7] fix: Delegation to potentially uninitialized ivar We provide memoization for this but were bypassing that and forwarding to the ivar itself. Signed-off-by: Max VelDink --- lib/open_feature/sdk/api.rb | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/open_feature/sdk/api.rb b/lib/open_feature/sdk/api.rb index 68f10dfe..f8a2e548 100644 --- a/lib/open_feature/sdk/api.rb +++ b/lib/open_feature/sdk/api.rb @@ -29,9 +29,9 @@ class API include Singleton extend Forwardable - def_delegator :@configuration, :provider - def_delegator :@configuration, :hooks - def_delegator :@configuration, :context + def_delegator :configuration, :provider + def_delegator :configuration, :hooks + def_delegator :configuration, :context def configuration @configuration ||= Configuration.new From c8e24576b7dbf26a5d991f14c4b310fe72a42f79 Mon Sep 17 00:00:00 2001 From: Max VelDink Date: Fri, 16 Feb 2024 09:32:27 -0500 Subject: [PATCH 5/7] fix!: Return EvaluationDetails instead of ResolutionDetails Signed-off-by: Max VelDink --- lib/open_feature/sdk/api.rb | 1 + lib/open_feature/sdk/client.rb | 5 +++-- lib/open_feature/sdk/evaluation_details.rb | 9 +++++++++ 3 files changed, 13 insertions(+), 2 deletions(-) create mode 100644 lib/open_feature/sdk/evaluation_details.rb diff --git a/lib/open_feature/sdk/api.rb b/lib/open_feature/sdk/api.rb index f8a2e548..b928072b 100644 --- a/lib/open_feature/sdk/api.rb +++ b/lib/open_feature/sdk/api.rb @@ -4,6 +4,7 @@ require "singleton" require_relative "configuration" +require_relative "evaluation_details" require_relative "client" require_relative "metadata" require_relative "provider" diff --git a/lib/open_feature/sdk/client.rb b/lib/open_feature/sdk/client.rb index b05de912..418bc2e5 100644 --- a/lib/open_feature/sdk/client.rb +++ b/lib/open_feature/sdk/client.rb @@ -26,8 +26,9 @@ def initialize(provider:, client_options: nil, context: nil) # result = @provider.fetch_boolean_value(flag_key: flag_key, default_value: default_value, evaluation_context: evaluation_context) # end def fetch_#{result_type}_#{suffix}(flag_key:, default_value:, evaluation_context: nil) - result = @provider.fetch_#{result_type}_value(flag_key: flag_key, default_value: default_value, evaluation_context: evaluation_context) - #{"result.value" if suffix == :value} + resolution_details = @provider.fetch_#{result_type}_value(flag_key:, default_value:, evaluation_context:) + evaluation_details = EvaluationDetails.new(flag_key:, resolution_details:) + #{"evaluation_details.value" if suffix == :value} end RUBY end diff --git a/lib/open_feature/sdk/evaluation_details.rb b/lib/open_feature/sdk/evaluation_details.rb new file mode 100644 index 00000000..b47c0e9c --- /dev/null +++ b/lib/open_feature/sdk/evaluation_details.rb @@ -0,0 +1,9 @@ +module OpenFeature + module SDK + EvaluationDetails = Struct.new(:flag_key, :resolution_details) do + extend Forwardable + + def_delegators :resolution_details, :value, :reason, :variant, :error_code, :error_message, :flag_metadata + end + end +end From a6644958337f2f1557625722264af40680934698 Mon Sep 17 00:00:00 2001 From: Max VelDink Date: Fri, 16 Feb 2024 21:30:42 -0500 Subject: [PATCH 6/7] fix: Regression in Ruby 3.1 due to Struct keyword args Signed-off-by: Max VelDink --- lib/open_feature/sdk/evaluation_details.rb | 2 +- lib/open_feature/sdk/provider/resolution_details.rb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/open_feature/sdk/evaluation_details.rb b/lib/open_feature/sdk/evaluation_details.rb index b47c0e9c..4faccd28 100644 --- a/lib/open_feature/sdk/evaluation_details.rb +++ b/lib/open_feature/sdk/evaluation_details.rb @@ -1,6 +1,6 @@ module OpenFeature module SDK - EvaluationDetails = Struct.new(:flag_key, :resolution_details) do + EvaluationDetails = Struct.new(:flag_key, :resolution_details, keyword_init: true) do extend Forwardable def_delegators :resolution_details, :value, :reason, :variant, :error_code, :error_message, :flag_metadata diff --git a/lib/open_feature/sdk/provider/resolution_details.rb b/lib/open_feature/sdk/provider/resolution_details.rb index 43f25dfb..c7675fce 100644 --- a/lib/open_feature/sdk/provider/resolution_details.rb +++ b/lib/open_feature/sdk/provider/resolution_details.rb @@ -1,7 +1,7 @@ module OpenFeature module SDK module Provider - ResolutionDetails = Struct.new(:value, :reason, :variant, :error_code, :error_message, :flag_metadata) + ResolutionDetails = Struct.new(:value, :reason, :variant, :error_code, :error_message, :flag_metadata, keyword_init: true) end end end From 960d486f5738136fe3f62685e2ace421bd578ec3 Mon Sep 17 00:00:00 2001 From: Max VelDink Date: Fri, 16 Feb 2024 21:31:30 -0500 Subject: [PATCH 7/7] refactor: Simplify delegator in API Signed-off-by: Max VelDink --- lib/open_feature/sdk/api.rb | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/lib/open_feature/sdk/api.rb b/lib/open_feature/sdk/api.rb index b928072b..da71f41b 100644 --- a/lib/open_feature/sdk/api.rb +++ b/lib/open_feature/sdk/api.rb @@ -30,9 +30,7 @@ class API include Singleton extend Forwardable - def_delegator :configuration, :provider - def_delegator :configuration, :hooks - def_delegator :configuration, :context + def_delegators :configuration, :provider, :hooks, :context def configuration @configuration ||= Configuration.new