From 0d22e90ae03480dd61d4855670eac29157db9678 Mon Sep 17 00:00:00 2001 From: Mathias Polligkeit Date: Sun, 9 Oct 2022 18:12:52 +0900 Subject: [PATCH 01/15] fix type determination for default and custom type fields --- lib/polymorphic_embed/html/form.ex | 14 +++- test/polymorphic_embed_test.exs | 65 +++++++++++++++++-- .../20000101000000_create_tables.exs | 2 + test/support/models/polymorphic/reminder.ex | 17 +++++ 4 files changed, 90 insertions(+), 8 deletions(-) diff --git a/lib/polymorphic_embed/html/form.ex b/lib/polymorphic_embed/html/form.ex index c6ac550..767626b 100644 --- a/lib/polymorphic_embed/html/form.ex +++ b/lib/polymorphic_embed/html/form.ex @@ -14,7 +14,19 @@ if Code.ensure_loaded?(Phoenix.HTML) && Code.ensure_loaded?(Phoenix.HTML.Form) d %_{} = value -> PolymorphicEmbed.get_polymorphic_type(schema, field, value) - _ -> + %{} = map -> + case PolymorphicEmbed.get_polymorphic_module(schema, field, map) do + nil -> + nil + + module -> + PolymorphicEmbed.get_polymorphic_type(schema, field, module) + end + + list when is_list(list) -> + nil + + nil -> nil end end diff --git a/test/polymorphic_embed_test.exs b/test/polymorphic_embed_test.exs index dd98de6..87377e6 100644 --- a/test/polymorphic_embed_test.exs +++ b/test/polymorphic_embed_test.exs @@ -2045,7 +2045,7 @@ defmodule PolymorphicEmbedTest do end describe "Form.get_polymorphic_type/3" do - test "returns type from changeset" do + test "returns type from changeset via identify_by_fields" do reminder_module = get_module(Reminder, :polymorphic) attrs = %{ @@ -2094,9 +2094,9 @@ defmodule PolymorphicEmbedTest do end) end - test "returns type from string parameters" do + test "returns type from changeset via custom type field" do reminder_module = get_module(Reminder, :polymorphic) - attrs = %{"channel" => %{"my_type_field" => "email"}} + attrs = %{"channel" => %{"my_type_field" => "sms"}} changeset = reminder_module @@ -2105,15 +2105,32 @@ defmodule PolymorphicEmbedTest do safe_form_for(changeset, fn f -> assert PolymorphicEmbed.HTML.Form.get_polymorphic_type(f, reminder_module, :channel) == + :sms + + text_input(f, :text) + end) + end + + test "returns type from map with default type field (string)" do + reminder_module = get_module(Reminder, :polymorphic) + attrs = %{"channel2" => %{"__type__" => "email"}} + + changeset = + reminder_module + |> struct() + |> reminder_module.changeset(attrs) + + safe_form_for(changeset, fn f -> + assert PolymorphicEmbed.HTML.Form.get_polymorphic_type(f, reminder_module, :channel2) == :email text_input(f, :text) end) end - test "returns type from atom parameters" do + test "returns type from map with default type field (atom)" do reminder_module = get_module(Reminder, :polymorphic) - attrs = %{channel: %{my_type_field: :email}} + attrs = %{"channel2" => %{__type__: :email}} changeset = reminder_module @@ -2121,14 +2138,48 @@ defmodule PolymorphicEmbedTest do |> reminder_module.changeset(attrs) safe_form_for(changeset, fn f -> - assert PolymorphicEmbed.HTML.Form.get_polymorphic_type(f, reminder_module, :channel) == + assert PolymorphicEmbed.HTML.Form.get_polymorphic_type(f, reminder_module, :channel2) == + :email + + text_input(f, :text) + end) + end + + test "returns type from map with custom type field (string)" do + reminder_module = get_module(Reminder, :polymorphic) + attrs = %{"channel3" => %{"my_type_field" => "email"}} + + changeset = + reminder_module + |> struct() + |> reminder_module.changeset(attrs) + + safe_form_for(changeset, fn f -> + assert PolymorphicEmbed.HTML.Form.get_polymorphic_type(f, reminder_module, :channel3) == + :email + + text_input(f, :text) + end) + end + + test "returns type from map with custom type field (atom)" do + reminder_module = get_module(Reminder, :polymorphic) + attrs = %{"channel3" => %{my_type_field: "email"}} + + changeset = + reminder_module + |> struct() + |> reminder_module.changeset(attrs) + + safe_form_for(changeset, fn f -> + assert PolymorphicEmbed.HTML.Form.get_polymorphic_type(f, reminder_module, :channel3) == :email text_input(f, :text) end) end - test "returns type from parameters while type field is custom" do + test "returns nil with map when custom type field is configured and default type field is set" do reminder_module = get_module(Reminder, :polymorphic) attrs = %{channel: %{__type__: :email}} diff --git a/test/support/migrations/20000101000000_create_tables.exs b/test/support/migrations/20000101000000_create_tables.exs index 53be4e2..e1167f9 100644 --- a/test/support/migrations/20000101000000_create_tables.exs +++ b/test/support/migrations/20000101000000_create_tables.exs @@ -7,6 +7,8 @@ defmodule PolymorphicEmbed.CreateTables do add(:text, :text, null: false) add(:channel, :map) + add(:channel2, :map) + add(:channel3, :map) add(:contexts, :map) add(:contexts2, :map) diff --git a/test/support/models/polymorphic/reminder.ex b/test/support/models/polymorphic/reminder.ex index 520f73b..0bc7386 100644 --- a/test/support/models/polymorphic/reminder.ex +++ b/test/support/models/polymorphic/reminder.ex @@ -20,6 +20,23 @@ defmodule PolymorphicEmbed.Reminder do type_field: :my_type_field ) + polymorphic_embeds_one(:channel2, + types: [ + sms: PolymorphicEmbed.Channel.SMS, + email: PolymorphicEmbed.Channel.Email + ], + on_replace: :update + ) + + polymorphic_embeds_one(:channel3, + types: [ + sms: PolymorphicEmbed.Channel.SMS, + email: PolymorphicEmbed.Channel.Email + ], + on_replace: :update, + type_field: :my_type_field + ) + polymorphic_embeds_many(:contexts, types: [ location: PolymorphicEmbed.Reminder.Context.Location, From 7c8871b3190b204d9828630b852c9b4a2710904d Mon Sep 17 00:00:00 2001 From: Mathias Polligkeit Date: Sun, 13 Nov 2022 15:38:44 +0900 Subject: [PATCH 02/15] ignore .elixir_ls folder --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index 03d70f1..0993e91 100644 --- a/.gitignore +++ b/.gitignore @@ -28,3 +28,5 @@ polymorphic_embed-*.tar # Ignore Dialyzer plts file .plts + +.elixir_ls From 27c2668238b29eb10f1148691d260d0497933613 Mon Sep 17 00:00:00 2001 From: Mathias Polligkeit Date: Sun, 13 Nov 2022 15:46:38 +0900 Subject: [PATCH 03/15] split CI workflow --- .github/workflows/ci.yml | 38 +++++++++++++++++++++++++++++++++++--- 1 file changed, 35 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 5931fef..3147b33 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,5 +1,9 @@ name: CI +env: + ELIXIR_VERSION: "1.14" + OTP_VERSION: "25.1" + on: push: branches: @@ -11,7 +15,7 @@ on: jobs: test: runs-on: ubuntu-latest - name: OTP ${{matrix.otp}} / Elixir ${{matrix.elixir}} + name: Test OTP ${{matrix.otp}} / Elixir ${{matrix.elixir}} strategy: matrix: otp: ["24.3", "25.1"] @@ -39,6 +43,7 @@ jobs: steps: - uses: actions/checkout@v3 - uses: erlef/setup-beam@v1 + id: beam with: otp-version: ${{matrix.otp}} elixir-version: ${{matrix.elixir}} @@ -50,6 +55,35 @@ jobs: deps key: ${{ runner.os }}-otp-${{ steps.beam.outputs.otp-version }}-elixir-${{ steps.beam.outputs.elixir-version }}-mix-${{ hashFiles('mix.lock') }} restore-keys: ${{ runner.os }}-otp-${{ steps.beam.outputs.otp-version }}-elixir-${{ steps.beam.outputs.elixir-version }}- + - name: Install Dependencies + run: | + mix local.rebar --force + mix local.hex --force + mix deps.get + - name: Run Tests + run: mix coveralls.github + + lint: + runs-on: ubuntu-latest + name: Lint + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + steps: + - uses: actions/checkout@v3 + - uses: erlef/setup-beam@v1 + id: beam + with: + otp-version: ${{ env.OTP_VERSION }} + elixir-version: ${{ env.ELIXIR_VERSION}} + - name: Restore dependencies and build cache + uses: actions/cache@v3 + with: + path: | + _build + deps + key: ${{ runner.os }}-otp-${{ steps.beam.outputs.otp-version }}-elixir-${{ steps.beam.outputs.elixir-version }}-mix-${{ hashFiles('mix.lock') }} + restore-keys: ${{ runner.os }}-otp-${{ steps.beam.outputs.otp-version }}-elixir-${{ steps.beam.outputs.elixir-version }}- - name: Restore PLT cache uses: actions/cache@v3 id: plt_cache @@ -75,5 +109,3 @@ jobs: run: mix hex.audit - name: Generate docs run: mix docs - - name: Run Tests - run: mix coveralls.github From 6d6cb78e6b7ea020b48f18fb13efd3645002f5b9 Mon Sep 17 00:00:00 2001 From: Mathias Polligkeit Date: Sun, 9 Oct 2022 18:39:55 +0900 Subject: [PATCH 04/15] add tests for rendering hidden inputs for custom type field --- test/polymorphic_embed_test.exs | 71 ++++++++++++++++++++++++++++++++- 1 file changed, 69 insertions(+), 2 deletions(-) diff --git a/test/polymorphic_embed_test.exs b/test/polymorphic_embed_test.exs index 87377e6..5b05065 100644 --- a/test/polymorphic_embed_test.exs +++ b/test/polymorphic_embed_test.exs @@ -1582,7 +1582,7 @@ defmodule PolymorphicEmbedTest do end describe "polymorphic_embed_inputs_for/2" do - test "generates forms that can be rendered" do + test "generates forms that can be rendered (custom type field/identify_by_fields)" do reminder_module = get_module(Reminder, :polymorphic) attrs = %{ @@ -1606,14 +1606,81 @@ defmodule PolymorphicEmbedTest do %{changeset: changeset, field: :channel} ) |> Floki.parse_fragment!() + |> dbg() - assert [input] = Floki.find(html, "#reminder_channel___type__") + assert [input] = Floki.find(html, "#reminder_channel_my_type_field") + assert Floki.attribute(input, "name") == ["reminder[channel][my_type_field]"] assert Floki.attribute(input, "type") == ["hidden"] assert Floki.attribute(input, "value") == ["email"] assert [input] = Floki.find(html, "#reminder_channel_number") assert Floki.attribute(input, "type") == ["text"] end + + test "generates forms that can be rendered (custom type field)" do + reminder_module = get_module(Reminder, :polymorphic) + + attrs = %{ + date: ~U[2020-05-28 02:57:19Z], + text: "This is an Email reminder", + channel3: %{ + my_type_field: "email" + } + } + + changeset = + reminder_module + |> struct() + |> reminder_module.changeset(attrs) + + html = + render_component( + &liveview_form/1, + %{changeset: changeset, field: :channel3} + ) + |> Floki.parse_fragment!() + |> dbg() + + assert [input] = Floki.find(html, "#reminder_channel3_my_type_field") + assert Floki.attribute(input, "name") == ["reminder[channel3][my_type_field]"] + assert Floki.attribute(input, "type") == ["hidden"] + assert Floki.attribute(input, "value") == ["email"] + end + + test "generates forms that can be rendered (default type field)" do + reminder_module = get_module(Reminder, :polymorphic) + + attrs = %{ + date: ~U[2020-05-28 02:57:19Z], + text: "This is an Email reminder", + channel2: %{ + __type__: "email", + address: "a", + valid: true, + confirmed: true + } + } + + changeset = + reminder_module + |> struct() + |> reminder_module.changeset(attrs) + + html = + render_component( + &liveview_form/1, + %{changeset: changeset, field: :channel2} + ) + |> Floki.parse_fragment!() + + assert [input] = Floki.find(html, "#reminder_channel2___type__") + assert Floki.attribute(input, "name") == ["reminder[channel2][__type__]"] + assert Floki.attribute(input, "type") == ["hidden"] + assert Floki.attribute(input, "value") == ["email"] + + assert [input] = Floki.find(html, "#reminder_channel2_number") + assert Floki.attribute(input, "type") == ["text"] + end end test "inputs_for/4" do From 26e3300df4072a1ba3f4e862f161e8d6a9ac7f74 Mon Sep 17 00:00:00 2001 From: Steffen Deusch Date: Wed, 7 Dec 2022 22:58:33 +0100 Subject: [PATCH 05/15] finish implementation of hidden input name hidden-input-for-type --- lib/polymorphic_embed.ex | 8 ++++++-- lib/polymorphic_embed/html/form.ex | 5 ++++- test/polymorphic_embed_test.exs | 9 ++++----- 3 files changed, 14 insertions(+), 8 deletions(-) diff --git a/lib/polymorphic_embed.ex b/lib/polymorphic_embed.ex index d6ebfa4..d44d49a 100644 --- a/lib/polymorphic_embed.ex +++ b/lib/polymorphic_embed.ex @@ -46,11 +46,14 @@ defmodule PolymorphicEmbed do } end) + type_field = Keyword.get(opts, :type_field, :__type__) + %{ default: Keyword.get(opts, :default, nil), on_replace: Keyword.fetch!(opts, :on_replace), on_type_not_found: Keyword.get(opts, :on_type_not_found, :changeset_error), - type_field: Keyword.get(opts, :type_field, :__type__) |> to_string(), + type_field: type_field |> to_string(), + type_field_atom: type_field, types_metadata: types_metadata } end @@ -384,7 +387,8 @@ defmodule PolymorphicEmbed do Enum.find(types_metadata, &(type == to_string(&1.type))) end - defp get_field_options(schema, field) do + @doc false + def get_field_options(schema, field) do try do schema.__schema__(:type, field) rescue diff --git a/lib/polymorphic_embed/html/form.ex b/lib/polymorphic_embed/html/form.ex index 767626b..398229c 100644 --- a/lib/polymorphic_embed/html/form.ex +++ b/lib/polymorphic_embed/html/form.ex @@ -153,6 +153,9 @@ if Code.ensure_loaded?(Phoenix.HTML) && Code.ensure_loaded?(Phoenix.HTML.Form) d valid?: errors == [] } + %schema{} = form.source.data + %{type_field_atom: type_field} = PolymorphicEmbed.get_field_options(schema, field) + %Phoenix.HTML.Form{ source: changeset, impl: Phoenix.HTML.FormData.Ecto.Changeset, @@ -162,7 +165,7 @@ if Code.ensure_loaded?(Phoenix.HTML) && Code.ensure_loaded?(Phoenix.HTML.Form) d errors: errors, data: data, params: params, - hidden: [__type__: to_string(type)], + hidden: [{type_field, to_string(type)}], options: options } end) diff --git a/test/polymorphic_embed_test.exs b/test/polymorphic_embed_test.exs index 5b05065..893aae2 100644 --- a/test/polymorphic_embed_test.exs +++ b/test/polymorphic_embed_test.exs @@ -1606,7 +1606,6 @@ defmodule PolymorphicEmbedTest do %{changeset: changeset, field: :channel} ) |> Floki.parse_fragment!() - |> dbg() assert [input] = Floki.find(html, "#reminder_channel_my_type_field") assert Floki.attribute(input, "name") == ["reminder[channel][my_type_field]"] @@ -1711,7 +1710,7 @@ defmodule PolymorphicEmbedTest do expected_contents = if(polymorphic?(generator), do: - ~s(), + ~s(), else: ~s() ) @@ -1732,7 +1731,7 @@ defmodule PolymorphicEmbedTest do expected_contents = if(polymorphic?(generator), do: - ~s(), + ~s(), else: ~s() ) @@ -1774,7 +1773,7 @@ defmodule PolymorphicEmbedTest do expected_contents = if(polymorphic?(generator), do: - ~s(), + ~s(), else: ~s() ) @@ -1795,7 +1794,7 @@ defmodule PolymorphicEmbedTest do expected_contents = if(polymorphic?(generator), do: - ~s(), + ~s(), else: ~s() ) From 16f010130e2e7e8ddb3d1dab2c184aae13ab14ea Mon Sep 17 00:00:00 2001 From: Mathias Polligkeit Date: Thu, 16 Mar 2023 21:43:28 +0900 Subject: [PATCH 06/15] remove dbg --- test/polymorphic_embed_test.exs | 1 - 1 file changed, 1 deletion(-) diff --git a/test/polymorphic_embed_test.exs b/test/polymorphic_embed_test.exs index 893aae2..f7615be 100644 --- a/test/polymorphic_embed_test.exs +++ b/test/polymorphic_embed_test.exs @@ -1638,7 +1638,6 @@ defmodule PolymorphicEmbedTest do %{changeset: changeset, field: :channel3} ) |> Floki.parse_fragment!() - |> dbg() assert [input] = Floki.find(html, "#reminder_channel3_my_type_field") assert Floki.attribute(input, "name") == ["reminder[channel3][my_type_field]"] From 01afba5341f2e60e0af2dbbc947b55ce664005bc Mon Sep 17 00:00:00 2001 From: Mathias Polligkeit Date: Tue, 20 Feb 2024 17:07:18 +0900 Subject: [PATCH 07/15] update credo to 1.7.4 --- mix.lock | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/mix.lock b/mix.lock index 7a1ba79..877f515 100644 --- a/mix.lock +++ b/mix.lock @@ -1,11 +1,11 @@ %{ - "bunt": {:hex, :bunt, "0.2.1", "e2d4792f7bc0ced7583ab54922808919518d0e57ee162901a16a1b6664ef3b14", [:mix], [], "hexpm", "a330bfb4245239787b15005e66ae6845c9cd524a288f0d141c148b02603777a5"}, + "bunt": {:hex, :bunt, "1.0.0", "081c2c665f086849e6d57900292b3a161727ab40431219529f13c4ddcf3e7a44", [:mix], [], "hexpm", "dc5f86aa08a5f6fa6b8096f0735c4e76d54ae5c9fa2c143e5a1fc7c1cd9bb6b5"}, "castore": {:hex, :castore, "0.1.18", "deb5b9ab02400561b6f5708f3e7660fc35ca2d51bfc6a940d2f513f89c2975fc", [:mix], [], "hexpm", "61bbaf6452b782ef80b33cdb45701afbcf0a918a45ebe7e73f1130d661e66a06"}, "certifi": {:hex, :certifi, "2.9.0", "6f2a475689dd47f19fb74334859d460a2dc4e3252a3324bd2111b8f0429e7e21", [:rebar3], [], "hexpm", "266da46bdb06d6c6d35fde799bcb28d36d985d424ad7c08b5bb48f5b5cdd4641"}, "connection": {:hex, :connection, "1.1.0", "ff2a49c4b75b6fb3e674bfc5536451607270aac754ffd1bdfe175abe4a6d7a68", [:mix], [], "hexpm", "722c1eb0a418fbe91ba7bd59a47e28008a189d47e37e0e7bb85585a016b2869c"}, - "credo": {:hex, :credo, "1.6.7", "323f5734350fd23a456f2688b9430e7d517afb313fbd38671b8a4449798a7854", [: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", "41e110bfb007f7eda7f897c10bf019ceab9a0b269ce79f015d54b0dcf4fc7dd3"}, + "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.4.2", "f92e79aff2375299a16bcb069a14ee8615c3414863a6fef93156aee8e86c2ff3", [:mix], [{:connection, "~> 1.0", [hex: :connection, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "4fe53ca91b99f55ea249693a0229356a08f4d1a7931d8ffa79289b145fe83668"}, - "decimal": {:hex, :decimal, "2.0.0", "a78296e617b0f5dd4c6caf57c714431347912ffb1d0842e998e9792b5642d697", [:mix], [], "hexpm", "34666e9c55dea81013e77d9d87370fe6cb6291d1ef32f46a1600230b1d44f577"}, + "decimal": {:hex, :decimal, "2.1.1", "5611dca5d4b2c3dd497dec8f68751f1f1a54755e8ed2a966c2633cf885973ad6", [:mix], [], "hexpm", "53cfe5f497ed0e7771ae1a475575603d77425099ba5faef9394932b35020ffcc"}, "dialyxir": {:hex, :dialyxir, "1.2.0", "58344b3e87c2e7095304c81a9ae65cb68b613e28340690dfe1a5597fd08dec37", [:mix], [{:erlex, ">= 0.2.6", [hex: :erlex, repo: "hexpm", optional: false]}], "hexpm", "61072136427a851674cab81762be4dbeae7679f85b1272b6d25c3a839aff8463"}, "earmark_parser": {:hex, :earmark_parser, "1.4.27", "755da957e2b980618ba3397d3f923004d85bac244818cf92544eaa38585cb3a8", [:mix], [], "hexpm", "8d02465c243ee96bdd655e7c9a91817a2a80223d63743545b2861023c4ff39ac"}, "ecto": {:hex, :ecto, "3.9.0", "7c74fc0d950a700eb7019057ff32d047ed7f19b57c1b2ca260cf0e565829101d", [: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", "fed5ebc5831378b916afd0b5852a0c5bb3e7390665cc2b0ec8ab0c712495b73d"}, @@ -13,12 +13,12 @@ "erlex": {:hex, :erlex, "0.2.6", "c7987d15e899c7a2f34f5420d2a2ea0d659682c06ac607572df55a43753aa12e", [:mix], [], "hexpm", "2ed2e25711feb44d52b17d2780eabf998452f6efda104877a3881c2f8c0c0c75"}, "ex_doc": {:hex, :ex_doc, "0.28.5", "3e52a6d2130ce74d096859e477b97080c156d0926701c13870a4e1f752363279", [:mix], [{:earmark_parser, "~> 1.4.19", [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", "d2c4b07133113e9aa3e9ba27efb9088ba900e9e51caa383919676afdf09ab181"}, "excoveralls": {:hex, :excoveralls, "0.15.0", "ac941bf85f9f201a9626cc42b2232b251ad8738da993cf406a4290cacf562ea4", [:mix], [{:hackney, "~> 1.16", [hex: :hackney, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "9631912006b27eca30a2f3c93562bc7ae15980afb014ceb8147dc5cdd8f376f1"}, - "file_system": {:hex, :file_system, "0.2.10", "fb082005a9cd1711c05b5248710f8826b02d7d1784e7c3451f9c1231d4fc162d", [:mix], [], "hexpm", "41195edbfb562a593726eda3b3e8b103a309b733ad25f3d642ba49696bf715dc"}, + "file_system": {:hex, :file_system, "1.0.0", "b689cc7dcee665f774de94b5a832e578bd7963c8e637ef940cd44327db7de2cd", [:mix], [], "hexpm", "6752092d66aec5a10e662aefeed8ddb9531d79db0bc145bb8c40325ca1d8536d"}, "floki": {:hex, :floki, "0.33.1", "f20f1eb471e726342b45ccb68edb9486729e7df94da403936ea94a794f072781", [:mix], [{:html_entities, "~> 0.5.0", [hex: :html_entities, repo: "hexpm", optional: false]}], "hexpm", "461035fd125f13fdf30f243c85a0b1e50afbec876cbf1ceefe6fddd2e6d712c6"}, "hackney": {:hex, :hackney, "1.18.1", "f48bf88f521f2a229fc7bae88cf4f85adc9cd9bcf23b5dc8eb6a1788c662c4f6", [:rebar3], [{:certifi, "~>2.9.0", [hex: :certifi, repo: "hexpm", optional: false]}, {:idna, "~>6.1.0", [hex: :idna, repo: "hexpm", optional: false]}, {:metrics, "~>1.0.0", [hex: :metrics, repo: "hexpm", optional: false]}, {:mimerl, "~>1.1", [hex: :mimerl, repo: "hexpm", optional: false]}, {:parse_trans, "3.3.1", [hex: :parse_trans, repo: "hexpm", optional: false]}, {:ssl_verify_fun, "~>1.1.0", [hex: :ssl_verify_fun, repo: "hexpm", optional: false]}, {:unicode_util_compat, "~>0.7.0", [hex: :unicode_util_compat, repo: "hexpm", optional: false]}], "hexpm", "a4ecdaff44297e9b5894ae499e9a070ea1888c84afdd1fd9b7b2bc384950128e"}, "html_entities": {:hex, :html_entities, "0.5.2", "9e47e70598da7de2a9ff6af8758399251db6dbb7eebe2b013f2bbd2515895c3c", [:mix], [], "hexpm", "c53ba390403485615623b9531e97696f076ed415e8d8058b1dbaa28181f4fdcc"}, "idna": {:hex, :idna, "6.1.1", "8a63070e9f7d0c62eb9d9fcb360a7de382448200fbbd1b106cc96d3d8099df8d", [:rebar3], [{:unicode_util_compat, "~>0.7.0", [hex: :unicode_util_compat, repo: "hexpm", optional: false]}], "hexpm", "92376eb7894412ed19ac475e4a86f7b413c1b9fbb5bd16dccd57934157944cea"}, - "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"}, "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"}, From f527e9db20e152ba5e23a7e93851feb95174f869 Mon Sep 17 00:00:00 2001 From: Mathias Polligkeit Date: Tue, 20 Feb 2024 17:10:51 +0900 Subject: [PATCH 08/15] update dependencies --- mix.exs | 6 ++-- mix.lock | 62 ++++++++++++++------------------- test/polymorphic_embed_test.exs | 2 +- 3 files changed, 31 insertions(+), 39 deletions(-) diff --git a/mix.exs b/mix.exs index 9e50af8..31ee8be 100644 --- a/mix.exs +++ b/mix.exs @@ -47,7 +47,7 @@ defmodule PolymorphicEmbed.MixProject do defp deps do [ - {:ecto, "~> 3.9"}, + {:ecto, "~> 3.11"}, {:jason, "~> 1.4"}, {:phoenix_html, "~> 2.14 or ~> 3.2", optional: true}, {:ex_doc, "~> 0.28", only: :dev}, @@ -55,11 +55,11 @@ defmodule PolymorphicEmbed.MixProject do {:postgrex, "~> 0.16", only: :test}, {:query_builder, "~> 1.0", only: :test}, {:phoenix_ecto, "~> 4.4", only: :test}, - {:phoenix_live_view, "~> 0.18", only: :test}, + {:phoenix_live_view, "~> 0.20", only: :test}, {:floki, "~> 0.33", only: :test}, {:dialyxir, "~> 1.0", only: [:dev, :test], runtime: false}, {:excoveralls, "~> 0.15", only: :test}, - {:credo, "~> 1.6", only: [:dev, :test], runtime: false} + {:credo, "~> 1.7", only: [:dev, :test], runtime: false} ] end diff --git a/mix.lock b/mix.lock index 877f515..0159a3c 100644 --- a/mix.lock +++ b/mix.lock @@ -1,43 +1,35 @@ %{ "bunt": {:hex, :bunt, "1.0.0", "081c2c665f086849e6d57900292b3a161727ab40431219529f13c4ddcf3e7a44", [:mix], [], "hexpm", "dc5f86aa08a5f6fa6b8096f0735c4e76d54ae5c9fa2c143e5a1fc7c1cd9bb6b5"}, - "castore": {:hex, :castore, "0.1.18", "deb5b9ab02400561b6f5708f3e7660fc35ca2d51bfc6a940d2f513f89c2975fc", [:mix], [], "hexpm", "61bbaf6452b782ef80b33cdb45701afbcf0a918a45ebe7e73f1130d661e66a06"}, - "certifi": {:hex, :certifi, "2.9.0", "6f2a475689dd47f19fb74334859d460a2dc4e3252a3324bd2111b8f0429e7e21", [:rebar3], [], "hexpm", "266da46bdb06d6c6d35fde799bcb28d36d985d424ad7c08b5bb48f5b5cdd4641"}, - "connection": {:hex, :connection, "1.1.0", "ff2a49c4b75b6fb3e674bfc5536451607270aac754ffd1bdfe175abe4a6d7a68", [:mix], [], "hexpm", "722c1eb0a418fbe91ba7bd59a47e28008a189d47e37e0e7bb85585a016b2869c"}, + "castore": {:hex, :castore, "1.0.5", "9eeebb394cc9a0f3ae56b813459f990abb0a3dedee1be6b27fdb50301930502f", [:mix], [], "hexpm", "8d7c597c3e4a64c395980882d4bca3cebb8d74197c590dc272cfd3b6a6310578"}, "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.4.2", "f92e79aff2375299a16bcb069a14ee8615c3414863a6fef93156aee8e86c2ff3", [:mix], [{:connection, "~> 1.0", [hex: :connection, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "4fe53ca91b99f55ea249693a0229356a08f4d1a7931d8ffa79289b145fe83668"}, + "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"}, - "dialyxir": {:hex, :dialyxir, "1.2.0", "58344b3e87c2e7095304c81a9ae65cb68b613e28340690dfe1a5597fd08dec37", [:mix], [{:erlex, ">= 0.2.6", [hex: :erlex, repo: "hexpm", optional: false]}], "hexpm", "61072136427a851674cab81762be4dbeae7679f85b1272b6d25c3a839aff8463"}, - "earmark_parser": {:hex, :earmark_parser, "1.4.27", "755da957e2b980618ba3397d3f923004d85bac244818cf92544eaa38585cb3a8", [:mix], [], "hexpm", "8d02465c243ee96bdd655e7c9a91817a2a80223d63743545b2861023c4ff39ac"}, - "ecto": {:hex, :ecto, "3.9.0", "7c74fc0d950a700eb7019057ff32d047ed7f19b57c1b2ca260cf0e565829101d", [: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", "fed5ebc5831378b916afd0b5852a0c5bb3e7390665cc2b0ec8ab0c712495b73d"}, - "ecto_sql": {:hex, :ecto_sql, "3.9.0", "2bb21210a2a13317e098a420a8c1cc58b0c3421ab8e3acfa96417dab7817918c", [:mix], [{:db_connection, "~> 2.5 or ~> 2.4.1", [hex: :db_connection, repo: "hexpm", optional: false]}, {:ecto, "~> 3.9.0", [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", "a8f3f720073b8b1ac4c978be25fa7960ed7fd44997420c304a4a2e200b596453"}, + "dialyxir": {:hex, :dialyxir, "1.4.3", "edd0124f358f0b9e95bfe53a9fcf806d615d8f838e2202a9f430d59566b6b53b", [:mix], [{:erlex, ">= 0.2.6", [hex: :erlex, repo: "hexpm", optional: false]}], "hexpm", "bf2cfb75cd5c5006bec30141b131663299c661a864ec7fbbc72dfa557487a986"}, + "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"}, "erlex": {:hex, :erlex, "0.2.6", "c7987d15e899c7a2f34f5420d2a2ea0d659682c06ac607572df55a43753aa12e", [:mix], [], "hexpm", "2ed2e25711feb44d52b17d2780eabf998452f6efda104877a3881c2f8c0c0c75"}, - "ex_doc": {:hex, :ex_doc, "0.28.5", "3e52a6d2130ce74d096859e477b97080c156d0926701c13870a4e1f752363279", [:mix], [{:earmark_parser, "~> 1.4.19", [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", "d2c4b07133113e9aa3e9ba27efb9088ba900e9e51caa383919676afdf09ab181"}, - "excoveralls": {:hex, :excoveralls, "0.15.0", "ac941bf85f9f201a9626cc42b2232b251ad8738da993cf406a4290cacf562ea4", [:mix], [{:hackney, "~> 1.16", [hex: :hackney, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "9631912006b27eca30a2f3c93562bc7ae15980afb014ceb8147dc5cdd8f376f1"}, + "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"}, + "excoveralls": {:hex, :excoveralls, "0.18.0", "b92497e69465dc51bc37a6422226ee690ab437e4c06877e836f1c18daeb35da9", [:mix], [{:castore, "~> 1.0", [hex: :castore, repo: "hexpm", optional: true]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "1109bb911f3cb583401760be49c02cbbd16aed66ea9509fc5479335d284da60b"}, "file_system": {:hex, :file_system, "1.0.0", "b689cc7dcee665f774de94b5a832e578bd7963c8e637ef940cd44327db7de2cd", [:mix], [], "hexpm", "6752092d66aec5a10e662aefeed8ddb9531d79db0bc145bb8c40325ca1d8536d"}, - "floki": {:hex, :floki, "0.33.1", "f20f1eb471e726342b45ccb68edb9486729e7df94da403936ea94a794f072781", [:mix], [{:html_entities, "~> 0.5.0", [hex: :html_entities, repo: "hexpm", optional: false]}], "hexpm", "461035fd125f13fdf30f243c85a0b1e50afbec876cbf1ceefe6fddd2e6d712c6"}, - "hackney": {:hex, :hackney, "1.18.1", "f48bf88f521f2a229fc7bae88cf4f85adc9cd9bcf23b5dc8eb6a1788c662c4f6", [:rebar3], [{:certifi, "~>2.9.0", [hex: :certifi, repo: "hexpm", optional: false]}, {:idna, "~>6.1.0", [hex: :idna, repo: "hexpm", optional: false]}, {:metrics, "~>1.0.0", [hex: :metrics, repo: "hexpm", optional: false]}, {:mimerl, "~>1.1", [hex: :mimerl, repo: "hexpm", optional: false]}, {:parse_trans, "3.3.1", [hex: :parse_trans, repo: "hexpm", optional: false]}, {:ssl_verify_fun, "~>1.1.0", [hex: :ssl_verify_fun, repo: "hexpm", optional: false]}, {:unicode_util_compat, "~>0.7.0", [hex: :unicode_util_compat, repo: "hexpm", optional: false]}], "hexpm", "a4ecdaff44297e9b5894ae499e9a070ea1888c84afdd1fd9b7b2bc384950128e"}, - "html_entities": {:hex, :html_entities, "0.5.2", "9e47e70598da7de2a9ff6af8758399251db6dbb7eebe2b013f2bbd2515895c3c", [:mix], [], "hexpm", "c53ba390403485615623b9531e97696f076ed415e8d8058b1dbaa28181f4fdcc"}, - "idna": {:hex, :idna, "6.1.1", "8a63070e9f7d0c62eb9d9fcb360a7de382448200fbbd1b106cc96d3d8099df8d", [:rebar3], [{:unicode_util_compat, "~>0.7.0", [hex: :unicode_util_compat, repo: "hexpm", optional: false]}], "hexpm", "92376eb7894412ed19ac475e4a86f7b413c1b9fbb5bd16dccd57934157944cea"}, + "floki": {:hex, :floki, "0.35.4", "cc947b446024732c07274ac656600c5c4dc014caa1f8fb2dfff93d275b83890d", [:mix], [], "hexpm", "27fa185d3469bd8fc5947ef0f8d5c4e47f0af02eb6b070b63c868f69e3af0204"}, "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.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"}, - "metrics": {:hex, :metrics, "1.0.1", "25f094dea2cda98213cecc3aeff09e940299d950904393b2a29d191c346a8486", [:rebar3], [], "hexpm", "69b09adddc4f74a40716ae54d140f93beb0fb8978d8636eaded0c31b6f099f16"}, - "mime": {:hex, :mime, "2.0.3", "3676436d3d1f7b81b5a2d2bd8405f412c677558c81b1c92be58c00562bb59095", [:mix], [], "hexpm", "27a30bf0db44d25eecba73755acf4068cbfe26a4372f9eb3e4ea3a45956bff6b"}, - "mimerl": {:hex, :mimerl, "1.2.0", "67e2d3f571088d5cfd3e550c383094b47159f3eee8ffa08e64106cdf5e981be3", [:rebar3], [], "hexpm", "f278585650aa581986264638ebf698f8bb19df297f66ad91b18910dfc6e19323"}, - "nimble_parsec": {:hex, :nimble_parsec, "1.2.3", "244836e6e3f1200c7f30cb56733fd808744eca61fd182f731eac4af635cc6d0b", [:mix], [], "hexpm", "c8d789e39b9131acf7b99291e93dae60ab48ef14a7ee9d58c6964f59efb570b0"}, - "parse_trans": {:hex, :parse_trans, "3.3.1", "16328ab840cc09919bd10dab29e431da3af9e9e7e7e6f0089dd5a2d2820011d8", [:rebar3], [], "hexpm", "07cd9577885f56362d414e8c4c4e6bdf10d43a8767abb92d24cbe8b24c54888b"}, - "phoenix": {:hex, :phoenix, "1.6.13", "5b3152907afdb8d3a6cdafb4b149e8aa7aabbf1422fd9f7ef4c2a67ead57d24a", [: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", [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", "13d8806c31176e2066da4df2d7443c144211305c506ed110ad4044335b90171d"}, - "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.2.0", "1c1219d4b6cb22ac72f12f73dc5fad6c7563104d083f711c3fcd8551a1f4ae11", [:mix], [{:plug, "~> 1.5", [hex: :plug, repo: "hexpm", optional: true]}], "hexpm", "36ec97ba56d25c0136ef1992c37957e4246b649d620958a1f9fa86165f8bc54f"}, - "phoenix_live_view": {:hex, :phoenix_live_view, "0.18.1", "1e1703e26d0580dbd84e9b668e6da164a368f125dfa3d813c9a098da508e2a72", [:mix], [{:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:phoenix, "~> 1.6 or ~> 1.7", [hex: :phoenix, repo: "hexpm", optional: false]}, {:phoenix_html, "~> 3.1", [hex: :phoenix_html, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4.2 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "b785e1cc13b05e6d9482d3ca1eedfb24e8113fd6421b47996ba16b9d20869706"}, - "phoenix_pubsub": {:hex, :phoenix_pubsub, "2.1.1", "ba04e489ef03763bf28a17eb2eaddc2c20c6d217e2150a61e3298b0f4c2012b5", [:mix], [], "hexpm", "81367c6d1eea5878ad726be80808eb5a787a23dee699f96e72b1109c57cdd8d9"}, - "phoenix_view": {:hex, :phoenix_view, "1.1.2", "1b82764a065fb41051637872c7bd07ed2fdb6f5c3bd89684d4dca6e10115c95a", [:mix], [{:phoenix_html, "~> 2.14.2 or ~> 3.0", [hex: :phoenix_html, repo: "hexpm", optional: true]}], "hexpm", "7ae90ad27b09091266f6adbb61e1d2516a7c3d7062c6789d46a7554ec40f3a56"}, - "plug": {:hex, :plug, "1.13.6", "187beb6b67c6cec50503e940f0434ea4692b19384d47e5fdfd701e93cadb4cc2", [: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", "02b9c6b9955bce92c829f31d6284bf53c591ca63c4fb9ff81dfd0418667a34ff"}, - "plug_crypto": {:hex, :plug_crypto, "1.2.3", "8f77d13aeb32bfd9e654cb68f0af517b371fb34c56c9f2b58fe3df1235c1251a", [:mix], [], "hexpm", "b5672099c6ad5c202c45f5a403f21a3411247f164e4a8fab056e5cd8a290f4a2"}, - "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"}, - "query_builder": {:hex, :query_builder, "1.0.1", "88fac8ec002825a54a5ef2739bbef12a870098efc5e609e3baf02a2bdda6f31e", [:mix], [{:ecto, "~> 3.5", [hex: :ecto, repo: "hexpm", optional: false]}], "hexpm", "c6afbc439a5d825e95b938cef23bf0632d546a1507ee4b07d20098be44b98176"}, - "ssl_verify_fun": {:hex, :ssl_verify_fun, "1.1.6", "cf344f5692c82d2cd7554f5ec8fd961548d4fd09e7d22f5b62482e5aeaebd4b0", [:make, :mix, :rebar3], [], "hexpm", "bdb0d2471f453c88ff3908e7686f86f9be327d065cc1ec16fa4540197ea04680"}, - "telemetry": {:hex, :telemetry, "1.1.0", "a589817034a27eab11144ad24d5c0f9fab1f58173274b1e9bae7074af9cbee51", [:rebar3], [], "hexpm", "b727b2a1f75614774cff2d7565b64d0dfa5bd52ba517f16543e6fc7efcc0df48"}, - "unicode_util_compat": {:hex, :unicode_util_compat, "0.7.0", "bc84380c9ab48177092f43ac89e4dfa2c6d62b40b8bd132b1059ecc7232f9a78", [:rebar3], [], "hexpm", "25eee6d67df61960cf6a794239566599b09e17e668d3700247bc498638152521"}, + "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, "3.3.3", "380b8fb45912b5638d2f1d925a3771b4516b9a78587249cabe394e0a5d579dc9", [:mix], [{:plug, "~> 1.5", [hex: :plug, repo: "hexpm", optional: true]}], "hexpm", "923ebe6fec6e2e3b3e569dfbdc6560de932cd54b000ada0208b5f45024bdd76c"}, + "phoenix_live_view": {:hex, :phoenix_live_view, "0.20.9", "46d5d436d3f8ff97f066b6c45528fd842a711fd3875b2d3f706b2e769ea07c51", [: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", "694388615ece21b70c523910cba1c633132b08a270caaf60100dd4eaf331885d"}, + "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"}, + "query_builder": {:hex, :query_builder, "1.4.2", "5a61c63e5ea7093d110589aacf081362e2fe8ae0188644732edd02b1230a7be5", [:mix], [{:ecto, "~> 3.10", [hex: :ecto, repo: "hexpm", optional: false]}, {:jason, "~> 1.4", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "abffaf756a5fdfd37bd594455e00083649a4f01e436279865592ccb8115dd739"}, + "telemetry": {:hex, :telemetry, "1.2.1", "68fdfe8d8f05a8428483a97d7aab2f268aaff24b49e0f599faa091f1d4e7f61c", [:rebar3], [], "hexpm", "dad9ce9d8effc621708f99eac538ef1cbe05d6a874dd741de2e689c47feafed5"}, + "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"}, } diff --git a/test/polymorphic_embed_test.exs b/test/polymorphic_embed_test.exs index f7615be..f6e5190 100644 --- a/test/polymorphic_embed_test.exs +++ b/test/polymorphic_embed_test.exs @@ -2346,7 +2346,7 @@ defmodule PolymorphicEmbedTest do defp liveview_form(assigns) do ~H""" <.form - let={f} + :let={f} for={@changeset} > <%= for sms_form <- polymorphic_embed_inputs_for f, @field do %> From 048313ec49bc0b8e2090998746af61d2e4c3044d Mon Sep 17 00:00:00 2001 From: Mathias Polligkeit Date: Tue, 20 Feb 2024 17:15:55 +0900 Subject: [PATCH 09/15] fix warnings, rename variables --- config/test.exs | 2 +- .../support/models/not_polymorphic/reminder.ex | 18 ++++++++++-------- 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/config/test.exs b/config/test.exs index 8489bba..5368763 100644 --- a/config/test.exs +++ b/config/test.exs @@ -1,6 +1,6 @@ import Config -config :logger, level: :warn +config :logger, level: :warning config :phoenix, :json_library, Jason diff --git a/test/support/models/not_polymorphic/reminder.ex b/test/support/models/not_polymorphic/reminder.ex index 026b6da..bbc0832 100644 --- a/test/support/models/not_polymorphic/reminder.ex +++ b/test/support/models/not_polymorphic/reminder.ex @@ -9,31 +9,33 @@ defmodule PolymorphicEmbed.Regular.Reminder do embeds_one(:channel, PolymorphicEmbed.Regular.Channel.SMS, on_replace: :update) - embeds_many(:contexts, PolymorphicEmbed.Regular.Reminder.Context.Location, on_replace: :delete) + embeds_many(:contexts, PolymorphicEmbed.Regular.Reminder.Context.Location, + on_replace: :delete + ) timestamps() end - def changeset(struct, values) do + def changeset(struct, attrs) do struct - |> cast(values, [:date, :text]) + |> cast(attrs, [:date, :text]) |> validate_required(:date) |> cast_embed(:channel) |> cast_embed(:contexts) end - def custom_changeset(struct, values) do + def custom_changeset(struct, attrs) do struct - |> cast(values, [:date, :text]) + |> cast(attrs, [:date, :text]) |> cast_embed(:channel, - with: {PolymorphicEmbed.Regular.Channel.SMS, :custom_changeset, ["foo", "bar"]} + with: &PolymorphicEmbed.Regular.Channel.SMS.custom_changeset(&1, &2, "foo", "bar") ) |> validate_required(:date) end - def custom_changeset2(struct, values) do + def custom_changeset2(struct, attrs) do struct - |> cast(values, [:date, :text]) + |> cast(attrs, [:date, :text]) |> cast_embed(:channel, with: &PolymorphicEmbed.Regular.Channel.SMS.custom_changeset2/2) |> validate_required(:date) end From 0693a57e8ca35746274f5729946fad9db7a39cdc Mon Sep 17 00:00:00 2001 From: Mathias Polligkeit Date: Tue, 20 Feb 2024 17:21:10 +0900 Subject: [PATCH 10/15] update phoenix_html to 4.0.0 --- lib/polymorphic_embed/html/form.ex | 6 ++++-- mix.exs | 3 ++- mix.lock | 3 ++- test/polymorphic_embed_test.exs | 2 +- 4 files changed, 9 insertions(+), 5 deletions(-) diff --git a/lib/polymorphic_embed/html/form.ex b/lib/polymorphic_embed/html/form.ex index 398229c..0bd78a0 100644 --- a/lib/polymorphic_embed/html/form.ex +++ b/lib/polymorphic_embed/html/form.ex @@ -1,7 +1,9 @@ -if Code.ensure_loaded?(Phoenix.HTML) && Code.ensure_loaded?(Phoenix.HTML.Form) do +if Code.ensure_loaded?(Phoenix.HTML) && Code.ensure_loaded?(Phoenix.HTML.Form) && + Code.ensure_loaded?(PhoenixHTMLHelpers.Form) do defmodule PolymorphicEmbed.HTML.Form do import Phoenix.HTML, only: [html_escape: 1] - import Phoenix.HTML.Form, only: [hidden_inputs_for: 1, input_value: 2] + import Phoenix.HTML.Form, only: [input_value: 2] + import PhoenixHTMLHelpers.Form, only: [hidden_inputs_for: 1] @doc """ Returns the polymorphic type of the given field in the given form data. diff --git a/mix.exs b/mix.exs index 31ee8be..be043b8 100644 --- a/mix.exs +++ b/mix.exs @@ -49,7 +49,8 @@ defmodule PolymorphicEmbed.MixProject do [ {:ecto, "~> 3.11"}, {:jason, "~> 1.4"}, - {:phoenix_html, "~> 2.14 or ~> 3.2", optional: true}, + {:phoenix_html, "~> 4.0", optional: true}, + {:phoenix_html_helpers, "~> 1.0", optional: true}, {:ex_doc, "~> 0.28", only: :dev}, {:ecto_sql, "~> 3.9", only: :test}, {:postgrex, "~> 0.16", only: :test}, diff --git a/mix.lock b/mix.lock index 0159a3c..a8a902b 100644 --- a/mix.lock +++ b/mix.lock @@ -21,7 +21,8 @@ "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, "3.3.3", "380b8fb45912b5638d2f1d925a3771b4516b9a78587249cabe394e0a5d579dc9", [:mix], [{:plug, "~> 1.5", [hex: :plug, repo: "hexpm", optional: true]}], "hexpm", "923ebe6fec6e2e3b3e569dfbdc6560de932cd54b000ada0208b5f45024bdd76c"}, + "phoenix_html": {:hex, :phoenix_html, "4.0.0", "4857ec2edaccd0934a923c2b0ba526c44a173c86b847e8db725172e9e51d11d6", [:mix], [], "hexpm", "cee794a052f243291d92fa3ccabcb4c29bb8d236f655fb03bcbdc3a8214b8d13"}, + "phoenix_html_helpers": {:hex, :phoenix_html_helpers, "1.0.1", "7eed85c52eff80a179391036931791ee5d2f713d76a81d0d2c6ebafe1e11e5ec", [:mix], [{:phoenix_html, "~> 4.0", [hex: :phoenix_html, repo: "hexpm", optional: false]}, {:plug, "~> 1.5", [hex: :plug, repo: "hexpm", optional: true]}], "hexpm", "cffd2385d1fa4f78b04432df69ab8da63dc5cf63e07b713a4dcf36a3740e3090"}, "phoenix_live_view": {:hex, :phoenix_live_view, "0.20.9", "46d5d436d3f8ff97f066b6c45528fd842a711fd3875b2d3f706b2e769ea07c51", [: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", "694388615ece21b70c523910cba1c633132b08a270caaf60100dd4eaf331885d"}, "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"}, diff --git a/test/polymorphic_embed_test.exs b/test/polymorphic_embed_test.exs index f6e5190..b743156 100644 --- a/test/polymorphic_embed_test.exs +++ b/test/polymorphic_embed_test.exs @@ -5,7 +5,7 @@ defmodule PolymorphicEmbedTest do import Phoenix.Component import Phoenix.HTML - import Phoenix.HTML.Form + import PhoenixHTMLHelpers.Form import Phoenix.LiveViewTest import PolymorphicEmbed.HTML.Form From eea054feb2bfb00059a203531e593454abbc6616 Mon Sep 17 00:00:00 2001 From: Mathias Polligkeit Date: Tue, 20 Feb 2024 17:42:04 +0900 Subject: [PATCH 11/15] address credo warnings --- lib/polymorphic_embed.ex | 174 ++++++++++++++++------------- lib/polymorphic_embed/html/form.ex | 3 + 2 files changed, 97 insertions(+), 80 deletions(-) diff --git a/lib/polymorphic_embed.ex b/lib/polymorphic_embed.ex index d44d49a..7c6f174 100644 --- a/lib/polymorphic_embed.ex +++ b/lib/polymorphic_embed.ex @@ -1,6 +1,8 @@ defmodule PolymorphicEmbed do use Ecto.ParameterizedType + alias Ecto.Changeset + defmacro polymorphic_embeds_one(field_name, opts) do quote do field(unquote(field_name), PolymorphicEmbed, unquote(opts)) @@ -70,28 +72,9 @@ defmodule PolymorphicEmbed do required = Keyword.get(cast_options, :required, false) with = Keyword.get(cast_options, :with, nil) - changeset_fun = fn - struct, params when is_nil(with) -> - struct.__struct__.changeset(struct, params) - - struct, params when is_list(with) -> - type = do_get_polymorphic_type(struct, types_metadata) - - case Keyword.get(with, type) do - {module, function_name, args} -> - apply(module, function_name, [struct, params | args]) + changeset_fun = &changeset_fun(&1, &2, with, types_metadata) - nil -> - struct.__struct__.changeset(struct, params) - - fun -> - apply(fun, [struct, params]) - end - end - - (changeset.params || %{}) - |> Map.fetch(to_string(field)) - |> case do + case Map.fetch(changeset.params || %{}, to_string(field)) do :error when required -> if data_for_field = Map.fetch!(changeset.data, field) do data_for_field = autogenerate_id(data_for_field, changeset.action) @@ -144,6 +127,25 @@ defmodule PolymorphicEmbed do raise "cast_polymorphic_embed/3 only accepts a changeset as first argument" end + defp changeset_fun(struct, params, with, types_metadata) when is_list(with) do + type = do_get_polymorphic_type(struct, types_metadata) + + case Keyword.get(with, type) do + {module, function_name, args} -> + apply(module, function_name, [struct, params | args]) + + nil -> + struct.__struct__.changeset(struct, params) + + fun -> + apply(fun, [struct, params]) + end + end + + defp changeset_fun(struct, params, nil, _) do + struct.__struct__.changeset(struct, params) + end + defp cast_polymorphic_embeds_one(changeset, field, changeset_fun, params, field_options) do %{ types_metadata: types_metadata, @@ -155,27 +157,8 @@ defmodule PolymorphicEmbed do # We support partial update of the embed. If the type cannot be inferred from the parameters, or if the found type # hasn't changed, pass the data to the changeset. - action_and_struct = - case do_get_polymorphic_module_from_map(params, type_field, types_metadata) do - nil -> - if data_for_field do - {:update, data_for_field} - else - :type_not_found - end - - module when is_nil(data_for_field) -> - {:insert, struct(module)} - module -> - if data_for_field.__struct__ != module do - {:insert, struct(module)} - else - {:update, data_for_field} - end - end - - case action_and_struct do + case action_and_struct(params, type_field, types_metadata, data_for_field) do :type_not_found when on_type_not_found == :raise -> raise_cannot_infer_type_from_data(params) @@ -203,6 +186,27 @@ defmodule PolymorphicEmbed do end end + defp action_and_struct(params, type_field, types_metadata, data_for_field) do + case do_get_polymorphic_module_from_map(params, type_field, types_metadata) do + nil -> + if data_for_field do + {:update, data_for_field} + else + :type_not_found + end + + module when is_nil(data_for_field) -> + {:insert, struct(module)} + + module -> + if data_for_field.__struct__ != module do + {:insert, struct(module)} + else + {:update, data_for_field} + end + end + end + defp cast_polymorphic_embeds_many(changeset, field, changeset_fun, list_params, field_options) do %{ types_metadata: types_metadata, @@ -225,16 +229,7 @@ defmodule PolymorphicEmbed do module -> embed_changeset = changeset_fun.(struct(module), params) embed_changeset = %{embed_changeset | action: :insert} - - case embed_changeset do - %{valid?: true} = embed_changeset -> - embed_changeset - |> Ecto.Changeset.apply_changes() - |> autogenerate_id(embed_changeset.action) - - %{valid?: false} = embed_changeset -> - embed_changeset - end + maybe_apply_changes(embed_changeset) end end) @@ -259,6 +254,14 @@ defmodule PolymorphicEmbed do end end + defp maybe_apply_changes(%{valid?: true} = embed_changeset) do + embed_changeset + |> Ecto.Changeset.apply_changes() + |> autogenerate_id(embed_changeset.action) + end + + defp maybe_apply_changes(%Changeset{valid?: false} = changeset), do: changeset + @impl true def cast(_data, _params), do: @@ -393,7 +396,7 @@ defmodule PolymorphicEmbed do schema.__schema__(:type, field) rescue _ in UndefinedFunctionError -> - raise ArgumentError, "#{inspect(schema)} is not an Ecto schema" + reraise ArgumentError, "#{inspect(schema)} is not an Ecto schema", __STACKTRACE__ else {:parameterized, PolymorphicEmbed, options} -> Map.put(options, :array?, false) {:array, {:parameterized, PolymorphicEmbed, options}} -> Map.put(options, :array?, true) @@ -438,38 +441,49 @@ defmodule PolymorphicEmbed do end defp merge_polymorphic_keys(map, changes, types, msg_func) do - Enum.reduce(types, map, fn - {field, {:parameterized, PolymorphicEmbed, _opts}}, acc -> - if changeset = Map.get(changes, field) do - case traverse_errors(changeset, msg_func) do - errors when errors == %{} -> acc - errors -> Map.put(acc, field, errors) - end - else - acc - end + Enum.reduce(types, map, &polymorphic_key_reducer(&1, &2, changes, msg_func)) + end - {field, {:array, {:parameterized, PolymorphicEmbed, _opts}}}, acc -> - if changesets = Map.get(changes, field) do - {errors, all_empty?} = - Enum.map_reduce(changesets, true, fn changeset, all_empty? -> - errors = traverse_errors(changeset, msg_func) - {errors, all_empty? and errors == %{}} - end) - - case all_empty? do - true -> acc - false -> Map.put(acc, field, errors) - end - else - acc - end + defp polymorphic_key_reducer( + {field, {:parameterized, PolymorphicEmbed, _opts}}, + acc, + changes, + msg_func + ) do + if changeset = Map.get(changes, field) do + case traverse_errors(changeset, msg_func) do + errors when errors == %{} -> acc + errors -> Map.put(acc, field, errors) + end + else + acc + end + end - {_, _}, acc -> - acc - end) + defp polymorphic_key_reducer( + {field, {:array, {:parameterized, PolymorphicEmbed, _opts}}}, + acc, + changes, + msg_func + ) do + if changesets = Map.get(changes, field) do + {errors, all_empty?} = + Enum.map_reduce(changesets, true, fn changeset, all_empty? -> + errors = traverse_errors(changeset, msg_func) + {errors, all_empty? and errors == %{}} + end) + + case all_empty? do + true -> acc + false -> Map.put(acc, field, errors) + end + else + acc + end end + defp polymorphic_key_reducer({_, _}, acc, _, _), do: acc + defp autogenerate_id([], _action), do: [] defp autogenerate_id([schema | rest], action) do diff --git a/lib/polymorphic_embed/html/form.ex b/lib/polymorphic_embed/html/form.ex index 0bd78a0..b788746 100644 --- a/lib/polymorphic_embed/html/form.ex +++ b/lib/polymorphic_embed/html/form.ex @@ -1,6 +1,9 @@ if Code.ensure_loaded?(Phoenix.HTML) && Code.ensure_loaded?(Phoenix.HTML.Form) && Code.ensure_loaded?(PhoenixHTMLHelpers.Form) do defmodule PolymorphicEmbed.HTML.Form do + @moduledoc """ + Defines functions for using PolymorphicEmbed with `Phoenix.HTML.Form`. + """ import Phoenix.HTML, only: [html_escape: 1] import Phoenix.HTML.Form, only: [input_value: 2] import PhoenixHTMLHelpers.Form, only: [hidden_inputs_for: 1] From a94a1fd1620da2948720b15d1fa52a84679fa129 Mon Sep 17 00:00:00 2001 From: Mathias Polligkeit Date: Tue, 20 Feb 2024 17:43:19 +0900 Subject: [PATCH 12/15] update credo config --- .credo.exs | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/.credo.exs b/.credo.exs index 9965c2f..b62ab1c 100644 --- a/.credo.exs +++ b/.credo.exs @@ -84,12 +84,12 @@ # {Credo.Check.Design.AliasUsage, [priority: :low, if_nested_deeper_than: 2, if_called_more_often_than: 0]}, + {Credo.Check.Design.TagFIXME, []}, # You can also customize the exit_status of each check. # If you don't want TODO comments to cause `mix credo` to fail, just # set this value to 0 (zero). # {Credo.Check.Design.TagTODO, [exit_status: 2]}, - {Credo.Check.Design.TagFIXME, []}, # ## Readability Checks @@ -99,7 +99,7 @@ {Credo.Check.Readability.LargeNumbers, []}, {Credo.Check.Readability.MaxLineLength, [priority: :low, max_length: 120]}, {Credo.Check.Readability.ModuleAttributeNames, []}, - {Credo.Check.Readability.ModuleDoc, []}, + {Credo.Check.Readability.ModuleDoc, false}, {Credo.Check.Readability.ModuleNames, []}, {Credo.Check.Readability.ParenthesesInCondition, []}, {Credo.Check.Readability.ParenthesesOnZeroArityDefs, []}, @@ -122,32 +122,35 @@ {Credo.Check.Refactor.Apply, []}, {Credo.Check.Refactor.CondStatements, []}, {Credo.Check.Refactor.CyclomaticComplexity, []}, + {Credo.Check.Refactor.FilterCount, []}, + {Credo.Check.Refactor.FilterFilter, []}, {Credo.Check.Refactor.FunctionArity, []}, {Credo.Check.Refactor.LongQuoteBlocks, []}, - {Credo.Check.Refactor.MatchInCondition, []}, {Credo.Check.Refactor.MapJoin, []}, + {Credo.Check.Refactor.MatchInCondition, []}, {Credo.Check.Refactor.NegatedConditionsInUnless, []}, {Credo.Check.Refactor.NegatedConditionsWithElse, []}, {Credo.Check.Refactor.Nesting, []}, + {Credo.Check.Refactor.RedundantWithClauseResult, []}, + {Credo.Check.Refactor.RejectReject, []}, {Credo.Check.Refactor.UnlessWithElse, []}, {Credo.Check.Refactor.WithClauses, []}, - {Credo.Check.Refactor.FilterFilter, []}, - {Credo.Check.Refactor.RejectReject, []}, - {Credo.Check.Refactor.RedundantWithClauseResult, []}, # ## Warnings # {Credo.Check.Warning.ApplicationConfigInModuleAttribute, []}, {Credo.Check.Warning.BoolOperationOnSameValues, []}, + {Credo.Check.Warning.Dbg, []}, {Credo.Check.Warning.ExpensiveEmptyEnumCheck, []}, {Credo.Check.Warning.IExPry, []}, {Credo.Check.Warning.IoInspect, []}, + {Credo.Check.Warning.MissedMetadataKeyInLoggerConfig, []}, {Credo.Check.Warning.OperationOnSameValues, []}, {Credo.Check.Warning.OperationWithConstantResult, []}, {Credo.Check.Warning.RaiseInsideRescue, []}, {Credo.Check.Warning.SpecWithStruct, []}, - {Credo.Check.Warning.WrongTestFileExtension, []}, + {Credo.Check.Warning.UnsafeExec, []}, {Credo.Check.Warning.UnusedEnumOperation, []}, {Credo.Check.Warning.UnusedFileOperation, []}, {Credo.Check.Warning.UnusedKeywordOperation, []}, @@ -156,11 +159,12 @@ {Credo.Check.Warning.UnusedRegexOperation, []}, {Credo.Check.Warning.UnusedStringOperation, []}, {Credo.Check.Warning.UnusedTupleOperation, []}, - {Credo.Check.Warning.UnsafeExec, []} + {Credo.Check.Warning.WrongTestFileExtension, []} ], disabled: [ # - # Checks scheduled for next check update (opt-in for now, just replace `false` with `[]`) + # Checks scheduled for next check update (opt-in for now) + {Credo.Check.Refactor.UtcNowTruncate, []}, # # Controversial and experimental checks (opt-in, just move the check to `:enabled` @@ -175,6 +179,8 @@ {Credo.Check.Readability.ImplTrue, []}, {Credo.Check.Readability.MultiAlias, []}, {Credo.Check.Readability.NestedFunctionCalls, []}, + {Credo.Check.Readability.OneArityFunctionInPipe, []}, + {Credo.Check.Readability.OnePipePerLine, []}, {Credo.Check.Readability.SeparateAliasRequire, []}, {Credo.Check.Readability.SingleFunctionToBlockPipe, []}, {Credo.Check.Readability.SinglePipe, []}, @@ -189,6 +195,7 @@ {Credo.Check.Refactor.MapMap, []}, {Credo.Check.Refactor.ModuleDependencies, []}, {Credo.Check.Refactor.NegatedIsNil, []}, + {Credo.Check.Refactor.PassAsyncInTestCases, []}, {Credo.Check.Refactor.PipeChainStart, []}, {Credo.Check.Refactor.RejectFilter, []}, {Credo.Check.Refactor.VariableRebinding, []}, From 094defc0cb98dbd3790622d846ccfc39e8ce5eb7 Mon Sep 17 00:00:00 2001 From: Mathias Polligkeit Date: Tue, 20 Feb 2024 17:50:34 +0900 Subject: [PATCH 13/15] refactor --- lib/polymorphic_embed.ex | 38 ++++++++++++++++++-------------------- 1 file changed, 18 insertions(+), 20 deletions(-) diff --git a/lib/polymorphic_embed.ex b/lib/polymorphic_embed.ex index 7c6f174..920ae1e 100644 --- a/lib/polymorphic_embed.ex +++ b/lib/polymorphic_embed.ex @@ -62,6 +62,7 @@ defmodule PolymorphicEmbed do def cast_polymorphic_embed(changeset, field, cast_options \\ []) + # credo:disable-for-next-line def cast_polymorphic_embed(%Ecto.Changeset{} = changeset, field, cast_options) do field_options = get_field_options(changeset.data.__struct__, field) @@ -100,26 +101,23 @@ defmodule PolymorphicEmbed do {:ok, map} when map == %{} and not array? -> changeset - {:ok, params_for_field} -> - cond do - array? and is_list(params_for_field) -> - cast_polymorphic_embeds_many( - changeset, - field, - changeset_fun, - params_for_field, - field_options - ) - - not array? and is_map(params_for_field) -> - cast_polymorphic_embeds_one( - changeset, - field, - changeset_fun, - params_for_field, - field_options - ) - end + {:ok, params_for_field} when is_list(params_for_field) and array? -> + cast_polymorphic_embeds_many( + changeset, + field, + changeset_fun, + params_for_field, + field_options + ) + + {:ok, params_for_field} when is_map(params_for_field) and not array? -> + cast_polymorphic_embeds_one( + changeset, + field, + changeset_fun, + params_for_field, + field_options + ) end end From c6afd6f445bbee352ffebe5c3fed60471b828c0b Mon Sep 17 00:00:00 2001 From: Mathias Polligkeit Date: Tue, 20 Feb 2024 17:50:41 +0900 Subject: [PATCH 14/15] update CI workflow --- .github/workflows/ci.yml | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 3147b33..3219bd5 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,8 +1,8 @@ name: CI env: - ELIXIR_VERSION: "1.14" - OTP_VERSION: "25.1" + ELIXIR_VERSION: "1.16" + OTP_VERSION: "26" on: push: @@ -18,11 +18,16 @@ jobs: name: Test OTP ${{matrix.otp}} / Elixir ${{matrix.elixir}} strategy: matrix: - otp: ["24.3", "25.1"] - elixir: ["1.13", "1.14"] - exclude: - - otp: "25.1" - elixir: "1.13" + include: + - { elixir: 1.14, otp: 23 } + - { elixir: 1.14, otp: 24 } + - { elixir: 1.14, otp: 25 } + - { elixir: 1.15, otp: 24 } + - { elixir: 1.15, otp: 25 } + - { elixir: 1.15, otp: 26 } + - { elixir: 1.16, otp: 24 } + - { elixir: 1.16, otp: 25 } + - { elixir: 1.16, otp: 26 } env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} From c97e4864fdf95cf5eb17bfaad681be46361d99d6 Mon Sep 17 00:00:00 2001 From: Mathias Polligkeit Date: Tue, 20 Feb 2024 17:54:40 +0900 Subject: [PATCH 15/15] update GH actions --- .github/workflows/ci.yml | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 3219bd5..1544278 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -19,7 +19,6 @@ jobs: strategy: matrix: include: - - { elixir: 1.14, otp: 23 } - { elixir: 1.14, otp: 24 } - { elixir: 1.14, otp: 25 } - { elixir: 1.15, otp: 24 } @@ -46,14 +45,14 @@ jobs: - 5432:5432 steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - uses: erlef/setup-beam@v1 id: beam with: otp-version: ${{matrix.otp}} elixir-version: ${{matrix.elixir}} - name: Restore dependencies and build cache - uses: actions/cache@v3 + uses: actions/cache@v4 with: path: | _build @@ -75,14 +74,14 @@ jobs: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - uses: erlef/setup-beam@v1 id: beam with: otp-version: ${{ env.OTP_VERSION }} elixir-version: ${{ env.ELIXIR_VERSION}} - name: Restore dependencies and build cache - uses: actions/cache@v3 + uses: actions/cache@v4 with: path: | _build @@ -90,7 +89,7 @@ jobs: key: ${{ runner.os }}-otp-${{ steps.beam.outputs.otp-version }}-elixir-${{ steps.beam.outputs.elixir-version }}-mix-${{ hashFiles('mix.lock') }} restore-keys: ${{ runner.os }}-otp-${{ steps.beam.outputs.otp-version }}-elixir-${{ steps.beam.outputs.elixir-version }}- - name: Restore PLT cache - uses: actions/cache@v3 + uses: actions/cache@v4 id: plt_cache with: key: |