## [Unreleased]
+### Added
+- extended runtime module support, see config cheatsheet
+
### Fixed
- Updated mastoFE path, for the newer version
- `/api/v1/notifications/dismiss`
- `/api/v1/search`
- `/api/v1/statuses/{id}/card`
-- LDAP authenticator
+- LDAP authenticator (use the akkoma-contrib-authenticator-ldap runtime module)
- Chats, they were half-baked. Just use PMs.
- Prometheus, it causes massive slowdown
## Custom Runtime Modules (`:modules`)
-* `runtime_dir`: A path to custom Elixir modules (such as MRF policies).
+* `runtime_dir`: A path to custom Elixir modules, such as MRF policies or
+ custom authenticators. These modules will be loaded on boot, and can be
+ contained in subdirectories. It is advised to use version-controlled
+ subdirectories to make management of them a bit easier. Note that only
+ files with the extension `.ex` will be loaded.
+
+```elixir
+config :pleroma, :modules, runtime_dir: "instance/modules"
+```
+
+### Adding a module
+
+```bash
+cd instance/modules/
+git clone <MY MODULE>
+```
## :configurable_from_database
@repo_timeout Pleroma.Config.get([Pleroma.Repo, :timeout], 15_000)
def compile_dir(dir) when is_binary(dir) do
+ dir
+ |> elixir_files()
+ |> Kernel.ParallelCompiler.compile()
+ end
+
+ defp elixir_files(dir) when is_binary(dir) do
dir
|> File.ls!()
|> Enum.map(&Path.join(dir, &1))
- |> Kernel.ParallelCompiler.compile()
+ |> Enum.flat_map(fn path ->
+ if File.dir?(path) do
+ elixir_files(path)
+ else
+ [path]
+ end
+ end)
+ |> Enum.filter(fn path -> String.ends_with?(path, ".ex") end)
end
@doc """
--- /dev/null
+defmodule DynamicModule.First do
+end
--- /dev/null
+def thisisnotloaded
--- /dev/null
+defmodule DynamicModule.Second do
+end
File.rm_rf(path)
end
end
+
+ describe "compile_dir/1" do
+ test "recursively compiles directories" do
+ {:ok, [DynamicModule.First, DynamicModule.Second], []} =
+ Pleroma.Utils.compile_dir("test/fixtures/runtime_modules")
+ end
+ end
end