diff --git a/.github/workflows/elixir.yml b/.github/workflows/elixir.yml index 39d5ac5..64be53f 100644 --- a/.github/workflows/elixir.yml +++ b/.github/workflows/elixir.yml @@ -8,7 +8,7 @@ on: jobs: test: - runs-on: ubuntu-20.04 + runs-on: ubuntu-22.04 env: MIX_ENV: test strategy: @@ -16,12 +16,17 @@ jobs: matrix: include: - pair: - elixir: "1.13" - otp: "22" + elixir: "1.16" + otp: "26" + lint: lint - pair: elixir: "1.17" otp: "27" lint: lint + - pair: + elixir: "1.18" + otp: "27" + lint: lint steps: - uses: actions/checkout@v4 diff --git a/CHANGELOG.md b/CHANGELOG.md index cf9acce..2eaed52 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ ## Unreleased - Add `kubernetes_use_cached_resources` option to Kubernetes strategy +* Use Elixir 1.18's built-in JSON module when available ## 3.4.1 diff --git a/lib/json.ex b/lib/json.ex new file mode 100644 index 0000000..45f2fdd --- /dev/null +++ b/lib/json.ex @@ -0,0 +1,18 @@ +defmodule Cluster.JSON do + @moduledoc false + + # Delegates to JSON in Elixir v1.18+ or Jason for earlier versions + + cond do + Code.ensure_loaded?(JSON) -> + defdelegate decode!(data), to: JSON + + Code.ensure_loaded?(Jason) -> + defdelegate decode!(data), to: Jason + + true -> + message = "Missing a compatible JSON library, add `:jason` to your deps." + + IO.warn(message, Macro.Env.stacktrace(__ENV__)) + end +end diff --git a/lib/strategy/kubernetes.ex b/lib/strategy/kubernetes.ex index ae83791..b282241 100644 --- a/lib/strategy/kubernetes.ex +++ b/lib/strategy/kubernetes.ex @@ -409,7 +409,7 @@ defmodule Cluster.Strategy.Kubernetes do case :httpc.request(:get, {~c"https://#{master}/#{path}", headers}, http_options, []) do {:ok, {{_version, 200, _status}, _headers, body}} -> - parse_response(ip_lookup_mode, Jason.decode!(body)) + parse_response(ip_lookup_mode, Cluster.JSON.decode!(body)) |> Enum.map(fn node_info -> format_node( Keyword.get(config, :mode, :ip), @@ -421,7 +421,7 @@ defmodule Cluster.Strategy.Kubernetes do end) {:ok, {{_version, 403, _status}, _headers, body}} -> - %{"message" => msg} = Jason.decode!(body) + %{"message" => msg} = Cluster.JSON.decode!(body) warn(topology, "cannot query kubernetes (unauthorized): #{msg}") [] diff --git a/lib/strategy/rancher.ex b/lib/strategy/rancher.ex index a5dbe3e..6a6b4ca 100644 --- a/lib/strategy/rancher.ex +++ b/lib/strategy/rancher.ex @@ -139,7 +139,7 @@ defmodule Cluster.Strategy.Rancher do [] ) do {:ok, {{_version, 200, _status}, _headers, body}} -> - parse_response(app_name, Jason.decode!(body)) + parse_response(app_name, Cluster.JSON.decode!(body)) {:ok, {{_version, code, status}, _headers, body}} -> warn( diff --git a/mix.exs b/mix.exs index f04f49d..2b53e1b 100644 --- a/mix.exs +++ b/mix.exs @@ -40,7 +40,7 @@ defmodule Cluster.Mixfile do {:ex_doc, ">= 0.0.0", only: :dev, runtime: false}, {:dialyxir, "~> 1.0", only: :dev, runtime: false}, {:exvcr, "~> 0.11", only: :test, runtime: false}, - {:jason, "~> 1.1"}, + {:jason, "~> 1.1", optional: true}, {:telemetry, "~> 1.3"} ] end