Skip to content

Commit 6395107

Browse files
Fix analyzing new blobs from uploaded files on attach
1 parent ac2ada3 commit 6395107

File tree

3 files changed

+120
-18
lines changed

3 files changed

+120
-18
lines changed

activestorage/lib/active_storage/attached/model.rb

Lines changed: 4 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,8 @@ def #{name}=(attachable)
5353

5454
after_save { attachment_changes[name.to_s]&.save }
5555

56+
after_commit(on: %i[ create update ]) { attachment_changes.delete(name.to_s).try(:upload) }
57+
5658
ActiveRecord::Reflection.add_attachment_reflection(
5759
self,
5860
name,
@@ -117,6 +119,8 @@ def purge_later
117119

118120
after_save { attachment_changes[name.to_s]&.save }
119121

122+
after_commit(on: %i[ create update ]) { attachment_changes.delete(name.to_s).try(:upload) }
123+
120124
ActiveRecord::Reflection.add_attachment_reflection(
121125
self,
122126
name,
@@ -125,26 +129,8 @@ def purge_later
125129
end
126130
end
127131

128-
def committed!(*) #:nodoc:
129-
unless destroyed?
130-
upload_attachment_changes
131-
clear_attachment_changes
132-
end
133-
134-
super
135-
end
136-
137132
def attachment_changes #:nodoc:
138133
@attachment_changes ||= {}
139134
end
140-
141-
private
142-
def upload_attachment_changes
143-
attachment_changes.each_value { |change| change.try(:upload) }
144-
end
145-
146-
def clear_attachment_changes
147-
@attachment_changes = {}
148-
end
149135
end
150136
end

activestorage/test/models/attached/many_test.rb

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -156,6 +156,46 @@ class ActiveStorage::ManyAttachedTest < ActiveSupport::TestCase
156156
end
157157
end
158158

159+
test "analyzing a new blob from an uploaded file after attaching it to an existing record" do
160+
perform_enqueued_jobs do
161+
@user.highlights.attach fixture_file_upload("racecar.jpg")
162+
end
163+
164+
assert @user.highlights.reload.first.analyzed?
165+
assert_equal 4104, @user.highlights.first.metadata[:width]
166+
assert_equal 2736, @user.highlights.first.metadata[:height]
167+
end
168+
169+
test "analyzing a new blob from an uploaded file after attaching it to an existing record via update" do
170+
perform_enqueued_jobs do
171+
@user.update! highlights: [ fixture_file_upload("racecar.jpg") ]
172+
end
173+
174+
assert @user.highlights.reload.first.analyzed?
175+
assert_equal 4104, @user.highlights.first.metadata[:width]
176+
assert_equal 2736, @user.highlights.first.metadata[:height]
177+
end
178+
179+
test "analyzing a directly-uploaded blob after attaching it to an existing record" do
180+
perform_enqueued_jobs do
181+
@user.highlights.attach directly_upload_file_blob(filename: "racecar.jpg")
182+
end
183+
184+
assert @user.highlights.reload.first.analyzed?
185+
assert_equal 4104, @user.highlights.first.metadata[:width]
186+
assert_equal 2736, @user.highlights.first.metadata[:height]
187+
end
188+
189+
test "analyzing a directly-uploaded blob after attaching it to an existing record via update" do
190+
perform_enqueued_jobs do
191+
@user.update! highlights: [ directly_upload_file_blob(filename: "racecar.jpg") ]
192+
end
193+
194+
assert @user.highlights.reload.first.analyzed?
195+
assert_equal 4104, @user.highlights.first.metadata[:width]
196+
assert_equal 2736, @user.highlights.first.metadata[:height]
197+
end
198+
159199
test "attaching existing blobs to a new record" do
160200
User.new(name: "Jason").tap do |user|
161201
user.highlights.attach create_blob(filename: "funky.jpg"), create_blob(filename: "town.jpg")
@@ -257,6 +297,24 @@ class ActiveStorage::ManyAttachedTest < ActiveSupport::TestCase
257297
assert_equal "Could not find or build blob: expected attachable, got :foo", error.message
258298
end
259299

300+
test "analyzing a new blob from an uploaded file after attaching it to a new record" do
301+
perform_enqueued_jobs do
302+
user = User.create!(name: "Jason", highlights: [ fixture_file_upload("racecar.jpg") ])
303+
assert user.highlights.reload.first.analyzed?
304+
assert_equal 4104, user.highlights.first.metadata[:width]
305+
assert_equal 2736, user.highlights.first.metadata[:height]
306+
end
307+
end
308+
309+
test "analyzing a directly-uploaded blob after attaching it to a new record" do
310+
perform_enqueued_jobs do
311+
user = User.create!(name: "Jason", highlights: [ directly_upload_file_blob(filename: "racecar.jpg") ])
312+
assert user.highlights.reload.first.analyzed?
313+
assert_equal 4104, user.highlights.first.metadata[:width]
314+
assert_equal 2736, user.highlights.first.metadata[:height]
315+
end
316+
end
317+
260318
test "purging" do
261319
[ create_blob(filename: "funky.jpg"), create_blob(filename: "town.jpg") ].tap do |blobs|
262320
@user.highlights.attach blobs

activestorage/test/models/attached/one_test.rb

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -181,6 +181,46 @@ class ActiveStorage::OneAttachedTest < ActiveSupport::TestCase
181181
end
182182
end
183183

184+
test "analyzing a new blob from an uploaded file after attaching it to an existing record" do
185+
perform_enqueued_jobs do
186+
@user.avatar.attach fixture_file_upload("racecar.jpg")
187+
end
188+
189+
assert @user.avatar.reload.analyzed?
190+
assert_equal 4104, @user.avatar.metadata[:width]
191+
assert_equal 2736, @user.avatar.metadata[:height]
192+
end
193+
194+
test "analyzing a new blob from an uploaded file after attaching it to an existing record via update" do
195+
perform_enqueued_jobs do
196+
@user.update! avatar: fixture_file_upload("racecar.jpg")
197+
end
198+
199+
assert @user.avatar.reload.analyzed?
200+
assert_equal 4104, @user.avatar.metadata[:width]
201+
assert_equal 2736, @user.avatar.metadata[:height]
202+
end
203+
204+
test "analyzing a directly-uploaded blob after attaching it to an existing record" do
205+
perform_enqueued_jobs do
206+
@user.avatar.attach directly_upload_file_blob(filename: "racecar.jpg")
207+
end
208+
209+
assert @user.avatar.reload.analyzed?
210+
assert_equal 4104, @user.avatar.metadata[:width]
211+
assert_equal 2736, @user.avatar.metadata[:height]
212+
end
213+
214+
test "analyzing a directly-uploaded blob after attaching it to an existing record via updates" do
215+
perform_enqueued_jobs do
216+
@user.update! avatar: directly_upload_file_blob(filename: "racecar.jpg")
217+
end
218+
219+
assert @user.avatar.reload.analyzed?
220+
assert_equal 4104, @user.avatar.metadata[:width]
221+
assert_equal 2736, @user.avatar.metadata[:height]
222+
end
223+
184224
test "attaching an existing blob to a new record" do
185225
User.new(name: "Jason").tap do |user|
186226
user.avatar.attach create_blob(filename: "funky.jpg")
@@ -259,6 +299,24 @@ class ActiveStorage::OneAttachedTest < ActiveSupport::TestCase
259299
assert_equal "Could not find or build blob: expected attachable, got :foo", error.message
260300
end
261301

302+
test "analyzing a new blob from an uploaded file after attaching it to a new record" do
303+
perform_enqueued_jobs do
304+
user = User.create!(name: "Jason", avatar: fixture_file_upload("racecar.jpg"))
305+
assert user.avatar.reload.analyzed?
306+
assert_equal 4104, user.avatar.metadata[:width]
307+
assert_equal 2736, user.avatar.metadata[:height]
308+
end
309+
end
310+
311+
test "analyzing a directly-uploaded blob after attaching it to a new record" do
312+
perform_enqueued_jobs do
313+
user = User.create!(name: "Jason", avatar: directly_upload_file_blob(filename: "racecar.jpg"))
314+
assert user.avatar.reload.analyzed?
315+
assert_equal 4104, user.avatar.metadata[:width]
316+
assert_equal 2736, user.avatar.metadata[:height]
317+
end
318+
end
319+
262320
test "purging" do
263321
create_blob(filename: "funky.jpg").tap do |blob|
264322
@user.avatar.attach blob

0 commit comments

Comments
 (0)