fog-aliyun 0.3.8 → 0.3.9

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: 111b9682a34af25b9856551baebc1acaff7a7b41c613d37f65ef47a9d5fd2e96
4
- data.tar.gz: 242585bce56cba8e443a991e44f5b1b7306b61ded43c0b57e8af7a4e48bcd408
3
+ metadata.gz: 1282dc25fa74615eb50ae3d68e2e6a4525712cf12d7b2af1741a18b61b4842da
4
+ data.tar.gz: 07b73a4fcfb1ad04d1bf16d5127153b554633afe7a91aa31a1675533680b1478
5
5
  SHA512:
6
- metadata.gz: fc4e02bae46ba2520af281d5321fe517b4030439239d771eddc89a235052627831ab13768e9784100654d0e6ba883bb6b15de0ddd5234cac446ac38d007f9424
7
- data.tar.gz: df23687c6c0103993eb2bc5c276ce9f5c45ec8ff7c9478e80de1b7faff5d6cf32764c520316854fae4d3404425778a7912703f274216fe2a1671842142822380
6
+ metadata.gz: 0bd08522fda123aa1a0fac945ca83bf09a16ac811594eafb8b3d36d2d4f354298dc8146dfe1c64608dc90a3d1fb55c9bc4c9a1ab647316d63048cda15d6ecb54
7
+ data.tar.gz: 346b5a912c43de55a7ed3067d7fb1bfc3c8e7f216e512eb880aa9eb7c5f144bc32857e786e2346bef2034f7ee0125179497afcf88736e61da4159aec1f9dbf09
@@ -30,6 +30,9 @@ module Fog
30
30
  # If key is a directory(including /), return an existed or a new one;
31
31
  # If key does not contain /, if bucket, return '', else return an existed or a new one directory;
32
32
  def get(key, options = {})
33
+ if key.is_a? Array
34
+ key = key[0]
35
+ end
33
36
  if !key.nil? && key != '' && key != '.'
34
37
  key = key.chomp('/')
35
38
  if key.include? '/'
@@ -37,14 +40,34 @@ module Fog
37
40
  ret = service.head_object(dir, options)
38
41
  new(key: key) if ret.data[:status] == 200
39
42
  else
40
- data = service.get_bucket(key)
41
- if data.class == Hash && data.key?('Code') && !data['Code'].nil? && !data['Code'].empty?
42
- dir = key + '/'
43
- ret = service.head_object(dir, options)
44
- new(key: key) if ret.data[:status] == 200
45
- else
46
- new(key: '')
43
+ remap_attributes(options, {
44
+ :delimiter => 'delimiter',
45
+ :marker => 'marker',
46
+ :max_keys => 'max-keys',
47
+ :prefix => 'prefix'
48
+ })
49
+ data = service.get_bucket(key, options)
50
+ directory = new(:key => data['Name'], :is_persisted => true)
51
+ options = {}
52
+ for k, v in data
53
+ if ['CommonPrefixes', 'Delimiter', 'IsTruncated', 'Marker', 'MaxKeys', 'Prefix'].include?(k)
54
+ # Sometimes, the v will be a Array, like "Name"=>["blobstore-droplet1"], "Prefix"=>[{}], "Marker"=>[{}], "MaxKeys"=>["100"], "Delimiter"=>[{}], "IsTruncated"=>["false"]
55
+ # and there needs to parse them
56
+ if !v.nil? && (v.is_a? Array) && (v.size > 0)
57
+ if v[0].is_a? Hash
58
+ v = nil
59
+ else
60
+ v = v[0]
61
+ end
62
+ end
63
+ options[k] = v
64
+ end
65
+ end
66
+ directory.files.merge_attributes(options)
67
+ if data.key?('Contents') && !data['Contents'].nil?
68
+ directory.files.load(data['Contents'])
47
69
  end
70
+ directory
48
71
  end
49
72
  else
50
73
  new(key: '')
@@ -7,7 +7,7 @@ module Fog
7
7
  module Storage
