diff options
author | David Heinemeier Hansson <david@loudthinking.com> | 2017-07-03 23:19:51 +0200 |
---|---|---|
committer | David Heinemeier Hansson <david@loudthinking.com> | 2017-07-03 23:19:51 +0200 |
commit | a91a30260b0d474fd1704b4cde7ee7c3bd1d9a41 (patch) | |
tree | 120b230a7414b9b8f93bfe4c5cacf9c6a7919771 | |
parent | b00ff22ca00f33c291b3beb2fe3818a2c30bab28 (diff) | |
download | rails-a91a30260b0d474fd1704b4cde7ee7c3bd1d9a41.tar.gz rails-a91a30260b0d474fd1704b4cde7ee7c3bd1d9a41.tar.bz2 rails-a91a30260b0d474fd1704b4cde7ee7c3bd1d9a41.zip |
Update for AWS S3 v2 API and test it when supplying the right ENVs
-rw-r--r-- | lib/active_file/site.rb | 1 | ||||
-rw-r--r-- | lib/active_file/sites/s3_site.rb | 23 | ||||
-rw-r--r-- | test/s3_site_test.rb | 65 |
3 files changed, 74 insertions, 15 deletions
diff --git a/lib/active_file/site.rb b/lib/active_file/site.rb index 33494b916a..e44c0145a9 100644 --- a/lib/active_file/site.rb +++ b/lib/active_file/site.rb @@ -41,3 +41,4 @@ module ActiveFile::Sites end require "active_file/sites/disk_site" +require "active_file/sites/s3_site" diff --git a/lib/active_file/sites/s3_site.rb b/lib/active_file/sites/s3_site.rb index 838163a23d..4ede843cb4 100644 --- a/lib/active_file/sites/s3_site.rb +++ b/lib/active_file/sites/s3_site.rb @@ -16,7 +16,7 @@ class ActiveFile::Sites::S3Site < ActiveFile::Site if block_given? stream(key, &block) else - object_for(key).read + object_for(key).get.body.read end end @@ -25,27 +25,20 @@ class ActiveFile::Sites::S3Site < ActiveFile::Site end def exist?(key) - object_for(key).exist? + object_for(key).exists? end + def url(key, disposition: :inline, expires_in: nil) + object_for(key).presigned_url(:get, expires_in: expires_in) + end + def byte_size(key) - object_for(key).head[:size] + object_for(key).size end def checksum(key) - head = object_for(key).head - - # If the etag has no dashes, it's the MD5 - if !head.etag.include?("-") - head.etag.gsub('"', '') - # Check for md5 in metadata if it was uploaded via multipart - elsif md5sum = head.meta["md5sum"] - md5sum - # Otherwise, we don't have a digest yet for this key - else - nil - end + object_for(key).etag.remove(/"/) end diff --git a/test/s3_site_test.rb b/test/s3_site_test.rb new file mode 100644 index 0000000000..bf7d4b0703 --- /dev/null +++ b/test/s3_site_test.rb @@ -0,0 +1,65 @@ +require "test_helper" +require "fileutils" +require "tmpdir" +require "active_support/core_ext/securerandom" +require "active_file/site" + +if ENV["AWS_ACCESS_KEY_ID"] && ENV["AWS_SECRET_ACCESS_KEY"] && ENV["AWS_REGION"] && ENV["AWS_S3_BUCKET"] + class ActiveFile::S3SiteTest < ActiveSupport::TestCase + FIXTURE_KEY = SecureRandom.base58(24).to_s + FIXTURE_FILE = StringIO.new("Hello world!") + + setup do + @site = ActiveFile::Sites::S3Site.new( + access_key_id: ENV["AWS_ACCESS_KEY_ID"], + secret_access_key: ENV["AWS_SECRET_ACCESS_KEY"], + region: ENV["AWS_REGION"], + bucket: ENV["AWS_S3_BUCKET"] + ) + + @site.upload FIXTURE_KEY, FIXTURE_FILE + FIXTURE_FILE.rewind + end + + teardown do + @site.delete FIXTURE_KEY + FIXTURE_FILE.rewind + end + + test "uploading" do + begin + key = SecureRandom.base58(24) + data = "Something else entirely!" + @site.upload(key, StringIO.new(data)) + + assert_equal data, @site.download(key) + ensure + @site.delete key + end + end + + test "downloading" do + assert_equal FIXTURE_FILE.read, @site.download(FIXTURE_KEY) + end + + test "existing" do + assert @site.exist?(FIXTURE_KEY) + assert_not @site.exist?(FIXTURE_KEY + "nonsense") + end + + test "deleting" do + @site.delete FIXTURE_KEY + assert_not @site.exist?(FIXTURE_KEY) + end + + test "sizing" do + assert_equal FIXTURE_FILE.size, @site.byte_size(FIXTURE_KEY) + end + + test "checksumming" do + assert_equal Digest::MD5.hexdigest(FIXTURE_FILE.read), @site.checksum(FIXTURE_KEY) + end + end +else + puts "Skipping S3 Site tests because ENV variables are missing" +end |