activestorage-aliyun 1.0.0 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 49de212acae6a9c8e99b3ca01602eca84414955eafc1f965b6e1a35fcdbc3241
4
- data.tar.gz: 8923a8b87a36f28d34ccac03369a13d1cb18c9db9da94843437c1ef8d281cb46
3
+ metadata.gz: 8321ccf6fc37943c33a6ac6058a28ecdc1b60830d0669c6cdd05dbb5d562cd79
4
+ data.tar.gz: d72dc8b28b787110497de6c0a774d6bf1488b066412fafe8d6d24782ef3ef638
5
5
  SHA512:
6
- metadata.gz: cf61f0de45f6c8e7ea1e8b495beeab96ef523cb3984075b1b4727adb6dfc3fd8f3b97e8712825640482f8f34f2dc3b5142a9d384bba4d4fec7940f10bf623c98
7
- data.tar.gz: c35ecb00a20b765844b241fd8eda14a9eafab64de1894ba7ec5d4a885b1a188cb985590c5b7460ebe8794dca7ecd4b9df802fa0616f401d4afa3133b51bcad62
6
+ metadata.gz: b5086e941f5f4969b3cfbf5b3b329611090aa388d29dca9ab37478cf8937ccb3d8be0814aea78a6349b0fa7c4fd36e57257b86fb275f280ea01cc8d12aab5a21
7
+ data.tar.gz: 5722b12bd0c4f1b35ec9032ee470ae2dd55baa47f08663d2f7bc88c3870ee6417523f5fefd3bab9893066c6e5b84b8ef23f0a812360c297496d9ec04b133c197
data/CHANGELOG.md CHANGED
@@ -1,3 +1,7 @@
1
+ ## 1.1.0
2
+
3
+ - Add custo_metadata args in service method for Rails 7 supports.
4
+
1
5
  ## 1.0.0
2
6
 
3
7
  - Update for support Rals 6.1 permanent URL, and compatiable with Rails 6.0.
data/README.md CHANGED
@@ -2,16 +2,14 @@
2
2
 
