Skip to content

Commit c0f40b5

Browse files
Merge pull request rails#50082 from chaadow/discard_unrepresentable_blobs_while_preprocessing
[ActiveStorage] Discard unrepresentable blobs while preprocessing
2 parents 92a5a96 + 2edcda8 commit c0f40b5

File tree

5 files changed

+39
-12
lines changed

5 files changed

+39
-12
lines changed

activestorage/app/jobs/active_storage/transform_job.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
class ActiveStorage::TransformJob < ActiveStorage::BaseJob
44
queue_as { ActiveStorage.queues[:transform] }
55

6-
discard_on ActiveRecord::RecordNotFound
6+
discard_on ActiveRecord::RecordNotFound, ActiveStorage::UnrepresentableError
77
retry_on ActiveStorage::IntegrityError, attempts: 10, wait: :polynomially_longer
88

99
def perform(blob, transformations)

activestorage/app/models/active_storage/blob/representable.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ def representable?
9999
end
100100

101101
def preprocessed(transformations) # :nodoc:
102-
ActiveStorage::TransformJob.perform_later(self, transformations)
102+
ActiveStorage::TransformJob.perform_later(self, transformations) if representable?
103103
end
104104

105105
private

activestorage/test/jobs/transform_job_test.rb

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,4 +44,15 @@ class ActiveStorage::TransformJobTest < ActiveJob::TestCase
4444
ActiveStorage.track_variants = @was_tracking
4545
end
4646
end
47+
48+
test "ignores unrepresentable blob" do
49+
unrepresentable_blob = create_blob(content_type: "text/plain")
50+
transformations = { resize_to_limit: [100, 100] }
51+
52+
perform_enqueued_jobs do
53+
assert_nothing_raised do
54+
ActiveStorage::TransformJob.perform_later unrepresentable_blob, transformations
55+
end
56+
end
57+
end
4758
end

activestorage/test/models/attached/many_test.rb

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -917,7 +917,7 @@ def self.name; superclass.name; end
917917
end
918918

919919
test "transforms variants later" do
920-
blob = create_blob(filename: "funky.jpg")
920+
blob = create_file_blob(filename: "racecar.jpg")
921921

922922
assert_enqueued_with job: ActiveStorage::TransformJob, args: [blob, resize_to_limit: [1, 1]] do
923923
@user.highlights_with_preprocessed.attach blob
@@ -926,10 +926,10 @@ def self.name; superclass.name; end
926926

927927
test "transforms variants later conditionally via proc" do
928928
assert_no_enqueued_jobs only: ActiveStorage::TransformJob do
929-
@user.highlights_with_conditional_preprocessed.attach create_blob(filename: "funky.jpg")
929+
@user.highlights_with_conditional_preprocessed.attach create_file_blob(filename: "racecar.jpg")
930930
end
931931

932-
blob = create_blob(filename: "funky.jpg")
932+
blob = create_file_blob(filename: "racecar.jpg")
933933
@user.update(name: "transform via proc")
934934

935935
assert_enqueued_with job: ActiveStorage::TransformJob, args: [blob, resize_to_limit: [2, 2]] do
@@ -939,17 +939,25 @@ def self.name; superclass.name; end
939939

940940
test "transforms variants later conditionally via method" do
941941
assert_no_enqueued_jobs only: ActiveStorage::TransformJob do
942-
@user.highlights_with_conditional_preprocessed.attach create_blob(filename: "funky.jpg")
942+
@user.highlights_with_conditional_preprocessed.attach create_file_blob(filename: "racecar.jpg")
943943
end
944944

945-
blob = create_blob(filename: "funky.jpg")
945+
blob = create_file_blob(filename: "racecar.jpg")
946946
@user.update(name: "transform via method")
947947

948948
assert_enqueued_with job: ActiveStorage::TransformJob, args: [blob, resize_to_limit: [3, 3]] do
949949
@user.highlights_with_conditional_preprocessed.attach blob
950950
end
951951
end
952952

953+
test "avoids enqueuing transform later job when blob is not representable" do
954+
unrepresentable_blob = create_blob(filename: "hello.txt")
955+
956+
assert_no_enqueued_jobs only: ActiveStorage::TransformJob do
957+
@user.highlights_with_preprocessed.attach unrepresentable_blob
958+
end
959+
end
960+
953961
test "successfully attaches new blobs and destroys attachments marked for destruction via nested attributes" do
954962
town_blob = create_blob(filename: "town.jpg")
955963
@user.highlights.attach(town_blob)

activestorage/test/models/attached/one_test.rb

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -859,7 +859,7 @@ def self.name; superclass.name; end
859859
end
860860

861861
test "transforms variants later" do
862-
blob = create_blob(filename: "funky.jpg")
862+
blob = create_file_blob(filename: "racecar.jpg")
863863

864864
assert_enqueued_with job: ActiveStorage::TransformJob, args: [blob, resize_to_limit: [1, 1]] do
865865
@user.avatar_with_preprocessed.attach blob
@@ -868,10 +868,10 @@ def self.name; superclass.name; end
868868

869869
test "transforms variants later conditionally via proc" do
870870
assert_no_enqueued_jobs only: ActiveStorage::TransformJob do
871-
@user.avatar_with_conditional_preprocessed.attach create_blob(filename: "funky.jpg")
871+
@user.avatar_with_conditional_preprocessed.attach create_file_blob(filename: "racecar.jpg")
872872
end
873873

874-
blob = create_blob(filename: "funky.jpg")
874+
blob = create_file_blob(filename: "racecar.jpg")
875875
@user.update(name: "transform via proc")
876876

877877
assert_enqueued_with job: ActiveStorage::TransformJob, args: [blob, resize_to_limit: [2, 2]] do
@@ -881,14 +881,22 @@ def self.name; superclass.name; end
881881

882882
test "transforms variants later conditionally via method" do
883883
assert_no_enqueued_jobs only: ActiveStorage::TransformJob do
884-
@user.avatar_with_conditional_preprocessed.attach create_blob(filename: "funky.jpg")
884+
@user.avatar_with_conditional_preprocessed.attach create_file_blob(filename: "racecar.jpg")
885885
end
886886

887-
blob = create_blob(filename: "funky.jpg")
887+
blob = create_file_blob(filename: "racecar.jpg")
888888
@user.update(name: "transform via method")
889889

890890
assert_enqueued_with job: ActiveStorage::TransformJob, args: [blob, resize_to_limit: [3, 3]] do
891891
@user.avatar_with_conditional_preprocessed.attach blob
892892
end
893893
end
894+
895+
test "avoids enqueuing transform later job when blob is not representable" do
896+
unrepresentable_blob = create_blob(filename: "hello.txt")
897+
898+
assert_no_enqueued_jobs only: ActiveStorage::TransformJob do
899+
@user.avatar_with_preprocessed.attach unrepresentable_blob
900+
end
901+
end
894902
end

0 commit comments

Comments
 (0)