fog 0.3.21 → 0.3.22

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 CHANGED
@@ -1,10 +1,10 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- fog (0.3.21)
4
+ fog (0.3.22)
5
5
  builder
6
6
  excon (>= 0.2.4)
7
- formatador (>= 0.0.15)
7
+ formatador (>= 0.0.16)
8
8
  json
9
9
  mime-types
10
10
  net-ssh (~> 2.0.23)
@@ -16,7 +16,7 @@ GEM
16
16
  specs:
17
17
  builder (2.1.2)
18
18
  excon (0.2.4)
19
- formatador (0.0.15)
19
+ formatador (0.0.16)
20
20
  gestalt (0.0.11)
21
21
  formatador (>= 0.0.12)
22
22
  json (1.4.6)
@@ -26,8 +26,8 @@ GEM
26
26
  rake (0.8.7)
27
27
  rspec (1.3.1)
28
28
  ruby-hmac (0.4.0)
29
- shindo (0.1.9)
30
- formatador (>= 0.0.14)
29
+ shindo (0.1.10)
30
+ formatador (>= 0.0.16)
31
31
  gestalt (>= 0.0.11)
32
32
 
33
33
  PLATFORMS
@@ -37,7 +37,7 @@ DEPENDENCIES
37
37
  builder
38
38
  excon (>= 0.2.4)
39
39
  fog!
40
- formatador (>= 0.0.15)
40
+ formatador (>= 0.0.16)
41
41
  json
42
42
  mime-types
43
43
  net-ssh (~> 2.0.23)
@@ -45,4 +45,4 @@ DEPENDENCIES
45
45
  rake
46
46
  rspec (= 1.3.1)
47
47
  ruby-hmac
48
- shindo (= 0.1.9)
48
+ shindo (= 0.1.10)
data/fog.gemspec CHANGED
@@ -7,8 +7,8 @@ Gem::Specification.new do |s|
7
7
  ## If your rubyforge_project name is different, then edit it and comment out
8
8
  ## the sub! line in the Rakefile
9
9
  s.name = 'fog'
10
- s.version = '0.3.21'
11
- s.date = '2010-11-17'
10
+ s.version = '0.3.22'
11
+ s.date = '2010-11-18'
12
12
  s.rubyforge_project = 'fog'
13
13
 
14
14
  ## Make sure your summary is short. The description may be as long
@@ -44,7 +44,7 @@ Gem::Specification.new do |s|
44
44
  ## that are needed for an end user to actually USE your code.
45
45
  s.add_dependency('builder')
46
46
  s.add_dependency('excon', '>=0.2.4')
47
- s.add_dependency('formatador', '>=0.0.15')
47
+ s.add_dependency('formatador', '>=0.0.16')
48
48
  s.add_dependency('json')
49
49
  s.add_dependency('mime-types')
50
50
  s.add_dependency('net-ssh', '~>2.0.23')
@@ -55,7 +55,7 @@ Gem::Specification.new do |s|
55
55
  ## those that are only needed during development
56
56
  s.add_development_dependency('rake')
57
57
  s.add_development_dependency('rspec', '1.3.1')
58
- s.add_development_dependency('shindo', '0.1.9')
58
+ s.add_development_dependency('shindo', '0.1.10')
59
59
 
60
60
  ## Leave this section as-is. It will be automatically generated from the
61
61
  ## contents of your Git repository via the gemspec task. DO NOT REMOVE
data/lib/fog.rb CHANGED
@@ -18,7 +18,7 @@ module Fog
18
18
  @mocking = false
19
19
 
20
20
  unless const_defined?(:VERSION)
21
- VERSION = '0.3.21'
21
+ VERSION = '0.3.22'
22
22
  end
23
23
 
24
24
  module Mock
@@ -10,7 +10,7 @@ module Fog
10
10
 
11
11
  attr_accessor :architecture
12
12
  attribute :ami_launch_index, :aliases => 'amiLaunchIndex'
13
- attribute :availability_zone, :aliases => 'availabilityZone'
13
+ attribute :availability_zone, :aliases => ['availabilityZone', 'placement']
14
14
  attribute :block_device_mapping, :aliases => 'blockDeviceMapping'
15
15
  attribute :client_token, :aliases => 'clientToken'
16
16
  attribute :dns_name, :aliases => 'dnsName'
