From df154bd0b36dde6509d93042c0e1d044dcaaff02 Mon Sep 17 00:00:00 2001 From: Diego Calero Date: Sat, 17 Aug 2019 17:57:06 -0300 Subject: [PATCH] Implementing Handlers behaviour for common messages handling at live views! --- config/config.exs | 10 +- config/dev.exs | 4 +- config/prod.exs | 4 +- lib/live_qchatex_web.ex | 19 ++++ lib/live_qchatex_web/live/chat.ex | 116 ++++++++---------------- lib/live_qchatex_web/live/chats_list.ex | 67 +++++--------- lib/live_qchatex_web/live/handlers.ex | 92 +++++++++++++++++++ lib/live_qchatex_web/live/home.ex | 92 ++++++------------- lib/live_qchatex_web/live/user.ex | 9 +- mix.exs | 4 +- mix.lock | 2 +- 11 files changed, 219 insertions(+), 200 deletions(-) create mode 100644 lib/live_qchatex_web/live/handlers.ex diff --git a/config/config.exs b/config/config.exs index 862752e..98470bd 100644 --- a/config/config.exs +++ b/config/config.exs @@ -20,8 +20,8 @@ config :live_qchatex, LiveQchatexWeb.Endpoint, # Configures app timers in SECONDS config :live_qchatex, :timers, - cron_interval_clean_chats: 60 * 30, - cron_interval_clean_users: 60 * 10, + cron_interval_clean_chats: 60 * 10, + cron_interval_clean_users: 60 * 5, user_typing_timeout: 3 # Configures Memento/Mnesia @@ -31,15 +31,13 @@ config :mnesia, # Configures Elixir's Logger config :logger, :console, - format: "$time $metadata[$level] $message\n", - metadata: [:request_id] + format: "[$level][$time] $metadata$message\n", + metadata: [:socket_id, :view] # Use Jason for JSON parsing in Phoenix config :phoenix, :json_library, Jason config :phoenix, :template_engines, leex: Phoenix.LiveView.Engine -# config :phoenix, :template_engines, leex: Phoenix.LiveView.Engine - # Import environment specific config. This must remain at the bottom # of this file so it overrides the configuration defined above. import_config "#{Mix.env()}.exs" diff --git a/config/dev.exs b/config/dev.exs index ccc6eac..48c9887 100644 --- a/config/dev.exs +++ b/config/dev.exs @@ -56,8 +56,8 @@ config :live_qchatex, LiveQchatexWeb.Endpoint, ] ] -# Do not include metadata nor timestamps in development logs -config :logger, :console, format: "[$level] $message\n" +# Exclude timestamps in development logs +config :logger, :console, format: "[$level] $metadata$message\n" # Set a higher stacktrace during development. Avoid configuring such # in production as building large stacktraces may be expensive. diff --git a/config/prod.exs b/config/prod.exs index fbd11cd..0b17ba1 100644 --- a/config/prod.exs +++ b/config/prod.exs @@ -18,8 +18,8 @@ config :live_qchatex, LiveQchatexWeb.Endpoint, # Configures app timers in SECONDS config :live_qchatex, :timers, - cron_interval_clean_chats: 60 * 60, - cron_interval_clean_users: 60 * 30 + cron_interval_clean_chats: 60 * 30, + cron_interval_clean_users: 60 * 5 # Do not print debug messages in production config :logger, level: :info diff --git a/lib/live_qchatex_web.ex b/lib/live_qchatex_web.ex index a7956a3..7cfffdc 100644 --- a/lib/live_qchatex_web.ex +++ b/lib/live_qchatex_web.ex @@ -47,6 +47,25 @@ defmodule LiveQchatexWeb do end end + def live_view do + quote do + use Phoenix.LiveView + + require Logger + + use LiveQchatexWeb.LiveChat.Handlers + + alias LiveQchatex.Chats + alias LiveQchatex.Models + alias LiveQchatexWeb.ChatView + alias LiveQchatexWeb.LiveChat.Handlers + alias LiveQchatexWeb.Router.Helpers, as: Routes + + defp setup_logger(socket, view), + do: Logger.metadata(socket_id: "[#{socket.id}]", view: "[#{view}]") + end + end + def router do quote do use Phoenix.Router diff --git a/lib/live_qchatex_web/live/chat.ex b/lib/live_qchatex_web/live/chat.ex index 4381090..bd70b45 100644 --- a/lib/live_qchatex_web/live/chat.ex +++ b/lib/live_qchatex_web/live/chat.ex @@ -1,12 +1,12 @@ defmodule LiveQchatexWeb.LiveChat.Chat do - use Phoenix.LiveView - require Logger - alias LiveQchatex.Chats - alias LiveQchatex.Models - alias LiveQchatexWeb.ChatView - alias LiveQchatexWeb.Router.Helpers, as: Routes + use LiveQchatexWeb, :live_view + + @behaviour Handlers + @view_name "chat-room" def mount(%{sid: sid, path_params: %{"id" => id}}, socket) do + setup_logger(socket, @view_name) + try do socket = socket |> fetch_chat!(id) |> fetch_user(sid) if connected?(socket), do: Chats.track(socket.assigns.chat, socket.assigns.user) @@ -27,50 +27,42 @@ defmodule LiveQchatexWeb.LiveChat.Chat do ChatView.render("chat.html", assigns) end - def handle_info({[:chat, :created], _chat} = info, socket) do - Logger.debug("[#{socket.id}][chat-view] HANDLE CHAT CREATED: #{inspect(info)}", - ansi_color: :magenta - ) + @impl Handlers + def handle_chat_created(socket, _chat), + do: socket |> update_counter(:chats, 1) - {:noreply, socket |> update_counter(:chats, 1)} - end + @impl Handlers + def handle_chat_updated(socket, chat), + do: socket |> update_chat(chat) - def handle_info({[:chat, :updated], chat} = info, socket) do - Logger.debug("[#{socket.id}][chat-view] HANDLE CHAT UPDATED: #{inspect(info)}", - ansi_color: :magenta - ) + @impl Handlers + def handle_chat_cleared(socket, counter), + do: socket |> set_counter(:chats, counter) - {:noreply, socket |> update_chat(chat)} - end + @impl Handlers + def handle_user_created(socket, _user), + do: socket |> update_counter(:users, 1) - def handle_info({[:chat, :cleared], counter} = info, socket) do - Logger.debug("[#{socket.id}][chat-view] HANDLE CHAT CLEARED: #{inspect(info)}", - ansi_color: :magenta - ) - - {:noreply, socket |> set_counter(:chats, counter)} - end - - def handle_info({[:user, :created], _user} = info, socket) do - Logger.debug("[#{socket.id}][chat-view] HANDLE USER CREATED: #{inspect(info)}", - ansi_color: :magenta - ) + @impl Handlers + def handle_user_cleared(socket, counter), + do: socket |> set_counter(:users, counter) - {:noreply, socket |> update_counter(:users, 1)} - end + @impl Handlers + def handle_presence_payload(socket, topic, payload) do + cond do + topic == Chats.topic(:presence, :chats) -> + socket |> maybe_clear_invite(payload) |> update_invites() - def handle_info({[:user, :cleared], counter} = info, socket) do - Logger.debug("[#{socket.id}][chat-view] HANDLE USER CLEARED: #{inspect(info)}", - ansi_color: :magenta - ) + topic == Chats.topic(socket.assigns.user) -> + socket |> update_invites() - {:noreply, socket |> set_counter(:users, counter)} + true -> + socket |> update_members() + end end def handle_info({[:user, :typing, :end]} = info, socket) do - Logger.debug("[#{socket.id}][chat-view] HANDLE USER TYPING end: #{inspect(info)}", - ansi_color: :magenta - ) + Logger.debug("HANDLE USER TYPING END: #{inspect(info)}", ansi_color: :magenta) user = Chats.update_last_activity!(socket.assigns.user) Chats.update_member_typing(socket.assigns.chat, socket.assigns.user, false) @@ -78,32 +70,13 @@ defmodule LiveQchatexWeb.LiveChat.Chat do end def handle_info({[:message, :created], message} = info, socket) do - Logger.debug("[#{socket.id}][chat-view] HANDLE MESSAGE CREATED: #{inspect(info)}", - ansi_color: :magenta - ) + Logger.debug("HANDLE MESSAGE CREATED: #{inspect(info)}", ansi_color: :magenta) {:noreply, socket |> update_messages(message)} end - def handle_info(%{event: "presence_diff", topic: topic, payload: payload}, socket) do - Logger.debug( - "[#{socket.id}][chat-view] HANDLE PRESENCE DIFF FOR '#{topic}': #{inspect(payload)}", - ansi_color: :magenta - ) - - {:noreply, socket |> handle_presence_payload(topic, payload)} - end - - def handle_info({:hearthbeat, _, _} = info, socket) do - Logger.debug("[#{socket.id}][chat-view] HANDLE HEARTHBEAT: #{inspect(info)}", - ansi_color: :magenta - ) - - Chats.handle_hearthbeat(info, socket) - end - def handle_info(info, socket) do - Logger.warn("[#{socket.id}][chat-view] UNHANDLED INFO: #{inspect(info)}") + Logger.warn("UNHANDLED INFO: #{inspect(info)}") {:noreply, socket} end @@ -169,23 +142,10 @@ defmodule LiveQchatexWeb.LiveChat.Chat do end def handle_event(event, data, socket) do - Logger.warn("[#{socket.id}][chat-view] UNHANDLED EVENT '#{event}': #{inspect(data)}") + Logger.warn("UNHANDLED EVENT '#{event}': #{inspect(data)}") {:noreply, socket} end - defp handle_presence_payload(socket, topic, payload) do - cond do - topic == Chats.topic(:presence, :chats) -> - socket |> maybe_clear_invite(payload) |> update_invites() - - topic == Chats.topic(socket.assigns.user) -> - socket |> update_invites() - - true -> - socket |> update_members() - end - end - defp fetch_chat!(socket, id) do socket |> assign(chat_id: id, chat: Chats.get_chat!(id)) end @@ -252,7 +212,7 @@ defmodule LiveQchatexWeb.LiveChat.Chat do end defp update_nickname(%{:assigns => %{:user => user}} = socket, nick) do - Logger.debug("[#{socket.id}][chat-view] Changed nickname to: #{inspect(nick)}") + Logger.debug("Changed nickname to: #{inspect(nick)}") message = "Renamed from #{inspect(user.nickname)} to #{inspect(nick)}" handle_event( @@ -274,7 +234,7 @@ defmodule LiveQchatexWeb.LiveChat.Chat do end defp update_title(%{:assigns => %{:chat => chat}} = socket, title) do - Logger.debug("[#{socket.id}][chat-view] Changed title to: #{inspect(title)}") + Logger.debug("Changed title to: #{inspect(title)}") message = "Changed chat title from #{inspect(chat.title)} to #{inspect(title)}" handle_event( @@ -298,7 +258,7 @@ defmodule LiveQchatexWeb.LiveChat.Chat do defp maybe_toggle_scope(%{:assigns => %{:chat => chat, :user => user}} = socket) do if chat.user_id == user.id do scope = if chat.private, do: "public", else: "private" - Logger.debug("[#{socket.id}][chat-view] Changing chat scope to: #{scope}") + Logger.debug("Changing chat scope to: #{scope}") {:noreply, socket |> update_chat(:private, scope == "private")} else diff --git a/lib/live_qchatex_web/live/chats_list.ex b/lib/live_qchatex_web/live/chats_list.ex index 50905e7..1692a58 100644 --- a/lib/live_qchatex_web/live/chats_list.ex +++ b/lib/live_qchatex_web/live/chats_list.ex @@ -1,10 +1,11 @@ defmodule LiveQchatexWeb.LiveChat.ChatsList do - use Phoenix.LiveView - require Logger - alias LiveQchatex.Chats - alias LiveQchatexWeb.ChatView + use LiveQchatexWeb, :live_view + + @behaviour Handlers + @view_name "chat-list" def mount(_, socket) do + setup_logger(socket, @view_name) if connected?(socket), do: [Chats.subscribe(), Chats.subscribe(:presence, :chats)] {:ok, socket |> fetch()} end @@ -13,46 +14,21 @@ defmodule LiveQchatexWeb.LiveChat.ChatsList do ChatView.render("chats_list.html", assigns) end - def handle_info({[:chat, :created], chat} = info, socket) do - Logger.debug("[#{socket.id}][chats-list-view] HANDLE CHAT CREATED: #{inspect(info)}", - ansi_color: :magenta - ) - - {:noreply, if(chat.private != true, do: add_public_chat(socket, chat), else: socket)} - end + @impl Handlers + def handle_chat_created(socket, chat), + do: if(chat.private != true, do: add_public_chat(socket, chat), else: socket) - def handle_info({[:chat, :updated], chat} = info, socket) do - Logger.debug("[#{socket.id}][chats-list-view] HANDLE CHAT UPDATED: #{inspect(info)}", - ansi_color: :magenta - ) - - {:noreply, socket |> update_public_chat(chat)} - end - - def handle_info({[:chat, :cleared], _} = info, socket) do - Logger.debug("[#{socket.id}][chats-list-view] HANDLE CHAT CLEARED: #{inspect(info)}", - ansi_color: :magenta - ) + @impl Handlers + def handle_chat_updated(socket, chat), + do: socket |> update_public_chat(chat) + @impl Handlers + def handle_chat_cleared(socket, _counter), # Reload all public chats again (should be improved) - {:noreply, socket |> fetch()} - end - - def handle_info(%{event: "presence_diff", topic: topic, payload: payload}, socket) do - Logger.debug( - "[#{socket.id}][chats-list-view] HANDLE PRESENCE DIFF FOR '#{topic}': #{inspect(payload)}", - ansi_color: :magenta - ) - - {:noreply, socket |> handle_presence_payload(topic, payload)} - end + do: socket |> fetch() - def handle_info(info, socket) do - Logger.warn("[#{socket.id}][chats-list-view] UNHANDLED INFO: #{inspect(info)}") - {:noreply, socket} - end - - defp handle_presence_payload(socket, _topic, %{joins: joins, leaves: leaves}) do + @impl Handlers + def handle_presence_payload(socket, _topic, %{joins: joins, leaves: leaves}) do chats_ids = Enum.uniq(Map.keys(joins) ++ Map.keys(leaves)) chats = @@ -62,6 +38,11 @@ defmodule LiveQchatexWeb.LiveChat.ChatsList do socket |> fetch(chats) end + def handle_info(info, socket) do + Logger.warn("UNHANDLED INFO: #{inspect(info)}") + {:noreply, socket} + end + defp fetch(socket) do socket |> fetch(Chats.get_public_chats() |> Enum.map(&add_chat_members_count/1)) end @@ -75,7 +56,7 @@ defmodule LiveQchatexWeb.LiveChat.ChatsList do end defp add_public_chat(socket, chat) do - Logger.debug("[#{socket.id}][chats-list-view] Adding public chat: #{chat.title}") + Logger.debug("Adding public chat: #{chat.title}") socket |> fetch([chat |> add_chat_members_count() | socket.assigns.chats]) end @@ -87,14 +68,14 @@ defmodule LiveQchatexWeb.LiveChat.ChatsList do socket {true, _} -> - Logger.debug("[#{socket.id}][chats-list-view] Removing private chat: #{chat.title}") + Logger.debug("Removing private chat: #{chat.title}") socket |> fetch(socket.assigns.chats |> Enum.reject(&(&1.id == chat.id))) {false, nil} -> socket |> add_public_chat(chat) {false, _} -> - Logger.debug("[#{socket.id}][chats-list-view] Updating public chat: #{chat.title}") + Logger.debug("Updating public chat: #{chat.title}") socket |> fetch( diff --git a/lib/live_qchatex_web/live/handlers.ex b/lib/live_qchatex_web/live/handlers.ex new file mode 100644 index 0000000..896a174 --- /dev/null +++ b/lib/live_qchatex_web/live/handlers.ex @@ -0,0 +1,92 @@ +defmodule LiveQchatexWeb.LiveChat.Handlers do + alias LiveQchatex.Chats + alias LiveQchatex.Models + alias Phoenix.LiveView.Socket + + @callback handle_chat_created(Socket.t(), %Models.Chat{}) :: Socket.t() + @callback handle_chat_updated(Socket.t(), %Models.Chat{}) :: Socket.t() + @callback handle_chat_cleared(Socket.t(), Integer.t()) :: Socket.t() + + @callback handle_user_created(Socket.t(), %Models.User{}) :: Socket.t() + @callback handle_user_updated(Socket.t(), %Models.User{}) :: Socket.t() + @callback handle_user_cleared(Socket.t(), Integer.t()) :: Socket.t() + + @callback handle_presence_payload(Socket.t(), String.t(), Map.t()) :: Socket.t() + + defmacro __using__(_opts \\ []) do + quote do + require Logger + + @behaviour __MODULE__ + + def handle_info({[:chat, :created], chat} = info, socket) do + Logger.debug("HANDLE CHAT CREATED: #{inspect(info)}", ansi_color: :magenta) + + {:noreply, socket |> handle_chat_created(chat)} + end + + def handle_info({[:chat, :updated], chat} = info, socket) do + Logger.debug("HANDLE CHAT UPDATED: #{inspect(info)}", ansi_color: :magenta) + + {:noreply, socket |> handle_chat_updated(chat)} + end + + def handle_info({[:chat, :cleared], counter} = info, socket) do + Logger.debug("HANDLE CHAT CLEARED: #{inspect(info)}", ansi_color: :magenta) + + {:noreply, socket |> handle_chat_cleared(counter)} + end + + def handle_info({[:user, :created], user} = info, socket) do + Logger.debug("HANDLE USER CREATED: #{inspect(info)}", ansi_color: :magenta) + + {:noreply, socket |> handle_user_created(user)} + end + + def handle_info({[:user, :updated], user} = info, socket) do + Logger.debug("HANDLE USER UPDATED: #{inspect(info)}", ansi_color: :magenta) + + {:noreply, socket |> handle_user_updated(user)} + end + + def handle_info({[:user, :cleared], counter} = info, socket) do + Logger.debug("HANDLE USER CLEARED: #{inspect(info)}", ansi_color: :magenta) + + {:noreply, socket |> handle_user_cleared(counter)} + end + + def handle_info(%{event: "presence_diff", topic: topic, payload: payload}, socket) do + Logger.debug("HANDLE PRESENCE FOR '#{topic}': #{inspect(payload)}", ansi_color: :magenta) + + {:noreply, socket |> handle_presence_payload(topic, payload)} + end + + def handle_info({:hearthbeat, _, _} = info, socket) do + Logger.debug("HANDLE HEARTHBEAT: #{inspect(info)}", ansi_color: :magenta) + + Chats.handle_hearthbeat(info, socket) + end + + def handle_chat_created(socket, _chat), do: socket + defoverridable handle_chat_created: 2 + + def handle_chat_updated(socket, _chat), do: socket + defoverridable handle_chat_updated: 2 + + def handle_chat_cleared(socket, _counter), do: socket + defoverridable handle_chat_cleared: 2 + + def handle_user_created(socket, _chat), do: socket + defoverridable handle_user_created: 2 + + def handle_user_updated(socket, _user), do: socket + defoverridable handle_user_updated: 2 + + def handle_user_cleared(socket, _counter), do: socket + defoverridable handle_user_cleared: 2 + + def handle_presence_payload(socket, _topic, _payload), do: socket + defoverridable handle_presence_payload: 3 + end + end +end diff --git a/lib/live_qchatex_web/live/home.ex b/lib/live_qchatex_web/live/home.ex index 587bdeb..1d94a12 100644 --- a/lib/live_qchatex_web/live/home.ex +++ b/lib/live_qchatex_web/live/home.ex @@ -1,12 +1,12 @@ defmodule LiveQchatexWeb.LiveChat.Home do - use Phoenix.LiveView - require Logger - alias LiveQchatex.Chats - alias LiveQchatex.Models - alias LiveQchatexWeb.ChatView - alias LiveQchatexWeb.Router.Helpers, as: Routes + use LiveQchatexWeb, :live_view + + @behaviour Handlers + @view_name "home" def mount(%{sid: sid}, socket) do + setup_logger(socket, @view_name) + try do socket = socket |> fetch_user(sid) if connected?(socket), do: Chats.track(socket.assigns.user) @@ -26,57 +26,38 @@ defmodule LiveQchatexWeb.LiveChat.Home do ChatView.render("home.html", assigns) end - def handle_info({[:chat, :created], _chat} = info, socket) do - Logger.debug("[#{socket.id}][home-view] HANDLE CHAT CREATED: #{inspect(info)}", - ansi_color: :magenta - ) - - {:noreply, socket |> update_counter(:chats, 1)} - end - - def handle_info({[:chat, :cleared], counter} = info, socket) do - Logger.debug("[#{socket.id}][home-view] HANDLE CHAT CLEARED: #{inspect(info)}", - ansi_color: :magenta - ) + @impl Handlers + def handle_chat_created(socket, _chat), + do: socket |> update_counter(:chats, 1) - {:noreply, socket |> set_counter(:chats, counter)} - end + @impl Handlers + def handle_chat_cleared(socket, counter), + do: socket |> set_counter(:chats, counter) - def handle_info({[:user, :created], _user} = info, socket) do - Logger.debug("[#{socket.id}][home-view] HANDLE USER CREATED: #{inspect(info)}", - ansi_color: :magenta - ) + @impl Handlers + def handle_user_created(socket, _user), + do: socket |> update_counter(:users, 1) - {:noreply, socket |> update_counter(:users, 1)} - end + @impl Handlers + def handle_user_cleared(socket, counter), + do: socket |> set_counter(:users, counter) - def handle_info({[:user, :cleared], counter} = info, socket) do - Logger.debug("[#{socket.id}][home-view] HANDLE USER CLEARED: #{inspect(info)}", - ansi_color: :magenta - ) - - {:noreply, socket |> set_counter(:users, counter)} - end - - def handle_info(%{event: "presence_diff", topic: topic, payload: payload}, socket) do - Logger.debug( - "[#{socket.id}][home-view] HANDLE PRESENCE DIFF FOR '#{topic}': #{inspect(payload)}", - ansi_color: :magenta - ) - - {:noreply, socket |> handle_presence_payload(topic, payload)} - end + @impl Handlers + def handle_presence_payload(socket, topic, payload) do + cond do + topic == Chats.topic(:presence, :chats) -> + socket |> maybe_clear_invite(payload) |> update_invites() - def handle_info({:hearthbeat, _, _} = info, socket) do - Logger.debug("[#{socket.id}][home-view] HANDLE HEARTHBEAT: #{inspect(info)}", - ansi_color: :magenta - ) + topic == Chats.topic(socket.assigns.user) -> + socket |> update_invites() - Chats.handle_hearthbeat(info, socket) + true -> + socket + end end def handle_info(info, socket) do - Logger.warn("[#{socket.id}][home-view] UNHANDLED INFO: #{inspect(info)}") + Logger.warn("UNHANDLED INFO: #{inspect(info)}") {:noreply, socket} end @@ -99,24 +80,11 @@ defmodule LiveQchatexWeb.LiveChat.Home do redirect_to_chat(socket, chat) rescue err -> - Logger.debug("Can't join the chat #{inspect(err)}") + Logger.error("Can't join the chat #{inspect(err)}") response_error(socket, "The chat doesn't exist!") end end - defp handle_presence_payload(socket, topic, payload) do - cond do - topic == Chats.topic(:presence, :chats) -> - socket |> maybe_clear_invite(payload) |> update_invites() - - topic == Chats.topic(socket.assigns.user) -> - socket |> update_invites() - - true -> - socket - end - end - defp redirect_to_chat(socket, chat) do {:stop, socket diff --git a/lib/live_qchatex_web/live/user.ex b/lib/live_qchatex_web/live/user.ex index c5985a3..99bc57d 100644 --- a/lib/live_qchatex_web/live/user.ex +++ b/lib/live_qchatex_web/live/user.ex @@ -1,10 +1,11 @@ defmodule LiveQchatexWeb.LiveChat.User do - use Phoenix.LiveView - require Logger - alias LiveQchatex.Chats - alias LiveQchatexWeb.Router.Helpers, as: Routes + use LiveQchatexWeb, :live_view + + @view_name "user-invite" def mount(%{sid: sid, path_params: %{"id" => user_id}}, socket) do + setup_logger(socket, @view_name) + try do from_user = Chats.get_user!(sid) to_user = Chats.get_user!(user_id) diff --git a/mix.exs b/mix.exs index 9bec7a8..60f1b9f 100644 --- a/mix.exs +++ b/mix.exs @@ -3,7 +3,7 @@ defmodule LiveQchatex.MixProject do @github_url "https://github.com/fiqus/lqchatex" @demo_url "https://lqchatex.fiqus.coop" - @version "0.2.0" + @version "0.2.1" def project do [ @@ -99,7 +99,7 @@ defmodule LiveQchatex.MixProject do get_commit_date() ] - Mix.shell().info("Updating version with: #{inspect(contents)}") + Mix.shell().info("\e[33mUpdating app version with: #{inspect(contents)}\e[39m") File.write("VERSION", Enum.join(contents, "\n"), [:write]) end diff --git a/mix.lock b/mix.lock index 208b635..f565d77 100644 --- a/mix.lock +++ b/mix.lock @@ -19,7 +19,7 @@ "phoenix": {:hex, :phoenix, "1.4.9", "746d098e10741c334d88143d3c94cab1756435f94387a63441792e66ec0ee974", [:mix], [{:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:phoenix_pubsub, "~> 1.1", [hex: :phoenix_pubsub, repo: "hexpm", optional: false]}, {:plug, "~> 1.8.1 or ~> 1.9", [hex: :plug, repo: "hexpm", optional: false]}, {:plug_cowboy, "~> 1.0 or ~> 2.0", [hex: :plug_cowboy, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm"}, "phoenix_html": {:hex, :phoenix_html, "2.13.3", "850e292ff6e204257f5f9c4c54a8cb1f6fbc16ed53d360c2b780a3d0ba333867", [:mix], [{:plug, "~> 1.5", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm"}, "phoenix_live_reload": {:hex, :phoenix_live_reload, "1.2.1", "274a4b07c4adbdd7785d45a8b0bb57634d0b4f45b18d2c508b26c0344bd59b8f", [:mix], [{:file_system, "~> 0.2.1 or ~> 0.3", [hex: :file_system, repo: "hexpm", optional: false]}, {:phoenix, "~> 1.4", [hex: :phoenix, repo: "hexpm", optional: false]}], "hexpm"}, - "phoenix_live_view": {:git, "https://github.com/phoenixframework/phoenix_live_view.git", "4a770b5dc45e3bd81e1dc0ef4814f49235ede679", []}, + "phoenix_live_view": {:git, "https://github.com/phoenixframework/phoenix_live_view.git", "c73010597ee12c463e44d190714778a16607a9b5", []}, "phoenix_pubsub": {:hex, :phoenix_pubsub, "1.1.2", "496c303bdf1b2e98a9d26e89af5bba3ab487ba3a3735f74bf1f4064d2a845a3e", [:mix], [], "hexpm"}, "plug": {:hex, :plug, "1.8.3", "12d5f9796dc72e8ac9614e94bda5e51c4c028d0d428e9297650d09e15a684478", [:mix], [{:mime, "~> 1.0", [hex: :mime, repo: "hexpm", optional: false]}, {:plug_crypto, "~> 1.0", [hex: :plug_crypto, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4", [hex: :telemetry, repo: "hexpm", optional: true]}], "hexpm"}, "plug_cowboy": {:hex, :plug_cowboy, "2.1.0", "b75768153c3a8a9e8039d4b25bb9b14efbc58e9c4a6e6a270abff1cd30cbe320", [:mix], [{:cowboy, "~> 2.5", [hex: :cowboy, repo: "hexpm", optional: false]}, {:plug, "~> 1.7", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm"},