diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index c17827a..6e40ae5 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -16,8 +16,8 @@ jobs:
- uses: actions/checkout@v3
- uses: erlef/setup-beam@v1
with:
- otp-version: 25.0
- elixir-version: 1.14.0
+ otp-version: 26.0
+ elixir-version: 1.16.0
- run: mix deps.get
- run: mix compile --warnings-as-errors
- run: mix credo --strict --ignore design.tagtodo,readability.maxlinelength
@@ -40,8 +40,8 @@ jobs:
strategy:
matrix:
version:
- - otp: 25.0
- elixir: 1.14.0
+ - otp: 26.0
+ elixir: 1.16.0
os: ubuntu-latest
- otp: 22.0
elixir: 1.12.0
diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml
index 749f622..2feb6d7 100644
--- a/.github/workflows/publish.yml
+++ b/.github/workflows/publish.yml
@@ -19,7 +19,7 @@ jobs:
- uses: actions/checkout@v2
- uses: erlef/setup-beam@v1
with:
- otp-version: 24.0
- elixir-version: 1.12
+ otp-version: 26.0
+ elixir-version: 1.16
- run: mix deps.get
- run: mix hex.publish --yes
\ No newline at end of file
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 5859e5e..8bf5c2a 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,23 @@
# Changelog
+## v0.4.18 (TBA)
+
+Now supports Phoenix HTML 4.0.
+
+`PowAssent.Phoenix.ViewHelpers` has been replaced with `PowAssent.Phoenix.HTML.CoreComponents` for Phoenix 1.7. The following functions be used in place of the previous view helper functions:
+
+- `PowAssent.Phoenix.HTML.CoreComponents.provider_links/1`
+- `PowAssent.Phoenix.HTML.CoreComponents.authorization_link/1`
+- `PowAssent.Phoenix.HTML.CoreComponents.deauthorization_link/1`
+
+### Enhancements
+
+* [`PowAssent.Phoenix.HTML.CoreComponents`] added with template functions for authorization links
+
+### Deprecations
+
+* [`PowAssent.Phoenix.ViewHelpers`] has been deprecated and removed from Phoenix 1.7
+
## v0.4.17 (2023-03-28)
### Enhancements
diff --git a/README.md b/README.md
index 08b053a..2dc30e6 100644
--- a/README.md
+++ b/README.md
@@ -104,18 +104,27 @@ Otherwise, Pow will raise an error about missing template when the user id field
### Provider links
-You can use `PowAssent.Phoenix.ViewHelpers.provider_links/1` to add provider links to your template files:
+You can use helpers from `PowAssent.Phoenix.HTML.CoreComponents` to render provider links:
```elixir
-<%= for link <- PowAssent.Phoenix.ViewHelpers.provider_links(@conn),
- do: content_tag(:span, link) %>
+# Minimal
+
+
+# With styling
+
+
+ <:authorization_link :let={provider} class="block rounded-lg bg-zinc-600 hover:bg-zinc-700 py-2 px-3 text-sm font-semibold leading-6 text-white w-full text-center">
+ <%= Phoenix.Naming.humanize(provider) %> →
+
+
+
```
-This can be used in the `WEB_PATH/controllers/pow/session_html/new.html.heex`, `WEB_PATH/controllers/pow/registration_html/new.html.heex` and `WEB_PATH/controllers/pow/registration_html/edit.html.heex` templates.
+This can be used in the `WEB_PATH/controllers/pow/session_html/new.html.heex`, `WEB_PATH/controllers/pow/registration_html/new.html.heex` and `WEB_PATH/controllers/pow/registration_html/edit.html.heex` templates. You may want to import or alias the module in your web module.
-By default "Sign in with PROVIDER" link is shown. A "Remove PROVIDER authentication" link will be shown instead if the user is signed in and the user already have authorized with the provider.
+By default "Sign in with PROVIDER" link is shown. A "Remove PROVIDER authentication" link will be shown instead if the user is signed in and the user already is authorized with the provider.
-You can also call `PowAssent.Phoenix.ViewHelpers.authorization_link/2` and `PowAssent.Phoenix.ViewHelpers.deauthorization_link/2` to generate a link for a single provider.
+You can also use `<.authorization_link conn={@conn} provider={provider} />` and `<.deauthorization_link conn={@conn} provider={provider} />` to generate a link for a single provider.
### Setting up a provider
@@ -145,7 +154,7 @@ config :my_app, :pow_assent,
providers: [
example: [
client_id: "REPLACE_WITH_CLIENT_ID",
- site: "https://server.example.com",
+ base_url: "https://server.example.com",
authorization_params: [scope: "user:read user:write"],
nonce: true,
strategy: Assent.Strategy.OIDC
diff --git a/lib/mix/tasks/ecto/pow_assent.ecto.gen.schema.ex b/lib/mix/tasks/ecto/pow_assent.ecto.gen.schema.ex
index 27689c5..2f35673 100644
--- a/lib/mix/tasks/ecto/pow_assent.ecto.gen.schema.ex
+++ b/lib/mix/tasks/ecto/pow_assent.ecto.gen.schema.ex
@@ -60,7 +60,7 @@ defmodule Mix.Tasks.PowAssent.Ecto.Gen.Schema do
defp dir_name(schema_name) do
schema_name
|> String.split(".")
- |> Enum.slice(0..-2)
+ |> Enum.slice(0..-2//1)
|> Enum.join(".")
|> Macro.underscore()
end
diff --git a/lib/pow_assent/phoenix/controllers/authorization_controller.ex b/lib/pow_assent/phoenix/controllers/authorization_controller.ex
index 44ec900..953b3d7 100644
--- a/lib/pow_assent/phoenix/controllers/authorization_controller.ex
+++ b/lib/pow_assent/phoenix/controllers/authorization_controller.ex
@@ -223,10 +223,16 @@ defmodule PowAssent.Phoenix.AuthorizationController do
defp load_user_by_invitation_token(conn, _opts), do: conn
defp handle_strategy_error(conn, error) do
- Logger.error("Strategy failed with error: #{inspect error}")
+ log_strategy_error(error)
conn
|> put_flash(:error, extension_messages(conn).could_not_sign_in(conn))
|> redirect(to: routes(conn).session_path(conn, :new))
end
+
+ defp log_strategy_error(error) when is_exception(error), do: log_strategy_error(Exception.message(error))
+
+ defp log_strategy_error(error) when is_binary(error) do
+ Logger.error("Strategy failed with error: #{error}")
+ end
end
diff --git a/lib/pow_assent/phoenix/controllers/view_helpers.ex b/lib/pow_assent/phoenix/controllers/view_helpers.ex
index 4698f58..b7d9076 100644
--- a/lib/pow_assent/phoenix/controllers/view_helpers.ex
+++ b/lib/pow_assent/phoenix/controllers/view_helpers.ex
@@ -1,22 +1,12 @@
+# TODO: Remove this when Phoenix 1.7+ is required
+if Pow.dependency_vsn_match?(:phoenix, "< 1.7.0") do
defmodule PowAssent.Phoenix.ViewHelpers do
- @moduledoc """
- View helpers to render authorization links.
- """
+ @moduledoc false
alias PowAssent.Plug
alias Phoenix.{HTML, HTML.Link}
alias PowAssent.Phoenix.AuthorizationController
- @doc """
- Generates list of authorization links for all configured providers.
-
- The list of providers will be fetched from the PowAssent configuration, and
- `authorization_link/2` will be called on each.
-
- If a user is assigned to the conn, the authorized providers for a user will
- be looked up with `PowAssent.Plug.providers_for_current_user/1`.
- `deauthorization_link/2` will be used for any already authorized providers.
- """
@spec provider_links(Conn.t(), keyword()) :: [HTML.safe()]
def provider_links(conn, link_opts \\ []) do
available_providers = Plug.available_providers(conn)
@@ -30,13 +20,6 @@ defmodule PowAssent.Phoenix.ViewHelpers do
end)
end
- @doc """
- Generates an authorization link for a provider.
-
- The link is used to sign up or register a user using a provider. If
- `:invited_user` is assigned to the conn, the invitation token will be passed
- on through the URL query params.
- """
@spec authorization_link(Conn.t(), atom(), keyword()) :: HTML.safe()
def authorization_link(conn, provider, opts \\ []) do
query_params = invitation_token_query_params(conn) ++ request_path_query_params(conn)
@@ -54,11 +37,6 @@ defmodule PowAssent.Phoenix.ViewHelpers do
defp request_path_query_params(%{assigns: %{request_path: request_path}}), do: [request_path: request_path]
defp request_path_query_params(_conn), do: []
- @doc """
- Generates a provider deauthorization link.
-
- The link is used to remove authorization with the provider.
- """
@spec deauthorization_link(Conn.t(), atom(), keyword()) :: HTML.safe()
def deauthorization_link(conn, provider, opts \\ []) do
msg = AuthorizationController.extension_messages(conn).remove_provider_authentication(%{conn | params: %{"provider" => provider}})
@@ -68,3 +46,4 @@ defmodule PowAssent.Phoenix.ViewHelpers do
Link.link(msg, opts)
end
end
+end
diff --git a/lib/pow_assent/phoenix/html/core_components.ex b/lib/pow_assent/phoenix/html/core_components.ex
new file mode 100644
index 0000000..7f577bf
--- /dev/null
+++ b/lib/pow_assent/phoenix/html/core_components.ex
@@ -0,0 +1,162 @@
+# TODO: Remove conditional when LiveView for Phoenix 1.7+ is required
+# Credo will complain about unless statement but we want this first
+# credo:disable-for-next-line
+unless Pow.dependency_vsn_match?(:phoenix, "< 1.7.0") do
+defmodule PowAssent.Phoenix.HTML.CoreComponents do
+ @moduledoc false
+ use Phoenix.Component
+
+ alias PowAssent.{Phoenix.AuthorizationController, Plug}
+
+ @doc """
+ Renders a list of authorization links for all configured providers.
+
+ The list of providers will be fetched from the PowAssent configuration, and
+ `authorization_link/1` will be called on each.
+
+ If a user is assigned to the conn, the authorized providers for a user will
+ be looked up with `PowAssent.Plug.providers_for_current_user/1`.
+ `deauthorization_link/1` will be used for any already authorized providers.
+
+ ## Examples
+
+ <.provider_links conn={@conn} />
+
+ <.provider_links conn={@conn}>
+ <:authorization_link class="text-green-500">
+ Sign in with <%= @provider %>
+ <:/authorization_link>
+
+ <:deauthorization_link class="text-red-500">
+ Remove <%= @provider %> authentication
+ <:/deauthorization_link>
+
+ """
+ attr :conn, :any, required: true, doc: "the conn"
+
+ slot :authorization_link, doc: "attributes and inner content for the authorization link" do
+ attr :class, :string, doc: "Additional classes added to the `.link` tag"
+ end
+
+ slot :deauthorization_link, doc: "attributes and inner content for the deuathorization link" do
+ attr :class, :string, doc: "Additional classes added to the `.link` tag"
+ end
+
+ def provider_links(assigns) do
+ providers = Plug.available_providers(assigns.conn)
+ providers_for_user = Plug.providers_for_current_user(assigns.conn)
+
+ assigns =
+ assign(
+ assigns,
+ class: %{
+ authorization: (for %{class: class} <- assigns.authorization_link, do: class),
+ deauthorization: (for %{class: class} <- assigns.deauthorization_link, do: class)
+ },
+ label: %{
+ authorization: Enum.reject(assigns.authorization_link, &is_nil(&1.inner_block)),
+ deauthorization: Enum.reject(assigns.deauthorization_link, &is_nil(&1.inner_block))
+ },
+ providers: providers,
+ providers_for_user: providers_for_user
+ )
+
+ ~H"""
+ <%= for provider <- @providers do %><.authorization_link
+ :if={provider not in @providers_for_user}
+ conn={@conn}
+ provider={provider}
+ {@class.authorization != [] && [class: @class.authorization] || []}
+ >
+ <%= @label.authorization != [] && render_slot(@label.authorization, provider) || sign_in_with_provider_label(@conn, provider) %>
+ <.deauthorization_link
+ :if={provider in @providers_for_user}
+ conn={@conn}
+ provider={provider}
+ {@class.deauthorization != [] && [class: @class.deauthorization] || []}
+ >
+ <%= @label.deauthorization != [] && render_slot(@label.deauthorization, provider) || remove_provider_authentication_label(@conn, provider) %>
+ <% end %>
+ """
+ end
+
+ defp sign_in_with_provider_label(conn, provider) do
+ AuthorizationController.extension_messages(conn).login_with_provider(%{conn | params: %{"provider" => provider}})
+ end
+
+ defp remove_provider_authentication_label(conn, provider) do
+ AuthorizationController.extension_messages(conn).remove_provider_authentication(%{conn | params: %{"provider" => provider}})
+ end
+
+ @doc """
+ Renders an authorization link for a provider.
+
+ The link is used to sign up or register a user using a provider. If
+ `:invited_user` is assigned to the conn, the invitation token will be passed
+ on through the URL query params.
+
+ ## Examples
+
+ <.authorization_link conn={@conn} provider="github" />
+
+ <.authorization_link conn={@conn} provider="github">Sign in with Github
+ """
+ attr :conn, :any, required: true, doc: "the conn"
+ attr :provider, :any, required: true, doc: "the provider"
+
+ attr :rest,
+ :global,
+ include: ~w(csrf_token download hreflang referrerpolicy rel target type),
+ doc: "
+ Additional attributes added to the `.link` tag.
+ "
+
+ slot :inner_block
+
+ def authorization_link(assigns) do
+ query_params = invitation_token_query_params(assigns.conn) ++ request_path_query_params(assigns.conn)
+ path = AuthorizationController.routes(assigns.conn).path_for(assigns.conn, AuthorizationController, :new, [assigns.provider], query_params)
+ assigns = assign(assigns, navigate: path)
+
+ ~H"""
+ <.link navigate={@navigate} {@rest}><%= render_slot(@inner_block) || sign_in_with_provider_label(@conn, @provider) %>
+ """
+ end
+
+ defp invitation_token_query_params(%{assigns: %{invited_user: %{invitation_token: token}}}), do: [invitation_token: token]
+ defp invitation_token_query_params(_conn), do: []
+
+ defp request_path_query_params(%{assigns: %{request_path: request_path}}), do: [request_path: request_path]
+ defp request_path_query_params(_conn), do: []
+
+ @doc """
+ Renders a deauthorization link for a provider.
+
+ The link is used to remove authorization with the provider.
+
+ ## Examples
+
+ <.deauthorization_link conn={@conn} provider="github">
+
+ <.deauthorization_link conn={@conn} provider="github">Remove Github authentication
+ """
+ attr :conn, :any, required: true, doc: "the conn"
+ attr :provider, :any, required: true, doc: "the provider"
+
+ attr :rest,
+ :global,
+ include: ~w(csrf_token download hreflang referrerpolicy rel target type),
+ doc: "Additional attributes added to the `.link` tag."
+
+ slot :inner_block
+
+ def deauthorization_link(assigns) do
+ path = AuthorizationController.routes(assigns.conn).path_for(assigns.conn, AuthorizationController, :delete, [assigns.provider])
+ assigns = assign(assigns, navigate: path)
+
+ ~H"""
+ <.link navigate={@navigate} method="delete" {@rest}><%= render_slot(@inner_block) || remove_provider_authentication_label(@conn, @provider) %>
+ """
+ end
+end
+end
diff --git a/lib/pow_assent/phoenix/messages.ex b/lib/pow_assent/phoenix/messages.ex
index 821b667..08cdc09 100644
--- a/lib/pow_assent/phoenix/messages.ex
+++ b/lib/pow_assent/phoenix/messages.ex
@@ -75,6 +75,7 @@ defmodule PowAssent.Phoenix.Messages do
@doc """
Message for provider login button.
"""
+ # TODO: Change function name to `log_in_with_provider` or `sign_in_with_provider`.
def login_with_provider(conn),
do: interpolate("Sign in with %{provider}", provider: Naming.humanize(conn.params["provider"]))
diff --git a/mix.exs b/mix.exs
index c58aeaf..3090b9b 100644
--- a/mix.exs
+++ b/mix.exs
@@ -32,11 +32,11 @@ defmodule PowAssent.MixProject do
defp deps do
[
{:pow, "~> 1.0.29"},
- {:assent, "~> 0.1.2 or ~> 0.2.0"},
+ {:assent, "~> 0.2.8"},
{:ecto, "~> 2.2 or ~> 3.0"},
{:phoenix, ">= 1.3.0 and < 1.8.0"},
- {:phoenix_html, ">= 2.0.0 and <= 4.0.0"},
+ {:phoenix_html, ">= 2.0.0 and <= 5.0.0", optional: true},
{:plug, ">= 1.5.0 and < 2.0.0", optional: true},
{:phoenix_live_view, ">= 0.18.0", optional: true},
diff --git a/mix.lock b/mix.lock
index c9d177c..c6fa374 100644
--- a/mix.lock
+++ b/mix.lock
@@ -1,43 +1,37 @@
%{
- "assent": {:hex, :assent, "0.2.2", "d1b2f93486e952c6a919d8f843f4cc63d0bb709018a0764962b97ae760e72485", [:mix], [{:castore, "~> 0.1.0", [hex: :castore, repo: "hexpm", optional: true]}, {:certifi, ">= 0.0.0", [hex: :certifi, repo: "hexpm", optional: true]}, {:jose, "~> 1.8", [hex: :jose, repo: "hexpm", optional: true]}, {:mint, "~> 1.0", [hex: :mint, repo: "hexpm", optional: true]}, {:ssl_verify_fun, ">= 0.0.0", [hex: :ssl_verify_fun, repo: "hexpm", optional: true]}], "hexpm", "08945f6cc08dfb26880af61f3a861367954b43a50911c330a50efd08ec92aab7"},
- "bunt": {:hex, :bunt, "0.2.1", "e2d4792f7bc0ced7583ab54922808919518d0e57ee162901a16a1b6664ef3b14", [:mix], [], "hexpm", "a330bfb4245239787b15005e66ae6845c9cd524a288f0d141c148b02603777a5"},
- "castore": {:hex, :castore, "0.1.22", "4127549e411bedd012ca3a308dede574f43819fe9394254ca55ab4895abfa1a2", [:mix], [], "hexpm", "c17576df47eb5aa1ee40cc4134316a99f5cad3e215d5c77b8dd3cfef12a22cac"},
+ "assent": {:hex, :assent, "0.2.9", "e3cdbc8f2e4f8d02c4c490ef8c2148bb1bc0d81aa0648f09addc5918d9a1cd5a", [:mix], [{:certifi, ">= 0.0.0", [hex: :certifi, repo: "hexpm", optional: true]}, {:finch, "~> 0.15", [hex: :finch, repo: "hexpm", optional: true]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:jose, "~> 1.8", [hex: :jose, repo: "hexpm", optional: true]}, {:mint, "~> 1.0", [hex: :mint, repo: "hexpm", optional: true]}, {:req, "~> 0.4", [hex: :req, repo: "hexpm", optional: true]}, {:ssl_verify_fun, ">= 0.0.0", [hex: :ssl_verify_fun, repo: "hexpm", optional: true]}], "hexpm", "5f9562bda90bef7bd3f1b9a348520a5631b86c85145346bb7edb8a7ebbad8e86"},
+ "bunt": {:hex, :bunt, "1.0.0", "081c2c665f086849e6d57900292b3a161727ab40431219529f13c4ddcf3e7a44", [:mix], [], "hexpm", "dc5f86aa08a5f6fa6b8096f0735c4e76d54ae5c9fa2c143e5a1fc7c1cd9bb6b5"},
+ "castore": {:hex, :castore, "1.0.5", "9eeebb394cc9a0f3ae56b813459f990abb0a3dedee1be6b27fdb50301930502f", [:mix], [], "hexpm", "8d7c597c3e4a64c395980882d4bca3cebb8d74197c590dc272cfd3b6a6310578"},
"connection": {:hex, :connection, "1.1.0", "ff2a49c4b75b6fb3e674bfc5536451607270aac754ffd1bdfe175abe4a6d7a68", [:mix], [], "hexpm", "722c1eb0a418fbe91ba7bd59a47e28008a189d47e37e0e7bb85585a016b2869c"},
- "cowboy": {:hex, :cowboy, "2.9.0", "865dd8b6607e14cf03282e10e934023a1bd8be6f6bacf921a7e2a96d800cd452", [:make, :rebar3], [{:cowlib, "2.11.0", [hex: :cowlib, repo: "hexpm", optional: false]}, {:ranch, "1.8.0", [hex: :ranch, repo: "hexpm", optional: false]}], "hexpm", "2c729f934b4e1aa149aff882f57c6372c15399a20d54f65c8d67bef583021bde"},
- "cowboy_telemetry": {:hex, :cowboy_telemetry, "0.4.0", "f239f68b588efa7707abce16a84d0d2acf3a0f50571f8bb7f56a15865aae820c", [:rebar3], [{:cowboy, "~> 2.7", [hex: :cowboy, repo: "hexpm", optional: false]}, {:telemetry, "~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "7d98bac1ee4565d31b62d59f8823dfd8356a169e7fcbb83831b8a5397404c9de"},
- "cowlib": {:hex, :cowlib, "2.11.0", "0b9ff9c346629256c42ebe1eeb769a83c6cb771a6ee5960bd110ab0b9b872063", [:make, :rebar3], [], "hexpm", "2b3e9da0b21c4565751a6d4901c20d1b4cc25cbb7fd50d91d2ab6dd287bc86a9"},
- "credo": {:hex, :credo, "1.7.0", "6119bee47272e85995598ee04f2ebbed3e947678dee048d10b5feca139435f75", [:mix], [{:bunt, "~> 0.2.1", [hex: :bunt, repo: "hexpm", optional: false]}, {:file_system, "~> 0.2.8", [hex: :file_system, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "6839fcf63d1f0d1c0f450abc8564a57c43d644077ab96f2934563e68b8a769d7"},
- "db_connection": {:hex, :db_connection, "2.4.3", "3b9aac9f27347ec65b271847e6baeb4443d8474289bd18c1d6f4de655b70c94d", [:mix], [{:connection, "~> 1.0", [hex: :connection, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "c127c15b0fa6cfb32eed07465e05da6c815b032508d4ed7c116122871df73c12"},
- "decimal": {:hex, :decimal, "2.0.0", "a78296e617b0f5dd4c6caf57c714431347912ffb1d0842e998e9792b5642d697", [:mix], [], "hexpm", "34666e9c55dea81013e77d9d87370fe6cb6291d1ef32f46a1600230b1d44f577"},
- "earmark_parser": {:hex, :earmark_parser, "1.4.31", "a93921cdc6b9b869f519213d5bc79d9e218ba768d7270d46fdcf1c01bacff9e2", [:mix], [], "hexpm", "317d367ee0335ef037a87e46c91a2269fef6306413f731e8ec11fc45a7efd059"},
- "ecto": {:hex, :ecto, "3.9.4", "3ee68e25dbe0c36f980f1ba5dd41ee0d3eb0873bccae8aeaf1a2647242bffa35", [:mix], [{:decimal, "~> 1.6 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "de5f988c142a3aa4ec18b85a4ec34a2390b65b24f02385c1144252ff6ff8ee75"},
- "ecto_sql": {:hex, :ecto_sql, "3.9.2", "34227501abe92dba10d9c3495ab6770e75e79b836d114c41108a4bf2ce200ad5", [:mix], [{:db_connection, "~> 2.4.1 or ~> 2.5", [hex: :db_connection, repo: "hexpm", optional: false]}, {:ecto, "~> 3.9.2", [hex: :ecto, repo: "hexpm", optional: false]}, {:myxql, "~> 0.6.0", [hex: :myxql, repo: "hexpm", optional: true]}, {:postgrex, "~> 0.16.0 or ~> 1.0", [hex: :postgrex, repo: "hexpm", optional: true]}, {:tds, "~> 2.1.1 or ~> 2.2", [hex: :tds, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4.0 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "1eb5eeb4358fdbcd42eac11c1fbd87e3affd7904e639d77903c1358b2abd3f70"},
- "ex_doc": {:hex, :ex_doc, "0.29.3", "f07444bcafb302db86e4f02d8bbcd82f2e881a0dcf4f3e4740e4b8128b9353f7", [:mix], [{:earmark_parser, "~> 1.4.31", [hex: :earmark_parser, repo: "hexpm", optional: false]}, {:makeup_elixir, "~> 0.14", [hex: :makeup_elixir, repo: "hexpm", optional: false]}, {:makeup_erlang, "~> 0.1", [hex: :makeup_erlang, repo: "hexpm", optional: false]}], "hexpm", "3dc6787d7b08801ec3b51e9bd26be5e8826fbf1a17e92d1ebc252e1a1c75bfe1"},
- "file_system": {:hex, :file_system, "0.2.10", "fb082005a9cd1711c05b5248710f8826b02d7d1784e7c3451f9c1231d4fc162d", [:mix], [], "hexpm", "41195edbfb562a593726eda3b3e8b103a309b733ad25f3d642ba49696bf715dc"},
- "floki": {:hex, :floki, "0.34.2", "5fad07ef153b3b8ec110b6b155ec3780c4b2c4906297d0b4be1a7162d04a7e02", [:mix], [], "hexpm", "26b9d50f0f01796bc6be611ca815c5e0de034d2128e39cc9702eee6b66a4d1c8"},
- "jason": {:hex, :jason, "1.4.0", "e855647bc964a44e2f67df589ccf49105ae039d4179db7f6271dfd3843dc27e6", [:mix], [{:decimal, "~> 1.0 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm", "79a3791085b2a0f743ca04cec0f7be26443738779d09302e01318f97bdb82121"},
- "makeup": {:hex, :makeup, "1.1.0", "6b67c8bc2882a6b6a445859952a602afc1a41c2e08379ca057c0f525366fc3ca", [:mix], [{:nimble_parsec, "~> 1.2.2 or ~> 1.3", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "0a45ed501f4a8897f580eabf99a2e5234ea3e75a4373c8a52824f6e873be57a6"},
- "makeup_elixir": {:hex, :makeup_elixir, "0.16.0", "f8c570a0d33f8039513fbccaf7108c5d750f47d8defd44088371191b76492b0b", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}, {:nimble_parsec, "~> 1.2.3", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "28b2cbdc13960a46ae9a8858c4bebdec3c9a6d7b4b9e7f4ed1502f8159f338e7"},
- "makeup_erlang": {:hex, :makeup_erlang, "0.1.1", "3fcb7f09eb9d98dc4d208f49cc955a34218fc41ff6b84df7c75b3e6e533cc65f", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}], "hexpm", "174d0809e98a4ef0b3309256cbf97101c6ec01c4ab0b23e926a9e17df2077cbb"},
- "mime": {:hex, :mime, "2.0.3", "3676436d3d1f7b81b5a2d2bd8405f412c677558c81b1c92be58c00562bb59095", [:mix], [], "hexpm", "27a30bf0db44d25eecba73755acf4068cbfe26a4372f9eb3e4ea3a45956bff6b"},
- "nimble_parsec": {:hex, :nimble_parsec, "1.2.3", "244836e6e3f1200c7f30cb56733fd808744eca61fd182f731eac4af635cc6d0b", [:mix], [], "hexpm", "c8d789e39b9131acf7b99291e93dae60ab48ef14a7ee9d58c6964f59efb570b0"},
- "phoenix": {:hex, :phoenix, "1.7.2", "c375ffb482beb4e3d20894f84dd7920442884f5f5b70b9f4528cbe0cedefec63", [:mix], [{:castore, ">= 0.0.0", [hex: :castore, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:phoenix_pubsub, "~> 2.1", [hex: :phoenix_pubsub, repo: "hexpm", optional: false]}, {:phoenix_template, "~> 1.0", [hex: :phoenix_template, repo: "hexpm", optional: false]}, {:phoenix_view, "~> 2.0", [hex: :phoenix_view, repo: "hexpm", optional: true]}, {:plug, "~> 1.14", [hex: :plug, repo: "hexpm", optional: false]}, {:plug_cowboy, "~> 2.6", [hex: :plug_cowboy, repo: "hexpm", optional: true]}, {:plug_crypto, "~> 1.2", [hex: :plug_crypto, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}, {:websock_adapter, "~> 0.4", [hex: :websock_adapter, repo: "hexpm", optional: false]}], "hexpm", "1ebca94b32b4d0e097ab2444a9742ed8ff3361acad17365e4e6b2e79b4792159"},
- "phoenix_ecto": {:hex, :phoenix_ecto, "4.4.0", "0672ed4e4808b3fbed494dded89958e22fb882de47a97634c0b13e7b0b5f7720", [:mix], [{:ecto, "~> 3.3", [hex: :ecto, repo: "hexpm", optional: false]}, {:phoenix_html, "~> 2.14.2 or ~> 3.0", [hex: :phoenix_html, repo: "hexpm", optional: true]}, {:plug, "~> 1.9", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm", "09864e558ed31ee00bd48fcc1d4fc58ae9678c9e81649075431e69dbabb43cc1"},
- "phoenix_html": {:hex, :phoenix_html, "3.3.1", "4788757e804a30baac6b3fc9695bf5562465dd3f1da8eb8460ad5b404d9a2178", [:mix], [{:plug, "~> 1.5", [hex: :plug, repo: "hexpm", optional: true]}], "hexpm", "bed1906edd4906a15fd7b412b85b05e521e1f67c9a85418c55999277e553d0d3"},
- "phoenix_live_view": {:hex, :phoenix_live_view, "0.18.18", "1f38fbd7c363723f19aad1a04b5490ff3a178e37daaf6999594d5f34796c47fc", [:mix], [{:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:phoenix, "~> 1.6.15 or ~> 1.7.0", [hex: :phoenix, repo: "hexpm", optional: false]}, {:phoenix_html, "~> 3.3", [hex: :phoenix_html, repo: "hexpm", optional: false]}, {:phoenix_template, "~> 1.0", [hex: :phoenix_template, repo: "hexpm", optional: false]}, {:phoenix_view, "~> 2.0", [hex: :phoenix_view, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4.2 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "a5810d0472f3189ede6d2a95bda7f31c6113156b91784a3426cb0ab6a6d85214"},
- "phoenix_pubsub": {:hex, :phoenix_pubsub, "2.1.1", "ba04e489ef03763bf28a17eb2eaddc2c20c6d217e2150a61e3298b0f4c2012b5", [:mix], [], "hexpm", "81367c6d1eea5878ad726be80808eb5a787a23dee699f96e72b1109c57cdd8d9"},
- "phoenix_template": {:hex, :phoenix_template, "1.0.1", "85f79e3ad1b0180abb43f9725973e3b8c2c3354a87245f91431eec60553ed3ef", [:mix], [{:phoenix_html, "~> 2.14.2 or ~> 3.0", [hex: :phoenix_html, repo: "hexpm", optional: true]}], "hexpm", "157dc078f6226334c91cb32c1865bf3911686f8bcd6bcff86736f6253e6993ee"},
- "phoenix_view": {:hex, :phoenix_view, "2.0.2", "6bd4d2fd595ef80d33b439ede6a19326b78f0f1d8d62b9a318e3d9c1af351098", [:mix], [{:phoenix_html, "~> 2.14.2 or ~> 3.0", [hex: :phoenix_html, repo: "hexpm", optional: true]}, {:phoenix_template, "~> 1.0", [hex: :phoenix_template, repo: "hexpm", optional: false]}], "hexpm", "a929e7230ea5c7ee0e149ffcf44ce7cf7f4b6d2bfe1752dd7c084cdff152d36f"},
- "plug": {:hex, :plug, "1.14.1", "3148623796853ae96c628960b833bf6b6a894d6bdc8c199ef7160c41149b71f2", [:mix], [{:mime, "~> 1.0 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:plug_crypto, "~> 1.1.1 or ~> 1.2", [hex: :plug_crypto, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4.3 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "a0e789be21a576b11ec55a0983e4e8f7c7b07d88dfb3b8da9e97767132271d40"},
- "plug_cowboy": {:hex, :plug_cowboy, "2.6.0", "d1cf12ff96a1ca4f52207c5271a6c351a4733f413803488d75b70ccf44aebec2", [:mix], [{:cowboy, "~> 2.7", [hex: :cowboy, repo: "hexpm", optional: false]}, {:cowboy_telemetry, "~> 0.3", [hex: :cowboy_telemetry, repo: "hexpm", optional: false]}, {:plug, "~> 1.14", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm", "073cf20b753ce6682ed72905cd62a2d4bd9bad1bf9f7feb02a1b8e525bd94fa6"},
- "plug_crypto": {:hex, :plug_crypto, "1.2.5", "918772575e48e81e455818229bf719d4ab4181fcbf7f85b68a35620f78d89ced", [:mix], [], "hexpm", "26549a1d6345e2172eb1c233866756ae44a9609bd33ee6f99147ab3fd87fd842"},
- "postgrex": {:hex, :postgrex, "0.16.5", "fcc4035cc90e23933c5d69a9cd686e329469446ef7abba2cf70f08e2c4b69810", [:mix], [{:connection, "~> 1.1", [hex: :connection, repo: "hexpm", optional: false]}, {:db_connection, "~> 2.1", [hex: :db_connection, repo: "hexpm", optional: false]}, {:decimal, "~> 1.5 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:table, "~> 0.1.0", [hex: :table, repo: "hexpm", optional: true]}], "hexpm", "edead639dc6e882618c01d8fc891214c481ab9a3788dfe38dd5e37fd1d5fb2e8"},
- "pow": {:hex, :pow, "1.0.29", "9c387059af028500a339e7a334103739245dd508d2e18c41e0fcb20e4b40f02f", [:mix], [{:ecto, "~> 2.2 or ~> 3.0", [hex: :ecto, repo: "hexpm", optional: false]}, {:phoenix, ">= 1.3.0 and < 1.8.0", [hex: :phoenix, repo: "hexpm", optional: false]}, {:phoenix_html, ">= 2.0.0 and < 4.0.0", [hex: :phoenix_html, repo: "hexpm", optional: false]}, {:phoenix_live_view, ">= 0.18.0", [hex: :phoenix_live_view, repo: "hexpm", optional: true]}, {:plug, ">= 1.5.0 and < 2.0.0", [hex: :plug, repo: "hexpm", optional: true]}], "hexpm", "94097ad2b79e4c44733344e04653ea424b4cbbae700ab2fa7d069d9f00364be7"},
- "ranch": {:hex, :ranch, "1.8.0", "8c7a100a139fd57f17327b6413e4167ac559fbc04ca7448e9be9057311597a1d", [:make, :rebar3], [], "hexpm", "49fbcfd3682fab1f5d109351b61257676da1a2fdbe295904176d5e521a2ddfe5"},
- "ssl_verify_fun": {:hex, :ssl_verify_fun, "1.1.6", "cf344f5692c82d2cd7554f5ec8fd961548d4fd09e7d22f5b62482e5aeaebd4b0", [:make, :mix, :rebar3], [], "hexpm", "bdb0d2471f453c88ff3908e7686f86f9be327d065cc1ec16fa4540197ea04680"},
+ "credo": {:hex, :credo, "1.7.4", "68ca5cf89071511c12fd9919eb84e388d231121988f6932756596195ccf7fd35", [:mix], [{:bunt, "~> 0.2.1 or ~> 1.0", [hex: :bunt, repo: "hexpm", optional: false]}, {:file_system, "~> 0.2 or ~> 1.0", [hex: :file_system, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "9cf776d062c78bbe0f0de1ecaee183f18f2c3ec591326107989b054b7dddefc2"},
+ "db_connection": {:hex, :db_connection, "2.6.0", "77d835c472b5b67fc4f29556dee74bf511bbafecdcaf98c27d27fa5918152086", [:mix], [{:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "c2f992d15725e721ec7fbc1189d4ecdb8afef76648c746a8e1cad35e3b8a35f3"},
+ "decimal": {:hex, :decimal, "2.1.1", "5611dca5d4b2c3dd497dec8f68751f1f1a54755e8ed2a966c2633cf885973ad6", [:mix], [], "hexpm", "53cfe5f497ed0e7771ae1a475575603d77425099ba5faef9394932b35020ffcc"},
+ "earmark_parser": {:hex, :earmark_parser, "1.4.39", "424642f8335b05bb9eb611aa1564c148a8ee35c9c8a8bba6e129d51a3e3c6769", [:mix], [], "hexpm", "06553a88d1f1846da9ef066b87b57c6f605552cfbe40d20bd8d59cc6bde41944"},
+ "ecto": {:hex, :ecto, "3.11.1", "4b4972b717e7ca83d30121b12998f5fcdc62ba0ed4f20fd390f16f3270d85c3e", [:mix], [{:decimal, "~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "ebd3d3772cd0dfcd8d772659e41ed527c28b2a8bde4b00fe03e0463da0f1983b"},
+ "ecto_sql": {:hex, :ecto_sql, "3.11.1", "e9abf28ae27ef3916b43545f9578b4750956ccea444853606472089e7d169470", [:mix], [{:db_connection, "~> 2.4.1 or ~> 2.5", [hex: :db_connection, repo: "hexpm", optional: false]}, {:ecto, "~> 3.11.0", [hex: :ecto, repo: "hexpm", optional: false]}, {:myxql, "~> 0.6.0", [hex: :myxql, repo: "hexpm", optional: true]}, {:postgrex, "~> 0.16.0 or ~> 0.17.0 or ~> 1.0", [hex: :postgrex, repo: "hexpm", optional: true]}, {:tds, "~> 2.1.1 or ~> 2.2", [hex: :tds, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4.0 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "ce14063ab3514424276e7e360108ad6c2308f6d88164a076aac8a387e1fea634"},
+ "ex_doc": {:hex, :ex_doc, "0.31.1", "8a2355ac42b1cc7b2379da9e40243f2670143721dd50748bf6c3b1184dae2089", [:mix], [{:earmark_parser, "~> 1.4.39", [hex: :earmark_parser, repo: "hexpm", optional: false]}, {:makeup_c, ">= 0.1.1", [hex: :makeup_c, repo: "hexpm", optional: true]}, {:makeup_elixir, "~> 0.14", [hex: :makeup_elixir, repo: "hexpm", optional: false]}, {:makeup_erlang, "~> 0.1", [hex: :makeup_erlang, repo: "hexpm", optional: false]}], "hexpm", "3178c3a407c557d8343479e1ff117a96fd31bafe52a039079593fb0524ef61b0"},
+ "file_system": {:hex, :file_system, "1.0.0", "b689cc7dcee665f774de94b5a832e578bd7963c8e637ef940cd44327db7de2cd", [:mix], [], "hexpm", "6752092d66aec5a10e662aefeed8ddb9531d79db0bc145bb8c40325ca1d8536d"},
+ "floki": {:hex, :floki, "0.35.3", "0c8c6234aa71cb2b069cf801e8f8f30f8d096eb452c3dae2ccc409510ec32720", [:mix], [], "hexpm", "6d9f07f3fc76599f3b66c39f4a81ac62c8f4d9631140268db92aacad5d0e56d4"},
+ "jason": {:hex, :jason, "1.4.1", "af1504e35f629ddcdd6addb3513c3853991f694921b1b9368b0bd32beb9f1b63", [:mix], [{:decimal, "~> 1.0 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm", "fbb01ecdfd565b56261302f7e1fcc27c4fb8f32d56eab74db621fc154604a7a1"},
+ "makeup": {:hex, :makeup, "1.1.1", "fa0bc768698053b2b3869fa8a62616501ff9d11a562f3ce39580d60860c3a55e", [:mix], [{:nimble_parsec, "~> 1.2.2 or ~> 1.3", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "5dc62fbdd0de44de194898b6710692490be74baa02d9d108bc29f007783b0b48"},
+ "makeup_elixir": {:hex, :makeup_elixir, "0.16.1", "cc9e3ca312f1cfeccc572b37a09980287e243648108384b97ff2b76e505c3555", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}, {:nimble_parsec, "~> 1.2.3 or ~> 1.3", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "e127a341ad1b209bd80f7bd1620a15693a9908ed780c3b763bccf7d200c767c6"},
+ "makeup_erlang": {:hex, :makeup_erlang, "0.1.4", "29563475afa9b8a2add1b7a9c8fb68d06ca7737648f28398e04461f008b69521", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}], "hexpm", "f4ed47ecda66de70dd817698a703f8816daa91272e7e45812469498614ae8b29"},
+ "mime": {:hex, :mime, "2.0.5", "dc34c8efd439abe6ae0343edbb8556f4d63f178594894720607772a041b04b02", [:mix], [], "hexpm", "da0d64a365c45bc9935cc5c8a7fc5e49a0e0f9932a761c55d6c52b142780a05c"},
+ "nimble_parsec": {:hex, :nimble_parsec, "1.4.0", "51f9b613ea62cfa97b25ccc2c1b4216e81df970acd8e16e8d1bdc58fef21370d", [:mix], [], "hexpm", "9c565862810fb383e9838c1dd2d7d2c437b3d13b267414ba6af33e50d2d1cf28"},
+ "phoenix": {:hex, :phoenix, "1.7.11", "1d88fc6b05ab0c735b250932c4e6e33bfa1c186f76dcf623d8dd52f07d6379c7", [:mix], [{:castore, ">= 0.0.0", [hex: :castore, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:phoenix_pubsub, "~> 2.1", [hex: :phoenix_pubsub, repo: "hexpm", optional: false]}, {:phoenix_template, "~> 1.0", [hex: :phoenix_template, repo: "hexpm", optional: false]}, {:phoenix_view, "~> 2.0", [hex: :phoenix_view, repo: "hexpm", optional: true]}, {:plug, "~> 1.14", [hex: :plug, repo: "hexpm", optional: false]}, {:plug_cowboy, "~> 2.7", [hex: :plug_cowboy, repo: "hexpm", optional: true]}, {:plug_crypto, "~> 1.2 or ~> 2.0", [hex: :plug_crypto, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}, {:websock_adapter, "~> 0.5.3", [hex: :websock_adapter, repo: "hexpm", optional: false]}], "hexpm", "b1ec57f2e40316b306708fe59b92a16b9f6f4bf50ccfa41aa8c7feb79e0ec02a"},
+ "phoenix_ecto": {:hex, :phoenix_ecto, "4.4.3", "86e9878f833829c3f66da03d75254c155d91d72a201eb56ae83482328dc7ca93", [:mix], [{:ecto, "~> 3.5", [hex: :ecto, repo: "hexpm", optional: false]}, {:phoenix_html, "~> 2.14.2 or ~> 3.0 or ~> 4.0", [hex: :phoenix_html, repo: "hexpm", optional: true]}, {:plug, "~> 1.9", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm", "d36c401206f3011fefd63d04e8ef626ec8791975d9d107f9a0817d426f61ac07"},
+ "phoenix_html": {:hex, :phoenix_html, "4.0.0", "4857ec2edaccd0934a923c2b0ba526c44a173c86b847e8db725172e9e51d11d6", [:mix], [], "hexpm", "cee794a052f243291d92fa3ccabcb4c29bb8d236f655fb03bcbdc3a8214b8d13"},
+ "phoenix_live_view": {:hex, :phoenix_live_view, "0.20.7", "278804219cc85e00f59a02a07b8ea591d99b219877a3b984fb77ac3fdebfb696", [:mix], [{:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:phoenix, "~> 1.6.15 or ~> 1.7.0", [hex: :phoenix, repo: "hexpm", optional: false]}, {:phoenix_html, "~> 3.3 or ~> 4.0", [hex: :phoenix_html, repo: "hexpm", optional: false]}, {:phoenix_template, "~> 1.0", [hex: :phoenix_template, repo: "hexpm", optional: false]}, {:phoenix_view, "~> 2.0", [hex: :phoenix_view, repo: "hexpm", optional: true]}, {:plug, "~> 1.15", [hex: :plug, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4.2 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "4d533f5d6b09c6ff4fb1f41d61dcd90c7f076f25909d4a5481d71bd442b83dc9"},
+ "phoenix_pubsub": {:hex, :phoenix_pubsub, "2.1.3", "3168d78ba41835aecad272d5e8cd51aa87a7ac9eb836eabc42f6e57538e3731d", [:mix], [], "hexpm", "bba06bc1dcfd8cb086759f0edc94a8ba2bc8896d5331a1e2c2902bf8e36ee502"},
+ "phoenix_template": {:hex, :phoenix_template, "1.0.4", "e2092c132f3b5e5b2d49c96695342eb36d0ed514c5b252a77048d5969330d639", [:mix], [{:phoenix_html, "~> 2.14.2 or ~> 3.0 or ~> 4.0", [hex: :phoenix_html, repo: "hexpm", optional: true]}], "hexpm", "2c0c81f0e5c6753faf5cca2f229c9709919aba34fab866d3bc05060c9c444206"},
+ "plug": {:hex, :plug, "1.15.3", "712976f504418f6dff0a3e554c40d705a9bcf89a7ccef92fc6a5ef8f16a30a97", [:mix], [{:mime, "~> 1.0 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:plug_crypto, "~> 1.1.1 or ~> 1.2 or ~> 2.0", [hex: :plug_crypto, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4.3 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "cc4365a3c010a56af402e0809208873d113e9c38c401cabd88027ef4f5c01fd2"},
+ "plug_crypto": {:hex, :plug_crypto, "2.0.0", "77515cc10af06645abbfb5e6ad7a3e9714f805ae118fa1a70205f80d2d70fe73", [:mix], [], "hexpm", "53695bae57cc4e54566d993eb01074e4d894b65a3766f1c43e2c61a1b0f45ea9"},
+ "postgrex": {:hex, :postgrex, "0.17.4", "5777781f80f53b7c431a001c8dad83ee167bcebcf3a793e3906efff680ab62b3", [:mix], [{:db_connection, "~> 2.1", [hex: :db_connection, repo: "hexpm", optional: false]}, {:decimal, "~> 1.5 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:table, "~> 0.1.0", [hex: :table, repo: "hexpm", optional: true]}], "hexpm", "6458f7d5b70652bc81c3ea759f91736c16a31be000f306d3c64bcdfe9a18b3cc"},
+ "pow": {:hex, :pow, "1.0.36", "d4bb8d8f58b325cd198a3f4ccfa37a0bfc2b7f1f6c3fa2f2e08a7d96604a660f", [:mix], [{:ecto, "~> 2.2 or ~> 3.0", [hex: :ecto, repo: "hexpm", optional: false]}, {:phoenix, ">= 1.3.0 and < 1.8.0", [hex: :phoenix, repo: "hexpm", optional: false]}, {:phoenix_html, ">= 2.0.0 and < 5.0.0", [hex: :phoenix_html, repo: "hexpm", optional: false]}, {:phoenix_live_view, ">= 0.18.0", [hex: :phoenix_live_view, repo: "hexpm", optional: true]}, {:plug, ">= 1.5.0 and < 2.0.0", [hex: :plug, repo: "hexpm", optional: true]}], "hexpm", "5b9695940b9a5beaf8c017b550e1ed5c9ece7e36fb8df447e8eff9967544cf77"},
+ "ssl_verify_fun": {:hex, :ssl_verify_fun, "1.1.7", "354c321cf377240c7b8716899e182ce4890c5938111a1296add3ec74cf1715df", [:make, :mix, :rebar3], [], "hexpm", "fe4c190e8f37401d30167c8c405eda19469f34577987c76dde613e838bbc67f8"},
"telemetry": {:hex, :telemetry, "1.2.1", "68fdfe8d8f05a8428483a97d7aab2f268aaff24b49e0f599faa091f1d4e7f61c", [:rebar3], [], "hexpm", "dad9ce9d8effc621708f99eac538ef1cbe05d6a874dd741de2e689c47feafed5"},
- "test_server": {:hex, :test_server, "0.1.10", "54e934cb3addf693b4f57ade86127d22a43a79d265c3d0d4a2210b8bc31e43bd", [:mix], [{:bandit, ">= 0.6.6", [hex: :bandit, repo: "hexpm", optional: true]}, {:plug, "~> 1.14", [hex: :plug, repo: "hexpm", optional: false]}, {:plug_cowboy, ">= 2.0.0", [hex: :plug_cowboy, repo: "hexpm", optional: true]}, {:x509, "~> 0.6", [hex: :x509, repo: "hexpm", optional: false]}], "hexpm", "1195cfd3aaef9e71550668eecceae77a57e1db042b67df56350f512988a3a37a"},
- "websock": {:hex, :websock, "0.5.0", "f6bbce90226121d62a0715bca7c986c5e43de0ccc9475d79c55381d1796368cc", [:mix], [], "hexpm", "b51ac706df8a7a48a2c622ee02d09d68be8c40418698ffa909d73ae207eb5fb8"},
- "websock_adapter": {:hex, :websock_adapter, "0.5.0", "cea35d8bbf1a6964e32d4b02ceb561dfb769c04f16d60d743885587e7d2ca55b", [:mix], [{:bandit, "~> 0.6", [hex: :bandit, repo: "hexpm", optional: true]}, {:plug, "~> 1.14", [hex: :plug, repo: "hexpm", optional: false]}, {:plug_cowboy, "~> 2.6", [hex: :plug_cowboy, repo: "hexpm", optional: true]}, {:websock, "~> 0.5", [hex: :websock, repo: "hexpm", optional: false]}], "hexpm", "16318b124effab8209b1eb7906c636374f623dc9511a8278ad09c083cea5bb83"},
- "x509": {:hex, :x509, "0.8.5", "22b2c5dfc87b05d46595d3764f41a23fcb7360f891e0464f1a2ec118177cd4e4", [:mix], [], "hexpm", "c63eb89e8bbe8a5e21b6404ad1082faff670e38b74960297f90d023177949e07"},
+ "test_server": {:hex, :test_server, "0.1.14", "c3cdf0b6c1be691ae50a14ee3ea4bd026250c321c2012f5dfaed336d8702a562", [:mix], [{:bandit, ">= 0.7.6", [hex: :bandit, repo: "hexpm", optional: true]}, {:plug, "~> 1.14", [hex: :plug, repo: "hexpm", optional: false]}, {:plug_cowboy, ">= 2.0.0", [hex: :plug_cowboy, repo: "hexpm", optional: true]}, {:x509, "~> 0.6", [hex: :x509, repo: "hexpm", optional: false]}], "hexpm", "5af2f98a22765ff3cc66f09d20c88b754586cf0c45cf0d2e0068e2a47f5041a7"},
+ "websock": {:hex, :websock, "0.5.3", "2f69a6ebe810328555b6fe5c831a851f485e303a7c8ce6c5f675abeb20ebdadc", [:mix], [], "hexpm", "6105453d7fac22c712ad66fab1d45abdf049868f253cf719b625151460b8b453"},
+ "websock_adapter": {:hex, :websock_adapter, "0.5.5", "9dfeee8269b27e958a65b3e235b7e447769f66b5b5925385f5a569269164a210", [:mix], [{:bandit, ">= 0.6.0", [hex: :bandit, repo: "hexpm", optional: true]}, {:plug, "~> 1.14", [hex: :plug, repo: "hexpm", optional: false]}, {:plug_cowboy, "~> 2.6", [hex: :plug_cowboy, repo: "hexpm", optional: true]}, {:websock, "~> 0.5", [hex: :websock, repo: "hexpm", optional: false]}], "hexpm", "4b977ba4a01918acbf77045ff88de7f6972c2a009213c515a445c48f224ffce9"},
+ "x509": {:hex, :x509, "0.8.8", "aaf5e58b19a36a8e2c5c5cff0ad30f64eef5d9225f0fd98fb07912ee23f7aba3", [:mix], [], "hexpm", "ccc3bff61406e5bb6a63f06d549f3dba3a1bbb456d84517efaaa210d8a33750f"},
}
diff --git a/test/mix/tasks/ecto/pow_assent.ecto.gen.migration_test.exs b/test/mix/tasks/ecto/pow_assent.ecto.gen.migration_test.exs
index a431ead..b3b6439 100644
--- a/test/mix/tasks/ecto/pow_assent.ecto.gen.migration_test.exs
+++ b/test/mix/tasks/ecto/pow_assent.ecto.gen.migration_test.exs
@@ -13,8 +13,8 @@ defmodule Mix.Tasks.PowAssent.Ecto.Gen.MigrationTest do
File.cd!(context.tmp_path, fn ->
Migration.run(context.options)
- assert_received {:mix_shell, :info, ["* creating ./migrations"]}
- assert_received {:mix_shell, :info, ["* creating ./migrations/" <> _]}
+ assert_received {:mix_shell, :info, ["* creating" <> _]}
+ assert_received {:mix_shell, :info, ["* creating" <> _]}
assert [_, migration_file] = @migrations_path |> File.ls!() |> Enum.sort()
assert String.match?(migration_file, ~r/^\d{14}_create_user_identities\.exs$/)
diff --git a/test/mix/tasks/ecto/pow_assent.ecto.install_test.exs b/test/mix/tasks/ecto/pow_assent.ecto.install_test.exs
index 01a29d2..6a13a99 100644
--- a/test/mix/tasks/ecto/pow_assent.ecto.install_test.exs
+++ b/test/mix/tasks/ecto/pow_assent.ecto.install_test.exs
@@ -107,7 +107,7 @@ defmodule Mix.Tasks.PowAssent.Ecto.InstallTest do
Mix.Project.in_project(:missing_top_level_ecto_dep, ".", fn _ ->
# Insurance that we do test for top level ecto inclusion
- assert Enum.any?(Mix.Dep.load_on_environment([]), fn
+ assert Enum.any?(Mix.Pow.__dependencies__([]), fn
%{app: :ecto_sql} -> true
_ -> false
end), "Ecto not loaded by dependency"
diff --git a/test/mix/tasks/phoenix/pow_assent.phoenix.install_test.exs b/test/mix/tasks/phoenix/pow_assent.phoenix.install_test.exs
index 2b786c8..17404f8 100644
--- a/test/mix/tasks/phoenix/pow_assent.phoenix.install_test.exs
+++ b/test/mix/tasks/phoenix/pow_assent.phoenix.install_test.exs
@@ -152,7 +152,7 @@ defmodule Mix.Tasks.PowAssent.Phoenix.InstallTest do
Mix.Project.in_project(:missing_top_level_phoenix_dep, ".", fn _ ->
# Insurance that we do test for top level phoenix inclusion
- assert Enum.any?(Mix.Dep.load_on_environment([]), fn
+ assert Enum.any?(Mix.Pow.__dependencies__([]), fn
%{app: :phoenix} -> true
_ -> false
end), "Phoenix not loaded by dependency"
diff --git a/test/pow_assent/phoenix/controllers/authorization_controller_test.exs b/test/pow_assent/phoenix/controllers/authorization_controller_test.exs
index 7b28b1c..79a171c 100644
--- a/test/pow_assent/phoenix/controllers/authorization_controller_test.exs
+++ b/test/pow_assent/phoenix/controllers/authorization_controller_test.exs
@@ -61,7 +61,7 @@ defmodule PowAssent.Phoenix.AuthorizationControllerTest do
assert get_flash(conn, :error) == "Something went wrong, and you couldn't be signed in. Please try again."
refute conn.resp_cookies["pow_assent_auth_session"]
refute get_pow_assent_session(conn, :session_params)
- end) =~ "Strategy failed with error: \"fail\""
+ end) =~ "Strategy failed with error: fail"
end
end
@@ -90,9 +90,9 @@ defmodule PowAssent.Phoenix.AuthorizationControllerTest do
refute get_pow_assent_session(conn, :session_params)
end)
- assert log =~ "Strategy failed with error: %Assent.RequestError{"
- assert log =~ "error: :invalid_server_response"
- assert log =~ "message: \"Server responded with status: 401"
+ assert log =~ "Strategy failed with error: An invalid response was received."
+ assert log =~ "HTTP Adapter: Assent.HTTPAdapter.Httpc"
+ assert log =~ "Response status: 401"
end
test "with timeout", %{conn: conn} do
@@ -107,9 +107,9 @@ defmodule PowAssent.Phoenix.AuthorizationControllerTest do
refute get_pow_assent_session(conn, :session_params)
end)
- assert log =~ "Strategy failed with error: %Assent.RequestError{"
- assert log =~ "error: :unreachable"
- assert log =~ "message: \"Server was unreachable with Assent.HTTPAdapter.Httpc."
+ assert log =~ "Strategy failed with error: The server was unreachable."
+ assert log =~ "HTTP Adapter: Assent.HTTPAdapter.Httpc"
+ assert log =~ ":econnrefused"
end
test "with invalid state", %{conn: conn} do
@@ -120,7 +120,7 @@ defmodule PowAssent.Phoenix.AuthorizationControllerTest do
assert get_flash(conn, :error) == "Something went wrong, and you couldn't be signed in. Please try again."
refute conn.resp_cookies["pow_assent_auth_session"]
refute get_pow_assent_session(conn, :session_params)
- end) =~ "Strategy failed with error: %Assent.CallbackCSRFError{message: \"CSRF detected with param key \\\"state\\\"\"}"
+ end) =~ "Strategy failed with error: CSRF detected with param key \"state\""
end
test "when identity exists authenticates", %{conn: conn} do
diff --git a/test/pow_assent/phoenix/html/core_components_test.exs b/test/pow_assent/phoenix/html/core_components_test.exs
new file mode 100644
index 0000000..dcf3556
--- /dev/null
+++ b/test/pow_assent/phoenix/html/core_components_test.exs
@@ -0,0 +1,227 @@
+defmodule PowAssent.Phoenix.HTML.CoreComponentsTest do
+ use PowAssent.Test.Phoenix.ConnCase
+ use Phoenix.Component
+
+ import Phoenix.LiveViewTest
+
+ alias Plug.Conn
+ alias PowAssent.Phoenix.HTML.CoreComponents
+ alias PowAssent.Test.{Ecto.Users.User, Phoenix.Router, RepoMock}
+
+ setup %{conn: conn} do
+ config = [
+ repo: RepoMock,
+ pow_assent: [
+ providers: [
+ test_provider: [
+ strategy: TestProvider
+ ],
+ other_provider: [
+ strategy: OtherProvider
+ ]
+ ]
+ ]
+ ]
+
+ conn =
+ conn
+ |> Conn.put_private(:pow_config, config)
+ |> Conn.put_private(:phoenix_router, Router)
+ |> Pow.Plug.assign_current_user(%User{id: 1}, [])
+
+ {:ok, conn: conn}
+ end
+
+ test "provider_links/1", %{conn: conn} do
+ template = fn assigns ->
+ ~H"""
+
+ """
+ end
+
+ expected = fn assigns ->
+ ~H"""
+ <.link navigate={"/auth/test_provider"} method="delete">
+ Remove Test provider authentication
+ <.link navigate={"/auth/other_provider/new"}>
+ Sign in with Other provider
+
+ """
+ end
+
+ assert render_component(&template.(&1), %{conn: conn}) ==
+ render_component(&expected.(&1))
+ end
+
+ test "provider_links/1 with slot assigns", %{conn: conn} do
+ template =
+ fn assigns ->
+ ~H"""
+
+ <:authorization_link class="auth" />
+ <:deauthorization_link class="deauth" />
+
+ """
+ end
+
+ expected = fn assigns ->
+ ~H"""
+ <.link navigate={"/auth/test_provider"} method="delete" class="deauth">
+ Remove Test provider authentication
+ <.link navigate={"/auth/other_provider/new"} class="auth">
+ Sign in with Other provider
+
+ """
+ end
+
+ assert render_component(&template.(&1), %{conn: conn}) ==
+ render_component(&expected.(&1))
+ end
+
+ test "provider_links/1 with slot inner block", %{conn: conn} do
+ template =
+ fn assigns ->
+ ~H"""
+
+ <:authorization_link>Authorization
+ <:deauthorization_link>Deauthorization
+
+ """
+ end
+
+ expected = fn assigns ->
+ ~H"""
+ <.link navigate={"/auth/test_provider"} method="delete">
+ Deauthorization
+ <.link navigate={"/auth/other_provider/new"}>
+ Authorization
+
+ """
+ end
+
+ assert render_component(&template.(&1), %{conn: conn}) ==
+ render_component(&expected.(&1))
+ end
+
+ test "provider_links/1 with request_path", %{conn: conn} do
+ conn = Conn.assign(conn, :request_path, "/custom-url")
+
+ template = fn assigns ->
+ ~H"""
+
+ """
+ end
+
+ expected = fn assigns ->
+ ~H"""
+ <.link navigate={"/auth/test_provider"} method="delete">
+ Remove Test provider authentication
+ <.link navigate={"/auth/other_provider/new?request_path=%2Fcustom-url"}>
+ Sign in with Other provider
+
+ """
+ end
+
+ assert render_component(&template.(&1), %{conn: conn}) ==
+ render_component(&expected.(&1))
+ end
+
+ test "provider_links/1 with invited_user", %{conn: conn} do
+ conn = Conn.assign(conn, :invited_user, %PowAssent.Test.Invitation.Users.User{invitation_token: "token"})
+
+ template = fn assigns ->
+ ~H"""
+
+ """
+ end
+
+ expected = fn assigns ->
+ ~H"""
+ <.link navigate={"/auth/test_provider"} method="delete">
+ Remove Test provider authentication
+ <.link navigate={"/auth/other_provider/new?invitation_token=token"}>
+ Sign in with Other provider
+
+ """
+ end
+
+ assert render_component(&template.(&1), %{conn: conn}) ==
+ render_component(&expected.(&1))
+ end
+
+ test "authorization_link/1 with assigns", %{conn: conn} do
+ template = fn assigns ->
+ ~H"""
+
+ """
+ end
+
+ expected = fn assigns ->
+ ~H"""
+ <.link navigate={"/auth/my_provider/new"} class="example">Sign in with My provider
+ """
+ end
+
+ assert render_component(&template.(&1), %{conn: conn}) ==
+ render_component(&expected.(&1))
+ end
+
+ test "authorization_link/1 with inner block", %{conn: conn} do
+ template = fn assigns ->
+ ~H"""
+
+ Authorize
+
+ """
+ end
+
+ expected = fn assigns ->
+ ~H"""
+ <.link navigate={"/auth/my_provider/new"}>
+ Authorize
+
+ """
+ end
+
+ assert render_component(&template.(&1), %{conn: conn}) ==
+ render_component(&expected.(&1))
+ end
+
+ test "deauthorization_link/1 with assigns", %{conn: conn} do
+ template = fn assigns ->
+ ~H"""
+
+ """
+ end
+
+ expected = fn assigns ->
+ ~H"""
+ <.link navigate={"/auth/my_provider"} class="example">Remove My provider authentication
+ """
+ end
+
+ assert render_component(&template.(&1), %{conn: conn}) ==
+ render_component(&expected.(&1))
+ end
+
+ test "deauthorization_link/1 with inner block", %{conn: conn} do
+ template = fn assigns ->
+ ~H"""
+
+ Deauthorize
+
+ """
+ end
+
+ expected = fn assigns ->
+ ~H"""
+ <.link navigate={"/auth/my_provider"}>
+ Deauthorize
+
+ """
+ end
+
+ assert render_component(&template.(&1), %{conn: conn}) ==
+ render_component(&expected.(&1))
+ end
+end
diff --git a/test/pow_assent/phoenix/views/view_helpers_test.exs b/test/pow_assent/phoenix/views/view_helpers_test.exs
deleted file mode 100644
index d2e1dff..0000000
--- a/test/pow_assent/phoenix/views/view_helpers_test.exs
+++ /dev/null
@@ -1,60 +0,0 @@
-defmodule PowAssent.ViewHelpersTest do
- use PowAssent.Test.Phoenix.ConnCase
-
- alias Phoenix.HTML.Link
- alias Plug.Conn
- alias PowAssent.Phoenix.ViewHelpers
- alias PowAssent.Test.{Ecto.Users.User, Phoenix.Router, RepoMock}
-
- setup %{conn: conn} do
- config = [
- repo: RepoMock,
- pow_assent: [
- providers: [
- test_provider: [
- strategy: TestProvider
- ]
- ]
- ]
- ]
-
- conn =
- conn
- |> Conn.put_private(:pow_config, config)
- |> Conn.put_private(:phoenix_router, Router)
-
- {:ok, conn: conn}
- end
-
- test "provider_links/1", %{conn: conn} do
- [safe: iodata] = ViewHelpers.provider_links(conn)
- assert {:safe, iodata} == Link.link("Sign in with Test provider", to: "/auth/test_provider/new")
-
- conn = Pow.Plug.assign_current_user(conn, %User{id: 1}, [])
-
- [safe: iodata] = ViewHelpers.provider_links(conn)
- assert {:safe, iodata} == Link.link("Remove Test provider authentication", to: "/auth/test_provider", method: "delete")
- end
-
- test "provider_links/1 with link opts", %{conn: conn} do
- [safe: iodata] = ViewHelpers.provider_links(conn, class: "example")
-
- assert {:safe, iodata} == Link.link("Sign in with Test provider", to: "/auth/test_provider/new", class: "example")
- end
-
- test "provider_links/1 with request_path", %{conn: conn} do
- [safe: iodata] =
- conn
- |> Conn.assign(:request_path, "/custom-url")
- |> ViewHelpers.provider_links()
-
- assert {:safe, iodata} == Link.link("Sign in with Test provider", to: "/auth/test_provider/new?request_path=%2Fcustom-url")
- end
-
- test "provider_links/1 with invited_user", %{conn: conn} do
- conn = Conn.assign(conn, :invited_user, %PowAssent.Test.Invitation.Users.User{invitation_token: "token"})
-
- [safe: iodata] = ViewHelpers.provider_links(conn)
- assert {:safe, iodata} == Link.link("Sign in with Test provider", to: "/auth/test_provider/new?invitation_token=token")
- end
-end
diff --git a/test/pow_assent/plug_test.exs b/test/pow_assent/plug_test.exs
index 4554fc2..64f3a78 100644
--- a/test/pow_assent/plug_test.exs
+++ b/test/pow_assent/plug_test.exs
@@ -25,7 +25,7 @@ defmodule PowAssent.PlugTest do
describe "authorize_url/3" do
test "generates state", %{conn: conn} do
- put_oauth2_env(site: "http://localhost:8888")
+ put_oauth2_env(base_url: "http://localhost:8888")
assert {:ok, url, conn} = Plug.authorize_url(conn, "test_provider", "https://example.com/")
@@ -34,7 +34,7 @@ defmodule PowAssent.PlugTest do
end
test "uses nonce from config", %{conn: conn} do
- put_oauth2_env(site: "http://localhost:8888", nonce: "nonce", strategy: Assent.Strategy.OIDC, openid_configuration: %{"authorization_endpoint" => "http://localhost:8888/oauth/authorize"})
+ put_oauth2_env(base_url: "http://localhost:8888", nonce: "nonce", strategy: Assent.Strategy.OIDC, openid_configuration: %{"authorization_endpoint" => "http://localhost:8888/oauth/authorize"})
assert {:ok, url, conn} = Plug.authorize_url(conn, "test_provider", "https://example.com/")
@@ -44,7 +44,7 @@ defmodule PowAssent.PlugTest do
end
test "uses generated nonce when nonce in config set to true", %{conn: conn} do
- put_oauth2_env(site: "http://localhost:8888", nonce: true, strategy: Assent.Strategy.OIDC, openid_configuration: %{"authorization_endpoint" => "http://localhost:8888/oauth/authorize"})
+ put_oauth2_env(base_url: "http://localhost:8888", nonce: true, strategy: Assent.Strategy.OIDC, openid_configuration: %{"authorization_endpoint" => "http://localhost:8888/oauth/authorize"})
assert {:ok, url, conn} = Plug.authorize_url(conn, "test_provider", "https://example.com/")
@@ -228,7 +228,7 @@ defmodule PowAssent.PlugTest do
describe "available_providers/1" do
test "lists providers", %{conn: conn} do
- put_oauth2_env(site: "http://localhost:8888")
+ put_oauth2_env(base_url: "http://localhost:8888")
assert Plug.available_providers(conn) == [:test_provider]
end
@@ -392,7 +392,7 @@ defmodule PowAssent.PlugTest do
end
test "merge_provider_config/3", %{conn: conn} do
- put_oauth2_env(site: "http://localhost:8888", authorization_params: [a: 1, b: 2])
+ put_oauth2_env(base_url: "http://localhost:8888", authorization_params: [a: 1, b: 2])
conn =
conn
diff --git a/test/support/strategies/oauth2_test_case.ex b/test/support/strategies/oauth2_test_case.ex
index a30d3de..b4395b2 100644
--- a/test/support/strategies/oauth2_test_case.ex
+++ b/test/support/strategies/oauth2_test_case.ex
@@ -6,7 +6,7 @@ defmodule PowAssent.Test.OAuth2TestCase do
TestServer.start(scheme: :https)
params = %{"code" => "test", "state" => "test"}
- config = [client_secret: "secret", site: TestServer.url(), session_params: %{state: "test"}]
+ config = [client_secret: "secret", base_url: TestServer.url(), session_params: %{state: "test"}]
{:ok, callback_params: params, config: config}
end
diff --git a/test/support/test_provider.ex b/test/support/test_provider.ex
index 2c56e48..80a94c2 100644
--- a/test/support/test_provider.ex
+++ b/test/support/test_provider.ex
@@ -7,7 +7,7 @@ defmodule PowAssent.Test.TestProvider do
@impl true
def default_config(_config) do
[
- site: "http://localhost:4000/",
+ base_url: "http://localhost:4000/",
authorize_url: "/oauth/authorize",
token_url: "/oauth/token",
user_url: "/api/user",
@@ -33,10 +33,10 @@ defmodule PowAssent.Test.TestProvider do
@spec put_oauth2_env(keyword()) :: :ok
def put_oauth2_env(config \\ []) do
- url = Keyword.get(config, :site) || TestServer.url()
+ url = Keyword.get(config, :base_url) || TestServer.url()
%{host: host} = URI.parse(url)
- httpc_opts = Keyword.get(config, :site) || [
+ httpc_opts = Keyword.get(config, :base_url) || [
ssl: [
verify: :verify_peer,
depth: 99,
@@ -51,7 +51,7 @@ defmodule PowAssent.Test.TestProvider do
test_provider: Keyword.merge([
client_id: "client_id",
client_secret: "abc123",
- site: url,
+ base_url: url,
strategy: __MODULE__
], config)
],
diff --git a/test/test_helper.exs b/test/test_helper.exs
index bfad23f..d255aef 100644
--- a/test/test_helper.exs
+++ b/test/test_helper.exs
@@ -1,4 +1,4 @@
-Logger.configure(level: :warn)
+Logger.configure(level: :warning)
ExUnit.start()