Skip to content

Commit e5ad4b1

Browse files
authored
Add OGMate (#53)
Replace OG image implementation with OGMate
1 parent e5995a8 commit e5ad4b1

5 files changed

Lines changed: 22 additions & 45 deletions

File tree

lib/jola_dev/og_image.ex

Lines changed: 10 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -2,49 +2,21 @@ defmodule JolaDev.OGImage do
22
@moduledoc """
33
Per-page Open Graph image lookup. All content from
44
`JolaDev.OGImage.Catalog` is rendered at compile time via
5-
`JolaDev.OGImage.Renderer` and baked into the `@images` module
6-
attribute, then served at runtime from `JolaDevWeb.Plugs.OGImage`.
5+
`OGMate`, then served at runtime from `JolaDevWeb.Plugs.OGImage`.
76
"""
87

98
alias JolaDev.OGImage.Catalog
109
alias JolaDev.OGImage.Renderer
1110

12-
@dev_mode Application.compile_env!(:jola_dev, :og_image_dev_mode)
13-
@images if not @dev_mode,
14-
do:
15-
Map.new(Catalog.all_slugs(), fn slug ->
16-
{title, description} = Catalog.content_for(slug)
17-
{slug, Renderer.generate_bytes(title, description)}
18-
end)
11+
# credo:disable-for-next-line Credo.Check.Readability.StrictModuleLayout
12+
use OGMate,
13+
all_keys: Catalog.all_slugs(),
14+
content_for: Catalog,
15+
renderer: Renderer,
16+
default: Catalog.content_for("home"),
17+
dev_mode: Application.compile_env!(:jola_dev, :og_image_dev_mode)
1918

20-
@default_image (
21-
{title, description} = Catalog.content_for("home")
22-
Renderer.generate_bytes(title, description)
23-
)
24-
25-
@doc """
26-
Returns the public asset path for a slug's OG image. Used so the
27-
path scheme stays consistent.
28-
"""
29-
def path_for(slug) when is_binary(slug), do: "/images/og/#{slug}.png"
30-
31-
def image_for(slug) do
32-
with :error <- image_for_slug(slug) do
33-
{:ok, @default_image}
34-
end
35-
end
36-
37-
def default_image do
38-
@default_image
39-
end
40-
41-
defp image_for_slug(slug) do
42-
if @images do
43-
Map.fetch(@images, slug)
44-
else
45-
with {title, description} <- Catalog.content_for(slug) do
46-
{:ok, Renderer.generate_bytes(title, description)}
47-
end
48-
end
19+
def path_for(slug) do
20+
"/images/og/#{slug}.png"
4921
end
5022
end

lib/jola_dev/og_image/renderer.ex

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,13 @@ defmodule JolaDev.OGImage.Renderer do
2121

2222
@logo_path "priv/static/images/logo.png"
2323

24-
def generate_bytes(title, description) when is_binary(title) and is_binary(description) do
25-
title
26-
|> build_canvas(description)
27-
|> Image.write!(:memory, suffix: ".png")
24+
def render(title, description) when is_binary(title) and is_binary(description) do
25+
image =
26+
title
27+
|> build_canvas(description)
28+
|> Image.write!(:memory, suffix: ".png")
29+
30+
{:ok, image}
2831
end
2932

3033
defp build_canvas(title, description) do

mix.exs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,8 @@ defmodule JolaDev.MixProject do
7373
{:tidewave, "~> 0.5", only: :dev},
7474
{:credo, "~> 1.7", only: [:dev, :test], runtime: false},
7575
{:image, "~> 0.67"},
76-
{:logger_json, "~> 7.0"}
76+
{:logger_json, "~> 7.0"},
77+
{:og_mate, "~> 0.1"}
7778
]
7879
end
7980

