bkblz 0.1.9 → 0.1.14
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +5 -5
- data/.gitignore +1 -0
- data/README.rb +13 -1
- data/bin/bkblz +25 -10
- data/lib/bkblz/config.rb +3 -1
- data/lib/bkblz/task/download_file.rb +7 -1
- data/lib/bkblz/task/upload_file.rb +96 -11
- data/lib/bkblz/v1/all.rb +8 -4
- data/lib/bkblz/v1/finish_large_file.rb +30 -0
- data/lib/bkblz/v1/get_upload_part_url.rb +22 -0
- data/lib/bkblz/v1/models.rb +10 -2
- data/lib/bkblz/v1/start_large_file.rb +40 -0
- data/lib/bkblz/v1/upload_part.rb +53 -0
- data/lib/bkblz/version.rb +1 -1
- metadata +7 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 47f032205c5b3348111f4cf170501fa08952ba7817cdc0c3ae06fba4c68c2a7d
|
4
|
+
data.tar.gz: d5a9dbae5c9fef54cbdc0e03520d283fe7634fc1b01cb537c81731ee0113d338
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3ac101a0d32a08d63ec18a156cc087b9401267ddaa37554fb4eadad5700f2a042b498953493d2c2c44127474665d6da688913814ab2620af20f17906d3fe7d50
|
7
|
+
data.tar.gz: 10bcde19f56e2488cb19879af0cbf46caa1a2221c987fd4cebf6237ad9c34d5b15671b5fa3142d21125325b5d36162969ab74d8e8bb0462c74362eda34a707ca
|
data/.gitignore
CHANGED
data/README.rb
CHANGED
@@ -1,6 +1,12 @@
|
|
1
1
|
=begin
|
2
2
|
|
3
|
-
|
3
|
+
tldr:
|
4
|
+
$ gem install bkblz
|
5
|
+
$ bkblz help
|
6
|
+
|
7
|
+
More...
|
8
|
+
|
9
|
+
This is the bkblz Ruby gem, a library for the Backblaze B2 cloud
|
4
10
|
storage API: https://www.backblaze.com/b2/docs/
|
5
11
|
|
6
12
|
Currently the gem supports the following V1 API calls:
|
@@ -10,10 +16,14 @@ Currently the gem supports the following V1 API calls:
|
|
10
16
|
* b2_delete_bucket
|
11
17
|
* b2_delete_file_version
|
12
18
|
* b2_get_file_info
|
19
|
+
* b2_get_upload_part_url
|
20
|
+
* b2_finish_large_file
|
13
21
|
* b2_list_buckets
|
14
22
|
* b2_list_file_names
|
15
23
|
* b2_list_file_versions
|
24
|
+
* b2_start_large_file
|
16
25
|
* b2_upload_file
|
26
|
+
* b2_upload_part
|
17
27
|
* b2_download_file_by_id
|
18
28
|
* b2_download_file_by_name
|
19
29
|
|
@@ -187,6 +197,8 @@ def run_readme
|
|
187
197
|
byte_range_download = session.send(
|
188
198
|
Bkblz::V1::DownloadFileByNameRequest.new bucket, file_name, bytes).to_model
|
189
199
|
Bkblz.log.info "file bytes: #{byte_range_download.body}"
|
200
|
+
|
201
|
+
# TODO: add examples for uploading large files by parts... see lib/bkblz/task/upload_file
|
190
202
|
rescue => e
|
191
203
|
Bkblz.log.error "there was an error: #{e}"
|
192
204
|
Bkblz.log.error e.backtrace.join "\n"
|
data/bin/bkblz
CHANGED
@@ -109,18 +109,28 @@ module Bkblz
|
|
109
109
|
class File < Thor
|
110
110
|
include Helper
|
111
111
|
|
112
|
-
desc "upload <bucket_name> <local_file_path>", "upload a local file to B2"
|
112
|
+
desc "upload <bucket_name> <local_file_path>", "upload a local file to B2" +
|
113
|
+
" if <local_file_path> is \"-\" (0x2d), then upload will read from STDIN."
|
113
114
|
option :file_name, :desc => "remote file name, if not given the basename" +
|
114
|
-
"of the local file is used"
|
115
|
+
" of the local file is used"
|
116
|
+
option :gzip, :type => :boolean, :desc => "automatically gzip files"
|
115
117
|
def upload(bucket_name, local_file_path)
|
116
118
|
parse_opts
|
117
119
|
|
120
|
+
params = {
|
121
|
+
:bucket_name => bucket_name,
|
122
|
+
:file_name => options[:file_name],
|
123
|
+
:gzip => options[:gzip]
|
124
|
+
}
|
125
|
+
|
126
|
+
if local_file_path == "-"
|
127
|
+
params[:file_body] = STDIN.read
|
128
|
+
else
|
129
|
+
params[:file_path] = local_file_path
|
130
|
+
end
|
131
|
+
|
118
132
|
file_info = run_task do
|
119
|
-
Bkblz::Task::UploadFile.run Bkblz.config,
|
120
|
-
:bucket_name => bucket_name,
|
121
|
-
:file_path => local_file_path,
|
122
|
-
:file_name => options[:file_name]
|
123
|
-
}
|
133
|
+
Bkblz::Task::UploadFile.run Bkblz.config, params
|
124
134
|
end
|
125
135
|
|
126
136
|
print_header "File Info"
|
@@ -129,6 +139,7 @@ module Bkblz
|
|
129
139
|
|
130
140
|
desc "downloadbyname <bucket> <name> <dir>", "downloads file by <bucket> " +
|
131
141
|
"and <name> to directory <dir>"
|
142
|
+
option :strip_prefix, :desc => "prefix to strip from filename when writing locally"
|
132
143
|
def downloadbyname(bucket_name, file_name, dir_path)
|
133
144
|
parse_opts
|
134
145
|
|
@@ -137,7 +148,8 @@ module Bkblz
|
|
137
148
|
:file_name => file_name,
|
138
149
|
:bucket_name => bucket_name,
|
139
150
|
:dir_path => dir_path,
|
140
|
-
:use_filename => true
|
151
|
+
:use_filename => true,
|
152
|
+
:strip_prefix => options[:strip_prefix]
|
141
153
|
}
|
142
154
|
end
|
143
155
|
|
@@ -147,6 +159,7 @@ module Bkblz
|
|
147
159
|
|
148
160
|
# TODO(erick): Rename to downloadbyid
|
149
161
|
desc "download <id> <dir>", "downloads file <id> to directory <dir>"
|
162
|
+
option :strip_prefix, :desc => "prefix to strip from filename when writing locally"
|
150
163
|
def download(file_id, dir_path)
|
151
164
|
parse_opts
|
152
165
|
|
@@ -154,7 +167,8 @@ module Bkblz
|
|
154
167
|
Bkblz::Task::DownloadFile.run Bkblz.config, {
|
155
168
|
:file_id => file_id,
|
156
169
|
:dir_path => dir_path,
|
157
|
-
:use_filename =>
|
170
|
+
:use_filename => false,
|
171
|
+
:strip_prefix => options[:strip_prefix]
|
158
172
|
}
|
159
173
|
end
|
160
174
|
|
@@ -218,7 +232,8 @@ module Bkblz
|
|
218
232
|
class Cli < Thor
|
219
233
|
include Helper
|
220
234
|
|
221
|
-
class_option :config, :desc => "path to a yml config file", :aliases => ["-c"]
|
235
|
+
class_option :config, :desc => "path to a yml config file", :aliases => ["-c"],
|
236
|
+
:default => ::File.expand_path('~/etc/bkblz/bkblz.yml')
|
222
237
|
|
223
238
|
desc "bucket SUBCOMMAND ...ARGS", "manage backblaze buckets"
|
224
239
|
subcommand "bucket", Bucket
|
data/lib/bkblz/config.rb
CHANGED
@@ -9,7 +9,9 @@ module Bkblz
|
|
9
9
|
|
10
10
|
:log_device => :stderr, # [:stdout, :stderr, :devnull, path, fd]
|
11
11
|
:log_level => :warn, # [:debug, :info, :warn, :error, :fatal, (-6..-1)]
|
12
|
-
:log_colorize => true
|
12
|
+
:log_colorize => true,
|
13
|
+
|
14
|
+
:large_file_max_chunk_size => 1e8, # 100MB
|
13
15
|
}.freeze
|
14
16
|
|
15
17
|
attr_reader *CONFIG_VARS.keys, :config_map
|
@@ -5,6 +5,7 @@ module Bkblz
|
|
5
5
|
class DownloadFile < BaseTask
|
6
6
|
|
7
7
|
task_param :dir_path, :required => true
|
8
|
+
task_param :strip_prefix
|
8
9
|
|
9
10
|
# for downalod by id
|
10
11
|
task_param :file_id
|
@@ -33,7 +34,12 @@ module Bkblz
|
|
33
34
|
raise "unable to write to directory %s" % dir_path
|
34
35
|
end
|
35
36
|
|
36
|
-
|
37
|
+
out_file_name = download_file_info.file_name
|
38
|
+
unless params[:strip_prefix].nil?
|
39
|
+
out_file_name.gsub! params[:strip_prefix], ""
|
40
|
+
end
|
41
|
+
|
42
|
+
f_path = ::File.join dir_path, out_file_name
|
37
43
|
if ::File.exists?(f_path) && !::File.writable?(f_path)
|
38
44
|
raise "unable to write to existing file: %s" % f_path
|
39
45
|
end
|
@@ -1,27 +1,112 @@
|
|
1
|
+
require 'zlib'
|
2
|
+
|
1
3
|
module Bkblz
|
2
4
|
module Task
|
3
5
|
class UploadFile < BaseTask
|
4
6
|
|
5
7
|
task_param :bucket_name, :required => true
|
6
|
-
task_param :file_path, :required => true
|
7
|
-
task_param :file_name # Overrides local file_path if given
|
8
8
|
|
9
|
-
#
|
10
|
-
|
9
|
+
# Either file_body or file_path is required
|
10
|
+
task_param :file_body
|
11
|
+
|
12
|
+
task_param :file_path
|
13
|
+
|
14
|
+
# Overrides local file_path if given
|
15
|
+
task_param :file_name
|
16
|
+
|
17
|
+
# Use gzip default compression before writing to b2 the file name will be
|
18
|
+
# updated by appending ".gz"
|
19
|
+
task_param :gzip
|
20
|
+
|
11
21
|
def run_internal(session, params)
|
12
|
-
|
22
|
+
file_name = if params[:file_name]
|
23
|
+
params[:file_name]
|
24
|
+
elsif params[:file_path]
|
25
|
+
::File.basename(params[:file_path])
|
26
|
+
else
|
27
|
+
raise 'missing either :file_name or :file_path param'
|
28
|
+
end
|
29
|
+
|
30
|
+
file_mtime = if params[:file_path]
|
31
|
+
::File.mtime(params[:file_path])
|
32
|
+
else
|
33
|
+
Time.now
|
34
|
+
end.to_i * 1000
|
13
35
|
|
14
36
|
bucket = find_bucket_by_name session, params[:bucket_name]
|
37
|
+
size = file_size(params)
|
38
|
+
|
39
|
+
file_data = {
|
40
|
+
:file_name => file_name,
|
41
|
+
:file_mtime => file_mtime,
|
42
|
+
:file_size => size,
|
43
|
+
:bucket => bucket,
|
44
|
+
}
|
45
|
+
|
46
|
+
if size > config.large_file_max_chunk_size
|
47
|
+
upload_large_file session, params, **file_data
|
48
|
+
else
|
49
|
+
upload_file session, params, **file_data
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
private
|
54
|
+
def file_size(params)
|
55
|
+
if params[:file_path]
|
56
|
+
::File.new(params[:file_path]).size
|
57
|
+
elsif params[:file_body]
|
58
|
+
params[:file_body].size
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
def upload_large_file(session, params, bucket:, file_name:, file_mtime:, **file_data)
|
63
|
+
start_large_file_info = session.send(Bkblz::V1::StartLargeFileRequest.new(
|
64
|
+
bucket.bucket_id, file_name, file_mtime)).to_model
|
65
|
+
file_id = start_large_file_info.file_id
|
66
|
+
|
67
|
+
upload_part_auth = session.send(Bkblz::V1::GetUploadPartUrlRequest.new(file_id)).to_model
|
68
|
+
|
69
|
+
actual_size = file_data[:file_size]
|
70
|
+
chunk_size = config.large_file_max_chunk_size
|
71
|
+
num_chunks = (actual_size / chunk_size.to_f).ceil
|
72
|
+
|
73
|
+
file_io = if params[:file_path]
|
74
|
+
::File.new(params[:file_path], "rb")
|
75
|
+
else
|
76
|
+
raise 'only file_path is supported for large file uploads'
|
77
|
+
end
|
78
|
+
|
79
|
+
upload_part_infos = (0..num_chunks - 1).map do |chunk_i|
|
80
|
+
session.send(Bkblz::V1::UploadPartRequest.new(
|
81
|
+
upload_part_auth, file_io, chunk_i, chunk_size)).to_model
|
82
|
+
end
|
83
|
+
|
84
|
+
file_info = session.send(
|
85
|
+
Bkblz::V1::FinishLargeFileRequest.new(file_id, upload_part_infos)).to_model
|
86
|
+
end
|
87
|
+
|
88
|
+
def upload_file(session, params, bucket:, file_name:, file_mtime:, **file_data)
|
89
|
+
file_body = if params[:file_path]
|
90
|
+
f = ::File.new(params[:file_path], "r")
|
91
|
+
f.read
|
92
|
+
elsif params[:file_body]
|
93
|
+
params[:file_body]
|
94
|
+
else
|
95
|
+
raise 'missing either :file_body or :file_path param'
|
96
|
+
end
|
97
|
+
|
98
|
+
if params[:gzip]
|
99
|
+
# https://ruby-doc.org/stdlib-2.4.2/libdoc/zlib/rdoc/Zlib.html#method-c-gzip
|
100
|
+
file_body = Zlib.gzip file_body, level: Zlib::DEFAULT_COMPRESSION
|
101
|
+
file_name << ".gz" unless file_name =~ /\.gz$/
|
102
|
+
end
|
103
|
+
|
15
104
|
upload_auth = session.send(
|
16
105
|
Bkblz::V1::GetUploadUrlRequest.new bucket.bucket_id).to_model
|
17
106
|
|
18
|
-
file_name = params[:file_name] || ::File.basename(f.path)
|
19
|
-
file_body = f.read
|
20
|
-
mtime_millis = f.mtime.to_i * 1000
|
21
|
-
|
22
107
|
upload_file_info = session.send(
|
23
|
-
Bkblz::V1::UploadFileRequest.new
|
24
|
-
|
108
|
+
Bkblz::V1::UploadFileRequest.new(
|
109
|
+
upload_auth, file_body, file_name, nil, file_mtime)).to_model
|
25
110
|
end
|
26
111
|
end
|
27
112
|
end
|
data/lib/bkblz/v1/all.rb
CHANGED
@@ -7,13 +7,17 @@ require_relative "request"
|
|
7
7
|
require_relative "error_response"
|
8
8
|
|
9
9
|
require_relative "authorize_account"
|
10
|
-
require_relative "list_buckets"
|
11
10
|
require_relative "create_bucket"
|
12
11
|
require_relative "delete_bucket"
|
12
|
+
require_relative "delete_file_version"
|
13
|
+
require_relative "download_file"
|
14
|
+
require_relative "finish_large_file"
|
13
15
|
require_relative "get_file_info"
|
16
|
+
require_relative "get_upload_part_url"
|
14
17
|
require_relative "get_upload_url"
|
15
|
-
require_relative "
|
18
|
+
require_relative "list_buckets"
|
16
19
|
require_relative "list_file_names"
|
17
20
|
require_relative "list_file_versions"
|
18
|
-
require_relative "
|
19
|
-
require_relative "
|
21
|
+
require_relative "start_large_file"
|
22
|
+
require_relative "upload_file"
|
23
|
+
require_relative "upload_part"
|
@@ -0,0 +1,30 @@
|
|
1
|
+
require "digest/sha1"
|
2
|
+
|
3
|
+
module Bkblz
|
4
|
+
module V1
|
5
|
+
|
6
|
+
class FinishLargeFileResponse < Response
|
7
|
+
response_model Model::FileInfo
|
8
|
+
end
|
9
|
+
|
10
|
+
class FinishLargeFileRequest < Request
|
11
|
+
|
12
|
+
response_class FinishLargeFileResponse
|
13
|
+
url_suffix "/b2api/v1/b2_finish_large_file"
|
14
|
+
|
15
|
+
def initialize(file_id, file_part_infos)
|
16
|
+
sha1_sums = file_part_infos.sort { |a, b| a.part_number <=> b.part_number }.map do |info|
|
17
|
+
info.content_sha1
|
18
|
+
end
|
19
|
+
@body = {
|
20
|
+
:file_id => file_id,
|
21
|
+
:part_sha1_array => sha1_sums,
|
22
|
+
}
|
23
|
+
end
|
24
|
+
|
25
|
+
def build_request(session)
|
26
|
+
session.create_post url(session), @body
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module Bkblz
|
2
|
+
module V1
|
3
|
+
|
4
|
+
class GetUploadPartUrlResponse < Response
|
5
|
+
response_model Model::UploadPartAuth
|
6
|
+
end
|
7
|
+
|
8
|
+
class GetUploadPartUrlRequest < Request
|
9
|
+
|
10
|
+
response_class GetUploadPartUrlResponse
|
11
|
+
url_suffix "/b2api/v1/b2_get_upload_part_url"
|
12
|
+
|
13
|
+
def initialize(file_id)
|
14
|
+
@body = {:file_id => file_id}
|
15
|
+
end
|
16
|
+
|
17
|
+
def build_request(session)
|
18
|
+
session.create_post url(session), @body
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
data/lib/bkblz/v1/models.rb
CHANGED
@@ -15,18 +15,26 @@ module Bkblz
|
|
15
15
|
:body, :content_length, :content_type, :file_id, :file_name, :sha1, :x_bz_info
|
16
16
|
]
|
17
17
|
|
18
|
-
# Returned by upload_file
|
18
|
+
# Returned by upload_file, finish_large_file, start_large_file
|
19
19
|
FileInfo = Model.define *[
|
20
|
-
:account_id, :bucket_id, :content_length, :content_sha1, :content_type,
|
20
|
+
:account_id, :action, :bucket_id, :content_length, :content_sha1, :content_type,
|
21
21
|
:file_id, :file_info, :file_name
|
22
22
|
]
|
23
23
|
|
24
|
+
# Returned by upload_file
|
25
|
+
FilePartInfo = Model.define *[
|
26
|
+
:file_id, :part_number, :content_length, :content_sha1, :upload_timestamp,
|
27
|
+
]
|
28
|
+
|
24
29
|
# Returned by delete_file_version
|
25
30
|
PartialFileInfo = Model.define :file_id, :file_name
|
26
31
|
|
27
32
|
# Returned by get_upload_url
|
28
33
|
UploadAuth = Model.define :bucket_id, :upload_url, :authorization_token
|
29
34
|
|
35
|
+
# Returned by get_upload_part_url
|
36
|
+
UploadPartAuth = Model.define :file_id, :upload_url, :authorization_token
|
37
|
+
|
30
38
|
# Possibly returned by any request
|
31
39
|
Error = Model.define :status, :code, :message
|
32
40
|
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
require "digest/sha1"
|
2
|
+
|
3
|
+
module Bkblz
|
4
|
+
module V1
|
5
|
+
|
6
|
+
class StartLargeFileResponse < Response
|
7
|
+
response_model Model::FileInfo
|
8
|
+
end
|
9
|
+
|
10
|
+
class StartLargeFileRequest < Request
|
11
|
+
|
12
|
+
response_class StartLargeFileResponse
|
13
|
+
url_suffix "/b2api/v1/b2_start_large_file"
|
14
|
+
|
15
|
+
def initialize(bucket_id, file_name, last_modified_millis=nil,
|
16
|
+
file_sha=nil, content_type='b2/x-auto', **file_info)
|
17
|
+
# Both of the following are recommended here:
|
18
|
+
# https://www.backblaze.com/b2/docs/b2_start_large_file.html
|
19
|
+
if last_modified_millis
|
20
|
+
# must be a string
|
21
|
+
file_info[:src_last_modified_millis] = last_modified_millis.to_s
|
22
|
+
end
|
23
|
+
if file_sha
|
24
|
+
file_info[:large_file_sha1] = file_sha
|
25
|
+
end
|
26
|
+
|
27
|
+
@body = {
|
28
|
+
:bucket_id => bucket_id,
|
29
|
+
:file_name => file_name,
|
30
|
+
:content_type => content_type,
|
31
|
+
:file_info => file_info
|
32
|
+
}
|
33
|
+
end
|
34
|
+
|
35
|
+
def build_request(session)
|
36
|
+
session.create_post url(session), @body
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
require "digest/sha1"
|
2
|
+
|
3
|
+
module Bkblz
|
4
|
+
module V1
|
5
|
+
|
6
|
+
class UploadPartResponse < Response
|
7
|
+
response_model Model::FilePartInfo
|
8
|
+
end
|
9
|
+
|
10
|
+
class UploadPartRequest < Request
|
11
|
+
|
12
|
+
response_class UploadPartResponse
|
13
|
+
|
14
|
+
REQUIRED_HEADERS = {
|
15
|
+
:"Authorization" => nil,
|
16
|
+
:"Content-Length" => nil,
|
17
|
+
:"Content-Type" => 'application/octet-stream',
|
18
|
+
:"X-Bz-Part-Number" => nil, # a value in [1..10000]
|
19
|
+
:"X-Bz-Content-Sha1" => nil
|
20
|
+
}
|
21
|
+
|
22
|
+
##
|
23
|
+
# @param {chunk_number} is a value in [0...9999]
|
24
|
+
def initialize(upload_part_auth, io, chunk_number, chunk_size)
|
25
|
+
@upload_url = upload_part_auth.upload_url
|
26
|
+
@body_chunk = read_chunk(io, chunk_number, chunk_size)
|
27
|
+
@headers = REQUIRED_HEADERS.dup
|
28
|
+
|
29
|
+
part_number = chunk_number + 1
|
30
|
+
@headers[:"Authorization"] = upload_part_auth.authorization_token
|
31
|
+
@headers[:"Content-Length"] = @body_chunk.size
|
32
|
+
@headers[:"X-Bz-Part-Number"] = part_number
|
33
|
+
@headers[:"X-Bz-Content-Sha1"] = Digest::SHA1.hexdigest @body_chunk
|
34
|
+
end
|
35
|
+
|
36
|
+
def build_request(session)
|
37
|
+
session.create_post @upload_url, @body_chunk, @headers
|
38
|
+
end
|
39
|
+
|
40
|
+
private
|
41
|
+
def read_chunk(io, chunk_number, chunk_size)
|
42
|
+
unless io.is_a?(IO)
|
43
|
+
raise 'only IO type is supported for upload_part'
|
44
|
+
end
|
45
|
+
|
46
|
+
byte = chunk_number * chunk_size
|
47
|
+
# https://ruby-doc.org/core-2.5/IO.html#method-i-seek
|
48
|
+
io.seek byte, IO::SEEK_SET
|
49
|
+
io.read(chunk_size)
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
data/lib/bkblz/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: bkblz
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.14
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Erick Johnson
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2020-11-25 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: thor
|
@@ -105,7 +105,9 @@ files:
|
|
105
105
|
- lib/bkblz/v1/delete_file_version.rb
|
106
106
|
- lib/bkblz/v1/download_file.rb
|
107
107
|
- lib/bkblz/v1/error_response.rb
|
108
|
+
- lib/bkblz/v1/finish_large_file.rb
|
108
109
|
- lib/bkblz/v1/get_file_info.rb
|
110
|
+
- lib/bkblz/v1/get_upload_part_url.rb
|
109
111
|
- lib/bkblz/v1/get_upload_url.rb
|
110
112
|
- lib/bkblz/v1/list_buckets.rb
|
111
113
|
- lib/bkblz/v1/list_file_names.rb
|
@@ -115,7 +117,9 @@ files:
|
|
115
117
|
- lib/bkblz/v1/request.rb
|
116
118
|
- lib/bkblz/v1/response.rb
|
117
119
|
- lib/bkblz/v1/session.rb
|
120
|
+
- lib/bkblz/v1/start_large_file.rb
|
118
121
|
- lib/bkblz/v1/upload_file.rb
|
122
|
+
- lib/bkblz/v1/upload_part.rb
|
119
123
|
- lib/bkblz/version.rb
|
120
124
|
homepage: https://github.com/erickj/bkblz
|
121
125
|
licenses:
|
@@ -136,8 +140,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
136
140
|
- !ruby/object:Gem::Version
|
137
141
|
version: '0'
|
138
142
|
requirements: []
|
139
|
-
|
140
|
-
rubygems_version: 2.6.13
|
143
|
+
rubygems_version: 3.1.4
|
141
144
|
signing_key:
|
142
145
|
specification_version: 4
|
143
146
|
summary: Bkblz GEM for the Backblaze B2 API. https://www.backblaze.com/b2/docs/
|