openfeature-ruby-sdk-contrib 0.0.1 → 0.0.3

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: ce92cec4c5146fcee215e7edca3f4daf9757a1cd4fda456176d197c861b0c620
4
- data.tar.gz: bbfd473392d8143ae247ac862a6f6e591bb6e679d6bfad309bfb4ecf78f78976
3
+ metadata.gz: 33279a645ab02c54060f2842ae586d244b779d20c5a3bd275486f2dbecaf0687
4
+ data.tar.gz: 6a9c0a4ce90d78978ddb4ef95e2cc880ab2601ef03bf23b7e58700e2a4b9c809
5
5
  SHA512:
6
- metadata.gz: d19265c25e33347ecb64eb29bd7d31384bd739a2e24564d7176feb60d51c34d0d5fef9190964fd67bd7c04672be7afad9926cabc9ad20fdbeb6293a6232f7f28
7
- data.tar.gz: 757c5224f87fc475635c64b44c36fc87a8a183f6c51a225d207a9f437e89d54a15bb0606b72b8946e4753c372ad07d303e9e8a2cbe88d16a06b5c70d66e208c7
6
+ metadata.gz: bbf841634b916502ff751778337d6b81e8472eb1186b20a687bf7fa3accfe82a96cef52ede9a42567f04b4cdbd274d44733d07c4c043d15dc7340d0397c7e402
7
+ data.tar.gz: b52c456508a087aab56ef26a42f20177e3a71145c785ba44dff405462164d112c18a3a6e30dbd93d0c22a49690085ed0ed218f521ba56f9ff1ff83b366b8b544
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- openfeature-ruby-sdk-contrib (0.1.0)
4
+ openfeature-ruby-sdk-contrib (0.0.2)
5
5
  concurrent-ruby (~> 1.2.2)
6
6
  faraday (~> 2.7.4)
7
7
  openfeature-sdk (~> 0.1)
data/README.md CHANGED
@@ -68,7 +68,13 @@ If bundler is not being used to manage dependencies, install the gem by executin
68
68
 
69
69
  ## Usage
70
70
 
71
- TODO: Write usage instructions here
71
+ ```
72
+ require "open_feature/sdk/contrib"
73
+
74
+ OpenFeature::SDK.configure do |config|
75
+ config.provider = OpenFeature::SDK::Contrib::Providers::FileProvider.new(source: "path/to/file", format: :yaml)
76
+ end
77
+ ```
72
78
 
73
79
  ## Development
74
80
 
@@ -78,7 +84,7 @@ To install this gem onto your local machine, run `bundle exec rake install`. To
78
84
 
79
85
  ## Contributing
80
86
 
81
- Bug reports and pull requests are welcome on GitHub at https://github.com/eugene@xtreme-computers.net/openfeature-ruby-sdk-contrib.
87
+ Bug reports and pull requests are welcome on GitHub at https://github.com/ehowe/openfeature-ruby-sdk-contrib.
82
88
 
83
89
  ## License
84
90
 
@@ -0,0 +1,13 @@
1
+ require "openfeature/sdk/client"
2
+
3
+ module OpenFeature
4
+ module SDK
5
+ module Contrib
6
+ class Client < OpenFeature::SDK::Client
7
+ def all_flags
8
+ @provider.read_all_values_with_cache
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
@@ -3,8 +3,15 @@ module OpenFeature
3
3
  module Contrib
4
4
  module Providers
5
5
  module Common
6
- # TODO: Should figure out how to use this...
7
- ResolutionDetails = Struct.new(:value, :reason, :variant, :error_code, :error_message)
6
+ ResolutionDetails = Struct.new(
7
+ :enabled,
8
+ :error_code,
9
+ :error_message,
10
+ :reason,
11
+ :value,
12
+ :variant,
13
+ keyword_init: true
14
+ )
8
15
 
9
16
  # @return [String]
10
17
  attr_reader :source
@@ -109,6 +116,27 @@ module OpenFeature
109
116
  assert_type(value: source_value, default_value: default_value, return_types: [Hash])
110
117
  end
111
118
 
