Skip to content

Commit 62c25bd

Browse files
authored
Fix autogenerate options for composite types (#4773)
1 parent 3fff2a3 commit 62c25bd

2 files changed

Lines changed: 49 additions & 1 deletion

File tree

lib/ecto/schema.ex

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2066,7 +2066,8 @@ defmodule Ecto.Schema do
20662066
store_mfa_autogenerate!(mod, name, type, gen)
20672067

20682068
autogenerate_opts when is_list(autogenerate_opts) ->
2069-
store_mfa_autogenerate!(mod, name, type, {type, :autogenerate, [autogenerate_opts]})
2069+
mfa = {autogenerate_module(type), :autogenerate, [autogenerate_opts]}
2070+
store_mfa_autogenerate!(mod, name, type, mfa)
20702071

20712072
true ->
20722073
store_type_autogenerate!(mod, name, source || name, type, pk?)
@@ -2635,6 +2636,14 @@ defmodule Ecto.Schema do
26352636

26362637
defp composite?(_type, _name), do: false
26372638

2639+
defp autogenerate_module({:parameterized, {type, _params}}), do: type
2640+
2641+
defp autogenerate_module({composite, nested_type} = type) do
2642+
if Ecto.Type.composite?(composite), do: autogenerate_module(nested_type), else: type
2643+
end
2644+
2645+
defp autogenerate_module(type), do: type
2646+
26382647
defp store_mfa_autogenerate!(mod, name, type, mfa) do
26392648
if autogenerate_id?(type) do
26402649
raise ArgumentError, ":autogenerate with {m, f, a} not supported by ID types"

test/ecto/repo/autogenerate_test.exs

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,38 @@ defmodule Ecto.Repo.AutogenerateTest do
133133
end
134134
end
135135

136+
defmodule AutogenerateOptionsType do
137+
use Ecto.Type
138+
139+
def type, do: :string
140+
def cast(value), do: {:ok, value}
141+
def load(value), do: {:ok, value}
142+
def dump(value), do: {:ok, value}
143+
def autogenerate(opts), do: Keyword.fetch!(opts, :value)
144+
end
145+
146+
defmodule ParameterizedAutogenerateOptionsType do
147+
use Ecto.ParameterizedType
148+
149+
def init(opts), do: opts
150+
def type(_params), do: :string
151+
def cast(value, _params), do: {:ok, value}
152+
def load(value, _loader, _params), do: {:ok, value}
153+
def dump(value, _dumper, _params), do: {:ok, value}
154+
def autogenerate(opts), do: Keyword.fetch!(opts, :value)
155+
end
156+
157+
defmodule AutogenerateOptionsSchema do
158+
use Ecto.Schema
159+
160+
schema "autogenerate_options_schema" do
161+
field :parameterized, ParameterizedAutogenerateOptionsType,
162+
autogenerate: [value: "parameterized"]
163+
164+
field :composite, {:array, AutogenerateOptionsType}, autogenerate: [value: ["composite"]]
165+
end
166+
end
167+
136168
## Autogenerate
137169

138170
@uuid "30313233-3435-4637-9839-616263646566"
@@ -179,6 +211,13 @@ defmodule Ecto.Repo.AutogenerateTest do
179211
assert byte_size(schema.uuid_v7) == 36
180212
end
181213

214+
test "autogenerates parameterized and composite types with options" do
215+
schema = TestRepo.insert!(%AutogenerateOptionsSchema{})
216+
217+
assert schema.parameterized == "parameterized"
218+
assert schema.composite == ["composite"]
219+
end
220+
182221
## Timestamps
183222

184223
test "sets inserted_at and updated_at values" do

0 commit comments

Comments
 (0)