@@ -51,6 +51,15 @@ module Fog
51
51
  connection.addresses(:server => self)
52
52
  end
53
53
 
54
+ remove_method :availability_zone=
55
+ def availability_zone=(new_availability_zone)
56
+ if new_availability_zone.is_a?(Hash)
57
+ @availability_zone = new_availability_zone['availabilityZone']
58
+ else
59
+ @availability_zone = new_availability_zone
60
+ end
61
+ end
62
+
54
63
  def console_output
55
64
  requires :id
56
65
 
@@ -96,14 +105,6 @@ module Fog
96
105
  end
97
106
  end
98
107
 
99
- def placement=(new_placement)
100
- if new_placement.is_a?(Hash)
101
- @availability_zone = new_placement['availabilityZone']
102
- else
103
- @availability_zone = new_placement
104
- end
105
- end
106
-
107
108
  def private_key_path
108
109
  @private_key_path ||= Fog.credentials[:private_key_path]
109
110
  @private_key_path &&= File.expand_path(@private_key_path)
@@ -67,11 +67,18 @@ module Fog
67
67
  end
68
68
  end
69
69
 
70
+ def public=(new_public)
71
+ if new_public
72
+ @acl = 'public-read'
73
+ else
74
+ @acl = 'private'
75
+ end
76
+ new_public
77
+ end
78
+
70
79
  def public_url
71
80
  requires :directory, :key
72
- if directory.public_url
73
- "#{directory.public_url}/#{key}"
74
- elsif connection.get_object_acl(directory.key, key).body['AccessControlList'].detect {|grant| grant['Grantee']['URI'] == 'http://acs.amazonaws.com/groups/global/AllUsers' && grant['Permission'] == 'READ'}
81
+ if connection.get_object_acl(directory.key, key).body['AccessControlList'].detect {|grant| grant['Grantee']['URI'] == 'http://acs.amazonaws.com/groups/global/AllUsers' && grant['Permission'] == 'READ'}
75
82
  if directory.key.to_s =~ /^(?:[a-z]|\d(?!\d{0,2}(?:\.\d{1,3}){3}$))(?:[a-z0-9]|\.(?![\.\-])|\-(?![\.])){1,61}[a-z0-9]$/
76
83
  "https://#{directory.key}.s3.amazonaws.com/#{key}"
77
84
  else
@@ -49,7 +49,15 @@ module Fog
49
49
  class Mock # :nodoc:all
50
50
 
51
51
  def get_bucket_acl(bucket_name)
52
- Fog::Mock.not_implemented
52
+ response = Excon::Response.new
53
+ if acl = @data[:acls][:bucket][bucket_name]
54
+ response.status = 200
55
+ response.body = acl
56
+ else
57
+ response.status = 404
58
+ raise(Excon::Errors.status_error({:expects => 200}, response))
59
+ end
60
+ response
53
61
  end
54
62
 
55
63
  end
@@ -60,7 +60,15 @@ module Fog
60
60
  class Mock # :nodoc:all
61
61
 
62
62
  def get_object_acl(bucket_name, object_name)
63
- Fog::Mock.not_implemented
63
+ response = Excon::Response.new
64
+ if acl = @data[:acls][:object][bucket_name] && @data[:acls][:object][bucket_name][object_name]
65
+ response.status = 200
66
+ response.body = acl
67
+ else
68
+ response.status = 404
69
+ raise(Excon::Errors.status_error({:expects => 200}, response))
70
+ end
71
+ response
64
72
  end
65
73
 
66
74
  end
@@ -44,6 +44,13 @@ DATA
44
44
  class Mock # :nodoc:all
45
45
 
46
46
  def put_bucket(bucket_name, options = {})
47
+ if options['x-amz-acl']
48
+ unless ['private', 'public-read', 'public-read-write', 'authenticated-read']
49
+ raise Excon::Errors::BadRequest.new('invalid x-amz-acl')
50
+ else
51
+ @data[:acls][:bucket][bucket_name] = self.class.acls(options['x-amz-acl'])
52
+ end
53
+ end
47
54
  response = Excon::Response.new
48
55
  response.status = 200
