erickj / bkblz

A gem for the Backblaze B2 cloud storage API.

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

=begin

tldr:
$ gem install bkblz
$ bkblz help

More...

This is the bkblz Ruby gem, a library for the Backblaze B2 cloud
storage API: https://www.backblaze.com/b2/docs/

Currently the gem supports the following V1 API calls:

  * b2_authorize_account
  * b2_create_bucket
  * b2_delete_bucket
  * b2_delete_file_version
  * b2_get_file_info
  * b2_get_upload_part_url
  * b2_finish_large_file
  * b2_list_buckets
  * b2_list_file_names
  * b2_list_file_versions
  * b2_start_large_file
  * b2_upload_file
  * b2_upload_part
  * b2_download_file_by_id
  * b2_download_file_by_name

Run `ruby README.rb` for a working demo, but first add your
application key and account id in the slots below.

Or `gem install bkblz` to begin. After install try `bkblz -h` to use
the CLI

=end

$: << 'lib'
require 'bkblz'

Bkblz.configure do |config_map|
  config_map.merge!(
    :application_key => "!!! API KEY !!!",
    :account_id => "!!! ACCOUNT ID !!!",
    :debug_http => false,
    :log_level => :info # change this to :debug for more info
  )
end

Bkblz.log.info do <<-EOS
# The block above configures some defaults (including the
# logger, which is why this is after the configure block), see
# Bkblz::Config for details. This is where to set the account_id
# and application_key.
EOS
end

if Bkblz.config.account_id.match /!!!/
  Bkblz.log.error "you didn't fill in your credentials, read the comments"
  exit 1
end