3
3
  Wraps the Aliyun OSS as an Active Storage service, use [Aliyun official Ruby SDK](https://github.com/aliyun/aliyun-oss-ruby-sdk) for upload.
4
4
 
5
-
6
- [![Gem Version](https://badge.fury.io/rb/activestorage-aliyun.svg)](https://badge.fury.io/rb/activestorage-aliyun) [![Build Status](https://travis-ci.org/huacnlee/activestorage-aliyun.svg)](https://travis-ci.org/huacnlee/activestorage-aliyun) [![Code Climate](https://codeclimate.com/github/huacnlee/activestorage-aliyun/badges/gpa.svg)](https://codeclimate.com/github/huacnlee/activestorage-aliyun) [![codecov.io](https://codecov.io/github/huacnlee/activestorage-aliyun/coverage.svg?branch=master)](https://codecov.io/github/huacnlee/activestorage-aliyun?branch=master)
7
-
5
+ [![Gem Version](https://badge.fury.io/rb/activestorage-aliyun.svg)](https://badge.fury.io/rb/activestorage-aliyun) [![build](https://github.com/huacnlee/activestorage-aliyun/workflows/build/badge.svg)](https://github.com/huacnlee/activestorage-aliyun/actions?query=workflow%3Abuild)
8
6
 
9
7
  ## Installation
10
8
 
11
9
  Add this line to your application's Gemfile:
12
10
 
13
11
  ```ruby
14
- gem 'activestorage-aliyun'
12
+ gem "activestorage-aliyun"
15
13
  ```
16
14
 
17
15
  And then execute:
@@ -22,6 +20,9 @@ $ bundle
22
20
 
23
21
  ## Usage
24
22
 
23
+ > NOTE! Current document work for Rails 6.1, if you are using Rails 6.0, please visit: https://github.com/huacnlee/activestorage-aliyun/tree/v0.6.4
24
+ > You can also to use activestorage-aliyun 1.0.0 in Rails 6.0
25
+
25
26
  config/storage.yml
26
27
 
27
28
  ```yml
@@ -56,7 +57,7 @@ aliyun:
56
57
  ```erb
57
58
  Original File URL:
58
59
 
59
- <%= image_tag @photo.image.service_url %>
60
+ <%= image_tag @photo.image.url %>
60
61
  ```
61
62
 
62
63
  Thumb with OSS image service:
@@ -64,7 +65,7 @@ Thumb with OSS image service:
64
65
  ```rb
65
66
  class Photo < ApplicationRecord
66
67
  def image_thumb_url(process)
67
- self.image.service_url(params: { "x-oss-process" => process })
68
+ self.image.url(params: { "x-oss-process" => process })
68
69
  end
69
70
  end
70
71
  ```
@@ -72,7 +73,7 @@ end
72
73
  And then:
73
74
 
74
75
  ```erb
75
- <%= image_tag @photo.image.image_thumb_url("image/resize,h_100,w_100") %>
76
+ <%= image_tag @photo.image_thumb_url("image/resize,h_100,w_100") %>
76
77
  ```
77
78
 
78
79
  ### Use for file download
@@ -81,7 +82,7 @@ If you want to get original filename (Include Chinese and other UTF-8 chars), fo
81
82
 
82
83
  ```erb
83
84
  #
84
- <%= image_tag @photo.image.service_url(disposition: :attachment) %>
85
+ <%= image_tag @photo.image.url(disposition: :attachment) %>
85
86
  ```
86
87
 
87
88
  ## Contributing
@@ -19,10 +19,10 @@ module ActiveStorage
19
19
 
20
20
  CHUNK_SIZE = 1024 * 1024
21
21
 
22
- def upload(key, io, checksum: nil, content_type: nil, disposition: nil, filename: nil)
22
+ def upload(key, io, checksum: nil, content_type: nil, disposition: nil, filename: nil, custom_metadata: {}, **)
23
23
  instrument :upload, key: key, checksum: checksum do
24
24
  content_type ||= Marcel::MimeType.for(io)
25
- bucket.put_object(path_for(key), content_type: content_type) do |stream|
25
+ bucket.put_object(path_for(key), content_type: content_type, metas: custom_metadata) do |stream|
26
26
  stream << io.read(CHUNK_SIZE) until io.eof?
27
27
  end
28
28
  end
@@ -39,7 +39,7 @@ module ActiveStorage
39
39
  bucket.get_object(path_for(key)) do |chunk|
40
40
  chunk_buff << chunk
41
41
  end
42
- chunk_buff.join("")
42
+ chunk_buff.join
43
43
  end
44
44
  end
45
45
  end
@@ -51,7 +51,7 @@ module ActiveStorage
51
51
  bucket.get_object(path_for(key), range: [range.begin, range_end]) do |chunk|
52
52
  chunk_buff << chunk
53
53
  end
54
- chunk_buff.join("")
54
+ chunk_buff.join
55
55
  end
56
56
  end
57
57
 
@@ -65,14 +65,16 @@ module ActiveStorage
65
65
  instrument :delete_prefixed, prefix: prefix do
66
66
  files = bucket.list_objects(prefix: path_for(prefix))
67
67
  return if files.blank?
68
+
68
69
  keys = files.map(&:key)
69
70
  return if keys.blank?
71
+
70
72
  bucket.batch_delete_objects(keys, quiet: true)
71
73
  end
72
74
  end
73
75
 
74
76
  def exist?(key)
75
- instrument :exist, key: key do |payload|
77
+ instrument :exist, key: key do |_payload|
76
78
  bucket.object_exists?(path_for(key))
77
79
  end
78
80
  end
@@ -83,7 +85,7 @@ module ActiveStorage
83
85
  # Source: *.your.host.com
84
86
  # Allowed Methods: POST, PUT, HEAD
85
87
  # Allowed Headers: *
86
- def url_for_direct_upload(key, expires_in:, content_type:, content_length:, checksum:)
88
+ def url_for_direct_upload(key, expires_in:, content_type:, content_length:, checksum:, custom_metadata: {})
87
89
  instrument :url, key: key do |payload|
88
90
  generated_url = bucket.object_url(path_for(key), false)
89
91
  payload[:url] = generated_url
@@ -94,16 +96,21 @@ module ActiveStorage
94
96
  # Headers for Direct Upload
95
97
  # https://help.aliyun.com/document_detail/31951.html
96
98
  # headers["Date"] is required use x-oss-date instead
97
- def headers_for_direct_upload(key, content_type:, checksum:, **)
99
+ def headers_for_direct_upload(key, content_type:, checksum:, custom_metadata: {}, **)
98
100
  date = Time.now.httpdate
99
101
  {
100
102
  "Content-Type" => content_type,
101
103
  "Content-MD5" => checksum,
102
104
  "Authorization" => authorization(key, content_type, checksum, date),
103
105
  "x-oss-date" => date,
106
+ **custom_metadata_headers(custom_metadata)
104
107
  }
105
108
  end
106
109
 
110
+ def custom_metadata_headers(metadata)
111
+ metadata.transform_keys { |key| "x-oss-meta-#{key}" }
112
+ end
113
+
107
114
  # Remove this in Rails 6.1, compatiable with Rails 6.0.0
108
115
  def url(key, **options)
109
116
  instrument :url, key: key do |payload|
@@ -121,91 +128,92 @@ module ActiveStorage
121
128
  end
122
129
 
123
130
  private
124
- attr_reader :config
125
131
 
126
- def private_url(key, expires_in: 60, filename: nil, content_type: nil, disposition: nil, params: {}, **)
127
- filekey = path_for(key)
132
+ attr_reader :config
128
133
 
129
- params["response-content-type"] = content_type unless content_type.blank?
134
+ def private_url(key, expires_in: 60, filename: nil, content_type: nil, disposition: nil, params: {}, **)
135
+ filekey = path_for(key)
130
136
 
131
- if filename
132
- filename = ActiveStorage::Filename.wrap(filename)
133
- params["response-content-disposition"] = content_disposition_with(type: disposition, filename: filename)
134
- end
137
+ params["response-content-type"] = content_type unless content_type.blank?
135
138
 
136
- object_url(filekey, sign: true, expires_in: expires_in, params: params)
139
+ if filename
140
+ filename = ActiveStorage::Filename.wrap(filename)
141
+ params["response-content-disposition"] = content_disposition_with(type: disposition, filename: filename)
137
142
  end
138
143
 
139
- def public_url(key, params: {}, **)
140
- object_url(path_for(key), sign: false, params: params)
141
- end
144
+ object_url(filekey, sign: true, expires_in: expires_in, params: params)
145
+ end
142
146
 
143
- # Remove this in Rails 6.1, compatiable with Rails 6.0.0
144
- def public?
145
- @public == true
146
- end
147
+ def public_url(key, params: {}, **)
148
+ object_url(path_for(key), sign: false, params: params)
149
+ end
147
150
 
148
- def path_for(key)
149
- root_path = config.fetch(:path, nil)
150
- if root_path.blank? || root_path == "/"
151
- full_path = key
152
- else
153
- full_path = File.join(root_path, key)
154
- end
151
+ # Remove this in Rails 6.1, compatiable with Rails 6.0.0
152
+ def public?
153
+ @public == true
154
+ end
155
+
156
+ def path_for(key)
157
+ root_path = config.fetch(:path, nil)
158
+ full_path = if root_path.blank? || root_path == "/"
159
+ key
160
+ else
161
+ File.join(root_path, key)
162
+ end
163
+
164
+ full_path.gsub(%r{^/}, "").gsub(%r{/+}, "/")
165
+ end
155
166
 
156
- full_path.gsub(/^\//, "").gsub(/[\/]+/, "/")
167
+ def object_url(key, sign: false, expires_in: 60, params: {})
168
+ url = bucket.object_url(key, false)
169
+ unless sign
170
+ return url if params.blank?
171
+
172
+ return "#{url}?#{params.to_query}"
157
173
  end
158
174
 
159
- def object_url(key, sign: false, expires_in: 60, params: {})
160
- url = bucket.object_url(key, false)
161
- unless sign
162
- return url if params.blank?
163
- return url + "?" + params.to_query
164
- end
175
+ resource = "/#{bucket.name}/#{key}"
176
+ expires = Time.now.to_i + expires_in
177
+ query = {
178
+ "Expires" => expires,
179
+ "OSSAccessKeyId" => config.fetch(:access_key_id)
180
+ }
181
+ query.merge!(params)
165
182
 
166
- resource = "/#{bucket.name}/#{key}"
167
- expires = Time.now.to_i + expires_in
168
- query = {
169
- "Expires" => expires,
170
- "OSSAccessKeyId" => config.fetch(:access_key_id)
171
- }
172
- query.merge!(params)
183
+ resource += "?" + params.map { |k, v| "#{k}=#{v}" }.sort.join("&") if params.present?
173
184
 
174
- if params.present?
175
- resource += "?" + params.map { |k, v| "#{k}=#{v}" }.sort.join("&")
176
- end
185
+ string_to_sign = ["GET", "", "", expires, resource].join("\n")
186
+ query["Signature"] = bucket.sign(string_to_sign)
177
187
 
178
- string_to_sign = ["GET", "", "", expires, resource].join("\n")
179
- query["Signature"] = bucket.sign(string_to_sign)
188
+ [url, query.to_query].join("?")
189
+ end
180
190
 
181
- [url, query.to_query].join("?")
182
- end
191
+ def bucket
192
+ return @bucket if defined? @bucket
183
193
 
184
- def bucket
185
- return @bucket if defined? @bucket
186
- @bucket = client.get_bucket(config.fetch(:bucket))
187
- @bucket
188
- end
194
+ @bucket = client.get_bucket(config.fetch(:bucket))
195
+ @bucket
196
+ end
189
197
 
190
- def authorization(key, content_type, checksum, date)
191
- filename = File.expand_path("/#{bucket.name}/#{path_for(key)}")
192
- addition_headers = "x-oss-date:#{date}"
193
- sign = ["PUT", checksum, content_type, date, addition_headers, filename].join("\n")
194
- signature = bucket.sign(sign)
195
- "OSS " + config.fetch(:access_key_id) + ":" + signature
196
- end
198
+ def authorization(key, content_type, checksum, date)
199
+ filename = File.expand_path("/#{bucket.name}/#{path_for(key)}")
200
+ addition_headers = "x-oss-date:#{date}"
201
+ sign = ["PUT", checksum, content_type, date, addition_headers, filename].join("\n")
202
+ signature = bucket.sign(sign)
203
+ "OSS #{config.fetch(:access_key_id)}:#{signature}"
204
+ end
197
205
 
198
- def endpoint
199
- config.fetch(:endpoint, "https://oss-cn-hangzhou.aliyuncs.com")
200
- end
206
+ def endpoint
207
+ config.fetch(:endpoint, "https://oss-cn-hangzhou.aliyuncs.com")
208
+ end
201
209
 
202
- def client
203
- @client ||= Aliyun::OSS::Client.new(
204
- endpoint: endpoint,
205
- access_key_id: config.fetch(:access_key_id),
206
- access_key_secret: config.fetch(:access_key_secret),
207
- cname: config.fetch(:cname, false)
208
- )
209
- end
210
+ def client
211
+ @client ||= Aliyun::OSS::Client.new(
212
+ endpoint: endpoint,
213
+ access_key_id: config.fetch(:access_key_id),
214
+ access_key_secret: config.fetch(:access_key_secret),
215
+ cname: config.fetch(:cname, false)
216
+ )
217
+ end
210
218
  end
211
219
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module ActiveStorageAliyun
2
4
  class Railtie < ::Rails::Railtie
3
5
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module ActiveStorageAliyun
4
- VERSION = "1.0.0"
4
+ VERSION = "1.1.0"
5
5
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # require "active_storage_aliyun/railtie"
2
4
 
3
5
  module ActiveStorageAliyun
metadata CHANGED
@@ -1,43 +1,43 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: activestorage-aliyun
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jason Lee
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
  date: 2018-02-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: rails
14
+ name: aliyun-sdk
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
17
  - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: 6.0.0
19
+ version: 0.6.0
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - ">="
25
25
  - !ruby/object:Gem::Version
26
- version: 6.0.0
26
+ version: 0.6.0
27
27
  - !ruby/object:Gem::Dependency
28
- name: aliyun-sdk
28
+ name: rails
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - ">="
32
32
  - !ruby/object:Gem::Version
33
- version: 0.6.0
33
+ version: 6.0.0
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - ">="
39
39
  - !ruby/object:Gem::Version
40
- version: 0.6.0
40
+ version: 6.0.0
41
41
  description: Wraps the Aliyun OSS as an Active Storage service.
42
42
  email: huacnlee@gmail.com
43
43
  executables: []
@@ -54,7 +54,7 @@ homepage: https://github.com/huacnlee/activestorage-aliyun
54
54
  licenses:
55
55
  - MIT
56
56
  metadata: {}
57
- post_install_message:
57
+ post_install_message:
58
58
  rdoc_options: []
59
59
  require_paths:
60
60
  - lib
@@ -62,15 +62,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
62
62
  requirements:
63
63
  - - ">="
64
64
  - !ruby/object:Gem::Version
65
- version: '0'
65
+ version: 2.5.0
66
66
  required_rubygems_version: !ruby/object:Gem::Requirement
67
67
  requirements:
68
68
  - - ">="
69
69
  - !ruby/object:Gem::Version
70
70
  version: '0'
71
71
  requirements: []
72
- rubygems_version: 3.0.3
73
- signing_key:
72
+ rubygems_version: 3.2.3
73
+ signing_key:
74
74
  specification_version: 4
75
75
  summary: Wraps the Aliyun OSS as an Active Storage service
76
76
  test_files: []