8
8
  class Aliyun
9
9
  class Directory < Fog::Model
10
- identity :key
10
+ identity :key, :aliases => ['Key', 'Name', 'name']
11
11
 
12
12
  def destroy
13
13
  requires :key
@@ -15,7 +15,6 @@ module Fog
15
15
  ret = service.list_objects(prefix: prefix)['Contents']
16
16
 
17
17
  if ret.nil?
18
- puts ' Not found: Direction not exist!'
19
18
  false
20
19
  elsif ret.size == 1
21
20
  service.delete_container(key)
@@ -48,7 +47,6 @@ module Fog
48
47
  if !key.nil? && key != '' && key != '.' && !(key.include? '/')
49
48
  data = service.get_bucket(key)
50
49
  if data.class == Hash && data.key?('Code') && !data['Code'].nil? && !data['Code'].empty?
51
- puts "[INFO] The key #{key} is not a bucket and create one folder named with it."
52
50
  service.put_container(key)
53
51
  end
54
52
  end
@@ -6,7 +6,7 @@ module Fog
6
6
  module Storage
7
7
  class Aliyun
8
8
  class File < Fog::Model
9
- identity :key, aliases: 'name'
9
+ identity :key, aliases: ['Key', 'Name', 'name']
10
10
  attribute :date, aliases: 'Date'
11
11
  attribute :content_length, aliases: 'Content-Length', type: :integer
12
12
  attribute :content_type, aliases: 'Content-Type'
@@ -35,32 +35,32 @@ module Fog
35
35
 
36
36
  def copy(target_directory_key, target_file_key, options = {})
37
37
  requires :directory, :key
38
- directory_key = collection.check_directory_key(directory.key)
38
+ source_bucket, directory_key = collection.check_directory_key(directory.key)
39
39
  source_object = if directory_key == ''
40
40
  key
41
41
  else
42
42
  directory_key + '/' + key
43
43
  end
44
- target_directory_key = collection.check_directory_key(target_directory_key)
44
+ target_bucket, target_directory_key = collection.check_directory_key(target_directory_key)
45
45
  target_object = if target_directory_key == ''
46
46
  target_file_key
47
47
  else
48
48
  target_directory_key + '/' + target_file_key
49
49
  end
50
- service.copy_object(nil, source_object, nil, target_object, options)
50
+ service.copy_object(source_bucket, source_object, target_bucket, target_object, options)
51
51
  target_directory = service.directories.new(key: target_directory_key)
52
52
  target_directory.files.get(target_file_key)
53
53
  end
54
54
 
55
55
  def destroy
56
56
  requires :directory, :key
57
- directory_key = collection.check_directory_key(directory.key)
57
+ bucket_name, directory_key = collection.check_directory_key(directory.key)
58
58
  object = if directory_key == ''
59
59
  key
60
60
  else
61
61
  directory_key + '/' + key
62
62
  end
63
- service.delete_object(object)
63
+ service.delete_object(object, bucket: bucket_name)
64
64
  true
65
65
  end
66
66
 
@@ -94,13 +94,13 @@ module Fog
94
94
  expires = expires.nil? ? 0 : expires.to_i
95
95
 
96
96
  requires :directory, :key
97
- directory_key = collection.check_directory_key(directory.key)
97
+ bucket_name, directory_key = collection.check_directory_key(directory.key)
98
98
  object = if directory_key == ''
99
99
  key
100
100
  else
101
101
  directory_key + '/' + key
102
102
  end
103
- service.get_object_http_url_public(object, expires, options)
103
+ service.get_object_http_url_public(object, expires, options.merge(bucket: bucket_name))
104
104
  end
105
105
 
106
106
  def public_url
@@ -113,16 +113,16 @@ module Fog
113
113
  options['Content-Type'] = content_type if content_type
114
114
  options['Content-Disposition'] = content_disposition if content_disposition
115
115
  options.merge!(metadata_to_headers)
116
- directory_key = collection.check_directory_key(directory.key)
116
+ bucket_name, directory_key = collection.check_directory_key(directory.key)
117
117
  object = if directory_key == ''
