diff options
| author | Lain Soykaf <lain@lain.com> | 2023-11-12 13:53:18 +0400 | 
|---|---|---|
| committer | Lain Soykaf <lain@lain.com> | 2023-11-12 13:53:18 +0400 | 
| commit | 0c5cc519833166e1c748deb81394af9940c05928 (patch) | |
| tree | 4eb13f297395d738df1054c82a744b3ae99479e0 /lib/mix | |
| parent | 398141da68328cea982f017a3e8bc95a9f9c1fbf (diff) | |
| parent | a51f3937eef0c6add91234863d5f936c59830d88 (diff) | |
| download | pleroma-0c5cc519833166e1c748deb81394af9940c05928.tar.gz pleroma-0c5cc519833166e1c748deb81394af9940c05928.zip | |
Merge branch 'develop' of git.pleroma.social:pleroma/pleroma into pleroma-meilisearch
Diffstat (limited to 'lib/mix')
| -rw-r--r-- | lib/mix/tasks/pleroma/benchmark.ex | 113 | ||||
| -rw-r--r-- | lib/mix/tasks/pleroma/instance.ex | 13 | ||||
| -rw-r--r-- | lib/mix/tasks/pleroma/openapi_spec.ex | 67 | 
3 files changed, 75 insertions, 118 deletions
| diff --git a/lib/mix/tasks/pleroma/benchmark.ex b/lib/mix/tasks/pleroma/benchmark.ex deleted file mode 100644 index f32492169..000000000 --- a/lib/mix/tasks/pleroma/benchmark.ex +++ /dev/null @@ -1,113 +0,0 @@ -# Pleroma: A lightweight social networking server -# Copyright © 2017-2022 Pleroma Authors <https://pleroma.social/> -# SPDX-License-Identifier: AGPL-3.0-only - -defmodule Mix.Tasks.Pleroma.Benchmark do -  import Mix.Pleroma -  use Mix.Task - -  def run(["search"]) do -    start_pleroma() - -    Benchee.run(%{ -      "search" => fn -> -        Pleroma.Activity.search(nil, "cofe") -      end -    }) -  end - -  def run(["tag"]) do -    start_pleroma() - -    Benchee.run(%{ -      "tag" => fn -> -        %{"type" => "Create", "tag" => "cofe"} -        |> Pleroma.Web.ActivityPub.ActivityPub.fetch_public_activities() -      end -    }) -  end - -  def run(["render_timeline", nickname | _] = args) do -    start_pleroma() -    user = Pleroma.User.get_by_nickname(nickname) - -    activities = -      %{} -      |> Map.put("type", ["Create", "Announce"]) -      |> Map.put("blocking_user", user) -      |> Map.put("muting_user", user) -      |> Map.put("user", user) -      |> Map.put("limit", 4096) -      |> Pleroma.Web.ActivityPub.ActivityPub.fetch_public_activities() -      |> Enum.reverse() - -    inputs = %{ -      "1 activity" => Enum.take_random(activities, 1), -      "10 activities" => Enum.take_random(activities, 10), -      "20 activities" => Enum.take_random(activities, 20), -      "40 activities" => Enum.take_random(activities, 40), -      "80 activities" => Enum.take_random(activities, 80) -    } - -    inputs = -      if Enum.at(args, 2) == "extended" do -        Map.merge(inputs, %{ -          "200 activities" => Enum.take_random(activities, 200), -          "500 activities" => Enum.take_random(activities, 500), -          "2000 activities" => Enum.take_random(activities, 2000), -          "4096 activities" => Enum.take_random(activities, 4096) -        }) -      else -        inputs -      end - -    Benchee.run( -      %{ -        "Standart rendering" => fn activities -> -          Pleroma.Web.MastodonAPI.StatusView.render("index.json", %{ -            activities: activities, -            for: user, -            as: :activity -          }) -        end -      }, -      inputs: inputs -    ) -  end - -  def run(["adapters"]) do -    start_pleroma() - -    :ok = -      Pleroma.Gun.Conn.open( -        "https://httpbin.org/stream-bytes/1500", -        :gun_connections -      ) - -    Process.sleep(1_500) - -    Benchee.run( -      %{ -        "Without conn and without pool" => fn -> -          {:ok, %Tesla.Env{}} = -            Pleroma.HTTP.get("https://httpbin.org/stream-bytes/1500", [], -              pool: :no_pool, -              receive_conn: false -            ) -        end, -        "Without conn and with pool" => fn -> -          {:ok, %Tesla.Env{}} = -            Pleroma.HTTP.get("https://httpbin.org/stream-bytes/1500", [], receive_conn: false) -        end, -        "With reused conn and without pool" => fn -> -          {:ok, %Tesla.Env{}} = -            Pleroma.HTTP.get("https://httpbin.org/stream-bytes/1500", [], pool: :no_pool) -        end, -        "With reused conn and with pool" => fn -> -          {:ok, %Tesla.Env{}} = Pleroma.HTTP.get("https://httpbin.org/stream-bytes/1500") -        end -      }, -      parallel: 10 -    ) -  end -end diff --git a/lib/mix/tasks/pleroma/instance.ex b/lib/mix/tasks/pleroma/instance.ex index 5c93f19ff..5d8b254a2 100644 --- a/lib/mix/tasks/pleroma/instance.ex +++ b/lib/mix/tasks/pleroma/instance.ex @@ -266,12 +266,20 @@ defmodule Mix.Tasks.Pleroma.Instance do        config_dir = Path.dirname(config_path)        psql_dir = Path.dirname(psql_path) +      # Note: Distros requiring group read (0o750) on those directories should +      # pre-create the directories.        [config_dir, psql_dir, static_dir, uploads_dir]        |> Enum.reject(&File.exists?/1) -      |> Enum.map(&File.mkdir_p!/1) +      |> Enum.each(fn dir -> +        File.mkdir_p!(dir) +        File.chmod!(dir, 0o700) +      end)        shell_info("Writing config to #{config_path}.") +      # Sadly no fchmod(2) equivalent in Elixir… +      File.touch!(config_path) +      File.chmod!(config_path, 0o640)        File.write(config_path, result_config)        shell_info("Writing the postgres script to #{psql_path}.")        File.write(psql_path, result_psql) @@ -290,8 +298,7 @@ defmodule Mix.Tasks.Pleroma.Instance do      else        shell_error(          "The task would have overwritten the following files:\n" <> -          (Enum.map(will_overwrite, &"- #{&1}\n") |> Enum.join("")) <> -          "Rerun with `--force` to overwrite them." +          Enum.map_join(will_overwrite, &"- #{&1}\n") <> "Rerun with `--force` to overwrite them."        )      end    end diff --git a/lib/mix/tasks/pleroma/openapi_spec.ex b/lib/mix/tasks/pleroma/openapi_spec.ex index 884f931f8..1ea468476 100644 --- a/lib/mix/tasks/pleroma/openapi_spec.ex +++ b/lib/mix/tasks/pleroma/openapi_spec.ex @@ -6,7 +6,70 @@ defmodule Mix.Tasks.Pleroma.OpenapiSpec do    def run([path]) do      # Load Pleroma application to get version info      Application.load(:pleroma) -    spec = Pleroma.Web.ApiSpec.spec(server_specific: false) |> Jason.encode!() -    File.write(path, spec) + +    spec_json = Pleroma.Web.ApiSpec.spec(server_specific: false) |> Jason.encode!() +    # to get rid of the structs +    spec_regened = spec_json |> Jason.decode!() + +    check_specs!(spec_regened) + +    File.write(path, spec_json) +  end + +  defp check_specs!(spec) do +    with :ok <- check_specs(spec) do +      :ok +    else +      {_, errors} -> +        IO.puts(IO.ANSI.format([:red, :bright, "Spec check failed, errors:"])) +        Enum.map(errors, &IO.puts/1) + +        raise "Spec check failed" +    end +  end + +  def check_specs(spec) do +    errors = +      spec["paths"] +      |> Enum.flat_map(fn {path, %{} = endpoints} -> +        Enum.map( +          endpoints, +          fn {method, endpoint} -> +            with :ok <- check_endpoint(spec, endpoint) do +              :ok +            else +              error -> +                "#{endpoint["operationId"]} (#{method} #{path}): #{error}" +            end +          end +        ) +        |> Enum.reject(fn res -> res == :ok end) +      end) + +    if errors == [] do +      :ok +    else +      {:error, errors} +    end +  end + +  defp check_endpoint(spec, endpoint) do +    valid_tags = available_tags(spec) + +    with {_, [_ | _] = tags} <- {:tags, endpoint["tags"]}, +         {_, []} <- {:unavailable, Enum.reject(tags, &(&1 in valid_tags))} do +      :ok +    else +      {:tags, _} -> +        "No tags specified" + +      {:unavailable, tags} -> +        "Tags #{inspect(tags)} not available. Please add it in \"x-tagGroups\" in Pleroma.Web.ApiSpec" +    end +  end + +  defp available_tags(spec) do +    spec["x-tagGroups"] +    |> Enum.flat_map(fn %{"tags" => tags} -> tags end)    end  end | 
