fog 0.3.17 → 0.3.18

Sign up to get free protection for your applications and to get access to all the features.
Files changed (180) hide show
  1. data/Gemfile.lock +5 -5
  2. data/README.rdoc +16 -7
  3. data/fog.gemspec +102 -27
  4. data/lib/fog.rb +3 -2
  5. data/lib/fog/aws/cdn.rb +2 -1
  6. data/lib/fog/aws/compute.rb +3 -2
  7. data/lib/fog/aws/iam.rb +8 -0
  8. data/lib/fog/aws/models/compute/flavors.rb +2 -1
  9. data/lib/fog/aws/models/compute/server.rb +3 -0
  10. data/lib/fog/aws/models/compute/volume.rb +9 -8
  11. data/lib/fog/aws/models/storage/file.rb +24 -14
  12. data/lib/fog/aws/models/storage/files.rb +4 -14
  13. data/lib/fog/aws/parsers/cdn/distribution.rb +16 -1
  14. data/lib/fog/aws/parsers/cdn/get_distribution_list.rb +13 -0
  15. data/lib/fog/aws/parsers/compute/describe_volumes.rb +2 -0
  16. data/lib/fog/aws/parsers/iam/create_group.rb +2 -2
  17. data/lib/fog/aws/parsers/iam/create_user.rb +26 -0
  18. data/lib/fog/aws/parsers/iam/list_group_policies.rb +28 -0
  19. data/lib/fog/aws/parsers/iam/list_groups.rb +1 -1
  20. data/lib/fog/aws/parsers/storage/complete_multipart_upload.rb +24 -0
  21. data/lib/fog/aws/parsers/storage/initiate_multipart_upload.rb +24 -0
  22. data/lib/fog/aws/parsers/storage/list_multipart_uploads.rb +56 -0
  23. data/lib/fog/aws/parsers/storage/list_parts.rb +40 -0
  24. data/lib/fog/aws/requests/cdn/get_distribution.rb +11 -1
  25. data/lib/fog/aws/requests/cdn/get_distribution_list.rb +9 -1
  26. data/lib/fog/aws/requests/cdn/post_distribution.rb +16 -5
  27. data/lib/fog/aws/requests/cdn/put_distribution_config.rb +102 -0
  28. data/lib/fog/aws/requests/compute/describe_volumes.rb +1 -0
  29. data/lib/fog/aws/requests/compute/run_instances.rb +1 -1
  30. data/lib/fog/aws/requests/iam/add_user_to_group.rb +42 -0
  31. data/lib/fog/aws/requests/iam/create_group.rb +7 -3
  32. data/lib/fog/aws/requests/iam/create_user.rb +47 -0
  33. data/lib/fog/aws/requests/iam/delete_group.rb +5 -1
  34. data/lib/fog/aws/requests/iam/delete_group_policy.rb +42 -0
  35. data/lib/fog/aws/requests/iam/delete_user.rb +40 -0
  36. data/lib/fog/aws/requests/iam/list_group_policies.rb +47 -0
  37. data/lib/fog/aws/requests/iam/list_groups.rb +9 -4
  38. data/lib/fog/aws/requests/iam/put_group_policy.rb +44 -0
  39. data/lib/fog/aws/requests/iam/remove_user_from_group.rb +42 -0
  40. data/lib/fog/aws/requests/simpledb/put_attributes.rb +2 -2
  41. data/lib/fog/aws/requests/storage/abort_multipart_upload.rb +38 -0
  42. data/lib/fog/aws/requests/storage/complete_multipart_upload.rb +60 -0
  43. data/lib/fog/aws/requests/storage/get_service.rb +1 -1
  44. data/lib/fog/aws/requests/storage/initiate_multipart_upload.rb +55 -0
  45. data/lib/fog/aws/requests/storage/list_multipart_uploads.rb +68 -0
  46. data/lib/fog/aws/requests/storage/list_parts.rb +67 -0
  47. data/lib/fog/aws/requests/storage/put_object.rb +12 -5
  48. data/lib/fog/aws/requests/storage/upload_part.rb +51 -0
  49. data/lib/fog/aws/storage.rb +12 -6
  50. data/lib/fog/brightbox.rb +7 -0
  51. data/lib/fog/brightbox/bin.rb +23 -0
  52. data/lib/fog/brightbox/compute.rb +134 -0
  53. data/lib/fog/brightbox/models/compute/account.rb +51 -0
  54. data/lib/fog/brightbox/models/compute/cloud_ip.rb +43 -0
  55. data/lib/fog/brightbox/models/compute/cloud_ips.rb +34 -0
  56. data/lib/fog/brightbox/models/compute/flavor.rb +33 -0
  57. data/lib/fog/brightbox/models/compute/flavors.rb +28 -0
  58. data/lib/fog/brightbox/models/compute/image.rb +52 -0
  59. data/lib/fog/brightbox/models/compute/images.rb +28 -0
  60. data/lib/fog/brightbox/models/compute/server.rb +94 -0
  61. data/lib/fog/brightbox/models/compute/servers.rb +29 -0
  62. data/lib/fog/brightbox/models/compute/user.rb +39 -0
  63. data/lib/fog/brightbox/models/compute/users.rb +29 -0
  64. data/lib/fog/brightbox/models/compute/zone.rb +21 -0
  65. data/lib/fog/brightbox/models/compute/zones.rb +29 -0
  66. data/lib/fog/brightbox/requests/compute/create_api_client.rb +27 -0
  67. data/lib/fog/brightbox/requests/compute/create_cloud_ip.rb +27 -0
  68. data/lib/fog/brightbox/requests/compute/create_image.rb +27 -0
  69. data/lib/fog/brightbox/requests/compute/create_server.rb +27 -0
  70. data/lib/fog/brightbox/requests/compute/destroy_api_client.rb +28 -0
  71. data/lib/fog/brightbox/requests/compute/destroy_cloud_ip.rb +28 -0
  72. data/lib/fog/brightbox/requests/compute/destroy_image.rb +28 -0
  73. data/lib/fog/brightbox/requests/compute/destroy_server.rb +28 -0
  74. data/lib/fog/brightbox/requests/compute/get_account.rb +27 -0
  75. data/lib/fog/brightbox/requests/compute/get_api_client.rb +28 -0
  76. data/lib/fog/brightbox/requests/compute/get_cloud_ip.rb +28 -0
  77. data/lib/fog/brightbox/requests/compute/get_image.rb +28 -0
  78. data/lib/fog/brightbox/requests/compute/get_interface.rb +28 -0
  79. data/lib/fog/brightbox/requests/compute/get_server.rb +28 -0
  80. data/lib/fog/brightbox/requests/compute/get_server_type.rb +28 -0
  81. data/lib/fog/brightbox/requests/compute/get_user.rb +28 -0
  82. data/lib/fog/brightbox/requests/compute/get_zone.rb +28 -0
  83. data/lib/fog/brightbox/requests/compute/list_api_clients.rb +27 -0
  84. data/lib/fog/brightbox/requests/compute/list_cloud_ips.rb +27 -0
  85. data/lib/fog/brightbox/requests/compute/list_images.rb +27 -0
  86. data/lib/fog/brightbox/requests/compute/list_server_types.rb +27 -0
  87. data/lib/fog/brightbox/requests/compute/list_servers.rb +27 -0
  88. data/lib/fog/brightbox/requests/compute/list_users.rb +27 -0
  89. data/lib/fog/brightbox/requests/compute/list_zones.rb +27 -0
  90. data/lib/fog/brightbox/requests/compute/map_cloud_ip.rb +28 -0
  91. data/lib/fog/brightbox/requests/compute/reset_ftp_password_account.rb +27 -0
  92. data/lib/fog/brightbox/requests/compute/resize_server.rb +27 -0
  93. data/lib/fog/brightbox/requests/compute/shutdown_server.rb +28 -0
  94. data/lib/fog/brightbox/requests/compute/snapshot_server.rb +28 -0
  95. data/lib/fog/brightbox/requests/compute/start_server.rb +28 -0
  96. data/lib/fog/brightbox/requests/compute/stop_server.rb +28 -0
  97. data/lib/fog/brightbox/requests/compute/unmap_cloud_ip.rb +28 -0
  98. data/lib/fog/brightbox/requests/compute/update_account.rb +28 -0
  99. data/lib/fog/brightbox/requests/compute/update_api_client.rb +29 -0
  100. data/lib/fog/brightbox/requests/compute/update_image.rb +29 -0
  101. data/lib/fog/brightbox/requests/compute/update_server.rb +29 -0
  102. data/lib/fog/brightbox/requests/compute/update_user.rb +29 -0
  103. data/lib/fog/core/attributes.rb +3 -3
  104. data/lib/fog/core/bin.rb +2 -0
  105. data/lib/fog/core/compute.rb +5 -2
  106. data/lib/fog/core/credentials.rb +2 -0
  107. data/lib/fog/core/service.rb +24 -12
  108. data/lib/fog/google/models/storage/file.rb +23 -14
  109. data/lib/fog/google/models/storage/files.rb +4 -14
  110. data/lib/fog/google/requests/storage/get_bucket.rb +0 -1
  111. data/lib/fog/google/requests/storage/put_object.rb +9 -2
  112. data/lib/fog/rackspace/models/storage/file.rb +3 -3
  113. data/lib/fog/rackspace/models/storage/files.rb +5 -13
  114. data/spec/aws/models/compute/server_spec.rb +0 -3
  115. data/spec/aws/requests/simpledb/get_attributes_spec.rb +11 -0
  116. data/spec/core/attributes_spec.rb +52 -0
  117. data/spec/vcloud/bin_spec.rb +1 -1
  118. data/spec/vcloud/vcloud_spec.rb +1 -1
  119. data/tests/aws/models/compute/flavors_tests.rb +5 -0
  120. data/tests/aws/models/compute/server_tests.rb +6 -0
  121. data/tests/aws/models/compute/servers_tests.rb +6 -0
  122. data/tests/aws/requests/storage/bucket_tests.rb +1 -1
  123. data/tests/aws/requests/storage/multipart_upload_tests.rb +135 -0
  124. data/tests/bluebox/models/compute/flavors_tests.rb +5 -0
  125. data/tests/bluebox/models/compute/server_tests.rb +5 -0
  126. data/tests/bluebox/models/compute/servers_tests.rb +6 -0
  127. data/tests/brightbox/helper.rb +0 -0
  128. data/tests/brightbox/models/compute/flavors_tests.rb +5 -0
  129. data/tests/brightbox/models/compute/server_tests.rb +6 -0
  130. data/tests/brightbox/models/compute/servers_tests.rb +6 -0
  131. data/tests/google/requests/storage/bucket_tests.rb +78 -0
  132. data/tests/google/requests/storage/object_tests.rb +81 -0
  133. data/tests/helper.rb +19 -4
  134. data/tests/helpers/collection_tests.rb +51 -0
  135. data/tests/helpers/compute/flavors_tests.rb +34 -0
  136. data/tests/helpers/compute/server_tests.rb +19 -0
  137. data/tests/helpers/compute/servers_tests.rb +11 -0
  138. data/tests/helpers/model_tests.rb +28 -0
  139. data/tests/helpers/storage/directories_tests.rb +4 -36
  140. data/tests/helpers/storage/directory_tests.rb +8 -22
  141. data/tests/helpers/storage/file_tests.rb +8 -25
  142. data/tests/helpers/storage/files_tests.rb +5 -39
  143. data/tests/local/models/storage/directories_tests.rb +1 -1
  144. data/tests/local/models/storage/directory_tests.rb +1 -1
  145. data/tests/local/models/storage/file_tests.rb +1 -1
  146. data/tests/local/models/storage/files_tests.rb +1 -1
  147. data/tests/rackspace/models/compute/flavors_tests.rb +5 -0
  148. data/tests/rackspace/models/compute/server_tests.rb +6 -0
  149. data/tests/rackspace/models/compute/servers_tests.rb +6 -0
  150. data/tests/rackspace/models/storage/directories_tests.rb +1 -1
  151. data/tests/rackspace/models/storage/directory_tests.rb +1 -1
  152. data/tests/rackspace/models/storage/file_tests.rb +1 -1
  153. data/tests/rackspace/models/storage/files_tests.rb +1 -1
  154. data/tests/slicehost/models/compute/flavors_tests.rb +5 -0
  155. data/tests/slicehost/models/compute/server_tests.rb +6 -0
  156. data/tests/slicehost/models/compute/servers_tests.rb +6 -0
  157. metadata +108 -31
  158. data/spec/aws/models/compute/flavors_spec.rb +0 -14
  159. data/spec/aws/models/compute/servers_spec.rb +0 -21
  160. data/spec/bluebox/models/compute/flavors_spec.rb +0 -17
  161. data/spec/bluebox/models/compute/server_spec.rb +0 -29
  162. data/spec/bluebox/models/compute/servers_spec.rb +0 -31
  163. data/spec/google/requests/storage/copy_object_spec.rb +0 -61
  164. data/spec/google/requests/storage/delete_bucket_spec.rb +0 -35
  165. data/spec/google/requests/storage/delete_object_spec.rb +0 -38
  166. data/spec/google/requests/storage/get_bucket_spec.rb +0 -110
  167. data/spec/google/requests/storage/get_object_spec.rb +0 -58
  168. data/spec/google/requests/storage/get_service_spec.rb +0 -32
  169. data/spec/google/requests/storage/head_object_spec.rb +0 -26
  170. data/spec/google/requests/storage/put_bucket_spec.rb +0 -21
  171. data/spec/google/requests/storage/put_object_spec.rb +0 -43
  172. data/spec/rackspace/models/compute/flavors_spec.rb +0 -18
  173. data/spec/rackspace/models/compute/server_spec.rb +0 -55
  174. data/spec/rackspace/models/compute/servers_spec.rb +0 -22
  175. data/spec/shared_examples/flavors_examples.rb +0 -16
  176. data/spec/shared_examples/server_examples.rb +0 -43
  177. data/spec/shared_examples/servers_examples.rb +0 -37
  178. data/spec/slicehost/models/compute/flavors_spec.rb +0 -18
  179. data/spec/slicehost/models/compute/server_spec.rb +0 -55
  180. data/spec/slicehost/models/compute/servers_spec.rb +0 -26
