Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion lib/spark/dsl/extension.ex
Original file line number Diff line number Diff line change
Expand Up @@ -680,7 +680,7 @@ defmodule Spark.Dsl.Extension do
|> Enum.flat_map(& &1.transformers())
|> Transformer.sort()
|> Enum.reject(& &1.after_compile?())
|> Enum.concat(Enum.flat_map(@extensions, & &1.persisters()))
|> Enum.concat(@extensions |> Enum.flat_map(& &1.persisters()) |> Transformer.sort())
else
[]
end
Expand Down
64 changes: 64 additions & 0 deletions test/persister_sort_test.exs
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
# SPDX-FileCopyrightText: 2026 spark contributors <https://github.com/ash-project/spark/graphs/contributors>
#
# SPDX-License-Identifier: MIT

defmodule PersisterSortTest do
use ExUnit.Case

defmodule PersisterA do
use Spark.Dsl.Transformer

def transform(dsl) do
order = Spark.Dsl.Transformer.get_persisted(dsl, :persister_order, [])
{:ok, Spark.Dsl.Transformer.persist(dsl, :persister_order, order ++ [:a])}
end
end

defmodule PersisterB do
use Spark.Dsl.Transformer

def before?(PersisterSortTest.PersisterA), do: true
def before?(_), do: false

def transform(dsl) do
order = Spark.Dsl.Transformer.get_persisted(dsl, :persister_order, [])
{:ok, Spark.Dsl.Transformer.persist(dsl, :persister_order, order ++ [:b])}
end
end

defmodule PersisterC do
use Spark.Dsl.Transformer

def after?(PersisterSortTest.PersisterA), do: true
def after?(_), do: false

def transform(dsl) do
order = Spark.Dsl.Transformer.get_persisted(dsl, :persister_order, [])
{:ok, Spark.Dsl.Transformer.persist(dsl, :persister_order, order ++ [:c])}
end
end

defmodule Extension do
@section %Spark.Dsl.Section{
name: :test_section,
schema: []
}

use Spark.Dsl.Extension,
sections: [@section],
# Listed in reverse order to prove sorting works
persisters: [PersisterC, PersisterA, PersisterB]
end

defmodule TestDsl do
use Spark.Dsl, default_extensions: [extensions: PersisterSortTest.Extension]
end

defmodule TestResource do
use TestDsl
end

test "persisters are sorted based on before/after callbacks" do
assert Spark.Dsl.Extension.get_persisted(TestResource, :persister_order) == [:b, :a, :c]
end
end
Loading