diff options
author | href <href@random.sh> | 2020-07-12 17:23:33 +0200 |
---|---|---|
committer | href <href@random.sh> | 2020-07-12 17:23:33 +0200 |
commit | 4347d2de5eb609bbfa1a206a5de5df925d3a0696 (patch) | |
tree | 8bbe69ae109f3bcc3e3d13572930017d6e3d38d4 /lib/pleroma/docs/generator.ex | |
parent | 11dd29ef3f9bb5b0b3109eb572c3d5ae2c830ea3 (diff) | |
download | pleroma-4347d2de5eb609bbfa1a206a5de5df925d3a0696.tar.gz |
Config/Docs: Expand behaviour suggestions at runtime
Diffstat (limited to 'lib/pleroma/docs/generator.ex')
-rw-r--r-- | lib/pleroma/docs/generator.ex | 31 |
1 files changed, 21 insertions, 10 deletions
diff --git a/lib/pleroma/docs/generator.ex b/lib/pleroma/docs/generator.ex index e0fc8cd02..a671a6278 100644 --- a/lib/pleroma/docs/generator.ex +++ b/lib/pleroma/docs/generator.ex @@ -6,16 +6,21 @@ defmodule Pleroma.Docs.Generator do implementation.process(descriptions) end - @spec list_modules_in_dir(String.t(), String.t()) :: [module()] - def list_modules_in_dir(dir, start) do - with {:ok, files} <- File.ls(dir) do - files - |> Enum.filter(&String.ends_with?(&1, ".ex")) - |> Enum.map(fn filename -> - module = filename |> String.trim_trailing(".ex") |> Macro.camelize() - String.to_atom(start <> module) - end) - end + @spec list_behaviour_implementations(behaviour :: module()) :: [module()] + def list_behaviour_implementations(behaviour) do + :code.all_loaded() + |> Enum.filter(fn {module, _} -> + # This shouldn't be needed as all modules are expected to have module_info/1, + # but in test enviroments some transient modules `:elixir_compiler_XX` + # are loaded for some reason (where XX is a random integer). + if function_exported?(module, :module_info, 1) do + module.module_info(:attributes) + |> Keyword.get_values(:behaviour) + |> List.flatten() + |> Enum.member?(behaviour) + end + end) + |> Enum.map(fn {module, _} -> module end) end @doc """ @@ -87,6 +92,12 @@ defmodule Pleroma.Docs.Generator do else: string end + defp format_suggestions({:list_behaviour_implementations, behaviour}) do + behaviour + |> list_behaviour_implementations() + |> format_suggestions() + end + defp format_suggestions([]), do: [] defp format_suggestions([suggestion | tail]) do |