fog-dtdream 0.0.1

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 (35) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +9 -0
  3. data/.travis.yml +4 -0
  4. data/Gemfile +4 -0
  5. data/LICENSE.txt +21 -0
  6. data/README.md +41 -0
  7. data/Rakefile +1 -0
  8. data/bin/console +14 -0
  9. data/bin/setup +7 -0
  10. data/fog-dtdream.gemspec +32 -0
  11. data/lib/fog/dtdream/core.rb +48 -0
  12. data/lib/fog/dtdream/models/storage/directories.rb +45 -0
  13. data/lib/fog/dtdream/models/storage/directory.rb +71 -0
  14. data/lib/fog/dtdream/models/storage/file.rb +174 -0
  15. data/lib/fog/dtdream/models/storage/files.rb +145 -0
  16. data/lib/fog/dtdream/requests/storage/copy_object.rb +32 -0
  17. data/lib/fog/dtdream/requests/storage/delete_bucket.rb +26 -0
  18. data/lib/fog/dtdream/requests/storage/delete_container.rb +32 -0
  19. data/lib/fog/dtdream/requests/storage/delete_object.rb +50 -0
  20. data/lib/fog/dtdream/requests/storage/get_bucket.rb +140 -0
  21. data/lib/fog/dtdream/requests/storage/get_container.rb +67 -0
  22. data/lib/fog/dtdream/requests/storage/get_containers.rb +72 -0
  23. data/lib/fog/dtdream/requests/storage/get_object.rb +42 -0
  24. data/lib/fog/dtdream/requests/storage/get_object_http_url.rb +39 -0
  25. data/lib/fog/dtdream/requests/storage/get_object_https_url.rb +97 -0
  26. data/lib/fog/dtdream/requests/storage/head_object.rb +31 -0
  27. data/lib/fog/dtdream/requests/storage/list_buckets.rb +46 -0
  28. data/lib/fog/dtdream/requests/storage/list_objects.rb +105 -0
  29. data/lib/fog/dtdream/requests/storage/put_bucket.rb +19 -0
  30. data/lib/fog/dtdream/requests/storage/put_container.rb +30 -0
  31. data/lib/fog/dtdream/requests/storage/put_object.rb +196 -0
  32. data/lib/fog/dtdream/storage.rb +206 -0
  33. data/lib/fog/dtdream/version.rb +5 -0
  34. data/lib/fog/dtdream.rb +9 -0
  35. metadata +108 -0
