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
5 changes: 4 additions & 1 deletion lib/jido/pod.ex
Original file line number Diff line number Diff line change
Expand Up @@ -67,10 +67,13 @@ defmodule Jido.Pod do
{pod_plugins, remaining_default_plugins} =
Definition.split_pod_plugins!(default_plugins, __CALLER__)

user_plugins =
Definition.expand_and_eval_literal_option(Keyword.get(opts, :plugins, []), __CALLER__)

agent_opts =
opts
|> Keyword.delete(:topology)
|> Keyword.put(:plugins, pod_plugins ++ Keyword.get(opts, :plugins, []))
|> Keyword.put(:plugins, pod_plugins ++ (user_plugins || []))
|> then(fn resolved_opts ->
if is_nil(remaining_default_plugins) do
Keyword.delete(resolved_opts, :default_plugins)
Expand Down
31 changes: 31 additions & 0 deletions test/jido/pod_test.exs
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,16 @@ defmodule JidoTest.PodTest do
end
end

defmodule UserPlugin do
@moduledoc false
use Jido.Plugin,
name: "pod_test_user_plugin",
state_key: :pod_test_user_plugin,
actions: [],
schema: Zoi.object(%{}),
capabilities: []
end

defmodule ExamplePod do
@moduledoc false
use Jido.Pod,
Expand Down Expand Up @@ -90,6 +100,27 @@ defmodule JidoTest.PodTest do
assert {:ok, %Topology{name: "custom_plugin_pod"}} = Pod.fetch_topology(agent)
end

test "plugins option resolves aliased plugin modules before pod opts are escaped" do
suffix = System.unique_integer([:positive])
pod_mod = Module.concat(__MODULE__, :"AliasedPluginPod#{suffix}")
pod_name = "aliased_plugin_pod_#{suffix}"

Code.compile_string("""
defmodule #{inspect(pod_mod)} do
@moduledoc false
alias #{inspect(UserPlugin)}, as: UserPlugin

use Jido.Pod,
name: #{inspect(pod_name)},
plugins: [UserPlugin]
end
""")

assert Enum.any?(pod_mod.plugin_instances(), fn instance ->
instance.module == UserPlugin and instance.state_key == :pod_test_user_plugin
end)
end

test "disabling the reserved __pod__ plugin raises at compile time" do
message = ~r/Jido.Pod requires a singleton pod plugin under __pod__/

Expand Down
Loading