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 @@ - - Release + + Release @@ -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)