qiniu_jxb_fix 6.4.2

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.
Files changed (50) hide show
  1. data/.gitignore +18 -0
  2. data/.rspec +1 -0
  3. data/.travis.yml +12 -0
  4. data/CHANGELOG.md +146 -0
  5. data/Gemfile +8 -0
  6. data/Gemfile.lock +44 -0
  7. data/LICENSE +22 -0
  8. data/README.md +47 -0
  9. data/Rakefile +21 -0
  10. data/docs/README.md +790 -0
  11. data/lib/qiniu/abstract.rb +22 -0
  12. data/lib/qiniu/adt.rb +46 -0
  13. data/lib/qiniu/auth.rb +255 -0
  14. data/lib/qiniu/config.rb +60 -0
  15. data/lib/qiniu/exceptions.rb +120 -0
  16. data/lib/qiniu/fop.rb +4 -0
  17. data/lib/qiniu/http.rb +137 -0
  18. data/lib/qiniu/image.rb +38 -0
  19. data/lib/qiniu/log.rb +15 -0
  20. data/lib/qiniu/management.rb +166 -0
  21. data/lib/qiniu/misc.rb +35 -0
  22. data/lib/qiniu/pfop.rb +124 -0
  23. data/lib/qiniu/resumable_upload.rb +319 -0
  24. data/lib/qiniu/storage.rb +5 -0
  25. data/lib/qiniu/tokens/access_token.rb +23 -0
  26. data/lib/qiniu/tokens/download_token.rb +36 -0
  27. data/lib/qiniu/tokens/qbox_token.rb +38 -0
  28. data/lib/qiniu/tokens/upload_token.rb +57 -0
  29. data/lib/qiniu/upload.rb +134 -0
  30. data/lib/qiniu/utils.rb +109 -0
  31. data/lib/qiniu/version.rb +17 -0
  32. data/lib/qiniu-rs.rb +2 -0
  33. data/lib/qiniu.rb +209 -0
  34. data/qiniu.gemspec +29 -0
  35. data/rails3/Gemfile +4 -0
  36. data/rails3/qiniu.gemspec +29 -0
  37. data/spec/qiniu/abstract_spec.rb +30 -0
  38. data/spec/qiniu/auth_spec.rb +74 -0
  39. data/spec/qiniu/image_logo_for_test.png +0 -0
  40. data/spec/qiniu/image_spec.rb +80 -0
  41. data/spec/qiniu/management_spec.rb +163 -0
  42. data/spec/qiniu/misc_spec.rb +53 -0
  43. data/spec/qiniu/pfop_spec.rb +80 -0
  44. data/spec/qiniu/qiniu_spec.rb +321 -0
  45. data/spec/qiniu/tokens/qbox_token_spec.rb +29 -0
  46. data/spec/qiniu/upload_spec.rb +301 -0
  47. data/spec/qiniu/utils_spec.rb +49 -0
  48. data/spec/qiniu/version_spec.rb +10 -0
  49. data/spec/spec_helper.rb +19 -0
  50. metadata +222 -0
