merging release default config on app start
authorAlexander Strizhakov <alex.strizhakov@gmail.com>
Wed, 11 Mar 2020 13:25:53 +0000 (16:25 +0300)
committerAlexander Strizhakov <alex.strizhakov@gmail.com>
Wed, 11 Mar 2020 13:25:53 +0000 (16:25 +0300)
lib/mix/tasks/pleroma/docs.ex
lib/pleroma/application.ex
lib/pleroma/config/holder.ex
lib/pleroma/config/loader.ex
lib/pleroma/config/transfer_task.ex
lib/pleroma/docs/json.ex
lib/pleroma/web/admin_api/admin_api_controller.ex
test/config/holder_test.exs
test/config/loader_test.exs
test/config/transfer_task_test.exs

index 3c870f8766fc263ee63e63311652d1d78c09488c..6088fc71d33c8759a17723fcdb13b28e5caeaccd 100644 (file)
@@ -28,7 +28,7 @@ defmodule Mix.Tasks.Pleroma.Docs do
   defp do_run(implementation) do
     start_pleroma()
 
-    with descriptions <- Pleroma.Config.Loader.load("config/description.exs"),
+    with descriptions <- Pleroma.Config.Loader.read("config/description.exs"),
          {:ok, file_path} <-
            Pleroma.Docs.Generator.process(
              implementation,
index 18854b850bf5526390841ea4a0d47b7ff2dcafec..c5b9a98fd18a37c31d56c8d9aeda22a5dffe3fa1 100644 (file)
@@ -31,6 +31,7 @@ defmodule Pleroma.Application do
   # See http://elixir-lang.org/docs/stable/elixir/Application.html
   # for more information on OTP Applications
   def start(_type, _args) do
+    Pleroma.Config.Holder.to_ets()
     Pleroma.HTML.compile_scrubbers()
     Pleroma.Config.DeprecationWarnings.warn()
     Pleroma.Plugs.HTTPSecurityPlug.warn_if_disabled()
index f1a339703e59f2245c9c31bb1adf091501de7e2a..88e1db3135bcd39ca948226e67e4356d2ca75b0a 100644 (file)
@@ -3,14 +3,38 @@
 # SPDX-License-Identifier: AGPL-3.0-only
 
 defmodule Pleroma.Config.Holder do
-  @config Pleroma.Config.Loader.load_and_merge()
+  @config Pleroma.Config.Loader.default_config()
 
-  @spec config() :: keyword()
-  def config, do: @config
+  @spec to_ets() :: true
+  def to_ets do
+    :ets.new(:default_config, [:named_table, :protected])
 
-  @spec config(atom()) :: any()
-  def config(group), do: @config[group]
+    default_config =
+      if System.get_env("RELEASE_NAME") do
+        release_config =
+          [:code.root_dir(), "releases", System.get_env("RELEASE_VSN"), "releases.exs"]
+          |> Path.join()
+          |> Pleroma.Config.Loader.read()
 
-  @spec config(atom(), atom()) :: any()
-  def config(group, key), do: @config[group][key]
+        Pleroma.Config.Loader.merge(@config, release_config)
+      else
+        @config
+      end
+
+    :ets.insert(:default_config, {:config, default_config})
+  end
+
+  @spec default_config() :: keyword()
+  def default_config, do: from_ets()
+
+  @spec default_config(atom()) :: keyword()
+  def default_config(group), do: Keyword.get(from_ets(), group)
+
+  @spec default_config(atom(), atom()) :: keyword()
+  def default_config(group, key), do: get_in(from_ets(), [group, key])
+
+  defp from_ets do
+    [{:config, default_config}] = :ets.lookup(:default_config, :config)
+    default_config
+  end
 end
index df2d18725bc59cd9dd94aeb7e230052cefab66c9..b2cb34129ed81dbb946dd981d7584f945d1d9daa 100644 (file)
@@ -13,32 +13,22 @@ defmodule Pleroma.Config.Loader do
   ]
 
   if Code.ensure_loaded?(Config.Reader) do
-    @spec load(Path.t()) :: keyword()
-    def load(path), do: Config.Reader.read!(path)
-
-    defp do_merge(conf1, conf2), do: Config.Reader.merge(conf1, conf2)
+    @reader Config.Reader
   else
     # support for Elixir less than 1.9
-    @spec load(Path.t()) :: keyword()
-    def load(path) do
-      path
-      |> Mix.Config.eval!()
-      |> elem(0)
-    end
-
-    defp do_merge(conf1, conf2), do: Mix.Config.merge(conf1, conf2)
+    @reader Mix.Config
   end
 
-  @spec load_and_merge() :: keyword()
-  def load_and_merge do
-    all_paths =
-      if Pleroma.Config.get(:release),
-        do: ["config/config.exs", "config/releases.exs"],
-        else: ["config/config.exs"]
+  @spec read(Path.t()) :: keyword()
+  def read(path), do: @reader.read!(path)
+
+  @spec merge(keyword(), keyword()) :: keyword()
+  def merge(c1, c2), do: @reader.merge(c1, c2)
 
-    all_paths
-    |> Enum.map(&load(&1))
-    |> Enum.reduce([], &do_merge(&2, &1))
+  @spec default_config() :: keyword()
+  def default_config do
+    "config/config.exs"
+    |> read()
     |> filter()
   end
 
