From c01d0f5ee1f60097460553ce7c206e1f70782523 Mon Sep 17 00:00:00 2001 From: Paul Swartz Date: Tue, 3 Oct 2023 19:16:13 -0400 Subject: [PATCH] chore: upgrade to Phoenix 1.7 --- apps/api_web/lib/api_web/router.ex | 12 ++++-------- apps/api_web/lib/api_web/swagger_helpers.ex | 2 ++ .../api_web/templates/admin/layout/app.html.heex | 4 ++-- .../templates/client_portal/layout/app.html.heex | 6 +++--- apps/api_web/lib/api_web/views/error_helpers.ex | 8 -------- apps/api_web/lib/api_web/views/route_view.ex | 16 ++++++++++------ apps/api_web/lib/api_web/views/stop_view.ex | 13 +++++-------- apps/api_web/lib/api_web/web.ex | 12 +++++++++--- apps/api_web/mix.exs | 4 ++-- .../admin/accounts/key_controller_test.exs | 8 ++++---- .../admin/accounts/user_controller_test.exs | 2 +- .../admin/session_controller_test.exs | 4 ++-- .../api_web/controllers/mfa_controller_test.exs | 2 +- .../controllers/portal/key_controller_test.exs | 6 +++--- .../portal/session_controller_test.exs | 4 ++-- .../controllers/portal/user_controller_test.exs | 14 +++++++------- apps/api_web/test/api_web/event_stream_test.exs | 2 +- .../test/api_web/views/stop_view_test.exs | 5 +++++ .../test/api_web/views/trip_view_test.exs | 5 +++-- mix.lock | 15 ++++++++------- 20 files changed, 74 insertions(+), 70 deletions(-) diff --git a/apps/api_web/lib/api_web/router.ex b/apps/api_web/lib/api_web/router.ex index 4a0bd3a1..8963943c 100644 --- a/apps/api_web/lib/api_web/router.ex +++ b/apps/api_web/lib/api_web/router.ex @@ -55,7 +55,7 @@ defmodule ApiWeb.Router do end pipeline :admin_view do - plug(:put_layout, {ApiWeb.Admin.LayoutView, :app}) + plug(:put_layout, html: {ApiWeb.Admin.LayoutView, :app}) end pipeline :admin do @@ -63,10 +63,6 @@ defmodule ApiWeb.Router do plug(ApiWeb.Plugs.Require2Factor) end - pipeline :portal_view do - plug(:put_layout, {ApiWeb.ClientPortal.LayoutView, :app}) - end - pipeline :portal do plug(ApiWeb.Plugs.RequireUser) end @@ -145,7 +141,7 @@ defmodule ApiWeb.Router do # Client Portal routes scope "/", ApiWeb.ClientPortal do - pipe_through([:secure, :secure_csp, :browser, :portal_view]) + pipe_through([:secure, :secure_csp, :browser]) get("/", PortalController, :landing) @@ -163,14 +159,14 @@ defmodule ApiWeb.Router do end scope "/", ApiWeb do - pipe_through([:secure, :browser, :portal_view]) + pipe_through([:secure, :browser]) get("/2fa", ApiWeb.MFAController, :new, alias: false) post("/2fa", ApiWeb.MFAController, :create, alias: false) end scope "/portal", ApiWeb.ClientPortal do - pipe_through([:secure, :secure_csp, :browser, :portal_view, :portal]) + pipe_through([:secure, :secure_csp, :browser, :portal]) get("/", PortalController, :index) resources("/keys", KeyController, only: [:create, :edit, :update]) diff --git a/apps/api_web/lib/api_web/swagger_helpers.ex b/apps/api_web/lib/api_web/swagger_helpers.ex index 636a140d..951fee78 100644 --- a/apps/api_web/lib/api_web/swagger_helpers.ex +++ b/apps/api_web/lib/api_web/swagger_helpers.ex @@ -295,6 +295,8 @@ defmodule ApiWeb.SwaggerHelpers do end defp path_fn(module) do + Code.ensure_loaded!(ApiWeb.Router.Helpers) + short_name = module |> to_string diff --git a/apps/api_web/lib/api_web/templates/admin/layout/app.html.heex b/apps/api_web/lib/api_web/templates/admin/layout/app.html.heex index ebeb69ec..413a4ecf 100644 --- a/apps/api_web/lib/api_web/templates/admin/layout/app.html.heex +++ b/apps/api_web/lib/api_web/templates/admin/layout/app.html.heex @@ -19,12 +19,12 @@ <%= render("navigation.html", assigns) %> - <%= if info = get_flash(@conn, :info) do %> + <%= if info = Phoenix.Flash.get(@flash, :info) do %> <% end %> - <%= if error = get_flash(@conn, :error) do %> + <%= if error = Phoenix.Flash.get(@flash, :error) do %> diff --git a/apps/api_web/lib/api_web/templates/client_portal/layout/app.html.heex b/apps/api_web/lib/api_web/templates/client_portal/layout/app.html.heex index 42e79cf2..dd227c7a 100644 --- a/apps/api_web/lib/api_web/templates/client_portal/layout/app.html.heex +++ b/apps/api_web/lib/api_web/templates/client_portal/layout/app.html.heex @@ -21,17 +21,17 @@ <%= render("navigation.html", assigns) %> - <%= if info = get_flash(@conn, :success) do %> + <%= if info = Phoenix.Flash.get(@flash, :success) do %> <% end %> - <%= if info = get_flash(@conn, :info) do %> + <%= if info = Phoenix.Flash.get(@flash, :info) do %> <% end %> - <%= if error = get_flash(@conn, :error) do %> + <%= if error = Phoenix.Flash.get(@flash, :error) do %> diff --git a/apps/api_web/lib/api_web/views/error_helpers.ex b/apps/api_web/lib/api_web/views/error_helpers.ex index deb09f21..3f4702c2 100644 --- a/apps/api_web/lib/api_web/views/error_helpers.ex +++ b/apps/api_web/lib/api_web/views/error_helpers.ex @@ -8,14 +8,6 @@ defmodule ApiWeb.ErrorHelpers do Translates an error message using gettext. """ def translate_error({msg, _opts}) do - # Because error messages were defined within Ecto, we must - # call the Gettext module passing our Gettext backend. We - # also use the "errors" domain as translations are placed - # in the errors.po file. On your own code and templates, - # this could be written simply as: - # - # dngettext "errors", "1 file", "%{count} files", count - # msg end diff --git a/apps/api_web/lib/api_web/views/route_view.ex b/apps/api_web/lib/api_web/views/route_view.ex index 07d55f7b..9d18d03e 100644 --- a/apps/api_web/lib/api_web/views/route_view.ex +++ b/apps/api_web/lib/api_web/views/route_view.ex @@ -59,11 +59,19 @@ defmodule ApiWeb.RouteView do # Override attribute version of type to give the resource type def type(_, _), do: "route" - def relationships(route, %Plug.Conn{private: %{phoenix_view: __MODULE__}} = conn) do + def relationships(route, conn) do + relationships = super(route, conn) + # only do this include if we're the top-level view, not if we're included # elsewhere - relationships = super(route, conn) + if Phoenix.Controller.view_module(conn) == __MODULE__ do + include_top_level_relationships(relationships, conn) + else + relationships + end + end + defp include_top_level_relationships(relationships, conn) do if split_included?("stop", conn) do stop_id = case conn.params do @@ -91,8 +99,4 @@ defmodule ApiWeb.RouteView do relationships end end - - def relationships(route, conn) do - super(route, conn) - end end diff --git a/apps/api_web/lib/api_web/views/stop_view.ex b/apps/api_web/lib/api_web/views/stop_view.ex index e11aadcc..419c4d7f 100644 --- a/apps/api_web/lib/api_web/views/stop_view.ex +++ b/apps/api_web/lib/api_web/views/stop_view.ex @@ -105,12 +105,13 @@ defmodule ApiWeb.StopView do defdelegate recommended_transfers(stop, conn), to: __MODULE__, as: :connecting_stops - def relationships(stop, %Plug.Conn{private: %{phoenix_view: __MODULE__}} = conn) do - # only do this include if we're the top-level view, not if we're included - # somewhere else + def relationships(stop, conn) do relationships = super(stop, conn) - with true <- split_included?("route", conn), + # only do this include if we're the top-level view, not if we're included + # somewhere else + with __MODULE__ <- Phoenix.Controller.view_module(conn), + true <- split_included?("route", conn), {:ok, filtered} <- Params.filter_params(conn.params, filters(), conn), {:ok, route_id} <- Map.fetch(filtered, "route") do route = State.Route.by_id(route_id) @@ -128,10 +129,6 @@ defmodule ApiWeb.StopView do end end - def relationships(stop, conn) do - super(stop, conn) - end - def facilities(%{facilities: facilities}, _conn) do # preloaded facilities diff --git a/apps/api_web/lib/api_web/web.ex b/apps/api_web/lib/api_web/web.ex index 70b69f35..28c1e287 100644 --- a/apps/api_web/lib/api_web/web.ex +++ b/apps/api_web/lib/api_web/web.ex @@ -18,7 +18,10 @@ defmodule ApiWeb.Web do def api_controller do quote location: :keep do - use Phoenix.Controller, namespace: ApiWeb + use Phoenix.Controller, + formats: [{:json, "View"}, {:"json-api", "View"}, {:"event-stream", "View"}], + namespace: ApiWeb + use ApiWeb.ApiControllerHelpers import ApiWeb.ControllerHelpers alias ApiWeb.Params @@ -29,7 +32,10 @@ defmodule ApiWeb.Web do def controller do quote location: :keep do - use Phoenix.Controller, namespace: ApiWeb + use Phoenix.Controller, + layouts: [html: {ApiWeb.ClientPortal.LayoutView, :app}], + namespace: ApiWeb + import ApiWeb.Router.Helpers end end @@ -48,7 +54,7 @@ defmodule ApiWeb.Web do root: "lib/api_web/templates", namespace: ApiWeb - import Phoenix.Controller, only: [get_csrf_token: 0, get_flash: 2, view_module: 1] + import Phoenix.Controller, only: [get_csrf_token: 0, view_module: 1] use Phoenix.HTML import ApiWeb.Router.Helpers import ApiWeb.ErrorHelpers diff --git a/apps/api_web/mix.exs b/apps/api_web/mix.exs index 531c5cd7..dd893d50 100644 --- a/apps/api_web/mix.exs +++ b/apps/api_web/mix.exs @@ -8,7 +8,7 @@ defmodule ApiWeb.Mixfile do aliases: aliases(), build_embedded: Mix.env() == :prod, build_path: "../../_build", - compilers: [:phoenix] ++ Mix.compilers() ++ [:phoenix_swagger], + compilers: Mix.compilers() ++ [:phoenix_swagger], config_path: "../../config/config.exs", deps: deps(), deps_path: "../../deps", @@ -60,7 +60,7 @@ defmodule ApiWeb.Mixfile do # Type "mix help deps" for more examples and options defp deps do [ - {:phoenix, "~> 1.6.15"}, + {:phoenix, "~> 1.7"}, {:phoenix_view, "~> 2.0"}, {:phoenix_html, "~> 3.3"}, {:phoenix_live_view, "~> 0.18"}, diff --git a/apps/api_web/test/api_web/controllers/admin/accounts/key_controller_test.exs b/apps/api_web/test/api_web/controllers/admin/accounts/key_controller_test.exs index a185562c..2fc4033d 100644 --- a/apps/api_web/test/api_web/controllers/admin/accounts/key_controller_test.exs +++ b/apps/api_web/test/api_web/controllers/admin/accounts/key_controller_test.exs @@ -26,7 +26,7 @@ defmodule ApiWeb.Admin.Accounts.KeyControllerTest do conn = post(form_header(conn), admin_key_path(conn, :create, user)) assert redirected_to(conn) == admin_user_path(conn, :show, user) assert [key] = ApiAccounts.list_keys_for_user(user) - assert get_flash(conn, :info) =~ key.key + assert Phoenix.Flash.get(conn.assigns.flash, :info) =~ key.key assert key.approved assert key.created assert key.requested_date @@ -81,7 +81,7 @@ defmodule ApiWeb.Admin.Accounts.KeyControllerTest do |> put(admin_key_path(base_conn, :approve, user, key)) assert redirected_to(conn) == admin_user_path(conn, :show, user) - assert get_flash(conn, :info) + assert Phoenix.Flash.get(conn.assigns.flash, :info) key = ApiAccounts.get_key!(key.key) assert key.approved @@ -209,7 +209,7 @@ defmodule ApiWeb.Admin.Accounts.KeyControllerTest do # ensure there are now two keys assert [_, _] = keys = ApiAccounts.list_keys_for_user(user) new_key = Enum.find(keys, &(&1.key != key.key)) - assert get_flash(conn, :info) =~ new_key.key + assert Phoenix.Flash.get(conn.assigns.flash, :info) =~ new_key.key end describe "find_user_by_key/1" do @@ -228,7 +228,7 @@ defmodule ApiWeb.Admin.Accounts.KeyControllerTest do request_path = admin_key_path(conn, :find_user_by_key, %{search: %{key: key_id}}) conn = post(conn, request_path) assert redirected_to(conn) == expected_path - assert get_flash(conn, :error) + assert Phoenix.Flash.get(conn.assigns.flash, :error) end end end diff --git a/apps/api_web/test/api_web/controllers/admin/accounts/user_controller_test.exs b/apps/api_web/test/api_web/controllers/admin/accounts/user_controller_test.exs index f8a07232..9d90b2ac 100644 --- a/apps/api_web/test/api_web/controllers/admin/accounts/user_controller_test.exs +++ b/apps/api_web/test/api_web/controllers/admin/accounts/user_controller_test.exs @@ -49,7 +49,7 @@ defmodule ApiWeb.Admin.Accounts.UserControllerTest do on_exit(fn -> ApiAccounts.Dynamo.delete_all_tables() end) - params = %{email: "admin@mbta.com", role: "administrator", totp_enabled: true} + %{email: "admin@mbta.com", role: "administrator", totp_enabled: true} {:ok, user} = ApiAccounts.create_user(%{email: "test@mbta.com", role: "administrator", totp_enabled: true}) diff --git a/apps/api_web/test/api_web/controllers/admin/session_controller_test.exs b/apps/api_web/test/api_web/controllers/admin/session_controller_test.exs index 7ff056bd..40dd45af 100644 --- a/apps/api_web/test/api_web/controllers/admin/session_controller_test.exs +++ b/apps/api_web/test/api_web/controllers/admin/session_controller_test.exs @@ -40,7 +40,7 @@ defmodule ApiWeb.Admin.SessionControllerTest do ) assert html_response(conn, 200) =~ "Login" - assert get_flash(conn, :error) != nil + assert Phoenix.Flash.get(conn.assigns.flash, :error) != nil assert html_response(conn, 200) =~ "Invalid credentials" end @@ -51,7 +51,7 @@ defmodule ApiWeb.Admin.SessionControllerTest do post(form_header(conn), admin_session_path(conn, :create), user: @unauthorized_user_attrs) assert html_response(conn, 200) =~ "Login" - assert get_flash(conn, :error) != nil + assert Phoenix.Flash.get(conn.assigns.flash, :error) != nil assert html_response(conn, 200) =~ "not authorized" end diff --git a/apps/api_web/test/api_web/controllers/mfa_controller_test.exs b/apps/api_web/test/api_web/controllers/mfa_controller_test.exs index 8f2bb1e1..0be29e34 100644 --- a/apps/api_web/test/api_web/controllers/mfa_controller_test.exs +++ b/apps/api_web/test/api_web/controllers/mfa_controller_test.exs @@ -42,6 +42,6 @@ defmodule ApiWeb.MfaControllerTest do ) assert html_response(conn, 200) =~ "TOTP" - assert get_flash(conn, :error) != nil + assert Phoenix.Flash.get(conn.assigns.flash, :error) != nil end end diff --git a/apps/api_web/test/api_web/controllers/portal/key_controller_test.exs b/apps/api_web/test/api_web/controllers/portal/key_controller_test.exs index a2bcf49a..efc7cd4c 100644 --- a/apps/api_web/test/api_web/controllers/portal/key_controller_test.exs +++ b/apps/api_web/test/api_web/controllers/portal/key_controller_test.exs @@ -8,7 +8,7 @@ defmodule ApiWeb.ClientPortal.KeyControllerTest do describe "create" do test "creates approved key the first time", %{conn: conn, user: user} do conn = post(conn, key_path(conn, :create)) - assert get_flash(conn, :success) + assert Phoenix.Flash.get(conn.assigns.flash, :success) assert redirected_to(conn) == portal_path(conn, :index) assert [key] = ApiAccounts.list_keys_for_user(user) assert key.approved @@ -20,7 +20,7 @@ defmodule ApiWeb.ClientPortal.KeyControllerTest do test "creates a requested key the second time", %{conn: conn, user: user} do {:ok, _} = ApiAccounts.create_key(user, %{approved: true}) conn = post(conn, key_path(conn, :create)) - assert get_flash(conn, :success) + assert Phoenix.Flash.get(conn.assigns.flash, :success) assert redirected_to(conn) == portal_path(conn, :index) keys = ApiAccounts.list_keys_for_user(user) assert Enum.count(keys) == 2 @@ -33,7 +33,7 @@ defmodule ApiWeb.ClientPortal.KeyControllerTest do test "doesn't allow more than 1 request per user", %{conn: conn, user: user} do {:ok, _} = ApiAccounts.create_key(user, %{approved: false}) conn = post(conn, key_path(conn, :create)) - assert get_flash(conn, :error) + assert Phoenix.Flash.get(conn.assigns.flash, :error) assert redirected_to(conn) == portal_path(conn, :index) assert Enum.count(ApiAccounts.list_keys_for_user(user)) == 1 end diff --git a/apps/api_web/test/api_web/controllers/portal/session_controller_test.exs b/apps/api_web/test/api_web/controllers/portal/session_controller_test.exs index 26b416c0..5906b2f8 100644 --- a/apps/api_web/test/api_web/controllers/portal/session_controller_test.exs +++ b/apps/api_web/test/api_web/controllers/portal/session_controller_test.exs @@ -32,7 +32,7 @@ defmodule ApiWeb.Portal.SessionControllerTest do test "shows error for invalid credentials", %{conn: conn} do conn = post(form_header(conn), session_path(conn, :create), user: @invalid_user_attrs) assert html_response(conn, 200) =~ "Login" - assert get_flash(conn, :error) != nil + assert Phoenix.Flash.get(conn.assigns.flash, :error) != nil assert html_response(conn, 200) =~ "Invalid credentials" end @@ -65,7 +65,7 @@ defmodule ApiWeb.Portal.SessionControllerTest do conn = delete(conn, session_path(conn, :delete)) refute get_session(conn, :user) assert redirected_to(conn) == session_path(conn, :new) - assert get_flash(conn, :info) =~ ~r"logged out"i + assert Phoenix.Flash.get(conn.assigns.flash, :info) =~ ~r"logged out"i end test "redirects to 2fa page when user has 2fa enabled", %{conn: conn} do diff --git a/apps/api_web/test/api_web/controllers/portal/user_controller_test.exs b/apps/api_web/test/api_web/controllers/portal/user_controller_test.exs index 4121fb2a..95406ea0 100644 --- a/apps/api_web/test/api_web/controllers/portal/user_controller_test.exs +++ b/apps/api_web/test/api_web/controllers/portal/user_controller_test.exs @@ -117,7 +117,7 @@ defmodule ApiWeb.Portal.UserControllerTest do page = html_response(conn, 200) assert page =~ "match" - refute get_flash(conn, :success) + refute Phoenix.Flash.get(conn.assigns.flash, :success) end test "updates a users password when valid", %{conn: conn} do @@ -132,7 +132,7 @@ defmodule ApiWeb.Portal.UserControllerTest do |> put(user_path(conn, :update), params) assert redirected_to(conn) == user_path(conn, :show) - assert get_flash(conn, :success) =~ ~r"password updated"i + assert Phoenix.Flash.get(conn.assigns.flash, :success) =~ ~r"password updated"i end end @@ -171,7 +171,7 @@ defmodule ApiWeb.Portal.UserControllerTest do page = html_response(conn, 200) assert page =~ "already been taken" - refute get_flash(conn, :success) + refute Phoenix.Flash.get(conn.assigns.flash, :success) end test "updates account information when valid", %{conn: conn} do @@ -186,7 +186,7 @@ defmodule ApiWeb.Portal.UserControllerTest do |> put(user_path(conn, :update), params) assert redirected_to(conn) == user_path(conn, :show) - assert get_flash(conn, :success) =~ ~r"account updated"i + assert Phoenix.Flash.get(conn.assigns.flash, :success) =~ ~r"account updated"i end end @@ -217,7 +217,7 @@ defmodule ApiWeb.Portal.UserControllerTest do |> form_header() |> post(user_path(conn, :forgot_password_submit), user: params) - assert get_flash(conn, :info) =~ ~r"check your email"i + assert Phoenix.Flash.get(conn.assigns.flash, :info) =~ ~r"check your email"i assert redirected_to(conn) == portal_path(conn, :landing) end @@ -229,7 +229,7 @@ defmodule ApiWeb.Portal.UserControllerTest do |> form_header() |> post(user_path(conn, :forgot_password_submit), user: params) - assert get_flash(conn, :info) =~ ~r"check your email"i + assert Phoenix.Flash.get(conn.assigns.flash, :info) =~ ~r"check your email"i assert redirected_to(conn) == portal_path(conn, :landing) end end @@ -293,7 +293,7 @@ defmodule ApiWeb.Portal.UserControllerTest do |> post(user_path(conn, :reset_password_submit, token: token), user: params) assert redirected_to(conn) == session_path(conn, :new) - assert get_flash(conn, :success) =~ "success" + assert Phoenix.Flash.get(conn.assigns.flash, :success) =~ "success" assert {:ok, _} = ApiAccounts.authenticate(%{email: user.email, password: params.password}) end diff --git a/apps/api_web/test/api_web/event_stream_test.exs b/apps/api_web/test/api_web/event_stream_test.exs index a8f89959..7937a5d1 100644 --- a/apps/api_web/test/api_web/event_stream_test.exs +++ b/apps/api_web/test/api_web/event_stream_test.exs @@ -17,7 +17,7 @@ defmodule ApiWeb.EventStreamTest do conn = conn - |> put_private(:phoenix_view, ApiWeb.PredictionView) + |> Phoenix.Controller.put_view(ApiWeb.PredictionView) |> Map.put(:params, %{"route" => "1"}) {:ok, %{conn: conn}} diff --git a/apps/api_web/test/api_web/views/stop_view_test.exs b/apps/api_web/test/api_web/views/stop_view_test.exs index 833f3971..a4feaadd 100644 --- a/apps/api_web/test/api_web/views/stop_view_test.exs +++ b/apps/api_web/test/api_web/views/stop_view_test.exs @@ -18,6 +18,11 @@ defmodule ApiWeb.StopViewTest do vehicle_type: 3 } + setup %{conn: conn} do + conn = Phoenix.Controller.put_view(conn, StopView) + {:ok, %{conn: conn}} + end + test "can do a basic rendering", %{conn: conn} do rendered = render("index.json-api", data: @stop, conn: conn)["data"] assert rendered["type"] == "stop" diff --git a/apps/api_web/test/api_web/views/trip_view_test.exs b/apps/api_web/test/api_web/views/trip_view_test.exs index 27626d84..ae7a5ea9 100644 --- a/apps/api_web/test/api_web/views/trip_view_test.exs +++ b/apps/api_web/test/api_web/views/trip_view_test.exs @@ -42,12 +42,13 @@ defmodule ApiWeb.TripViewTest do @stop %Stop{id: "stop1"} - setup do + setup %{conn: conn} do State.Trip.new_state([@trip]) State.CommuterRailOccupancy.new_state([@occupancy]) State.Schedule.new_state([@schedule]) State.Stop.new_state([@stop]) - :ok + conn = Phoenix.Controller.put_view(conn, ApiWeb.TripView) + {:ok, %{conn: conn}} end test "render returns JSONAPI", %{conn: conn} do diff --git a/mix.lock b/mix.lock index bbc0f0a9..410e8350 100644 --- a/mix.lock +++ b/mix.lock @@ -49,7 +49,7 @@ "idna": {:hex, :idna, "6.1.1", "8a63070e9f7d0c62eb9d9fcb360a7de382448200fbbd1b106cc96d3d8099df8d", [:rebar3], [{:unicode_util_compat, "~> 0.7.0", [hex: :unicode_util_compat, repo: "hexpm", optional: false]}], "hexpm", "92376eb7894412ed19ac475e4a86f7b413c1b9fbb5bd16dccd57934157944cea"}, "inflex": {:hex, :inflex, "1.10.0", "8366a7696e70e1813aca102e61274addf85d99f4a072b2f9c7984054ea1b9d29", [:mix], [], "hexpm", "7b5ccb9b720c26516f5962dc4565fc26f083ca107b0f6c167048506a125d2df3"}, "ja_serializer": {:git, "https://github.com/mbta/ja_serializer.git", "efb1d4489809e31e4b54b4af9e85f0b3ceeb650b", [branch: "master"]}, - "jason": {:hex, :jason, "1.4.0", "e855647bc964a44e2f67df589ccf49105ae039d4179db7f6271dfd3843dc27e6", [:mix], [{:decimal, "~> 1.0 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm", "79a3791085b2a0f743ca04cec0f7be26443738779d09302e01318f97bdb82121"}, + "jason": {:hex, :jason, "1.4.1", "af1504e35f629ddcdd6addb3513c3853991f694921b1b9368b0bd32beb9f1b63", [:mix], [{:decimal, "~> 1.0 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm", "fbb01ecdfd565b56261302f7e1fcc27c4fb8f32d56eab74db621fc154604a7a1"}, "jose": {:hex, :jose, "1.11.5", "3bc2d75ffa5e2c941ca93e5696b54978323191988eb8d225c2e663ddfefd515e", [:mix, :rebar3], [], "hexpm", "dcd3b215bafe02ea7c5b23dafd3eb8062a5cd8f2d904fd9caa323d37034ab384"}, "lasso": {:hex, :lasso, "0.1.1-pre", "bd3e561a861ede09e5531b4b82f021f3ceb94545c05806a073432898b0f65418", [:mix], [{:bandit, "~> 1.0-pre", [hex: :bandit, repo: "hexpm", optional: false]}, {:thousand_island, "~> 1.0-pre", [hex: :thousand_island, repo: "hexpm", optional: false]}], "hexpm", "85eaeceeb0821d7cea1a1df307e2ca45d40e1273ae6ab2bbf45e53c0be26cf2f"}, "lcov_ex": {:hex, :lcov_ex, "0.3.1", "5356fdd78fc52cb0fedb7070ed477bb7fb78db062216b15993592c6f5ab66b0d", [:mix], [], "hexpm", "9ae50bbd519cd196428251b703e27160f7ce3568ff793bbd81a66d73a0867b05"}, @@ -71,15 +71,15 @@ "nimble_pool": {:hex, :nimble_pool, "0.2.6", "91f2f4c357da4c4a0a548286c84a3a28004f68f05609b4534526871a22053cde", [:mix], [], "hexpm", "1c715055095d3f2705c4e236c18b618420a35490da94149ff8b580a2144f653f"}, "nimble_totp": {:hex, :nimble_totp, "1.0.0", "79753bae6ce59fd7cacdb21501a1dbac249e53a51c4cd22b34fa8438ee067283", [:mix], [], "hexpm", "6ce5e4c068feecdb782e85b18237f86f66541523e6bad123e02ee1adbe48eda9"}, "parse_trans": {:hex, :parse_trans, "3.3.1", "16328ab840cc09919bd10dab29e431da3af9e9e7e7e6f0089dd5a2d2820011d8", [:rebar3], [], "hexpm", "07cd9577885f56362d414e8c4c4e6bdf10d43a8767abb92d24cbe8b24c54888b"}, - "phoenix": {:hex, :phoenix, "1.6.15", "0a1d96bbc10747fd83525370d691953cdb6f3ccbac61aa01b4acb012474b047d", [:mix], [{:castore, ">= 0.0.0", [hex: :castore, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:phoenix_pubsub, "~> 2.0", [hex: :phoenix_pubsub, repo: "hexpm", optional: false]}, {:phoenix_view, "~> 1.0 or ~> 2.0", [hex: :phoenix_view, repo: "hexpm", optional: false]}, {:plug, "~> 1.10", [hex: :plug, repo: "hexpm", optional: false]}, {:plug_cowboy, "~> 2.2", [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]}], "hexpm", "d70ab9fbf6b394755ea88b644d34d79d8b146e490973151f248cacd122d20672"}, - "phoenix_html": {:hex, :phoenix_html, "3.3.0", "bf451c71ebdaac8d2f40d3b703435e819ccfbb9ff243140ca3bd10c155f134cc", [:mix], [{:plug, "~> 1.5", [hex: :plug, repo: "hexpm", optional: true]}], "hexpm", "272c5c1533499f0132309936c619186480bafcc2246588f99a69ce85095556ef"}, + "phoenix": {:hex, :phoenix, "1.7.7", "4cc501d4d823015007ba3cdd9c41ecaaf2ffb619d6fb283199fa8ddba89191e0", [: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.5.3", [hex: :websock_adapter, repo: "hexpm", optional: false]}], "hexpm", "8966e15c395e5e37591b6ed0bd2ae7f48e961f0f60ac4c733f9566b519453085"}, + "phoenix_html": {:hex, :phoenix_html, "3.3.2", "d6ce982c6d8247d2fc0defe625255c721fb8d5f1942c5ac051f6177bffa5973f", [:mix], [{:plug, "~> 1.5", [hex: :plug, repo: "hexpm", optional: true]}], "hexpm", "44adaf8e667c1c20fb9d284b6b0fa8dc7946ce29e81ce621860aa7e96de9a11d"}, "phoenix_live_view": {:hex, :phoenix_live_view, "0.18.14", "349b491496baa964711bba676f542ba1cf379af28ed1a0b0e74d0448be888609", [: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", "4bee150229d0169baae3fb0dfa98fe2cebf46b4db478836b3a3352bdf042e18b"}, - "phoenix_pubsub": {:hex, :phoenix_pubsub, "2.1.1", "ba04e489ef03763bf28a17eb2eaddc2c20c6d217e2150a61e3298b0f4c2012b5", [:mix], [], "hexpm", "81367c6d1eea5878ad726be80808eb5a787a23dee699f96e72b1109c57cdd8d9"}, + "phoenix_pubsub": {:hex, :phoenix_pubsub, "2.1.3", "3168d78ba41835aecad272d5e8cd51aa87a7ac9eb836eabc42f6e57538e3731d", [:mix], [], "hexpm", "bba06bc1dcfd8cb086759f0edc94a8ba2bc8896d5331a1e2c2902bf8e36ee502"}, "phoenix_swagger": {:hex, :phoenix_swagger, "0.8.2", "cc49d9641d7e7c87766ba800110ff67d2fb55379f83982ee33d85d1e0b39d100", [:mix], [{:ex_json_schema, "~> 0.6", [hex: :ex_json_schema, repo: "hexpm", optional: true]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:plug, "~> 1.4", [hex: :plug, repo: "hexpm", optional: false]}, {:poison, "~> 2.2 or ~> 3.0", [hex: :poison, repo: "hexpm", optional: true]}], "hexpm", "e6d177764d75d388b199a863c5f7502ac8c202cd3fca61220807cbdcb31efef2"}, - "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_template": {:hex, :phoenix_template, "1.0.3", "32de561eefcefa951aead30a1f94f1b5f0379bc9e340bb5c667f65f1edfa4326", [:mix], [{:phoenix_html, "~> 2.14.2 or ~> 3.0", [hex: :phoenix_html, repo: "hexpm", optional: true]}], "hexpm", "16f4b6588a4152f3cc057b9d0c0ba7e82ee23afa65543da535313ad8d25d8e2c"}, "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.0", "ba4f558468f69cbd9f6b356d25443d0b796fbdc887e03fa89001384a9cac638f", [: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", "bf020432c7d4feb7b3af16a0c2701455cbbbb95e5b6866132cb09eb0c29adc14"}, - "plug_crypto": {:hex, :plug_crypto, "1.2.3", "8f77d13aeb32bfd9e654cb68f0af517b371fb34c56c9f2b58fe3df1235c1251a", [:mix], [], "hexpm", "b5672099c6ad5c202c45f5a403f21a3411247f164e4a8fab056e5cd8a290f4a2"}, + "plug": {:hex, :plug, "1.15.0", "f40df58e1277fc7189f260daf788d628f03ae3053ce7ac1ca63eaf0423238714", [: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", "e434478d1015d968cf98ae2073e78bd63c4a06a94fe328c2df45fcd01df8ae30"}, + "plug_crypto": {:hex, :plug_crypto, "1.2.5", "918772575e48e81e455818229bf719d4ab4181fcbf7f85b68a35620f78d89ced", [:mix], [], "hexpm", "26549a1d6345e2172eb1c233866756ae44a9609bd33ee6f99147ab3fd87fd842"}, "pngex": {:hex, :pngex, "0.1.2", "824c2da291fda236397729f236b29f87b98a434d58124ea9f7fa03d3b3cf8587", [:mix], [], "hexpm", "9f9f2d9aa286d03f6c317017a09e1b548fa0aa6b901291e24dbf65d8212b22b0"}, "poison": {:hex, :poison, "3.1.0", "d9eb636610e096f86f25d9a46f35a9facac35609a7591b3be3326e99a0484665", [:mix], [], "hexpm", "fec8660eb7733ee4117b85f55799fd3833eb769a6df71ccf8903e8dc5447cfce"}, "polyline": {:hex, :polyline, "1.3.0", "58b9c268b100486df504b8af9b0d341107f733227a8f8095ed457d14d721d614", [:mix], [{:vector, "~> 1.0", [hex: :vector, repo: "hexpm", optional: false]}], "hexpm", "ab37fc3ab073c32fcd3f7c5711c2c20328b750ee27a4f4fab73541afc7242f8b"}, @@ -103,6 +103,7 @@ "uuid": {:hex, :uuid, "1.1.8", "e22fc04499de0de3ed1116b770c7737779f226ceefa0badb3592e64d5cfb4eb9", [:mix], [], "hexpm", "c790593b4c3b601f5dc2378baae7efaf5b3d73c4c6456ba85759905be792f2ac"}, "vector": {:hex, :vector, "1.1.0", "0789b5e00e9c551d8d5880acab9a8f44ed46690d083af397018bf0c7f30c1092", [:mix], [], "hexpm", "48b0a800ec88e55b12c689b09100e4c9ba41ea1befb459221c085a4e70040696"}, "websock": {:hex, :websock, "0.5.3", "2f69a6ebe810328555b6fe5c831a851f485e303a7c8ce6c5f675abeb20ebdadc", [:mix], [], "hexpm", "6105453d7fac22c712ad66fab1d45abdf049868f253cf719b625151460b8b453"}, + "websock_adapter": {:hex, :websock_adapter, "0.5.4", "7af8408e7ed9d56578539594d1ee7d8461e2dd5c3f57b0f2a5352d610ddde757", [: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", "d2c238c79c52cbe223fcdae22ca0bb5007a735b9e933870e241fce66afb4f4ab"}, "xml_builder": {:hex, :xml_builder, "2.2.0", "cc5f1eeefcfcde6e90a9b77fb6c490a20bc1b856a7010ce6396f6da9719cbbab", [:mix], [], "hexpm", "9d66d52fb917565d358166a4314078d39ef04d552904de96f8e73f68f64a62c9"}, "yamerl": {:hex, :yamerl, "0.10.0", "4ff81fee2f1f6a46f1700c0d880b24d193ddb74bd14ef42cb0bcf46e81ef2f8e", [:rebar3], [], "hexpm", "346adb2963f1051dc837a2364e4acf6eb7d80097c0f53cbdc3046ec8ec4b4e6e"}, "yaml_elixir": {:hex, :yaml_elixir, "2.9.0", "9a256da867b37b8d2c1ffd5d9de373a4fda77a32a45b452f1708508ba7bbcb53", [:mix], [{:yamerl, "~> 0.10", [hex: :yamerl, repo: "hexpm", optional: false]}], "hexpm", "0cb0e7d4c56f5e99a6253ed1a670ed0e39c13fc45a6da054033928607ac08dfc"},