Skip to content

Commit 45e6cf9

Browse files
committed
Add support for changing/adding file extension
In some cases, like with LiveUpload uploaded files get stored without extensions. This commit allows user to define transform/2 which returns the new extension.
1 parent 05210c2 commit 45e6cf9

3 files changed

Lines changed: 26 additions & 1 deletion

File tree

lib/waffle/definition/versioning.ex

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,9 @@ defmodule Waffle.Definition.Versioning do
2828
quote do
2929
@versions [:original]
3030
@before_compile Waffle.Definition.Versioning
31+
32+
def extension(_, {file, _}), do: Path.extname(file.file_name)
33+
defoverridable extension: 2
3134
end
3235
end
3336

@@ -38,7 +41,7 @@ defmodule Waffle.Definition.Versioning do
3841
case conversion do
3942
:skip -> nil
4043
{_, _, ext} -> "#{name}.#{ext}"
41-
_ -> "#{name}#{Path.extname(file.file_name)}"
44+
_ -> "#{name}#{definition.extension(version, {file, scope})}"
4245
end
4346
end
4447

test/actions/store_test.exs

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ defmodule WaffleTest.Actions.Store do
1616
def transform(:skipped, _), do: :skip
1717
def transform(_, _), do: :noaction
1818
def __versions, do: [:original, :thumb, :skipped]
19+
def extension(_, {file, _}), do: Path.extname(file.file_name)
1920
end
2021

2122
defmodule DummyDefinitionWithHeaders do
@@ -24,6 +25,7 @@ defmodule WaffleTest.Actions.Store do
2425

2526
def transform(_, _), do: :noaction
2627
def __versions, do: [:original, :thumb, :skipped]
28+
def extension(_, {file, _}), do: Path.extname(file.file_name)
2729
def remote_file_headers(%URI{host: "www.google.com"}), do: [{"User-Agent", "MyApp"}]
2830
end
2931

@@ -36,6 +38,16 @@ defmodule WaffleTest.Actions.Store do
3638
def __versions, do: [:original, :thumb, :skipped]
3739
end
3840

41+
defmodule DummyDefinitionWithExtension do
42+
use Waffle.Actions.Store
43+
use Waffle.Definition.Storage
44+
45+
def validate({file, _}), do: true
46+
def transform(_, _), do: :noaction
47+
def __versions, do: [:original]
48+
def extension(_, {file, _}), do: ".jpeg"
49+
end
50+
3951
test "checks file existence" do
4052
assert DummyDefinition.store("non-existent-file.png") == {:error, :invalid_file_path}
4153
end
@@ -151,6 +163,15 @@ defmodule WaffleTest.Actions.Store do
151163
end
152164
end
153165

166+
test "sets extension from extension/2" do
167+
with_mock Waffle.Storage.S3,
168+
put: fn DummyDefinitionWithExtension, _, {%{file_name: "image.jpeg", path: @img}, nil} ->
169+
{:ok, "resp"}
170+
end do
171+
assert DummyDefinitionWithExtension.store(@img) == {:ok, "image.png"}
172+
end
173+
end
174+
154175
test "sets remote filename from content-disposition header when available" do
155176
with_mocks([
156177
{

test/actions/url_test.exs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ defmodule WaffleTest.Actions.Url do
99
def __versions, do: [:original, :thumb, :skipped]
1010
def transform(:skipped, _), do: :skip
1111
def transform(_, _), do: :noaction
12+
def extension(_, {file, _}), do: Path.extname(file.file_name)
1213
def default_url(version, scope) when is_nil(scope), do: "dummy-#{version}"
1314
def default_url(version, scope), do: "dummy-#{version}-#{scope}"
1415
def __storage, do: Waffle.Storage.S3

0 commit comments

Comments
 (0)