118
118
  key
119
119
  else
120
120
  directory_key + '/' + key
121
121
  end
122
122
  if body.is_a?(::File)
123
- data = service.put_object(object, body, options).data
123
+ data = service.put_object(object, body, options.merge(bucket: bucket_name)).data
124
124
  elsif body.is_a?(String)
125
- data = service.put_object_with_body(object, body, options).data
125
+ data = service.put_object_with_body(object, body, options.merge(bucket: bucket_name)).data
126
126
  else
127
127
  raise Fog::Storage::Aliyun::Error, " Forbidden: Invalid body type: #{body.class}!"
128
128
  end
@@ -172,14 +172,14 @@ module Fog
172
172
 
173
173
  def metadata_attributes
174
174
  if last_modified
175
- directory_key = collection.check_directory_key(directory.key)
175
+ bucket_name, directory_key = collection.check_directory_key(directory.key)
176
176
  object = if directory_key == ''
177
177
  key
178
178
  else
179
179
  directory_key + '/' + key
180
180
  end
181
181
 
182
- data = service.head_object(object).data
182
+ data = service.head_object(object, bucket: bucket_name).data
183
183
  if data[:status] == 200
184
184
  headers = data[:headers]
185
185
  headers.select! { |k, _v| metadata_attribute?(k) }
@@ -9,9 +9,13 @@ module Fog
9
9
  class Files < Fog::Collection
10
10
  attribute :directory
11
11
  attribute :limit
12
- attribute :marker
12
+ attribute :prefix, :aliases => 'Prefix'
13
13
  attribute :path
14
- attribute :prefix
14
+ attribute :common_prefixes, :aliases => 'CommonPrefixes'
15
+ attribute :delimiter, :aliases => 'Delimiter'
16
+ attribute :is_truncated, :aliases => 'IsTruncated'
17
+ attribute :marker, :aliases => 'Marker'
18
+ attribute :max_keys, :aliases => ['MaxKeys', 'max-keys']
15
19
 
16
20
  model Fog::Storage::Aliyun::File
17
21
 
@@ -21,6 +25,10 @@ module Fog
21
25
  # If so, it will return directly to avoid to create a new redundant folder named with directory_key.
22
26
  # This point will be applied to multi-bucket and make bucket as a directory scenario.
23
27
  def check_directory_key(directory_key)
28
+ bucket_name = nil
29
+ if directory_key.is_a? Array
30
+ directory_key = directory_key[0]
31
+ end
24
32
  if directory_key != ''
25
33
  # trim the suffix '/'
26
34
  directory_key = directory_key.chomp('/')
@@ -29,25 +37,23 @@ module Fog
29
37
  directory_key
30
38
  else
31
39
  data = service.get_bucket(directory_key)
32
- puts "[DEBUG] Getting the bucket named with directory name #{directory_key}..."
33
40
  if data.class == Hash && data.key?('Code') && !data['Code'].nil? && !data['Code'].empty?
34
- puts "[INFO] The directory name #{directory_key} is not a bucket and will create one folder named with it."
35
41
  directory_key
36
42
  else
37
- puts "[INFO] The directory name #{directory_key} is a bucket and store objects directly."
38
- ''
43
+ bucket_name = directory_key
44
+ directory_key = ''
39
45
  end
40
46
  end
41
- else
42
- ''
43
47
  end
48
+ return bucket_name, directory_key
44
49
  end
45
50
 
46
51
  def all(_options = {})
47
52
  requires :directory
48
- directory_key = check_directory_key(directory.key)
49
- prefix = directory_key + '/' if directory_key != '' && directory_key != '.' && !directory_key.nil?
50
- files = service.list_objects(prefix: prefix)['Contents']
53
+ bucket_name, directory_key = check_directory_key(directory.key)
54
+ prefix_value = prefix
55
+ prefix_value = directory_key + '/' + prefix if directory_key != '' && directory_key != '.' && !directory_key.nil?
56
+ files = service.list_objects(prefix: prefix_value, bucket: bucket_name)['Contents']
51
57
  return if files.nil?