def run_readme
  Bkblz.log.info do <<-EOS
  # Using the config above, create an authorized session. All
  # requests will run in the context of this session. See
  # +Bkblz::V1::Session#authorize+.
  EOS
  end
  Bkblz::V1::Session.authorize Bkblz.config do |session|
    Bkblz.log.info "API session => #{session}"

    Bkblz.log.info do <<-EOS
    # First try to find an existing bucket named my-test-bucket,
    # we'll use that if it exists. All requests in a session are sent
    # through the session so that the request object gets access to the
    # auth credentials.
    EOS
    end
    buckets = session.send(Bkblz::V1::ListBucketsRequest.new).buckets
    Bkblz.log.info "bucket list => #{buckets}"

    new_bucket_name = "bkblz-readme-bucket"
    bucket = buckets.find { |b| b.bucket_name == new_bucket_name  }

    Bkblz.log.info do <<-EOS
    # Otherwise create a new my-test-bucket
    EOS
    end

    begin
      unless bucket
        bucket = Bkblz::V1::Model::Bucket.new \
                                            :bucket_name => new_bucket_name,
        :bucket_type => "allPrivate",
        :account_id => session.account_id

        Bkblz.log.info do <<-EOS
        # Pass a model to the CreateBucketRequest,
        # models are just named wrappers with dynamic methods
        # around the JSON responses provided back from the Bkblz
        # API. See lib/bkblz/v1/models.rb for a list of defined API
        # objects. See Bkblz::V1::Model::Base for how it work.
        EOS
        end
        request = Bkblz::V1::CreateBucketRequest.new bucket
        Bkblz.log.info "bucket model => #{bucket}"

        # Bkblz::V1::Response objects are returned from +send+. Some
        # provide a to_model method if they declare the +response_model+
        # in the class definition.
        bucket = session.send(request).to_model
        Bkblz.log.info "created bucket => #{bucket}"
      end

      Bkblz.log.info do <<-EOS
      # Uploading a file begins with getting a dynamic URL from the API.
      EOS
      end
      upload_auth = session.send(
        Bkblz::V1::GetUploadUrlRequest.new bucket.bucket_id).to_model
      Bkblz.log.info "upload file URL => #{upload_auth.upload_url}"


      Bkblz.log.info do <<-EOS
      # Use the upload_auth model (a
      # Bkblz::V1::Model::UploadAuth) to upload some files.
      EOS
      end
      5.times do |i|
        body = "some text #{i}"
        file_name = "some_text_#{i}.txt"
        content_type = nil

        upload_file_info = session.send(
          Bkblz::V1::UploadFileRequest.new upload_auth, body, file_name,
                                           content_type, Time.now.to_i * 1000).to_model
        Bkblz.log.info "uploaded file => #{upload_file_info.file_name}"
      end

      Bkblz.log.info do <<-EOS
      # We uploaded 5 files above, here we'll read back out
      # metadata from the first 2 files in the bucket.
      EOS
      end
      list_files_response = session.send(
        Bkblz::V1::ListFileVersionsRequest.new bucket, 2)
      bucket_files_info = list_files_response.files
      Bkblz.log.info "first 2 files => #{bucket_files_info.map(&:file_name).join "\n"}"

      Bkblz.log.info do <<-EOS
      # The response object returned object is a
      # Bkblz::Api::PaginatedResponse. Use its +has_more?+ and
      # +next_request+ methods to page through more results.
      EOS
      end
      while list_files_response.has_more?
        list_files_response = session.send list_files_response.next_request 100
        bucket_files_info.concat list_files_response.files
        Bkblz.log.info "next N files => #{list_files_response.files.map(&:file_name).join "\n"}"
      end

      Bkblz.log.info do <<-EOS
      # Files can also be listed by name.
      EOS
      end
      list_files_response = session.send(
        Bkblz::V1::ListFileNamesRequest.new bucket, 10)
      bucket_files_info = list_files_response.files
      Bkblz.log.info "files by name => #{bucket_files_info.map(&:file_name).join "\n"}"

      Bkblz.log.info do <<-EOS
      # Files can be downloaded by file name
      EOS
      end
      file_name = bucket_files_info.first.file_name
      file_name_download = session.send(
        Bkblz::V1::DownloadFileByNameRequest.new bucket, file_name).to_model
      Bkblz.log.info file_name_download
      Bkblz.log.info "file body: #{file_name_download.body}"

      Bkblz.log.info do <<-EOS
      # Files can also be downloaded by file id
      EOS
      end
      file_info = bucket_files_info[1]
      file_id_download = session.send(
        Bkblz::V1::DownloadFileByIdRequest.new file_info).to_model
      Bkblz.log.info file_id_download
      Bkblz.log.info "file body: #{file_id_download.body}"

      Bkblz.log.info do <<-EOS
      # File byte ranges can also be downloaded
      EOS
      end
      bytes = (2..8)
      byte_range_download = session.send(
        Bkblz::V1::DownloadFileByNameRequest.new bucket, file_name, bytes).to_model
      Bkblz.log.info "file bytes: #{byte_range_download.body}"

      # TODO: add examples for uploading large files by parts... see lib/bkblz/task/upload_file
    rescue => e
      Bkblz.log.error "there was an error: #{e}"
      Bkblz.log.error e.backtrace.join "\n"
      Bkblz.log.warn "cleaning up the bucket"
    ensure
      clear_the_bucket session, bucket
    end
  end
end

def clear_the_bucket(session, bucket)
  list_files_response = session.send(
    Bkblz::V1::ListFileVersionsRequest.new bucket)
  bucket_files_info = list_files_response.files

  Bkblz.log.info do <<-EOS
  # Delete all the files in the bucket that we added. This is
  # a service requirement to deleting a bucket.
  EOS
  end
  bucket_files_info.each do |file_info|
    request = Bkblz::V1::DeleteFileVersionRequest.new file_info
    delete_file_version_response = session.send request
    Bkblz.log.info "deleted file => #{delete_file_version_response.to_model.file_name}"
  end

  Bkblz.log.info do <<-EOS
  # Finally, delete the bucket.
  EOS
  end
  request = Bkblz::V1::DeleteBucketRequest.new bucket
  delete_bucket_response = session.send request
  Bkblz.log.info "deleted bucket => #{bucket.bucket_name}/#{bucket.bucket_id}"
end

run_readme

About

A gem for the Backblaze B2 cloud storage API.

License:MIT License


Languages

Language:Ruby 100.0%