description formatters
authorAlex S <alex.strizhakov@gmail.com>
Fri, 30 Aug 2019 10:21:48 +0000 (13:21 +0300)
committerAlex S <alex.strizhakov@gmail.com>
Wed, 11 Sep 2019 06:25:33 +0000 (09:25 +0300)
lib/pleroma/docs/formatter.ex [new file with mode: 0644]
lib/pleroma/docs/json.ex [new file with mode: 0644]
lib/pleroma/docs/markdown.ex [new file with mode: 0644]

diff --git a/lib/pleroma/docs/formatter.ex b/lib/pleroma/docs/formatter.ex
new file mode 100644 (file)
index 0000000..a1c7579
--- /dev/null
@@ -0,0 +1,69 @@
+defmodule Pleroma.Docs.Formatter do
+  @callback process(keyword()) :: {:ok, String.t()}
+
+  @spec process(module(), keyword()) :: {:ok, String.t()}
+  def process(implementation, descriptions) do
+    implementation.process(descriptions)
+  end
+
+  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) in ["S3", "Local", "MDII"]
+    end)
+  end
+
+  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)
+  end
+
+  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)
+  end
+
+  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)
+  end
+end
+
+defimpl Jason.Encoder, for: Tuple do
+  def encode(tuple, opts) do
+    Jason.Encode.list(Tuple.to_list(tuple), opts)
+  end
+end
+
+defimpl Jason.Encoder, for: [Regex, Function] do
+  def encode(term, opts) do
+    Jason.Encode.string(inspect(term), opts)
+  end
+end
+
+defimpl String.Chars, for: Regex do
+  def to_string(term) do
+    inspect(term)
+  end
+end
diff --git a/lib/pleroma/docs/json.ex b/lib/pleroma/docs/json.ex
new file mode 100644 (file)
index 0000000..38f0150
--- /dev/null
@@ -0,0 +1,15 @@
+defmodule Pleroma.Docs.JSON do
+  @behaviour Pleroma.Docs.Formatter
+  def process(descriptions) do
+    config_path = "docs/generate_config.json"
+    {:ok, file} = File.open(config_path, [:write])
+    json = generate_json(descriptions)
+    IO.write(file, json)
+    :ok = File.close(file)
+    {:ok, config_path}
+  end
+
+  def generate_json(descriptions) do
+    Jason.encode!(descriptions)
+  end
+end
diff --git a/lib/pleroma/docs/markdown.ex b/lib/pleroma/docs/markdown.ex
new file mode 100644 (file)
index 0000000..27a0966
--- /dev/null
@@ -0,0 +1,67 @@
+defmodule Pleroma.Docs.Markdown do
+  @behaviour Pleroma.Docs.Formatter
+
+  def process(descriptions) do
+    config_path = "docs/config.md"
+    {:ok, file} = File.open(config_path, [:write])
+    IO.write(file, "# Generated configuration\r\n\r\n")
+    IO.write(file, "Date of generation: #{Date.utc_today()}\r\n\r\n")
+
+    IO.write(
+      file,
+      "This file describe the configuration, it is recommended to edit the relevant *.secret.exs file instead of the others founds in the ``config`` directory.
+If you run Pleroma with ``MIX_ENV=prod`` the file is ``prod.secret.exs``, otherwise it is ``dev.secret.exs``.\r\n\r\n"
+    )
+
+    for group <- descriptions do
+      if is_nil(group[:key]) do
+        IO.write(file, "## #{inspect(group[:group])}\r\n\r\n")
+      else
+        IO.write(file, "## #{inspect(group[:key])}\r\n\r\n")
+      end
+
+      IO.write(file, "Type: `#{group[:type]}`  \r\n")
+      IO.write(file, "#{group[:description]}  \r\n\r\n")
+
+      for child <- group[:children] do
+        print_child_header(file, child)
+
+        print_suggestions(file, child[:suggestions])
+
+        if child[:children] do
+          for subchild <- child[:children] do
+            print_child_header(file, subchild)
+
+            print_suggestions(file, subchild[:suggestions])
+          end
+        end
+      end
+
+      IO.write(file, "\r\n")
+    end
+
+    :ok = File.close(file)
+    {:ok, config_path}
+  end
+
+  defp print_suggestion(file, suggestion) when is_function(suggestion) do
+    IO.write(file, "    `#{inspect(suggestion.())}`\r\n")
+  end
+
+  defp print_suggestion(file, suggestion) do
+    IO.write(file, "    `#{inspect(suggestion)}`\r\n")
+  end
+
+  defp print_suggestions(file, suggestions) do
+    IO.write(file, "Suggestions:  \r\n")
+
+    for suggestion <- suggestions do
+      print_suggestion(file, suggestion)
+    end
+  end
+
+  defp print_child_header(file, child) do
+    IO.write(file, "* `#{inspect(child[:key])}`: #{child[:description]}  \r\n")
+    IO.write(file, "Type: `#{inspect(child[:type])}`  \r\n")
+  end
+end