@@ -525,6 +525,7 @@ defmodule Ecto.Schema do
525525 Module . register_attribute ( __MODULE__ , :ecto_autogenerate , accumulate: true )
526526 Module . register_attribute ( __MODULE__ , :ecto_autoupdate , accumulate: true )
527527 Module . register_attribute ( __MODULE__ , :ecto_redact_fields , accumulate: true )
528+ Module . register_attribute ( __MODULE__ , :ecto_on_writable_violation , accumulate: true )
528529 end
529530 end
530531
@@ -2078,6 +2079,8 @@ defmodule Ecto.Schema do
20782079 raise ArgumentError , "autogenerated fields must always be writable"
20792080 end
20802081
2082+ Module . put_attribute ( mod , :ecto_on_writable_violation , { name , on_writable_violation } )
2083+
20812084 if pk? do
20822085 Module . put_attribute ( mod , :ecto_primary_keys , name )
20832086 end
@@ -2086,7 +2089,7 @@ defmodule Ecto.Schema do
20862089 Module . put_attribute ( mod , :ecto_query_fields , { name , type } )
20872090 end
20882091
2089- Module . put_attribute ( mod , :ecto_fields , { name , { type , { writable , on_writable_violation } } } )
2092+ Module . put_attribute ( mod , :ecto_fields , { name , { type , writable } } )
20902093 end
20912094 end
20922095
@@ -2376,6 +2379,7 @@ defmodule Ecto.Schema do
23762379 autoupdate = Module . get_attribute ( module , :ecto_autoupdate ) |> Enum . reverse ( )
23772380 read_after_writes = Module . get_attribute ( module , :ecto_raw ) |> Enum . reverse ( )
23782381 autogenerate_id = Module . get_attribute ( module , :ecto_autogenerate_id )
2382+ on_writable_violation = Module . get_attribute ( module , :ecto_on_writable_violation )
23792383
23802384 struct_fields = Module . get_attribute ( module , :ecto_struct_fields ) |> Enum . reverse ( )
23812385 derive = Module . get_attribute ( module , :derive )
@@ -2392,7 +2396,7 @@ defmodule Ecto.Schema do
23922396 end
23932397
23942398 load =
2395- for { name , { type , { _writable , _on_writable_violation } } } <- fields do
2399+ for { name , { type , _writable } } <- fields do
23962400 if alias = field_sources [ name ] do
23972401 { name , { :source , alias , type } }
23982402 else
@@ -2401,17 +2405,17 @@ defmodule Ecto.Schema do
24012405 end
24022406
24032407 dump =
2404- for { name , { type , { writable , _on_writable_violation } } } <- fields do
2408+ for { name , { type , writable } } <- fields do
24052409 { name , { field_sources [ name ] || name , type , writable } }
24062410 end
24072411
24082412 field_sources_quoted =
2409- for { name , { _type , { _writable , _on_writable_violation } } } <- fields do
2413+ for { name , { _type , _writable } } <- fields do
24102414 { [ :field_source , name ] , field_sources [ name ] || name }
24112415 end
24122416
24132417 types_quoted =
2414- for { name , { type , { _writable , _on_writable_violation } } } <- fields do
2418+ for { name , { type , _writable } } <- fields do
24152419 { [ :type , name ] , Macro . escape ( type ) }
24162420 end
24172421
@@ -2435,7 +2439,7 @@ defmodule Ecto.Schema do
24352439 embed_names = Enum . map ( embeds , & elem ( & 1 , 0 ) )
24362440
24372441 updatable =
2438- for { name , { _ , { writable , _on_writable_violation } } } <- fields , reduce: { [ ] , [ ] } do
2442+ for { name , { _ , writable } } <- fields , reduce: { [ ] , [ ] } do
24392443 { keep , drop } ->
24402444 case writable do
24412445 :always -> { [ name | keep ] , drop }
@@ -2444,19 +2448,14 @@ defmodule Ecto.Schema do
24442448 end
24452449
24462450 insertable =
2447- for { name , { _ , { writable , _on_writable_violation } } } <- fields , reduce: { [ ] , [ ] } do
2451+ for { name , { _ , writable } } <- fields , reduce: { [ ] , [ ] } do
24482452 { keep , drop } ->
24492453 case writable do
24502454 :never -> { keep , [ name | drop ] }
24512455 _ -> { [ name | keep ] , drop }
24522456 end
24532457 end
24542458
2455- on_writable_violation =
2456- for { name , { _ , { _writable , on_writable_violation } } } <- fields do
2457- { name , on_writable_violation }
2458- end
2459-
24602459 single_arg = [
24612460 { [ :dump ] , dump |> Map . new ( ) |> Macro . escape ( ) } ,
24622461 { [ :load ] , load |> Macro . escape ( ) } ,
0 commit comments