openfeature-ruby-sdk-contrib 0.0.1 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
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