Skip to content

Commit 7415a85

Browse files
committed
Add syntax for interpolating env vars in UPLOAD_PATH_TPL
Example: UPLOAD_PATH_TPL=recordings/{env:A_YES}-{env:A_NOPE?nope}-{env:NADA?}/{id}.{ext}
1 parent ff8f28f commit 7415a85

File tree

2 files changed

+31
-4
lines changed

2 files changed

+31
-4
lines changed

lib/asciinema/recordings/paths.ex

+19-4
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,9 @@ defmodule Asciinema.Recordings.Paths do
99
|> path(asciicast, overrides(ext))
1010
end
1111

12+
defp overrides(nil), do: %{}
13+
defp overrides(ext), do: %{"{ext}" => ext}
14+
1215
defp path(tpl, asciicast, overrides) do
1316
time = asciicast.inserted_at
1417

@@ -26,12 +29,11 @@ defmodule Asciinema.Recordings.Paths do
2629
overrides
2730
)
2831

29-
String.replace(tpl, Map.keys(vars), &Map.get(vars, &1))
32+
tpl
33+
|> String.replace(Map.keys(vars), &Map.get(vars, &1))
34+
|> String.replace(~r/\{env:(\w+(\?[^}]*)?)\}/U, &resolve_env_var(&1, asciicast.env))
3035
end
3136

32-
def overrides(nil), do: %{}
33-
def overrides(ext), do: %{"{ext}" => ext}
34-
3537
defp shard(id) do
3638
<<a::binary-size(2), b::binary-size(2)>> =
3739
id
@@ -45,4 +47,17 @@ defmodule Asciinema.Recordings.Paths do
4547

4648
defp ext(1), do: "json"
4749
defp ext(2), do: "cast"
50+
51+
defp resolve_env_var(match, env) do
52+
env = env || %{}
53+
rest = String.slice(match, 5..-2//1)
54+
55+
case String.split(rest, "?", parts: 2) do
56+
[name, default] ->
57+
Map.get(env, name, default)
58+
59+
[name] ->
60+
Map.get(env, name, "")
61+
end
62+
end
4863
end

test/asciinema/recordings/paths_test.exs

+12
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,18 @@ defmodule Asciinema.Recordings.PathsTest do
4747

4848
assert path == "asciicasts/54/32/12345.cast"
4949
end
50+
51+
test "interpolates env vars" do
52+
Application.put_env(:asciinema, Paths,
53+
recording: "recordings/{env:A_YES}-{env:A_NOPE?nope}-{env:NADA?}/{id}.{ext}"
54+
)
55+
56+
asciicast = build_asciicast(env: %{"A_YES" => "yes"})
57+
58+
path = Paths.path(asciicast)
59+
60+
assert path == "recordings/yes-nope-/123.cast"
61+
end
5062
end
5163

5264
describe "path/2" do

0 commit comments

Comments
 (0)