1
0
Fork 0
mirror of https://github.com/rails/rails.git synced 2022-11-09 12:12:34 -05:00

Permit opening a blob in a custom tempdir

This commit is contained in:
George Claghorn 2018-05-17 19:14:11 -04:00
parent f018d4e118
commit 9f95767979
5 changed files with 26 additions and 9 deletions

View file

@ -167,8 +167,8 @@ class ActiveStorage::Blob < ActiveRecord::Base
end
# Downloads the blob to a tempfile on disk. Yields the tempfile.
def open(&block)
ActiveStorage::Downloader.new(self).download_blob_to_tempfile(&block)
def open(tempdir: nil, &block)
ActiveStorage::Downloader.new(self, tempdir: tempdir).download_blob_to_tempfile(&block)
end

View file

@ -24,11 +24,15 @@ module ActiveStorage
private
# Downloads the blob to a tempfile on disk. Yields the tempfile.
def download_blob_to_tempfile(&block) #:doc:
blob.open(&block)
blob.open tempdir: tempdir, &block
end
def logger #:doc:
ActiveStorage.logger
end
def tempdir #:doc:
Dir.tmpdir
end
end
end

View file

@ -1,9 +1,10 @@
# frozen_string_literal: true
module ActiveStorage
class Downloader
def initialize(blob)
@blob = blob
class Downloader #:nodoc:
def initialize(blob, tempdir: nil)
@blob = blob
@tempdir = tempdir
end
def download_blob_to_tempfile
@ -14,10 +15,10 @@ module ActiveStorage
end
private
attr_reader :blob
attr_reader :blob, :tempdir
def open_tempfile
file = Tempfile.open([ "ActiveStorage", tempfile_extension_with_delimiter ])
file = Tempfile.open([ "ActiveStorage", tempfile_extension_with_delimiter ], tempdir)
begin
yield file

View file

@ -26,7 +26,7 @@ module ActiveStorage
private
# Downloads the blob to a tempfile on disk. Yields the tempfile.
def download_blob_to_tempfile(&block) #:doc:
blob.open(&block)
blob.open tempdir: tempdir, &block
end
# Executes a system command, capturing its binary output in a tempfile. Yields the tempfile.

View file

@ -93,6 +93,18 @@ class ActiveStorage::BlobTest < ActiveSupport::TestCase
end
end
test "open in a custom tempdir" do
tempdir = Dir.mktmpdir
create_file_blob(filename: "racecar.jpg").open(tempdir: tempdir) do |file|
assert file.binmode?
assert_equal 0, file.pos
assert_match(/\.jpg\z/, file.path)
assert file.path.starts_with?(tempdir)
assert_equal file_fixture("racecar.jpg").binread, file.read, "Expected downloaded file to match fixture file"
end
end
test "urls expiring in 5 minutes" do
blob = create_blob