@@ -0,0 +1,29 @@
1
+ module Fog
2
+ module Brightbox
3
+ class Compute
4
+ class Real
5
+
6
+ def update_server(identifier, options = {})
7
+ return nil if identifier.nil? || identifier == ""
8
+ return nil if options.empty? || options.nil?
9
+ request(
10
+ :expects => [200],
11
+ :method => 'PUT',
12
+ :path => "/1.0/servers/#{identifier}",
13
+ :headers => {"Content-Type" => "application/json"},
14
+ :body => options.to_json
15
+ )
16
+ end
17
+
18
+ end
19
+
20
+ class Mock
21
+
22
+ def update_server(identifier, options = {})
23
+ Fog::Mock.not_implemented
24
+ end
25
+
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,29 @@
1
+ module Fog
2
+ module Brightbox
3
+ class Compute
4
+ class Real
5
+
6
+ def update_user(identifier, options = {})
7
+ return nil if identifier.nil? || identifier == ""
8
+ return nil if options.empty? || options.nil?
9
+ request(
10
+ :expects => [200],
11
+ :method => 'PUT',
12
+ :path => "/1.0/users/#{identifier}",
13
+ :headers => {"Content-Type" => "application/json"},
14
+ :body => options.to_json
15
+ )
16
+ end
17
+
18
+ end
19
+
20
+ class Mock
21
+
22
+ def update_user(identifier, options = {})
23
+ Fog::Mock.not_implemented
24
+ end
25
+
26
+ end
27
+ end
28
+ end
29
+ end
@@ -51,7 +51,7 @@ module Fog
51
51
  when :time