@@ -0,0 +1,105 @@
1
+ require 'xmlsimple'
2
+
3
+ module Fog
4
+ module Storage
5
+ class Dtdream
6
+ class Real
7
+ def list_objects(options={})
8
+
9
+ bucket = options[:bucket]
10
+ bucket ||= @aliyun_oss_bucket
11
+ prefix = options[:prefix]
12
+ marker = options[:marker]
13
+ maxKeys = options[:maxKeys]
14
+ delimiter = options[:delimiter]
15
+
16
+ path = ""
17
+
18
+ if prefix
19
+ path+="?prefix="+prefix
20
+ if marker
21
+ path+="&marker="+marker
22
+ end
23
+ if maxKeys
24
+ path+="&maxKeys="+maxKeys
25
+ end
26
+ if delimiter
27
+ path+="&delimiter="+delimiter
28
+ end
29
+
30
+ elsif marker
31
+ path+="?marker="+marker
32
+ if maxKeys
33
+ path+="&maxKeys="+maxKeys
34
+ end
35
+ if delimiter
36
+ path+="&delimiter="+delimiter
37
+ end
38
+
39
+ elsif maxKeys
40
+ path+="?maxKeys="+maxKeys
41
+ if delimiter
42
+ path+="&delimiter="+delimiter
43
+ end
44
+ elsif delimiter
45
+ path+="?delimiter="+delimiter
46
+ end
47
+
48
+ location = get_bucket_location(bucket)
49
+ endpoint = "http://"+location+".aliyuncs.com"
50
+ resource = bucket+'/'
51
+ ret = request(
52
+ :expects => [200, 203, 400],
53
+ :method => 'GET',
54
+ :path => path,
55
+ :resource => resource,
56
+ :bucket => bucket
57
+ )
58
+ xml = ret.data[:body]
59
+ result = XmlSimple.xml_in(xml)
60
+ end
61
+
62
+ def list_multipart_uploads(bucket, endpoint, options = {})
63
+ if (nil == endpoint)
64
+ location = get_bucket_location(bucket)
65
+ endpoint = "http://"+location+".aliyuncs.com"
66
+ end
67
+ path = "?uploads"
68
+ resource = bucket+'/'+path
69
+
70
+ ret = request(
71
+ :expects => 200,
72
+ :method => 'GET',
73
+ :path => path,
74
+ :bucket => bucket,
75
+ :resource => resource,
76
+ :endpoint => endpoint
77
+ )
78
+ uploadid = XmlSimple.xml_in(ret.data[:body])["Upload"]
79
+
80
+ end
81
+
82
+ def list_parts(bucket, object, endpoint, uploadid, options = {})
83
+ if (nil == endpoint)
84
+ location = get_bucket_location(bucket)
85
+ endpoint = "http://"+location+".aliyuncs.com"
86
+ end
87
+ path = object+"?uploadId="+uploadid
88
+ resource = bucket+'/'+path
89
+
90
+ ret = request(
91
+ :expects => 200,
92
+ :method => 'GET',
93
+ :path => path,
94
+ :bucket => bucket,
95
+ :resource => resource,
96
+ :endpoint => endpoint
97
+ )
98
+ parts = XmlSimple.xml_in(ret.data[:body])["Part"]
99
+ end
100
+
101
+ end
102
+
103
+ end
104
+ end
105
+ end
@@ -0,0 +1,19 @@
1
+ module Fog
2
+ module Storage
3
+ class Dtdream
4
+ class Real
5
+ def put_bucket(bucketName)
6
+
7
+ resource = bucketName+'/'
8
+ ret = request(
9
+ :expects => [200, 203],
10
+ :method => 'PUT',
11
+ :resource => resource,
12
+ :bucket => bucketName
13
+ )
14
+ end
15
+ end
16
+
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,30 @@
1
+ module Fog
2
+ module Storage
3
+ class Dtdream
4
+ class Real
5
+ # Create a new container
6
+ #
7
+ # ==== Parameters
8
+ # * name<~String> - Name for container, ����·������β����Я��'/'
9
+ #
10
+ def put_container(name, options={})
11
+ bucket = options[:bucket]
12
+ bucket ||= @aliyun_oss_bucket
13
+ location = get_bucket_location(bucket)
14
+ endpoint = "http://"+location+".aliyuncs.com"
15
+
16
+ path = name+'/'
17
+ resource = bucket+'/'+name+'/'
18
+ request(
19
+ :expects => [200, 203],
20
+ :method => 'PUT',
21
+ :path => path,
22
+ :bucket => bucket,
23
+ :resource => resource,
24
+ :endpoint => endpoint
25
+ )
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,196 @@
1
+ module Fog
2
+ module Storage
3
+ class Dtdream
4
+ class Real
5
+ # Put details for object
6
+ #
7
+ # ==== Parameters
8
+ # * container<~String> - Name of container to look in
9
+ # * object<~String> - Name of object to look for
10
+ #
11
+ def put_object(object, file=nil, options={})
12
+
13
+ bucket = options[:bucket]
14
+ bucket ||= @aliyun_oss_bucket
15
+ location = get_bucket_location(bucket)
16
+ endpoint = "http://"+location+".aliyuncs.com"
17
+ if (nil == file)
18
+ return put_folder(bucket, object, endpoint)
19
+ end
20
+
21
+ #object size ����100M���߷�Ƭ�ϴ���֧�ֶϵ�����
22
+ if file.size >100 * 1024 * 1024
23
+ put_multipart_object(bucket, object, file)
24
+ return
25
+ end
26
+
27
+ body = file.read
28
+
29
+ resource = bucket+'/'+object
30
+ ret = request(
31
+ :expects => [200, 203],
32
+ :method => 'PUT',
33
+ :path => object,
34
+ :bucket => bucket,
35
+ :resource => resource,
36
+ :body => body,
37
+ :endpoint => endpoint
38
+ )
39
+
40
+ end
41
+
42
+ def put_object_with_body(object, body, options={})
43
+
44
+ bucket = options[:bucket]
45
+ bucket ||= @aliyun_oss_bucket
46
+ location = get_bucket_location(bucket)
47
+ endpoint = "http://"+location+".aliyuncs.com"
48
+
49
+ #object size ����100M���߷�Ƭ�ϴ���֧�ֶϵ�����
50
+ # if body.size >100 * 1024 * 1024
51
+ # put_multipart_object_with_body(bucket, object, body)
52
+ # return
53
+ # end
54
+
55
+ resource = bucket+'/'+object
56
+ ret = request(
57
+ :expects => [200, 203],
58
+ :method => 'PUT',
59
+ :path => object,
60
+ :bucket => bucket,
61
+ :resource => resource,
62
+ :body => body,
63
+ :endpoint => endpoint
64
+ )
65
+
66
+ end
67
+
68
+ def put_folder(bucket, folder, endpoint)
69
+ if (nil == endpoint)
70
+ location = get_bucket_location(bucket)
71
+ endpoint = "http://"+location+".aliyuncs.com"
72
+ end
73
+ path = folder+'/'
74
+ resource = bucket+'/'+folder+'/'
75
+ ret = request(
76
+ :expects => [200, 203],
77
+ :method => 'PUT',
78
+ :path => path,
79
+ :bucket => bucket,
80
+ :resource => resource,
81
+ :endpoint => endpoint
82
+ )
83
+ end
84
+
85
+ def put_multipart_object(bucket, object, file)
86
+
87
+ location = get_bucket_location(bucket)
88
+ endpoint = "http://"+location+".aliyuncs.com"
89
+
90
+ #����bucket��uploads�¼����ҵ���Ӧupload������������򴴽�upload�¼�
91
+ uploads = list_multipart_uploads(bucket, endpoint)
92
+ upload = uploads.find do |tmpupload| tmpupload["Key"][0] == object end
93
+
94
+ parts = nil
95
+ uploadedSize = 0
96
+ start_partNumber = 1
97
+ if ( nil != upload )
98
+ uploadId = upload["UploadId"][0]
99
+ parts = list_parts(bucket, object, endpoint, uploadId)
100
+ if ((nil != parts) &&(0 != parts.size))
101
+ if (parts[-1]["Size"][0].to_i != 5242880)
102
+ #�ϴ����һƬ����������5M,˵���Ѿ��ϴ���ϣ������ϴ�
103
+ complete_multipart_upload(bucket, object, endpoint, uploadId)
104
+ return
105
+ end
106
+ uploadedSize = (parts[0]["Size"][0].to_i * (parts.size - 1)) + parts[-1]["Size"][0].to_i
107
+ start_partNumber = parts[-1]["PartNumber"][0].to_i + 1
108
+ end
109
+ else
110
+ #InitiateMultipartUpload��ȡUpload ID
111
+ uploadId = initiate_multipart_upload(bucket, object, endpoint)
112
+ end
113
+
114
+ if (file.size <= uploadedSize)
115
+ #�ļ���СС�ڻ�������ϴ���,˵���Ѿ��ϴ���ϣ������ϴ�
116
+ complete_multipart_upload(bucket, object, endpoint, uploadId)
117
+ return
118
+ end
119
+
120
+ end_partNumber = (file.size + 5242880 -1) / 5242880
121
+ file.seek(uploadedSize)
122
+
123
+ for i in start_partNumber..end_partNumber
124
+ body = file.read(5242880)
125
+ upload_part(bucket, object, endpoint, i.to_s, uploadId, body)
126
+ end
127
+
128
+ complete_multipart_upload(bucket, object, endpoint, uploadId)
129
+ end
130
+
131
+ def initiate_multipart_upload(bucket, object, endpoint)
132
+ if (nil == endpoint)
133
+ location = get_bucket_location(bucket)
134
+ endpoint = "http://"+location+".aliyuncs.com"
135
+ end
136
+ path = object+"?uploads"
137
+ resource = bucket+'/'+path
138
+ ret = request(
139
+ :expects => 200,
140
+ :method => 'POST',
141
+ :path => path,
142
+ :bucket => bucket,
143
+ :resource => resource,
144
+ :endpoint => endpoint
145
+ )
146
+ uploadid = XmlSimple.xml_in(ret.data[:body])["UploadId"][0]
147
+ end
148
+
149
+ def upload_part(bucket, object, endpoint, partNumber, uploadId, body)
150
+ if (nil == endpoint)
151
+ location = get_bucket_location(bucket)
152
+ endpoint = "http://"+location+".aliyuncs.com"
153
+ end
154
+ path = object+"?partNumber="+partNumber+"&uploadId="+uploadId
155
+ resource = bucket+'/'+path
156
+ ret = request(
157
+ :expects => [200, 203],
158
+ :method => 'PUT',
159
+ :path => path,
160
+ :bucket => bucket,
161
+ :resource => resource,
162
+ :body => body,
163
+ :endpoint => endpoint
164
+ )
165
+ end
166
+
167
+ def complete_multipart_upload(bucket, object, endpoint, uploadId)
168
+ if (nil == endpoint)
169
+ location = get_bucket_location(bucket)
170
+ endpoint = "http://"+location+".aliyuncs.com"
171
+ end
172
+ parts = list_parts(bucket, object, endpoint, uploadId, options = {})
173
+ request_part = Array.new
174
+ for i in 0..(parts.size-1)
175
+ part = parts[i]
176
+ request_part[i] = {"PartNumber"=>part["PartNumber"], "ETag"=>part["ETag"]}
177
+ end
178
+ body =XmlSimple.xml_out({"Part"=>request_part},'RootName'=>'CompleteMultipartUpload')
179
+
180
+ path = object+"?uploadId="+uploadId
181
+ resource = bucket+'/'+path
182
+ ret = request(
183
+ :expects => 200,
184
+ :method => 'POST',
185
+ :path => path,
186
+ :bucket => bucket,
187
+ :resource => resource,
188
+ :endpoint => endpoint,
189
+ :body => body
190
+ )
191
+
192
+ end
193
+ end
194
+ end
195
+ end
196
+ end
@@ -0,0 +1,206 @@
1
+ require 'fog/dtdream/core'
2
+
3
+ module Fog
4
+ module Storage
5
+ class Dtdream < Fog::Service
6
+ recognizes :aliyun_oss_endpoint,
7
+ :aliyun_oss_location,
8
+ :aliyun_oss_bucket,
9
+ :aliyun_accesskey_id,
10
+ :aliyun_accesskey_secret
11
+
12
+ model_path 'fog/dtdream/models/storage'
13
+ model :directory
14
+ collection :directories
15
+ model :file
16
+ collection :files
17
+
18
+ request_path 'fog/dtdream/requests/storage'
19
+ request :copy_object
20
+ request :delete_bucket
21
+ request :delete_object
22
+ request :get_bucket
23
+ request :get_object
24
+ request :get_object_http_url
25
+ request :get_object_https_url
26
+ request :head_object
27
+ request :put_bucket
28
+ request :put_object
29
+ request :list_buckets
30
+ request :list_objects
31
+ request :get_containers
32
+ request :get_container
33
+ request :delete_container
34
+ request :put_container
35
+
36
+ class Real
37
+ attr_reader :aliyun_accesskey_id
38
+ attr_reader :aliyun_accesskey_secret
39
+ attr_reader :aliyun_oss_endpoint
40
+ attr_reader :aliyun_oss_location
41
+ attr_reader :aliyun_oss_bucket
42
+
43
+ def initialize(options={})
44
+ #��ʼ����λ�ȡ
45
+ @aliyun_oss_endpoint = options[:aliyun_oss_endpoint]
46
+ @aliyun_oss_location = options[:aliyun_oss_location]
47
+ @aliyun_accesskey_id = options[:aliyun_accesskey_id]
48
+ @aliyun_accesskey_secret = options[:aliyun_accesskey_secret]
49
+ @aliyun_oss_bucket = options[:aliyun_oss_bucket]
50
+
51
+ #��μ�飬�ؼ���������ȱ��
52
+ missing_credentials = Array.new
53
+ missing_credentials << :aliyun_oss_endpoint unless @aliyun_oss_endpoint
54
+ missing_credentials << :aliyun_oss_location unless @aliyun_oss_location
55
+ missing_credentials << :aliyun_accesskey_id unless @aliyun_accesskey_id
56
+ missing_credentials << :aliyun_accesskey_secret unless @aliyun_accesskey_secret
57
+ raise ArgumentError, "Missing required arguments: #{missing_credentials.join(', ')}" unless missing_credentials.empty?
58
+
59
+ @connection_options = options[:connection_options] || {}
60
+
61
+ uri = URI.parse(@aliyun_oss_endpoint)
62
+ @host = uri.host
63
+ @path = uri.path
64
+ @port = uri.port
65
+ @scheme = uri.scheme
66
+
67
+ @persistent = options[:persistent] || false
68
+
69
+
70
+ end
71
+
72
+ def reload
73
+ @connection.reset
74
+ end
75
+
76
+ def request(params)
77
+ method = params[:method]
78
+ time = Time.new.utc
79
+ date = time.strftime("%a, %d %b %Y %H:%M:%S GMT")
80
+
81
+ endpoint = params[:endpoint]
82
+ if endpoint
83
+ uri = URI.parse(endpoint)
84
+ host = uri.host
85
+ path = uri.path
86
+ port = uri.port
87
+ scheme = uri.scheme
88
+ else
89
+ host = @host
90
+ path = @path
91
+ port = @port
92
+ scheme = @scheme
93
+ end
94
+
95
+ bucket = params[:bucket]
96
+ if bucket
97
+ tmpHost = bucket + '.' + host
98
+ else
99
+ tmpHost = host
100
+ end
101
+
102
+ @connection = Fog::Core::Connection.new("#{scheme}://#{tmpHost}", @persistent, @connection_options)
103
+ contentType = params[:contentType]
104
+
105
+ begin
106
+ headers = ""
107
+ if params[:headers]
108
+ params[:headers].each do |k,v|
109
+ if k != "Range"
110
+ headers += "#{k}: #{v}\n"
111
+ end
112
+ end
113
+ end
114
+ signature = sign(method, date, contentType, params[:resource], headers)
115
+ response = @connection.request(params.merge({
116
+ :headers => {
117
+ 'Content-Type' => contentType,
118
+ 'Authorization' =>'OSS '+@aliyun_accesskey_id+':'+signature,
119
+ 'Date' => date
120
+ }.merge!(params[:headers] || {}),
121
+ :path => "#{path}/#{params[:path]}",
122
+ :query => params[:query]
123
+ }))
124
+ rescue Excon::Errors::HTTPStatusError => error
125
+ raise case error
126
+ when Excon::Errors::NotFound
127
+ Fog::Storage::Dtdream::NotFound.slurp(error)
128
+ else
129
+ error
130
+ end
131
+ end
132
+
133
+ response
134
+ end
135
+
136
+ #����signature
137
+ def sign (method, date, contentType, resource=nil, headers = nil)
138
+ contentmd5 = ""
139
+
140
+ if resource
141
+ canonicalizedResource = "/"+resource
142
+ else
143
+ canonicalizedResource = "/"
144
+ end
145
+
146
+ if headers
147
+ canonicalizedOSSHeaders = headers
148
+ else
149
+ canonicalizedOSSHeaders = ""
150
+ end
151
+
152
+ if contentType
153
+ contentTypeStr = contentType
154
+ else
155
+ contentTypeStr = ""
156
+ end
157
+
158
+ stringToSign = method+"\n"+contentmd5+"\n"+contentTypeStr+"\n"+date+"\n"+canonicalizedOSSHeaders+canonicalizedResource
159
+
160
+ digVer = OpenSSL::Digest.new("sha1")
161
+ digest = OpenSSL::HMAC.digest(digVer, @aliyun_accesskey_secret, stringToSign)
162
+ signature = Base64.encode64(digest)
163
+ signature[-1] = ""
164
+
165
+ return signature
166
+ end
167
+ end
168
+
169
+ class Mock
170
+ def self.data
171
+ @data ||= Hash.new do |hash, key|
172
+ hash[key] = {}
173
+ end
174
+ end
175
+
176
+ def self.reset
177
+ @data = nil
178
+ end
179
+
180
+ def initialize(options={})
181
+ @openstack_api_key = options[:openstack_api_key]
182
+ @openstack_username = options[:openstack_username]
183
+ @path = '/v1/AUTH_1234'
184
+ end
185
+
186
+ def data
187
+ self.class.data[@openstack_username]
188
+ end
189
+
190
+ def reset_data
191
+ self.class.data.delete(@openstack_username)
192
+ end
193
+
194
+ def change_account(account)
195
+ @original_path ||= @path
196
+ version_string = @original_path.split('/')[1]
197
+ @path = "/#{version_string}/#{account}"
198
+ end
199
+
200
+ def reset_account_name
201
+ @path = @original_path
202
+ end
203
+ end
204
+ end
205
+ end
206
+ end
@@ -0,0 +1,5 @@
1
+ module Fog
2
+ module Dtdream
3
+ VERSION = "0.0.1"
4
+ end
5
+ end
@@ -0,0 +1,9 @@
1
+ require "fog/dtdream/core"
2
+ require "fog/dtdream/storage"
3
+ require "fog/dtdream/version"
4
+
5
+ module Fog
6
+ module Dtdream
7
+ # Your code goes here...
8
+ end
9
+ end
metadata ADDED
@@ -0,0 +1,108 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: fog-dtdream
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - dengqinsi
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2015-09-18 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.10'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.10'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '10.0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '10.0'
41
+ description: This library can be used as a module for `fog` or as standalone provider
42
+ to use the Aliyun Web Services in applications..
43
+ email:
44
+ - dengqs@dtdream.com
45
+ executables: []
46
+ extensions: []
47
+ extra_rdoc_files: []
48
+ files:
49
+ - ".gitignore"
50
+ - ".travis.yml"
51
+ - Gemfile
52
+ - LICENSE.txt
53
+ - README.md
54
+ - Rakefile
55
+ - bin/console
56
+ - bin/setup
57
+ - fog-dtdream.gemspec
58
+ - lib/fog/dtdream.rb
59
+ - lib/fog/dtdream/core.rb
60
+ - lib/fog/dtdream/models/storage/directories.rb
61
+ - lib/fog/dtdream/models/storage/directory.rb
62
+ - lib/fog/dtdream/models/storage/file.rb
63
+ - lib/fog/dtdream/models/storage/files.rb
64
+ - lib/fog/dtdream/requests/storage/copy_object.rb
65
+ - lib/fog/dtdream/requests/storage/delete_bucket.rb
66
+ - lib/fog/dtdream/requests/storage/delete_container.rb
67
+ - lib/fog/dtdream/requests/storage/delete_object.rb
68
+ - lib/fog/dtdream/requests/storage/get_bucket.rb
69
+ - lib/fog/dtdream/requests/storage/get_container.rb
70
+ - lib/fog/dtdream/requests/storage/get_containers.rb
71
+ - lib/fog/dtdream/requests/storage/get_object.rb
72
+ - lib/fog/dtdream/requests/storage/get_object_http_url.rb
73
+ - lib/fog/dtdream/requests/storage/get_object_https_url.rb
74
+ - lib/fog/dtdream/requests/storage/head_object.rb
75
+ - lib/fog/dtdream/requests/storage/list_buckets.rb
76
+ - lib/fog/dtdream/requests/storage/list_objects.rb
77
+ - lib/fog/dtdream/requests/storage/put_bucket.rb
78
+ - lib/fog/dtdream/requests/storage/put_container.rb
79
+ - lib/fog/dtdream/requests/storage/put_object.rb
80
+ - lib/fog/dtdream/storage.rb
81
+ - lib/fog/dtdream/version.rb
82
+ homepage: https://github.com/denques/fog-aliyun.git
83
+ licenses:
84
+ - MIT
85
+ metadata:
86
+ allowed_push_host: https://rubygems.org
87
+ post_install_message:
88
+ rdoc_options: []
89
+ require_paths:
90
+ - lib
91
+ required_ruby_version: !ruby/object:Gem::Requirement
92
+ requirements:
93
+ - - ">="
94
+ - !ruby/object:Gem::Version
95
+ version: '0'
96
+ required_rubygems_version: !ruby/object:Gem::Requirement
97
+ requirements:
98
+ - - ">="
99
+ - !ruby/object:Gem::Version
100
+ version: '0'
101
+ requirements: []
102
+ rubyforge_project:
103
+ rubygems_version: 2.4.8
104
+ signing_key:
105
+ specification_version: 4
106
+ summary: Module for the 'fog' gem to support Aliyun Web Services.
107
+ test_files: []
108
+ has_rdoc: