logo

pleroma

My custom branche(s) on git.pleroma.social/pleroma/pleroma git clone https://anongit.hacktivis.me/git/pleroma.git/
commit: d0dac30ac6e6808e772a5ec0b378e2b8294fc93a
parent 013c60e13a5edfdd70e3ab87f8e5fa3dc501783e
Author: mkljczk <git@mkljczk.pl>
Date:   Sat, 22 Feb 2025 15:53:44 +0100

Merge downstream changes

Signed-off-by: mkljczk <git@mkljczk.pl>

Diffstat:

Mlib/pleroma/application_requirements.ex18+++++++++++++++++-
Mlib/pleroma/language/translation.ex22++++++++++++++++++++++
Mlib/pleroma/language/translation/deepl.ex2++
Mlib/pleroma/language/translation/libretranslate.ex4+++-
Mlib/pleroma/language/translation/provider.ex13+++++++++++++
Rtest/pleroma/language/translation/deepl_test.ex -> test/pleroma/language/translation/deepl_test.exs0
Dtest/pleroma/language/translation_test.ex29-----------------------------
Atest/pleroma/language/translation_test.exs28++++++++++++++++++++++++++++
8 files changed, 85 insertions(+), 31 deletions(-)

diff --git a/lib/pleroma/application_requirements.ex b/lib/pleroma/application_requirements.ex @@ -189,7 +189,23 @@ defmodule Pleroma.ApplicationRequirements do false end - if Enum.all?([preview_proxy_commands_status | filter_commands_statuses], & &1) do + translation_commands_status = + if Pleroma.Language.Translation.missing_dependencies() == [] do + true + else + Logger.error( + "The following dependencies required by the currently enabled " <> + "translation provider are not installed: " <> + inspect(Pleroma.Language.Translation.missing_dependencies()) + ) + + false + end + + if Enum.all?( + [preview_proxy_commands_status, translation_commands_status | filter_commands_statuses], + & &1 + ) do :ok else {:error, diff --git a/lib/pleroma/language/translation.ex b/lib/pleroma/language/translation.ex @@ -11,6 +11,16 @@ defmodule Pleroma.Language.Translation do !!provider and provider.configured? end + def missing_dependencies do + provider = get_provider() + + if provider do + provider.missing_dependencies() + else + [] + end + end + def translate(text, source_language, target_language) do cache_key = get_cache_key(text, source_language, target_language) @@ -23,6 +33,7 @@ defmodule Pleroma.Language.Translation do {:error, :not_found} else provider.translate(text, source_language, target_language) + |> scrub_html() end store_result(result, cache_key) @@ -102,4 +113,15 @@ defmodule Pleroma.Language.Translation do defp store_result(_, _), do: nil defp content_hash(text), do: :crypto.hash(:sha256, text) |> Base.encode64() + + defp scrub_html({:ok, %{content: content} = result}) when is_binary(content) do + scrubbers = Pleroma.Config.get([:markup, :scrub_policy]) + + content + |> Pleroma.HTML.filter_tags(scrubbers) + + {:ok, %{result | content: content}} + end + + defp scrub_html(result), do: result end diff --git a/lib/pleroma/language/translation/deepl.ex b/lib/pleroma/language/translation/deepl.ex @@ -7,6 +7,8 @@ defmodule Pleroma.Language.Translation.Deepl do alias Pleroma.Language.Translation.Provider + use Provider + @behaviour Provider @name "DeepL" diff --git a/lib/pleroma/language/translation/libretranslate.ex b/lib/pleroma/language/translation/libretranslate.ex @@ -7,6 +7,8 @@ defmodule Pleroma.Language.Translation.Libretranslate do alias Pleroma.Language.Translation.Provider + use Provider + @behaviour Provider @name "LibreTranslate" @@ -44,7 +46,7 @@ defmodule Pleroma.Language.Translation.Libretranslate do %{ content: content, detected_source_language: source_language, - provider: "LibreTranslate" + provider: @name }} _ -> diff --git a/lib/pleroma/language/translation/provider.ex b/lib/pleroma/language/translation/provider.ex @@ -3,6 +3,10 @@ # SPDX-License-Identifier: AGPL-3.0-only defmodule Pleroma.Language.Translation.Provider do + alias Pleroma.Language.Translation.Provider + + @callback missing_dependencies() :: [String.t()] + @callback configured?() :: boolean() @callback translate( @@ -24,4 +28,13 @@ defmodule Pleroma.Language.Translation.Provider do @callback languages_matrix() :: {:ok, Map.t()} | {:error, atom()} @callback name() :: String.t() + + defmacro __using__(_opts) do + quote do + @impl Provider + def missing_dependencies, do: [] + + defoverridable missing_dependencies: 0 + end + end end diff --git a/test/pleroma/language/translation/deepl_test.ex b/test/pleroma/language/translation/deepl_test.exs diff --git a/test/pleroma/language/translation_test.ex b/test/pleroma/language/translation_test.ex @@ -1,29 +0,0 @@ -defmodule Pleroma.Language.TranslationTest do - use Pleroma.Web.ConnCase - - alias Pleroma.Language.Translation - # use Oban.Testing, repo: Pleroma.Repo - - setup do: clear_config([Pleroma.Language.Translation, :provider], TranslationMock) - - test "it translates text" do - assert {:ok, - %{ - content: "txet emos", - detected_source_language: _, - provider: _ - }} = Translation.translate("some text", "en", "uk") - end - - test "it stores translation result in cache" do - Translation.translate("some text", "en", "uk") - - assert {:ok, result} = - Cachex.get( - :translations_cache, - "en/uk/#{:crypto.hash(:sha256, "some text") |> Base.encode64()}" - ) - - assert result.content == "txet emos" - end -end diff --git a/test/pleroma/language/translation_test.exs b/test/pleroma/language/translation_test.exs @@ -0,0 +1,28 @@ +defmodule Pleroma.Language.TranslationTest do + use Pleroma.Web.ConnCase + + alias Pleroma.Language.Translation + + setup do: clear_config([Pleroma.Language.Translation, :provider], TranslationMock) + + test "it translates text" do + assert {:ok, + %{ + content: "txet emos", + detected_source_language: _, + provider: _ + }} = Translation.translate("some text", "en", "uk") + end + + test "it stores translation result in cache" do + Translation.translate("some text", "en", "uk") + + assert {:ok, result} = + Cachex.get( + :translations_cache, + "en/uk/#{:crypto.hash(:sha256, "some text") |> Base.encode64()}" + ) + + assert result.content == "txet emos" + end +end