class GcloudStorage::Base

Attributes

connection[R]

Public Class Methods

new(options) click to toggle source
# File lib/gcloud_storage/base.rb, line 10
def initialize(options)
  @connection = { credentials: options }

  Error.missing_credentials unless options.is_a?(Hash)

  unless options[:storage] == :local_store
    missing_options = []

    [:bucket_name, :project_id, :key_file].each do |option|
      option_value = options[option]

      unless options[:compute_instance] && option == :key_file
        missing_options << option if (option_value.nil? || !(option_value))
      end
    end

    unless missing_options.empty?
      raise Error::Argument.new(":#{missing_options.join(', ')} are missing")
    end
  end

  # Cache service, storage and bucket to @connection
  self.bucket
end

Public Instance Methods

bucket() click to toggle source
# File lib/gcloud_storage/base.rb, line 66
def bucket
  @connection[:bucket] ||= self.storage.bucket(
    @connection[:credentials][:bucket_name]
  )
end
delete_file(file_path) click to toggle source
# File lib/gcloud_storage/base.rb, line 99
def delete_file(file_path)
  begin
    file = self.bucket.file(file_path)
    file.delete
  rescue => e
    if e.class == NoMethodError
      raise Google::Cloud::Error.new(
        "Not Found: The object you specified doesn't exist!"
      )
    else
      raise e
    end
  end
end
expirable_url(file_path, num_secs=300) click to toggle source
# File lib/gcloud_storage/base.rb, line 72
def expirable_url(file_path, num_secs=300)
  file = self.bucket.file(file_path)
  file.signed_url(method: 'GET', expires: num_secs)
end
service() click to toggle source
# File lib/gcloud_storage/base.rb, line 35
def service
  storage_type = @connection[:credentials][:storage].present? ?
                    @connection[:credentials][:storage] : (:gcloud)

  begin
    @connection[:service] ||=
      if storage_type == :local_store
        LocalStore.new
      else
        Google::Cloud::Storage.new(
          project_id: @connection[:credentials][:project_id],
          credentials: @connection[:credentials][:key_file]
        )
      end
  rescue => e
    raise e
  end
end
storage() click to toggle source
# File lib/gcloud_storage/base.rb, line 54
def storage
  @connection[:storage] ||= (
    begin
      tries ||= 3
      self.service
    rescue => e
      retry unless (tries -= 1).zero?
      raise e
    end
  )
end
upload_file(file, dest_file_path) click to toggle source
# File lib/gcloud_storage/base.rb, line 77
def upload_file(file, dest_file_path)
  remote_file = nil
  file_path = (file.respond_to?(:tempfile))? file.tempfile : file

  begin
    retries ||= 2
    remote_file = self.bucket.upload_file file_path, dest_file_path
  rescue => e
    unless (retries -= 1).zero?
      retry
    else
      raise e
    end
  else
    unless remote_file.md5 == Digest::MD5.base64digest(File.read(file_path))
      raise Exception.new('Uploaded file is corrupted.')
    end

    remote_file
  end
end