49
56
  bucket = {
@@ -47,6 +47,14 @@ module Fog
47
47
  class Mock # :nodoc:all
48
48
 
49
49
  def put_object(bucket_name, object_name, data, options = {})
50
+ if options['x-amz-acl']
51
+ unless ['private', 'public-read', 'public-read-write', 'authenticated-read']
52
+ raise Excon::Errors::BadRequest.new('invalid x-amz-acl')
53
+ else
54
+ @data[:acls][:object][bucket_name] ||= {}
55
+ @data[:acls][:object][bucket_name][object_name] = self.class.acls(options['x-amz-acl'])
56
+ end
57
+ end
50
58
  data = parse_data(data)
51
59
  unless data[:body].is_a?(String)
52
60
  data[:body] = data[:body].read
@@ -87,10 +87,56 @@ module Fog
87
87
  class Mock
88
88
  include Utils
89
89
 
90
+ def self.acls(type)
91
+ case type
92
+ when 'private'
93
+ @private ||= {
94
+ "AccessControlList" => [
95
+ {
96
+ "Permission" => "FULL_CONTROL",
97
+ "Grantee" => {"DisplayName" => "me", "ID" => "2744ccd10c7533bd736ad890f9dd5cab2adb27b07d500b9493f29cdc420cb2e0"}
98
+ }
99
+ ],
100
+ "Owner" => {"DisplayName" => "me", "ID" => "2744ccd10c7533bd736ad890f9dd5cab2adb27b07d500b9493f29cdc420cb2e0"}
101
+ }
102
+ when 'public-read'
103
+ @public_read ||= begin
104
+ public_read = self.acls('private').dup
105
+ public_read['AccessControlList'] << {
106
+ "Permission" => "READ",
107
+ "Grantee" => {"URI" => "http://acs.amazonaws.com/groups/global/AllUsers"}
108
+ }
109
+ public_read
110
+ end
111
+ when 'public-read-write'
112
+ @public_read_write ||= begin
113
+ public_read_write = self.acls('public-read').dup
114
+ public_read_write['AccessControlList'] << {
115
+ "Permission" => "WRITE",
116
+ "Grantee" => {"URI" => "http://acs.amazonaws.com/groups/global/AllUsers"}
117
+ }
118
+ public_read_write
119
+ end
120
+ when 'authenticated-read'
121
+ @authenticated_read ||= begin
122
+ authenticated_read = self.acls('private').dup
123
+ authenticated_read['AccessControlList'] << {
124
+ "Permission" => "READ",
125
+ "Grantee" => {"URI" => "http://acs.amazonaws.com/groups/global/AuthenticatedUsers"}
126
+ }
127
+ authenticated_read
128
+ end
129
+ end
130
+ end
131
+
90
132
  def self.data
91
133
  @data ||= Hash.new do |hash, region|
92
134
  hash[region] = Hash.new do |region_hash, key|
93
135
  region_hash[key] = {
136
+ :acls => {
137
+ :bucket => {},
138
+ :object => {}
139
+ },
94
140
  :buckets => {}
95
141
  }
96
142
  end
@@ -142,7 +142,7 @@ module Fog
142
142
  attributes[aliased_key] = value
143
143
  send("#{aliased_key}=", value)
144
144
  elsif (public_methods | private_methods).detect {|method| ["#{key}=", :"#{key}="].include?(method)}
145
- attributes[key] = value
145
+ attributes[key.to_sym] = value
146
146
  send("#{key}=", value)
147
147
  else
148
148
  attributes[key] = value
@@ -70,13 +70,20 @@ module Fog
70
70
  end
71
71
  end
72
72
 
73
+ def public=(new_public)
74
+ if new_public
75
+ @acl = 'public-read'
76
+ else
77
+ @acl = 'private'
78
+ end
79
+ new_public
80
+ end
81
+
73
82
  def public_url
74
83
  requires :directory, :key
75
- if directory.public_url
76
- "#{directory.public_url}/#{key}"
77
- elsif connection.get_object_acl(directory.key, key).body['AccessControlList'].detect {|entry| entry['Scope']['type'] == 'AllUsers' && entry['Permission'] == 'READ'}
84
+ if connection.get_object_acl(directory.key, key).body['AccessControlList'].detect {|entry| entry['Scope']['type'] == 'AllUsers' && entry['Permission'] == 'READ'}
78
85
  if directory.key.to_s =~ /^(?:[a-z]|\d(?!\d{0,2}(?:\.\d{1,3}){3}$))(?:[a-z0-9]|\.(?![\.\-])|\-(?![\.])){1,61}[a-z0-9]$/
79
- "https://#{directory.key}.commondatastorage.googleapis/#{key}"
86
+ "https://#{directory.key}.commondatastorage.googleapis.com/#{key}"
80
87
  else
81
88
  "https://commondatastorage.googleapis.com/#{directory.key}/#{key}"
82
89
  end
@@ -46,7 +46,15 @@ module Fog
46
46
  class Mock
47
47
 
48
48
  def get_bucket_acl(bucket_name)
49
- Fog::Mock.not_implemented
49
+ response = Excon::Response.new
50
+ if acl = @data[:acls][:bucket][bucket_name]
51
+ response.status = 200
52
+ response.body = acl
53
+ else
54
+ response.status = 404
55
+ raise(Excon::Errors.status_error({:expects => 200}, response))
56
+ end
57
+ response
50
58
  end
51
59
 
52
60
  end
@@ -57,7 +57,15 @@ module Fog
57
57
  class Mock
58
58
 
59
59
  def get_object_acl(bucket_name, object_name)
60
- Fog::Mock.not_implemented
60
+ response = Excon::Response.new
61
+ if acl = @data[:acls][:object][bucket_name] && @data[:acls][:object][bucket_name][object_name]
62
+ response.status = 200
63
+ response.body = acl
64
+ else
65
+ response.status = 404
66
+ raise(Excon::Errors.status_error({:expects => 200}, response))
67
+ end
68
+ response
61
69
  end
62
70
 
63
71
  end
@@ -40,6 +40,13 @@ DATA
40
40
  class Mock
41
41
 
42
42
  def put_bucket(bucket_name, options = {})
43
+ if options['x-goog-acl']
44
+ unless ['private', 'public-read', 'public-read-write', 'authenticated-read']
45
+ raise Excon::Errors::BadRequest.new('invalid x-goog-acl')
46
+ else
47
+ @data[:acls][:bucket][bucket_name] = self.class.acls(options['x-goog-acl'])
48
+ end
49
+ end
43
50
  response = Excon::Response.new
44
51
  response.status = 200
45
52
  bucket = {
@@ -12,13 +12,14 @@ module Fog
12
12
  # * ID<~String>: id of owner
13
13
  # * DisplayName<~String>: display name of owner
14
14
  # * AccessControlList<~Array>:
15
- # * Grantee<~Hash>:
16
- # * 'DisplayName'<~String> - Display name of grantee
15
+ # * scope<~Hash>:
16
+ # * 'type'<~String> - 'UserById'
17
17
  # * 'ID'<~String> - Id of grantee
18
18
  # or
19
+ # * 'type'<~String> - 'UserByEmail'
19
20
  # * 'EmailAddress'<~String> - Email address of grantee
20
21
  # or
21
- # * 'URI'<~String> - URI of group to grant access for
22
+ # * 'type'<~String> - type of user to grant permission to
22
23
  # * Permission<~String> - Permission, in [FULL_CONTROL, WRITE, WRITE_ACP, READ, READ_ACP]
23
24
  def put_bucket_acl(bucket_name, acl)
24
25
  data =
@@ -42,6 +42,14 @@ module Fog
42
42
  class Mock
43
43
 
44
44
  def put_object(bucket_name, object_name, data, options = {})
45
+ if options['x-goog-acl']
46
+ unless ['private', 'public-read', 'public-read-write', 'authenticated-read']
47
+ raise Excon::Errors::BadRequest.new('invalid x-goog-acl')
48
+ else
49
+ @data[:acls][:object][bucket_name] ||= {}
50
+ @data[:acls][:object][bucket_name][object_name] = self.class.acls(options['x-goog-acl'])
51
+ end
52
+ end
45
53
  data = parse_data(data)
46
54
  unless data[:body].is_a?(String)
47
55
  data[:body] = data[:body].read
@@ -64,9 +64,55 @@ module Fog
64
64
  class Mock
65
65
  include Utils
66
66
 
67
+ def self.acls(type)
68
+ case type
69
+ when 'private'
70
+ @private ||= {
71
+ "AccessControlList"=> [
72
+ {
73
+ "Permission" => "FULL_CONTROL",
74
+ "Scope" => {"ID" => "2744ccd10c7533bd736ad890f9dd5cab2adb27b07d500b9493f29cdc420cb2e0", "type" => "UserById"}
75
+ }
76
+ ],
77
+ "Owner" => {"ID" => "2744ccd10c7533bd736ad890f9dd5cab2adb27b07d500b9493f29cdc420cb2e0"}
78
+ }
79
+ when 'public-read'
80
+ @public_read ||= begin
81
+ public_read = self.acls('private').dup
82
+ public_read['AccessControlList'] << {
83
+ "Permission" => "READ",
84
+ "Scope" => {"type" => "AllUsers"}
85
+ }
86
+ public_read
87
+ end
88
+ when 'public-read-write'
89
+ @public_read_write ||= begin
90
+ public_read_write = self.acls('private').dup
91
+ public_read_write['AccessControlList'] << {
92
+ "Permission" => "WRITE",
93
+ "Scope" => {"type" => "AllUsers"}
94
+ }
95
+ public_read_write
96
+ end
97
+ when 'authenticated-read'
98
+ @authenticated_read ||= begin
99
+ authenticated_read = self.acls('private').dup
100
+ authenticated_read['AccessControlList'] << {
101
+ "Permission" => "READ",
102
+ "Scope" => {"type" => "AllAuthenticatedUsers"}
103
+ }
104
+ authenticated_read
105
+ end
106
+ end
107
+ end
108
+
67
109
  def self.data
68
110
  @data ||= Hash.new do |hash, key|
69
111
  hash[key] = {
112
+ :acls => {
113
+ :bucket => {},
114
+ :object => {}
115
+ },
70
116
  :buckets => {}
71
117
  }
72
118
  end
@@ -31,6 +31,10 @@ module Fog
31
31
  true
32
32
  end
33
33
 
34
+ def public=(new_public)
35
+ new_public
36
+ end
37
+
34
38
  def public_url
35
39
  nil
36
40
  end
@@ -41,6 +41,10 @@ module Fog
41
41
  end
42
42
  end
43
43
 
44
+ def public=(new_public)
45
+ new_public
46
+ end
47
+
44
48
  def public_url
45
49
  requires :directory, :key
46
50
  if @directory.public_url
@@ -1,14 +1,22 @@
1
1
  def file_tests(connection, params = {}, mocks_implemented = true)
2
2
 
3
- params = {:key => 'fog_file_tests', :body => lorem_file}.merge!(params)
3
+ params = {:key => 'fog_file_tests', :body => lorem_file, :public => true}.merge!(params)
4
4
 
5
5
  if !Fog.mocking? || mocks_implemented
6
6
  @directory = connection.directories.create(:key => 'fogfilestests')
7
7
 
8
8
  model_tests(@directory.files, params, mocks_implemented) do
9
9
 
10
- tests("#respond_to?(:public_url)").succeeds do
11
- @instance.respond_to?(:public_url)
10
+ responds_to(:public_url)
11
+
12
+ tests("#public=(true)").succeeds do
13
+ pending if Fog.mocking? && !mocks_implemented
14
+ @instance.public=(true)
15
+ end
16
+
17
+ test("@instance.public_url.nil? || Excon.get(@instance.public_url).body == lorem_file.read") do
18
+ pending if Fog.mocking?
19
+ @instance.public_url.nil? || Excon.get(@instance.public_url).body == lorem_file.read
12
20
  end
13
21
 
14
22
  end
metadata CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
5
5
  segments:
6
6
  - 0
7
7
  - 3
8
- - 21
9
- version: 0.3.21
8
+ - 22
9
+ version: 0.3.22
10
10
  platform: ruby
11
11
  authors:
12
12
  - geemus (Wesley Beary)
@@ -14,7 +14,7 @@ autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
16
 
17
- date: 2010-11-17 00:00:00 -08:00
17
+ date: 2010-11-18 00:00:00 -08:00
18
18
  default_executable: fog
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
@@ -53,8 +53,8 @@ dependencies:
53
53
  segments:
54
54
  - 0
55
55
  - 0
56
- - 15
57
- version: 0.0.15
56
+ - 16
57
+ version: 0.0.16
58
58
  requirement: *id003
59
59
  name: formatador
60
60
  - !ruby/object:Gem::Dependency
@@ -158,8 +158,8 @@ dependencies:
158
158
  segments:
159
159
  - 0
160
160
  - 1
161
- - 9
162
- version: 0.1.9
161
+ - 10
162
+ version: 0.1.10
163
163
  requirement: *id011
164
164
  name: shindo
165
165
  description: The Ruby cloud computing library.