From ccaba581c0cf8653f61ce212667eaa1cc6f0a28e Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Tue, 4 Jul 2017 16:05:06 +0200 Subject: [PATCH] Differentiate between io streams and read data --- lib/active_file/blob.rb | 12 ++++++------ lib/active_file/site.rb | 2 +- lib/active_file/sites/disk_site.rb | 4 ++-- lib/active_file/sites/gcs_site.rb | 4 ++-- lib/active_file/sites/mirror_site.rb | 4 ++-- lib/active_file/sites/s3_site.rb | 4 ++-- test/blob_test.rb | 2 +- 7 files changed, 16 insertions(+), 16 deletions(-) diff --git a/lib/active_file/blob.rb b/lib/active_file/blob.rb index 3cb98656f2..4af0551f99 100644 --- a/lib/active_file/blob.rb +++ b/lib/active_file/blob.rb @@ -11,16 +11,16 @@ class ActiveFile::Blob < ActiveRecord::Base class_attribute :site class << self - def build_after_upload(data:, filename:, content_type: nil, metadata: nil) + def build_after_upload(io:, filename:, content_type: nil, metadata: nil) new.tap do |blob| blob.filename = name blob.content_type = content_type # Marcel::MimeType.for(data, name: name, declared_type: content_type) - blob.upload data + blob.upload io end end - def create_after_upload!(data:, filename:, content_type: nil, metadata: nil) - build_after_upload(data: data, filename: filename, content_type: content_type, metadata: metadata).tap(&:save!) + def create_after_upload!(io:, filename:, content_type: nil, metadata: nil) + build_after_upload(io: io, filename: filename, content_type: content_type, metadata: metadata).tap(&:save!) end end @@ -38,8 +38,8 @@ class ActiveFile::Blob < ActiveRecord::Base end - def upload(data) - site.upload(key, data) + def upload(io) + site.upload(key, io) self.checksum = site.checksum(key) self.byte_size = site.byte_size(key) diff --git a/lib/active_file/site.rb b/lib/active_file/site.rb index 3340c16620..eb72ef39d4 100644 --- a/lib/active_file/site.rb +++ b/lib/active_file/site.rb @@ -3,7 +3,7 @@ class ActiveFile::Site def initialize end - def upload(key, data) + def upload(key, io) raise NotImplementedError end diff --git a/lib/active_file/sites/disk_site.rb b/lib/active_file/sites/disk_site.rb index 41b883498a..e5572073ed 100644 --- a/lib/active_file/sites/disk_site.rb +++ b/lib/active_file/sites/disk_site.rb @@ -9,9 +9,9 @@ class ActiveFile::Sites::DiskSite < ActiveFile::Site end - def upload(key, data) + def upload(key, io) File.open(make_path_for(key), "wb") do |file| - while chunk = data.read(65536) + while chunk = io.read(65536) file.write(chunk) end end diff --git a/lib/active_file/sites/gcs_site.rb b/lib/active_file/sites/gcs_site.rb index 71f065c608..f5f8696f56 100644 --- a/lib/active_file/sites/gcs_site.rb +++ b/lib/active_file/sites/gcs_site.rb @@ -8,8 +8,8 @@ class ActiveFile::Sites::GCSSite < ActiveFile::Site @bucket = @client.bucket(bucket) end - def upload(key, data) - bucket.create_file(data, key) + def upload(key, io) + bucket.create_file(io, key) end def download(key) diff --git a/lib/active_file/sites/mirror_site.rb b/lib/active_file/sites/mirror_site.rb index f734f3ebf9..051d139af1 100644 --- a/lib/active_file/sites/mirror_site.rb +++ b/lib/active_file/sites/mirror_site.rb @@ -5,8 +5,8 @@ class ActiveFile::Sites::MirrorSite < ActiveFile::Site @sites = sites end - def upload(key, data) - perform_across_sites :upload, key, data + def upload(key, io) + perform_across_sites :upload, key, io end def download(key) diff --git a/lib/active_file/sites/s3_site.rb b/lib/active_file/sites/s3_site.rb index 4ede843cb4..e13b609881 100644 --- a/lib/active_file/sites/s3_site.rb +++ b/lib/active_file/sites/s3_site.rb @@ -8,8 +8,8 @@ class ActiveFile::Sites::S3Site < ActiveFile::Site @bucket = @client.bucket(bucket) end - def upload(key, data) - object_for(key).put(body: data) + def upload(key, io) + object_for(key).put(body: io) end def download(key) diff --git a/test/blob_test.rb b/test/blob_test.rb index ac54e0f2ca..c726555dc6 100644 --- a/test/blob_test.rb +++ b/test/blob_test.rb @@ -22,6 +22,6 @@ class ActiveFile::BlobTest < ActiveSupport::TestCase private def create_blob(data: "Hello world!", filename: "hello.txt", content_type: "text/plain") - ActiveFile::Blob.create_after_upload! data: StringIO.new(data), filename: filename, content_type: content_type + ActiveFile::Blob.create_after_upload! io: StringIO.new(data), filename: filename, content_type: content_type end end