config editing through database
This commit is contained in:
parent
e118d639a0
commit
2753285b77
20 changed files with 1133 additions and 472 deletions
|
|
@ -6,68 +6,108 @@ defmodule Pleroma.Docs.Generator do
|
|||
implementation.process(descriptions)
|
||||
end
|
||||
|
||||
@spec uploaders_list() :: [module()]
|
||||
def uploaders_list do
|
||||
{:ok, modules} = :application.get_key(:pleroma, :modules)
|
||||
|
||||
Enum.filter(modules, fn module ->
|
||||
name_as_list = Module.split(module)
|
||||
|
||||
List.starts_with?(name_as_list, ["Pleroma", "Uploaders"]) and
|
||||
List.last(name_as_list) != "Uploader"
|
||||
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_existing_atom(start <> module)
|
||||
end)
|
||||
end
|
||||
end
|
||||
|
||||
@spec filters_list() :: [module()]
|
||||
def filters_list do
|
||||
{:ok, modules} = :application.get_key(:pleroma, :modules)
|
||||
|
||||
Enum.filter(modules, fn module ->
|
||||
name_as_list = Module.split(module)
|
||||
|
||||
List.starts_with?(name_as_list, ["Pleroma", "Upload", "Filter"])
|
||||
end)
|
||||
@doc """
|
||||
Converts:
|
||||
- atoms to strings with leading `:`
|
||||
- module names to strings, without leading `Elixir.`
|
||||
- add humanized labels to `keys` if label is not defined, e.g. `:instance` -> `Instance`
|
||||
"""
|
||||
@spec convert_to_strings([map()]) :: [map()]
|
||||
def convert_to_strings(descriptions) do
|
||||
Enum.map(descriptions, &format_entity(&1))
|
||||
end
|
||||
|
||||
@spec mrf_list() :: [module()]
|
||||
def mrf_list do
|
||||
{:ok, modules} = :application.get_key(:pleroma, :modules)
|
||||
|
||||
Enum.filter(modules, fn module ->
|
||||
name_as_list = Module.split(module)
|
||||
|
||||
List.starts_with?(name_as_list, ["Pleroma", "Web", "ActivityPub", "MRF"]) and
|
||||
length(name_as_list) > 4
|
||||
end)
|
||||
defp format_entity(entity) do
|
||||
entity
|
||||
|> format_key()
|
||||
|> Map.put(:group, atom_to_string(entity[:group]))
|
||||
|> format_children()
|
||||
end
|
||||
|
||||
@spec richmedia_parsers() :: [module()]
|
||||
def richmedia_parsers do
|
||||
{:ok, modules} = :application.get_key(:pleroma, :modules)
|
||||
|
||||
Enum.filter(modules, fn module ->
|
||||
name_as_list = Module.split(module)
|
||||
|
||||
List.starts_with?(name_as_list, ["Pleroma", "Web", "RichMedia", "Parsers"]) and
|
||||
length(name_as_list) == 5
|
||||
end)
|
||||
defp format_key(%{key: key} = entity) do
|
||||
entity
|
||||
|> Map.put(:key, atom_to_string(key))
|
||||
|> Map.put(:label, entity[:label] || humanize(key))
|
||||
end
|
||||
|
||||
defp format_key(%{group: group} = entity) do
|
||||
Map.put(entity, :label, entity[:label] || humanize(group))
|
||||
end
|
||||
|
||||
defp format_key(entity), do: entity
|
||||
|
||||
defp format_children(%{children: children} = entity) do
|
||||
Map.put(entity, :children, Enum.map(children, &format_child(&1)))
|
||||
end
|
||||
|
||||
defp format_children(entity), do: entity
|
||||
|
||||
defp format_child(%{suggestions: suggestions} = entity) do
|
||||
entity
|
||||
|> Map.put(:suggestions, format_suggestions(suggestions))
|
||||
|> format_key()
|
||||
|> format_children()
|
||||
end
|
||||
|
||||
defp format_child(entity) do
|
||||
entity
|
||||
|> format_key()
|
||||
|> format_children()
|
||||
end
|
||||
|
||||
defp atom_to_string(entity) when is_binary(entity), do: entity
|
||||
|
||||
defp atom_to_string(entity) when is_atom(entity), do: inspect(entity)
|
||||
|
||||
defp humanize(entity) do
|
||||
string = inspect(entity)
|
||||
|
||||
if String.starts_with?(string, ":"),
|
||||
do: Phoenix.Naming.humanize(entity),
|
||||
else: string
|
||||
end
|
||||
|
||||
defp format_suggestions([]), do: []
|
||||
|
||||
defp format_suggestions([suggestion | tail]) do
|
||||
[format_suggestion(suggestion) | format_suggestions(tail)]
|
||||
end
|
||||
|
||||
defp format_suggestion(entity) when is_atom(entity) do
|
||||
atom_to_string(entity)
|
||||
end
|
||||
|
||||
defp format_suggestion([head | tail] = entity) when is_list(entity) do
|
||||
[format_suggestion(head) | format_suggestions(tail)]
|
||||
end
|
||||
|
||||
defp format_suggestion(entity) when is_tuple(entity) do
|
||||
format_suggestions(Tuple.to_list(entity)) |> List.to_tuple()
|
||||
end
|
||||
|
||||
defp format_suggestion(entity), do: entity
|
||||
end
|
||||
|
||||
defimpl Jason.Encoder, for: Tuple do
|
||||
def encode(tuple, opts) do
|
||||
Jason.Encode.list(Tuple.to_list(tuple), opts)
|
||||
end
|
||||
def encode(tuple, opts), do: Jason.Encode.list(Tuple.to_list(tuple), opts)
|
||||
end
|
||||
|
||||
defimpl Jason.Encoder, for: [Regex, Function] do
|
||||
def encode(term, opts) do
|
||||
Jason.Encode.string(inspect(term), opts)
|
||||
end
|
||||
def encode(term, opts), do: Jason.Encode.string(inspect(term), opts)
|
||||
end
|
||||
|
||||
defimpl String.Chars, for: Regex do
|
||||
def to_string(term) do
|
||||
inspect(term)
|
||||
end
|
||||
def to_string(term), do: inspect(term)
|
||||
end
|
||||
|
|
|
|||
|
|
@ -3,18 +3,22 @@ defmodule Pleroma.Docs.JSON do
|
|||
|
||||
@spec process(keyword()) :: {:ok, String.t()}
|
||||
def process(descriptions) do
|
||||
config_path = "docs/generate_config.json"
|
||||
|
||||
with {:ok, file} <- File.open(config_path, [:write, :utf8]),
|
||||
json <- generate_json(descriptions),
|
||||
with path <- "docs/generated_config.json",
|
||||
{:ok, file} <- File.open(path, [:write, :utf8]),
|
||||
formatted_descriptions <-
|
||||
Pleroma.Docs.Generator.convert_to_strings(descriptions),
|
||||
json <- Jason.encode!(formatted_descriptions),
|
||||
:ok <- IO.write(file, json),
|
||||
:ok <- File.close(file) do
|
||||
{:ok, config_path}
|
||||
{:ok, path}
|
||||
end
|
||||
end
|
||||
|
||||
@spec generate_json([keyword()]) :: String.t()
|
||||
def generate_json(descriptions) do
|
||||
Jason.encode!(descriptions)
|
||||
def compile do
|
||||
with {config, _paths} <- Mix.Config.eval!("config/description.exs") do
|
||||
config[:pleroma][:config_description]
|
||||
|> Pleroma.Docs.Generator.convert_to_strings()
|
||||
|> Jason.encode!()
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue