openfeature-sdk 0.1.0 → 0.2.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: 6286e12fce6a89a9b310e838fd456bfb6dd0fa35ea7d1bd99745beca5781fbd8
4
- data.tar.gz: ed73a6433ca51fa55403f0893097f102e8816ca93c3b4ec5a21c26b019055461
3
+ metadata.gz: ef370095e429959ee1d1c0089e9a9e321cc3e4a2345f059aae26b8d965adf1b3
4
+ data.tar.gz: c00d676c31455f90592bd1ff604816f468750576e5a181d3b9f02d81c27dd878
5
5
  SHA512:
6
- metadata.gz: d81f9a31e72afb82edae5cb499d7cec3955199f9b5c795b7f477be314b1de5e5bc26cf9db292b1333b4da5a41ed3f068cab55494a10c1d355a3b641aa3560e4e
7
- data.tar.gz: 7aff559376dd006308d92806521731aa0b95ddc098f2455bfdb8aa5d7ca4bb8dc57ac7f8ae5939bef9c66672c032d65548c09d704a74df51f2fdd5cad0aa6c28
6
+ metadata.gz: 7d7d24acecc2f9de37b64d037316f17c58138ab78b4ef71923ec8e403fabb94d739b9bc66611a31e50012774f88792b8b9823049202a519da6b13f188a2ec389
7
+ data.tar.gz: d9830c29d198b3a4b7f0aef3da391d08ac4a30042eb0bbc47e9b30602ee806e5bb76794243dfa2ea1ed235ab0a8d17ea9b64184a6de6d900a4d7d1b82f0c06b1
@@ -1,3 +1,3 @@
1
1
  {
2
- ".": "0.1.0"
2
+ ".": "0.2.0"
3
3
  }
data/.ruby-version CHANGED
@@ -1 +1 @@
1
- 3.1.3
1
+ 3.3.0
data/.simplecov ADDED
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "simplecov-cobertura"
4
+
5
+ SimpleCov.start do
6
+ add_filter "/spec/"
7
+ if ENV["CI"] == "true"
8
+ formatter SimpleCov::Formatter::CoberturaFormatter
9
+ else
10
+ formatter SimpleCov::Formatter::HTMLFormatter
11
+ end
12
+ end
data/.standard.yml ADDED
@@ -0,0 +1,5 @@
1
+ parallel: true
2
+ formatter: progress
3
+ ruby_version: 3.1
4
+ plugins:
5
+ - standard-performance
data/.tool-versions ADDED
@@ -0,0 +1 @@
1
+ ruby 3.3.0
data/CHANGELOG.md CHANGED
@@ -1,5 +1,34 @@
1
1
  # Changelog
2
2
 
