fog-aliyun 0.3.8 → 0.3.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml 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