fog 0.3.1 → 0.3.2
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.
- data/Gemfile.lock +1 -1
- data/README.rdoc +1 -0
- data/fog.gemspec +44 -1
- data/lib/fog.rb +2 -1
- data/lib/fog/bin.rb +2 -0
- data/lib/fog/google.rb +22 -0
- data/lib/fog/google/bin.rb +20 -0
- data/lib/fog/google/models/storage/directories.rb +43 -0
- data/lib/fog/google/models/storage/directory.rb +48 -0
- data/lib/fog/google/models/storage/file.rb +87 -0
- data/lib/fog/google/models/storage/files.rb +94 -0
- data/lib/fog/google/parsers/storage/access_control_list.rb +46 -0
- data/lib/fog/google/parsers/storage/copy_object.rb +22 -0
- data/lib/fog/google/parsers/storage/get_bucket.rb +46 -0
- data/lib/fog/google/parsers/storage/get_bucket_logging.rb +40 -0
- data/lib/fog/google/parsers/storage/get_bucket_object_versions.rb +88 -0
- data/lib/fog/google/parsers/storage/get_bucket_versioning.rb +24 -0
- data/lib/fog/google/parsers/storage/get_request_payment.rb +20 -0
- data/lib/fog/google/parsers/storage/get_service.rb +32 -0
- data/lib/fog/google/requests/storage/copy_object.rb +72 -0
- data/lib/fog/google/requests/storage/delete_bucket.rb +46 -0
- data/lib/fog/google/requests/storage/delete_object.rb +50 -0
- data/lib/fog/google/requests/storage/get_bucket.rb +110 -0
- data/lib/fog/google/requests/storage/get_bucket_acl.rb +55 -0
- data/lib/fog/google/requests/storage/get_object.rb +104 -0
- data/lib/fog/google/requests/storage/get_object_acl.rb +66 -0
- data/lib/fog/google/requests/storage/get_object_torrent.rb +55 -0
- data/lib/fog/google/requests/storage/get_object_url.rb +54 -0
- data/lib/fog/google/requests/storage/get_service.rb +53 -0
- data/lib/fog/google/requests/storage/head_object.rb +64 -0
- data/lib/fog/google/requests/storage/put_bucket.rb +68 -0
- data/lib/fog/google/requests/storage/put_bucket_acl.rb +80 -0
- data/lib/fog/google/requests/storage/put_object.rb +71 -0
- data/lib/fog/google/requests/storage/put_object_url.rb +54 -0
- data/lib/fog/google/storage.rb +192 -0
- data/spec/google/models/storage/directories_spec.rb +49 -0
- data/spec/google/models/storage/directory_spec.rb +83 -0
- data/spec/google/models/storage/file_spec.rb +121 -0
- data/spec/google/models/storage/files_spec.rb +141 -0
- data/spec/google/requests/storage/copy_object_spec.rb +61 -0
- data/spec/google/requests/storage/delete_bucket_spec.rb +35 -0
- data/spec/google/requests/storage/delete_object_spec.rb +38 -0
- data/spec/google/requests/storage/get_bucket_spec.rb +110 -0
- data/spec/google/requests/storage/get_object_spec.rb +58 -0
- data/spec/google/requests/storage/get_service_spec.rb +32 -0
- data/spec/google/requests/storage/head_object_spec.rb +26 -0
- data/spec/google/requests/storage/put_bucket_spec.rb +21 -0
- data/spec/google/requests/storage/put_object_spec.rb +43 -0
- metadata +45 -2
@@ -0,0 +1,49 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../../../spec_helper'
|
2
|
+
|
3
|
+
describe 'Fog::Google::Storage::Directories' do
|
4
|
+
|
5
|
+
describe "#all" do
|
6
|
+
|
7
|
+
it "should include persisted directories" do
|
8
|
+
@directory = Google[:storage].directories.create(:key => 'fogdirectorykey')
|
9
|
+
Google[:storage].directories.all.map {|directory| @directory.key}.should include('fogdirectorykey')
|
10
|
+
@directory.destroy
|
11
|
+
end
|
12
|
+
|
13
|
+
end
|
14
|
+
|
15
|
+
describe "#create" do
|
16
|
+
|
17
|
+
it "should exist on google storage" do
|
18
|
+
directory = Google[:storage].directories.create(:key => 'fogdirectorykey')
|
19
|
+
Google[:storage].directories.get(directory.key).should_not be_nil
|
20
|
+
directory.destroy
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
24
|
+
|
25
|
+
describe "#get" do
|
26
|
+
|
27
|
+
it "should return a Fog::Google::Storage::Directory if a matching directory exists" do
|
28
|
+
directory = Google[:storage].directories.create(:key => 'fogdirectorykey')
|
29
|
+
get = Google[:storage].directories.get('fogdirectorykey')
|
30
|
+
directory.attributes.should == get.attributes
|
31
|
+
directory.destroy
|
32
|
+
end
|
33
|
+
|
34
|
+
it "should return nil if no matching directory exists" do
|
35
|
+
Google[:storage].directories.get('fognotadirectory').should be_nil
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|
39
|
+
|
40
|
+
describe "#reload" do
|
41
|
+
|
42
|
+
it "should reload data" do
|
43
|
+
directories = Google[:storage].directories
|
44
|
+
directories.should == directories.reload
|
45
|
+
end
|
46
|
+
|
47
|
+
end
|
48
|
+
|
49
|
+
end
|
@@ -0,0 +1,83 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../../../spec_helper'
|
2
|
+
require File.dirname(__FILE__) + '/../../../../lib/fog/google/models/storage/directory'
|
3
|
+
|
4
|
+
describe 'Fog::Google::Storage::Directory' do
|
5
|
+
|
6
|
+
describe "#initialize" do
|
7
|
+
|
8
|
+
it "should remap attributes from parser" do
|
9
|
+
now = Time.now
|
10
|
+
directory = Fog::Google::Storage::Directory.new(
|
11
|
+
'CreationDate' => now,
|
12
|
+
'Name' => 'directorykey'
|
13
|
+
)
|
14
|
+
directory.creation_date.should == now
|
15
|
+
directory.key.should == 'directorykey'
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
19
|
+
|
20
|
+
describe "#collection" do
|
21
|
+
|
22
|
+
it "should be the directories the directory is related to" do
|
23
|
+
directories = Google[:storage].directories
|
24
|
+
directories.new.collection.should == directories
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
28
|
+
|
29
|
+
describe "#destroy" do
|
30
|
+
|
31
|
+
it "should return true if the directory is deleted" do
|
32
|
+
directory = Google[:storage].directories.create(:key => 'fogmodeldirectory')
|
33
|
+
directory.destroy.should be_true
|
34
|
+
end
|
35
|
+
|
36
|
+
it "should return false if the directory does not exist" do
|
37
|
+
directory = Google[:storage].directories.new(:key => 'fogmodeldirectory')
|
38
|
+
directory.destroy.should be_false
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
42
|
+
|
43
|
+
describe "#reload" do
|
44
|
+
|
45
|
+
before(:each) do
|
46
|
+
@directory = Google[:storage].directories.create(:key => 'fogmodeldirectory')
|
47
|
+
@reloaded = @directory.reload
|
48
|
+
end
|
49
|
+
|
50
|
+
after(:each) do
|
51
|
+
@directory.destroy
|
52
|
+
end
|
53
|
+
|
54
|
+
it "should reset attributes to remote state" do
|
55
|
+
@directory.attributes.should == @reloaded.attributes
|
56
|
+
end
|
57
|
+
|
58
|
+
end
|
59
|
+
|
60
|
+
describe "#save" do
|
61
|
+
|
62
|
+
before(:each) do
|
63
|
+
@directory = Google[:storage].directories.new(:key => 'fogmodeldirectory')
|
64
|
+
end
|
65
|
+
|
66
|
+
it "should not exist in directories before save" do
|
67
|
+
Google[:storage].directories.all.map {|directory| directory.key}.include?(@directory.key).should be_false
|
68
|
+
end
|
69
|
+
|
70
|
+
it "should return true when it succeeds" do
|
71
|
+
@directory.save.should be_true
|
72
|
+
@directory.destroy
|
73
|
+
end
|
74
|
+
|
75
|
+
it "should exist in directories after save" do
|
76
|
+
@directory.save
|
77
|
+
Google[:storage].directories.all.map {|directory| directory.key}.include?(@directory.key).should be_true
|
78
|
+
@directory.destroy
|
79
|
+
end
|
80
|
+
|
81
|
+
end
|
82
|
+
|
83
|
+
end
|
@@ -0,0 +1,121 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../../../spec_helper'
|
2
|
+
|
3
|
+
describe 'Fog::Google::Storage::File' do
|
4
|
+
|
5
|
+
before(:each) do
|
6
|
+
@directory = Google[:storage].directories.create(:key => 'fogdirectoryname')
|
7
|
+
end
|
8
|
+
|
9
|
+
after(:each) do
|
10
|
+
@directory.destroy
|
11
|
+
end
|
12
|
+
|
13
|
+
describe "#initialize" do
|
14
|
+
|
15
|
+
it "should remap attributes from parser" do
|
16
|
+
now = Time.now
|
17
|
+
directory = Fog::Google::Storage::File.new(
|
18
|
+
'Content-Length' => 10,
|
19
|
+
'Content-Type' => 'contenttype',
|
20
|
+
'Etag' => 'etag',
|
21
|
+
'Key' => 'key',
|
22
|
+
'Last-Modified' => now,
|
23
|
+
'Size' => 10,
|
24
|
+
'StorageClass' => 'storageclass'
|
25
|
+
)
|
26
|
+
directory.content_length == 10
|
27
|
+
directory.content_type.should == 'contenttype'
|
28
|
+
directory.etag.should == 'etag'
|
29
|
+
directory.key.should == 'key'
|
30
|
+
directory.last_modified.should == now
|
31
|
+
directory.size.should == 10
|
32
|
+
directory.storage_class.should == 'storageclass'
|
33
|
+
|
34
|
+
directory = Fog::Google::Storage::File.new(
|
35
|
+
'ETag' => 'etag',
|
36
|
+
'LastModified' => now
|
37
|
+
)
|
38
|
+
directory.etag.should == 'etag'
|
39
|
+
directory.last_modified.should == now
|
40
|
+
end
|
41
|
+
|
42
|
+
end
|
43
|
+
|
44
|
+
describe "#directory" do
|
45
|
+
|
46
|
+
it "should be the directory the file is related to" do
|
47
|
+
@file = @directory.files.new(:key => 'foo')
|
48
|
+
@file.directory.should == @directory
|
49
|
+
end
|
50
|
+
|
51
|
+
end
|
52
|
+
|
53
|
+
describe "#copy" do
|
54
|
+
|
55
|
+
it "should return a Fog::Google::Storage::File with matching attributes" do
|
56
|
+
other_directory = Google[:storage].directories.create(:key => 'fogotherdirectoryname')
|
57
|
+
data = File.open(File.dirname(__FILE__) + '/../../../lorem.txt', 'r')
|
58
|
+
file = @directory.files.create(:key => 'fogfilename', :body => data)
|
59
|
+
other_file = file.copy('fogotherdirectoryname', 'fogotherfilename')
|
60
|
+
file.reload.attributes.reject{|key,value| [:key, :last_modified].include?(key)}.should == other_file.reload.attributes.reject{|key,value| [:key, :last_modified].include?(key)}
|
61
|
+
other_file.destroy
|
62
|
+
file.destroy
|
63
|
+
other_directory.destroy
|
64
|
+
end
|
65
|
+
|
66
|
+
end
|
67
|
+
|
68
|
+
describe "#destroy" do
|
69
|
+
|
70
|
+
it "should return true if the file is deleted" do
|
71
|
+
data = File.open(File.dirname(__FILE__) + '/../../../lorem.txt', 'r')
|
72
|
+
file = @directory.files.create(:key => 'fogfilename', :body => data)
|
73
|
+
file.destroy.should be_true
|
74
|
+
end
|
75
|
+
|
76
|
+
it "should return true if the file does not exist" do
|
77
|
+
file = @directory.files.new(:key => 'fogfilename')
|
78
|
+
file.destroy.should be_true
|
79
|
+
end
|
80
|
+
|
81
|
+
end
|
82
|
+
|
83
|
+
describe "#reload" do
|
84
|
+
|
85
|
+
it "should reset attributes to remote state" do
|
86
|
+
data = File.open(File.dirname(__FILE__) + '/../../../lorem.txt', 'r')
|
87
|
+
file = @directory.files.create(:key => 'fogfilename', :body => data)
|
88
|
+
file.last_modified = Time.now
|
89
|
+
file.reload.attributes.should == file.attributes
|
90
|
+
file.destroy
|
91
|
+
end
|
92
|
+
|
93
|
+
end
|
94
|
+
|
95
|
+
describe "#save" do
|
96
|
+
|
97
|
+
it "should return the success value" do
|
98
|
+
data = File.open(File.dirname(__FILE__) + '/../../../lorem.txt', 'r')
|
99
|
+
file = @directory.files.new(:key => 'fogfilename', :body => data)
|
100
|
+
file.save.should be_true
|
101
|
+
file.destroy
|
102
|
+
end
|
103
|
+
|
104
|
+
end
|
105
|
+
|
106
|
+
# describe "#url" do
|
107
|
+
#
|
108
|
+
# it "should return a signed expiring url" do
|
109
|
+
# data = File.open(File.dirname(__FILE__) + '/../../../lorem.txt', 'r')
|
110
|
+
# file = @directory.files.create(:key => 'fogfilename', :body => data)
|
111
|
+
# url = file.url(Time.now + 60 * 10)
|
112
|
+
# url.should include("fogfilename", "Expires")
|
113
|
+
# unless Fog.mocking?
|
114
|
+
# open(url).read.should == File.open(File.dirname(__FILE__) + '/../../../lorem.txt', 'r').read
|
115
|
+
# end
|
116
|
+
# file.destroy
|
117
|
+
# end
|
118
|
+
#
|
119
|
+
# end
|
120
|
+
|
121
|
+
end
|
@@ -0,0 +1,141 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../../../spec_helper'
|
2
|
+
require 'pp'
|
3
|
+
|
4
|
+
describe 'Fog::Google::Storage::Files' do
|
5
|
+
|
6
|
+
before(:each) do
|
7
|
+
dirname = "fogdirname"
|
8
|
+
# dirname = "fog#{Time.now.to_f}"
|
9
|
+
@directory = Google[:storage].directories.create(:key => dirname)
|
10
|
+
end
|
11
|
+
|
12
|
+
after(:each) do
|
13
|
+
until @directory.files.reload.empty?
|
14
|
+
@directory.files.each {|file| file.destroy}
|
15
|
+
end
|
16
|
+
@directory.destroy
|
17
|
+
end
|
18
|
+
|
19
|
+
describe "#initialize" do
|
20
|
+
|
21
|
+
it "should remap attributes from parser" do
|
22
|
+
files = Fog::Google::Storage::Files.new(
|
23
|
+
'IsTruncated' => true,
|
24
|
+
'Marker' => 'marker',
|
25
|
+
'MaxKeys' => 1,
|
26
|
+
'Prefix' => 'prefix'
|
27
|
+
)
|
28
|
+
files.is_truncated.should == true
|
29
|
+
files.marker.should == 'marker'
|
30
|
+
files.max_keys.should == 1
|
31
|
+
files.prefix.should == 'prefix'
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|
35
|
+
|
36
|
+
describe "#all" do
|
37
|
+
|
38
|
+
it "should return nil if the directory does not exist" do
|
39
|
+
directory = Google[:storage].directories.new(:key => 'notadirectory')
|
40
|
+
directory.files.all.should be_nil
|
41
|
+
end
|
42
|
+
|
43
|
+
it "should return 10 files and report truncated" do
|
44
|
+
10.times do |n|
|
45
|
+
@directory.files.create(:key => "file-#{n}")
|
46
|
+
end
|
47
|
+
response = @directory.files.all
|
48
|
+
response.should have(10).items
|
49
|
+
response.is_truncated.should_not be_true
|
50
|
+
end
|
51
|
+
|
52
|
+
# it "should limit the max_keys to 10" do
|
53
|
+
# 10.times do |n|
|
54
|
+
# @directory.files.create(:key => "file-#{n}")
|
55
|
+
# end
|
56
|
+
# response = @directory.files.all(:max_keys => 20)
|
57
|
+
# response.should have(10).items
|
58
|
+
# response.max_keys.should == 20
|
59
|
+
# response.is_truncated.should be_true
|
60
|
+
# end
|
61
|
+
|
62
|
+
end
|
63
|
+
|
64
|
+
describe "#create" do
|
65
|
+
|
66
|
+
it "should exist on google storage" do
|
67
|
+
data = File.open(File.dirname(__FILE__) + '/../../../lorem.txt', 'r')
|
68
|
+
file = @directory.files.create(:key => 'fogfilename', :body => data)
|
69
|
+
@directory.files.get('fogfilename').should_not be_nil
|
70
|
+
file.destroy
|
71
|
+
end
|
72
|
+
|
73
|
+
end
|
74
|
+
|
75
|
+
describe "#get" do
|
76
|
+
|
77
|
+
before(:each) do
|
78
|
+
@data = File.open(File.dirname(__FILE__) + '/../../../lorem.txt', 'r')
|
79
|
+
@file = @directory.files.create(:key => 'fogfilename', :body => @data)
|
80
|
+
end
|
81
|
+
|
82
|
+
after(:each) do
|
83
|
+
@file.destroy
|
84
|
+
end
|
85
|
+
|
86
|
+
it "should return a Fog::Google::Storage::File with metadata and data" do
|
87
|
+
@file.reload
|
88
|
+
@file.body.should_not be_nil
|
89
|
+
# @file.content_length.should_not be_nil
|
90
|
+
@file.etag.should_not be_nil
|
91
|
+
@file.last_modified.should_not be_nil
|
92
|
+
@file.destroy
|
93
|
+
end
|
94
|
+
|
95
|
+
it "should return chunked data if given a block" do
|
96
|
+
data = ''
|
97
|
+
@directory.files.get('fogfilename') do |chunk|
|
98
|
+
data << chunk
|
99
|
+
end
|
100
|
+
data.should == File.open(File.dirname(__FILE__) + '/../../../lorem.txt', 'r').read
|
101
|
+
end
|
102
|
+
|
103
|
+
end
|
104
|
+
|
105
|
+
describe "#get_url" do
|
106
|
+
|
107
|
+
it "should return a url" do
|
108
|
+
data = File.open(File.dirname(__FILE__) + '/../../../lorem.txt', 'r')
|
109
|
+
file = @directory.files.new(:key => 'fogfilename', :body => data)
|
110
|
+
file.save({'x-goog-acl' => 'public-read'})
|
111
|
+
url = @directory.files.get_url('fogfilename', Time.now + 60 * 10)
|
112
|
+
unless Fog.mocking?
|
113
|
+
open(url).read.should == File.open(File.dirname(__FILE__) + '/../../../lorem.txt', 'r').read
|
114
|
+
end
|
115
|
+
file.destroy
|
116
|
+
end
|
117
|
+
|
118
|
+
end
|
119
|
+
|
120
|
+
describe "#head" do
|
121
|
+
|
122
|
+
it "should return a Fog::Google::Storage::File with metadata" do
|
123
|
+
data = File.open(File.dirname(__FILE__) + '/../../../lorem.txt', 'r')
|
124
|
+
file = @directory.files.create(:key => 'fogfilename', :body => data)
|
125
|
+
file = @directory.files.get('fogfilename')
|
126
|
+
file.etag.should_not be_nil
|
127
|
+
file.last_modified.should_not be_nil
|
128
|
+
file.destroy
|
129
|
+
end
|
130
|
+
|
131
|
+
end
|
132
|
+
|
133
|
+
describe "#reload" do
|
134
|
+
|
135
|
+
it "should reload data" do
|
136
|
+
@directory.files.reload.should == @directory.files
|
137
|
+
end
|
138
|
+
|
139
|
+
end
|
140
|
+
|
141
|
+
end
|
@@ -0,0 +1,61 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../../../spec_helper'
|
2
|
+
|
3
|
+
describe 'Storage.copy_object' do
|
4
|
+
describe 'success' do
|
5
|
+
|
6
|
+
before(:each) do
|
7
|
+
Google[:storage].put_bucket('fogcopyobjectsource')
|
8
|
+
Google[:storage].put_object('fogcopyobjectsource', 'fog_copy_object_source', lorem_file)
|
9
|
+
Google[:storage].put_bucket('fogcopyobjectdestination')
|
10
|
+
end
|
11
|
+
|
12
|
+
after(:each) do
|
13
|
+
Google[:storage].delete_object('fogcopyobjectdestination', 'fog_copy_object_destination')
|
14
|
+
Google[:storage].delete_bucket('fogcopyobjectdestination')
|
15
|
+
Google[:storage].delete_object('fogcopyobjectsource', 'fog_copy_object_source')
|
16
|
+
Google[:storage].delete_bucket('fogcopyobjectsource')
|
17
|
+
end
|
18
|
+
|
19
|
+
it 'should return proper attributes' do
|
20
|
+
actual = Google[:storage].copy_object(
|
21
|
+
'fogcopyobjectsource', 'fog_copy_object_source',
|
22
|
+
'fogcopyobjectdestination', 'fog_copy_object_destination'
|
23
|
+
)
|
24
|
+
actual.status.should == 200
|
25
|
+
actual.body['ETag'].should be_a(String)
|
26
|
+
actual.body['LastModified'].should be_a(Time)
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
30
|
+
describe 'failure' do
|
31
|
+
|
32
|
+
it 'should raise a NotFound error if the source_bucket does not exist' do
|
33
|
+
lambda {
|
34
|
+
Google[:storage].copy_object(
|
35
|
+
'fognotabucket', 'fog_copy_object_source',
|
36
|
+
'fogcopyobjectdestination', 'fog_copy_object_destination'
|
37
|
+
)
|
38
|
+
}.should raise_error(Excon::Errors::NotFound)
|
39
|
+
end
|
40
|
+
|
41
|
+
it 'should raise a NotFound error if the source_object does not exist' do
|
42
|
+
lambda {
|
43
|
+
Google[:storage].copy_object(
|
44
|
+
'fogcopyobjectsource', 'fog_not_an_object',
|
45
|
+
'fogcopyobjectdestination', 'fog_copy_object_destination'
|
46
|
+
)
|
47
|
+
}.should raise_error(Excon::Errors::NotFound)
|
48
|
+
end
|
49
|
+
|
50
|
+
it 'should raise a NotFound error if the target_bucket does not exist' do
|
51
|
+
lambda {
|
52
|
+
Google[:storage].copy_object(
|
53
|
+
'fogcopyobjectsource', 'fog_copy_object_source',
|
54
|
+
'fognotabucket', 'fog_copy_object_destination'
|
55
|
+
)
|
56
|
+
}.should raise_error(Excon::Errors::NotFound)
|
57
|
+
end
|
58
|
+
|
59
|
+
end
|
60
|
+
|
61
|
+
end
|