index 435fc7450b39dd6f634c2ecf5163aa71a59f0cfb..7c3449b5e0e06ac27f677dcc74dfca0477caa322 100644 (file)
@@ -83,7 +83,7 @@ defmodule Pleroma.Config.TransferTask do
       key = ConfigDB.from_string(setting.key)
       group = ConfigDB.from_string(setting.group)
 
-      default = Pleroma.Config.Holder.config(group, key)
+      default = Pleroma.Config.Holder.default_config(group, key)
       value = ConfigDB.from_binary(setting.value)
 
       merged_value =
index 6508a7bdb50e2d2edac10c15e30776aa480f9e33..74f8b261507e0c8db343ac01eeccbc53b08060cf 100644 (file)
@@ -15,7 +15,7 @@ defmodule Pleroma.Docs.JSON do
   end
 
   def compile do
-    with config <- Pleroma.Config.Loader.load("config/description.exs") do
+    with config <- Pleroma.Config.Loader.read("config/description.exs") do
       config[:pleroma][:config_description]
       |> Pleroma.Docs.Generator.convert_to_strings()
       |> Jason.encode!()
index de0755ee55374cf3fd920523b8e1e2d7260df938..47b7d2da38ef73c443332b96fa5d9c75912d4d4f 100644 (file)
@@ -834,7 +834,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIController do
       configs = ConfigDB.get_all_as_keyword()
 
       merged =
-        Config.Holder.config()
+        Config.Holder.default_config()
         |> ConfigDB.merge(configs)
         |> Enum.map(fn {group, values} ->
           Enum.map(values, fn {key, value} ->
index 2368d4856e4d375b46395a8432e0c8d5c7ebede4..15d48b5c7d5fa76c9d5b68993e3629e47d654725 100644 (file)
@@ -7,8 +7,8 @@ defmodule Pleroma.Config.HolderTest do
 
   alias Pleroma.Config.Holder
 
-  test "config/0" do
-    config = Holder.config()
+  test "default_config/0" do
+    config = Holder.default_config()
     assert config[:pleroma][Pleroma.Uploaders.Local][:uploads] == "test/uploads"
     assert config[:tesla][:adapter] == Tesla.Mock
 
@@ -20,15 +20,15 @@ defmodule Pleroma.Config.HolderTest do
     refute config[:phoenix][:serve_endpoints]
   end
 
-  test "config/1" do
-    pleroma_config = Holder.config(:pleroma)
+  test "default_config/1" do
+    pleroma_config = Holder.default_config(:pleroma)
     assert pleroma_config[Pleroma.Uploaders.Local][:uploads] == "test/uploads"
-    tesla_config = Holder.config(:tesla)
+    tesla_config = Holder.default_config(:tesla)
     assert tesla_config[:adapter] == Tesla.Mock
   end
 
-  test "config/2" do
-    assert Holder.config(:pleroma, Pleroma.Uploaders.Local) == [uploads: "test/uploads"]
-    assert Holder.config(:tesla, :adapter) == Tesla.Mock
+  test "default_config/2" do
+    assert Holder.default_config(:pleroma, Pleroma.Uploaders.Local) == [uploads: "test/uploads"]
+    assert Holder.default_config(:tesla, :adapter) == Tesla.Mock
   end
 end
index 4c93e5d4d2b313beeb70f58c92a41dd5d97a9690..607572f4ea1d9ffd47094dffb5ff8dee09e44a55 100644 (file)
@@ -7,28 +7,13 @@ defmodule Pleroma.Config.LoaderTest do
 
   alias Pleroma.Config.Loader
 
-  test "load/1" do
-    config = Loader.load("test/fixtures/config/temp.secret.exs")
+  test "read/1" do
+    config = Loader.read("test/fixtures/config/temp.secret.exs")
     assert config[:pleroma][:first_setting][:key] == "value"
     assert config[:pleroma][:first_setting][:key2] == [Pleroma.Repo]
     assert config[:quack][:level] == :info
   end
 
-  test "load_and_merge/0" do
-    config = Loader.load_and_merge()
-
-    refute config[:pleroma][Pleroma.Repo]
-    refute config[:pleroma][Pleroma.Web.Endpoint]
-    refute config[:pleroma][:env]
-    refute config[:pleroma][:configurable_from_database]
-    refute config[:pleroma][:database]
-    refute config[:phoenix][:serve_endpoints]
-
-    assert config[:pleroma][:ecto_repos] == [Pleroma.Repo]
-    assert config[:pleroma][Pleroma.Uploaders.Local][:uploads] == "test/uploads"
-    assert config[:tesla][:adapter] == Tesla.Mock
-  end
-
   test "filter_group/2" do
     assert Loader.filter_group(:pleroma,
              pleroma: [
index ce31d1e877c35eb81cde8422a965d35a42c006cf..01d04761d2c165418c528c65607d02d799ce1876 100644 (file)
@@ -70,7 +70,7 @@ defmodule Pleroma.Config.TransferTaskTest do
 
     assert Application.get_env(:quack, :level) == :info
     assert Application.get_env(:quack, :meta) == [:none]
-    default = Pleroma.Config.Holder.config(:quack, :webhook_url)
+    default = Pleroma.Config.Holder.default_config(:quack, :webhook_url)
     assert Application.get_env(:quack, :webhook_url) == default
 
     on_exit(fn ->