OpenFeature::SDK::Contrib
This gem describes a provider for OpenFeature using the following:
A feature flag format of:
[
{ "name" => "example_boolean", "kind" => "boolean", "value" => true, "enabled" => true },
{ "name" => "example_invalid_boolean", "kind" => "boolean", "value" => "a string", "enabled" => true },
{ "name" => "example_disabled_boolean", "kind" => "boolean", "value" => true, "enabled" => false },
{ "name" => "example_named_string",
"kind" => "string",
"value" => "medium",
"enabled" => true },
{ "name" => "example_invalid_named_string",
"kind" => "string",
"value" => true,
"enabled" => true },
{ "name" => "example_disabled_named_string",
"kind" => "string",
"value" => "medium",
"enabled" => false },
{ "name" => "example_named_number",
"kind" => "number",
"variants" => { "small" => 8, "medium" => 128, "large" => 2048 },
"variant" => "medium",
"enabled" => true },
{ "name" => "example_invalid_named_number",
"kind" => "number",
"variants" => { "small" => "a string", "medium" => "a string", "large" => "a string" },
"variant" => "medium",
"enabled" => true },
{ "name" => "example_disabled_named_number",
"kind" => "number",
"variants" => { "small" => 8, "medium" => 128, "large" => 2048 },
"variant" => "medium",
"enabled" => false },
{ "name" => "example_named_float",
"kind" => "float",
"variants" => { "pi" => 3.141592653589793, "e" => 2.718281828459045, "phi" => 1.618033988749894 },
"variant" => "e",
"enabled" => true },
{ "name" => "example_invalid_named_float",
"kind" => "float",
"variants" => { "pi" => "a string", "e" => "a string", "phi" => "a string" },
"variant" => "e",
"enabled" => true },
{ "name" => "example_disabled_named_float",
"kind" => "float",
"variants" => { "pi" => 3.141592653589793, "e" => 2.718281828459045, "phi" => 1.618033988749894 },
"variant" => "e",
"enabled" => false }
]
This can be read from a file using the OpenFeature::SDK::Contrib::FileProvider
class or from a URL using the UrlProvider
class.
Installation
Install the gem and add to the application's Gemfile by executing:
$ bundle add openfeature-ruby-sdk-contrib
If bundler is not being used to manage dependencies, install the gem by executing:
$ gem install openfeature-ruby-sdk-contrib
Usage
If you are using rails, this code will go in an initializer. If you aren't, replace the assignments for Rails.application.config.openfeature_provider
and Rails.application.config.openfeature_client
with constants that you will have access to application-wide.
File Provider
require "open_feature/sdk/contrib"
Rails.application.config.openfeature_provider = OpenFeature::SDK::Contrib::Providers::FileProvider.new(
cache_duration: 300,
deep_keys: ["flags"], # If your flags are nested inside of a response, this array is a list of keys that will get to the array where the actual flags are defined
format: :yaml, # json or yaml
source: "/path/to/file.yml"
)
Rails.application.config.openfeature_client = OpenFeature::SDK::Contrib::Client.new(
client_options: { name: "your arbitrary client name" },
provider: Rails.application.config.openfeature_provider
)
HTTP Provider
require "open_feature/sdk/contrib"
Rails.application.config.openfeature_provider = OpenFeature::SDK::Contrib::Providers::HttpProvider.new(
cache_duration: 300,
deep_keys: ["flags"], # If your flags are nested inside of a response, this array is a list of keys that will get to the array where the actual flags are defined
extra_options: { Authorization: "Bearer <some token>" }, # This object can be anything that gets passed to Faraday.new
format: :json, # json or yaml
source: "https://some.url/feature-flags"
)
Rails.application.config.openfeature_client = OpenFeature::SDK::Contrib::Client.new(
client_options: { name: "your arbitrary client name" },
provider: Rails.application.config.openfeature_provider
)
Custom Auth Strategy
Some applications may require more finesse to authenticate, for example, an OAuth Flow. To use this style flow, the extra_options
key that is passed to HttpProvider.new
accepts an authentication_strategy
key. This key gets passed to the internal Faraday client as a middleware, so it can be anything usable as a Faraday middleware. Example:
module FaradayMiddleware
class MyCustomMiddleware < Faraday::Middleware
def initialize(args)
# do stuff
end
def call(env)
@app.call(env)
end
end
Faraday::Request.register_middleware my_custom_middleware: -> { MyCustomMiddleware }
end
Rails.application.config.openfeature_provider = OpenFeature::SDK::Contrib::Providers::HttpProvider.new(
extra_options: {
authentication_strategy: [:my_custom_middleware, my_custom_middleware_arguments]
}
)
Development
After checking out the repo, run bin/setup
to install dependencies. Then, run rake spec
to run the tests. You can also run bin/console
for an interactive prompt that will allow you to experiment.
To install this gem onto your local machine, run bundle exec rake install
. To release a new version, update the version number in version.rb
, and then run bundle exec rake release
, which will create a git tag for the version, push git commits and the created tag, and push the .gem
file to rubygems.org.
Contributing
Bug reports and pull requests are welcome on GitHub at https://github.com/ehowe/openfeature-ruby-sdk-contrib.
License
The gem is available as open source under the terms of the MIT License.