52
58
  data = []
53
59
  i = 0
@@ -88,14 +94,14 @@ module Fog
88
94
 
89
95
  def get(key)
90
96
  requires :directory
91
- directory_key = check_directory_key(directory.key)
97
+ bucket_name, directory_key = check_directory_key(directory.key)
92
98
  object = if directory_key == ''
93
99
  key
94
100
  else
95
101
  directory_key + '/' + key
96
102
  end
97
103
  begin
98
- data = service.get_object(object)
104
+ data = service.get_object(object, nil, bucket: bucket_name)
99
105
  rescue StandardError => error
100
106
  case error.response.body
101
107
  when %r{<Code>NoSuchKey</Code>},%r{<Code>SymlinkTargetNotExist</Code>}
@@ -115,7 +121,7 @@ module Fog
115
121
  _end = i * Excon::CHUNK_SIZE - 1
116
122
  range = "#{_start}-#{_end}"
117
123
  begin
118
- data = service.get_object(object, range)
124
+ data = service.get_object(object, range, bucket: bucket_name)
119
125
  chunk = data[:body]
120
126
  rescue StandardError => error
121
127
  case error.response.body
@@ -157,48 +163,48 @@ module Fog
157
163
 
158
164
  def get_url(key)
159
165
  requires :directory
160
- directory_key = check_directory_key(directory.key)
166
+ bucket_name, directory_key = check_directory_key(directory.key)
161
167
  object = if directory_key == ''
162
168
  key
163
169
  else
164
170
  directory_key + '/' + key
165
171
  end
166
- service.get_object_http_url_public(object, 3600)
172
+ service.get_object_http_url_public(object, 3600, bucket: bucket_name)
167
173
  end
168
174
 
169
175
  def get_http_url(key, expires, options = {})
170
176
  requires :directory
171
- directory_key = check_directory_key(directory.key)
177
+ bucket_name, directory_key = check_directory_key(directory.key)
172
178
  object = if directory_key == ''
173
179
  key
174
180
  else
175
181
  directory_key + '/' + key
176
182
  end
177
183
  expires = expires.nil? ? 0 : expires.to_i
178
- service.get_object_http_url_public(object, expires, options)
184
+ service.get_object_http_url_public(object, expires, options.merge(bucket: bucket_name))
179
185
  end
180
186
 
181
187
  def get_https_url(key, expires, options = {})
182
188
  requires :directory
183
- directory_key = check_directory_key(directory.key)
189
+ bucket_name, directory_key = check_directory_key(directory.key)
184
190
  object = if directory_key == ''
185
191
  key
186
192
  else
187
193
  directory_key + '/' + key
188
194
  end
189
195
  expires = expires.nil? ? 0 : expires.to_i
190
- service.get_object_https_url_public(object, expires, options)
196
+ service.get_object_https_url_public(object, expires, options.merge(bucket: bucket_name))
191
197
  end
192
198
 
193
199
  def head(key, _options = {})
194
200
  requires :directory
195
- directory_key = check_directory_key(directory.key)
201
+ bucket_name, directory_key = check_directory_key(directory.key)
196
202
  object = if directory_key == ''
197
203
  key
198
204
  else
199
205
  directory_key + '/' + key
200
206
  end
201
- data = service.head_object(object).data
207
+ data = service.head_object(object, bucket: bucket_name).data
202
208
  return nil if data[:status] == 404
203
209
  lastModified = data[:headers]['Last-Modified']
204
210
  last_modified = (Time.parse(lastModified).localtime if !lastModified.nil? && lastModified != '')
@@ -225,6 +231,13 @@ module Fog
225
231
 
226
232
  def new(attributes = {})
227
233
  requires :directory
