Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,11 @@
## v0.1.2 (2025-06-23)

- fix: unused provider shutdown

## v0.1.1 (2024-08-02)

- chore: use readme template

## v0.1.0 (2024-07-29)

- Initial release
6 changes: 3 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,8 @@
</a>
<!-- x-release-please-start-version -->

<a href="https://github.com/open-feature/elixir-sdk/releases/tag/v0.1.1">
<img alt="Release" src="https://img.shields.io/static/v1?label=release&message=v0.1.1&color=blue&style=for-the-badge" />
<a href="https://github.com/open-feature/elixir-sdk/releases/tag/v0.1.2">
<img alt="Release" src="https://img.shields.io/static/v1?label=release&message=v0.1.2&color=blue&style=for-the-badge" />
</a>

<!-- x-release-please-end -->
Expand Down Expand Up @@ -86,7 +86,7 @@ For details, including API documentation, see the respective [Hex docs](https://

| Status | Features | Description |
| ------ | --------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------|
| ⚠️ | [Providers](#providers) | Integrate with a commercial, open source, or in-house feature management tool. |
| | [Providers](#providers) | Integrate with a commercial, open source, or in-house feature management tool. |
| ✅ | [Targeting](#targeting) | Contextually-aware flag evaluation using [evaluation context](https://openfeature.dev/docs/reference/concepts/evaluation-context). |
| ✅ | [Hooks](#hooks) | Add functionality to various stages of the flag evaluation life-cycle. |
| ✅ | [Logging](#logging) | Integrate with popular logging packages. |
Expand Down
27 changes: 13 additions & 14 deletions lib/open_feature.ex
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ defmodule OpenFeature do
Sets the provider for a given domain.

The provider is validated and is initialized with the global context.
If a provider is already set for the domain, it will be replaced and shutdown.
If a provider is already set for the domain, it will be replaced and shutdown if not set for other domains.
If the provider is the same as the one already set, it will not be replaced.
If the provider is invalid or fails to be initialized, an error will be returned.
If no domain is provided, the default domain will be used.
Expand Down Expand Up @@ -79,23 +79,22 @@ defmodule OpenFeature do
@spec shutdown() :: :ok
def shutdown, do: Enum.each(Store.list_providers(), &Provider.shutdown/1)

defp check_if_already_set(domain, provider) do
domain_provider = Store.get_provider(domain)

if Provider.equal?(domain_provider, provider) do
{:ok, domain_provider}
else
{:not_set, domain_provider}
defp check_if_already_set(domain, %provider_module{} = provider) do
case Store.get_provider(domain) do
%^provider_module{} = domain_provider -> {:ok, domain_provider}
_provider -> {:not_set, provider}
end
end

defp maybe_shutdown_old_provider(old_provider) do
defp maybe_shutdown_old_provider(%old_provider_module{} = old_provider) do
Store.list_providers()
|> Enum.any?(fn provider ->
Provider.equal?(provider, old_provider)
|> Enum.any?(fn
%^old_provider_module{} = _provider -> true
_provider -> false
end)
|> then(fn
false -> Provider.shutdown(old_provider)
true -> :ok
end)
|> if do
Provider.shutdown(old_provider)
end
end
end
1 change: 1 addition & 0 deletions lib/open_feature/provider.ex
Original file line number Diff line number Diff line change
Expand Up @@ -125,6 +125,7 @@ defmodule OpenFeature.Provider do
Checks if two providers are equal based on their name, domain, and state.
"""
@doc since: "0.1.0"
@doc deprecated: "This function will be removed in the next major version."
@spec equal?(t, t) :: boolean
def equal?(%module1{} = provider1, %module2{} = provider2) do
module1 == module2 &&
Expand Down
2 changes: 1 addition & 1 deletion mix.exs
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ defmodule OpenFeature.MixProject do
def project do
[
app: :open_feature,
version: "0.1.1",
version: "0.1.2",
elixir: "~> 1.14",
start_permanent: Mix.env() == :prod,
test_paths: ["test/unit", "test/integration"],
Expand Down
6 changes: 2 additions & 4 deletions test/unit/open_feature_test.exs
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,8 @@ defmodule OpenFeatureTest do

Provider
|> expect(:validate_provider, fn ^provider -> {:ok, provider} end)
|> expect(:equal?, fn nil, ^provider -> false end)
|> expect(:initialize, fn ^domain, ^provider, ^context -> {:ok, provider} end)
|> expect(:shutdown, fn _old_provider -> :ok end)

Store
|> expect(:set_provider, fn ^domain, ^provider -> :ok end)
Expand All @@ -30,9 +30,7 @@ defmodule OpenFeatureTest do
provider = %NoOp{}
domain = "default"

Provider
|> expect(:validate_provider, fn ^provider -> {:ok, provider} end)
|> expect(:equal?, fn ^provider, ^provider -> true end)
expect(Provider, :validate_provider, fn ^provider -> {:ok, provider} end)

expect(Store, :get_provider, fn ^domain -> provider end)

Expand Down