@@ -0,0 +1,36 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ require 'json'
4
+ require 'qiniu/tokens/access_token'
5
+ require 'qiniu/utils'
6
+ require 'qiniu/helper'
7
+
8
+ ### DownloadToken 类已经过时,请改用 Qiniu::Auth.authorize_download_url 方法 ###
9
+ ### 或 Qiniu::Auth.authorize_download_url_2 方法 ###
10
+
11
+ module Qiniu
12
+ class DownloadToken < AccessToken
13
+ include Helper
14
+
15
+ include Utils
16
+
17
+ attr_accessor :pattern, :expires_in
18
+
19
+ def initialize(opts = {})
20
+ @pattern = opts[:pattern]
21
+ @expires_in = opts[:expires_in] || 3600
22
+ end
23
+
24
+ def generate_signature
25
+ params = {"S" => @pattern, "E" => get_expire_time.to_i + @expires_in}
26
+ Utils.urlsafe_base64_encode(params.to_json)
27
+ end
28
+
29
+ def generate_token
30
+ signature = generate_signature
31
+ encoded_digest = generate_encoded_digest(signature)
32
+ %Q(#{@access_key}:#{encoded_digest}:#{signature})
33
+ end
34
+
35
+ end # moidule DownloadToken
36
+ end # module Qiniu
@@ -0,0 +1,38 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ require 'cgi'
4
+ require 'json'
5
+ require 'qiniu/tokens/access_token'
6
+
7
+ module Qiniu
8
+ class QboxToken < AccessToken
9
+
10
+ include Utils
11
+
12
+ attr_accessor :url, :params
13
+
14
+ def initialize(opts = {})
15
+ @url = opts[:url]
16
+ @params = opts[:params]
17
+ end
18
+
19
+ def generate_signature
20
+ uri = URI.parse(@url)
21
+ signature = uri.path
22
+ query_string = uri.query
23
+ signature += '?' + query_string if !query_string.nil? && !query_string.empty?
24
+ signature += "\n"
25
+ if @params.is_a?(Hash)
26
+ params_string = HTTP.generate_query_string(@params)
27
+ signature += params_string
28
+ end
29
+ signature
30
+ end
31
+
32
+ def generate_token
33
+ encoded_digest = generate_encoded_digest(generate_signature)
34
+ %Q(#{@access_key}:#{encoded_digest})
35
+ end
36
+
37
+ end # module QboxToken
38
+ end # module Qiniu
@@ -0,0 +1,57 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ require 'json'
4
+ require 'qiniu/tokens/access_token'
5
+ require 'qiniu/utils'
6
+ require 'qiniu/helper'
7
+
8
+ ### UploadToken 类已经过时,请改用 Qiniu::Auth.generate_uptoken 方法 ###
9
+
10
+ module Qiniu
11
+ class UploadToken < AccessToken
12
+
13
+ include Helper
14
+ include Utils
15
+
16
+ attr_accessor :scope, :expires_in, :callback_url, :callback_body, :callback_body_type, :customer, :escape, :async_options, :return_body, :return_url
17
+
18
+ def initialize(opts = {})
19
+ @scope = opts[:scope]
20
+ @expires_in = opts[:expires_in] || 3600
21
+ @callback_url = opts[:callback_url]
22
+ @callback_body = opts[:callback_body]
23
+ @callback_body_type = opts[:callback_body_type]
24
+ @customer = opts[:customer]
25
+ @escape = opts[:escape]
26
+ @persistent_ops = opts[:persistent_ops]
27
+ @persistent_notify_url = opts[:persistent_notify_url]
28
+ @persistent_pipeline = opts[:persistent_pipeline]
29
+ @return_body = opts[:return_body]
30
+ @return_url = opts[:return_url]
31
+ end
32
+
33
+ def generate_signature
34
+ params = {:scope => @scope, :deadline => get_expire_time.to_i + @expires_in}
35
+ params[:callbackUrl] = @callback_url if !@callback_url.nil? && !@callback_url.empty?
36
+ params[:callbackBody] = @callback_body if !@callback_body.nil? && !@callback_body.empty?
37
+ params[:callbackBodyType] = @callback_body_type if !@callback_body_type.nil? && !@callback_body_type.empty?
38
+ params[:customer] = @customer if !@customer.nil? && !@customer.empty?
39
+ params[:escape] = 1 if @escape == 1 || @escape == true
40
+ params[:returnBody] = @return_body if !@return_body.nil? && !@return_body.empty?
41
+ params[:returnUrl] = @return_url if !@return_url.nil? && !@return_url.empty?
42
+
43
+ params[:persistentOps] = @persistent_ops if !@persistent_ops.nil? && !@persistent_ops.empty?
44
+ params[:persistentNotifyUrl] = @persistent_notify_url if !@persistent_notify_url.nil? && !@persistent_notify_url.empty?
45
+ params[:persistentPipeline] = @persistent_pipeline if !@persistent_pipeline.nil? && !@persistent_pipeline.empty?
46
+
47
+ Utils.urlsafe_base64_encode(params.to_json)
48
+ end
49
+
50
+ def generate_token
51
+ signature = generate_signature
52
+ encoded_digest = generate_encoded_digest(signature)
53
+ %Q(#{@access_key}:#{encoded_digest}:#{signature})
54
+ end
55
+
56
+ end # module UploadToken
57
+ end # module Qiniu
@@ -0,0 +1,134 @@
1
+ # -*- encoding: utf-8 -*-
2
+ # vim: sw=2 ts=2
3
+
4
+ module Qiniu
5
+ module Storage
6
+ class << self
7
+ include Utils
8
+
9
+ def upload_with_token(uptoken,
10
+ local_file,
11
+ bucket,
12
+ key = nil,
13
+ mime_type = nil,
14
+ custom_meta = nil,
15
+ callback_params = nil,
16
+ enable_crc32_check = false,
17
+ rotate = nil)
18
+ action_params = _generate_action_params(
19
+ local_file,
20
+ bucket,
21
+ key,
22
+ mime_type,
23
+ custom_meta,
24
+ enable_crc32_check,
25
+ rotate
26
+ )
27
+
28
+ if callback_params.nil?
29
+ callback_params = {:bucket => bucket, :key => key, :mime_type => mime_type}
30
+ end
31
+ callback_query_string = HTTP.generate_query_string(callback_params)
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
43
+
44
+ return HTTP.api_post(url, post_data)
45
+ end # upload_with_token
46
+
47
+ def upload_with_token_2(uptoken,
48
+ local_file,
49
+ key = nil,
50
+ x_vars = nil,
51
+ opts = {})
52
+ ### 构造URL
53
+ url = Config.settings[:up_host]
54
+ url[/\/*$/] = ''
55
+ url += '/'
56
+
57
+ ### 构造HTTP Body
58
+ file = File.new(local_file, 'rb')
59
+ if not opts[:content_type].nil?
60
+ file.define_singleton_method("content_type") do
61
+ opts[:content_type]
62
+ end
63
+ end
64
+
65
+ post_data = {
66
+ :file => file,
67
+ :multipart => true,
68
+ }
69
+ if not uptoken.nil?
70
+ post_data[:token] = uptoken
71
+ end
72
+ if not key.nil?
73
+ post_data[:key] = key
74
+ end
75
+ if x_vars.is_a?(Hash)
76
+ post_data.merge!(x_vars)
77
+ end
78
+
79
+ ### 发送请求
80
+ HTTP.api_post(url, post_data)
81
+ end # upload_with_token_2
82
+
83
+ ### 授权举例
84
+ # put_policy.bucket | put_policy.key | key | 语义 | 授权
85
+ # :---------------- | :------------- | :------ | :--- | :---
86
+ # trivial_bucket | <nil> | <nil> | 新增 | 允许,最终key为1)使用put_policy.save_key生成的值或2)资源内容的Hash值
87
+ # trivial_bucket | <nil> | foo.txt | 新增 | 允许
88
+ # trivial_bucket | <nil> | bar.jpg | 新增 | 允许
89
+ # trivial_bucket | foo.txt | <nil> | 覆盖 | 允许,由SDK将put_policy.key赋值给key实现
90
+ # trivial_bucket | foo.txt | foo.txt | 覆盖 | 允许
91
+ # trivial_bucket | foo.txt | bar.jpg | 覆盖 | 禁止,put_policy.key与key不一致
92
+ def upload_with_put_policy(put_policy,
93
+ local_file,
94
+ key = nil,
95
+ x_vars = nil,
96
+ opts = {})
97
+ uptoken = Auth.generate_uptoken(put_policy)
98
+ if key.nil? then
99
+ key = put_policy.key
100
+ end
101
+
102
+ return upload_with_token_2(uptoken, local_file, key, x_vars, opts)
103
+ end # upload_with_put_policy
104
+
105
+ private
106
+ def _generate_action_params(local_file,
107
+ bucket,
108
+ key = nil,
109
+ mime_type = nil,
110
+ custom_meta = nil,
111
+ enable_crc32_check = false,
112
+ rotate = nil)
113
+ raise NoSuchFileError, local_file unless File.exist?(local_file)
114
+
115
+ if key.nil?
116
+ key = Digest::SHA1.hexdigest(local_file + Time.now.to_s)
117
+ end
118
+
119
+ entry_uri = bucket + ':' + key
120
+ if mime_type.nil? || mime_type.empty?
121
+ mime = MIME::Types.type_for local_file
122
+ mime_type = mime.empty? ? 'application/octet-stream' : mime[0].content_type
123
+ end
124
+
125
+ action_params = '/rs-put/' + Utils.urlsafe_base64_encode(entry_uri) + '/mimeType/' + Utils.urlsafe_base64_encode(mime_type)
126
+ action_params += '/meta/' + Utils.urlsafe_base64_encode(custom_meta) unless custom_meta.nil?
127
+ action_params += '/crc32/' + Utils.crc32checksum(local_file).to_s if enable_crc32_check
128
+ action_params += '/rotate/' + rotate if !rotate.nil? && rotate.to_i >= 0
129
+ action_params
130
+ end # _generate_action_params
131
+
132
+ end # class << self
133
+ end # module Storage
134
+ end # module Qiniu
@@ -0,0 +1,109 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ require 'uri'
4
+ require 'cgi'
5
+ require 'json'
6
+ require 'zlib'
7
+ require 'base64'
8
+ require 'rest_client'
9
+ require 'hmac-sha1'
10
+ require 'qiniu/exceptions'
11
+
12
+ module Qiniu
13
+ module Utils extend self
14
+
15
+ def urlsafe_base64_encode content
16
+ Base64.encode64(content).strip.gsub('+', '-').gsub('/','_').gsub(/\r?\n/, '')
17
+ end
18
+
19
+ def urlsafe_base64_decode encoded_content
20
+ Base64.decode64 encoded_content.gsub('_','/').gsub('-', '+')
21
+ end
22
+
23
+ def encode_entry_uri(bucket, key)
24
+ entry_uri = bucket + ':' + key
25
+ urlsafe_base64_encode(entry_uri)
26
+ end
27
+
28
+ def safe_json_parse(data)
29
+ JSON.parse(data)
30
+ rescue JSON::ParserError
31
+ {}
32
+ end
33
+
34
+ def debug(msg)
35
+ if Config.settings[:enable_debug]
36
+ Log.logger.debug(msg)
37
+ end
38
+ end
39
+
40
+ ### 已过时,仅作为兼容接口保留
41
+ def send_request_with url, data = nil, options = {}
42
+ options[:method] = Config.settings[:method] unless options[:method]
43
+ options[:content_type] = Config.settings[:content_type] unless options[:content_type]
44
+ header_options = {
45
+ :accept => :json,
46
+ :user_agent => Config.settings[:user_agent]
47
+ }
48
+ auth_token = nil
49
+ if !options[:qbox_signature_token].nil? && !options[:qbox_signature_token].empty?
50
+ auth_token = 'QBox ' + options[:qbox_signature_token]
51
+ elsif !options[:upload_signature_token].nil? && !options[:upload_signature_token].empty?
52
+ auth_token = 'UpToken ' + options[:upload_signature_token]
53
+ elsif options[:access_token]
54
+ auth_token = 'Bearer ' + options[:access_token]
55
+ end
56
+ header_options.merge!('Authorization' => auth_token) unless auth_token.nil?
57
+ case options[:method]
58
+ when :get
59
+ response = RestClient.get(url, header_options)
60
+ when :post
61
+ header_options.merge!(:content_type => options[:content_type])
62
+ response = RestClient.post(url, data, header_options)
63
+ end
64
+ code = response.respond_to?(:code) ? response.code.to_i : 0
65
+ unless HTTP.is_response_ok?(code)
66
+ raise RequestFailed.new("Request Failed", response)
67
+ else
68
+ data = {}
69
+ body = response.respond_to?(:body) ? response.body : {}
70
+ raw_headers = response.respond_to?(:raw_headers) ? response.raw_headers : {}
71
+ data = safe_json_parse(body) unless body.empty?
72
+ end
73
+ [code, data, raw_headers]
74
+ end # send_request_with
75
+
76
+ ### 已过时,仅作为兼容接口保留
77
+ def http_request url, data = nil, options = {}
78
+ retry_times = 0
79
+ begin
80
+ retry_times += 1
81
+ send_request_with url, data, options
82
+ rescue Errno::ECONNRESET => err
83
+ if Config.settings[:auto_reconnect] && retry_times < Config.settings[:max_retry_times]
84
+ retry
85
+ else
86
+ Log.logger.error err
87
+ end
88
+ rescue => e
89
+ Log.logger.warn "#{e.message} => Utils.http_request('#{url}')"
90
+ code = 0
91
+ data = {}
92
+ body = {}
93
+ if e.respond_to? :response
94
+ res = e.response
95
+ code = res.code.to_i if res.respond_to? :code
96
+ body = res.respond_to?(:body) ? res.body : ""
97
+ raw_headers = res.respond_to?(:raw_headers) ? res.raw_headers : {}
98
+ data = safe_json_parse(body) unless body.empty?
99
+ end
100
+ [code, data, raw_headers]
101
+ end
102
+ end
103
+
104
+ def crc32checksum(filepath)
105
+ File.open(filepath, "rb") { |f| Zlib.crc32 f.read }
106
+ end
107
+
108
+ end # module Utils
109
+ end # module Qiniu
@@ -0,0 +1,17 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ module Qiniu
4
+ module Version
5
+ MAJOR = 6
6
+ MINOR = 4
7
+ PATCH = 2
8
+ # Returns a version string by joining <tt>MAJOR</tt>, <tt>MINOR</tt>, and <tt>PATCH</tt> with <tt>'.'</tt>
9
+ #
10
+ # Example
11
+ #
12
+ # Version.to_s # '1.0.2'
13
+ def self.to_s
14
+ [MAJOR, MINOR, PATCH].join('.')
15
+ end
16
+ end # Version
17
+ end # module Qiniu
data/lib/qiniu-rs.rb ADDED
@@ -0,0 +1,2 @@
1
+ # More logical way to require 'qiniu-rs'
2
+ require File.join(File.dirname(__FILE__), 'qiniu', 'qiniu')
data/lib/qiniu.rb ADDED
@@ -0,0 +1,209 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ module Qiniu
4
+ autoload :Version, 'qiniu/version'
5
+ autoload :Utils, 'qiniu/utils'
6
+ autoload :Auth, 'qiniu/auth'
7
+ autoload :Config, 'qiniu/config'
8
+ autoload :Log, 'qiniu/log'
9
+ autoload :Exception, 'qiniu/exceptions'
10
+ autoload :AccessToken, 'qiniu/tokens/access_token'
11
+ autoload :QboxToken, 'qiniu/tokens/qbox_token'
12
+ autoload :UploadToken, 'qiniu/tokens/upload_token'
13
+ autoload :DownloadToken, 'qiniu/tokens/download_token'
14
+ autoload :Abstract, 'qiniu/abstract'
15
+ autoload :Storage, 'qiniu/storage'
16
+ autoload :Fop, 'qiniu/fop'
17
+ autoload :Misc, 'qiniu/misc'
18
+
19
+ class << self
20
+
21
+ StatusOK = 200
22
+
23
+ def establish_connection!(opts = {})
24
+ Config.initialize_connect opts
25
+ end
26
+
27
+ def mkbucket(bucket_name)
28
+ code, data = Storage.mkbucket(bucket_name)
29
+ code == StatusOK
30
+ end
31
+
32
+ def buckets
33
+ code, data = Storage.buckets
34
+ code == StatusOK ? data : false
35
+ end
36
+
37
+ def set_protected(bucket, protected_mode)
38
+ code, data = Misc.set_protected(bucket, protected_mode)
39
+ code == StatusOK
40
+ end
41
+
42
+ def set_separator(bucket, separator)
43
+ code, data = Misc.set_separator(bucket, separator)
44
+ code == StatusOK
45
+ end
46
+
47
+ def set_style(bucket, name, style)
48
+ code, data = Misc.set_style(bucket, name, style)
49
+ code == StatusOK
50
+ end
51
+
52
+ def unset_style(bucket, name)
53
+ code, data = Misc.unset_style(bucket, name)
54
+ code == StatusOK
55
+ end
56
+
57
+ def upload_file opts = {}
58
+ uncontained_opts = [:uptoken, :file, :bucket, :key] - opts.keys
59
+ raise MissingArgsError, uncontained_opts unless uncontained_opts.empty?
60
+
61
+ source_file = opts[:file]
62
+ raise NoSuchFileError, source_file unless File.exist?(source_file)
63
+
64
+ opts[:enable_resumable_upload] = true unless opts.has_key?(:enable_resumable_upload)
65
+
66
+ if opts[:enable_resumable_upload] && File::size(source_file) > Config.settings[:block_size]
67
+ code, data, raw_headers = Storage.upload_with_token(opts[:uptoken],
68
+ opts[:file],
69
+ opts[:bucket],
70
+ opts[:key],
71
+ opts[:mime_type],
72
+ opts[:note],
73
+ opts[:customer],
74
+ opts[:callback_params],
75
+ opts[:rotate])
76
+ else
77
+ code, data, raw_headers = Storage.upload_with_token(opts[:uptoken],
78
+ opts[:file],
79
+ opts[:bucket],
80
+ opts[:key],
81
+ opts[:mime_type],
82
+ opts[:note],
83
+ opts[:callback_params],
84
+ opts[:enable_crc32_check],
85
+ opts[:rotate])
86
+ end
87
+ raise UploadFailedError.new(code, data) if code != StatusOK
88
+ return data
89
+ end
90
+
91
+ def stat(bucket, key)
92
+ code, data = Storage.stat(bucket, key)
93
+ code == StatusOK ? data : false
94
+ end
95
+
96
+ def get(bucket, key, save_as = nil, expires_in = nil, version = nil)
97
+ code, data = Storage.get(bucket, key, save_as, expires_in, version)
98
+ code == StatusOK ? data : false
99
+ end
100
+
101
+ def download(bucket, key, save_as = nil, expires_in = nil, version = nil)
102
+ code, data = Storage.get(bucket, key, save_as, expires_in, version)
103
+ code == StatusOK ? data["url"] : false
104
+ end
105
+
106
+ def copy(source_bucket, source_key, target_bucket, target_key)
107
+ code, data = Storage.copy(source_bucket, source_key, target_bucket, target_key)
108
+ code == StatusOK
109
+ end
110
+
111
+ def move(source_bucket, source_key, target_bucket, target_key)
112
+ code, data = Storage.move(source_bucket, source_key, target_bucket, target_key)
113
+ code == StatusOK
114
+ end
115
+
116
+ def delete(bucket, key)
117
+ code, data = Storage.delete(bucket, key)
118
+ code == StatusOK
119
+ end
120
+
121
+ def batch(command, bucket, keys)
122
+ code, data = Storage.batch(command, bucket, keys)
123
+ code == StatusOK ? data : false
124
+ end
125
+
126
+ def batch_stat(bucket, keys)
127
+ code, data = Storage.batch_stat(bucket, keys)
128
+ code == StatusOK ? data : false
129
+ end
130
+
131
+ def batch_get(bucket, keys)
132
+ code, data = Storage.batch_get(bucket, keys)
133
+ code == StatusOK ? data : false
134
+ end
135
+
136
+ def batch_copy(*args)
137
+ code, data = Storage.batch_copy(args)
138
+ code == StatusOK
139
+ end
140
+
141
+ def batch_move(*args)
142
+ code, data = Storage.batch_move(args)
143
+ code == StatusOK
144
+ end
145
+
146
+ def batch_download(bucket, keys)
147
+ code, data = Storage.batch_get(bucket, keys)
148
+ return false unless code == StatusOK
149
+ links = []
150
+ data.each { |e| links << e["data"]["url"] }
151
+ links
152
+ end
153
+
154
+ def batch_delete(bucket, keys)
155
+ code, data = Storage.batch_delete(bucket, keys)
156
+ code == StatusOK ? data : false
157
+ end
158
+
159
+ def drop(bucket)
160
+ code, data = Storage.drop(bucket)
161
+ code == StatusOK
162
+ end
163
+
164
+ def image_info(url)
165
+ code, data = Fop::Image.info(url)
166
+ code == StatusOK ? data : false
167
+ end
168
+
169
+ def image_exif(url)
170
+ code, data = Fop::Image.exif(url)
171
+ code == StatusOK ? data : false
172
+ end
173
+
174
+ def image_mogrify_preview_url(source_image_url, options)
175
+ Fop::Image.mogrify_preview_url(source_image_url, options)
176
+ end
177
+
178
+ def image_mogrify_save_as(bucket, key, source_image_url, options)
179
+ code, data = Storage.image_mogrify_save_as(bucket, key, source_image_url, options)
180
+ code == StatusOK ? data : false
181
+ end
182
+
183
+ def generate_upload_token(opts = {})
184
+ token_obj = UploadToken.new(opts)
185
+ token_obj.access_key = Config.settings[:access_key]
186
+ token_obj.secret_key = Config.settings[:secret_key]
187
+ #token_obj.scope = opts[:scope]
188
+ #token_obj.expires_in = opts[:expires_in]
189
+ #token_obj.callback_url = opts[:callback_url]
190
+ #token_obj.callback_body_type = opts[:callback_body_type]
191
+ #token_obj.customer = opts[:customer]
192
+ #token_obj.escape = opts[:escape]
193
+ #token_obj.async_options = opts[:async_options]
194
+ #token_obj.return_body = opts[:return_body]
195
+ token_obj.generate_token
196
+ end
197
+
198
+ def generate_download_token(opts = {})
199
+ token_obj = DownloadToken.new(opts)
200
+ token_obj.access_key = Config.settings[:access_key]
201
+ token_obj.secret_key = Config.settings[:secret_key]
202
+ #token_obj.expires_in = opts[:expires_in]
203
+ #token_obj.pattern = opts[:pattern]
204
+ token_obj.generate_token
205
+ end
206
+
207
+ end
208
+
209
+ end # module Qiniu
data/qiniu.gemspec ADDED
@@ -0,0 +1,29 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ require File.expand_path('../lib/qiniu/version', __FILE__)
4
+
5
+ Gem::Specification.new do |gem|
6
+ gem.authors = ["why404","BluntBlade"]
7
+ gem.email = ["sdk@qiniu.com"]
8
+ gem.description = %q{Qiniu Resource (Cloud) Storage SDK for Ruby. See: http://developer.qiniu.com/docs/v6/sdk/ruby-sdk.html}
9
+ gem.summary = %q{Qiniu Resource (Cloud) Storage SDK for Ruby}
10
+ gem.homepage = "https://github.com/qiniu/ruby-sdk"
11
+
12
+ gem.files = `git ls-files`.split($\)
13
+ gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
14
+ gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
15
+ gem.name = "qiniu_jxb_fix"
16
+ gem.require_paths = ["lib"]
17
+ gem.version = Qiniu::Version.to_s
18
+ gem.license = "MIT"
19
+
20
+ # specify any dependencies here; for example:
21
+ gem.add_development_dependency "rake", ">= 0.9"
22
+ gem.add_development_dependency "rspec", ">= 2.11"
23
+ gem.add_development_dependency "fakeweb", "~> 1.3"
24
+ gem.add_runtime_dependency "json", "~> 1.7"
25
+ gem.add_runtime_dependency "rest-client", "~> 1.6"
26
+ gem.add_runtime_dependency "mime-types", "~> 1.19"
27
+ gem.add_runtime_dependency "ruby-hmac", "~> 0.4"
28
+ gem.add_runtime_dependency "jruby-openssl", "~> 0.7" if RUBY_PLATFORM == "java"
29
+ end
data/rails3/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in rails3/qiniu.gemspec
4
+ gemspec :name => 'qiniu'
@@ -0,0 +1,29 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ require File.expand_path('../../lib/qiniu/version', __FILE__)
4
+
5
+ Gem::Specification.new do |gem|
6
+ gem.authors = ["why404","BluntBlade"]
7
+ gem.email = ["sdk@qiniu.com"]
8
+ gem.description = %q{Qiniu Resource (Cloud) Storage SDK for Ruby. See: http://developer.qiniu.com/docs/v6/sdk/ruby-sdk.html}
9
+ gem.summary = %q{Qiniu Resource (Cloud) Storage SDK for Ruby}
10
+ gem.homepage = "https://github.com/qiniu/ruby-sdk"
11
+
12
+ gem.files = `git ls-files`.split($\)
13
+ gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
14
+ gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
15
+ gem.name = "qiniu"
16
+ gem.require_paths = ["lib"]
17
+ gem.version = Qiniu::Version.to_s
18
+ gem.license = "MIT"
19
+
20
+ # specify any dependencies here; for example:
21
+ gem.add_development_dependency "rake", ">= 0.9"
22
+ gem.add_development_dependency "rspec", ">= 2.11"
23
+ gem.add_development_dependency "fakeweb", "~> 1.3"
24
+ gem.add_runtime_dependency "json", "~> 1.8"
25
+ gem.add_runtime_dependency "rest-client", "~> 1.7.3"
26
+ gem.add_runtime_dependency "mime-types", "~> 1.19"
27
+ gem.add_runtime_dependency "ruby-hmac", "~> 0.4"
28
+ gem.add_runtime_dependency "jruby-openssl", "~> 0.7" if RUBY_PLATFORM == "java"
29
+ end