52
52
  class_eval <<-EOS, __FILE__, __LINE__
53
53
  def #{name}=(new_#{name})
54
- if new_#{name}.nil? || new_#{name}.is_a?(Time)
54
+ if new_#{name}.nil? || new_#{name} == "" || new_#{name}.is_a?(Time)
55
55
  @#{name} = new_#{name}
56
56
  else
57
57
  @#{name} = Time.parse(new_#{name})
@@ -73,8 +73,8 @@ module Fog
73
73
  class_eval <<-EOS, __FILE__, __LINE__
74
74
  def #{name}=(new_data)
75
75
  if new_data.is_a?(Hash)
76
- if new_data[:#{squash}]
77
- @#{name} = new_data[:#{squash}]
76
+ if new_data[:#{squash}] || new_data["#{squash}"]
77
+ @#{name} = new_data[:#{squash}] || new_data["#{squash}"]
78
78
  else
79
79
  @#{name} = [ new_data ]
80
80
  end
@@ -7,6 +7,7 @@ module Fog
7
7
  [
8
8
  ::AWS,
9
9
  ::Bluebox,
10
+ ::Brightbox,
10
11
  ::GoGrid,
11
12
  ::Google,
12
13
  ::Linode,
@@ -68,6 +69,7 @@ end
68
69
 
69
70
  require 'fog/aws/bin'
70
71
  require 'fog/bluebox/bin'
72
+ require 'fog/brightbox/bin'
71
73
  require 'fog/go_grid/bin'
72
74
  require 'fog/google/bin'
73
75
  require 'fog/linode/bin'
@@ -1,5 +1,5 @@
1
1
  module Fog
2
- class Storage
2
+ class Compute
3
3
 
4
4
  def self.new(attributes)
5
5
  case provider = attributes.delete(:provider)
@@ -9,6 +9,9 @@ module Fog
9
9
  when 'Bluebox'
10
10
  require 'fog/bluebox'
11
11
  Fog::Bluebox::Compute.new(attributes)
12
+ when 'Brightbox'
13
+ require 'fog/brightbox'
14
+ Fog::Brightbox::Compute.new(attributes)
12
15
  when 'GoGrid'
13
16
  require 'fog/go_grid'
14
17
  Fog::GoGrid::Compute.new(attributes)
@@ -25,7 +28,7 @@ module Fog
25
28
  require 'fog/slicehost'
26
29
  Fog::Slicehost::Compute.new(attributes)
27
30
  else
28
- raise ArgumentError.new("#{provider} is not a recognized storage provider")
31
+ raise ArgumentError.new("#{provider} is not a recognized compute provider")
29
32
  end
30
33
  end
31
34
 
@@ -34,6 +34,8 @@ module Fog
34
34
  :aws_secret_access_key: INTENTIONALLY_LEFT_BLANK
35
35
  :bluebox_api_key: INTENTIONALLY_LEFT_BLANK
36
36
  :bluebox_customer_id: INTENTIONALLY_LEFT_BLANK
37
+ :brightbox_client_id: INTENTIONALLY_LEFT_BLANK
38
+ :brightbox_secret: INTENTIONALLY_LEFT_BLANK
37
39
  :go_grid_api_key: INTENTIONALLY_LEFT_BLANK
38
40
  :go_grid_shared_secret: INTENTIONALLY_LEFT_BLANK
39
41
  :local_root: INTENTIONALLY_LEFT_BLANK
@@ -40,18 +40,7 @@ module Fog
40
40
  options = default_credentials.merge(options)
41
41
  end
42
42
 
43
- missing = []
44
- for requirement in requirements
45
- missing << requirement unless options[requirement]
46
- end
47
- unless missing.empty?
48
- if missing.length == 1
49
- raise(ArgumentError, [missing.first, "is required for this service"].join(' '))
50
- else
51
- raise(ArgumentError, [missing[0...-1].join(", "), 'and', missing[-1], 'are required for this service'].join(' '))
52
- end
53
- end
54
-
43
+ validate_arguments(options)
55
44
  setup_requirements
56
45
 
57
46
  if Fog.mocking?
@@ -129,10 +118,33 @@ module Fog
129
118
  @requirements ||= []
130
119
  end
131
120
 
121
+ def recognizes(*args)
122
+ recognized.concat(args)
123
+ end
124
+
125
+ def recognized
126
+ @recognized ||= []
127
+ end
128
+
132
129
  def reset_data(keys=Mock.data.keys)
133
130
  Mock.reset_data(keys)
134
131
  end
135
132
 
133
+ def validate_arguments(options)
134
+ missing = requirements - options.keys
135
+ unless missing.empty?
136
+ raise ArgumentError, "Missing required arguments: #{missing.join(', ')}"
137
+ end
138
+
139
+ # FIXME: avoid failing for the services that don't have recognizes yet
140
+ unless recognizes.empty?
141
+ unrecognized = options.keys - requirements - recognized
142
+ unless unrecognized.empty?
143
+ raise ArgumentError, "Unrecognized arguments: #{unrecognized.join(', ')}"
144
+ end
145
+ end
146
+ end
147
+
136
148
  end
137
149
 
138
150
  end
@@ -5,17 +5,24 @@ module Fog
5
5
  class Storage
6
6
 
7
7
  class File < Fog::Model
8
+ extend Fog::Deprecation
9
+ deprecate(:size, :content_length)
10
+ deprecate(:size=, :content_length=)
8
11
 
9
12
  identity :key, :aliases => 'Key'
10
13
 
11
14
  attr_writer :body
12
- attribute :content_length, :aliases => 'Content-Length'
13
- attribute :content_type, :aliases => 'Content-Type'
14
- attribute :etag, :aliases => ['Etag', 'ETag']
15
- attribute :last_modified, :aliases => ['Last-Modified', 'LastModified']
16
- attribute :owner, :aliases => 'Owner'
17
- attribute :size, :aliases => 'Size'
18
- attribute :storage_class, :aliases => 'StorageClass'
15
+ attribute :cache_control, :aliases => 'Cache-Control'
16
+ attribute :content_disposition, :aliases => 'Content-Disposition'
17
+ attribute :content_encoding, :aliases => 'Content-Encoding'
18
+ attribute :content_length, :aliases => ['Content-Length', 'Size'], :type => :integer
19
+ attribute :content_md5, :aliases => 'Content-MD5'
20
+ attribute :content_type, :aliases => 'Content-Type'
21
+ attribute :etag, :aliases => ['Etag', 'ETag']
22
+ attribute :expires, :aliases => 'Expires'
23
+ attribute :last_modified, :aliases => ['Last-Modified', 'LastModified'], :type => :time
24
+ attribute :owner, :aliases => 'Owner'
25
+ attribute :storage_class, :aliases => ['x-goog-storage-class', 'StorageClass']
19
26
 
20
27
  def acl=(new_acl)
21
28
  valid_acls = ['private', 'public-read', 'public-read-write', 'authenticated-read']
@@ -83,14 +90,16 @@ module Fog
83
90
  if options != {}
84
91
  Formatador.display_line("[yellow][WARN] options param is deprecated, use acl= instead[/] [light_black](#{caller.first})[/]")
85
92
  end
86
- if @acl
87
- options['x-goog-acl'] ||= @acl
88
- end
89
- if content_type
90
- options['Content-Type'] = content_type
91
- end
93
+ options['x-goog-acl'] ||= @acl if @acl
94
+ options['Cache-Control'] = cache_control if cache_control
95
+ options['Content-Disposition'] = content_disposition if content_disposition
96
+ options['Content-Encoding'] = content_encoding if content_encoding
97
+ options['Content-MD5'] = content_md5 if content_md5
98
+ options['Content-Type'] = content_type if content_type
99
+ options['Expires'] = expires if expires
100
+
92
101
  data = connection.put_object(directory.key, @key, @body, options)
93
- @etag = data.headers['ETag']
102
+ merge_attributes(data.headers)
94
103
  true
95
104
  end
96
105
 
@@ -41,15 +41,10 @@ module Fog
41
41
  def get(key, options = {}, &block)
42
42
  requires :directory
43
43
  data = connection.get_object(directory.key, key, options, &block)
44
- file_data = {
44
+ file_data = data.headers.merge({
45
45
  :body => data.body,
46
46
  :key => key
47
- }
48
- for key, value in data.headers
49
- if ['Content-Length', 'Content-Type', 'ETag', 'Last-Modified'].include?(key)
50
- file_data[key] = value
51
- end
52
- end
47
+ })
53
48
  new(file_data)
54
49
  rescue Excon::Errors::NotFound
55
50
  nil
@@ -63,14 +58,9 @@ module Fog
63
58
  def head(key, options = {})
64
59
  requires :directory
65
60
  data = connection.head_object(directory.key, key, options)
66
- file_data = {
61
+ file_data = data.headers.merge({
67
62
  :key => key
68
- }
69
- for key, value in data.headers
70
- if ['Content-Length', 'Content-Type', 'ETag', 'Last-Modified'].include?(key)
71
- file_data[key] = value
72
- end
73
- end
63
+ })
74
64
  new(file_data)
75
65
  rescue Excon::Errors::NotFound
76
66
  nil
@@ -85,7 +85,6 @@ module Fog
85
85
  'Contents' => truncated_contents,
86
86
  'IsTruncated' => truncated_contents.size != contents.size,
87
87
  'Marker' => options['marker'],
88
- 'MaxKeys' => max_keys,
89
88
  'Name' => bucket['Name'],
90
89
  'Prefix' => options['prefix']
91
90
  }
@@ -49,15 +49,22 @@ module Fog
49
49
  response = Excon::Response.new
50
50
  if (bucket = @data[:buckets][bucket_name])
51
51
  response.status = 200
52
- bucket[:objects][object_name] = {
52
+ object = {
53
53
  :body => data[:body],
54
+ 'Content-Type' => data[:headers]['Content-Type'],
54
55
  'ETag' => Fog::Google::Mock.etag,
55
56
  'Key' => object_name,
56
57
  'LastModified' => Time.now.utc.strftime("%a, %d %b %Y %H:%M:%S +0000"),
57
58
  'Size' => data[:headers]['Content-Length'],
58
59
  'StorageClass' => 'STANDARD'
59
60
  }
60
- bucket[:objects][object_name]['Content-Type'] = data[:headers]['Content-Type']
61
+ bucket[:objects][object_name] = object
62
+ response.headers = {
63
+ 'Content-Length' => object['Size'],
64
+ 'Content-Type' => object['Content-Type'],
65
+ 'ETag' => object['ETag'],
66
+ 'Last-Modified' => object['LastModified']
67
+ }
61
68
  else
62
69
  response.status = 404
63
70
  raise(Excon::Errors.status_error({:expects => 200}, response))
@@ -9,10 +9,10 @@ module Fog
9
9
  identity :key, :aliases => 'name'
10
10
 
11
11
  attr_writer :body
12
- attribute :content_length, :aliases => ['bytes', 'Content-Length']
12
+ attribute :content_length, :aliases => ['bytes', 'Content-Length'], :type => :integer
13
13
  attribute :content_type, :aliases => ['content_type', 'Content-Type']
14
14
  attribute :etag, :aliases => ['hash', 'Etag']
15
- attribute :last_modified, :aliases => ['last_modified', 'Last-Modified']
15
+ attribute :last_modified, :aliases => ['last_modified', 'Last-Modified'], :type => :time
16
16
 
17
17
  def body
18
18
  @body ||= if last_modified
@@ -51,7 +51,7 @@ module Fog
51
51
  def save(options = {})
52
52
  requires :body, :directory, :key
53
53
  data = connection.put_object(directory.key, @key, @body, options)
54
- @etag = data.headers['ETag']
54
+ merge_attributes(data.headers)
55
55
  true
56
56
  end
57
57
 
@@ -38,15 +38,10 @@ module Fog
38
38
  def get(key, &block)
39
39
  requires :directory
40
40
  data = connection.get_object(directory.key, key, &block)
41
- file_data = {
41
+ file_data = data.headers.merge({
42
42
  :body => data.body,
43
43
  :key => key
44
- }
45
- for key, value in data.headers
46
- if ['Content-Length', 'Content-Type', 'ETag', 'Last-Modified'].include?(key)
47
- file_data[key] = value
48
- end
49
- end
44
+ })
50
45
  new(file_data)
51
46
  rescue Fog::Rackspace::Storage::NotFound
52
47
  nil
@@ -60,12 +55,9 @@ module Fog
60
55
  def head(key, options = {})
61
56
  requires :directory
62
57
  data = connection.head_object(directory.name, key, options)
63
- file_data = { :key => key }
64
- for key, value in data.headers
65
- if ['Content-Length', 'Content-Type', 'ETag', 'Last-Modified'].include?(key)
66
- file_data[key] = value
67
- end
68
- end
58
+ file_data = data.headers.merge({
59
+ :key => key
60
+ })
69
61
  new(file_data)
70
62
  rescue Fog::Rackspace::Storage::NotFound
71
63
  nil
@@ -1,10 +1,7 @@
1
1
  require File.dirname(__FILE__) + '/../../../spec_helper'
2
- require File.dirname(__FILE__) + '/../../../shared_examples/server_examples'
3
2
 
4
3
  describe 'Fog::AWS::Compute::Server' do
5
4
 
6
- it_should_behave_like "Server"
7
-
8
5
  subject { @server = @servers.new(:image_id => GENTOO_AMI) }
9
6
 
10
7
  before(:each) do
@@ -36,6 +36,17 @@ describe 'SimpleDB.get_attributes' do
36
36
  end
37
37
  end
38
38
 
39
+ context "foo item is put with bar attribute as an array" do
40
+ it "should return the array for foo's bar attribute" do
41
+ the_array = %w{A B C}
42
+ AWS[:sdb].put_attributes(@domain_name, 'foo', { :bar => the_array })
43
+ eventually do
44
+ actual = AWS[:sdb].get_attributes(@domain_name, 'foo')
45
+ actual.body['Attributes']['bar'].should =~ the_array
46
+ end
47
+ end
48
+ end
49
+
39
50
  end
40
51
  describe 'failure' do
41
52
 
@@ -0,0 +1,52 @@
1
+ require File.dirname(__FILE__) + '/../spec_helper'
2
+
3
+ class FogAttributeTestModel < Fog::Model
4
+ attribute :key_id, :aliases => "key", :squash => "id"
5
+ attribute :time, :type => :time
6
+ end
7
+
8
+ describe 'Fog::Attributes' do
9
+
10
+ describe ".attribute" do
11
+ describe "squashing a value" do
12
+ it "should accept squashed key as symbol" do
13
+ data = {"key" => {:id => "value"}}
14
+ model = FogAttributeTestModel.new
15
+ model.merge_attributes(data)
16
+ model.key_id.should == "value"
17
+ end
18
+
19
+ it "should accept squashed key as string" do
20
+ data = {"key" => {"id" => "value"}}
21
+ model = FogAttributeTestModel.new
22
+ model.merge_attributes(data)
23
+ model.key_id.should == "value"
24
+ end
25
+ end
26
+
27
+ describe "when merging a time field" do
28
+ it "should accept nil as a suitable setting" do
29
+ data = {"time" => nil}
30
+ model = FogAttributeTestModel.new
31
+ model.merge_attributes(data)
32
+ model.time.should be_nil
33
+ end
34
+
35
+ it "should accept empty string as a suitable setting" do
36
+ data = {"time" => ""}
37
+ model = FogAttributeTestModel.new
38
+ model.merge_attributes(data)
39
+ model.time.should == ""
40
+ end
41
+
42
+ it "should parse strings to get a Datetime" do
43
+ test_time = Time.parse("2010-11-12T13:14:15")
44
+ data = {"time" => test_time.to_s}
45
+ model = FogAttributeTestModel.new
46
+ model.merge_attributes(data)
47
+ model.time.should == test_time
48
+ end
49
+ end
50
+ end
51
+
52
+ end