Skip to content

Commit 25ba751

Browse files
committed
feat: sort persisters using before/after callbacks
1 parent fd82fb5 commit 25ba751

2 files changed

Lines changed: 65 additions & 1 deletion

File tree

lib/spark/dsl/extension.ex

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -680,7 +680,7 @@ defmodule Spark.Dsl.Extension do
680680
|> Enum.flat_map(& &1.transformers())
681681
|> Transformer.sort()
682682
|> Enum.reject(& &1.after_compile?())
683-
|> Enum.concat(Enum.flat_map(@extensions, & &1.persisters()))
683+
|> Enum.concat(@extensions |> Enum.flat_map(& &1.persisters()) |> Transformer.sort())
684684
else
685685
[]
686686
end

test/persister_sort_test.exs

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
# SPDX-FileCopyrightText: 2026 spark contributors <https://github.com/ash-project/spark/graphs/contributors>
2+
#
3+
# SPDX-License-Identifier: MIT
4+
5+
defmodule PersisterSortTest do
6+
use ExUnit.Case
7+
8+
defmodule PersisterA do
9+
use Spark.Dsl.Transformer
10+
11+
def transform(dsl) do
12+
order = Spark.Dsl.Transformer.get_persisted(dsl, :persister_order, [])
13+
{:ok, Spark.Dsl.Transformer.persist(dsl, :persister_order, order ++ [:a])}
14+
end
15+
end
16+
17+
defmodule PersisterB do
18+
use Spark.Dsl.Transformer
19+
20+
def before?(PersisterSortTest.PersisterA), do: true
21+
def before?(_), do: false
22+
23+
def transform(dsl) do
24+
order = Spark.Dsl.Transformer.get_persisted(dsl, :persister_order, [])
25+
{:ok, Spark.Dsl.Transformer.persist(dsl, :persister_order, order ++ [:b])}
26+
end
27+
end
28+
29+
defmodule PersisterC do
30+
use Spark.Dsl.Transformer
31+
32+
def after?(PersisterSortTest.PersisterA), do: true
33+
def after?(_), do: false
34+
35+
def transform(dsl) do
36+
order = Spark.Dsl.Transformer.get_persisted(dsl, :persister_order, [])
37+
{:ok, Spark.Dsl.Transformer.persist(dsl, :persister_order, order ++ [:c])}
38+
end
39+
end
40+
41+
defmodule Extension do
42+
@section %Spark.Dsl.Section{
43+
name: :test_section,
44+
schema: []
45+
}
46+
47+
use Spark.Dsl.Extension,
48+
sections: [@section],
49+
# Listed in reverse order to prove sorting works
50+
persisters: [PersisterC, PersisterA, PersisterB]
51+
end
52+
53+
defmodule TestDsl do
54+
use Spark.Dsl, default_extensions: [extensions: PersisterSortTest.Extension]
55+
end
56+
57+
defmodule TestResource do
58+
use TestDsl
59+
end
60+
61+
test "persisters are sorted based on before/after callbacks" do
62+
assert Spark.Dsl.Extension.get_persisted(TestResource, :persister_order) == [:b, :a, :c]
63+
end
64+
end

0 commit comments

Comments
 (0)