Skip to content

Commit 3f2a6ef

Browse files
committed
allow autogenerate to acccept a list of options
1 parent 475af88 commit 3f2a6ef

File tree

4 files changed

+20
-5
lines changed

4 files changed

+20
-5
lines changed

lib/ecto/repo/schema.ex

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -916,15 +916,25 @@ defmodule Ecto.Repo.Schema do
916916
to_remove = List.wrap(conflict_target)
917917
replace = replace_all_fields!(:replace_all, schema, to_remove)
918918

919-
if replace == [], do: raise(ArgumentError, "empty list of fields to update, use the `:replace` option instead")
919+
if replace == [],
920+
do:
921+
raise(
922+
ArgumentError,
923+
"empty list of fields to update, use the `:replace` option instead"
924+
)
920925

921926
{{replace, [], conflict_target}, []}
922927

923928
{:replace_all_except, fields} ->
924929
to_remove = List.wrap(conflict_target) ++ fields
925930
replace = replace_all_fields!(:replace_all_except, schema, to_remove)
926931

927-
if replace == [], do: raise(ArgumentError, "empty list of fields to update, use the `:replace` option instead")
932+
if replace == [],
933+
do:
934+
raise(
935+
ArgumentError,
936+
"empty list of fields to update, use the `:replace` option instead"
937+
)
928938

929939
{{replace, [], conflict_target}, []}
930940

lib/ecto/schema.ex

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -665,6 +665,7 @@ defmodule Ecto.Schema do
665665
666666
* `:autogenerate` - a `{module, function, args}` tuple for a function
667667
to call to generate the field value before insertion if value is not set.
668+
A list of options is passed as first argument `{type, :autogenerate, [options]}`.
668669
A shorthand value of `true` is equivalent to `{type, :autogenerate, []}`.
669670
670671
* `:read_after_writes` - When true, the field is always read back
@@ -2044,6 +2045,9 @@ defmodule Ecto.Schema do
20442045
{_, _, _} ->
20452046
store_mfa_autogenerate!(mod, name, type, gen)
20462047

2048+
autogenerate_opts when is_list(autogenerate_opts) ->
2049+
store_mfa_autogenerate!(mod, name, type, {type, :autogenerate, [autogenerate_opts]})
2050+
20472051
true ->
20482052
store_type_autogenerate!(mod, name, source || name, type, pk?)
20492053

lib/ecto/type.ex

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -320,8 +320,9 @@ defmodule Ecto.Type do
320320
to `field` with the `:autogenerate` flag.
321321
"""
322322
@callback autogenerate() :: term()
323+
@callback autogenerate(term) :: term()
323324

324-
@optional_callbacks autogenerate: 0
325+
@optional_callbacks autogenerate: 0, autogenerate: 1
325326

326327
## Functions
327328

test/ecto/repo/autogenerate_test.exs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,8 @@ defmodule Ecto.Repo.AutogenerateTest do
3333

3434
schema "default" do
3535
field :code, Ecto.UUID, autogenerate: true
36-
field :uuid_v4, Ecto.UUID, autogenerate: {Ecto.UUID, :generate, [:v4]}
37-
field :uuid_v7, Ecto.UUID, autogenerate: {Ecto.UUID, :generate, [:v7]}
36+
field :uuid_v4, Ecto.UUID, autogenerate: [version: 4]
37+
field :uuid_v7, Ecto.UUID, autogenerate: [version: 7]
3838
has_one :manager, Manager
3939
has_many :offices, Office
4040
timestamps()

0 commit comments

Comments
 (0)