Sha256: 267283e7ede35e58053f150944169138bf42ee9fb747f7ef17b2254c9c0317f3

Contents?: true

Size: 1.68 KB

Versions: 1

Compression:

Stored size: 1.68 KB

Contents

require 'aws-sdk-s3'

class S3Zipper
  class Client
    attr_accessor :bucket_name, :s3, :options, :pb

    def initialize bucket_name, options = {}
      @bucket_name = bucket_name
      @s3          = options[:client] || ::Aws::S3::Client.new
      @options     = options
      @pb          = Progress.new(enabled: options[:progress], format: "%e %c/%C %t", total: nil, length: 80, autofinish: false)
    end

    def download_keys keys
      pb.reset(total: keys.count, title: 'Downloading Keys')
      keys = keys.map do |key|
        pb.increment
        pb.update 'title', "Downloading Key: #{key}"
        temp = download_to_tempfile(key, cleanup: false)
        [key, temp]
      end
      keys = keys.partition { |_, temp| temp.nil? }
      pb.finish(title: 'Downloaded Keys', format: '%e %c/%C %t')
      keys
    end

    def download key
      s3.get_object bucket: bucket_name, key: key
    end

    def download_to_file key, target
      begin
        s3.get_object({ bucket: bucket_name, key: key }, target: target)
      rescue StandardError => e
        return nil
      end
      target
    end

    def download_to_tempfile key, cleanup: true
      temp = Tempfile.new
      temp.binmode
      temp = download_to_file key, temp
      return if temp.nil?
      yield(temp) if block_given?
      temp
    ensure
      temp&.unlink if cleanup
    end

    def upload local_path, repo_path
      pb = Progress.new(enabled: options[:progress], format: '%t', title: "Uploading '#{local_path}' to '#{repo_path}'", length: 120)
      s3.put_object(bucket: bucket_name, key: repo_path, body: File.open(local_path).read)
      pb.finish(title: "Uploaded '#{local_path}' to '#{repo_path}'")
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
s3_zipper-1.0.0 lib/s3_zipper/client.rb