234
+ # Sometimes, the v will be a Array, like "Prefix"=>[{}], "Marker"=>[xxxx], "MaxKeys"=>["100"], "IsTruncated"=>["false"]
235
+ # and there needs to parse them
236
+ for k, v in attributes
237
+ if !v.nil? && (v.is_a? Array) && (v.size > 0)
238
+ attributes[k] = v[0]
239
+ end
240
+ end
228
241
  super({ directory: directory }.merge!(attributes))
229
242
  end
230
243
  end
@@ -4,7 +4,7 @@ module Fog
4
4
  module Storage
5
5
  class Aliyun
6
6
  class Real
7
- def get_bucket(bucket)
7
+ def get_bucket(bucket, options = {})
8
8
  location = get_bucket_location(bucket)
9
9
  # If there is an error, it will return a Hash with error code, host id and others
10
10
  # If can not get a valid location, will return one using region
@@ -15,13 +15,38 @@ module Fog
15
15
  location = 'oss-' + @aliyun_region_id
16
16
  end
17
17
  endpoint = 'http://' + location + '.aliyuncs.com'
18
+
19
+ prefix = options['prefix']
20
+ marker = options['marker']
21
+ maxKeys = options['max_keys']
22
+ delimiter = options['delimiter']
23
+ path = ''
24
+ if prefix
25
+ path += '/?prefix=' + prefix
26
+ path += '&marker=' + marker if marker
27
+ path += '&max-keys=' + maxKeys.to_s if maxKeys
28
+ path += '&delimiter=' + delimiter if delimiter
29
+
30
+ elsif marker
31
+ path += '/?marker=' + marker
32
+ path += '&max-keys=' + maxKeys.to_s if maxKeys
33
+ path += '&delimiter=' + delimiter if delimiter
34
+
35
+ elsif maxKeys
36
+ path += '/?max-keys=' + maxKeys.to_s
37
+ path += '&delimiter=' + delimiter if delimiter
38
+ elsif delimiter
39
+ path += '/?delimiter=' + delimiter
40
+ end
41
+
18
42
  resource = bucket + '/'
19
43
  ret = request(
20
44
  expects: [200, 203, 404],
21
45
  method: 'GET',
22
46
  bucket: bucket,
23
47
  resource: resource,
24
- endpoint: endpoint
48
+ endpoint: endpoint,
49
+ path: path
25
50
  )
26
51
  xml = ret.data[:body]
27
52
  XmlSimple.xml_in(xml)
@@ -14,21 +14,21 @@ module Fog
14
14
 
15
15
  path = ''
16
16
  if prefix
17
- path += '?prefix=' + prefix
17
+ path += '/?prefix=' + prefix
18
18
  path += '&marker=' + marker if marker
19
- path += '&max-keys=' + maxKeys if maxKeys
19
+ path += '&max-keys=' + maxKeys.to_s if maxKeys
20
20
  path += '&delimiter=' + delimiter if delimiter
21
21
 
22
22
  elsif marker
23
- path += '?marker=' + marker
24
- path += '&max-keys=' + maxKeys if maxKeys
23
+ path += '/?marker=' + marker
24
+ path += '&max-keys=' + maxKeys.to_s if maxKeys
25
25
  path += '&delimiter=' + delimiter if delimiter
26
26
 
27
27
  elsif maxKeys
28
- path += '?max-keys=' + maxKeys
28
+ path += '/?max-keys=' + maxKeys.to_s
29
29
  path += '&delimiter=' + delimiter if delimiter
30
30
  elsif delimiter
31
- path += '?delimiter=' + delimiter
31
+ path += '/?delimiter=' + delimiter
32
32
  end
33
33
 
34
34
  resource = bucket + '/'
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Fog
4
4
  module Aliyun
5
- VERSION = '0.3.8'
5
+ VERSION = '0.3.9'
6
6
  end
7
7
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fog-aliyun
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.8
4
+ version: 0.3.9
5
5
  platform: ruby
6
6
  authors:
7
7
  - Qinsi Deng, Jianxun Li, Jane Han, Guimin He
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-03-13 00:00:00.000000000 Z
11
+ date: 2020-05-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler