qiniu 6.1.0 → 6.2.0
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 +4 -4
- data/.travis.yml +0 -1
- data/CHANGELOG.md +6 -0
- data/Gemfile.lock +1 -1
- data/lib/qiniu/auth.rb +215 -2
- data/lib/qiniu/management.rb +13 -2
- data/lib/qiniu/upload.rb +22 -0
- data/lib/qiniu/utils.rb +0 -21
- data/lib/qiniu/version.rb +1 -1
- data/spec/qiniu/auth_spec.rb +75 -0
- data/spec/qiniu/management_spec.rb +6 -8
- data/spec/qiniu/upload_spec.rb +44 -0
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: beb8c598a8ae3aabebea6aca70a992aa8cbfb20a
|
4
|
+
data.tar.gz: a23e588d3da392c136bb4112f17163658de5dc8f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 328f544c77cbe62e969704ce39f84a5f2a1f71e5d284cfadb3d5b6750ecef3002c48f5421cea24e7a6711e4a563d6eba908e13fc7abaf3f9d12c944304a9027b
|
7
|
+
data.tar.gz: 872dc200b4fa640c965f3b10416c210142f302cc0cbd0c81e0010aab3727c520d7cb2ad0190065a32cb2b1456cee5edd31cf5230d30767f62dfd88cc0bf5f3d4
|
data/.travis.yml
CHANGED
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,11 @@
|
|
1
1
|
## CHANGE LOG
|
2
2
|
|
3
|
+
### v6.2.0
|
4
|
+
|
5
|
+
- 重写与授权相关的函数并归入Qiniu::Auth空间,原授权凭证生成类维持不变。
|
6
|
+
|
7
|
+
- 添加Qiniu::Storage::PutPolicy类和Qiniu::Storage#upload_with_put_policy方法,并推荐使用两者组合实现单文件上传。
|
8
|
+
|
3
9
|
### v6.1.0
|
4
10
|
|
5
11
|
- Qiniu::Storage所有上传接口返回第三个值raw_headers,类型为Hash,包含已解析的HTTP响应报文中的所有Header信息。
|
data/Gemfile.lock
CHANGED
data/lib/qiniu/auth.rb
CHANGED
@@ -1,17 +1,146 @@
|
|
1
1
|
# -*- encoding: utf-8 -*-
|
2
|
+
# vim: sw=2 ts=2
|
3
|
+
|
4
|
+
require 'hmac-sha1'
|
5
|
+
require 'uri'
|
2
6
|
|
3
7
|
require 'qiniu/exceptions'
|
4
8
|
|
5
9
|
module Qiniu
|
6
10
|
module Auth
|
11
|
+
DEFAULT_AUTH_SECONDS = 3600
|
12
|
+
|
13
|
+
class << self
|
14
|
+
def calculate_deadline(expires_in, deadline = nil)
|
15
|
+
### 授权期计算
|
16
|
+
if expires_in.is_a?(Integer) && expires_in > 0 then
|
17
|
+
# 指定相对时间,单位:秒
|
18
|
+
return Time.now.to_i + expires_in
|
19
|
+
elsif deadline.is_a?(Integer) then
|
20
|
+
# 指定绝对时间,常用于调试和单元测试
|
21
|
+
return deadline
|
22
|
+
end
|
23
|
+
|
24
|
+
# 默认授权期1小时
|
25
|
+
return Time.now.to_i + DEFAULT_AUTH_SECONDS
|
26
|
+
end # calculate_deadline
|
27
|
+
end # class << self
|
28
|
+
|
29
|
+
class PutPolicy
|
30
|
+
private
|
31
|
+
def initialize(bucket,
|
32
|
+
key = nil,
|
33
|
+
expires_in = DEFAULT_AUTH_SECONDS,
|
34
|
+
deadline = nil)
|
35
|
+
### 设定scope参数(必填项目)
|
36
|
+
self.scope!(bucket, key)
|
37
|
+
|
38
|
+
### 设定deadline参数(必填项目)
|
39
|
+
@expires_in = expires_in
|
40
|
+
@deadline = Auth.calculate_deadline(expires_in, deadline)
|
41
|
+
end # initialize
|
42
|
+
|
43
|
+
PARAMS = {
|
44
|
+
# 字符串类型参数
|
45
|
+
:scope => "scope" ,
|
46
|
+
:save_key => "saveKey" ,
|
47
|
+
:end_user => "endUser" ,
|
48
|
+
:return_url => "returnUrl" ,
|
49
|
+
:return_body => "returnBody" ,
|
50
|
+
:callback_url => "callbackUrl" ,
|
51
|
+
:callback_body => "callbackBody" ,
|
52
|
+
:persistent_ops => "persistentOps" ,
|
53
|
+
:persistent_notify_url => "persistentNotifyUrl" ,
|
54
|
+
:transform => "transform" ,
|
55
|
+
|
56
|
+
# 数值类型参数
|
57
|
+
:deadline => "deadline" ,
|
58
|
+
:insert_only => "insertOnly" ,
|
59
|
+
:fsize_limit => "fsizeLimit" ,
|
60
|
+
:detect_mime => "detectMime" ,
|
61
|
+
:mime_limit => "mimeLimit" ,
|
62
|
+
:fop_timeout => "fopTimeout"
|
63
|
+
} # PARAMS
|
64
|
+
|
65
|
+
public
|
66
|
+
attr_reader :bucket, :key
|
67
|
+
|
68
|
+
def scope!(bucket, key = nil)
|
69
|
+
@bucket = bucket
|
70
|
+
@key = key
|
71
|
+
|
72
|
+
if key.nil? then
|
73
|
+
# 新增语义,文件已存在则失败
|
74
|
+
@scope = bucket
|
75
|
+
else
|
76
|
+
# 覆盖语义,文件已存在则直接覆盖
|
77
|
+
@scope = "#{bucket}:#{key}"
|
78
|
+
end
|
79
|
+
end # scope!
|
80
|
+
|
81
|
+
def expires_in!(seconds)
|
82
|
+
if !seconds.nil? then
|
83
|
+
return @expires_in
|
84
|
+
end
|
85
|
+
|
86
|
+
@epires_in = seconds
|
87
|
+
@deadline = Auth.calculate_deadline(seconds)
|
88
|
+
|
89
|
+
return @expires_in
|
90
|
+
end # expires_in!
|
91
|
+
|
92
|
+
def expires_in=(seconds)
|
93
|
+
return expires_in!(seconds)
|
94
|
+
end # expires_in=
|
95
|
+
|
96
|
+
def expires_in
|
97
|
+
return @expires_in
|
98
|
+
end # expires_in
|
99
|
+
|
100
|
+
def allow_mime_list! (list)
|
101
|
+
@mime_limit = list
|
102
|
+
end # allow_mime_list!
|
103
|
+
|
104
|
+
def deny_mime_list! (list)
|
105
|
+
@mime_limit = "!#{list}"
|
106
|
+
end # deny_mime_list!
|
107
|
+
|
108
|
+
def insert_only!
|
109
|
+
@insert_only = 1
|
110
|
+
end # insert_only!
|
111
|
+
|
112
|
+
def detect_mime!
|
113
|
+
@detect_mime = 1
|
114
|
+
end # detect_mime!
|
115
|
+
|
116
|
+
def to_json
|
117
|
+
args = {}
|
118
|
+
|
119
|
+
PARAMS.each_pair do |key, fld|
|
120
|
+
val = self.__send__(key)
|
121
|
+
if !val.nil? then
|
122
|
+
args[fld] = val
|
123
|
+
end
|
124
|
+
end
|
125
|
+
|
126
|
+
return args.to_json
|
127
|
+
end # to_json
|
128
|
+
|
129
|
+
PARAMS.each_pair do |key, fld|
|
130
|
+
attr_accessor key
|
131
|
+
end
|
132
|
+
end # class PutPolicy
|
7
133
|
|
8
134
|
class << self
|
9
135
|
|
10
136
|
include Utils
|
11
137
|
|
12
138
|
def call_with_signature(url, data, retry_times = 0, options = {})
|
13
|
-
|
14
|
-
|
139
|
+
return Utils.http_request(
|
140
|
+
url,
|
141
|
+
data,
|
142
|
+
options.merge({:qbox_signature_token => generate_acctoken(url, data)})
|
143
|
+
)
|
15
144
|
end # call_with_signature
|
16
145
|
|
17
146
|
def request(url, data = nil, options = {})
|
@@ -19,6 +148,90 @@ module Qiniu
|
|
19
148
|
[code, data, raw_headers]
|
20
149
|
end # request
|
21
150
|
|
151
|
+
EMPTY_ARGS = {}
|
152
|
+
|
153
|
+
### 生成下载授权URL
|
154
|
+
def authorize_download_url(url, args = EMPTY_ARGS)
|
155
|
+
### 提取AK/SK信息
|
156
|
+
access_key = Config.settings[:access_key]
|
157
|
+
secret_key = Config.settings[:secret_key]
|
158
|
+
|
159
|
+
### 授权期计算
|
160
|
+
e = Auth.calculate_deadline(args[:expires_in], args[:deadline])
|
161
|
+
|
162
|
+
### URL变换:追加授权期参数
|
163
|
+
if url.index('?').is_a?(Fixnum) then
|
164
|
+
# 已有参数
|
165
|
+
download_url = "#{url}&e=#{e}"
|
166
|
+
else
|
167
|
+
# 尚无参数
|
168
|
+
download_url = "#{url}?e=#{e}"
|
169
|
+
end
|
170
|
+
|
171
|
+
### 生成数字签名
|
172
|
+
sign = HMAC::SHA1.new(secret_key).update(download_url).digest
|
173
|
+
encoded_sign = Utils.urlsafe_base64_encode(sign)
|
174
|
+
|
175
|
+
### 生成下载授权凭证
|
176
|
+
dntoken = "#{access_key}:#{encoded_sign}"
|
177
|
+
|
178
|
+
### 返回下载授权URL
|
179
|
+
return "#{download_url}&token=#{dntoken}"
|
180
|
+
end # authorize_download_url
|
181
|
+
|
182
|
+
def generate_acctoken(url, body = '')
|
183
|
+
### 提取AK/SK信息
|
184
|
+
access_key = Config.settings[:access_key]
|
185
|
+
secret_key = Config.settings[:secret_key]
|
186
|
+
|
187
|
+
### 解析URL,生成待签名字符串
|
188
|
+
uri = URI.parse(url)
|
189
|
+
signing_str = uri.path
|
190
|
+
|
191
|
+
# 如有QueryString部分,则需要加上
|
192
|
+
query_string = uri.query
|
193
|
+
if query_string.is_a?(String) && !query_string.empty?
|
194
|
+
signing_str += '?' + query_string
|
195
|
+
end
|
196
|
+
|
197
|
+
# 追加换行符
|
198
|
+
signing_str += "\n"
|
199
|
+
|
200
|
+
# 如果有Body,则也加上
|
201
|
+
# (仅限于mime == "application/x-www-form-urlencoded"的情况)
|
202
|
+
if body.is_a?(String) && !body.empty?
|
203
|
+
signing_str += body
|
204
|
+
end
|
205
|
+
|
206
|
+
### 生成数字签名
|
207
|
+
sign = HMAC::SHA1.new(secret_key).update(signing_str).digest
|
208
|
+
encoded_sign = Utils.urlsafe_base64_encode(sign)
|
209
|
+
|
210
|
+
### 生成管理授权凭证
|
211
|
+
acctoken = "#{access_key}:#{encoded_sign}"
|
212
|
+
|
213
|
+
### 返回管理授权凭证
|
214
|
+
return acctoken
|
215
|
+
end # generate_acctoken
|
216
|
+
|
217
|
+
def generate_uptoken(put_policy)
|
218
|
+
### 提取AK/SK信息
|
219
|
+
access_key = Config.settings[:access_key]
|
220
|
+
secret_key = Config.settings[:secret_key]
|
221
|
+
|
222
|
+
### 生成待签名字符串
|
223
|
+
encoded_put_policy = Utils.urlsafe_base64_encode(put_policy.to_json)
|
224
|
+
|
225
|
+
### 生成数字签名
|
226
|
+
sign = HMAC::SHA1.new(secret_key).update(encoded_put_policy).digest
|
227
|
+
encoded_sign = Utils.urlsafe_base64_encode(sign)
|
228
|
+
|
229
|
+
### 生成上传授权凭证
|
230
|
+
uptoken = "#{access_key}:#{encoded_sign}:#{encoded_put_policy}"
|
231
|
+
|
232
|
+
### 返回上传授权凭证
|
233
|
+
return uptoken
|
234
|
+
end # generate_uptoken
|
22
235
|
end # class << self
|
23
236
|
|
24
237
|
end # module Auth
|
data/lib/qiniu/management.rb
CHANGED
@@ -9,10 +9,21 @@ module Qiniu
|
|
9
9
|
Auth.request Config.settings[:rs_host] + '/buckets'
|
10
10
|
end # buckets
|
11
11
|
|
12
|
-
|
13
|
-
|
12
|
+
PRIVATE_BUCKET = 0
|
13
|
+
PUBLIC_BUCKET = 1
|
14
|
+
|
15
|
+
def mkbucket(bucket_name, is_public = PUBLIC_BUCKET)
|
16
|
+
Auth.request Config.settings[:rs_host] + '/mkbucket2/' + bucket_name + '/public/' + is_public.to_s
|
14
17
|
end # mkbucket
|
15
18
|
|
19
|
+
def make_a_private_bucket(bucket_name)
|
20
|
+
return mkbucket(bucket_name, PRIVATE_BUCKET)
|
21
|
+
end # make_a_private_bucket
|
22
|
+
|
23
|
+
def make_a_public_bucket(bucket_name)
|
24
|
+
return mkbucket(bucket_name, PUBLIC_BUCKET)
|
25
|
+
end # make_a_public_bucket
|
26
|
+
|
16
27
|
def stat(bucket, key)
|
17
28
|
Auth.request Config.settings[:rs_host] + '/stat/' + encode_entry_uri(bucket, key)
|
18
29
|
end # stat
|
data/lib/qiniu/upload.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
# -*- encoding: utf-8 -*-
|
2
|
+
# vim: sw=2 ts=2
|
2
3
|
|
3
4
|
module Qiniu
|
4
5
|
module Storage
|
@@ -61,6 +62,27 @@ module Qiniu
|
|
61
62
|
Utils.http_request url, post_data
|
62
63
|
end # upload_with_token_2
|
63
64
|
|
65
|
+
### 授权举例
|
66
|
+
# put_policy.bucket | put_policy.key | key | 语义 | 授权
|
67
|
+
# :---------------- | :------------- | :------ | :--- | :---
|
68
|
+
# trivial_bucket | <nil> | <nil> | 新增 | 允许,最终key为1)使用put_policy.save_key生成的值或2)资源内容的Hash值
|
69
|
+
# trivial_bucket | <nil> | foo.txt | 新增 | 允许
|
70
|
+
# trivial_bucket | <nil> | bar.jpg | 新增 | 允许
|
71
|
+
# trivial_bucket | foo.txt | <nil> | 覆盖 | 允许,由SDK将put_policy.key赋值给key实现
|
72
|
+
# trivial_bucket | foo.txt | foo.txt | 覆盖 | 允许
|
73
|
+
# trivial_bucket | foo.txt | bar.jpg | 覆盖 | 禁止,put_policy.key与key不一致
|
74
|
+
def upload_with_put_policy(put_policy,
|
75
|
+
local_file,
|
76
|
+
key = nil,
|
77
|
+
x_vars = nil)
|
78
|
+
uptoken = Auth.generate_uptoken(put_policy)
|
79
|
+
if key.nil? then
|
80
|
+
key = put_policy.key
|
81
|
+
end
|
82
|
+
|
83
|
+
return upload_with_token_2(uptoken, local_file, key, x_vars)
|
84
|
+
end # upload_with_put_policy
|
85
|
+
|
64
86
|
private
|
65
87
|
def _generate_action_params(local_file,
|
66
88
|
bucket,
|
data/lib/qiniu/utils.rb
CHANGED
@@ -128,26 +128,5 @@ module Qiniu
|
|
128
128
|
File.open(filepath, "rb") { |f| Zlib.crc32 f.read }
|
129
129
|
end
|
130
130
|
|
131
|
-
def generate_qbox_signature(url, params, mime = nil)
|
132
|
-
access_key = Config.settings[:access_key]
|
133
|
-
secret_key = Config.settings[:secret_key]
|
134
|
-
uri = URI.parse(url)
|
135
|
-
signature = uri.path
|
136
|
-
query_string = uri.query
|
137
|
-
signature += '?' + query_string if !query_string.nil? && !query_string.empty?
|
138
|
-
signature += "\n"
|
139
|
-
if params.is_a?(Hash)
|
140
|
-
params_string = generate_query_string(params)
|
141
|
-
signature += params_string
|
142
|
-
end
|
143
|
-
if mime.is_a?(String) && mime == "application/x-www-form-urlencoded" && params.is_a?(String)
|
144
|
-
signature += params
|
145
|
-
end
|
146
|
-
hmac = HMAC::SHA1.new(secret_key)
|
147
|
-
hmac.update(signature)
|
148
|
-
encoded_digest = urlsafe_base64_encode(hmac.digest)
|
149
|
-
%Q(#{access_key}:#{encoded_digest})
|
150
|
-
end
|
151
|
-
|
152
131
|
end # module Utils
|
153
132
|
end # module Qiniu
|
data/lib/qiniu/version.rb
CHANGED
@@ -0,0 +1,75 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
require 'qiniu/auth'
|
5
|
+
require 'qiniu/storage'
|
6
|
+
require 'digest/sha1'
|
7
|
+
|
8
|
+
module Qiniu
|
9
|
+
module Auth
|
10
|
+
describe Auth do
|
11
|
+
|
12
|
+
before :all do
|
13
|
+
@bucket = 'RubySDK-Test-Private'
|
14
|
+
@bucket = make_unique_bucket(@bucket)
|
15
|
+
|
16
|
+
### 尝试创建Bucket
|
17
|
+
result = Qiniu::Storage.make_a_private_bucket(@bucket)
|
18
|
+
puts result.inspect
|
19
|
+
end
|
20
|
+
|
21
|
+
after :all do
|
22
|
+
### 不删除Bucket以备下次使用
|
23
|
+
end
|
24
|
+
|
25
|
+
### 测试私有资源下载
|
26
|
+
context ".download_private_file" do
|
27
|
+
it "should works" do
|
28
|
+
### 生成Key
|
29
|
+
key = 'a_private_file'
|
30
|
+
key = make_unique_key_in_bucket(key)
|
31
|
+
puts "key=#{key}"
|
32
|
+
|
33
|
+
### 上传测试文件
|
34
|
+
pp = Auth::PutPolicy.new(@bucket, key)
|
35
|
+
code, data, raw_headers = Qiniu::Storage.upload_with_put_policy(
|
36
|
+
pp,
|
37
|
+
__FILE__
|
38
|
+
)
|
39
|
+
code.should == 200
|
40
|
+
puts data.inspect
|
41
|
+
puts raw_headers.inspect
|
42
|
+
|
43
|
+
### 获取下载地址
|
44
|
+
code, data = Qiniu::Storage.get(@bucket, key)
|
45
|
+
code.should == 200
|
46
|
+
puts data.inspect
|
47
|
+
|
48
|
+
url = data['url']
|
49
|
+
|
50
|
+
### 授权下载地址(不带参数)
|
51
|
+
download_url = Qiniu::Auth.authorize_download_url(url)
|
52
|
+
puts "download_url=#{download_url}"
|
53
|
+
|
54
|
+
result = RestClient.get(download_url)
|
55
|
+
result.code.should == 200
|
56
|
+
result.body.should_not be_empty
|
57
|
+
|
58
|
+
### 授权下载地址(带参数)
|
59
|
+
download_url = Qiniu::Auth.authorize_download_url(url + '?download/a.m3u8')
|
60
|
+
puts "download_url=#{download_url}"
|
61
|
+
|
62
|
+
result = RestClient.get(download_url)
|
63
|
+
result.code.should == 200
|
64
|
+
result.body.should_not be_empty
|
65
|
+
|
66
|
+
### 删除文件
|
67
|
+
code, data = Qiniu::Storage.delete(@bucket, key)
|
68
|
+
code.should == 200
|
69
|
+
puts data.inspect
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
end
|
74
|
+
end # module Storage
|
75
|
+
end # module Qiniu
|
@@ -1,4 +1,5 @@
|
|
1
1
|
# -*- encoding: utf-8 -*-
|
2
|
+
# vim: sw=2 ts=2
|
2
3
|
|
3
4
|
require 'digest/sha1'
|
4
5
|
require 'spec_helper'
|
@@ -29,15 +30,12 @@ module Qiniu
|
|
29
30
|
end
|
30
31
|
|
31
32
|
### 准备数据
|
32
|
-
context ".
|
33
|
+
context ".prepare_file" do
|
33
34
|
it "should works" do
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
uptoken,
|
39
|
-
__FILE__,
|
40
|
-
@key
|
35
|
+
pp = Auth::PutPolicy.new(@bucket, @key)
|
36
|
+
code, data, raw_headers = Qiniu::Storage.upload_with_put_policy(
|
37
|
+
pp,
|
38
|
+
__FILE__
|
41
39
|
)
|
42
40
|
code.should == 200
|
43
41
|
puts data.inspect
|
data/spec/qiniu/upload_spec.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
# -*- encoding: utf-8 -*-
|
2
|
+
# vim: sw=2 ts=2
|
2
3
|
|
3
4
|
require 'spec_helper'
|
4
5
|
require 'qiniu/auth'
|
@@ -126,6 +127,49 @@ module Qiniu
|
|
126
127
|
end
|
127
128
|
end
|
128
129
|
|
130
|
+
context ".upload_with_put_policy" do
|
131
|
+
it "should works" do
|
132
|
+
pp = Qiniu::Auth::PutPolicy.new(@bucket, @key)
|
133
|
+
pp.end_user = "why404@gmail.com"
|
134
|
+
puts 'put_policy=' + pp.to_json
|
135
|
+
|
136
|
+
code, data, raw_headers = Qiniu::Storage.upload_with_put_policy(
|
137
|
+
pp,
|
138
|
+
__FILE__,
|
139
|
+
@key + '-not-equal'
|
140
|
+
)
|
141
|
+
code.should_not == 200
|
142
|
+
puts data.inspect
|
143
|
+
puts raw_headers.inspect
|
144
|
+
|
145
|
+
code, data, raw_headers = Qiniu::Storage.upload_with_put_policy(
|
146
|
+
pp,
|
147
|
+
__FILE__,
|
148
|
+
@key
|
149
|
+
)
|
150
|
+
|
151
|
+
code.should == 200
|
152
|
+
puts data.inspect
|
153
|
+
puts raw_headers.inspect
|
154
|
+
end
|
155
|
+
end # .upload_with_put_policy
|
156
|
+
|
157
|
+
context ".stat" do
|
158
|
+
it "should exists" do
|
159
|
+
code, data = Qiniu::Storage.stat(@bucket, @key)
|
160
|
+
puts data.inspect
|
161
|
+
code.should == 200
|
162
|
+
end
|
163
|
+
end
|
164
|
+
|
165
|
+
context ".delete" do
|
166
|
+
it "should works" do
|
167
|
+
code, data = Qiniu::Storage.delete(@bucket, @key)
|
168
|
+
puts data.inspect
|
169
|
+
code.should == 200
|
170
|
+
end
|
171
|
+
end
|
172
|
+
|
129
173
|
### 测试断点续上传
|
130
174
|
context ".resumable_upload_with_token" do
|
131
175
|
it "should works" do
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: qiniu
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 6.
|
4
|
+
version: 6.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- why404
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-04-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|
@@ -147,6 +147,7 @@ files:
|
|
147
147
|
- lib/qiniu/version.rb
|
148
148
|
- qiniu.gemspec
|
149
149
|
- spec/qiniu/abstract_spec.rb
|
150
|
+
- spec/qiniu/auth_spec.rb
|
150
151
|
- spec/qiniu/image_logo_for_test.png
|
151
152
|
- spec/qiniu/image_spec.rb
|
152
153
|
- spec/qiniu/management_spec.rb
|
@@ -182,6 +183,7 @@ specification_version: 4
|
|
182
183
|
summary: Qiniu Resource (Cloud) Storage SDK for Ruby
|
183
184
|
test_files:
|
184
185
|
- spec/qiniu/abstract_spec.rb
|
186
|
+
- spec/qiniu/auth_spec.rb
|
185
187
|
- spec/qiniu/image_logo_for_test.png
|
186
188
|
- spec/qiniu/image_spec.rb
|
187
189
|
- spec/qiniu/management_spec.rb
|