From 00e07f00a9b04ed0148ea9ffb334a8ffd64f600d Mon Sep 17 00:00:00 2001 From: Joshua Date: Wed, 30 Apr 2025 14:10:41 +0100 Subject: [PATCH 1/3] add duration to Phoenix.HTML.Safe --- lib/phoenix_html/safe.ex | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lib/phoenix_html/safe.ex b/lib/phoenix_html/safe.ex index 5c01277..4810d02 100644 --- a/lib/phoenix_html/safe.ex +++ b/lib/phoenix_html/safe.ex @@ -44,6 +44,10 @@ defimpl Phoenix.HTML.Safe, for: DateTime do end end +defimpl Phoenix.HTML.Safe, for: Duration do + defdelegate to_iodata(data), to: Duration, as: :to_iso8601 +end + defimpl Phoenix.HTML.Safe, for: List do def to_iodata(list), do: recur(list) From febb5c9a2ad2491b2fadc9c14e4314777c775ae5 Mon Sep 17 00:00:00 2001 From: Joshua Date: Wed, 30 Apr 2025 14:18:06 +0100 Subject: [PATCH 2/3] add test --- test/phoenix_html/safe_test.exs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/test/phoenix_html/safe_test.exs b/test/phoenix_html/safe_test.exs index c343e9f..5c404ec 100644 --- a/test/phoenix_html/safe_test.exs +++ b/test/phoenix_html/safe_test.exs @@ -62,6 +62,11 @@ defmodule Phoenix.HTML.SafeTest do assert Safe.to_iodata(datetime) == "2000-01-01T12:13:14+00:30" end + test "impl for Duration" do + duration = Duration.new!(month: 1) + assert Safe.to_iodata(duration) == "P1M" + end + test "impl for URI" do uri = %URI{scheme: "http", host: "www.example.org", path: "/foo", query: "secret="} From 1d84530b2c636144926e269cb32f439cd72bb129 Mon Sep 17 00:00:00 2001 From: Joshua Date: Wed, 30 Apr 2025 15:06:01 +0100 Subject: [PATCH 3/3] add `Code.ensure_loaded` to Duration to ensure pre 1.17 compatibility --- lib/phoenix_html/safe.ex | 6 ++++-- test/phoenix_html/safe_test.exs | 8 +++++--- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/lib/phoenix_html/safe.ex b/lib/phoenix_html/safe.ex index 4810d02..2ed7964 100644 --- a/lib/phoenix_html/safe.ex +++ b/lib/phoenix_html/safe.ex @@ -44,8 +44,10 @@ defimpl Phoenix.HTML.Safe, for: DateTime do end end -defimpl Phoenix.HTML.Safe, for: Duration do - defdelegate to_iodata(data), to: Duration, as: :to_iso8601 +if Code.ensure_loaded?(Duration) do + defimpl Phoenix.HTML.Safe, for: Duration do + defdelegate to_iodata(data), to: Duration, as: :to_iso8601 + end end defimpl Phoenix.HTML.Safe, for: List do diff --git a/test/phoenix_html/safe_test.exs b/test/phoenix_html/safe_test.exs index 5c404ec..6c2bcd1 100644 --- a/test/phoenix_html/safe_test.exs +++ b/test/phoenix_html/safe_test.exs @@ -62,9 +62,11 @@ defmodule Phoenix.HTML.SafeTest do assert Safe.to_iodata(datetime) == "2000-01-01T12:13:14+00:30" end - test "impl for Duration" do - duration = Duration.new!(month: 1) - assert Safe.to_iodata(duration) == "P1M" + if Code.ensure_loaded?(Duration) do + test "impl for Duration" do + duration = Duration.new!(month: 1) + assert Safe.to_iodata(duration) == "P1M" + end end test "impl for URI" do