diff options
-rw-r--r-- | .travis.yml | 20 | ||||
-rw-r--r-- | lib/powerdnsex.ex | 21 | ||||
-rw-r--r-- | lib/powerdnsex/config.ex | 25 | ||||
-rw-r--r-- | lib/powerdnsex/gen_server/server.ex | 4 | ||||
-rw-r--r-- | mix.exs | 7 | ||||
-rw-r--r-- | mix.lock | 3 | ||||
-rw-r--r-- | test/lib/powerdnsex/config_test.exs | 15 | ||||
-rw-r--r-- | test/lib/powerdnsex/powerdnsex_test.exs | 4 |
8 files changed, 64 insertions, 35 deletions
diff --git a/.travis.yml b/.travis.yml index ff0b64d..775894c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -2,13 +2,25 @@ language: elixir elixir: - - 1.8 + - 1.10 otp_release: - - 21.0 + - 22.3 script: mix test matrix: include: - - elixir: '1.8.2' -otp_release: '21.3' + - elixir: '1.6' + otp_release: '19.3' + + - elixir: '1.7' + otp_release: '20.0' + + - elixir: '1.7' + otp_release: '21.0' + + - elixir: '1.8' + otp_release: '21.3' + + - elixir: '1.9' + otp_release: '22.3' diff --git a/lib/powerdnsex.ex b/lib/powerdnsex.ex index 86628b7..b77389c 100644 --- a/lib/powerdnsex.ex +++ b/lib/powerdnsex.ex @@ -9,10 +9,8 @@ defmodule PowerDNSex do @spec start() :: GenServer.on_start() @doc false - def start() do - import Supervisor.Spec - - children = [worker(Server, [@name])] + def start do + children = [:poolboy.child_spec(:pool, pool_config())] options = [strategy: :one_for_one, name: :"#{@name}.Supervisor"] try do @@ -98,5 +96,18 @@ defmodule PowerDNSex do # Private # ########### - defp call(params), do: GenServer.call(@name, params, Config.powerdns_timeout) + defp pool_config do + [ + name: {:local, @name}, + worker_module: Server, + size: Application.get_env(:powerdnsex, :pool_size, 20), + max_overflow: Application.get_env(:powerdnsex, :pool_overflow, 8) + ] + end + + defp call(params) do + :poolboy.transaction(@name, fn pid -> + GenServer.call(pid, params, Config.powerdns_timeout) + end) + end end diff --git a/lib/powerdnsex/config.ex b/lib/powerdnsex/config.ex index 1302524..314dbca 100644 --- a/lib/powerdnsex/config.ex +++ b/lib/powerdnsex/config.ex @@ -1,12 +1,10 @@ defmodule PowerDNSex.Config do - defstruct url: "", - token: "", - timeout: "60" + defstruct [:url, :token, timeout: 60] alias PowerDNSex.Config def data do - set_attr_value = &Map.put(&2, &1, get_key(&1)) + set_attr_value = &Map.update!(&2, &1, get_key(&1)) %Config{} |> Map.from_struct() @@ -30,15 +28,20 @@ defmodule PowerDNSex.Config do ### defp get_key(key) do - case Application.fetch_env(:powerdnsex, key) do - {:ok, {:system, env_var_name}} -> - System.get_env(env_var_name) + fn default -> + case Application.fetch_env(:powerdnsex, key) do + {:ok, {:system, env_var_name}} -> + System.get_env(env_var_name) - {:ok, value} -> - value + {:ok, value} -> + value - _ -> - raise "[PowerDNSex] PowerDNS #{Atom.to_string(key)} not configured." + _ when default != nil -> + default + + _ -> + raise "[PowerDNSex] PowerDNS #{Atom.to_string(key)} not configured." + end end end end diff --git a/lib/powerdnsex/gen_server/server.ex b/lib/powerdnsex/gen_server/server.ex index a0bb7d8..df8a453 100644 --- a/lib/powerdnsex/gen_server/server.ex +++ b/lib/powerdnsex/gen_server/server.ex @@ -8,8 +8,8 @@ defmodule PowerDNSex.Server do {:ok, args} end - def start_link(name) do - GenServer.start_link(__MODULE__, :ok, name: name) + def start_link(_) do + GenServer.start_link(__MODULE__, :ok) end ### @@ -4,8 +4,8 @@ defmodule PowerDNSex.Mixfile do def project do [ app: :powerdnsex, - version: "0.3.1", - elixir: "~> 1.8", + version: "0.4.0", + elixir: "~> 1.6", description: description(), package: package(), build_embedded: Mix.env() == :prod, @@ -20,8 +20,9 @@ defmodule PowerDNSex.Mixfile do defp deps do [ + {:poolboy, "~> 1.5"}, {:httpoison, "~> 1.5.0"}, - {:poison, "~> 3.1.0"}, + {:poison, "~> 3.0 or ~> 4.0.1"}, {:exvcr, "~> 0.10.3", only: :test}, {:ex_doc, ">= 0.0.0", only: :dev} ] @@ -16,7 +16,8 @@ "mimerl": {:hex, :mimerl, "1.0.2", "993f9b0e084083405ed8252b99460c4f0563e41729ab42d9074fd5e52439be88", [:rebar3], [], "hexpm", "7a4c8e1115a2732a67d7624e28cf6c9f30c66711a9e92928e745c255887ba465"}, "nimble_parsec": {:hex, :nimble_parsec, "0.5.0", "90e2eca3d0266e5c53f8fbe0079694740b9c91b6747f2b7e3c5d21966bba8300", [:mix], [], "hexpm", "5c040b8469c1ff1b10093d3186e2e10dbe483cd73d79ec017993fb3985b8a9b3"}, "parse_trans": {:hex, :parse_trans, "3.3.0", "09765507a3c7590a784615cfd421d101aec25098d50b89d7aa1d66646bc571c1", [:rebar3], [], "hexpm", "17ef63abde837ad30680ea7f857dd9e7ced9476cdd7b0394432af4bfc241b960"}, - "poison": {:hex, :poison, "3.1.0", "d9eb636610e096f86f25d9a46f35a9facac35609a7591b3be3326e99a0484665", [:mix], [], "hexpm", "fec8660eb7733ee4117b85f55799fd3833eb769a6df71ccf8903e8dc5447cfce"}, + "poison": {:hex, :poison, "4.0.1", "bcb755a16fac91cad79bfe9fc3585bb07b9331e50cfe3420a24bcc2d735709ae", [:mix], [], "hexpm", "ba8836feea4b394bb718a161fc59a288fe0109b5006d6bdf97b6badfcf6f0f25"}, + "poolboy": {:hex, :poolboy, "1.5.2", "392b007a1693a64540cead79830443abf5762f5d30cf50bc95cb2c1aaafa006b", [:rebar3], [], "hexpm", "dad79704ce5440f3d5a3681c8590b9dc25d1a561e8f5a9c995281012860901e3"}, "ssl_verify_fun": {:hex, :ssl_verify_fun, "1.1.4", "f0eafff810d2041e93f915ef59899c923f4568f4585904d010387ed74988e77b", [:make, :mix, :rebar3], [], "hexpm", "603561dc0fd62f4f2ea9b890f4e20e1a0d388746d6e20557cafb1b16950de88c"}, "unicode_util_compat": {:hex, :unicode_util_compat, "0.4.1", "d869e4c68901dd9531385bb0c8c40444ebf624e60b6962d95952775cac5e90cd", [:rebar3], [], "hexpm", "1d1848c40487cdb0b30e8ed975e34e025860c02e419cb615d255849f3427439d"}, } diff --git a/test/lib/powerdnsex/config_test.exs b/test/lib/powerdnsex/config_test.exs index 37f0f63..c8649ae 100644 --- a/test/lib/powerdnsex/config_test.exs +++ b/test/lib/powerdnsex/config_test.exs @@ -1,5 +1,5 @@ defmodule PowerDNSex.ConfigTest do - use ExUnit.Case, async: true + use ExUnit.Case, async: false alias PowerDNSex.FakeConfig, as: Config @@ -65,14 +65,15 @@ defmodule PowerDNSex.ConfigTest do end @tag :configs - test "given none timeout config" do + test "uses default timeout" do + existing = Application.get_env(:powerdnsex, :timeout) + on_exit fn -> + Application.put_env(:powerdnsex, :timeout, existing) + end + Application.delete_env(:powerdnsex, :timeout) - expected_error = "[PowerDNSex] PowerDNS timeout not configured." - assert_raise RuntimeError, expected_error, fn -> - PowerDNSex.Config.powerdns_timeout() - end + assert PowerDNSex.Config.powerdns_timeout() == :timer.seconds(60) end end - end diff --git a/test/lib/powerdnsex/powerdnsex_test.exs b/test/lib/powerdnsex/powerdnsex_test.exs index 92e7f91..42c3dfd 100644 --- a/test/lib/powerdnsex/powerdnsex_test.exs +++ b/test/lib/powerdnsex/powerdnsex_test.exs @@ -3,8 +3,8 @@ defmodule PowerDNSexTest do use ExVCR.Mock, adapter: ExVCR.Adapter.Hackney setup do - Config.set_url() - Config.set_token() + PowerDNSex.FakeConfig.set_url() + PowerDNSex.FakeConfig.set_token() ExVCR.Config.cassette_library_dir( "test/support/cassettes", |