openfeature-sdk 0.3.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d79e98004b058036248ba05928ee5debe398a607a0d079f3d8d366fcde9bce07
4
- data.tar.gz: 76c896c762a1e5a7828f7785864c0bbb2034214c5ffcc12988af044ad23d2806
3
+ metadata.gz: 121bf1c0f068a672898b818d3241b8a62eb31bfc16b5c777064b509c05c75ffa
4
+ data.tar.gz: e48cd05f98c6cc4c54697d716ea6c3fcee273b602de2fdf743a3bfb2b7cc65c1
5
5
  SHA512:
6
- metadata.gz: 62d7a0aa1d5110d346afd5d39317064ef5f5722138bdd90cf31f96aa3587cd3fc1083cfade3b7d8f9b02560075078010e82104fcba9939621e301dfa12e3cf85
7
- data.tar.gz: 10540bcff19a5d57113d4b298f2f0ed9ddf13f3e1b2bdcff116ef27e6ac55c233a8b2ee4aba3468c40a31c698e9f3cbeb8208c2964f9df67551e632dd0190564
6
+ metadata.gz: 60bea62f478cc58a7a5b4a5defc6b51fc1dc9af83770102ef49ad26d3604d25ceb76f2752edbfdec6d598c8ee0f7aaefb6d8ded5d437ab1e041c921438b5be71
7
+ data.tar.gz: b13c80c92cbafe9902f445e9bbd170cec6ca4fd2a73c86f72bfaf7c09cd208ef75ba27b6f69f9a72d58a0f59bf1b65f44275abb27b18493029524661697d6f64
@@ -1,3 +1,3 @@
1
1
  {
2
- ".": "0.3.0"
2
+ ".": "0.4.0"
3
3
  }
data/.ruby-version CHANGED
@@ -1 +1 @@
1
- 3.3.0
1
+ 3.3.3
data/.tool-versions CHANGED
@@ -1 +1 @@
1
- ruby 3.3.0
1
+ ruby 3.3.3
data/CHANGELOG.md CHANGED
@@ -1,5 +1,29 @@
1
1
  # Changelog
2
2
 