mix.lock

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
"nimble_parsec": {:hex, :nimble_parsec, "1.4.2", "8efba0122db06df95bfaa78f791344a89352ba04baedd3849593bfce4d0dc1c6", [:mix], [], "hexpm", "4b21398942dda052b403bbe1da991ccd03a053668d147d53fb8c4e0efe09c973"},
3131
"nimble_pool": {:hex, :nimble_pool, "1.1.0", "bf9c29fbdcba3564a8b800d1eeb5a3c58f36e1e11d7b7fb2e084a643f645f06b", [:mix], [], "hexpm", "af2e4e6b34197db81f7aad230c1118eac993acc0dae6bc83bac0126d4ae0813a"},
3232
"nimble_publisher": {:hex, :nimble_publisher, "1.1.1", "3ea4d4cfca45b11a5377bce7608367a9ddd7e717a9098161d8439eca23e239aa", [:mix], [{:earmark, "~> 1.4", [hex: :earmark, repo: "hexpm", optional: false]}, {:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}], "hexpm", "d67e15bddf07e8c60f75849008b78ea8c6b2b4ae8e3f882ccf0a22d57bd42ed0"},
33+
"og_mate": {:hex, :og_mate, "0.1.0", "b2aa3baeb379fc2ea3c9872031b2b19fd127493d3c9e374ffeb3062343f11db4", [:mix], [{:image, "~> 0.67.0", [hex: :image, repo: "hexpm", optional: false]}, {:nimble_options, "~> 1.1", [hex: :nimble_options, repo: "hexpm", optional: false]}], "hexpm", "80f7aeac521177e0e5ff253de15d6ee263fbc0124a8c36568fc3abd1762d0c49"},
3334
"phoenix": {:hex, :phoenix, "1.8.7", "d8d755b4ff4b449f610223dd706b4ae64155cb720d3dc09c706c079ecea189e4", [:mix], [{:bandit, "~> 1.0", [hex: :bandit, repo: "hexpm", optional: true]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:phoenix_pubsub, "~> 2.1", [hex: :phoenix_pubsub, repo: "hexpm", optional: false]}, {:phoenix_template, "~> 1.0", [hex: :phoenix_template, repo: "hexpm", optional: false]}, {:phoenix_view, "~> 2.0", [hex: :phoenix_view, repo: "hexpm", optional: true]}, {:plug, "~> 1.14", [hex: :plug, repo: "hexpm", optional: false]}, {:plug_cowboy, "~> 2.7", [hex: :plug_cowboy, repo: "hexpm", optional: true]}, {:plug_crypto, "~> 1.2 or ~> 2.0", [hex: :plug_crypto, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}, {:websock_adapter, "~> 0.5.3", [hex: :websock_adapter, repo: "hexpm", optional: false]}], "hexpm", "47352f72d6ab31009ef77516b1b3a14745be97b54061fd458031b9d8294869d5"},
3435
"phoenix_html": {:hex, :phoenix_html, "4.3.0", "d3577a5df4b6954cd7890c84d955c470b5310bb49647f0a114a6eeecc850f7ad", [:mix], [], "hexpm", "3eaa290a78bab0f075f791a46a981bbe769d94bc776869f4f3063a14f30497ad"},
3536
"phoenix_live_dashboard": {:hex, :phoenix_live_dashboard, "0.8.7", "405880012cb4b706f26dd1c6349125bfc903fb9e44d1ea668adaf4e04d4884b7", [:mix], [{:ecto, "~> 3.6.2 or ~> 3.7", [hex: :ecto, repo: "hexpm", optional: true]}, {:ecto_mysql_extras, "~> 0.5", [hex: :ecto_mysql_extras, repo: "hexpm", optional: true]}, {:ecto_psql_extras, "~> 0.7", [hex: :ecto_psql_extras, repo: "hexpm", optional: true]}, {:ecto_sqlite3_extras, "~> 1.1.7 or ~> 1.2.0", [hex: :ecto_sqlite3_extras, repo: "hexpm", optional: true]}, {:mime, "~> 1.6 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:phoenix_live_view, "~> 0.19 or ~> 1.0", [hex: :phoenix_live_view, repo: "hexpm", optional: false]}, {:telemetry_metrics, "~> 0.6 or ~> 1.0", [hex: :telemetry_metrics, repo: "hexpm", optional: false]}], "hexpm", "3a8625cab39ec261d48a13b7468dc619c0ede099601b084e343968309bd4d7d7"},

test/jola_dev/og_image/renderer_test.exs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,9 @@ defmodule JolaDev.OGImage.RendererTest do
44

55
describe "generate_bytes/2" do
66
test "returns a PNG binary" do
7-
bytes = Renderer.generate_bytes("Title", "Description.")
7+
bytes = Renderer.render("Title", "Description.")
88

9-
assert <<137, "PNG\r\n", 26, "\n", _rest::binary>> = bytes
9+
assert {:ok, <<137, "PNG\r\n", 26, "\n", _rest::binary>>} = bytes
1010
end
1111
end
1212
end

0 commit comments

Comments
 (0)