119
+ def read_all_values_with_cache
120
+ now = Time.now.to_i
121
+
122
+ read_from_cache = if !@flag_contents
123
+ false
124
+ elsif !@last_cache
125
+ false
126
+ elsif cache_duration == Float::INFINITY
127
+ true
128
+ else
129
+ now - @last_cache < cache_duration
130
+ end
131
+
132
+ unless read_from_cache
133
+ read_and_parse_flags
134
+ @last_cache = Time.now.to_i
135
+ end
136
+
137
+ deep_keys.empty? ? @flag_contents : @flag_contents.dig(*deep_keys)
138
+ end
139
+
112
140
  private
113
141
 
114
142
  # Returns a value for the requested flag_key
@@ -116,17 +144,7 @@ module OpenFeature
116
144
  # @param flag_key [String] requested flag key
117
145
  # @param type ["boolean", "number", "float", "string"]
118
146
  def read_value_with_cache(flag_key:, type:)
119
- now = Time.now.to_i
120
-
121
- resolve_keys = lambda do |contents|
122
- flag_contents = deep_keys.empty? ? contents : contents.dig(*deep_keys)
123
-
124
- flag_contents.detect { |f| f["kind"] == type && f["name"] == flag_key }
125
- end
126
-
127
- return resolve_keys.call(@flag_contents) if @flag_contents && (cache_duration == Float::INFINITY || (@last_cache && @flag_contents && now - @last_cache < cache_duration))
128
-
129
- @flag_contents = resolve_keys.call(read_and_parse_flags)
147
+ read_all_values_with_cache.detect { |f| f["kind"] == type && f["name"] == flag_key }
130
148
  end
131
149
 
132
150
  def read_and_parse_flags
@@ -140,14 +158,14 @@ module OpenFeature
140
158
  { "value" => default_value }
141
159
  end
142
160
 
143
- return actual_value if actual_value.nil?
161
+ return ResolutionDetails.new(value: nil) if actual_value.nil?
144
162
 
145
- return_types = Array(return_types)
146
- actual_value = actual_value["variants"] ? actual_value["variants"][actual_value["value"]] : actual_value["value"]
163
+ return_types = Array(return_types)
164
+ variant_value = actual_value["variants"] ? actual_value["variants"][actual_value["value"]] : actual_value["value"]
147
165
 
148
- raise OpenFeature::SDK::Contrib::InvalidReturnValueError, "Invalid flag value found: #{actual_value} is not in #{return_types.join(', ')}" unless return_types.include?(actual_value.class)
166
+ raise OpenFeature::SDK::Contrib::InvalidReturnValueError, "Invalid flag value found: #{variant_value} is not in #{return_types.join(', ')}" unless return_types.include?(variant_value.class)
149
167
 
150
- actual_value
168
+ ResolutionDetails.new(value: variant_value, enabled: actual_value["enabled"], variant: actual_value["variant"])
151
169
  end
152
170
  end
153
171
  end
@@ -31,11 +31,13 @@ module OpenFeature
31
31
 
32
32
  return custom_parser.call(file_contents) if custom_parser
33
33
 
34
- if format == :yaml
35
- YAML.safe_load(file_contents)
36
- else
37
- JSON.parse(file_contents)
38
- end
34
+ @flag_contents = if format == :yaml
35
+ YAML.safe_load(file_contents)
36
+ else
37
+ JSON.parse(file_contents)
38
+ end
39
+
40
+ @flag_contents
39
41
  end
40
42
  end
41
43
  end
@@ -3,7 +3,7 @@
3
3
  module OpenFeature
4
4
  module SDK
5
5
  module Contrib
6
- VERSION = "0.0.1"
6
+ VERSION = "0.0.3"
7
7
  end
8
8
  end
9
9
  end
@@ -1,5 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require_relative "contrib/client"
3
4
  require_relative "contrib/version"
4
5
  require_relative "contrib/providers/common"
5
6
  require_relative "contrib/providers/file_provider"
@@ -10,4 +11,4 @@ module OpenFeature
10
11
  InvalidReturnValueError = Class.new(StandardError)
11
12
  end
12
13
  end
13
- end
14
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: openfeature-ruby-sdk-contrib
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Eugene Howe
@@ -179,6 +179,7 @@ files:
179
179
  - README.md
180
180
  - Rakefile
181
181
  - lib/open_feature/sdk/contrib.rb
182
+ - lib/open_feature/sdk/contrib/client.rb
182
183
  - lib/open_feature/sdk/contrib/providers/common.rb
183
184
  - lib/open_feature/sdk/contrib/providers/file_provider.rb
184
185
  - lib/open_feature/sdk/contrib/version.rb