3
+ ## [0.4.0](https://github.com/open-feature/ruby-sdk/compare/v0.3.1...v0.4.0) (2024-06-13)
4
+
5
+
6
+ ### ⚠ BREAKING CHANGES
7
+
8
+ * Use strings from spec for error and reason enums ([#131](https://github.com/open-feature/ruby-sdk/issues/131))
9
+
10
+ ### Features
11
+
12
+ * add hook hints ([#135](https://github.com/open-feature/ruby-sdk/issues/135)) ([51155a7](https://github.com/open-feature/ruby-sdk/commit/51155a7d9cd2c28b38accb9d9b49018bd4868040))
13
+ * Use strings from spec for error and reason enums ([#131](https://github.com/open-feature/ruby-sdk/issues/131)) ([cb2a4cd](https://github.com/open-feature/ruby-sdk/commit/cb2a4cd54059ffe7ed3484be6705ca2a9d590c1a))
14
+
15
+
16
+ ### Bug Fixes
17
+
18
+ * synchronize provider registration ([#136](https://github.com/open-feature/ruby-sdk/issues/136)) ([1ff6fd0](https://github.com/open-feature/ruby-sdk/commit/1ff6fd0c3732e9e074c8b30cbe4164a67286b0a4))
19
+
20
+ ## [0.3.1](https://github.com/open-feature/ruby-sdk/compare/v0.3.0...v0.3.1) (2024-04-22)
21
+
22
+
23
+ ### Features
24
+
25
+ * add integer and float specific resolver methods ([#124](https://github.com/open-feature/ruby-sdk/issues/124)) ([eea9d17](https://github.com/open-feature/ruby-sdk/commit/eea9d17e5892064cec9d81bb0ef452e7e1761764))
26
+
3
27
  ## [0.3.0](https://github.com/open-feature/ruby-sdk/compare/v0.2.1...v0.3.0) (2024-04-05)
4
28
 
5
29
 
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- openfeature-sdk (0.3.0)
4
+ openfeature-sdk (0.4.0)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
@@ -5,7 +5,7 @@ module OpenFeature
5
5
  # TODO: Write documentation
6
6
  #
7
7
  class Client
8
- RESULT_TYPE = %i[boolean string number object].freeze
8
+ RESULT_TYPE = %i[boolean string number integer float object].freeze
9
9
  SUFFIXES = %i[value details].freeze
10
10
 
11
11
  attr_reader :metadata, :evaluation_context
@@ -16,6 +16,7 @@ module OpenFeature
16
16
  def initialize
17
17
  @hooks = []
18
18
  @providers = {}
19
+ @provider_mutex = Mutex.new
19
20
  end
20
21
 
21
22
  def provider(domain: nil)
@@ -27,11 +28,13 @@ module OpenFeature
27
28
  # 2. On the new provider, call `init`.
28
29
  # 3. Finally, set the internal provider to the new provider
29
30
  def set_provider(provider, domain: nil)
30
- @providers[domain].shutdown if @providers[domain].respond_to?(:shutdown)
31
-
32
- provider.init if provider.respond_to?(:init)
33
-
34
- @providers[domain] = provider
31
+ @provider_mutex.synchronize do
32
+ @providers[domain].shutdown if @providers[domain].respond_to?(:shutdown)
33
+ provider.init if provider.respond_to?(:init)
34
+ new_providers = @providers.dup
35
+ new_providers[domain] = provider
36
+ @providers = new_providers
37
+ end
35
38
  end
36
39
  end
37
40
  end
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+
3
+ module OpenFeature
4
+ module SDK
5
+ module Hooks
6
+ class Hints < DelegateClass(Hash)
7
+ ALLOWED_TYPES = [String, Symbol, Numeric, TrueClass, FalseClass, Time, Hash, Array].freeze
8
+
9
+ def initialize(hash = {})
10
+ hash.each do |key, value|
11
+ assert_allowed_key(key)
12
+ assert_allowed_value(value)
13
+ end
14
+ @hash = hash.dup
15
+ super(@hash)
16
+ freeze
17
+ end
18
+
19
+ private
20
+
21
+ def assert_allowed_key(key)
22
+ raise ArgumentError, "Only String or Symbol are allowed as keys." unless key.is_a?(String) || key.is_a?(Symbol)
23
+ end
24
+
25
+ def assert_allowed_value(value)
26
+ allowed_type = ALLOWED_TYPES.any? { |t| value.is_a?(t) }
27
+ raise ArgumentError, "Only #{ALLOWED_TYPES.join(", ")} are allowed as values." unless allowed_type
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
@@ -2,13 +2,14 @@ module OpenFeature
2
2
  module SDK
3
3
  module Provider
4
4
  module ErrorCode
5
- PROVIDER_NOT_READY = "Provider Not Ready"
6
- FLAG_NOT_FOUND = "Flag Not Found"
7
- PARSE_ERROR = "Parse Error"
8
- TYPE_MISMATCH = "Type Mismatch"
9
- TARGETING_KEY_MISSING = "Targeting Key Missing"
10
- INVALID_CONTEXT = "Invalid Context"
11
- GENERAL = "General"
5
+ PROVIDER_NOT_READY = "PROVIDER_NOT_READY"
6
+ FLAG_NOT_FOUND = "FLAG_NOT_FOUND"
7
+ PARSE_ERROR = "PARSE_ERROR"
8
+ TYPE_MISMATCH = "TYPE_MISMATCH"
9
+ TARGETING_KEY_MISSING = "TARGETING_KEY_MISSING"
10
+ INVALID_CONTEXT = "INVALID_CONTEXT"
11
+ PROVIDER_FATAL = "PROVIDER_FATAL"
12
+ GENERAL = "GENERAL"
12
13
  end
13
14
  end
14
15
  end
@@ -34,7 +34,15 @@ module OpenFeature
34
34
  end
35
35
 
36
36
  def fetch_number_value(flag_key:, default_value:, evaluation_context: nil)
37
- fetch_value(allowed_classes: [Integer, Float], flag_key:, default_value:, evaluation_context:)
37
+ fetch_value(allowed_classes: [Numeric], flag_key:, default_value:, evaluation_context:)
38
+ end
39
+
40
+ def fetch_integer_value(flag_key:, default_value:, evaluation_context: nil)
41
+ fetch_value(allowed_classes: [Integer], flag_key:, default_value:, evaluation_context:)
42
+ end
43
+
44
+ def fetch_float_value(flag_key:, default_value:, evaluation_context: nil)
45
+ fetch_value(allowed_classes: [Float], flag_key:, default_value:, evaluation_context:)
38
46
  end
39
47
 
40
48
  def fetch_object_value(flag_key:, default_value:, evaluation_context: nil)
@@ -52,7 +60,7 @@ module OpenFeature
52
60
  return ResolutionDetails.new(value: default_value, error_code: ErrorCode::FLAG_NOT_FOUND, reason: Reason::ERROR)
53
61
  end
54
62
 
55
- if allowed_classes.include?(value.class)
63
+ if allowed_classes.any? { |klass| value.is_a?(klass) }
56
64
  ResolutionDetails.new(value:, reason: Reason::STATIC)
57
65
  else
58
66
  ResolutionDetails.new(value: default_value, error_code: ErrorCode::TYPE_MISMATCH, reason: Reason::ERROR)
@@ -44,6 +44,14 @@ module OpenFeature
44
44
  no_op(default_value)
45
45
  end
46
46
 
47
+ def fetch_integer_value(flag_key:, default_value:, evaluation_context: nil)
48
+ no_op(default_value)
49
+ end
50
+
51
+ def fetch_float_value(flag_key:, default_value:, evaluation_context: nil)
52
+ no_op(default_value)
53
+ end
54
+
47
55
  def fetch_object_value(flag_key:, default_value:, evaluation_context: nil)
48
56
  no_op(default_value)
49
57
  end
@@ -2,15 +2,15 @@ module OpenFeature
2
2
  module SDK
3
3
  module Provider
4
4
  module Reason
5
- STATIC = "Static"
6
- DEFAULT = "Default"
7
- TARGETING_MATCH = "Targeting Match"
8
- SPLIT = "Split"
9
- CACHED = "Cached"
10
- DISABLED = "Disabled"
11
- UNKNOWN = "Unknown"
12
- STALE = "Stale"
13
- ERROR = "Error"
5
+ STATIC = "STATIC"
6
+ DEFAULT = "DEFAULT"
7
+ TARGETING_MATCH = "TARGETING_MATCH"
8
+ SPLIT = "SPLIT"
9
+ CACHED = "CACHED"
10
+ DISABLED = "DISABLED"
11
+ UNKNOWN = "UNKNOWN"
12
+ STALE = "STALE"
13
+ ERROR = "ERROR"
14
14
  end
15
15
  end
16
16
  end
@@ -2,6 +2,6 @@
2
2
 
3
3
  module OpenFeature
4
4
  module SDK
5
- VERSION = "0.3.0"
5
+ VERSION = "0.4.0"
6
6
  end
7
7
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: openfeature-sdk
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - OpenFeature Authors
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2024-04-05 00:00:00.000000000 Z
11
+ date: 2024-07-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: debug
@@ -152,6 +152,7 @@ files:
152
152
  - lib/open_feature/sdk/evaluation_context.rb
153
153
  - lib/open_feature/sdk/evaluation_context_builder.rb
154
154
  - lib/open_feature/sdk/evaluation_details.rb
155
+ - lib/open_feature/sdk/hooks/hints.rb
155
156
  - lib/open_feature/sdk/provider.rb
156
157
  - lib/open_feature/sdk/provider/error_code.rb
157
158
  - lib/open_feature/sdk/provider/in_memory_provider.rb
@@ -186,7 +187,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
186
187
  - !ruby/object:Gem::Version
187
188
  version: '0'
188
189
  requirements: []
189
- rubygems_version: 3.5.3
190
+ rubygems_version: 3.5.11
190
191
  signing_key:
191
192
  specification_version: 4
192
193
  summary: OpenFeature SDK for Ruby