diff --git a/.github/actions/setup-elixir/action.yml b/.github/actions/setup-elixir/action.yml new file mode 100644 index 0000000..253484b --- /dev/null +++ b/.github/actions/setup-elixir/action.yml @@ -0,0 +1,56 @@ +name: "Setup Elixir" +description: "Sets up Elixir and all the caches" + +inputs: + elixir-version: + required: true + description: "Elixir version to install" + default: "1.14" + otp-version: + required: true + description: "Erlang/OTP version to install" + default: "25.0" + phoenix-live-view-version: + required: true + description: "Phoenix LiveView Version to use" + default: "~> 0.18.17" + phoenix-version: + required: true + description: "Phoenix Version to use" + default: "1.7.0" + +runs: + using: "composite" + steps: + - uses: actions/checkout@v2 + - name: Set up Elixir + uses: erlef/setup-beam@988e02bfe678367a02564f65ca2e37726dc0268f + with: + elixir-version: "${{ inputs.elixir-version }}" + otp-version: "${{ inputs.otp-version }}" + - name: Restore mix deps cache + uses: actions/cache@v3 + id: mix-cache + with: + path: | + deps + test_app/deps + _build + test_app/_build + !_build/prod + !test_app/_build/prod + priv/plts + key: mix-${{ runner.os }}-${{ inputs.elixir-version }}-${{ inputs.otp-version }}-${{ inputs.phoenix-version }}-${{ inputs.phoenix-live-view-version }}-${{ hashFiles(format('{0}{1}', github.workspace, '/mix.lock')) }} + restore-keys: | + mix-${{ runner.os }}-${{ inputs.elixir-version }}-${{ inputs.otp-version }}-${{ inputs.phoenix-version }}-${{ inputs.phoenix-live-view-version }}- + - name: Install Mix Base deps + shell: bash + if: steps.mix-cache.outputs.cache-hit != 'true' + run: | + mix local.rebar --force + mix local.hex --force + - run: mix deps.get + shell: bash + - name: Phoenix Version + run: mix deps | grep "phoenix " + shell: bash \ No newline at end of file diff --git a/.github/workflows/elixir-ci.yml b/.github/workflows/elixir-ci.yml new file mode 100644 index 0000000..f02bcaa --- /dev/null +++ b/.github/workflows/elixir-ci.yml @@ -0,0 +1,61 @@ +name: Elixir CI + +on: + push: + branches: [main, staging] + pull_request: + branches: [main, staging] + +jobs: + test: + name: Build and test + runs-on: ubuntu-20.04 + + strategy: + matrix: + elixir: [1.14.5, 1.15.6] + otp: [25.0, 26.0] + phoenix-live-view-version: [0.19.0, 0.20.0] + phoenix-version: [1.7.0] + + env: + PHOENIX_VERSION: ${{matrix.phoenix-version}} + PHOENIX_LIVE_VIEW_VERSION: ${{matrix.phoenix-live-view-version}} + + steps: + - uses: actions/checkout@v2 + - name: Set up Elixir + uses: ./.github/actions/setup-elixir + with: + elixir-version: ${{ matrix.elixir }} + otp-version: ${{ matrix.otp }} + phoenix-live-view-version: ${{ matrix.phoenix-live-view-version }} + phoenix-version: ${{ matrix.phoenix-version }} + - run: mix format --check-formatted + - run: mix test + - run: mix credo --strict + - run: mix compile --error-on-warnings + - name: Retrieve PLT Cache + uses: actions/cache@v3 + id: plt-cache + with: + path: priv/plts + key: plts-v.2-${{ runner.os }}-${{ matrix.otp }}-${{ matrix.elixir }}-${{ matrix.phoenix-version }}-${{ matrix.phoenix-live-view-version }}-${{ hashFiles(format('{0}{1}', github.workspace, '/mix.lock')) }} + - name: Create PLTs + if: steps.plt-cache.outputs.cache-hit != 'true' + run: | + mkdir -p priv/plts + mix dialyzer --plt + - run: mix dialyzer + - name: Run test app tests + run: | + cd test_app + mix deps.get + mix deps | grep "phoenix " + mix test + - name: Check let warning + run: | + cd test_app + mix test --only let_warning 2> /tmp/test.output + cat /tmp/test.output + !(cat /tmp/test.output | grep -q "Using variables in HEEx templates are discouraged as they disable change tracking.") \ No newline at end of file diff --git a/lib/live_view_events/notify.ex b/lib/live_view_events/notify.ex index 91e0d2d..9ae452f 100644 --- a/lib/live_view_events/notify.ex +++ b/lib/live_view_events/notify.ex @@ -86,7 +86,8 @@ defmodule LiveViewEvents.Notify do def notify_to(pid, message, params) when is_pid(pid), do: send(pid, {message, params}) def notify_to(target, message, params) when is_tuple(target) do - {pid, module, id}=process_tuple(target) + {pid, module, id} = process_tuple(target) + Phoenix.LiveView.send_update(pid, module, %{ :id => id, @assign_name_for_event => {message, params} @@ -94,5 +95,5 @@ defmodule LiveViewEvents.Notify do end defp process_tuple({module, id}), do: {self(), module, id} - defp process_tuple({pid, _module, _id}=target) when is_pid(pid), do: target + defp process_tuple({pid, _module, _id} = target) when is_pid(pid), do: target end diff --git a/mix.exs b/mix.exs index 2515479..edddf95 100644 --- a/mix.exs +++ b/mix.exs @@ -21,6 +21,9 @@ defmodule LiveViewEvents.MixProject do # Run "mix help deps" to learn about dependencies. defp deps do [ + {:credo, "~> 1.7.0", only: :dev, runtime: false}, + {:dialyxir, "~> 1.4.1", only: :dev, runtime: false}, + {:ex_doc, "~> 0.30.6", only: :dev, runtime: false}, {:floki, ">= 0.30.0", only: :test}, {:phoenix_live_view, "~> 0.19"} ] diff --git a/mix.lock b/mix.lock index dca4cec..8d8f195 100644 --- a/mix.lock +++ b/mix.lock @@ -1,7 +1,19 @@ %{ + "bunt": {:hex, :bunt, "0.2.1", "e2d4792f7bc0ced7583ab54922808919518d0e57ee162901a16a1b6664ef3b14", [:mix], [], "hexpm", "a330bfb4245239787b15005e66ae6845c9cd524a288f0d141c148b02603777a5"}, "castore": {:hex, :castore, "1.0.3", "7130ba6d24c8424014194676d608cb989f62ef8039efd50ff4b3f33286d06db8", [:mix], [], "hexpm", "680ab01ef5d15b161ed6a95449fac5c6b8f60055677a8e79acf01b27baa4390b"}, + "credo": {:hex, :credo, "1.7.1", "6e26bbcc9e22eefbff7e43188e69924e78818e2fe6282487d0703652bc20fd62", [: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", "e9871c6095a4c0381c89b6aa98bc6260a8ba6addccf7f6a53da8849c748a58a2"}, + "dialyxir": {:hex, :dialyxir, "1.4.1", "a22ed1e7bd3a3e3f197b68d806ef66acb61ee8f57b3ac85fc5d57354c5482a93", [:mix], [{:erlex, ">= 0.2.6", [hex: :erlex, repo: "hexpm", optional: false]}], "hexpm", "84b795d6d7796297cca5a3118444b80c7d94f7ce247d49886e7c291e1ae49801"}, + "earmark_parser": {:hex, :earmark_parser, "1.4.37", "2ad73550e27c8946648b06905a57e4d454e4d7229c2dafa72a0348c99d8be5f7", [:mix], [], "hexpm", "6b19783f2802f039806f375610faa22da130b8edc21209d0bff47918bb48360e"}, + "erlex": {:hex, :erlex, "0.2.6", "c7987d15e899c7a2f34f5420d2a2ea0d659682c06ac607572df55a43753aa12e", [:mix], [], "hexpm", "2ed2e25711feb44d52b17d2780eabf998452f6efda104877a3881c2f8c0c0c75"}, + "ex_doc": {:hex, :ex_doc, "0.30.6", "5f8b54854b240a2b55c9734c4b1d0dd7bdd41f71a095d42a70445c03cf05a281", [: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", "bd48f2ddacf4e482c727f9293d9498e0881597eae6ddc3d9562bd7923375109f"}, + "file_system": {:hex, :file_system, "0.2.10", "fb082005a9cd1711c05b5248710f8826b02d7d1784e7c3451f9c1231d4fc162d", [:mix], [], "hexpm", "41195edbfb562a593726eda3b3e8b103a309b733ad25f3d642ba49696bf715dc"}, "floki": {:hex, :floki, "0.34.3", "5e2dcaec5d7c228ce5b1d3501502e308b2d79eb655e4191751a1fe491c37feac", [:mix], [], "hexpm", "9577440eea5b97924b4bf3c7ea55f7b8b6dce589f9b28b096cc294a8dc342341"}, + "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.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.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.2", "ad87296a092a46e03b7e9b0be7631ddcf64c790fa68a9ef5323b6cbb36affc72", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}], "hexpm", "f3f5a1ca93ce6e092d92b6d9c049bcda58a3b617a8d888f8e7231c85630e8108"}, "mime": {:hex, :mime, "2.0.5", "dc34c8efd439abe6ae0343edbb8556f4d63f178594894720607772a041b04b02", [:mix], [], "hexpm", "da0d64a365c45bc9935cc5c8a7fc5e49a0e0f9932a761c55d6c52b142780a05c"}, + "nimble_parsec": {:hex, :nimble_parsec, "1.3.1", "2c54013ecf170e249e9291ed0a62e5832f70a476c61da16f6aac6dca0189f2af", [:mix], [], "hexpm", "2682e3c0b2eb58d90c6375fc0cc30bc7be06f365bf72608804fb9cffa5e1b167"}, "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.20.0", "3f3531c835e46a3b45b4c3ca4a09cef7ba1d0f0d0035eef751c7084b8adb1299", [: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", "29875f8a58fb031f2dc8f3be025c92ed78d342b46f9bbf6dfe579549d7c81050"},