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,22 @@
|
|
1
|
+
module Fog
|
2
|
+
module Parsers
|
3
|
+
module Google
|
4
|
+
module Storage
|
5
|
+
|
6
|
+
class CopyObject < Fog::Parsers::Base
|
7
|
+
|
8
|
+
def end_element(name)
|
9
|
+
case name
|
10
|
+
when 'ETag'
|
11
|
+
@response[name] = @value.gsub('"', '')
|
12
|
+
when 'LastModified'
|
13
|
+
@response[name] = Time.parse(@value)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
module Fog
|
2
|
+
module Parsers
|
3
|
+
module Google
|
4
|
+
module Storage
|
5
|
+
|
6
|
+
class GetBucket < Fog::Parsers::Base
|
7
|
+
|
8
|
+
def reset
|
9
|
+
@object = { 'Owner' => {} }
|
10
|
+
@response = { 'Contents' => [] }
|
11
|
+
end
|
12
|
+
|
13
|
+
def end_element(name)
|
14
|
+
case name
|
15
|
+
when 'Contents'
|
16
|
+
@response['Contents'] << @object
|
17
|
+
@object = { 'Owner' => {} }
|
18
|
+
when 'DisplayName', 'ID'
|
19
|
+
@object['Owner'][name] = @value
|
20
|
+
when 'ETag'
|
21
|
+
@object[name] = @value.gsub('"', '')
|
22
|
+
when 'IsTruncated'
|
23
|
+
if @value == 'true'
|
24
|
+
@response['IsTruncated'] = true
|
25
|
+
else
|
26
|
+
@response['IsTruncated'] = false
|
27
|
+
end
|
28
|
+
when 'LastModified'
|
29
|
+
@object['LastModified'] = Time.parse(@value)
|
30
|
+
when 'Marker', 'Name', 'Prefix'
|
31
|
+
@response[name] = @value
|
32
|
+
when 'MaxKeys'
|
33
|
+
@response['MaxKeys'] = @value.to_i
|
34
|
+
when 'Size'
|
35
|
+
@object['Size'] = @value.to_i
|
36
|
+
when 'Delimeter', 'Key', 'Name', 'StorageClass'
|
37
|
+
@object[name] = @value
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
42
|
+
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
module Fog
|
2
|
+
module Parsers
|
3
|
+
module Google
|
4
|
+
module Storage
|
5
|
+
|
6
|
+
class AccessControlList < Fog::Parsers::Base
|
7
|
+
|
8
|
+
def reset
|
9
|
+
@grant = { 'Grantee' => {} }
|
10
|
+
@response = { 'BucketLoggingStatus' => {} }
|
11
|
+
end
|
12
|
+
|
13
|
+
def end_element(name)
|
14
|
+
case name
|
15
|
+
when 'DisplayName', 'ID'
|
16
|
+
if @in_access_control_list
|
17
|
+
@grant['Grantee'][name] = @value
|
18
|
+
else
|
19
|
+
@response['Owner'][name] = @value
|
20
|
+
end
|
21
|
+
when 'Grant'
|
22
|
+
@response['BucketLoggingStatus']['LoggingEnabled']['TargetGrants'] << @grant
|
23
|
+
@grant = { 'Grantee' => {} }
|
24
|
+
when 'LoggingEnabled'
|
25
|
+
@response['BucketLoggingStatus']['LoggingEnabled'] = { 'TargetGrants' => [] }
|
26
|
+
when 'Permission'
|
27
|
+
@grant[name] = @value
|
28
|
+
when 'TargetBucket', 'TargetPrefix'
|
29
|
+
@response['BucketLoggingStatus'][name] = @value
|
30
|
+
when 'URI'
|
31
|
+
@grant['Grantee'][name] = @value
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,88 @@
|
|
1
|
+
module Fog
|
2
|
+
module Parsers
|
3
|
+
module Google
|
4
|
+
module Storage
|
5
|
+
|
6
|
+
class GetBucketObjectVersions < Fog::Parsers::Base
|
7
|
+
|
8
|
+
def reset
|
9
|
+
@delete_marker = { 'Owner' => {} }
|
10
|
+
@version = { 'Owner' => {} }
|
11
|
+
|
12
|
+
@in_delete_marke = false
|
13
|
+
@in_version = false
|
14
|
+
|
15
|
+
@response = { 'Versions' => [] }
|
16
|
+
end
|
17
|
+
|
18
|
+
def start_element(name, attrs = [])
|
19
|
+
super
|
20
|
+
case name
|
21
|
+
when 'DeleteMarker'
|
22
|
+
@in_delete_marker = true
|
23
|
+
when 'Version'
|
24
|
+
@in_version = true
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def end_element(name)
|
29
|
+
case name
|
30
|
+
when 'DeleteMarker'
|
31
|
+
@response['Versions'] << {'DeleteMarker' => @delete_marker }
|
32
|
+
@delete_marker = { 'Owner' => {} }
|
33
|
+
@in_delete_marker = false
|
34
|
+
when 'Version'
|
35
|
+
@response['Versions'] << {'Version' => @version }
|
36
|
+
@version = { 'Owner' => {} }
|
37
|
+
@in_version = false
|
38
|
+
when 'DisplayName', 'ID'
|
39
|
+
if @in_delete_marker
|
40
|
+
@delete_marker
|
41
|
+
elsif @in_version
|
42
|
+
@version
|
43
|
+
end['Owner'][name] = @value
|
44
|
+
when 'ETag'
|
45
|
+
@version[name] = @value.gsub('"', '')
|
46
|
+
when 'IsLatest'
|
47
|
+
if @in_delete_marker
|
48
|
+
@delete_marker
|
49
|
+
elsif @in_version
|
50
|
+
@version
|
51
|
+
end['IsLatest'] = if @value == 'true'
|
52
|
+
true
|
53
|
+
else
|
54
|
+
false
|
55
|
+
end
|
56
|
+
when 'IsTruncated'
|
57
|
+
if @value == 'true'
|
58
|
+
@response['IsTruncated'] = true
|
59
|
+
else
|
60
|
+
@response['IsTruncated'] = false
|
61
|
+
end
|
62
|
+
when 'LastModified'
|
63
|
+
if @in_delete_marker
|
64
|
+
@delete_marker
|
65
|
+
elsif @in_version
|
66
|
+
@version
|
67
|
+
end['LastModified'] = Time.parse(@value)
|
68
|
+
when 'KeyMarker', 'Name', 'Prefix', 'VersionIdMarker'
|
69
|
+
@response[name] = @value
|
70
|
+
when 'MaxKeys'
|
71
|
+
@response['MaxKeys'] = @value.to_i
|
72
|
+
when 'Size'
|
73
|
+
@version['Size'] = @value.to_i
|
74
|
+
when 'Key', 'Name', 'StorageClass', 'VersionId'
|
75
|
+
if @in_delete_marker
|
76
|
+
@delete_marker
|
77
|
+
elsif @in_version
|
78
|
+
@version
|
79
|
+
end[name] = @value
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
end
|
84
|
+
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
module Fog
|
2
|
+
module Parsers
|
3
|
+
module Google
|
4
|
+
module Storage
|
5
|
+
|
6
|
+
class GetBucketVersioning < Fog::Parsers::Base
|
7
|
+
|
8
|
+
def reset
|
9
|
+
@response = { 'VersioningConfiguration' => {} }
|
10
|
+
end
|
11
|
+
|
12
|
+
def end_element(name)
|
13
|
+
case name
|
14
|
+
when 'Status'
|
15
|
+
@response['VersioningConfiguration'][name] = @value
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module Fog
|
2
|
+
module Parsers
|
3
|
+
module Google
|
4
|
+
module Storage
|
5
|
+
|
6
|
+
class GetRequestPayment < Fog::Parsers::Base
|
7
|
+
|
8
|
+
def end_element(name)
|
9
|
+
case name
|
10
|
+
when 'Payer'
|
11
|
+
@response[name] = @value
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
end
|
16
|
+
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
module Fog
|
2
|
+
module Parsers
|
3
|
+
module Google
|
4
|
+
module Storage
|
5
|
+
|
6
|
+
class GetService < Fog::Parsers::Base
|
7
|
+
|
8
|
+
def reset
|
9
|
+
@bucket = {}
|
10
|
+
@response = { 'Owner' => {}, 'Buckets' => [] }
|
11
|
+
end
|
12
|
+
|
13
|
+
def end_element(name)
|
14
|
+
case name
|
15
|
+
when 'Bucket'
|
16
|
+
@response['Buckets'] << @bucket
|
17
|
+
@bucket = {}
|
18
|
+
when 'CreationDate'
|
19
|
+
@bucket['CreationDate'] = Time.parse(@value)
|
20
|
+
when 'DisplayName', 'ID'
|
21
|
+
@response['Owner'][name] = @value
|
22
|
+
when 'Name'
|
23
|
+
@bucket[name] = @value
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,72 @@
|
|
1
|
+
module Fog
|
2
|
+
module Google
|
3
|
+
class Storage
|
4
|
+
class Real
|
5
|
+
|
6
|
+
require 'fog/google/parsers/storage/copy_object'
|
7
|
+
|
8
|
+
# Copy an object from one Google Storage bucket to another
|
9
|
+
#
|
10
|
+
# ==== Parameters
|
11
|
+
# * source_bucket_name<~String> - Name of source bucket
|
12
|
+
# * source_object_name<~String> - Name of source object
|
13
|
+
# * target_bucket_name<~String> - Name of bucket to create copy in
|
14
|
+
# * target_object_name<~String> - Name for new copy of object
|
15
|
+
# * options<~Hash>:
|
16
|
+
# * 'x-goog-metadata-directive'<~String> - Specifies whether to copy metadata from source or replace with data in request. Must be in ['COPY', 'REPLACE']
|
17
|
+
# * 'x-goog-copy_source-if-match'<~String> - Copies object if its etag matches this value
|
18
|
+
# * 'x-goog-copy_source-if-modified_since'<~Time> - Copies object it it has been modified since this time
|
19
|
+
# * 'x-goog-copy_source-if-none-match'<~String> - Copies object if its etag does not match this value
|
20
|
+
# * 'x-goog-copy_source-if-unmodified-since'<~Time> - Copies object it it has not been modified since this time
|
21
|
+
#
|
22
|
+
# ==== Returns
|
23
|
+
# * response<~Excon::Response>:
|
24
|
+
# * body<~Hash>:
|
25
|
+
# * 'ETag'<~String> - etag of new object
|
26
|
+
# * 'LastModified'<~Time> - date object was last modified
|
27
|
+
#
|
28
|
+
def copy_object(source_bucket_name, source_object_name, target_bucket_name, target_object_name, options = {})
|
29
|
+
headers = { 'x-goog-copy-source' => "/#{source_bucket_name}/#{source_object_name}" }.merge!(options)
|
30
|
+
request({
|
31
|
+
:expects => 200,
|
32
|
+
:headers => headers,
|
33
|
+
:host => "#{target_bucket_name}.#{@host}",
|
34
|
+
:method => 'PUT',
|
35
|
+
:parser => Fog::Parsers::Google::Storage::CopyObject.new,
|
36
|
+
:path => CGI.escape(target_object_name)
|
37
|
+
})
|
38
|
+
end
|
39
|
+
|
40
|
+
end
|
41
|
+
|
42
|
+
class Mock
|
43
|
+
|
44
|
+
def copy_object(source_bucket_name, source_object_name, target_bucket_name, target_object_name, options = {})
|
45
|
+
response = Excon::Response.new
|
46
|
+
source_bucket = @data[:buckets][source_bucket_name]
|
47
|
+
source_object = source_bucket && source_bucket[:objects][source_object_name]
|
48
|
+
target_bucket = @data[:buckets][target_bucket_name]
|
49
|
+
|
50
|
+
if source_object && target_bucket
|
51
|
+
response.status = 200
|
52
|
+
target_object = source_object.dup
|
53
|
+
target_object.merge!({
|
54
|
+
'Name' => target_object_name
|
55
|
+
})
|
56
|
+
target_bucket[:objects][target_object_name] = target_object
|
57
|
+
response.body = {
|
58
|
+
'ETag' => target_object['ETag'],
|
59
|
+
'LastModified' => Time.parse(target_object['LastModified'])
|
60
|
+
}
|
61
|
+
else
|
62
|
+
response.status = 404
|
63
|
+
raise(Excon::Errors.status_error({:expects => 200}, response))
|
64
|
+
end
|
65
|
+
|
66
|
+
response
|
67
|
+
end
|
68
|
+
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
module Fog
|
2
|
+
module Google
|
3
|
+
class Storage
|
4
|
+
class Real
|
5
|
+
|
6
|
+
# Delete an Google Storage bucket
|
7
|
+
#
|
8
|
+
# ==== Parameters
|
9
|
+
# * bucket_name<~String> - name of bucket to delete
|
10
|
+
#
|
11
|
+
# ==== Returns
|
12
|
+
# * response<~Excon::Response>:
|
13
|
+
# * status<~Integer> - 204
|
14
|
+
def delete_bucket(bucket_name)
|
15
|
+
request({
|
16
|
+
:expects => 204,
|
17
|
+
:headers => {},
|
18
|
+
:host => "#{bucket_name}.#{@host}",
|
19
|
+
:method => 'DELETE'
|
20
|
+
})
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
24
|
+
|
25
|
+
class Mock
|
26
|
+
|
27
|
+
def delete_bucket(bucket_name)
|
28
|
+
response = Excon::Response.new
|
29
|
+
if @data[:buckets][bucket_name].nil?
|
30
|
+
response.status = 404
|
31
|
+
raise(Excon::Errors.status_error({:expects => 204}, response))
|
32
|
+
elsif @data[:buckets][bucket_name] && !@data[:buckets][bucket_name][:objects].empty?
|
33
|
+
response.status = 409
|
34
|
+
raise(Excon::Errors.status_error({:expects => 204}, response))
|
35
|
+
else
|
36
|
+
@data[:buckets].delete(bucket_name)
|
37
|
+
response.status = 204
|
38
|
+
end
|
39
|
+
response
|
40
|
+
end
|
41
|
+
|
42
|
+
end
|
43
|
+
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
module Fog
|
2
|
+
module Google
|
3
|
+
class Storage
|
4
|
+
class Real
|
5
|
+
|
6
|
+
# Delete an object from Google Storage
|
7
|
+
#
|
8
|
+
# ==== Parameters
|
9
|
+
# * bucket_name<~String> - Name of bucket containing object to delete
|
10
|
+
# * object_name<~String> - Name of object to delete
|
11
|
+
#
|
12
|
+
# ==== Returns
|
13
|
+
# * response<~Excon::Response>:
|
14
|
+
# * status<~Integer> - 204
|
15
|
+
def delete_object(bucket_name, object_name)
|
16
|
+
request({
|
17
|
+
:expects => 204,
|
18
|
+
:headers => {},
|
19
|
+
:host => "#{bucket_name}.#{@host}",
|
20
|
+
:idempotent => true,
|
21
|
+
:method => 'DELETE',
|
22
|
+
:path => CGI.escape(object_name)
|
23
|
+
})
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
27
|
+
|
28
|
+
class Mock
|
29
|
+
|
30
|
+
def delete_object(bucket_name, object_name)
|
31
|
+
response = Excon::Response.new
|
32
|
+
if bucket = @data[:buckets][bucket_name]
|
33
|
+
if object = bucket[:objects][object_name]
|
34
|
+
response.status = 204
|
35
|
+
bucket[:objects].delete(object_name)
|
36
|
+
else
|
37
|
+
response.status = 404
|
38
|
+
raise(Excon::Errors.status_error({:expects => 204}, response))
|
39
|
+
end
|
40
|
+
else
|
41
|
+
response.status = 404
|
42
|
+
raise(Excon::Errors.status_error({:expects => 204}, response))
|
43
|
+
end
|
44
|
+
response
|
45
|
+
end
|
46
|
+
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|