diff options
author | George Claghorn <george.claghorn@gmail.com> | 2017-07-03 17:54:57 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-07-03 17:54:57 -0400 |
commit | 52171ac2788183816cd5e8b145ab4408a7310978 (patch) | |
tree | d445fba118828d461070494de396493ded6d0f08 | |
parent | a91a30260b0d474fd1704b4cde7ee7c3bd1d9a41 (diff) | |
download | rails-52171ac2788183816cd5e8b145ab4408a7310978.tar.gz rails-52171ac2788183816cd5e8b145ab4408a7310978.tar.bz2 rails-52171ac2788183816cd5e8b145ab4408a7310978.zip |
Add a Google Cloud Storage site
-rw-r--r-- | Gemfile | 3 | ||||
-rw-r--r-- | Gemfile.lock | 146 | ||||
-rw-r--r-- | lib/active_file/site.rb | 1 | ||||
-rw-r--r-- | lib/active_file/sites/gcs_site.rb | 43 | ||||
-rw-r--r-- | test/gcs_site_test.rb | 64 |
5 files changed, 256 insertions, 1 deletions
@@ -6,4 +6,5 @@ gem 'rake' gem 'byebug' gem 'sqlite3' -gem 'aws-sdk'
\ No newline at end of file +gem 'aws-sdk' +gem 'google-cloud' diff --git a/Gemfile.lock b/Gemfile.lock index 0438cb67fb..7078d544cb 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -23,6 +23,8 @@ GEM i18n (~> 0.7) minitest (~> 5.1) tzinfo (~> 1.1) + addressable (2.5.1) + public_suffix (~> 2.0, >= 2.0.2) arel (8.0.0) aws-sdk (2.10.7) aws-sdk-resources (= 2.10.7) @@ -34,16 +36,159 @@ GEM aws-sigv4 (1.0.0) byebug (9.0.6) concurrent-ruby (1.0.5) + declarative (0.0.9) + declarative-option (0.1.0) + digest-crc (0.4.1) + faraday (0.12.1) + multipart-post (>= 1.2, < 3) globalid (0.4.0) activesupport (>= 4.2.0) + google-api-client (0.13.0) + addressable (~> 2.5, >= 2.5.1) + googleauth (~> 0.5) + httpclient (>= 2.8.1, < 3.0) + mime-types (~> 3.0) + representable (~> 3.0) + retriable (>= 2.0, < 4.0) + google-cloud (0.34.0) + google-cloud-bigquery (~> 0.27.0) + google-cloud-datastore (~> 1.0) + google-cloud-dns (~> 0.25.0) + google-cloud-error_reporting (~> 0.25.0) + google-cloud-language (~> 0.26.0) + google-cloud-logging (~> 1.0) + google-cloud-monitoring (~> 0.24.0) + google-cloud-pubsub (~> 0.25.0) + google-cloud-resource_manager (~> 0.26.0) + google-cloud-spanner (~> 0.21.0) + google-cloud-speech (~> 0.24.0) + google-cloud-storage (~> 1.2) + google-cloud-trace (~> 0.25.0) + google-cloud-translate (~> 1.0) + google-cloud-video_intelligence (~> 0.20.0) + google-cloud-vision (~> 0.24.0) + google-cloud-bigquery (0.27.0) + google-api-client (~> 0.13.0) + google-cloud-core (~> 1.0) + google-cloud-core (1.0.0) + google-cloud-env (~> 1.0) + googleauth (~> 0.5.1) + google-cloud-datastore (1.0.1) + google-cloud-core (~> 1.0) + google-gax (~> 0.8.0) + google-protobuf (~> 3.2.0) + google-cloud-dns (0.25.0) + google-api-client (~> 0.13.0) + google-cloud-core (~> 1.0) + zonefile (~> 1.04) + google-cloud-env (1.0.0) + faraday (~> 0.11) + google-cloud-error_reporting (0.25.0) + google-cloud-core (~> 1.0) + google-gax (~> 0.8.0) + stackdriver-core (~> 1.1) + google-cloud-language (0.26.2) + google-cloud-core (~> 1.0) + google-gax (~> 0.8.2) + google-cloud-logging (1.1.0) + google-cloud-core (~> 1.0) + google-gax (~> 0.8.0) + stackdriver-core (~> 1.1) + google-cloud-monitoring (0.24.0) + google-gax (~> 0.8.0) + google-cloud-pubsub (0.25.0) + google-cloud-core (~> 1.0) + google-gax (~> 0.8.0) + grpc-google-iam-v1 (~> 0.6.8) + google-cloud-resource_manager (0.26.0) + google-api-client (~> 0.13.0) + google-cloud-core (~> 1.0) + google-cloud-spanner (0.21.0) + concurrent-ruby (~> 1.0) + google-cloud-core (~> 1.0) + google-gax (~> 0.8.1) + grpc (~> 1.1) + grpc-google-iam-v1 (~> 0.6.8) + google-cloud-speech (0.24.0) + google-cloud-core (~> 1.0) + google-gax (~> 0.8.2) + google-cloud-storage (1.2.0) + digest-crc (~> 0.4) + google-api-client (~> 0.13.0) + google-cloud-core (~> 1.0) + google-cloud-trace (0.25.0) + google-cloud-core (~> 1.0) + google-gax (~> 0.8.0) + stackdriver-core (~> 1.1) + google-cloud-translate (1.0.0) + google-cloud-core (~> 1.0) + googleauth (~> 0.5.1) + google-cloud-video_intelligence (0.20.0) + google-gax (~> 0.8.0) + google-cloud-vision (0.24.0) + google-cloud-core (~> 1.0) + google-gax (~> 0.8.0) + google-gax (0.8.4) + google-protobuf (~> 3.2) + googleapis-common-protos (~> 1.3.5) + googleauth (~> 0.5.1) + grpc (~> 1.0) + rly (~> 0.2.3) + google-protobuf (3.2.0.2) + googleapis-common-protos (1.3.5) + google-protobuf (~> 3.2) + grpc (~> 1.0) + googleauth (0.5.1) + faraday (~> 0.9) + jwt (~> 1.4) + logging (~> 2.0) + memoist (~> 0.12) + multi_json (~> 1.11) + os (~> 0.9) + signet (~> 0.7) + grpc (1.4.1) + google-protobuf (~> 3.1) + googleauth (~> 0.5.1) + grpc-google-iam-v1 (0.6.8) + googleapis-common-protos (~> 1.3.1) + googleauth (~> 0.5.1) + grpc (~> 1.0) + httpclient (2.8.3) i18n (0.8.4) jmespath (1.3.1) + jwt (1.5.6) + little-plugger (1.1.4) + logging (2.2.2) + little-plugger (~> 1.1) + multi_json (~> 1.10) + memoist (0.16.0) + mime-types (3.1) + mime-types-data (~> 3.2015) + mime-types-data (3.2016.0521) minitest (5.10.2) + multi_json (1.12.1) + multipart-post (2.0.0) + os (0.9.6) + public_suffix (2.0.5) rake (12.0.0) + representable (3.0.4) + declarative (< 0.1.0) + declarative-option (< 0.2.0) + uber (< 0.2.0) + retriable (3.0.2) + rly (0.2.3) + signet (0.7.3) + addressable (~> 2.3) + faraday (~> 0.9) + jwt (~> 1.5) + multi_json (~> 1.10) sqlite3 (1.3.13) + stackdriver-core (1.1.0) thread_safe (0.3.6) tzinfo (1.2.3) thread_safe (~> 0.1) + uber (0.1.0) + zonefile (1.06) PLATFORMS ruby @@ -53,6 +198,7 @@ DEPENDENCIES aws-sdk bundler (~> 1.15) byebug + google-cloud rake sqlite3 diff --git a/lib/active_file/site.rb b/lib/active_file/site.rb index e44c0145a9..3340c16620 100644 --- a/lib/active_file/site.rb +++ b/lib/active_file/site.rb @@ -41,4 +41,5 @@ module ActiveFile::Sites end require "active_file/sites/disk_site" +require "active_file/sites/gcs_site" require "active_file/sites/s3_site" diff --git a/lib/active_file/sites/gcs_site.rb b/lib/active_file/sites/gcs_site.rb new file mode 100644 index 0000000000..d9164621c2 --- /dev/null +++ b/lib/active_file/sites/gcs_site.rb @@ -0,0 +1,43 @@ +require "google/cloud/storage" + +class ActiveFile::Sites::GCSSite < ActiveFile::Site + attr_reader :client, :bucket + + def initialize(project:, keyfile:, bucket:) + @client = Google::Cloud::Storage.new(project: project, keyfile: keyfile) + @bucket = @client.bucket(bucket) + end + + def upload(key, data) + bucket.create_file(data, key) + end + + def download(key) + io = file_for(key).download + io.rewind + io.read + end + + def delete(key) + file_for(key).try(:delete) + end + + def exist?(key) + file_for(key).present? + end + + + def byte_size(key) + file_for(key).size + end + + def checksum(key) + file_for(key).md5.unpack("m0").first.unpack("H*").first + end + + + private + def file_for(key) + bucket.file(key) + end +end diff --git a/test/gcs_site_test.rb b/test/gcs_site_test.rb new file mode 100644 index 0000000000..7363850ce7 --- /dev/null +++ b/test/gcs_site_test.rb @@ -0,0 +1,64 @@ +require "test_helper" +require "fileutils" +require "tmpdir" +require "active_support/core_ext/securerandom" +require "active_file/site" + +if ENV["GCS_PROJECT"] && ENV["GCS_KEYFILE"] && ENV["GCS_BUCKET"] + class ActiveFile::GCSSiteTest < ActiveSupport::TestCase + FIXTURE_KEY = SecureRandom.base58(24).to_s + FIXTURE_FILE = StringIO.new("Hello world!") + + setup do + @site = ActiveFile::Sites::GCSSite.new( + project: ENV["GCS_PROJECT"], + keyfile: ENV["GCS_KEYFILE"], + bucket: ENV["GCS_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 GCS Site tests because ENV variables are missing" +end |