3
+ ## [0.2.0](https://github.com/open-feature/ruby-sdk/compare/v0.1.1...v0.2.0) (2024-03-09)
4
+
5
+
6
+ ### ⚠ BREAKING CHANGES
7
+
8
+ * Implement Requirement 1.1.3 ([#80](https://github.com/open-feature/ruby-sdk/issues/80))
9
+ * rename top-level lib folder to `open_feature` ([#90](https://github.com/open-feature/ruby-sdk/issues/90))
10
+ * Drop Ruby 2.7 and 3.0, add Ruby 3.3 ([#91](https://github.com/open-feature/ruby-sdk/issues/91))
11
+
12
+ ### Features
13
+
14
+ * adds `InMemoryProvider` ([#102](https://github.com/open-feature/ruby-sdk/issues/102)) ([25680a4](https://github.com/open-feature/ruby-sdk/commit/25680a40b0955ee66da256f23f7078655754a4b6))
15
+ * Implement Requirement 1.1.2 ([#78](https://github.com/open-feature/ruby-sdk/issues/78)) ([8cea7d0](https://github.com/open-feature/ruby-sdk/commit/8cea7d0cefc31ddeb2095ac60c40db3b038b02c5))
16
+ * Implement Requirement 1.1.3 ([#80](https://github.com/open-feature/ruby-sdk/issues/80)) ([bc65e7a](https://github.com/open-feature/ruby-sdk/commit/bc65e7a2754d736e858a856fd39118940c63ee41))
17
+ * Updates to `Provider` module in preparation for `InMemoryProvider` ([#99](https://github.com/open-feature/ruby-sdk/issues/99)) ([2d89570](https://github.com/open-feature/ruby-sdk/commit/2d89570b2ebace61bcb261cfcb54b2724a4a75f7))
18
+
19
+
20
+ ### Miscellaneous Chores
21
+
22
+ * Drop Ruby 2.7 and 3.0, add Ruby 3.3 ([#91](https://github.com/open-feature/ruby-sdk/issues/91)) ([51cd3a1](https://github.com/open-feature/ruby-sdk/commit/51cd3a1801e589f9049bffd7349d56bb6d32d05e))
23
+ * rename top-level lib folder to `open_feature` ([#90](https://github.com/open-feature/ruby-sdk/issues/90)) ([e1a9a01](https://github.com/open-feature/ruby-sdk/commit/e1a9a018e18cb62acedd1b5cd5a00ad3ecb4321a))
24
+
25
+ ## [0.1.1](https://github.com/open-feature/ruby-sdk/compare/v0.1.0...v0.1.1) (2023-09-13)
26
+
27
+
28
+ ### Bug Fixes
29
+
30
+ * OpenFeature::SDK::Configuration uses concurrent-ruby gem even though it doesn't depend on it ([#61](https://github.com/open-feature/ruby-sdk/issues/61)) ([c3c1222](https://github.com/open-feature/ruby-sdk/commit/c3c12226a21e43d62358562f4008a4a44a10e72b))
31
+
3
32
  ## [0.1.0](https://github.com/open-feature/ruby-sdk/compare/v0.0.3...v0.1.0) (2022-12-15)
4
33
 
5
34
 
data/CODEOWNERS ADDED
@@ -0,0 +1,6 @@
1
+ # These owners will be the default owners for everything in
2
+ # the repo. Unless a later match takes precedence
3
+ #
4
+ # Managed by Peribolos: https://github.com/open-feature/community/blob/main/config/open-feature/sdk-ruby/workgroup.yaml
5
+ #
6
+ * @open-feature/sdk-ruby-maintainers
data/Gemfile.lock CHANGED
@@ -1,53 +1,101 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- openfeature-sdk (0.1.0)
4
+ openfeature-sdk (0.2.0)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
8
8
  specs:
9
9
  ast (2.4.2)
10
- concurrent-ruby (1.1.10)
10
+ base64 (0.1.1)
11
+ concurrent-ruby (1.2.3)
12
+ debug (1.9.1)
13
+ irb (~> 1.10)
14
+ reline (>= 0.3.8)
11
15
  diff-lcs (1.5.0)
12
- json (2.6.2)
13
- parallel (1.22.1)
14
- parser (3.1.2.1)
16
+ docile (1.4.0)
17
+ io-console (0.7.2)
18
+ irb (1.11.2)
19
+ rdoc
20
+ reline (>= 0.4.2)
21
+ json (2.6.3)
22
+ language_server-protocol (3.17.0.3)
23
+ lint_roller (1.1.0)
24
+ markly (0.10.0)
25
+ parallel (1.23.0)
26
+ parser (3.2.2.3)
15
27
  ast (~> 2.4.1)
28
+ racc
29
+ psych (5.1.2)
30
+ stringio
31
+ racc (1.7.1)
16
32
  rainbow (3.1.1)
17
33
  rake (13.0.6)
18
- regexp_parser (2.6.0)
19
- rexml (3.2.5)
34
+ rdoc (6.6.2)
35
+ psych (>= 4.0.0)
36
+ regexp_parser (2.8.1)
37
+ reline (0.4.3)
38
+ io-console (~> 0.5)
39
+ rexml (3.2.6)
20
40
  rspec (3.12.0)
21
41
  rspec-core (~> 3.12.0)
22
42
  rspec-expectations (~> 3.12.0)
23
43
  rspec-mocks (~> 3.12.0)
24
- rspec-core (3.12.0)
44
+ rspec-core (3.12.2)
25
45
  rspec-support (~> 3.12.0)
26
- rspec-expectations (3.12.0)
46
+ rspec-expectations (3.12.3)
27
47
  diff-lcs (>= 1.2.0, < 2.0)
28
48
  rspec-support (~> 3.12.0)
29
- rspec-mocks (3.12.0)
49
+ rspec-mocks (3.12.6)
30
50
  diff-lcs (>= 1.2.0, < 2.0)
31
51
  rspec-support (~> 3.12.0)
32
- rspec-support (3.12.0)
33
- rubocop (1.37.1)
52
+ rspec-support (3.12.1)
53
+ rubocop (1.56.3)
54
+ base64 (~> 0.1.1)
34
55
  json (~> 2.3)
56
+ language_server-protocol (>= 3.17.0)
35
57
  parallel (~> 1.10)
36
- parser (>= 3.1.2.1)
58
+ parser (>= 3.2.2.3)
37
59
  rainbow (>= 2.2.2, < 4.0)
38
60
  regexp_parser (>= 1.8, < 3.0)
39
61
  rexml (>= 3.2.5, < 4.0)
40
- rubocop-ast (>= 1.23.0, < 2.0)
62
+ rubocop-ast (>= 1.28.1, < 2.0)
41
63
  ruby-progressbar (~> 1.7)
42
- unicode-display_width (>= 1.4.0, < 3.0)
43
- rubocop-ast (1.23.0)
44
- parser (>= 3.1.1.0)
45
- ruby-progressbar (1.11.0)
46
- unicode-display_width (2.3.0)
64
+ unicode-display_width (>= 2.4.0, < 3.0)
65
+ rubocop-ast (1.29.0)
66
+ parser (>= 3.2.1.0)
67
+ rubocop-performance (1.19.0)
68
+ rubocop (>= 1.7.0, < 2.0)
69
+ rubocop-ast (>= 0.4.0)
70
+ ruby-progressbar (1.13.0)
71
+ simplecov (0.22.0)
72
+ docile (~> 1.1)
73
+ simplecov-html (~> 0.11)
74
+ simplecov_json_formatter (~> 0.1)
75
+ simplecov-cobertura (2.1.0)
76
+ rexml
77
+ simplecov (~> 0.19)
78
+ simplecov-html (0.12.3)
79
+ simplecov_json_formatter (0.1.4)
80
+ standard (1.31.1)
81
+ language_server-protocol (~> 3.17.0.2)
82
+ lint_roller (~> 1.0)
83
+ rubocop (~> 1.56.2)
84
+ standard-custom (~> 1.0.0)
85
+ standard-performance (~> 1.2)
86
+ standard-custom (1.0.2)
87
+ lint_roller (~> 1.0)
88
+ rubocop (~> 1.50)
89
+ standard-performance (1.2.0)
90
+ lint_roller (~> 1.1)
91
+ rubocop-performance (~> 1.19.0)
92
+ stringio (3.1.0)
93
+ unicode-display_width (2.4.2)
47
94
 
48
95
  PLATFORMS
49
96
  arm64-darwin-21
50
97
  arm64-darwin-22
98
+ arm64-darwin-23
51
99
  x64-mingw-ucrt
52
100
  x64-mingw32
53
101
  x86_64-darwin-19
@@ -57,10 +105,15 @@ PLATFORMS
57
105
 
58
106
  DEPENDENCIES
59
107
  concurrent-ruby
108
+ debug
109
+ markly
60
110
  openfeature-sdk!
61
111
  rake (~> 13.0)
62
112
  rspec (~> 3.12.0)
63
- rubocop (~> 1.37.1)
113
+ simplecov (~> 0.22.0)
114
+ simplecov-cobertura (~> 2.1.0)
115
+ standard
116
+ standard-performance
64
117
 
65
118
  BUNDLED WITH
66
119
  2.3.25
data/README.md CHANGED
@@ -14,9 +14,9 @@ We support multiple data types for flags (numbers, strings, booleans, objects) a
14
14
 
15
15
  | Ruby Version | OS |
16
16
  | ----------- | ----------- |
17
- | Ruby 2.7.6 | Windows, MacOS, Linux |
18
- | Ruby 3.0.4 | Windows, MacOS, Linux |
19
- | Ruby 3.1.2 | Windows, MacOS, Linux |
17
+ | Ruby 3.1.4 | Windows, MacOS, Linux |
18
+ | Ruby 3.2.3 | Windows, MacOS, Linux |
19
+ | Ruby 3.3.0 | Windows, MacOS, Linux |
20
20
 
21
21
 
22
22
  ## Installation
@@ -36,14 +36,21 @@ gem install openfeature-sdk
36
36
  ## Usage
37
37
 
38
38
  ```ruby
39
- require 'openfeature/sdk'
39
+ require 'open_feature/sdk'
40
40
  require 'json' # For JSON.dump
41
41
 
42
42
  # API Initialization and configuration
43
43
 
44
44
  OpenFeature::SDK.configure do |config|
45
- # your provider of choice
46
- config.provider = OpenFeature::SDK::Provider::NoOpProvider.new
45
+ # your provider of choice, which will be used as the default provider
46
+ config.set_provider(OpenFeature::SDK::Provider::InMemoryProvider.new(
47
+ {
48
+ "flag1" => true,
49
+ "flag2" => 1
50
+ }
51
+ ))
52
+ # alternatively, you can bind multiple providers to different domains
53
+ config.set_provider(OpenFeature::SDK::Provider::NoOpProvider.new, domain: "legacy_flags")
47
54
  end
48
55
 
49
56
  # Create a client
@@ -63,7 +70,31 @@ integer_value = client.fetch_number_value(flag_key: 'number_value', default_valu
63
70
  object = client.fetch_object_value(flag_key: 'object_value', default_value: JSON.dump({ name: 'object'}))
64
71
  ```
65
72
 
66
- For complete documentation, visit: https://docs.openfeature.dev/docs/category/concepts
73
+ For complete documentation, visit: https://openfeature.dev/docs/category/concepts
74
+
75
+ ### Providers
76
+
77
+ Providers are the abstraction layer between OpenFeature and different flag management systems.
78
+
79
+ The `NoOpProvider` is an example of a minimalist provider. The `InMemoryProvider` is a provider that can be initialized with flags and used to store flags in process. For complete documentation on the Provider interface, visit: https://openfeature.dev/specification/sections/providers.
80
+
81
+ In addition to the `fetch_*` methods, providers can optionally implement lifecycle methods that are invoked when the underlying provider is switched out. For example:
82
+
83
+ ```ruby
84
+ class MyProvider
85
+ def init
86
+ # Perform any initialization steps with flag management system here
87
+ # Return value is ignored
88
+ end
89
+
90
+ def shutdown
91
+ # Perform any shutdown/reclamation steps with flag management system here
92
+ # Return value is ignored
93
+ end
94
+ end
95
+ ```
96
+
97
+ **Note** The OpenFeature spec defines a lifecycle method called `initialize` to be called when a new provider is set. To avoid conflicting with the Ruby `initialize` method, this method should be named `init` when creating a provider.
67
98
 
68
99
  ## Contributing
69
100
 
data/Rakefile CHANGED
@@ -5,11 +5,6 @@ require "rspec/core/rake_task"
5
5
 
6
6
  RSpec::Core::RakeTask.new(:spec)
7
7
 
8
- require "rubocop/rake_task"
8
+ require "standard/rake"
9
9
 
10
- RuboCop::RakeTask.new do |task|
11
- task.options = ["--parallel"]
12
- task.options << "--color" if ENV["CI"] == "true"
13
- end
14
-
15
- task default: %i[spec rubocop]
10
+ task default: %i[spec standard]
@@ -4,9 +4,10 @@ require "forwardable"
4
4
  require "singleton"
5
5
 
6
6
  require_relative "configuration"
7
+ require_relative "evaluation_details"
7
8
  require_relative "client"
8
9
  require_relative "metadata"
9
- require_relative "provider/no_op_provider"
10
+ require_relative "provider"
10
11
 
11
12
  module OpenFeature
12
13
  module SDK
@@ -18,7 +19,7 @@ module OpenFeature
18
19
  # To use the SDK, you can optionally configure a <tt>Provider</tt>, with <tt>Hook</tt>
19
20
  #
20
21
  # OpenFeature::SDK::API.instance.configure do |config|
21
- # config.provider = NoOpProvider.new
22
+ # config.set_provider NoOpProvider.new
22
23
  # end
23
24
  #
24
25
  # If no provider is specified, the <tt>NoOpProvider</tt> is set as the default <tt>Provider</tt>.
@@ -26,19 +27,17 @@ module OpenFeature
26
27
  #
27
28
  # client = OpenFeature::SDK::API.instance.build_client(name: 'my-open-feature-client')
28
29
  class API
29
- include Singleton
30
+ include Singleton # Satisfies Flag Evaluation API Requirement 1.1.1
30
31
  extend Forwardable
31
32
 
32
- def_delegator :@configuration, :provider
33
- def_delegator :@configuration, :hooks
34
- def_delegator :@configuration, :context
33
+ def_delegators :configuration, :provider, :set_provider, :hooks, :context
35
34
 
36
35
  def configuration
37
36
  @configuration ||= Configuration.new
38
37
  end
39
38
 
40
39
  def configure(&block)
41
- return unless block_given?
40
+ return unless block
42
41
 
43
42
  block.call(configuration)
44
43
  end
@@ -26,8 +26,9 @@ module OpenFeature
26
26
  # result = @provider.fetch_boolean_value(flag_key: flag_key, default_value: default_value, evaluation_context: evaluation_context)
27
27
  # end
28
28
  def fetch_#{result_type}_#{suffix}(flag_key:, default_value:, evaluation_context: nil)
29
- result = @provider.fetch_#{result_type}_value(flag_key: flag_key, default_value: default_value, evaluation_context: evaluation_context)
30
- #{"result.value" if suffix == :value}
29
+ resolution_details = @provider.fetch_#{result_type}_value(flag_key:, default_value:, evaluation_context:)
30
+ evaluation_details = EvaluationDetails.new(flag_key:, resolution_details:)
31
+ #{"evaluation_details.value" if suffix == :value}
31
32
  end
32
33
  RUBY
33
34
  end
@@ -0,0 +1,42 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "concurrent"
4
+
5
+ require_relative "api"
6
+
7
+ module OpenFeature
8
+ module SDK
9
+ # Represents the configuration object for the global API where <tt>Provider</tt>, <tt>Hook</tt>,
10
+ # and <tt>Context</tt> are configured.
11
+ # This class is not meant to be interacted with directly but instead through the <tt>OpenFeature::SDK.configure</tt>
12
+ # method
13
+ class Configuration
14
+ extend Forwardable
15
+
16
+ attr_accessor :context, :hooks
17
+
18
+ def_delegator :provider, :metadata
19
+
20
+ def initialize
21
+ @hooks = []
22
+ @providers = {}
23
+ end
24
+
25
+ def provider(domain: nil)
26
+ @providers[domain]
27
+ end
28
+
29
+ # When switching providers, there are a few lifecycle methods that need to be taken care of.
30
+ # 1. If a provider is already set, we need to call `shutdown` on it.
31
+ # 2. On the new provider, call `init`.
32
+ # 3. Finally, set the internal provider to the new provider
33
+ def set_provider(provider, domain: nil)
34
+ @providers[domain].shutdown if @providers[domain].respond_to?(:shutdown)
35
+
36
+ provider.init if provider.respond_to?(:init)
37
+
38
+ @providers[domain] = provider
39
+ end
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,9 @@
1
+ module OpenFeature
2
+ module SDK
3
+ EvaluationDetails = Struct.new(:flag_key, :resolution_details, keyword_init: true) do
4
+ extend Forwardable
5
+
6
+ def_delegators :resolution_details, :value, :reason, :variant, :error_code, :error_message, :flag_metadata
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,15 @@
1
+ module OpenFeature
2
+ module SDK
3
+ module Provider
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"
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,62 @@
1
+ module OpenFeature
2
+ module SDK
3
+ module Provider
4
+ # TODO: Add evaluation context support
5
+ class InMemoryProvider
6
+ NAME = "In-memory Provider"
7
+
8
+ def initialize(flags = {})
9
+ @metadata = Metadata.new(name: NAME).freeze
10
+ @flags = flags
11
+ end
12
+
13
+ def init
14
+ # Intentional no-op, used for testing
15
+ end
16
+
17
+ def shutdown
18
+ # Intentional no-op, used for testing
19
+ end
20
+
21
+ def add_flag(flag_key:, value:)
22
+ flags[flag_key] = value
23
+ # TODO: Emit PROVIDER_CONFIGURATION_CHANGED event once events are implemented
24
+ end
25
+
26
+ def fetch_boolean_value(flag_key:, default_value:, evaluation_context: nil)
27
+ fetch_value(allowed_classes: [TrueClass, FalseClass], flag_key:, default_value:, evaluation_context:)
28
+ end
29
+
30
+ def fetch_string_value(flag_key:, default_value:, evaluation_context: nil)
31
+ fetch_value(allowed_classes: [String], flag_key:, default_value:, evaluation_context:)
32
+ end
33
+
34
+ def fetch_number_value(flag_key:, default_value:, evaluation_context: nil)
35
+ fetch_value(allowed_classes: [Integer, Float], flag_key:, default_value:, evaluation_context:)
36
+ end
37
+
38
+ def fetch_object_value(flag_key:, default_value:, evaluation_context: nil)
39
+ fetch_value(allowed_classes: [Array, Hash], flag_key:, default_value:, evaluation_context:)
40
+ end
41
+
42
+ private
43
+
44
+ attr_reader :flags
45
+
46
+ def fetch_value(allowed_classes:, flag_key:, default_value:, evaluation_context:)
47
+ value = flags[flag_key]
48
+
49
+ if value.nil?
50
+ return ResolutionDetails.new(value: default_value, error_code: ErrorCode::FLAG_NOT_FOUND, reason: Reason::ERROR)
51
+ end
52
+
53
+ if allowed_classes.include?(value.class)
54
+ ResolutionDetails.new(value:, reason: Reason::STATIC)
55
+ else
56
+ ResolutionDetails.new(value: default_value, error_code: ErrorCode::TYPE_MISMATCH, reason: Reason::ERROR)
57
+ end
58
+ end
59
+ end
60
+ end
61
+ end
62
+ end
@@ -11,7 +11,7 @@ module OpenFeature
11
11
  # To use <tt>NoOpProvider</tt>, it can be set during the configuration of the SDK
12
12
  #
13
13
  # OpenFeature::SDK.configure do |config|
14
- # config.provider = NoOpProvider.new
14
+ # config.set_provider NoOpProvider.new
15
15
  # end
16
16
  #
17
17
  # Within the <tt>NoOpProvider</tt>, the following methods exist
@@ -30,8 +30,6 @@ module OpenFeature
30
30
 
31
31
  attr_reader :metadata
32
32
 
33
- ResolutionDetails = Struct.new(:value, :reason, :variant, :error_code, :error_message)
34
-
35
33
  def initialize
36
34
  @metadata = Metadata.new(name: NAME).freeze
37
35
  end
@@ -0,0 +1,17 @@
1
+ module OpenFeature
2
+ module SDK
3
+ module Provider
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"
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,7 @@
1
+ module OpenFeature
2
+ module SDK
3
+ module Provider
4
+ ResolutionDetails = Struct.new(:value, :reason, :variant, :error_code, :error_message, :flag_metadata, keyword_init: true)
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,12 @@
1
+ require_relative "provider/error_code"
2
+ require_relative "provider/reason"
3
+ require_relative "provider/resolution_details"
4
+ require_relative "provider/no_op_provider"
5
+ require_relative "provider/in_memory_provider"
6
+
7
+ module OpenFeature
8
+ module SDK
9
+ module Provider
10
+ end
11
+ end
12
+ end
@@ -2,6 +2,6 @@
2
2
 
3
3
  module OpenFeature
4
4
  module SDK
5
- VERSION = "0.1.0"
5
+ VERSION = "0.2.0"
6
6
  end
7
7
  end
@@ -8,9 +8,9 @@ module OpenFeature
8
8
  #
9
9
  module SDK
10
10
  class << self
11
- def method_missing(method_name, *args, **kwargs, &block)
11
+ def method_missing(method_name, ...)
12
12
  if API.instance.respond_to?(method_name)
13
- API.instance.send(method_name, *args, **kwargs, &block)
13
+ API.instance.send(method_name, ...)
14
14
  else
15
15
  super
16
16
  end
@@ -9,7 +9,7 @@
9
9
  "bump-minor-pre-major": true,
10
10
  "bump-patch-for-minor-pre-major": true,
11
11
  "package-name": "openfeature-sdk",
12
- "version-file": "lib/openfeature/sdk/version.rb"
12
+ "version-file": "lib/open_feature/sdk/version.rb"
13
13
  }
14
14
  }
15
15
  }
data/renovate.json CHANGED
@@ -2,5 +2,16 @@
2
2
  "$schema": "https://docs.renovatebot.com/renovate-schema.json",
3
3
  "extends": [
4
4
  "config:base"
5
+ ],
6
+ "packageRules": [
7
+ {
8
+ "matchUpdateTypes": ["minor", "patch"],
9
+ "matchCurrentVersion": "!/^0/",
10
+ "automerge": true
11
+ },
12
+ {
13
+ "matchManagers": ["github-actions"],
14
+ "automerge": true
15
+ }
5
16
  ]
6
17
  }
metadata CHANGED
@@ -1,15 +1,43 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: openfeature-sdk
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.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: 2022-12-19 00:00:00.000000000 Z
11
+ date: 2024-03-11 00:00:00.000000000 Z
12
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: debug
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: markly
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
13
41
  - !ruby/object:Gem::Dependency
14
42
  name: rake
15
43
  requirement: !ruby/object:Gem::Requirement
@@ -39,19 +67,61 @@ dependencies:
39
67
  - !ruby/object:Gem::Version
40
68
  version: 3.12.0
41
69
  - !ruby/object:Gem::Dependency
42
- name: rubocop
70
+ name: standard
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: standard-performance
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: simplecov
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: 0.22.0
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: 0.22.0
111
+ - !ruby/object:Gem::Dependency
112
+ name: simplecov-cobertura
43
113
  requirement: !ruby/object:Gem::Requirement
44
114
  requirements:
45
115
  - - "~>"
46
116
  - !ruby/object:Gem::Version
47
- version: 1.37.1
117
+ version: 2.1.0
48
118
  type: :development
49
119
  prerelease: false
50
120
  version_requirements: !ruby/object:Gem::Requirement
51
121
  requirements:
52
122
  - - "~>"
53
123
  - !ruby/object:Gem::Version
54
- version: 1.37.1
124
+ version: 2.1.0
55
125
  description: Ruby SDK for an the specifications for the open standard of feature flag
56
126
  management
57
127
  email:
@@ -62,25 +132,33 @@ extra_rdoc_files: []
62
132
  files:
63
133
  - ".release-please-manifest.json"
64
134
  - ".rspec"
65
- - ".rubocop.yml"
66
135
  - ".ruby-version"
136
+ - ".simplecov"
137
+ - ".standard.yml"
138
+ - ".tool-versions"
67
139
  - CHANGELOG.md
140
+ - CODEOWNERS
68
141
  - CODE_OF_CONDUCT.md
69
142
  - Gemfile
70
143
  - Gemfile.lock
71
144
  - LICENSE
72
145
  - README.md
73
146
  - Rakefile
74
- - lib/openfeature/sdk.rb
75
- - lib/openfeature/sdk/api.rb
76
- - lib/openfeature/sdk/client.rb
77
- - lib/openfeature/sdk/configuration.rb
78
- - lib/openfeature/sdk/metadata.rb
79
- - lib/openfeature/sdk/provider/no_op_provider.rb
80
- - lib/openfeature/sdk/version.rb
147
+ - lib/open_feature/sdk.rb
148
+ - lib/open_feature/sdk/api.rb
149
+ - lib/open_feature/sdk/client.rb
150
+ - lib/open_feature/sdk/configuration.rb
151
+ - lib/open_feature/sdk/evaluation_details.rb
152
+ - lib/open_feature/sdk/metadata.rb
153
+ - lib/open_feature/sdk/provider.rb
154
+ - lib/open_feature/sdk/provider/error_code.rb
155
+ - lib/open_feature/sdk/provider/in_memory_provider.rb
156
+ - lib/open_feature/sdk/provider/no_op_provider.rb
157
+ - lib/open_feature/sdk/provider/reason.rb
158
+ - lib/open_feature/sdk/provider/resolution_details.rb
159
+ - lib/open_feature/sdk/version.rb
81
160
  - release-please-config.json
82
161
  - renovate.json
83
- - sig/openfeature/sdk.rbs
84
162
  homepage: https://github.com/open-feature/openfeature-ruby
85
163
  licenses:
86
164
  - Apache-2.0'
@@ -98,14 +176,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
98
176
  requirements:
99
177
  - - ">="
100
178
  - !ruby/object:Gem::Version
101
- version: 2.7.6
179
+ version: '3.1'
102
180
  required_rubygems_version: !ruby/object:Gem::Requirement
103
181
  requirements:
104
182
  - - ">="
105
183
  - !ruby/object:Gem::Version
106
184
  version: '0'
107
185
  requirements: []
108
- rubygems_version: 3.3.26
186
+ rubygems_version: 3.5.3
109
187
  signing_key:
110
188
  specification_version: 4
111
189
  summary: OpenFeature SDK for Ruby
data/.rubocop.yml DELETED
@@ -1,28 +0,0 @@
1
- AllCops:
2
- TargetRubyVersion: 2.7
3
- NewCops: enable
4
-
5
- Style/StringLiterals:
6
- Enabled: true
7
- EnforcedStyle: double_quotes
8
-
9
- Style/StringLiteralsInInterpolation:
10
- Enabled: true
11
- EnforcedStyle: double_quotes
12
-
13
- Layout/LineLength:
14
- Max: 120
15
- Exclude:
16
- - 'spec/**/*.rb'
17
-
18
- Metrics/BlockLength:
19
- Exclude:
20
- - 'spec/**/*.rb'
21
- - 'openfeature-sdk.gemspec'
22
-
23
- Gemspec/RequireMFA:
24
- Enabled: false
25
-
26
- Style/DocumentDynamicEvalDefinition:
27
- # TODO re-enable after figuring out what it actually wants
28
- Enabled: false
@@ -1,25 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "concurrent"
4
-
5
- require_relative "api"
6
-
7
- module OpenFeature
8
- module SDK
9
- # Represents the configuration object for the global API where <tt>Provider</tt>, <tt>Hook</tt>,
10
- # and <tt>Context</tt> are configured.
11
- # This class is not meant to be interacted with directly but instead through the <tt>OpenFeature::SDK.configure</tt>
12
- # method
13
- class Configuration
14
- extend Forwardable
15
-
16
- attr_accessor :context, :provider, :hooks
17
-
18
- def_delegator :@provider, :metadata
19
-
20
- def initialize
21
- @hooks = Concurrent::Array.new([])
22
- end
23
- end
24
- end
25
- end
@@ -1,6 +0,0 @@
1
- module Openfeature
2
- module Sdk
3
- VERSION: String
4
- # See the writing guide of rbs: https://github.com/ruby/rbs#guides
5
- end
6
- end
File without changes