diff --git a/lib/jido/pod.ex b/lib/jido/pod.ex index ff8635a..e72ad25 100644 --- a/lib/jido/pod.ex +++ b/lib/jido/pod.ex @@ -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) diff --git a/test/jido/pod_test.exs b/test/jido/pod_test.exs index dc998ee..f06d259 100644 --- a/test/jido/pod_test.exs +++ b/test/jido/pod_test.exs @@ -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, @@ -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__/