fog-dtdream 0.0.6 → 0.0.7
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/.rspec +0 -0
- data/.travis.yml +0 -0
- data/{LICENSE.txt → LICENSE} +6 -5
- data/README.md +301 -9
- data/fog-dtdream.gemspec +4 -4
- data/lib/fog/bin/dtdream.rb +29 -0
- data/lib/fog/dtdream/models/storage/directories.rb +4 -1
- data/lib/fog/dtdream/models/storage/directory.rb +6 -23
- data/lib/fog/dtdream/models/storage/file.rb +19 -6
- data/lib/fog/dtdream/models/storage/files.rb +21 -16
- data/lib/fog/dtdream/requests/storage/copy_object.rb +6 -2
- data/lib/fog/dtdream/requests/storage/get_bucket.rb +23 -11
- data/lib/fog/dtdream/requests/storage/get_container.rb +4 -4
- data/lib/fog/dtdream/requests/storage/get_containers.rb +4 -4
- data/lib/fog/dtdream/requests/storage/get_object.rb +1 -1
- data/lib/fog/dtdream/requests/storage/get_object_https_url.rb +0 -59
- data/lib/fog/dtdream/requests/storage/list_buckets.rb +4 -4
- data/lib/fog/dtdream/requests/storage/list_objects.rb +6 -6
- data/lib/fog/dtdream/requests/storage/put_object.rb +11 -7
- data/lib/fog/dtdream/storage.rb +2 -3
- data/lib/fog/dtdream/version.rb +1 -1
- data/lib/fog/dtdream.rb +1 -0
- metadata +11 -10
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f8c5290adef3beff7f2be88066e5adc31b613f73
|
4
|
+
data.tar.gz: 815decd956a9bb646000c7fb148395b3a43ddca4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e41c00d5e2d7866a14a10845cf5d7de046728eee5cfc247b9556bbd3c131de390dd3ec1f6f32e1e1f8472e4417df1a1c59750b0de39cc0491017ad8777e93b87
|
7
|
+
data.tar.gz: 61c636ed394e684a92212a7530251f9202fe8da2863ed88b807d8528431f37f63d1aaae09d57f132e817b4b460d9d4e17c112812e7560db177e3b978e9b0de08
|
data/.gitignore
CHANGED
data/.rspec
CHANGED
File without changes
|
data/.travis.yml
CHANGED
File without changes
|
data/{LICENSE.txt → LICENSE}
RENAMED
@@ -1,6 +1,6 @@
|
|
1
1
|
The MIT License (MIT)
|
2
2
|
|
3
|
-
Copyright (c) 2015
|
3
|
+
Copyright (c) 2015 dengqinsi
|
4
4
|
|
5
5
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
6
|
of this software and associated documentation files (the "Software"), to deal
|
@@ -9,13 +9,14 @@ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
9
|
copies of the Software, and to permit persons to whom the Software is
|
10
10
|
furnished to do so, subject to the following conditions:
|
11
11
|
|
12
|
-
The above copyright notice and this permission notice shall be included in
|
13
|
-
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
13
|
+
copies or substantial portions of the Software.
|
14
14
|
|
15
15
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
16
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
17
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18
18
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
19
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
-
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
21
|
-
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
21
|
+
SOFTWARE.
|
22
|
+
|
data/README.md
CHANGED
@@ -2,8 +2,6 @@
|
|
2
2
|
|
3
3
|
Welcome to your new gem! In this directory, you'll find the files you need to be able to package up your Ruby library into a gem. Put your Ruby code in the file `lib/fog/dtdream`. To experiment with that code, run `bin/console` for an interactive prompt.
|
4
4
|
|
5
|
-
TODO: Delete this and the text above, and describe your gem
|
6
|
-
|
7
5
|
## Installation
|
8
6
|
|
9
7
|
Add this line to your application's Gemfile:
|
@@ -13,27 +11,321 @@ gem 'fog-dtdream'
|
|
13
11
|
```
|
14
12
|
|
15
13
|
And then execute:
|
16
|
-
|
14
|
+
```shell
|
17
15
|
$ bundle
|
16
|
+
```
|
18
17
|
|
19
18
|
Or install it yourself as:
|
20
19
|
|
20
|
+
```shell
|
21
21
|
$ gem install fog-dtdream
|
22
|
+
```
|
22
23
|
|
23
24
|
## Usage
|
25
|
+
Before you can use fog-dtdream, you must require it in your application:
|
24
26
|
|
25
|
-
|
27
|
+
```ruby
|
28
|
+
require 'fog/dtdream'
|
29
|
+
```
|
26
30
|
|
27
|
-
|
31
|
+
Since it's a bad practice to have your credentials in source code, you should load them from default fog configuration file: ```~/.fog```. This file could look like this:
|
28
32
|
|
29
|
-
|
33
|
+
```
|
34
|
+
default:
|
35
|
+
:aliyun_accesskey_id: <YOUR_ACCESS_KEY_ID>,
|
36
|
+
:aliyun_accesskey_secret: <YOUR_SECRET_ACCESS_KEY>,
|
37
|
+
:aliyun_oss_endpoint: <YOUR_OSS_ENDPOINT>,
|
38
|
+
:aliyun_oss_location: <YOUR_OSS_LOACTION>,
|
39
|
+
:aliyun_oss_bucket: <YOUR_OSS_BUCKET>
|
40
|
+
```
|
30
41
|
|
31
|
-
|
42
|
+
### Connecting to OSS
|
43
|
+
```ruby
|
44
|
+
conn = Fog::Storage[:dtdream]
|
45
|
+
```
|
46
|
+
|
47
|
+
If you haven't modified your default fog configuration file or you don't want to use it, you can load your credentials by this way:
|
48
|
+
```ruby
|
49
|
+
opt = {
|
50
|
+
:provider => 'dtdream',
|
51
|
+
:aliyun_accesskey_id => <YOUR_ACCESS_KEY_ID>,
|
52
|
+
:aliyun_accesskey_secret => <YOUR_SECRET_ACCESS_KEY>,
|
53
|
+
:aliyun_oss_endpoint => <YOUR_OSS_ENDPOINT>,
|
54
|
+
:aliyun_oss_location => <YOUR_OSS_LOACTION>,
|
55
|
+
:aliyun_oss_bucket => <YOUR_OSS_BUCKET>,
|
56
|
+
}
|
57
|
+
conn = Fog::Storage.new(opt)
|
58
|
+
```
|
59
|
+
|
60
|
+
## Fog::Dtdream Abstractions
|
61
|
+
|
62
|
+
Fog::Dtdream provides both a **model** and **request** abstraction. The request abstraction provides the most efficient interface and the model abstraction wraps the request abstraction to provide a convenient `ActiveModel` like interface.
|
63
|
+
|
64
|
+
### Request Layer
|
65
|
+
The Fog::Storage object supports a number of methods that wrap individual HTTP requests to the OSS API.
|
66
|
+
|
67
|
+
To see a list of requests supported by the storage service:
|
68
|
+
|
69
|
+
conn.requests
|
70
|
+
|
71
|
+
This returns:
|
72
|
+
```
|
73
|
+
[[nil, :copy_object], [nil, :delete_bucket], [nil, :delete_object], [nil, :get_bucket], [nil, :get_object], [nil, :get_object_http_url], [nil, :get_object_https_url], [nil, :head_object], [nil, :put_bucket], [nil, :put_object], [nil, :list_buckets], [nil, :list_objects], [nil, :get_containers], [nil, :get_container], [nil, :delete_container], [nil, :put_container]]
|
74
|
+
```
|
75
|
+
|
76
|
+
#### Example Requests(list_buckets)
|
77
|
+
To request all of buckets:
|
78
|
+
|
79
|
+
```ruby
|
80
|
+
conn.list_buckets
|
81
|
+
```
|
82
|
+
|
83
|
+
And this returns like the flowing;
|
84
|
+
```
|
85
|
+
[{"Location"=>"oss-cn-beijing", "Name"=>"dt1", "CreationDate"=>"2015-07-30T08:38:02.000Z"}, {"Location"=>"oss-cn-shenzhen", "Name"=>"ruby1", "CreationDate"=>"2015-07-30T02:22:34.000Z"}, {"Location"=>"oss-cn-qingdao", "Name"=>"yuanhang123", "CreationDate"=>"2015-05-18T03:06:31.000Z"}]
|
86
|
+
```
|
87
|
+
|
88
|
+
You can also request in this way;
|
89
|
+
```ruby
|
90
|
+
conn.list_buckets(:prefix=>"pre")
|
91
|
+
```
|
92
|
+
|
93
|
+
Here is a summary of the optional parameters:
|
94
|
+
<table>
|
95
|
+
<tr>
|
96
|
+
<th>Parameters</th>
|
97
|
+
<th>Description</th>
|
98
|
+
</tr>
|
99
|
+
<tr>
|
100
|
+
<td>:prefix</td>
|
101
|
+
<td>
|
102
|
+
The bucket name of the results must start with 'prefix'.It won't filter prefix information if not set<br>
|
103
|
+
Data Types: String<br>
|
104
|
+
Defaults:none
|
105
|
+
</td>
|
106
|
+
</tr>
|
107
|
+
<tr>
|
108
|
+
<td>:marker</td>
|
109
|
+
<td>
|
110
|
+
The result will start from the marker alphabetically.It wil start from the first if not set.<br>
|
111
|
+
Data Types: String<br>
|
112
|
+
Defaults: none
|
113
|
+
</tr>
|
114
|
+
<tr>
|
115
|
+
<td>:maxKeys</td>
|
116
|
+
<td>
|
117
|
+
Set the max number of the results. It will set to 100 if not set. The max value of maxKeys is 1000.<br>
|
118
|
+
Data Types: String<br>
|
119
|
+
Defaults: 100
|
120
|
+
</td>
|
121
|
+
</tr>
|
122
|
+
</table>
|
123
|
+
|
124
|
+
To learn more about `Fog::Dtdream` request methods, you can refer to our source code. To learn more about OSS API, refer to [AliYun OSS API](https://docs.aliyun.com/?spm=5176.383663.9.2.jpghde#/pub/oss/api-reference/abstract).
|
125
|
+
|
126
|
+
### Model Layer
|
127
|
+
Fog models behave in a manner similar to `ActiveModel`. Models will generally respond to `create`, `save`, `destroy`, `reload` and `attributes` methods. Additionally, fog will automatically create attribute accessors.
|
128
|
+
|
129
|
+
Here is a summary of common model methods:
|
130
|
+
|
131
|
+
<table>
|
132
|
+
<tr>
|
133
|
+
<th>Method</th>
|
134
|
+
<th>Description</th>
|
135
|
+
</tr>
|
136
|
+
<tr>
|
137
|
+
<td>create</td>
|
138
|
+
<td>
|
139
|
+
Accepts hash of attributes and creates object.<br>
|
140
|
+
Note: creation is a non-blocking call and you will be required to wait for a valid state before using resulting object.
|
141
|
+
</td>
|
142
|
+
</tr>
|
143
|
+
<tr>
|
144
|
+
<td>save</td>
|
145
|
+
<td>Saves object.<br>
|
146
|
+
Note: not all objects support updating object.</td>
|
147
|
+
</tr>
|
148
|
+
<tr>
|
149
|
+
<td>destroy</td>
|
150
|
+
<td>
|
151
|
+
Destroys object.<br>
|
152
|
+
Note: this is a non-blocking call and object deletion might not be instantaneous.
|
153
|
+
</td>
|
154
|
+
<tr>
|
155
|
+
<td>reload</td>
|
156
|
+
<td>Updates object with latest state from service.</td>
|
157
|
+
<tr>
|
158
|
+
<td>attributes</td>
|
159
|
+
<td>Returns a hash containing the list of model attributes and values.</td>
|
160
|
+
</tr>
|
161
|
+
<td>identity</td>
|
162
|
+
<td>
|
163
|
+
Returns the identity of the object.<br>
|
164
|
+
Note: This might not always be equal to object.id.
|
165
|
+
</td>
|
166
|
+
</tr>
|
167
|
+
</table>
|
168
|
+
|
169
|
+
The remainder of this document details the model abstraction.
|
170
|
+
|
171
|
+
**Note:** Fog sometimes refers to OSS containers as directories.
|
172
|
+
|
173
|
+
## List Directories
|
174
|
+
|
175
|
+
To retrieve a list of directories:
|
176
|
+
|
177
|
+
```ruby
|
178
|
+
conn.directories
|
179
|
+
```
|
180
|
+
|
181
|
+
This returns a collection of `Fog::Storage::Dtdream::Directory` models:
|
182
|
+
|
183
|
+
## Get Directory
|
184
|
+
|
185
|
+
To retrieve a specific directory:
|
186
|
+
|
187
|
+
```ruby
|
188
|
+
conn.directories.get "dir"
|
189
|
+
```
|
190
|
+
|
191
|
+
This returns a `Fog::Storage::Dtdream::Directory` instance:
|
192
|
+
|
193
|
+
## Create Directory
|
194
|
+
|
195
|
+
To create a directory:
|
196
|
+
|
197
|
+
```ruby
|
198
|
+
conn.directories.create :key => 'backups'
|
199
|
+
```
|
200
|
+
|
201
|
+
## Delete Directory
|
202
|
+
|
203
|
+
To delete a directory:
|
204
|
+
|
205
|
+
```ruby
|
206
|
+
directory.destroy
|
207
|
+
```
|
208
|
+
|
209
|
+
**Note**: Directory must be empty before it can be deleted.
|
210
|
+
|
211
|
+
|
212
|
+
## Directory URL
|
213
|
+
|
214
|
+
To get a directory's URL:
|
215
|
+
|
216
|
+
```ruby
|
217
|
+
directory.public_url
|
218
|
+
```
|
219
|
+
|
220
|
+
## List Files
|
221
|
+
|
222
|
+
To list files in a directory:
|
223
|
+
|
224
|
+
```ruby
|
225
|
+
directory.files
|
226
|
+
```
|
227
|
+
|
228
|
+
**Note**: File contents is not downloaded until `body` attribute is called.
|
229
|
+
|
230
|
+
## Upload Files
|
32
231
|
|
33
|
-
|
232
|
+
To upload a file into a directory:
|
233
|
+
|
234
|
+
```ruby
|
235
|
+
file = directory.files.create :key => 'space.jpg', :body => File.open "space.jpg"
|
236
|
+
```
|
237
|
+
|
238
|
+
**Note**: For files larger than 5 GB please refer to the [Upload Large Files](#upload_large_files) section.
|
239
|
+
|
240
|
+
### Additional Parameters
|
241
|
+
|
242
|
+
The `create` method also supports the following key values:
|
243
|
+
|
244
|
+
<table>
|
245
|
+
<tr>
|
246
|
+
<th>Key</th>
|
247
|
+
<th>Description</th>
|
248
|
+
</tr>
|
249
|
+
<tr>
|
250
|
+
<td>:content_type</td>
|
251
|
+
<td>The content type of the object. Cloud Files will attempt to auto detect this value if omitted.</td>
|
252
|
+
</tr>
|
253
|
+
<tr>
|
254
|
+
<td>:origin</td>
|
255
|
+
<td>The origin is the URI of the object's host.</td>
|
256
|
+
</tr>
|
257
|
+
<tr>
|
258
|
+
<td>:etag</td>
|
259
|
+
<td>The MD5 checksum of your object's data. If specified, Cloud Files will validate the integrity of the uploaded object.</td>
|
260
|
+
</tr>
|
261
|
+
</table>
|
262
|
+
|
263
|
+
## Upload Large Files
|
264
|
+
|
265
|
+
OSS requires files larger than 5 GB (the OSS default limit) to be uploaded into segments along with an accompanying manifest file. All of the segments must be uploaded to the same container.
|
266
|
+
|
267
|
+
Segmented files are downloaded like ordinary files. See [Download Files](#download-files) section for more information.
|
268
|
+
|
269
|
+
## Download Files
|
270
|
+
|
271
|
+
The most efficient way to download files from a private or public directory is as follows:
|
272
|
+
|
273
|
+
```ruby
|
274
|
+
File.open('downloaded-file.jpg', 'w') do | f |
|
275
|
+
directory.files.get("my_big_file.jpg") do | data, remaining, content_length |
|
276
|
+
f.syswrite data
|
277
|
+
end
|
278
|
+
end
|
279
|
+
```
|
34
280
|
|
35
|
-
|
281
|
+
This will download and save the file.
|
36
282
|
|
283
|
+
**Note**: The `body` attribute of file will be empty if a file has been downloaded using this method.
|
284
|
+
|
285
|
+
If a file object has already been loaded into memory, you can save it as follows:
|
286
|
+
|
287
|
+
```ruby
|
288
|
+
File.open('germany.jpg', 'w') {|f| f.write(file_object.body) }
|
289
|
+
```
|
290
|
+
|
291
|
+
**Note**: This method is more memory intensive as the entire object is loaded into memory before saving the file as in the example above.
|
292
|
+
|
293
|
+
|
294
|
+
## File URL
|
295
|
+
|
296
|
+
To get a file's URL:
|
297
|
+
|
298
|
+
```ruby
|
299
|
+
file.public_url
|
300
|
+
```
|
301
|
+
|
302
|
+
## Copy File
|
303
|
+
|
304
|
+
Cloud Files supports copying files. To copy files into a container named "trip" with a name of "europe.jpg" do the following:
|
305
|
+
|
306
|
+
```ruby
|
307
|
+
file.copy("trip", "europe.jpg")
|
308
|
+
```
|
309
|
+
|
310
|
+
To move or rename a file, perform a copy operation and then delete the old file:
|
311
|
+
|
312
|
+
```ruby
|
313
|
+
file.copy("trip", "germany.jpg")
|
314
|
+
file.destroy
|
315
|
+
```
|
316
|
+
|
317
|
+
## Delete File
|
318
|
+
|
319
|
+
To delete a file:
|
320
|
+
|
321
|
+
```ruby
|
322
|
+
file.destroy
|
323
|
+
```
|
324
|
+
## Development
|
325
|
+
|
326
|
+
After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
|
327
|
+
|
328
|
+
To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
|
37
329
|
|
38
330
|
## License
|
39
331
|
|
data/fog-dtdream.gemspec
CHANGED
@@ -9,9 +9,9 @@ Gem::Specification.new do |spec|
|
|
9
9
|
spec.authors = ["dengqinsi"]
|
10
10
|
spec.email = ["dengqs@dtdream.com"]
|
11
11
|
|
12
|
-
spec.summary = %q{
|
13
|
-
spec.description = %q{
|
14
|
-
spec.homepage = "https://
|
12
|
+
spec.summary = %q{Use 'fog' gem to support Aliyun Web Services.}
|
13
|
+
spec.description = %q{As a FOG provider, fog-dtdream support aliyun OSS. Maybe it will support more aliyun services later.}
|
14
|
+
spec.homepage = "https://git.oschina.net/dengqinsi/fog-dtdream.git"
|
15
15
|
spec.license = "MIT"
|
16
16
|
|
17
17
|
spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
@@ -27,5 +27,5 @@ Gem::Specification.new do |spec|
|
|
27
27
|
spec.add_dependency 'fog-json', '~> 1.0'
|
28
28
|
spec.add_dependency 'fog-xml', '~> 0.1'
|
29
29
|
spec.add_dependency 'ipaddress', '~> 0.8'
|
30
|
-
spec.add_dependency '
|
30
|
+
spec.add_dependency 'xml-simple', '~> 1.1'
|
31
31
|
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
class Dtdream < Fog::Bin
|
2
|
+
class << self
|
3
|
+
def class_for(key)
|
4
|
+
case key
|
5
|
+
when :storage
|
6
|
+
Fog::Storage::Dtdream
|
7
|
+
else
|
8
|
+
raise ArgumentError, "Unrecognized service: #{key}"
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
def [](service)
|
13
|
+
@@connections ||= Hash.new do |hash, key|
|
14
|
+
hash[key] = case key
|
15
|
+
when :storage
|
16
|
+
Fog::Logger.warning("Dtdream[:storage] is not recommended, use Storage[:openstack] for portability")
|
17
|
+
Fog::Storage.new(:provider => 'dtdream')
|
18
|
+
else
|
19
|
+
raise ArgumentError, "Unrecognized service: #{key.inspect}"
|
20
|
+
end
|
21
|
+
end
|
22
|
+
@@connections[service]
|
23
|
+
end
|
24
|
+
|
25
|
+
def services
|
26
|
+
Fog::Dtdream.services
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -9,10 +9,13 @@ module Fog
|
|
9
9
|
|
10
10
|
def all
|
11
11
|
containers = service.get_containers()
|
12
|
+
if nil == containers
|
13
|
+
return nil
|
14
|
+
end
|
12
15
|
data = Array.new
|
13
16
|
i = 0
|
14
17
|
containers.each do |entry|
|
15
|
-
key = entry["Prefix"]
|
18
|
+
key = entry["Prefix"][0]
|
16
19
|
key[-1] = ''
|
17
20
|
data[i] = {:key=>key}
|
18
21
|
i = i + 1
|
@@ -12,37 +12,20 @@ module Fog
|
|
12
12
|
requires :key
|
13
13
|
prefix = key+'/'
|
14
14
|
ret = service.list_objects(:prefix=>prefix)["Contents"]
|
15
|
-
|
15
|
+
|
16
|
+
if ret.nil?
|
17
|
+
puts " Not found: Direction not exist!"
|
18
|
+
false
|
19
|
+
elsif ret.size == 1
|
16
20
|
service.delete_container(key)
|
17
21
|
true
|
18
22
|
else
|
19
|
-
|
20
|
-
raise Fog::Storage::Dtdream::NotFound, " Not found: Direction not exist!"
|
21
|
-
elsif ret.size > 1
|
22
|
-
raise Fog::Storage::Dtdream::NotFound, " Forbidden: Direction not empty!"
|
23
|
-
end
|
23
|
+
raise Fog::Storage::Dtdream::Error, " Forbidden: Direction not empty!"
|
24
24
|
false
|
25
25
|
end
|
26
26
|
end
|
27
27
|
|
28
28
|
def files
|
29
|
-
# requires :key
|
30
|
-
# if key != "" && key != "." && key != nil
|
31
|
-
# prefix = key+"/"
|
32
|
-
# end
|
33
|
-
# files = service.list_objects({:prefix => prefix})["Contents"]
|
34
|
-
# data = Array.new
|
35
|
-
# i = 0
|
36
|
-
# files.each do |file|
|
37
|
-
# if file["Key"][0][-1] != "/"
|
38
|
-
# key = file["Key"][0]
|
39
|
-
# data[i] = {:key=>key}
|
40
|
-
# i = i + 1
|
41
|
-
# end
|
42
|
-
# end
|
43
|
-
#
|
44
|
-
# #load(data)
|
45
|
-
# data
|
46
29
|
@files ||= begin
|
47
30
|
Fog::Storage::Dtdream::Files.new(
|
48
31
|
:directory => self,
|
@@ -33,10 +33,17 @@ module Fog
|
|
33
33
|
|
34
34
|
def copy(target_directory_key, target_file_key, options={})
|
35
35
|
requires :directory, :key
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
36
|
+
if directory.key == ""
|
37
|
+
source_object = key
|
38
|
+
else
|
39
|
+
source_object = directory.key+"/"+key
|
40
|
+
end
|
41
|
+
if target_directory_key == ""
|
42
|
+
target_object = target_file_key
|
43
|
+
else
|
44
|
+
target_object = target_directory_key+"/"+target_file_key
|
45
|
+
end
|
46
|
+
service.copy_object(nil, source_object, nil, target_object, options)
|
40
47
|
target_directory = service.directories.new(:key => target_directory_key)
|
41
48
|
target_directory.files.get(target_file_key)
|
42
49
|
end
|
@@ -105,7 +112,13 @@ module Fog
|
|
105
112
|
else
|
106
113
|
object = directory.key+"/"+key
|
107
114
|
end
|
108
|
-
|
115
|
+
if body.is_a?(::File)
|
116
|
+
data = service.put_object(object, body, options).data
|
117
|
+
elsif body.is_a?(String)
|
118
|
+
data = service.put_object_with_body(object, body, options).data
|
119
|
+
else
|
120
|
+
raise Fog::Storage::Dtdream::Error, " Forbidden: Invalid body type: #{body.class}!"
|
121
|
+
end
|
109
122
|
update_attributes_from(data)
|
110
123
|
refresh_metadata
|
111
124
|
|
@@ -176,7 +189,7 @@ module Fog
|
|
176
189
|
end
|
177
190
|
|
178
191
|
def update_attributes_from(data)
|
179
|
-
merge_attributes(data
|
192
|
+
merge_attributes(data[:headers].reject {|key, value| ['Content-Length', 'Content-Type'].include?(key)})
|
180
193
|
end
|
181
194
|
end
|
182
195
|
end
|
@@ -18,22 +18,23 @@ module Fog
|
|
18
18
|
if directory.key != "" && directory.key != "." && directory.key != nil
|
19
19
|
prefix = directory.key+"/"
|
20
20
|
end
|
21
|
-
files = service.list_objects({:prefix => prefix})["
|
21
|
+
files = service.list_objects({:prefix => prefix})["Contents"]
|
22
22
|
data = Array.new
|
23
23
|
i = 0
|
24
24
|
files.each do |file|
|
25
|
-
if file["Key"][-1] != "/"
|
26
|
-
content_length = file["Size"].to_i
|
27
|
-
key = file["Key"]
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
data[i] = {:content_length=>content_length,
|
35
|
-
|
36
|
-
|
25
|
+
if file["Key"][0][-1] != "/"
|
26
|
+
content_length = file["Size"][0].to_i
|
27
|
+
key = file["Key"][0]
|
28
|
+
lastModified = file["LastModified"][0]
|
29
|
+
if lastModified != nil && lastModified != ""
|
30
|
+
last_modified = (Time.parse(lastModified)).localtime
|
31
|
+
else
|
32
|
+
last_modified = nil
|
33
|
+
end
|
34
|
+
data[i] = {:content_length => content_length,
|
35
|
+
:key => key,
|
36
|
+
:last_modified => last_modified,
|
37
|
+
:etag => file["ETag"][0]}
|
37
38
|
i = i + 1
|
38
39
|
end
|
39
40
|
end
|
@@ -69,7 +70,7 @@ module Fog
|
|
69
70
|
|
70
71
|
data = service.head_object(object).data
|
71
72
|
contentLen = data[:headers]["Content-Length"].to_i
|
72
|
-
if data[:status] != 200
|
73
|
+
if data[:status] != 200
|
73
74
|
return nil
|
74
75
|
end
|
75
76
|
lastModified = data[:headers]["Last-Modified"]
|
@@ -83,7 +84,9 @@ module Fog
|
|
83
84
|
file_data = {
|
84
85
|
:content_length => contentLen,
|
85
86
|
:key => key,
|
86
|
-
:last_modified => last_modified
|
87
|
+
:last_modified => last_modified,
|
88
|
+
:content_type => data[:headers]["Content-Type"],
|
89
|
+
:etag => data[:headers]["ETag"]
|
87
90
|
}
|
88
91
|
|
89
92
|
if block_given?
|
@@ -153,7 +156,9 @@ module Fog
|
|
153
156
|
file_data = {
|
154
157
|
:content_length => data[:headers]["Content-Length"].to_i,
|
155
158
|
:key => key,
|
156
|
-
:last_modified => last_modified
|
159
|
+
:last_modified => last_modified,
|
160
|
+
:content_type => data[:headers]["Content-Type"],
|
161
|
+
:etag => data[:headers]["ETag"]
|
157
162
|
}
|
158
163
|
new(file_data)
|
159
164
|
rescue Fog::Storage::Dtdream::NotFound
|
@@ -10,8 +10,12 @@ module Fog
|
|
10
10
|
# * target_container_name<~String> - Name of bucket to create copy in
|
11
11
|
# * target_object_name<~String> - Name for new copy of object
|
12
12
|
# * options<~Hash> - Additional headers options={}
|
13
|
-
def copy_object(source_bucket, source_object, target_bucket, target_object)
|
14
|
-
|
13
|
+
def copy_object(source_bucket, source_object, target_bucket, target_object, options = {})
|
14
|
+
options = options.reject {|key, value| value.nil?}
|
15
|
+
bucket = options[:bucket]
|
16
|
+
bucket ||= @aliyun_oss_bucket
|
17
|
+
source_bucket ||= bucket
|
18
|
+
target_bucket ||= bucket
|
15
19
|
headers = { 'x-oss-copy-source' => "/#{source_bucket}/#{source_object}" }
|
16
20
|
location = get_bucket_location(target_bucket)
|
17
21
|
endpoint = "http://"+location+".aliyuncs.com"
|
@@ -14,7 +14,7 @@ module Fog
|
|
14
14
|
:endpoint => endpoint
|
15
15
|
)
|
16
16
|
xml = ret.data[:body]
|
17
|
-
result =
|
17
|
+
result = XmlSimple.xml_in(xml)
|
18
18
|
end
|
19
19
|
|
20
20
|
def get_bucket_location(bucket)
|
@@ -27,7 +27,7 @@ module Fog
|
|
27
27
|
:bucket => bucket,
|
28
28
|
:resource => resource
|
29
29
|
)
|
30
|
-
location =
|
30
|
+
location = XmlSimple.xml_in(ret.data[:body])
|
31
31
|
end
|
32
32
|
|
33
33
|
def get_bucket_acl(bucket)
|
@@ -43,7 +43,7 @@ module Fog
|
|
43
43
|
:resource => resource,
|
44
44
|
:endpoint => endpoint
|
45
45
|
)
|
46
|
-
acl =
|
46
|
+
acl = XmlSimple.xml_in(ret.data[:body])["AccessControlList"][0]["Grant"][0]
|
47
47
|
end
|
48
48
|
|
49
49
|
#{"AllowedOrigin"=>["1"], "AllowedMethod"=>["DELETE"], "AllowedHeader"=>["1"], "ExposeHeader"=>["1"], "MaxAgeSeconds"=>["1"]}
|
@@ -53,14 +53,18 @@ module Fog
|
|
53
53
|
attribute = '?cors'
|
54
54
|
resource = bucket+'/'+attribute
|
55
55
|
ret = request(
|
56
|
-
:expects => [200, 203],
|
56
|
+
:expects => [200, 203, 404],
|
57
57
|
:method => 'GET',
|
58
58
|
:path => attribute,
|
59
59
|
:bucket => bucket,
|
60
60
|
:resource => resource,
|
61
61
|
:endpoint => endpoint
|
62
62
|
)
|
63
|
-
|
63
|
+
if 404 != ret.data[:status]
|
64
|
+
cors = XmlSimple.xml_in(ret.data[:body])["CORSRule"][0]
|
65
|
+
else
|
66
|
+
nil
|
67
|
+
end
|
64
68
|
end
|
65
69
|
|
66
70
|
#{"ID"=>["651a67ed-5b4f-4d9b-87ae-49dbaaa4b0ad"], "Prefix"=>["1"], "Status"=>["Enabled"], "Expiration"=>[{"Days"=>["30"]}]}
|
@@ -70,14 +74,18 @@ module Fog
|
|
70
74
|
attribute = '?lifecycle'
|
71
75
|
resource = bucket+'/'+attribute
|
72
76
|
ret = request(
|
73
|
-
:expects => [200, 203],
|
77
|
+
:expects => [200, 203, 404],
|
74
78
|
:method => 'GET',
|
75
79
|
:path => attribute,
|
76
80
|
:bucket => bucket,
|
77
81
|
:resource => resource,
|
78
82
|
:endpoint => endpoint
|
79
83
|
)
|
80
|
-
|
84
|
+
if 404 != ret.data[:status]
|
85
|
+
lifecycle = XmlSimple.xml_in(ret.data[:body])["Rule"][0]
|
86
|
+
else
|
87
|
+
nil
|
88
|
+
end
|
81
89
|
end
|
82
90
|
|
83
91
|
#返回log的prefix,如果没有设置log开关,返回nil
|
@@ -94,7 +102,7 @@ module Fog
|
|
94
102
|
:resource => resource,
|
95
103
|
:endpoint => endpoint
|
96
104
|
)
|
97
|
-
logging =
|
105
|
+
logging = XmlSimple.xml_in(ret.data[:body])["LoggingEnabled"][0]["TargetPrefix"]
|
98
106
|
end
|
99
107
|
|
100
108
|
#{"AllowEmptyReferer"=>["true"], "RefererList"=>[{}]}
|
@@ -111,7 +119,7 @@ module Fog
|
|
111
119
|
:resource => resource,
|
112
120
|
:endpoint => endpoint
|
113
121
|
)
|
114
|
-
referer =
|
122
|
+
referer = XmlSimple.xml_in(ret.data[:body])
|
115
123
|
end
|
116
124
|
|
117
125
|
#{"IndexDocument"=>[{"Suffix"=>["abc.html"]}], "ErrorDocument"=>[{"Key"=>["error.html"]}]}
|
@@ -121,14 +129,18 @@ module Fog
|
|
121
129
|
attribute = '?website'
|
122
130
|
resource = bucket+'/'+attribute
|
123
131
|
ret = request(
|
124
|
-
:expects => [200, 203],
|
132
|
+
:expects => [200, 203, 404],
|
125
133
|
:method => 'GET',
|
126
134
|
:path => attribute,
|
127
135
|
:bucket => bucket,
|
128
136
|
:resource => resource,
|
129
137
|
:endpoint => endpoint
|
130
138
|
)
|
131
|
-
|
139
|
+
if 404 != ret.data[:status]
|
140
|
+
website = XmlSimple.xml_in(ret.data[:body])
|
141
|
+
else
|
142
|
+
nil
|
143
|
+
end
|
132
144
|
end
|
133
145
|
|
134
146
|
end
|
@@ -26,7 +26,7 @@ module Fog
|
|
26
26
|
path+="&marker="+marker
|
27
27
|
end
|
28
28
|
if maxKeys
|
29
|
-
path+="&
|
29
|
+
path+="&max-keys="+maxKeys
|
30
30
|
end
|
31
31
|
if delimiter
|
32
32
|
path+="&delimiter="+delimiter
|
@@ -34,13 +34,13 @@ module Fog
|
|
34
34
|
elsif marker
|
35
35
|
path+="?marker="+marker
|
36
36
|
if maxKeys
|
37
|
-
path+="&
|
37
|
+
path+="&max-keys="+maxKeys
|
38
38
|
end
|
39
39
|
if delimiter
|
40
40
|
path+="&delimiter="+delimiter
|
41
41
|
end
|
42
42
|
elsif maxKeys
|
43
|
-
path+="?
|
43
|
+
path+="?max-keys="+maxKeys
|
44
44
|
if delimiter
|
45
45
|
path+="&delimiter="+delimiter
|
46
46
|
end
|
@@ -59,7 +59,7 @@ module Fog
|
|
59
59
|
:bucket => bucket
|
60
60
|
)
|
61
61
|
xml = ret.data[:body]
|
62
|
-
result =
|
62
|
+
result = XmlSimple.xml_in(xml)["CommonPrefixes"]
|
63
63
|
end
|
64
64
|
end
|
65
65
|
|
@@ -29,7 +29,7 @@ module Fog
|
|
29
29
|
path+="&marker="+marker
|
30
30
|
end
|
31
31
|
if maxKeys
|
32
|
-
path+="&
|
32
|
+
path+="&max-keys="+maxKeys
|
33
33
|
end
|
34
34
|
if delimiter
|
35
35
|
path+="&delimiter="+delimiter
|
@@ -38,14 +38,14 @@ module Fog
|
|
38
38
|
elsif marker
|
39
39
|
path+="?marker="+marker
|
40
40
|
if maxKeys
|
41
|
-
path+="&
|
41
|
+
path+="&max-keys="+maxKeys
|
42
42
|
end
|
43
43
|
if delimiter
|
44
44
|
path+="&delimiter="+delimiter
|
45
45
|
end
|
46
46
|
|
47
47
|
elsif maxKeys
|
48
|
-
path+="?
|
48
|
+
path+="?max-keys="+maxKeys
|
49
49
|
if delimiter
|
50
50
|
path+="&delimiter="+delimiter
|
51
51
|
end
|
@@ -64,7 +64,7 @@ module Fog
|
|
64
64
|
:bucket => bucket
|
65
65
|
)
|
66
66
|
xml = ret.data[:body]
|
67
|
-
result =
|
67
|
+
result = XmlSimple.xml_in(xml)["CommonPrefixes"]
|
68
68
|
end
|
69
69
|
end
|
70
70
|
|
@@ -32,65 +32,6 @@ module Fog
|
|
32
32
|
url = "acl is wrong with value:"+acl
|
33
33
|
end
|
34
34
|
end
|
35
|
-
# creates a temporary url
|
36
|
-
#
|
37
|
-
# ==== Parameters
|
38
|
-
# * container<~String> - Name of container containing object
|
39
|
-
# * object<~String> - Name of object to get expiring url for
|
40
|
-
# * expires<~Time> - An expiry time for this url
|
41
|
-
# * method<~String> - The method to use for accessing the object (GET, PUT, HEAD)
|
42
|
-
# * options<~Hash> - An optional options hash
|
43
|
-
# * 'scheme'<~String> - The scheme to use (http, https)
|
44
|
-
# * 'host'<~String> - The host to use
|
45
|
-
# * 'port'<~Integer> - The port to use
|
46
|
-
#
|
47
|
-
# ==== Returns
|
48
|
-
# * response<~Excon::Response>:
|
49
|
-
# * body<~String> - url for object
|
50
|
-
#
|
51
|
-
# ==== See Also
|
52
|
-
# http://docs.rackspace.com/files/api/v1/cf-devguide/content/Create_TempURL-d1a444.html
|
53
|
-
def create_temp_url(container, object, expires, method, options = {})
|
54
|
-
raise ArgumentError, "Insufficient parameters specified." unless (container && object && expires && method)
|
55
|
-
raise ArgumentError, "Storage must be instantiated with the :openstack_temp_url_key option" if @openstack_temp_url_key.nil?
|
56
|
-
|
57
|
-
scheme = options[:scheme] || @scheme
|
58
|
-
host = options[:host] || @host
|
59
|
-
port = options[:port] || @port
|
60
|
-
|
61
|
-
# POST not allowed
|
62
|
-
allowed_methods = %w{GET PUT HEAD}
|
63
|
-
unless allowed_methods.include?(method)
|
64
|
-
raise ArgumentError.new("Invalid method '#{method}' specified. Valid methods are: #{allowed_methods.join(', ')}")
|
65
|
-
end
|
66
|
-
|
67
|
-
expires = expires.to_i
|
68
|
-
object_path_escaped = "#{@path}/#{Fog::OpenStack.escape(container)}/#{Fog::OpenStack.escape(object,"/")}"
|
69
|
-
object_path_unescaped = "#{@path}/#{Fog::OpenStack.escape(container)}/#{object}"
|
70
|
-
string_to_sign = "#{method}\n#{expires}\n#{object_path_unescaped}"
|
71
|
-
|
72
|
-
hmac = Fog::HMAC.new('sha1', @openstack_temp_url_key)
|
73
|
-
sig = sig_to_hex(hmac.sign(string_to_sign))
|
74
|
-
|
75
|
-
temp_url_options = {
|
76
|
-
:scheme => scheme,
|
77
|
-
:host => host,
|
78
|
-
:port => port,
|
79
|
-
:path => object_path_escaped,
|
80
|
-
:query => "temp_url_sig=#{sig}&temp_url_expires=#{expires}"
|
81
|
-
}
|
82
|
-
URI::Generic.build(temp_url_options).to_s
|
83
|
-
end
|
84
|
-
|
85
|
-
private
|
86
|
-
|
87
|
-
def sig_to_hex(str)
|
88
|
-
str.unpack("C*").map { |c|
|
89
|
-
c.to_s(16)
|
90
|
-
}.map { |h|
|
91
|
-
h.size == 1 ? "0#{h}" : h
|
92
|
-
}.join
|
93
|
-
end
|
94
35
|
end
|
95
36
|
|
96
37
|
class Mock
|
@@ -15,17 +15,17 @@ module Fog
|
|
15
15
|
path+="&marker="+marker
|
16
16
|
end
|
17
17
|
if maxKeys
|
18
|
-
path+="&
|
18
|
+
path+="&max-keys="+maxKeys
|
19
19
|
end
|
20
20
|
|
21
21
|
elsif marker
|
22
22
|
path+="?marker="+marker
|
23
23
|
if maxKeys
|
24
|
-
path+="&
|
24
|
+
path+="&max-keys="+maxKeys
|
25
25
|
end
|
26
26
|
|
27
27
|
elsif maxKeys
|
28
|
-
path+="?
|
28
|
+
path+="?max-keys="+maxKeys
|
29
29
|
end
|
30
30
|
|
31
31
|
ret = request(
|
@@ -34,7 +34,7 @@ module Fog
|
|
34
34
|
:path => path
|
35
35
|
)
|
36
36
|
xml = ret.data[:body]
|
37
|
-
result =
|
37
|
+
result = XmlSimple.xml_in(xml)["Buckets"][0]
|
38
38
|
end
|
39
39
|
|
40
40
|
end
|
@@ -18,7 +18,7 @@ module Fog
|
|
18
18
|
path+="&marker="+marker
|
19
19
|
end
|
20
20
|
if maxKeys
|
21
|
-
path+="&
|
21
|
+
path+="&max-keys="+maxKeys
|
22
22
|
end
|
23
23
|
if delimiter
|
24
24
|
path+="&delimiter="+delimiter
|
@@ -27,14 +27,14 @@ module Fog
|
|
27
27
|
elsif marker
|
28
28
|
path+="?marker="+marker
|
29
29
|
if maxKeys
|
30
|
-
path+="&
|
30
|
+
path+="&max-keys="+maxKeys
|
31
31
|
end
|
32
32
|
if delimiter
|
33
33
|
path+="&delimiter="+delimiter
|
34
34
|
end
|
35
35
|
|
36
36
|
elsif maxKeys
|
37
|
-
path+="?
|
37
|
+
path+="?max-keys="+maxKeys
|
38
38
|
if delimiter
|
39
39
|
path+="&delimiter="+delimiter
|
40
40
|
end
|
@@ -53,7 +53,7 @@ module Fog
|
|
53
53
|
:bucket => bucket
|
54
54
|
)
|
55
55
|
xml = ret.data[:body]
|
56
|
-
result =
|
56
|
+
result = XmlSimple.xml_in(xml)
|
57
57
|
end
|
58
58
|
|
59
59
|
def list_multipart_uploads(bucket, endpoint, options = {})
|
@@ -72,7 +72,7 @@ module Fog
|
|
72
72
|
:resource => resource,
|
73
73
|
:endpoint => endpoint
|
74
74
|
)
|
75
|
-
|
75
|
+
uploadid = XmlSimple.xml_in(ret.data[:body])["Upload"]
|
76
76
|
|
77
77
|
end
|
78
78
|
|
@@ -92,7 +92,7 @@ module Fog
|
|
92
92
|
:resource => resource,
|
93
93
|
:endpoint => endpoint
|
94
94
|
)
|
95
|
-
|
95
|
+
parts = XmlSimple.xml_in(ret.data[:body])["Part"]
|
96
96
|
end
|
97
97
|
|
98
98
|
end
|
@@ -19,9 +19,8 @@ module Fog
|
|
19
19
|
end
|
20
20
|
|
21
21
|
#object size ����100M���߷�Ƭ�ϴ���֧�ֶϵ�����
|
22
|
-
if file.size >
|
23
|
-
put_multipart_object(bucket, object, file)
|
24
|
-
return
|
22
|
+
if file.size >104857600
|
23
|
+
return put_multipart_object(bucket, object, file)
|
25
24
|
end
|
26
25
|
|
27
26
|
body = file.read
|
@@ -47,7 +46,7 @@ module Fog
|
|
47
46
|
endpoint = "http://"+location+".aliyuncs.com"
|
48
47
|
|
49
48
|
#object size ����100M���߷�Ƭ�ϴ���֧�ֶϵ�����
|
50
|
-
# if body.size >
|
49
|
+
# if body.size >104857600
|
51
50
|
# put_multipart_object_with_body(bucket, object, body)
|
52
51
|
# return
|
53
52
|
# end
|
@@ -89,7 +88,11 @@ module Fog
|
|
89
88
|
|
90
89
|
#����bucket��uploads�¼����ҵ���Ӧupload�������������upload�¼�
|
91
90
|
uploads = list_multipart_uploads(bucket, endpoint)
|
92
|
-
|
91
|
+
if nil != uploads
|
92
|
+
upload = uploads.find do |tmpupload| tmpupload["Key"][0] == object end
|
93
|
+
else
|
94
|
+
upload = nil
|
95
|
+
end
|
93
96
|
|
94
97
|
parts = nil
|
95
98
|
uploadedSize = 0
|
@@ -143,7 +146,7 @@ module Fog
|
|
143
146
|
:resource => resource,
|
144
147
|
:endpoint => endpoint
|
145
148
|
)
|
146
|
-
uploadid =
|
149
|
+
uploadid = XmlSimple.xml_in(ret.data[:body])["UploadId"][0]
|
147
150
|
end
|
148
151
|
|
149
152
|
def upload_part(bucket, object, endpoint, partNumber, uploadId, body)
|
@@ -178,7 +181,8 @@ module Fog
|
|
178
181
|
part = parts[i]
|
179
182
|
request_part[i] = {"PartNumber"=>part["PartNumber"], "ETag"=>part["ETag"]}
|
180
183
|
end
|
181
|
-
body =
|
184
|
+
body = XmlSimple.xml_out({"Part"=>request_part},'RootName'=>'CompleteMultipartUpload')
|
185
|
+
|
182
186
|
path = object+"?uploadId="+uploadId
|
183
187
|
resource = bucket+'/'+path
|
184
188
|
ret = request(
|
data/lib/fog/dtdream/storage.rb
CHANGED
@@ -1,6 +1,5 @@
|
|
1
1
|
require 'fog/dtdream/core'
|
2
|
-
require
|
3
|
-
require "active_support/core_ext/hash/conversions"
|
2
|
+
require 'xmlsimple'
|
4
3
|
|
5
4
|
module Fog
|
6
5
|
module Storage
|
@@ -108,7 +107,7 @@ module Fog
|
|
108
107
|
if params[:headers]
|
109
108
|
params[:headers].each do |k,v|
|
110
109
|
if k != "Range"
|
111
|
-
headers += "#{k}
|
110
|
+
headers += "#{k}:#{v}\n"
|
112
111
|
end
|
113
112
|
end
|
114
113
|
end
|
data/lib/fog/dtdream/version.rb
CHANGED
data/lib/fog/dtdream.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fog-dtdream
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.7
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- dengqinsi
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-09-
|
11
|
+
date: 2015-09-23 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -109,21 +109,21 @@ dependencies:
|
|
109
109
|
- !ruby/object:Gem::Version
|
110
110
|
version: '0.8'
|
111
111
|
- !ruby/object:Gem::Dependency
|
112
|
-
name:
|
112
|
+
name: xml-simple
|
113
113
|
requirement: !ruby/object:Gem::Requirement
|
114
114
|
requirements:
|
115
115
|
- - "~>"
|
116
116
|
- !ruby/object:Gem::Version
|
117
|
-
version: '
|
117
|
+
version: '1.1'
|
118
118
|
type: :runtime
|
119
119
|
prerelease: false
|
120
120
|
version_requirements: !ruby/object:Gem::Requirement
|
121
121
|
requirements:
|
122
122
|
- - "~>"
|
123
123
|
- !ruby/object:Gem::Version
|
124
|
-
version: '
|
125
|
-
description:
|
126
|
-
later.
|
124
|
+
version: '1.1'
|
125
|
+
description: As a FOG provider, fog-dtdream support aliyun OSS. Maybe it will support
|
126
|
+
more aliyun services later.
|
127
127
|
email:
|
128
128
|
- dengqs@dtdream.com
|
129
129
|
executables: []
|
@@ -135,12 +135,13 @@ files:
|
|
135
135
|
- ".travis.yml"
|
136
136
|
- CODE_OF_CONDUCT.md
|
137
137
|
- Gemfile
|
138
|
-
- LICENSE
|
138
|
+
- LICENSE
|
139
139
|
- README.md
|
140
140
|
- Rakefile
|
141
141
|
- bin/console
|
142
142
|
- bin/setup
|
143
143
|
- fog-dtdream.gemspec
|
144
|
+
- lib/fog/bin/dtdream.rb
|
144
145
|
- lib/fog/dtdream.rb
|
145
146
|
- lib/fog/dtdream/core.rb
|
146
147
|
- lib/fog/dtdream/models/storage/directories.rb
|
@@ -165,7 +166,7 @@ files:
|
|
165
166
|
- lib/fog/dtdream/requests/storage/put_object.rb
|
166
167
|
- lib/fog/dtdream/storage.rb
|
167
168
|
- lib/fog/dtdream/version.rb
|
168
|
-
homepage: https://
|
169
|
+
homepage: https://git.oschina.net/dengqinsi/fog-dtdream.git
|
169
170
|
licenses:
|
170
171
|
- MIT
|
171
172
|
metadata: {}
|
@@ -188,6 +189,6 @@ rubyforge_project:
|
|
188
189
|
rubygems_version: 2.4.8
|
189
190
|
signing_key:
|
190
191
|
specification_version: 4
|
191
|
-
summary:
|
192
|
+
summary: Use 'fog' gem to support Aliyun Web Services.
|
192
193
|
test_files: []
|
193
194
|
has_rdoc:
|