diff --git a/CHANGELOG.md b/CHANGELOG.md
index 69a5954..a0cccbf 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -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
diff --git a/README.md b/README.md
index ad5f182..91d4ac2 100644
--- a/README.md
+++ b/README.md
@@ -17,8 +17,8 @@
-
-
+
+
@@ -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. |
diff --git a/lib/open_feature.ex b/lib/open_feature.ex
index 219db83..1b53112 100644
--- a/lib/open_feature.ex
+++ b/lib/open_feature.ex
@@ -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.
@@ -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
diff --git a/lib/open_feature/provider.ex b/lib/open_feature/provider.ex
index 60a008e..c62d5e0 100644
--- a/lib/open_feature/provider.ex
+++ b/lib/open_feature/provider.ex
@@ -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 &&
diff --git a/mix.exs b/mix.exs
index cc5ab8d..6ae303a 100644
--- a/mix.exs
+++ b/mix.exs
@@ -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"],
diff --git a/test/unit/open_feature_test.exs b/test/unit/open_feature_test.exs
index ab553cd..7bcc349 100644
--- a/test/unit/open_feature_test.exs
+++ b/test/unit/open_feature_test.exs
@@ -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)
@@ -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)