qiniu 6.2.0 → 6.2.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +0 -4
- data/CHANGELOG.md +4 -0
- data/Gemfile.lock +1 -1
- data/README.md +1 -0
- data/lib/qiniu.rb +2 -12
- data/lib/qiniu/adt.rb +46 -0
- data/lib/qiniu/auth.rb +0 -16
- data/lib/qiniu/fop.rb +1 -0
- data/lib/qiniu/http.rb +137 -0
- data/lib/qiniu/image.rb +2 -2
- data/lib/qiniu/management.rb +26 -23
- data/lib/qiniu/misc.rb +13 -15
- data/lib/qiniu/pfop.rb +123 -0
- data/lib/qiniu/resumable_upload.rb +32 -19
- data/lib/qiniu/tokens/qbox_token.rb +1 -1
- data/lib/qiniu/upload.rb +13 -3
- data/lib/qiniu/utils.rb +3 -26
- data/lib/qiniu/version.rb +1 -1
- data/qiniu.gemspec +3 -2
- data/spec/qiniu/pfop_spec.rb +89 -0
- metadata +31 -24
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d8305d0d51c6dd65343f634f175edb242bc81733
|
4
|
+
data.tar.gz: ae6055351cd00d341487bd545aef683ead3ae99f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 729967aa45f514f1d9b205c9b8eeabc0d886634dfcfd7b38d3a89326c6e01bdb95966cd19de1e5e0fc7d0a94e5fe76715ff514ca5c2038b1d68c379c5b914f28
|
7
|
+
data.tar.gz: 490c565dcfed6aca96e917d8228e0634c263ca52b7ed34dfc31d5ffc661dc3d6f82b39db72b1b9e196543b87ddaaabe56bc77cbc45b75f1cb8166617d77e3f66
|
data/.travis.yml
CHANGED
@@ -1,13 +1,9 @@
|
|
1
1
|
language: ruby
|
2
2
|
rvm:
|
3
|
-
- 1.8.7
|
4
|
-
- 1.9.2
|
5
3
|
- 1.9.3
|
6
4
|
- 2.0.0
|
7
5
|
- 2.1.1
|
8
|
-
- jruby-18mode
|
9
6
|
- jruby-19mode
|
10
|
-
- ree
|
11
7
|
before_script:
|
12
8
|
- export QINIU_ACCESS_KEY=LGRqJsjX7LAvtdtX6hhyxs861lS57HwnOQmJsOuX
|
13
9
|
- export QINIU_SECRET_KEY=g_OxhuN5iJ1O7BoA6YdXyF6zSszk34UZFKDfdIIW
|
data/CHANGELOG.md
CHANGED
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -9,6 +9,7 @@
|
|
9
9
|
[![Build Status](https://api.travis-ci.org/qiniu/ruby-sdk.png?branch=master)](https://travis-ci.org/qiniu/ruby-sdk)
|
10
10
|
[![Gem Version](https://badge.fury.io/rb/qiniu.png)](http://badge.fury.io/rb/qiniu)
|
11
11
|
[![Dependency Status](https://gemnasium.com/qiniu/ruby-sdk.png)](https://gemnasium.com/qiniu/ruby-sdk)
|
12
|
+
[![Code Climate](https://codeclimate.com/github/qiniu/ruby-sdk.png)](https://codeclimate.com/github/qiniu/ruby-sdk)
|
12
13
|
|
13
14
|
## 安装
|
14
15
|
|
data/lib/qiniu.rb
CHANGED
@@ -64,7 +64,7 @@ module Qiniu
|
|
64
64
|
opts[:enable_resumable_upload] = true unless opts.has_key?(:enable_resumable_upload)
|
65
65
|
|
66
66
|
if opts[:enable_resumable_upload] && File::size(source_file) > Config.settings[:block_size]
|
67
|
-
code, data = Storage.upload_with_token(opts[:uptoken],
|
67
|
+
code, data, raw_headers = Storage.upload_with_token(opts[:uptoken],
|
68
68
|
opts[:file],
|
69
69
|
opts[:bucket],
|
70
70
|
opts[:key],
|
@@ -74,7 +74,7 @@ module Qiniu
|
|
74
74
|
opts[:callback_params],
|
75
75
|
opts[:rotate])
|
76
76
|
else
|
77
|
-
code, data = Storage.upload_with_token(opts[:uptoken],
|
77
|
+
code, data, raw_headers = Storage.upload_with_token(opts[:uptoken],
|
78
78
|
opts[:file],
|
79
79
|
opts[:bucket],
|
80
80
|
opts[:key],
|
@@ -156,16 +156,6 @@ module Qiniu
|
|
156
156
|
code == StatusOK ? data : false
|
157
157
|
end
|
158
158
|
|
159
|
-
def publish(domain, bucket)
|
160
|
-
code, data = Storage.publish(domain, bucket)
|
161
|
-
code == StatusOK
|
162
|
-
end
|
163
|
-
|
164
|
-
def unpublish(domain)
|
165
|
-
code, data = Storage.unpublish(domain)
|
166
|
-
code == StatusOK
|
167
|
-
end
|
168
|
-
|
169
159
|
def drop(bucket)
|
170
160
|
code, data = Storage.drop(bucket)
|
171
161
|
code == StatusOK
|
data/lib/qiniu/adt.rb
ADDED
@@ -0,0 +1,46 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
# vim: sw=2 ts=2
|
3
|
+
|
4
|
+
require 'uri'
|
5
|
+
|
6
|
+
module Qiniu
|
7
|
+
module ADT
|
8
|
+
|
9
|
+
class ApiSpecification
|
10
|
+
public
|
11
|
+
def to_str; return ""; end
|
12
|
+
end # class ApiSpecification
|
13
|
+
|
14
|
+
module Policy
|
15
|
+
public
|
16
|
+
def to_json
|
17
|
+
args = {}
|
18
|
+
|
19
|
+
self.params.each_pair do |key, fld|
|
20
|
+
val = self.__send__(key)
|
21
|
+
if !val.nil? then
|
22
|
+
args[fld] = val
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
return args.to_json
|
27
|
+
end # to_json
|
28
|
+
|
29
|
+
def to_query_string
|
30
|
+
args = []
|
31
|
+
|
32
|
+
self.params.each_pair do |key, fld|
|
33
|
+
val = self.__send__(key)
|
34
|
+
if !val.nil? then
|
35
|
+
new_fld = CGI.escape(fld.to_s)
|
36
|
+
new_val = CGI.escape(val.to_s).gsub('+', '%20')
|
37
|
+
args.push("#{new_fld}=#{new_val}")
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
return args.join("&")
|
42
|
+
end # to_query_string
|
43
|
+
end # module Policy
|
44
|
+
|
45
|
+
end # module ADT
|
46
|
+
end # module Qiniu
|
data/lib/qiniu/auth.rb
CHANGED
@@ -132,22 +132,6 @@ module Qiniu
|
|
132
132
|
end # class PutPolicy
|
133
133
|
|
134
134
|
class << self
|
135
|
-
|
136
|
-
include Utils
|
137
|
-
|
138
|
-
def call_with_signature(url, data, retry_times = 0, options = {})
|
139
|
-
return Utils.http_request(
|
140
|
-
url,
|
141
|
-
data,
|
142
|
-
options.merge({:qbox_signature_token => generate_acctoken(url, data)})
|
143
|
-
)
|
144
|
-
end # call_with_signature
|
145
|
-
|
146
|
-
def request(url, data = nil, options = {})
|
147
|
-
code, data, raw_headers = Auth.call_with_signature(url, data, 0, options)
|
148
|
-
[code, data, raw_headers]
|
149
|
-
end # request
|
150
|
-
|
151
135
|
EMPTY_ARGS = {}
|
152
136
|
|
153
137
|
### 生成下载授权URL
|
data/lib/qiniu/fop.rb
CHANGED
data/lib/qiniu/http.rb
ADDED
@@ -0,0 +1,137 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
# vim: sw=2 ts=2
|
3
|
+
|
4
|
+
module Qiniu
|
5
|
+
module HTTP
|
6
|
+
|
7
|
+
class << self
|
8
|
+
public
|
9
|
+
def is_response_ok?(http_code)
|
10
|
+
return 200 <= http_code && http_code <= 299
|
11
|
+
end # is_response_ok?
|
12
|
+
|
13
|
+
def generate_query_string(params)
|
14
|
+
if params.is_a?(Hash)
|
15
|
+
total_param = params.map { |key, value| %Q(#{CGI.escape(key.to_s)}=#{CGI.escape(value.to_s).gsub('+', '%20')}) }
|
16
|
+
return total_param.join("&")
|
17
|
+
end
|
18
|
+
|
19
|
+
return params
|
20
|
+
end # generate_query_string
|
21
|
+
|
22
|
+
def get (url, opts = {})
|
23
|
+
### 配置请求Header
|
24
|
+
req_headers = {
|
25
|
+
:connection => 'close',
|
26
|
+
:accept => '*/*',
|
27
|
+
:user_agent => Config.settings[:user_agent]
|
28
|
+
}
|
29
|
+
|
30
|
+
# 优先使用外部Header,覆盖任何特定Header
|
31
|
+
if opts[:headers].is_a?(Hash) then
|
32
|
+
req_headers.merge!(opts[:headers])
|
33
|
+
end
|
34
|
+
|
35
|
+
### 发送请求
|
36
|
+
response = RestClient.get(url, req_headers)
|
37
|
+
return response.code.to_i, response.body, response.raw_headers
|
38
|
+
rescue => e
|
39
|
+
Log.logger.warn "#{e.message} => Qiniu::HTTP.get('#{url}')"
|
40
|
+
if e.respond_to?(:response) && e.response.respond_to?(:code) then
|
41
|
+
return e.response.code, e.response.body, e.response.raw_headers
|
42
|
+
end
|
43
|
+
return nil, nil, nil
|
44
|
+
end # get
|
45
|
+
|
46
|
+
API_RESULT_MIMETYPE = 'application/json'
|
47
|
+
|
48
|
+
def api_get (url, opts = {})
|
49
|
+
### 配置请求Header
|
50
|
+
headers = {
|
51
|
+
:accept => API_RESULT_MIMETYPE
|
52
|
+
}
|
53
|
+
|
54
|
+
# 将特定Header混入外部Header中
|
55
|
+
if opts[:headers].is_a?(Hash) then
|
56
|
+
opts[:headers] = opts[:headers].dup.merge!(headers)
|
57
|
+
else
|
58
|
+
opts[:headers] = headers
|
59
|
+
end
|
60
|
+
|
61
|
+
### 发送请求,然后转换返回值
|
62
|
+
resp_code, resp_body, resp_headers = get(url, opts)
|
63
|
+
if resp_code.nil? then
|
64
|
+
return 0, {}, {}
|
65
|
+
end
|
66
|
+
|
67
|
+
content_type = resp_headers["content-type"][0]
|
68
|
+
if !content_type.nil? && content_type == API_RESULT_MIMETYPE then
|
69
|
+
# 如果是JSON格式,则反序列化
|
70
|
+
resp_body = Utils.safe_json_parse(resp_body)
|
71
|
+
end
|
72
|
+
|
73
|
+
return resp_code, resp_body, resp_headers
|
74
|
+
end # api_get
|
75
|
+
|
76
|
+
def post (url, req_body = nil, opts = {})
|
77
|
+
### 配置请求Header
|
78
|
+
req_headers = {
|
79
|
+
:connection => 'close',
|
80
|
+
:accept => '*/*',
|
81
|
+
:user_agent => Config.settings[:user_agent]
|
82
|
+
}
|
83
|
+
|
84
|
+
# 优先使用外部Header,覆盖任何特定Header
|
85
|
+
if opts[:headers].is_a?(Hash) then
|
86
|
+
req_headers.merge!(opts[:headers])
|
87
|
+
end
|
88
|
+
|
89
|
+
### 发送请求
|
90
|
+
response = RestClient.post(url, req_body, req_headers)
|
91
|
+
return response.code.to_i, response.body, response.raw_headers
|
92
|
+
rescue => e
|
93
|
+
Log.logger.warn "#{e.message} => Qiniu::HTTP.post('#{url}')"
|
94
|
+
if e.respond_to?(:response) && e.response.respond_to?(:code) then
|
95
|
+
return e.response.code, e.response.body, e.response.raw_headers
|
96
|
+
end
|
97
|
+
return nil, nil, nil
|
98
|
+
end # post
|
99
|
+
|
100
|
+
def api_post (url, req_body = nil, opts = {})
|
101
|
+
### 配置请求Header
|
102
|
+
headers = {
|
103
|
+
:accept => API_RESULT_MIMETYPE
|
104
|
+
}
|
105
|
+
|
106
|
+
# 将特定Header混入外部Header中
|
107
|
+
if opts[:headers].is_a?(Hash) then
|
108
|
+
opts[:headers] = opts[:headers].dup.merge!(headers)
|
109
|
+
else
|
110
|
+
opts[:headers] = headers
|
111
|
+
end
|
112
|
+
|
113
|
+
### 发送请求,然后转换返回值
|
114
|
+
resp_code, resp_body, resp_headers = post(url, req_body, opts)
|
115
|
+
if resp_code.nil? then
|
116
|
+
return 0, {}, {}
|
117
|
+
end
|
118
|
+
|
119
|
+
content_type = resp_headers["content-type"][0]
|
120
|
+
if !content_type.nil? && content_type == API_RESULT_MIMETYPE then
|
121
|
+
# 如果是JSON格式,则反序列化
|
122
|
+
resp_body = Utils.safe_json_parse(resp_body)
|
123
|
+
end
|
124
|
+
|
125
|
+
return resp_code, resp_body, resp_headers
|
126
|
+
end # api_post
|
127
|
+
|
128
|
+
def management_post (url, body = '')
|
129
|
+
### 授权并执行管理操作
|
130
|
+
return HTTP.api_post(url, body, {
|
131
|
+
:headers => { 'Authorization' => 'QBox ' + Auth.generate_acctoken(url, body) }
|
132
|
+
})
|
133
|
+
end # management_post
|
134
|
+
end # class << self
|
135
|
+
|
136
|
+
end # module HTTP
|
137
|
+
end # module Qiniu
|
data/lib/qiniu/image.rb
CHANGED
@@ -7,11 +7,11 @@ module Qiniu
|
|
7
7
|
include Utils
|
8
8
|
|
9
9
|
def info(url)
|
10
|
-
|
10
|
+
return HTTP.api_get(url + '?imageInfo')
|
11
11
|
end # info
|
12
12
|
|
13
13
|
def exif(url)
|
14
|
-
|
14
|
+
return HTTP.api_get(url + '?exif')
|
15
15
|
end # exif
|
16
16
|
|
17
17
|
def mogrify_preview_url(source_image_url, options)
|
data/lib/qiniu/management.rb
CHANGED
@@ -1,31 +1,38 @@
|
|
1
1
|
# -*- encoding: utf-8 -*-
|
2
|
+
# vim: sw=2 ts=2
|
3
|
+
|
4
|
+
require 'qiniu/http'
|
2
5
|
|
3
6
|
module Qiniu
|
4
7
|
module Storage
|
5
8
|
class << self
|
6
9
|
include Utils
|
7
10
|
|
11
|
+
public
|
8
12
|
def buckets
|
9
|
-
|
13
|
+
url = Config.settings[:rs_host] + '/buckets'
|
14
|
+
return HTTP.management_post(url)
|
10
15
|
end # buckets
|
11
16
|
|
12
17
|
PRIVATE_BUCKET = 0
|
13
18
|
PUBLIC_BUCKET = 1
|
14
19
|
|
15
20
|
def mkbucket(bucket_name, is_public = PUBLIC_BUCKET)
|
16
|
-
|
21
|
+
url = Config.settings[:rs_host] + '/mkbucket2/' + bucket_name + '/public/' + is_public.to_s
|
22
|
+
return HTTP.management_post(url)
|
17
23
|
end # mkbucket
|
18
24
|
|
19
25
|
def make_a_private_bucket(bucket_name)
|
20
|
-
|
26
|
+
return mkbucket(bucket_name, PRIVATE_BUCKET)
|
21
27
|
end # make_a_private_bucket
|
22
28
|
|
23
29
|
def make_a_public_bucket(bucket_name)
|
24
|
-
|
30
|
+
return mkbucket(bucket_name, PUBLIC_BUCKET)
|
25
31
|
end # make_a_public_bucket
|
26
32
|
|
27
33
|
def stat(bucket, key)
|
28
|
-
|
34
|
+
url = Config.settings[:rs_host] + '/stat/' + encode_entry_uri(bucket, key)
|
35
|
+
return HTTP.management_post(url)
|
29
36
|
end # stat
|
30
37
|
|
31
38
|
def get(bucket, key, save_as = nil, expires_in = nil, version = nil)
|
@@ -33,35 +40,29 @@ module Qiniu
|
|
33
40
|
url += '/base/' + version unless version.nil?
|
34
41
|
url += '/attName/' + Utils.urlsafe_base64_encode(save_as) unless save_as.nil?
|
35
42
|
url += '/expires/' + expires_in.to_s if !expires_in.nil? && expires_in > 0
|
36
|
-
|
43
|
+
return HTTP.management_post(url)
|
37
44
|
end # get
|
38
45
|
|
39
46
|
def copy(source_bucket, source_key, target_bucket, target_key)
|
40
47
|
uri = _generate_cp_or_mv_opstr('copy', source_bucket, source_key, target_bucket, target_key)
|
41
|
-
|
48
|
+
url = Config.settings[:rs_host] + uri
|
49
|
+
return HTTP.management_post(url)
|
42
50
|
end # copy
|
43
51
|
|
44
52
|
def move(source_bucket, source_key, target_bucket, target_key)
|
45
53
|
uri = _generate_cp_or_mv_opstr('move', source_bucket, source_key, target_bucket, target_key)
|
46
|
-
|
54
|
+
url = Config.settings[:rs_host] + uri
|
55
|
+
return HTTP.management_post(url)
|
47
56
|
end # move
|
48
57
|
|
49
58
|
def delete(bucket, key)
|
50
|
-
|
59
|
+
url = Config.settings[:rs_host] + '/delete/' + encode_entry_uri(bucket, key)
|
60
|
+
return HTTP.management_post(url)
|
51
61
|
end # delete
|
52
62
|
|
53
|
-
def publish(domain, bucket)
|
54
|
-
encoded_domain = Utils.urlsafe_base64_encode(domain)
|
55
|
-
Auth.request Config.settings[:rs_host] + "/publish/#{encoded_domain}/from/#{bucket}"
|
56
|
-
end # publish
|
57
|
-
|
58
|
-
def unpublish(domain)
|
59
|
-
encoded_domain = Utils.urlsafe_base64_encode(domain)
|
60
|
-
Auth.request Config.settings[:rs_host] + "/unpublish/#{encoded_domain}"
|
61
|
-
end # unpublish
|
62
|
-
|
63
63
|
def drop(bucket)
|
64
|
-
|
64
|
+
url = Config.settings[:rs_host] + "/drop/#{bucket}"
|
65
|
+
return HTTP.management_post(url)
|
65
66
|
end # drop
|
66
67
|
|
67
68
|
def batch(command, bucket, keys)
|
@@ -70,7 +71,8 @@ module Qiniu
|
|
70
71
|
encoded_uri = encode_entry_uri(bucket, key)
|
71
72
|
execs << "op=/#{command}/#{encoded_uri}"
|
72
73
|
end
|
73
|
-
|
74
|
+
url = Config.settings[:rs_host] + "/batch"
|
75
|
+
return HTTP.management_post(url, execs.join("&"))
|
74
76
|
end # batch
|
75
77
|
|
76
78
|
def batch_get(bucket, keys)
|
@@ -97,7 +99,7 @@ module Qiniu
|
|
97
99
|
encoded_uri = encode_entry_uri(bucket, key)
|
98
100
|
save_as_string = '/save-as/' + encoded_uri
|
99
101
|
new_url = source_url + '?' + op_params_string + save_as_string
|
100
|
-
|
102
|
+
return HTTP.management_post(new_url)
|
101
103
|
end # save_as
|
102
104
|
|
103
105
|
def image_mogrify_save_as(bucket, key, source_image_url, options)
|
@@ -118,7 +120,8 @@ module Qiniu
|
|
118
120
|
op_args.each do |e|
|
119
121
|
execs << 'op=' + _generate_cp_or_mv_opstr(command, e[0], e[1], e[2], e[3]) if e.size == 4
|
120
122
|
end
|
121
|
-
|
123
|
+
url = Config.settings[:rs_host] + "/batch"
|
124
|
+
return HTTP.management_post(url, execs.join("&"))
|
122
125
|
end # _batch_cp_or_mv
|
123
126
|
end
|
124
127
|
end # module Storage
|
data/lib/qiniu/misc.rb
CHANGED
@@ -3,33 +3,31 @@
|
|
3
3
|
module Qiniu
|
4
4
|
module Misc
|
5
5
|
class << self
|
6
|
-
include Utils
|
7
|
-
|
8
6
|
def set_protected(bucket, protected_mode)
|
9
|
-
|
10
|
-
|
11
|
-
end
|
7
|
+
url = Config.settings[:pub_host] + %Q(/accessMode/#{bucket}/mode/#{protected_mode})
|
8
|
+
return HTTP.management_post(url)
|
9
|
+
end # set_protected
|
12
10
|
|
13
11
|
def set_separator(bucket, separator)
|
14
|
-
host = Config.settings[:pub_host]
|
15
12
|
encoded_separator = Utils.urlsafe_base64_encode(separator)
|
16
|
-
|
17
|
-
|
13
|
+
url = Config.settings[:pub_host] + %Q(/separator/#{bucket}/sep/#{encoded_separator})
|
14
|
+
return HTTP.management_post(url)
|
15
|
+
end # set_separator
|
18
16
|
|
19
17
|
def set_style(bucket, name, style)
|
20
|
-
host = Config.settings[:pub_host]
|
21
18
|
encoded_name = Utils.urlsafe_base64_encode(name)
|
22
19
|
encoded_style = Utils.urlsafe_base64_encode(style)
|
23
|
-
|
24
|
-
|
20
|
+
url = Config.settings[:pub_host] + %Q(/style/#{bucket}/name/#{encoded_name}/style/#{encoded_style})
|
21
|
+
return HTTP.management_post(url)
|
22
|
+
end # set_style
|
25
23
|
|
26
24
|
def unset_style(bucket, name)
|
27
|
-
host = Config.settings[:pub_host]
|
28
25
|
encoded_name = Utils.urlsafe_base64_encode(name)
|
29
|
-
|
30
|
-
|
26
|
+
url = Config.settings[:pub_host] + %Q(/unstyle/#{bucket}/name/#{encoded_name})
|
27
|
+
return HTTP.management_post(url)
|
28
|
+
end # unset_style
|
29
|
+
end # class << self
|
31
30
|
|
32
|
-
end
|
33
31
|
end # module Misc
|
34
32
|
end # module Qiniu
|
35
33
|
|
data/lib/qiniu/pfop.rb
ADDED
@@ -0,0 +1,123 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
# vim: sw=2 ts=2
|
3
|
+
|
4
|
+
require 'qiniu/adt'
|
5
|
+
require 'qiniu/http'
|
6
|
+
|
7
|
+
module Qiniu
|
8
|
+
module Fop
|
9
|
+
module Persistance
|
10
|
+
|
11
|
+
class PfopPolicy
|
12
|
+
include ADT::Policy
|
13
|
+
|
14
|
+
private
|
15
|
+
def initialize(bucket,
|
16
|
+
key,
|
17
|
+
fops,
|
18
|
+
notify_url)
|
19
|
+
@bucket = bucket
|
20
|
+
@key = key
|
21
|
+
@notify_url = notify_url
|
22
|
+
|
23
|
+
self.fops!(fops)
|
24
|
+
end # initialize
|
25
|
+
|
26
|
+
public
|
27
|
+
PARAMS = {
|
28
|
+
# 字符串类型参数
|
29
|
+
:bucket => "bucket",
|
30
|
+
:key => "key",
|
31
|
+
:fops => "fops",
|
32
|
+
:notify_url => "notifyURL",
|
33
|
+
|
34
|
+
# 数值类型参数
|
35
|
+
:force => "force"
|
36
|
+
} # PARAMS
|
37
|
+
|
38
|
+
PARAMS.each_pair do |key, fld|
|
39
|
+
attr_accessor key
|
40
|
+
end
|
41
|
+
|
42
|
+
def params
|
43
|
+
return PARAMS
|
44
|
+
end # params
|
45
|
+
|
46
|
+
def fops! (fops)
|
47
|
+
if fops.is_a?(Hash) then
|
48
|
+
fops = fops.values
|
49
|
+
end
|
50
|
+
|
51
|
+
if fops.is_a?(Array) then
|
52
|
+
new_fops = []
|
53
|
+
fops.each do |v|
|
54
|
+
if v.is_a?(ApiSpecification) then
|
55
|
+
new_fops.push(v.to_s)
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
@fops = new_fops.join(";")
|
60
|
+
else
|
61
|
+
@fops = fops.to_s
|
62
|
+
end
|
63
|
+
end # fops!
|
64
|
+
|
65
|
+
def force!
|
66
|
+
@force = 1
|
67
|
+
end # force!
|
68
|
+
|
69
|
+
alias :to_s :to_json
|
70
|
+
end # class PfopPolicy
|
71
|
+
|
72
|
+
class << self
|
73
|
+
|
74
|
+
API_HOST = 'http://api.qiniu.com'
|
75
|
+
|
76
|
+
PFOP_URL = API_HOST + '/pfop/'
|
77
|
+
|
78
|
+
def pfop (args)
|
79
|
+
### 生成fop指令串
|
80
|
+
if args.is_a?(PfopPolicy) then
|
81
|
+
# PfopPolicy的各个字段按固定顺序组织
|
82
|
+
body = args.to_query_string()
|
83
|
+
elsif args.is_a?(Hash) then
|
84
|
+
# 无法保证固定字段顺序
|
85
|
+
body = HTTP.generate_query_string(args)
|
86
|
+
else
|
87
|
+
# 由调用者保证固定字段顺序
|
88
|
+
body = args.to_s
|
89
|
+
end
|
90
|
+
|
91
|
+
### 发送请求
|
92
|
+
return HTTP.management_post(PFOP_URL, body)
|
93
|
+
end # pfop
|
94
|
+
|
95
|
+
PREFOP_URL = API_HOST + '/status/get/prefop?id='
|
96
|
+
|
97
|
+
def prefop (persistent_id)
|
98
|
+
### 抽取persistentId
|
99
|
+
if persistent_id.is_a?(Hash) then
|
100
|
+
pid = persistent_id['persistentId']
|
101
|
+
else
|
102
|
+
pid = persistent_id.to_s
|
103
|
+
end
|
104
|
+
|
105
|
+
### 发送请求
|
106
|
+
url = PREFOP_URL + pid
|
107
|
+
return HTTP.api_get(url)
|
108
|
+
end # prefop
|
109
|
+
|
110
|
+
def generate_p1_url (url, fop)
|
111
|
+
# 如果fop是ApiSpecification,则各字段按固定顺序组织,保证一致性
|
112
|
+
# 否则由调用者保证固定字段顺序
|
113
|
+
fop = CGI.escape(fop.to_s).gsub('+', '%20')
|
114
|
+
|
115
|
+
### 生成url
|
116
|
+
return url + '?p/1/' + fop
|
117
|
+
end # generate_pl_url
|
118
|
+
|
119
|
+
end # class << self
|
120
|
+
|
121
|
+
end # module Persistance
|
122
|
+
end # module Fop
|
123
|
+
end # module Qiniu
|
@@ -97,19 +97,23 @@ module Qiniu
|
|
97
97
|
|
98
98
|
def _call_binary_with_token(uptoken, url, data, content_type = nil, retry_times = 0)
|
99
99
|
options = {
|
100
|
-
:
|
101
|
-
|
102
|
-
|
100
|
+
:headers => {
|
101
|
+
:content_type => 'application/octet-stream',
|
102
|
+
'Authorization' => 'UpToken ' + uptoken
|
103
|
+
}
|
103
104
|
}
|
104
|
-
|
105
|
-
|
106
|
-
|
105
|
+
if !content_type.nil? && !content_type.empty? then
|
106
|
+
options[:headers][:content_type] = content_type
|
107
|
+
end
|
108
|
+
|
109
|
+
code, data, raw_headers = HTTP.api_post(url, data, options)
|
110
|
+
unless HTTP.is_response_ok?(code)
|
107
111
|
retry_times += 1
|
108
112
|
if Config.settings[:auto_reconnect] && retry_times < Config.settings[:max_retry_times]
|
109
113
|
return _call_binary_with_token(uptoken, url, data, options[:content_type], retry_times)
|
110
114
|
end
|
111
115
|
end
|
112
|
-
|
116
|
+
return code, data, raw_headers
|
113
117
|
end # _call_binary_with_token
|
114
118
|
|
115
119
|
def _mkblock(uptoken, block_size, body)
|
@@ -146,9 +150,12 @@ module Qiniu
|
|
146
150
|
if result_length != body_length
|
147
151
|
raise FileSeekReadError.new(fpath, block_index, seek_pos, body_length, result_length)
|
148
152
|
end
|
149
|
-
|
153
|
+
|
154
|
+
code, data, raw_headers = _mkblock(uptoken, block_size, body)
|
155
|
+
Utils.debug "Mkblk : #{code.inspect} #{data.inspect} #{raw_headers.inspect}"
|
156
|
+
|
150
157
|
body_crc32 = Zlib.crc32(body)
|
151
|
-
if
|
158
|
+
if HTTP.is_response_ok?(code) && data["crc32"] == body_crc32
|
152
159
|
progress[:ctx] = data["ctx"]
|
153
160
|
progress[:offset] = body_length
|
154
161
|
progress[:restsize] = block_size - body_length
|
@@ -160,6 +167,7 @@ module Qiniu
|
|
160
167
|
break
|
161
168
|
elsif i == retry_times && data["crc32"] != body_crc32
|
162
169
|
Log.logger.error %Q(Uploading block error. Expected crc32: #{body_crc32}, but got: #{data["crc32"]})
|
170
|
+
return code, data, raw_headers
|
163
171
|
end
|
164
172
|
end
|
165
173
|
elsif progress[:offset] + progress[:restsize] != block_size
|
@@ -177,9 +185,12 @@ module Qiniu
|
|
177
185
|
if result_length != body_length
|
178
186
|
raise FileSeekReadError.new(fpath, block_index, seek_pos, body_length, result_length)
|
179
187
|
end
|
180
|
-
|
188
|
+
|
189
|
+
code, data, raw_headers = _putblock(progress[:host], uptoken, progress[:ctx], progress[:offset], body)
|
190
|
+
Utils.debug "Bput : #{code.inspect} #{data.inspect} #{raw_headers.inspect}"
|
191
|
+
|
181
192
|
body_crc32 = Zlib.crc32(body)
|
182
|
-
if
|
193
|
+
if HTTP.is_response_ok?(code) && data["crc32"] == body_crc32
|
183
194
|
progress[:ctx] = data["ctx"]
|
184
195
|
progress[:offset] += body_length
|
185
196
|
progress[:restsize] -= body_length
|
@@ -191,11 +202,12 @@ module Qiniu
|
|
191
202
|
break
|
192
203
|
elsif i == retry_times && data["crc32"] != body_crc32
|
193
204
|
Log.logger.error %Q(Uploading block error. Expected crc32: #{body_crc32}, but got: #{data["crc32"]})
|
205
|
+
return code, data, raw_headers
|
194
206
|
end
|
195
207
|
end
|
196
208
|
end
|
197
209
|
# return
|
198
|
-
return
|
210
|
+
return code, data, raw_headers
|
199
211
|
end # _resumable_put_block
|
200
212
|
|
201
213
|
def _block_count(fsize)
|
@@ -228,7 +240,7 @@ module Qiniu
|
|
228
240
|
#code, data = _resumable_put_block(uptoken, fh, block_index, block_size, Config.settings[:chunk_size], progresses[block_index], Config.settings[:max_retry_times], chunk_notifier)
|
229
241
|
# Put the whole block as a chunk
|
230
242
|
code, data = _resumable_put_block(uptoken, fh, block_index, block_size, block_size, progresses[block_index], Config.settings[:max_retry_times], chunk_notifier)
|
231
|
-
if
|
243
|
+
if HTTP.is_response_ok?(code)
|
232
244
|
#checksums[block_index] = data["checksum"]
|
233
245
|
checksums[block_index] = data["ctx"]
|
234
246
|
if !block_notifier.nil? && block_notifier.respond_to?("notify")
|
@@ -254,7 +266,7 @@ module Qiniu
|
|
254
266
|
path += '/mimeType/' + Utils.urlsafe_base64_encode(mime_type) if !mime_type.nil? && !mime_type.empty?
|
255
267
|
path += '/meta/' + Utils.urlsafe_base64_encode(custom_meta) if !custom_meta.nil? && !custom_meta.empty?
|
256
268
|
path += '/customer/' + customer if !customer.nil? && !customer.empty?
|
257
|
-
callback_query_string =
|
269
|
+
callback_query_string = HTTP.generate_query_string(callback_params) if !callback_params.nil? && !callback_params.empty?
|
258
270
|
path += '/params/' + Utils.urlsafe_base64_encode(callback_query_string) if !callback_query_string.nil? && !callback_query_string.empty?
|
259
271
|
path += '/rotate/' + rotate if !rotate.nil? && rotate.to_i >= 0
|
260
272
|
url = uphost + path
|
@@ -287,19 +299,20 @@ module Qiniu
|
|
287
299
|
checksums = []
|
288
300
|
block_count.times{checksums << ''}
|
289
301
|
|
290
|
-
code, data = _resumable_put(uptoken, fh, checksums, progresses, block_notifier, chunk_notifier)
|
302
|
+
code, data, raw_headers = _resumable_put(uptoken, fh, checksums, progresses, block_notifier, chunk_notifier)
|
291
303
|
|
292
|
-
if
|
304
|
+
if HTTP.is_response_ok?(code)
|
293
305
|
uphost = data["host"]
|
294
306
|
entry_uri = bucket + ':' + key
|
295
|
-
code, data = _mkfile(uphost, uptoken, entry_uri, fsize, checksums, mime_type, custom_meta, customer, callback_params, rotate)
|
307
|
+
code, data, raw_headers = _mkfile(uphost, uptoken, entry_uri, fsize, checksums, mime_type, custom_meta, customer, callback_params, rotate)
|
308
|
+
Utils.debug "Mkfile : #{code.inspect} #{data.inspect} #{raw_headers.inspect}"
|
296
309
|
end
|
297
310
|
|
298
|
-
if
|
311
|
+
if HTTP.is_response_ok?(code)
|
299
312
|
Utils.debug "File #{fh.path} {size: #{fsize}} successfully uploaded."
|
300
313
|
end
|
301
314
|
|
302
|
-
|
315
|
+
return code, data, raw_headers
|
303
316
|
end # _resumable_upload
|
304
317
|
end # self class
|
305
318
|
end # module Storage
|
@@ -23,7 +23,7 @@ module Qiniu
|
|
23
23
|
signature += '?' + query_string if !query_string.nil? && !query_string.empty?
|
24
24
|
signature += "\n"
|
25
25
|
if @params.is_a?(Hash)
|
26
|
-
params_string =
|
26
|
+
params_string = HTTP.generate_query_string(@params)
|
27
27
|
signature += params_string
|
28
28
|
end
|
29
29
|
signature
|
data/lib/qiniu/upload.rb
CHANGED
@@ -28,10 +28,20 @@ module Qiniu
|
|
28
28
|
if callback_params.nil?
|
29
29
|
callback_params = {:bucket => bucket, :key => key, :mime_type => mime_type}
|
30
30
|
end
|
31
|
-
callback_query_string =
|
31
|
+
callback_query_string = HTTP.generate_query_string(callback_params)
|
32
|
+
|
32
33
|
url = Config.settings[:up_host] + '/upload'
|
34
|
+
post_data = {
|
35
|
+
:params => callback_query_string,
|
36
|
+
:action => action_params,
|
37
|
+
:file => File.new(local_file, 'rb'),
|
38
|
+
:multipart => true
|
39
|
+
}
|
40
|
+
if !uptoken.nil? then
|
41
|
+
post_data[:auth] = uptoken unless uptoken.nil?
|
42
|
+
end
|
33
43
|
|
34
|
-
|
44
|
+
return HTTP.api_post(url, post_data)
|
35
45
|
end # upload_with_token
|
36
46
|
|
37
47
|
def upload_with_token_2(uptoken,
|
@@ -59,7 +69,7 @@ module Qiniu
|
|
59
69
|
end
|
60
70
|
|
61
71
|
### 发送请求
|
62
|
-
|
72
|
+
HTTP.api_post(url, post_data)
|
63
73
|
end # upload_with_token_2
|
64
74
|
|
65
75
|
### 授权举例
|
data/lib/qiniu/utils.rb
CHANGED
@@ -31,20 +31,13 @@ module Qiniu
|
|
31
31
|
{}
|
32
32
|
end
|
33
33
|
|
34
|
-
def is_response_ok?(status_code)
|
35
|
-
status_code/100 == 2
|
36
|
-
end
|
37
|
-
|
38
|
-
def response_error(status_code, errmsg)
|
39
|
-
[status_code, {"error" => errmsg}]
|
40
|
-
end
|
41
|
-
|
42
34
|
def debug(msg)
|
43
35
|
if Config.settings[:enable_debug]
|
44
36
|
Log.logger.debug(msg)
|
45
37
|
end
|
46
38
|
end
|
47
39
|
|
40
|
+
### 已过时,仅作为兼容接口保留
|
48
41
|
def send_request_with url, data = nil, options = {}
|
49
42
|
options[:method] = Config.settings[:method] unless options[:method]
|
50
43
|
options[:content_type] = Config.settings[:content_type] unless options[:content_type]
|
@@ -69,7 +62,7 @@ module Qiniu
|
|
69
62
|
response = RestClient.post(url, data, header_options)
|
70
63
|
end
|
71
64
|
code = response.respond_to?(:code) ? response.code.to_i : 0
|
72
|
-
unless is_response_ok?(code)
|
65
|
+
unless HTTP.is_response_ok?(code)
|
73
66
|
raise RequestFailed.new("Request Failed", response)
|
74
67
|
else
|
75
68
|
data = {}
|
@@ -80,6 +73,7 @@ module Qiniu
|
|
80
73
|
[code, data, raw_headers]
|
81
74
|
end # send_request_with
|
82
75
|
|
76
|
+
### 已过时,仅作为兼容接口保留
|
83
77
|
def http_request url, data = nil, options = {}
|
84
78
|
retry_times = 0
|
85
79
|
begin
|
@@ -107,23 +101,6 @@ module Qiniu
|
|
107
101
|
end
|
108
102
|
end
|
109
103
|
|
110
|
-
def upload_multipart_data(url, filepath, action_string, callback_query_string = '', uptoken = nil)
|
111
|
-
post_data = {
|
112
|
-
:params => callback_query_string,
|
113
|
-
:action => action_string,
|
114
|
-
:file => File.new(filepath, 'rb'),
|
115
|
-
:multipart => true
|
116
|
-
}
|
117
|
-
post_data[:auth] = uptoken unless uptoken.nil?
|
118
|
-
http_request url, post_data
|
119
|
-
end
|
120
|
-
|
121
|
-
def generate_query_string(params)
|
122
|
-
return params if params.is_a?(String)
|
123
|
-
total_param = params.map { |key, value| %Q(#{CGI.escape(key.to_s)}=#{CGI.escape(value.to_s).gsub('+', '%20')}) }
|
124
|
-
total_param.join("&")
|
125
|
-
end
|
126
|
-
|
127
104
|
def crc32checksum(filepath)
|
128
105
|
File.open(filepath, "rb") { |f| Zlib.crc32 f.read }
|
129
106
|
end
|
data/lib/qiniu/version.rb
CHANGED
data/qiniu.gemspec
CHANGED
@@ -3,8 +3,8 @@
|
|
3
3
|
require File.expand_path('../lib/qiniu/version', __FILE__)
|
4
4
|
|
5
5
|
Gem::Specification.new do |gem|
|
6
|
-
gem.authors = ["why404"]
|
7
|
-
gem.email = ["
|
6
|
+
gem.authors = ["why404","BluntBlade"]
|
7
|
+
gem.email = ["sdk@qiniu.com"]
|
8
8
|
gem.description = %q{Qiniu Resource (Cloud) Storage SDK for Ruby. See: http://developer.qiniu.com/docs/v6/sdk/ruby-sdk.html}
|
9
9
|
gem.summary = %q{Qiniu Resource (Cloud) Storage SDK for Ruby}
|
10
10
|
gem.homepage = "https://github.com/qiniu/ruby-sdk"
|
@@ -15,6 +15,7 @@ Gem::Specification.new do |gem|
|
|
15
15
|
gem.name = "qiniu"
|
16
16
|
gem.require_paths = ["lib"]
|
17
17
|
gem.version = Qiniu::Version.to_s
|
18
|
+
gem.license = "MIT"
|
18
19
|
|
19
20
|
# specify any dependencies here; for example:
|
20
21
|
gem.add_development_dependency "rake", ">= 0.9"
|
@@ -0,0 +1,89 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
# vim: sw=2 ts=2
|
3
|
+
|
4
|
+
require 'spec_helper'
|
5
|
+
require 'qiniu/auth'
|
6
|
+
require 'qiniu'
|
7
|
+
require 'qiniu/fop'
|
8
|
+
|
9
|
+
module Qiniu
|
10
|
+
module Fop
|
11
|
+
module Persistance
|
12
|
+
describe Persistance do
|
13
|
+
|
14
|
+
before :all do
|
15
|
+
### 复用RubySDK-Test-Storage空间
|
16
|
+
@bucket = 'RubySDK-Test-Storage'
|
17
|
+
@bucket = make_unique_bucket(@bucket)
|
18
|
+
|
19
|
+
### 尝试创建空间
|
20
|
+
code, data, headers = Qiniu::Storage.make_a_public_bucket(@bucket)
|
21
|
+
puts code.inspect
|
22
|
+
puts data.inspect
|
23
|
+
puts headers.inspect
|
24
|
+
|
25
|
+
pic_fname = "image_logo_for_test.png"
|
26
|
+
@key = make_unique_key_in_bucket(pic_fname)
|
27
|
+
|
28
|
+
local_file = File.expand_path('../' + pic_fname, __FILE__)
|
29
|
+
|
30
|
+
### 检查测试文件存在性
|
31
|
+
code, body, headers = Qiniu::Storage.stat(@bucket, @key)
|
32
|
+
if code == 404 || code == 612 then
|
33
|
+
# 文件不存在,尝试上传
|
34
|
+
pp = Qiniu::Auth.PutPolicy.new(@bucket, @key)
|
35
|
+
code, body, headers = Qiniu::Storage.upload_with_put_policy(
|
36
|
+
pp,
|
37
|
+
local_file
|
38
|
+
)
|
39
|
+
puts "Put a test file for Persistance cases"
|
40
|
+
puts code.inspect
|
41
|
+
puts body.inspect
|
42
|
+
puts header.inspect
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
after :all do
|
47
|
+
### 不删除Bucket以备下次使用
|
48
|
+
end
|
49
|
+
|
50
|
+
context ".pfop" do
|
51
|
+
it "should works" do
|
52
|
+
pp = Persistance::PfopPolicy.new(
|
53
|
+
@bucket,
|
54
|
+
@key,
|
55
|
+
'imageView2/1/w/80/h/80', # fops
|
56
|
+
'www.baidu.com' # notify_url
|
57
|
+
)
|
58
|
+
|
59
|
+
code, data, headers = Qiniu::Fop::Persistance.pfop(pp)
|
60
|
+
code.should == 200
|
61
|
+
puts data.inspect
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
context ".prefop" do
|
66
|
+
it "should works" do
|
67
|
+
code, data, headers = Qiniu::Fop::Persistance.prefop('fakePersistentId')
|
68
|
+
code.should == 612
|
69
|
+
puts code.inspect
|
70
|
+
puts data.inspect
|
71
|
+
puts headers.inspect
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
context ".p1" do
|
76
|
+
it "should works" do
|
77
|
+
url = 'http://fake.qiniudn.com/fake.jpg'
|
78
|
+
fop = 'imageView2/1/w/80/h/80'
|
79
|
+
target_url = "#{url}?p/1/#{CGI.escape(fop).gsub('+', '%20')}"
|
80
|
+
|
81
|
+
p1_url = Qiniu::Fop::Persistance.generate_p1_url(url, fop)
|
82
|
+
p1_url.should == target_url
|
83
|
+
puts p1_url.inspect
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end # module Persistance
|
88
|
+
end # module Fop
|
89
|
+
end # module Qiniu
|
metadata
CHANGED
@@ -1,123 +1,124 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: qiniu
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 6.2.
|
4
|
+
version: 6.2.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- why404
|
8
|
+
- BluntBlade
|
8
9
|
autorequire:
|
9
10
|
bindir: bin
|
10
11
|
cert_chain: []
|
11
|
-
date: 2014-04-
|
12
|
+
date: 2014-04-21 00:00:00.000000000 Z
|
12
13
|
dependencies:
|
13
14
|
- !ruby/object:Gem::Dependency
|
14
15
|
name: rake
|
15
16
|
requirement: !ruby/object:Gem::Requirement
|
16
17
|
requirements:
|
17
|
-
- -
|
18
|
+
- - ">="
|
18
19
|
- !ruby/object:Gem::Version
|
19
20
|
version: '0.9'
|
20
21
|
type: :development
|
21
22
|
prerelease: false
|
22
23
|
version_requirements: !ruby/object:Gem::Requirement
|
23
24
|
requirements:
|
24
|
-
- -
|
25
|
+
- - ">="
|
25
26
|
- !ruby/object:Gem::Version
|
26
27
|
version: '0.9'
|
27
28
|
- !ruby/object:Gem::Dependency
|
28
29
|
name: rspec
|
29
30
|
requirement: !ruby/object:Gem::Requirement
|
30
31
|
requirements:
|
31
|
-
- -
|
32
|
+
- - ">="
|
32
33
|
- !ruby/object:Gem::Version
|
33
34
|
version: '2.11'
|
34
35
|
type: :development
|
35
36
|
prerelease: false
|
36
37
|
version_requirements: !ruby/object:Gem::Requirement
|
37
38
|
requirements:
|
38
|
-
- -
|
39
|
+
- - ">="
|
39
40
|
- !ruby/object:Gem::Version
|
40
41
|
version: '2.11'
|
41
42
|
- !ruby/object:Gem::Dependency
|
42
43
|
name: fakeweb
|
43
44
|
requirement: !ruby/object:Gem::Requirement
|
44
45
|
requirements:
|
45
|
-
- - ~>
|
46
|
+
- - "~>"
|
46
47
|
- !ruby/object:Gem::Version
|
47
48
|
version: '1.3'
|
48
49
|
type: :development
|
49
50
|
prerelease: false
|
50
51
|
version_requirements: !ruby/object:Gem::Requirement
|
51
52
|
requirements:
|
52
|
-
- - ~>
|
53
|
+
- - "~>"
|
53
54
|
- !ruby/object:Gem::Version
|
54
55
|
version: '1.3'
|
55
56
|
- !ruby/object:Gem::Dependency
|
56
57
|
name: json
|
57
58
|
requirement: !ruby/object:Gem::Requirement
|
58
59
|
requirements:
|
59
|
-
- - ~>
|
60
|
+
- - "~>"
|
60
61
|
- !ruby/object:Gem::Version
|
61
62
|
version: '1.7'
|
62
63
|
type: :runtime
|
63
64
|
prerelease: false
|
64
65
|
version_requirements: !ruby/object:Gem::Requirement
|
65
66
|
requirements:
|
66
|
-
- - ~>
|
67
|
+
- - "~>"
|
67
68
|
- !ruby/object:Gem::Version
|
68
69
|
version: '1.7'
|
69
70
|
- !ruby/object:Gem::Dependency
|
70
71
|
name: rest-client
|
71
72
|
requirement: !ruby/object:Gem::Requirement
|
72
73
|
requirements:
|
73
|
-
- - ~>
|
74
|
+
- - "~>"
|
74
75
|
- !ruby/object:Gem::Version
|
75
76
|
version: '1.6'
|
76
77
|
type: :runtime
|
77
78
|
prerelease: false
|
78
79
|
version_requirements: !ruby/object:Gem::Requirement
|
79
80
|
requirements:
|
80
|
-
- - ~>
|
81
|
+
- - "~>"
|
81
82
|
- !ruby/object:Gem::Version
|
82
83
|
version: '1.6'
|
83
84
|
- !ruby/object:Gem::Dependency
|
84
85
|
name: mime-types
|
85
86
|
requirement: !ruby/object:Gem::Requirement
|
86
87
|
requirements:
|
87
|
-
- - ~>
|
88
|
+
- - "~>"
|
88
89
|
- !ruby/object:Gem::Version
|
89
90
|
version: '1.19'
|
90
91
|
type: :runtime
|
91
92
|
prerelease: false
|
92
93
|
version_requirements: !ruby/object:Gem::Requirement
|
93
94
|
requirements:
|
94
|
-
- - ~>
|
95
|
+
- - "~>"
|
95
96
|
- !ruby/object:Gem::Version
|
96
97
|
version: '1.19'
|
97
98
|
- !ruby/object:Gem::Dependency
|
98
99
|
name: ruby-hmac
|
99
100
|
requirement: !ruby/object:Gem::Requirement
|
100
101
|
requirements:
|
101
|
-
- - ~>
|
102
|
+
- - "~>"
|
102
103
|
- !ruby/object:Gem::Version
|
103
104
|
version: '0.4'
|
104
105
|
type: :runtime
|
105
106
|
prerelease: false
|
106
107
|
version_requirements: !ruby/object:Gem::Requirement
|
107
108
|
requirements:
|
108
|
-
- - ~>
|
109
|
+
- - "~>"
|
109
110
|
- !ruby/object:Gem::Version
|
110
111
|
version: '0.4'
|
111
112
|
description: 'Qiniu Resource (Cloud) Storage SDK for Ruby. See: http://developer.qiniu.com/docs/v6/sdk/ruby-sdk.html'
|
112
113
|
email:
|
113
|
-
-
|
114
|
+
- sdk@qiniu.com
|
114
115
|
executables: []
|
115
116
|
extensions: []
|
116
117
|
extra_rdoc_files: []
|
117
118
|
files:
|
118
|
-
- .gitignore
|
119
|
-
- .rspec
|
120
|
-
- .travis.yml
|
119
|
+
- ".gitignore"
|
120
|
+
- ".rspec"
|
121
|
+
- ".travis.yml"
|
121
122
|
- CHANGELOG.md
|
122
123
|
- Gemfile
|
123
124
|
- Gemfile.lock
|
@@ -128,14 +129,17 @@ files:
|
|
128
129
|
- lib/qiniu-rs.rb
|
129
130
|
- lib/qiniu.rb
|
130
131
|
- lib/qiniu/abstract.rb
|
132
|
+
- lib/qiniu/adt.rb
|
131
133
|
- lib/qiniu/auth.rb
|
132
134
|
- lib/qiniu/config.rb
|
133
135
|
- lib/qiniu/exceptions.rb
|
134
136
|
- lib/qiniu/fop.rb
|
137
|
+
- lib/qiniu/http.rb
|
135
138
|
- lib/qiniu/image.rb
|
136
139
|
- lib/qiniu/log.rb
|
137
140
|
- lib/qiniu/management.rb
|
138
141
|
- lib/qiniu/misc.rb
|
142
|
+
- lib/qiniu/pfop.rb
|
139
143
|
- lib/qiniu/resumable_upload.rb
|
140
144
|
- lib/qiniu/storage.rb
|
141
145
|
- lib/qiniu/tokens/access_token.rb
|
@@ -152,6 +156,7 @@ files:
|
|
152
156
|
- spec/qiniu/image_spec.rb
|
153
157
|
- spec/qiniu/management_spec.rb
|
154
158
|
- spec/qiniu/misc_spec.rb
|
159
|
+
- spec/qiniu/pfop_spec.rb
|
155
160
|
- spec/qiniu/qiniu_spec.rb
|
156
161
|
- spec/qiniu/tokens/qbox_token_spec.rb
|
157
162
|
- spec/qiniu/upload_spec.rb
|
@@ -159,7 +164,8 @@ files:
|
|
159
164
|
- spec/qiniu/version_spec.rb
|
160
165
|
- spec/spec_helper.rb
|
161
166
|
homepage: https://github.com/qiniu/ruby-sdk
|
162
|
-
licenses:
|
167
|
+
licenses:
|
168
|
+
- MIT
|
163
169
|
metadata: {}
|
164
170
|
post_install_message:
|
165
171
|
rdoc_options: []
|
@@ -167,17 +173,17 @@ require_paths:
|
|
167
173
|
- lib
|
168
174
|
required_ruby_version: !ruby/object:Gem::Requirement
|
169
175
|
requirements:
|
170
|
-
- -
|
176
|
+
- - ">="
|
171
177
|
- !ruby/object:Gem::Version
|
172
178
|
version: '0'
|
173
179
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
174
180
|
requirements:
|
175
|
-
- -
|
181
|
+
- - ">="
|
176
182
|
- !ruby/object:Gem::Version
|
177
183
|
version: '0'
|
178
184
|
requirements: []
|
179
185
|
rubyforge_project:
|
180
|
-
rubygems_version: 2.
|
186
|
+
rubygems_version: 2.2.2
|
181
187
|
signing_key:
|
182
188
|
specification_version: 4
|
183
189
|
summary: Qiniu Resource (Cloud) Storage SDK for Ruby
|
@@ -188,6 +194,7 @@ test_files:
|
|
188
194
|
- spec/qiniu/image_spec.rb
|
189
195
|
- spec/qiniu/management_spec.rb
|
190
196
|
- spec/qiniu/misc_spec.rb
|
197
|
+
- spec/qiniu/pfop_spec.rb
|
191
198
|
- spec/qiniu/qiniu_spec.rb
|
192
199
|
- spec/qiniu/tokens/qbox_token_spec.rb
|
193
200
|
- spec/qiniu/upload_spec.rb
|