aws-sdk 1.4.1 → 1.5.0

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.
Files changed (193) hide show
  1. data/.yardopts +0 -1
  2. data/lib/aws/api_config/AutoScaling-2011-01-01.yml +772 -544
  3. data/lib/aws/api_config/CloudFormation-2010-05-15.yml +284 -185
  4. data/lib/aws/api_config/DynamoDB-2011-12-05.yml +458 -738
  5. data/lib/aws/api_config/EC2-2011-12-15.yml +3502 -2653
  6. data/lib/aws/api_config/ELB-2011-08-15.yml +484 -352
  7. data/lib/aws/api_config/IAM-2010-05-08.yml +899 -711
  8. data/lib/aws/api_config/SNS-2010-03-31.yml +235 -167
  9. data/lib/aws/api_config/SQS-2011-10-01.yml +290 -251
  10. data/lib/aws/api_config/STS-2011-06-15.yml +35 -41
  11. data/lib/aws/api_config/SimpleDB-2009-04-15.yml +290 -263
  12. data/lib/aws/api_config/SimpleEmailService-2010-12-01.yml +144 -130
  13. data/lib/aws/api_config/SimpleWorkflow-2012-01-25.yml +697 -1139
  14. data/lib/aws/auto_scaling/activity_collection.rb +1 -1
  15. data/lib/aws/auto_scaling/client.rb +724 -9
  16. data/lib/aws/auto_scaling/errors.rb +1 -5
  17. data/lib/aws/auto_scaling/group.rb +1 -1
  18. data/lib/aws/auto_scaling/group_collection.rb +1 -1
  19. data/lib/aws/auto_scaling/instance_collection.rb +1 -1
  20. data/lib/aws/auto_scaling/launch_configuration.rb +1 -1
  21. data/lib/aws/auto_scaling/launch_configuration_collection.rb +1 -1
  22. data/lib/aws/auto_scaling/notification_configuration_collection.rb +1 -1
  23. data/lib/aws/auto_scaling/request.rb +1 -2
  24. data/lib/aws/auto_scaling/scaling_policy_collection.rb +1 -1
  25. data/lib/aws/auto_scaling/scheduled_action_collection.rb +3 -3
  26. data/lib/aws/auto_scaling/tag_collection.rb +1 -1
  27. data/lib/aws/cloud_formation.rb +1 -18
  28. data/lib/aws/cloud_formation/client.rb +314 -8
  29. data/lib/aws/cloud_formation/errors.rb +1 -5
  30. data/lib/aws/cloud_formation/request.rb +1 -2
  31. data/lib/aws/cloud_formation/stack.rb +4 -3
  32. data/lib/aws/cloud_formation/stack_collection.rb +2 -2
  33. data/lib/aws/cloud_formation/stack_resource_collection.rb +1 -1
  34. data/lib/aws/cloud_formation/stack_resource_summary_collection.rb +2 -2
  35. data/lib/aws/cloud_formation/stack_summary_collection.rb +1 -1
  36. data/lib/aws/core.rb +29 -14
  37. data/lib/aws/core/async_handle.rb +11 -12
  38. data/lib/aws/core/client.rb +112 -102
  39. data/lib/aws/core/client/query_json.rb +110 -0
  40. data/lib/aws/core/client/query_xml.rb +122 -0
  41. data/lib/aws/core/data.rb +242 -0
  42. data/lib/aws/core/http/request.rb +7 -4
  43. data/lib/aws/core/lazy_error_classes.rb +60 -38
  44. data/lib/aws/core/option_grammar.rb +1 -0
  45. data/lib/aws/core/policy.rb +2 -1
  46. data/lib/aws/core/resource.rb +38 -33
  47. data/lib/aws/core/response.rb +109 -44
  48. data/lib/aws/core/signature/version_2.rb +42 -0
  49. data/lib/aws/core/signature/version_3.rb +73 -0
  50. data/lib/aws/core/signature/version_3_http.rb +72 -0
  51. data/lib/aws/core/signature/version_4.rb +138 -0
  52. data/lib/aws/core/uri_escape.rb +6 -9
  53. data/lib/aws/core/xml/frame.rb +242 -0
  54. data/lib/aws/core/xml/frame_stack.rb +85 -0
  55. data/lib/aws/core/xml/grammar.rb +299 -0
  56. data/lib/aws/core/xml/parser.rb +70 -0
  57. data/lib/aws/core/xml/root_frame.rb +65 -0
  58. data/lib/aws/core/{configured_xml_grammars.rb → xml/sax_handlers/libxml.rb} +22 -20
  59. data/lib/aws/core/xml/sax_handlers/nokogiri.rb +55 -0
  60. data/lib/aws/core/{authorize_with_session_token.rb → xml/sax_handlers/ox.rb} +19 -7
  61. data/lib/aws/core/{configured_option_grammars.rb → xml/sax_handlers/rexml.rb} +22 -23
  62. data/lib/aws/core/xml/stub.rb +123 -0
  63. data/lib/aws/dynamo_db/batch_get.rb +1 -1
  64. data/lib/aws/dynamo_db/client.rb +796 -14
  65. data/lib/aws/dynamo_db/errors.rb +1 -38
  66. data/lib/aws/dynamo_db/item_collection.rb +29 -28
  67. data/lib/aws/dynamo_db/request.rb +3 -53
  68. data/lib/aws/dynamo_db/table.rb +6 -2
  69. data/lib/aws/ec2/attachment.rb +1 -1
  70. data/lib/aws/ec2/client.rb +3954 -9
  71. data/lib/aws/ec2/dhcp_options.rb +3 -3
  72. data/lib/aws/ec2/errors.rb +10 -4
  73. data/lib/aws/ec2/instance.rb +7 -6
  74. data/lib/aws/ec2/instance_collection.rb +2 -2
  75. data/lib/aws/ec2/key_pair_collection.rb +3 -3
  76. data/lib/aws/ec2/network_acl.rb +4 -2
  77. data/lib/aws/ec2/network_acl/entry.rb +10 -10
  78. data/lib/aws/ec2/network_interface.rb +2 -3
  79. data/lib/aws/ec2/network_interface/attachment.rb +8 -8
  80. data/lib/aws/ec2/permission_collection.rb +3 -3
  81. data/lib/aws/ec2/request.rb +1 -3
  82. data/lib/aws/ec2/resource_tag_collection.rb +4 -8
  83. data/lib/aws/ec2/route_table.rb +3 -2
  84. data/lib/aws/ec2/route_table/route.rb +7 -7
  85. data/lib/aws/ec2/security_group.rb +2 -2
  86. data/lib/aws/ec2/security_group/egress_ip_permission_collection.rb +16 -5
  87. data/lib/aws/ec2/security_group/ingress_ip_permission_collection.rb +4 -3
  88. data/lib/aws/ec2/security_group/ip_permission.rb +1 -2
  89. data/lib/aws/ec2/snapshot_collection.rb +6 -3
  90. data/lib/aws/ec2/subnet.rb +1 -1
  91. data/lib/aws/ec2/volume.rb +1 -3
  92. data/lib/aws/ec2/volume_collection.rb +2 -0
  93. data/lib/aws/elb/availability_zone_collection.rb +2 -2
  94. data/lib/aws/elb/backend_server_policy_collection.rb +1 -1
  95. data/lib/aws/elb/client.rb +513 -9
  96. data/lib/aws/elb/errors.rb +2 -6
  97. data/lib/aws/elb/instance_collection.rb +2 -2
  98. data/lib/aws/elb/request.rb +1 -1
  99. data/lib/aws/errors.rb +61 -74
  100. data/lib/aws/iam.rb +2 -3
  101. data/lib/aws/iam/client.rb +1178 -10
  102. data/lib/aws/iam/collection.rb +2 -1
  103. data/lib/aws/iam/errors.rb +1 -6
  104. data/lib/aws/iam/group.rb +8 -9
  105. data/lib/aws/iam/request.rb +1 -1
  106. data/lib/aws/iam/server_certificate_collection.rb +8 -5
  107. data/lib/aws/iam/signing_certificate.rb +1 -1
  108. data/lib/aws/iam/user.rb +2 -2
  109. data/lib/aws/iam/user_policy.rb +3 -2
  110. data/lib/aws/rails.rb +1 -2
  111. data/lib/aws/record.rb +3 -3
  112. data/lib/aws/record/abstract_base.rb +0 -3
  113. data/lib/aws/record/attributes.rb +7 -7
  114. data/lib/aws/record/model.rb +19 -19
  115. data/lib/aws/record/model/finder_methods.rb +7 -7
  116. data/lib/aws/s3/bucket.rb +7 -2
  117. data/lib/aws/s3/client.rb +391 -398
  118. data/lib/aws/s3/client/xml.rb +44 -71
  119. data/lib/aws/s3/data_options.rb +3 -2
  120. data/lib/aws/s3/errors.rb +8 -11
  121. data/lib/aws/s3/multipart_upload_collection.rb +1 -3
  122. data/lib/aws/s3/object_collection.rb +2 -1
  123. data/lib/aws/s3/object_metadata.rb +2 -2
  124. data/lib/aws/s3/paginated_collection.rb +2 -2
  125. data/lib/aws/s3/prefix_and_delimiter_collection.rb +1 -1
  126. data/lib/aws/s3/presigned_post.rb +18 -17
  127. data/lib/aws/s3/request.rb +4 -3
  128. data/lib/aws/s3/s3_object.rb +8 -10
  129. data/lib/aws/simple_db/attribute.rb +2 -2
  130. data/lib/aws/simple_db/attribute_collection.rb +14 -4
  131. data/lib/aws/simple_db/client.rb +313 -14
  132. data/lib/aws/simple_db/domain.rb +1 -1
  133. data/lib/aws/simple_db/domain_collection.rb +4 -4
  134. data/lib/aws/simple_db/domain_metadata.rb +1 -1
  135. data/lib/aws/simple_db/errors.rb +14 -2
  136. data/lib/aws/simple_db/expect_condition_option.rb +1 -1
  137. data/lib/aws/simple_db/item.rb +1 -1
  138. data/lib/aws/simple_db/item_collection.rb +9 -9
  139. data/lib/aws/simple_db/item_data.rb +9 -6
  140. data/lib/aws/simple_db/request.rb +1 -1
  141. data/lib/aws/simple_email_service.rb +8 -7
  142. data/lib/aws/simple_email_service/client.rb +174 -9
  143. data/lib/aws/simple_email_service/email_address_collection.rb +0 -1
  144. data/lib/aws/simple_email_service/errors.rb +1 -5
  145. data/lib/aws/simple_email_service/quotas.rb +8 -6
  146. data/lib/aws/simple_email_service/request.rb +7 -1
  147. data/lib/aws/simple_workflow/client.rb +1383 -6
  148. data/lib/aws/simple_workflow/decision_task.rb +1 -3
  149. data/lib/aws/simple_workflow/errors.rb +1 -38
  150. data/lib/aws/simple_workflow/history_event_collection.rb +2 -2
  151. data/lib/aws/simple_workflow/request.rb +5 -49
  152. data/lib/aws/simple_workflow/type.rb +1 -1
  153. data/lib/aws/simple_workflow/type_collection.rb +4 -3
  154. data/lib/aws/simple_workflow/workflow_execution_collection.rb +2 -2
  155. data/lib/aws/sns/client.rb +345 -9
  156. data/lib/aws/sns/errors.rb +1 -5
  157. data/lib/aws/sns/request.rb +1 -2
  158. data/lib/aws/sns/subscription_collection.rb +2 -2
  159. data/lib/aws/sns/topic.rb +15 -14
  160. data/lib/aws/sns/topic_collection.rb +1 -1
  161. data/lib/aws/sqs/client.rb +334 -9
  162. data/lib/aws/sqs/errors.rb +1 -6
  163. data/lib/aws/sqs/queue.rb +20 -21
  164. data/lib/aws/sqs/queue_collection.rb +3 -3
  165. data/lib/aws/sqs/request.rb +2 -2
  166. data/lib/aws/sts.rb +8 -10
  167. data/lib/aws/sts/client.rb +67 -10
  168. data/lib/aws/sts/errors.rb +1 -5
  169. data/lib/aws/sts/request.rb +1 -1
  170. data/lib/user.rb +49 -0
  171. metadata +21 -28
  172. data/lib/aws/auto_scaling/client/xml.rb +0 -32
  173. data/lib/aws/cloud_formation/client/xml.rb +0 -32
  174. data/lib/aws/core/api_config.rb +0 -44
  175. data/lib/aws/core/authorize_v2.rb +0 -39
  176. data/lib/aws/core/authorize_v3.rb +0 -38
  177. data/lib/aws/core/authorize_v4.rb +0 -149
  178. data/lib/aws/core/configured_client_methods.rb +0 -76
  179. data/lib/aws/core/configured_grammars.rb +0 -63
  180. data/lib/aws/core/configured_json_client_methods.rb +0 -74
  181. data/lib/aws/core/ignore_result_element.rb +0 -34
  182. data/lib/aws/core/json_client.rb +0 -41
  183. data/lib/aws/core/xml_grammar.rb +0 -957
  184. data/lib/aws/ec2/client/xml.rb +0 -175
  185. data/lib/aws/elb/client/xml.rb +0 -33
  186. data/lib/aws/elb/listener_spec.rb +0 -14
  187. data/lib/aws/iam/client/xml.rb +0 -34
  188. data/lib/aws/simple_db/client/options.rb +0 -32
  189. data/lib/aws/simple_db/client/xml.rb +0 -63
  190. data/lib/aws/simple_email_service/client/xml.rb +0 -34
  191. data/lib/aws/sns/client/xml.rb +0 -34
  192. data/lib/aws/sqs/client/xml.rb +0 -33
  193. data/lib/aws/sts/client/xml.rb +0 -34
@@ -70,9 +70,10 @@ module AWS
70
70
  options[:max_items] = max_items if max_items
71
71
 
72
72
  response = client.send(request_method, options)
73
+
73
74
  each_item(response, &block)
74
75
 
75
- response.marker if response.respond_to?(:marker)
76
+ response.data[:marker]
76
77
 
77
78
  end
78
79
 
@@ -13,15 +13,10 @@
13
13
 
14
14
  module AWS
15
15
  class IAM
16
-
17
- # @private
18
16
  module Errors
19
17
 
20
- BASE_ERROR_GRAMMAR = Client::XML::BaseError
21
-
22
- include Core::LazyErrorClasses
18
+ extend Core::LazyErrorClasses
23
19
 
24
20
  end
25
-
26
21
  end
27
22
  end
data/lib/aws/iam/group.rb CHANGED
@@ -20,6 +20,12 @@ module AWS
20
20
  # their jobs. For example, you could have a group called Admins
21
21
  # and give that group the types of permissions admins typically
22
22
  # need.
23
+ # @attr [String] name The group's name.
24
+ # @attr_reader [String] id The group's unique ID.
25
+ # @attr_reader [Time] create_date When the group was created.
26
+ # @attr_reader [String] arn The group's ARN (Amazon Resource Name).
27
+ # @attr [String] path The group's path. Paths are used to identify
28
+ # which division or part of an organization the group belongs to.
23
29
  class Group < Resource
24
30
 
25
31
  prefix_update_attributes
@@ -30,21 +36,14 @@ module AWS
30
36
  super
31
37
  end
32
38
 
33
- # @attr [String] The group's name.
34
39
  mutable_attribute :name, :static => true, :as => :group_name
35
40
 
36
- # @attr_reader [String] The group's unique ID.
37
41
  attribute :id, :static => true, :as => :group_id
38
42
 
39
- # @attr_reader [Time] When the group was created.
40
43
  attribute :create_date, :static => true
41
44
 
42
- # @attr_reader [String] The group's ARN (Amazon Resource Name).
43
45
  attribute :arn
44
46
 
45
- # @attr [String] The group's path. Paths are used to identify
46
- # which division or part of an organization the group belongs
47
- # to.
48
47
  mutable_attribute :path do
49
48
  translates_input do |path|
50
49
  path = "/#{path}" unless path[0] == ?/
@@ -54,11 +53,11 @@ module AWS
54
53
  end
55
54
 
56
55
  populates_from(:get_group, :create_group) do |resp|
57
- resp.group if resp.group.group_name == name
56
+ resp[:group] if resp[:group][:group_name] == name
58
57
  end
59
58
 
60
59
  populates_from(:list_groups, :list_groups_for_user) do |resp|
61
- resp.groups.find { |g| g.group_name == name }
60
+ resp[:groups].find {|g| g[:group_name] == name }
62
61
  end
63
62
 
64
63
  # (see Resource#exists?)
@@ -17,7 +17,7 @@ module AWS
17
17
  # @private
18
18
  class Request < Core::Http::Request
19
19
 
20
- include Core::AuthorizeV4
20
+ include Core::Signature::Version4
21
21
 
22
22
  def service
23
23
  'iam'
@@ -87,7 +87,8 @@ module AWS
87
87
  #
88
88
  # @return [ServerCertificate] The newly created server
89
89
  # certificate.
90
- def upload(options = {})
90
+ def create options = {}
91
+
91
92
  client_opts = options.dup
92
93
  client_opts[:server_certificate_name] = client_opts.delete(:name)
93
94
 
@@ -98,11 +99,13 @@ module AWS
98
99
  end
99
100
 
100
101
  resp = client.upload_server_certificate(client_opts)
101
- ServerCertificate.new(resp.server_certificate_metadata.
102
- server_certificate_name,
103
- :config => config)
102
+
103
+ ServerCertificate.new(
104
+ resp[:server_certificate_metadata][:server_certificate_name],
105
+ :config => config)
106
+
104
107
  end
105
- alias_method :create, :upload
108
+ alias_method :upload, :create
106
109
 
107
110
  # Returns a reference to the server certificate with the given
108
111
  # name:
@@ -55,7 +55,7 @@ module AWS
55
55
 
56
56
  # @param [String] certificate_id The id of the signing certificate.
57
57
  # @param [Hash] options
58
- # @param [User] :user The user this signing certificate belongs to.
58
+ # @option options [User] :user
59
59
  def initialize certificate_id, options = {}
60
60
  @id = certificate_id
61
61
  @user = options[:user]
data/lib/aws/iam/user.rb CHANGED
@@ -97,11 +97,11 @@ module AWS
97
97
  mutable_attribute :path
98
98
 
99
99
  populates_from(:create_user, :get_user) do |resp|
100
- resp.user if resp.user.user_name == name
100
+ resp[:user] if resp[:user][:user_name] == name
101
101
  end
102
102
 
103
103
  populates_from(:list_users, :get_group) do |resp|
104
- resp.users.find{|u| u.user_name == name }
104
+ resp[:users].find{|u| u[:user_name] == name }
105
105
  end
106
106
 
107
107
  # Deletes this user.
@@ -18,8 +18,9 @@ module AWS
18
18
 
19
19
  class UserPolicy < Resource
20
20
 
21
- # @param [User] The user this user policy belongs to.
22
- # @param [String] The name of this user policy.
21
+ # @param [User] user The user this user policy belongs to.
22
+ # @param [String] name The name of this user policy.
23
+ # @param [Hash] options
23
24
  def initialize user, name, options = {}
24
25
  @user = user
25
26
  @name = name
data/lib/aws/rails.rb CHANGED
@@ -136,8 +136,6 @@ module AWS
136
136
  #
137
137
  # AWS.add_action_mailer_delivery_method(:ses, custom_options)
138
138
  #
139
- # @param [Hash] options
140
- #
141
139
  # @param [Symbol] name (:amazon_ses) The name of the delivery
142
140
  # method. The name used here should be the same as you set in
143
141
  # your environment config. If you name the delivery method
@@ -150,6 +148,7 @@ module AWS
150
148
  # {AWS::SimpleEmailService#new} before delivering email.
151
149
  #
152
150
  # @return [nil]
151
+ #
153
152
  def self.add_action_mailer_delivery_method name = :amazon_ses, options = {}
154
153
 
155
154
  if ::Rails.version.to_f >= 3
data/lib/aws/record.rb CHANGED
@@ -40,8 +40,8 @@ module AWS
40
40
  # p.shard #=> 'products'
41
41
  # p.save # the product is persisted to the 'production-products' domain
42
42
  #
43
- # @param [String] A prefix to append to all domains. This is useful for
44
- # grouping domains used by one application with a single prefix.
43
+ # @param [String] prefix A prefix to append to all domains. This is useful
44
+ # for grouping domains used by one application with a single prefix.
45
45
  #
46
46
  def self.domain_prefix= prefix
47
47
  @domain_prefix = prefix
@@ -66,7 +66,7 @@ module AWS
66
66
  # p.shard #=> 'products'
67
67
  # p.save # the product is persisted to the 'production-products' table
68
68
  #
69
- # @param [String] A prefix to append to all tables. This is
69
+ # @param [String] prefix A prefix to append to all tables. This is
70
70
  # useful for grouping tables used by one application with a
71
71
  # single prefix.
72
72
  #
@@ -44,9 +44,6 @@ module AWS
44
44
 
45
45
  # Constructs a new record.
46
46
  #
47
- # @param [Hash] attributes A set of attribute values to seed this record
48
- # with. The attributes are bulk assigned.
49
- #
50
47
  # @param [Hash] attributes Attributes that should be bulk assigned
51
48
  # to this record. You can also specify the shard (i.e. domain
52
49
  # or table) this record should persist to via +:shard+).
@@ -20,7 +20,7 @@ module AWS
20
20
  # Base class for all of the AWS::Record attributes.
21
21
  class BaseAttr
22
22
 
23
- # @param [Symbol] Name of this attribute. It should be a name that
23
+ # @param [Symbol] name Name of this attribute. It should be a name that
24
24
  # is safe to use as a method.
25
25
  # @param [Hash] options
26
26
  # @option options [String] :persist_as Defaults to the name of the
@@ -59,20 +59,20 @@ module AWS
59
59
  (options[:persist_as] || @name).to_s
60
60
  end
61
61
 
62
- # @param [Mixed] A single value to type cast.
62
+ # @param [Mixed] raw_value A single value to type cast.
63
63
  # @return [Mixed] Returns the type casted value.
64
64
  def type_cast raw_value
65
65
  self.class.type_cast(raw_value, options)
66
66
  end
67
67
 
68
- # @param [String] The serialized string value.
68
+ # @param [String] serialized_value The serialized string value.
69
69
  # @return [Mixed] Returns a deserialized type-casted value.
70
70
  def deserialize serialized_value
71
71
  self.class.deserialize(serialized_value, options)
72
72
  end
73
73
 
74
74
  # Takes the type casted value and serializes it
75
- # @param [Mixed] A single value to serialize.
75
+ # @param [Mixed] type_casted_value A single value to serialize.
76
76
  # @return [Mixed] Returns the serialized value.
77
77
  def serialize type_casted_value
78
78
  self.class.serialize(type_casted_value, options)
@@ -116,7 +116,7 @@ module AWS
116
116
  # string_attr.type_cast('', :preserve_empty_strings => true)
117
117
  # # => ''
118
118
  #
119
- # @param [Mixed] value
119
+ # @param [Mixed] raw_value
120
120
  # @param [Hash] options
121
121
  # @option options [Boolean] :preserve_empty_strings (false) When true,
122
122
  # empty strings are preserved and not cast to nil.
@@ -189,7 +189,7 @@ module AWS
189
189
  # int_attribute.type_cast('')
190
190
  # #=> nil
191
191
  #
192
- # @param [Mixed] value The value to type cast to an integer.
192
+ # @param [Mixed] raw_value The value to type cast to an integer.
193
193
  # @return [Integer,nil] Returns the type casted integer or nil
194
194
  def self.type_cast raw_value, options = {}
195
195
  case raw_value
@@ -294,7 +294,7 @@ module AWS
294
294
  # attribute.serialize(DateTime.parse('2001-01-01'))
295
295
  # #=> '2001-01-01'
296
296
  #
297
- # @param [Date] datetime The date to serialize.
297
+ # @param [Date] date The date to serialize.
298
298
  #
299
299
  # @param [Hash] options
300
300
  #
@@ -280,33 +280,33 @@ module AWS
280
280
  # class Product < AWS::Record::Model
281
281
  # end
282
282
  #
283
- # Product.create_table #=> creates the SimpleDB domain 'Product'
284
- #
285
- # If you shard you data across multiple domains, you can specify the
286
- # shard name:
287
- #
288
- # # create two domains, with the given names
289
- # Product.create_domain :shard_name => 'products-1'
290
- # Product.create_domain :shard_name => 'products-2'
283
+ # Product.create_table #=> 'Product'
291
284
  #
292
285
  # If you share a single AWS account with multiple applications, you
293
- # can provide a domain prefix to group domains and to avoid name
294
- # collisions:
286
+ # can provide a domain prefix for your model classes.
295
287
  #
296
288
  # AWS::Record.domain_prefix = 'myapp-'
297
289
  #
298
- # # creates the domain 'myapp-Product'
299
- # Product.create_domain
290
+ # Product.create_table #=> 'myapp-Product'
300
291
  #
301
- # # creates the domain 'myapp-products-1'
302
- # Product.create_domain :shard_name => 'products-1'
292
+ # If you have set a model shard name, this is used in place of the
293
+ # class name.
303
294
  #
304
- # @param [Hash] options Hash of options passed to
305
- # {SimpleDB::DomainCollection#create}.
295
+ # AWS::Record.domain_prefix = 'prod-'
296
+ # class Product < AWS::Record::Model
297
+ # set_shard_name 'products'
298
+ # end
299
+ #
300
+ # Product.create_table #=> 'prod-products'
301
+ #
302
+ # If you shard you data across multiple domains, you can specify the
303
+ # shard name:
304
+ #
305
+ # # create two domains, with the given names
306
+ # Product.create_domain 'products-1'
307
+ # Product.create_domain 'products-2'
306
308
  #
307
- # @option options [String] :shard_name Defaults to the class name. The
308
- # shard name will be prefixed with {AWS::Record.domain_prefix},
309
- # and that becomes the domain name.
309
+ # @param [optional,String] shard_name Defaults to the class name.
310
310
  #
311
311
  # @return [SimpleDB::Domain]
312
312
  #
@@ -93,7 +93,7 @@ module AWS
93
93
  # # ...
94
94
  # end
95
95
  #
96
- # @param [String] domain
96
+ # @param [String] shard_name
97
97
  # @return [Scope] Returns a scope for restricting the domain of subsequent
98
98
  def shard shard_name
99
99
  new_scope.shard(shard_name)
@@ -186,11 +186,12 @@ module AWS
186
186
  # Car.where(:color => 'red').order(:price, :desc).limit(10)
187
187
  #
188
188
  # @overload where(conditions_hash)
189
+ # @param [Hash] conditions_hash A hash of attributes to values. Each
190
+ # key/value pair from the hash becomes a find condition. All
191
+ # conditions are joined by AND.
192
+ #
189
193
  # @overload where(sql_fragment[, quote_params, ...])
190
194
  #
191
- # @param [Hash] conditions_hash A hash of attributes to values. Each
192
- # key/value pair from the hash becomes a find condition. All conditions
193
- # are joined by AND.
194
195
  def where *args
195
196
  new_scope.where(*args)
196
197
  end
@@ -206,9 +207,8 @@ module AWS
206
207
  # Pepole.order(:age, :desc).limit(10).each {|person| ... }
207
208
  #
208
209
  # @overload order(attribute, direction = :asc)
209
- # @param [String,Symbol] attribute The attribute in SimpleDB to sort by.
210
- # @param [:asc,:desc] direction (:asc) The direction to sort, ascending
211
- # or descending order.
210
+ # @param [String,Symbol] attribute The attribute to sort by.
211
+ # @param [:asc,:desc] direction (:asc) The direction to sort.
212
212
  def order *args
213
213
  new_scope.order(*args)
214
214
  end
data/lib/aws/s3/bucket.rb CHANGED
@@ -202,10 +202,14 @@ module AWS
202
202
  #
203
203
  # @return [AccessControlList]
204
204
  def acl
205
- acl = client.get_bucket_acl(:bucket_name => name).acl
205
+
206
+ resp = client.get_bucket_acl(:bucket_name => name)
207
+
208
+ acl = AccessControlList.new(resp.data)
206
209
  acl.extend ACLProxy
207
210
  acl.bucket = self
208
211
  acl
212
+
209
213
  end
210
214
 
211
215
  # Sets the bucket's access control list. +acl+ can be:
@@ -263,7 +267,8 @@ module AWS
263
267
  # @return [Policy,nil] Returns the bucket policy (if it has one),
264
268
  # or it returns +nil+ otherwise.
265
269
  def policy
266
- policy = client.get_bucket_policy(:bucket_name => name).policy
270
+ resp = client.get_bucket_policy(:bucket_name => name)
271
+ policy = Policy.from_json(resp.data[:policy])
267
272
  policy.extend(PolicyProxy)
268
273
  policy.bucket = self
269
274
  policy
data/lib/aws/s3/client.rb CHANGED
@@ -20,79 +20,39 @@ require 'digest/md5'
20
20
  module AWS
21
21
  class S3
22
22
 
23
- ##
24
- # Provides a low-level client to Amazon S3:
25
- #
26
- # * Each method makes exactly one request to S3, and no two
27
- # methods make the same type of request.
28
- #
29
- # * These methods hide the details of how request parameters are
30
- # sent to S3; for example:
31
- #
32
- # client.set_bucket_acl(# controls which host to connect to
33
- # :bucket_name => "mybucket",
34
- # # the request payload
35
- # :acl => [{ :grantee => "..." }])
36
- #
37
- # * These methods return subclasses of Response, so that you can
38
- # always get access to the request that was made and the raw
39
- # HTTP response. You can also access S3-specific response
40
- # metadata. For example:
41
- #
42
- # response = client.list_buckets
43
- # response.http_request.http_method # => "GET"
44
- # response.http_response.body # => "<ListAllMyBucketsResult xmlns..."
45
- # response.request_id # => "32FE2CEB32F5EE25"
46
- # # (S3-specific metadata)
47
- #
48
- # * This client attempts to raise ArgumentError for any invalid
49
- # requests it can detect before sending a request to the
50
- # service. For example:
51
- #
52
- # begin
53
- # client.create_bucket
54
- # rescue ArgumentError => e
55
- # puts e # prints "The bucket_name parameter is
56
- # # required"
57
- # end
58
- #
59
- # * Each method can take an +:async+ to turn it into an
60
- # asynchronous operation. Instead of blocking on the response
61
- # to the service call, the method will return a handle on the
62
- # response. For example:
63
- #
64
- # response = client.list_buckets(:async => true)
65
- # response.on_success { p response.buckets.map(&:name) }
66
- #
67
- # @private
23
+ # Client class for Amazon Simple Storage Service (S3).
68
24
  class Client < Core::Client
69
25
 
70
- AWS.register_autoloads(self) do
71
- autoload :XML, 'xml'
72
- end
73
-
74
26
  API_VERSION = '2006-03-01'
75
27
 
76
28
  XMLNS = "http://s3.amazonaws.com/doc/#{API_VERSION}/"
77
29
 
30
+ AWS.register_autoloads(self) do
31
+ autoload :XML, 'xml'
32
+ end
33
+
34
+ # @private
78
35
  EMPTY_BODY_ERRORS = {
79
36
  304 => Errors::NotModified,
80
37
  404 => Errors::NoSuchKey
81
38
  }
82
39
 
40
+ # @private
41
+ CACHEABLE_REQUESTS = Set[]
42
+
83
43
  include DataOptions
84
44
  include Core::UriEscape
85
45
 
86
- configure_client
87
-
88
46
  protected
47
+
89
48
  def self.bucket_method(method_name, verb, *args, &block)
49
+
90
50
  method_options = (args.pop if args.last.kind_of?(Hash)) || {}
91
- xml_grammar = (args.pop if args.last.respond_to?(:parse))
51
+ xml_grammar = (args.pop if args.last.respond_to?(:rules))
92
52
  verb = verb.to_s.upcase
93
53
  subresource = args.first
94
54
 
95
- add_client_request_method(method_name, :xml_grammar => xml_grammar) do
55
+ add_client_request_method(method_name) do
96
56
 
97
57
  configure_request do |req, options|
98
58
  require_bucket_name!(options[:bucket_name])
@@ -110,10 +70,26 @@ module AWS
110
70
  end
111
71
 
112
72
  instance_eval(&block) if block
73
+
74
+ if xml_grammar
75
+
76
+ parser = Core::XML::Parser.new(xml_grammar.rules)
77
+
78
+ process_response do |resp|
79
+ resp.data = parser.parse(resp.http_response.body)
80
+ super(resp)
81
+ end
82
+
83
+ simulate_response do |resp|
84
+ resp.data = parser.simulate
85
+ super(resp)
86
+ end
87
+
88
+ end
89
+
113
90
  end
114
91
  end
115
92
 
116
- protected
117
93
  def self.object_method(method_name, verb, *args, &block)
118
94
  bucket_method(method_name, verb, *args) do
119
95
  configure_request do |req, options|
@@ -128,6 +104,11 @@ module AWS
128
104
 
129
105
  public
130
106
 
107
+ # Creates a bucket.
108
+ # @overload create_bucket(options = {})
109
+ # @param [Hash] options
110
+ # @option options [required,String] :bucket_name
111
+ # @return [Core::Response]
131
112
  bucket_method(:create_bucket, :put) do
132
113
  configure_request do |req, options|
133
114
  validate_bucket_name!(options[:bucket_name])
@@ -144,14 +125,18 @@ module AWS
144
125
  end
145
126
  end
146
127
 
147
- ##
148
- # Deletes a bucket.
149
- #
150
- # == Required Options
151
- #
152
- # * +:bucket_name+ -- The name of the bucket.
128
+ # Deletes an empty bucket.
129
+ # @overload delete_bucket(options = {})
130
+ # @param [Hash] options
131
+ # @option options [required,String] :bucket_name
132
+ # @return [Core::Response]
153
133
  bucket_method(:delete_bucket, :delete)
154
134
 
135
+ # @overload set_bucket_lifecycle_configuration(options = {})
136
+ # @param [Hash] options
137
+ # @option options [required,String] :bucket_name
138
+ # @option options [required,String] :lifecycle_configuration
139
+ # @return [Core::Response]
155
140
  bucket_method(:set_bucket_lifecycle_configuration, :put) do
156
141
 
157
142
  configure_request do |req, options|
@@ -165,6 +150,10 @@ module AWS
165
150
 
166
151
  end
167
152
 
153
+ # @overload get_bucket_lifecycle_configuration(options = {})
154
+ # @param [Hash] options
155
+ # @option options [required,String] :bucket_name
156
+ # @return [Core::Response]
168
157
  bucket_method(:get_bucket_lifecycle_configuration, :get) do
169
158
 
170
159
  configure_request do |req, options|
@@ -174,12 +163,15 @@ module AWS
174
163
 
175
164
  process_response do |resp|
176
165
  xml = resp.http_response.body
177
- data = XML::GetBucketLifecycleConfiguration.parse(xml)
178
- Core::MetaUtils.extend_method(resp, :data) { ResponseData.new(data) }
166
+ resp.data = XML::GetBucketLifecycleConfiguration.parse(xml)
179
167
  end
180
168
 
181
169
  end
182
170
 
171
+ # @overload delete_bucket_lifecycle_configuration(options = {})
172
+ # @param [Hash] options
173
+ # @option options [required,String] :bucket_name
174
+ # @return [Core::Response]
183
175
  bucket_method(:delete_bucket_lifecycle_configuration, :delete) do
184
176
 
185
177
  configure_request do |req, options|
@@ -189,38 +181,36 @@ module AWS
189
181
 
190
182
  end
191
183
 
192
- # delete_bucket_lifecycle_configuration
193
-
194
- ##
195
- # Lists the buckets in the account.
184
+ # @overload list_buckets(options = {})
185
+ # @param [Hash] options
186
+ # @return [Core::Response]
196
187
  add_client_request_method(:list_buckets) do
188
+
197
189
  configure_request do |req, options|
198
190
  req.http_method = "GET"
199
191
  end
200
192
 
201
193
  process_response do |resp|
202
- XML::ListBuckets.parse(resp.http_response.body, :context => resp)
194
+ resp.data = XML::ListBuckets.parse(resp.http_response.body)
203
195
  end
196
+
197
+ simulate_response do |resp|
198
+ resp.data = Core::XML::Parser.new(XML::ListBuckets.rules).simulate
199
+ end
200
+
204
201
  end
205
202
 
206
- ##
207
203
  # Sets the access policy for a bucket.
208
- #
209
- # == Required Options
210
- #
211
- # * +:bucket_name+ -- The name of the bucket.
212
- #
213
- # * +:policy+ -- The new policy. This can be a string (which
214
- # is assumed to contain a valid policy expressed in JSON), a
215
- # Policy or any object that responds to +to_json+.
216
- #
217
- # == Response
218
- #
219
- # The response contains only the standard fields.
204
+ # @overload set_bucket_policy(options = {})
205
+ # @param [Hash] options
206
+ # @option options [required,String] :bucket_name
207
+ # @option options [required,String] :policy This can be a String
208
+ # or any object that responds to +#to_json+.
209
+ # @return [Core::Response]
220
210
  bucket_method(:set_bucket_policy, :put, 'policy') do
221
211
 
222
212
  configure_request do |req, options|
223
- require_policy!(options[:policy])
213
+ require_policy!(options[:policy])
224
214
  super(req, options)
225
215
  policy = options[:policy]
226
216
  policy = policy.to_json unless policy.respond_to?(:to_str)
@@ -229,37 +219,33 @@ module AWS
229
219
 
230
220
  end
231
221
 
232
- ##
233
222
  # Gets the access policy for a bucket.
234
- #
235
- # == Required Options
236
- #
237
- # * +:bucket_name+ -- The name of the bucket.
238
- #
239
- # == Response
240
- #
241
- # A successful response will have a +policy+ method that
242
- # returns an instance of Policy.
243
- #
223
+ # @overload get_bucket_policy(options = {})
224
+ # @param [Hash] options
225
+ # @option options [required,String] :bucket_name
226
+ # @return [Core::Response]
244
227
  bucket_method(:get_bucket_policy, :get, 'policy') do
228
+
245
229
  process_response do |resp|
246
- # FIXME: this makes unit testing easier, but is there something
247
- # we should be doing in case of invalid JSON from the service?
248
- policy = Policy.from_json(resp.http_response.body) rescue nil
249
- Core::MetaUtils.extend_method(resp, :policy) { policy }
230
+ resp.data[:policy] = resp.http_response.body
250
231
  end
232
+
251
233
  end
252
234
 
253
- ##
254
235
  # Deletes the access policy for a bucket.
255
- #
256
- # == Required Options
257
- #
258
- # * +:bucket_name+ -- The name of the bucket.
259
- #
236
+ # @overload delete_bucket_policy(options = {})
237
+ # @param [Hash] options
238
+ # @option options [required,String] :bucket_name
239
+ # @return [Core::Response]
260
240
  bucket_method(:delete_bucket_policy, :delete, 'policy')
261
241
 
242
+ # @overload set_bucket_versioning(options = {})
243
+ # @param [Hash] options
244
+ # @option options [required,String] :bucket_name
245
+ # @option options [required,String] :state
246
+ # @return [Core::Response]
262
247
  bucket_method(:set_bucket_versioning, :put, 'versioning') do
248
+
263
249
  configure_request do |req, options|
264
250
  state = options[:state].to_s.downcase.capitalize
265
251
  unless state =~ /^(Enabled|Suspended)$/
@@ -272,24 +258,40 @@ module AWS
272
258
  </VersioningConfiguration>
273
259
  XML
274
260
  end
261
+
275
262
  end
276
263
 
277
- ##
278
264
  # Gets the bucket's location constraint.
279
- # @return [String] The bucket location constraint. Returns nil if
280
- # the bucket was created in the US classic region.
265
+ # @overload get_bucket_location(options = {})
266
+ # @param [Hash] options
267
+ # @option options [required,String] :bucket_name
268
+ # @return [Core::Response]
281
269
  bucket_method(:get_bucket_location, :get, 'location') do
270
+
282
271
  process_response do |response|
283
272
  regex = />(.*)<\/LocationConstraint>/
284
273
  matches = response.http_response.body.match(regex)
285
- location = matches ? matches[1] : nil
286
- Core::MetaUtils.extend_method(response, :location_constraint) { location }
274
+ response.data[:location_constraint] = matches ? matches[1] : nil
287
275
  end
276
+
288
277
  end
289
278
 
279
+ # @overload get_bucket_versioning(options = {})
280
+ # @param [Hash] options
281
+ # @option options [required,String] :bucket_name
282
+ # @return [Core::Response]
290
283
  bucket_method(:get_bucket_versioning, :get, 'versioning',
291
284
  XML::GetBucketVersioning)
292
285
 
286
+ # @overload list_object_versions(options = {})
287
+ # @param [Hash] options
288
+ # @option options [required,String] :bucket_name
289
+ # @option options [String] :prefix
290
+ # @option options [String] :delimiter
291
+ # @option options [String] :max_keys
292
+ # @option options [String] :key_marker
293
+ # @option options [String] :version_id_marker
294
+ # @return [Core::Response]
293
295
  bucket_method(:list_object_versions, :get, 'versions',
294
296
  XML::ListObjectVersions) do
295
297
 
@@ -305,24 +307,19 @@ module AWS
305
307
 
306
308
  end
307
309
 
308
- ##
309
310
  # Sets the access control list for a bucket.
310
- #
311
- # == Required Options
312
- #
313
- # * +:bucket_name+ -- The name of the bucket.
314
- #
315
- # * +:acl+ -- The new acl. This can be any of the following:
316
- # * An XML policy as a string (which is passed to S3 uninterpreted)
317
- # * An AccessControlList object
318
- # * Any object that responds to +to_xml+
319
- # * Any Hash that is acceptable as an argument to
320
- # AccessControlList#initialize.
321
- #
322
- # == Response
323
- #
324
- # The response contains only the standard fields.
311
+ # @overload set_bucket_acl(options = {})
312
+ # @param [Hash] options
313
+ # @option options [required,String] :bucket_name
314
+ # @option options [required,String,AccessControlList,Hash] :acl
315
+ # This may be any of the following:
316
+ # * An XML policy as a string (which is passed to S3 uninterpreted)
317
+ # * An {AccessControlList} object
318
+ # * Any object that responds to +#to_xml+
319
+ # * A hash that is compatible with {AccessControlList} #new.
320
+ # @return [Core::Response]
325
321
  bucket_method(:set_bucket_acl, :put, 'acl') do
322
+
326
323
  configure_request do |req, options|
327
324
  require_acl!(options[:acl])
328
325
  super(req, options)
@@ -334,40 +331,28 @@ module AWS
334
331
  req.body = options[:acl].to_xml
335
332
  end
336
333
  end
334
+
337
335
  end
338
336
 
339
- ##
340
337
  # Gets the access control list for a bucket.
341
- #
342
- # == Required Options
343
- #
344
- # * +:bucket_name+ -- The name of the bucket.
345
- #
346
- # == Response
347
- #
348
- # A successful response will have an +acl+ method that
349
- # returns an instance of AccessControlList.
350
- #
351
- bucket_method(:get_bucket_acl, :get, 'acl',
352
- XML::GetBucketAcl)
338
+ # @overload get_bucket_acl(options = {})
339
+ # @param [Hash] options
340
+ # @option options [required,String] :bucket_name
341
+ # @return [Core::Response]
342
+ bucket_method(:get_bucket_acl, :get, 'acl', XML::GetBucketAcl)
353
343
 
354
- ##
355
344
  # Sets the access control list for an object.
356
- #
357
- # == Required Options
358
- #
359
- # * +:bucket_name+ -- The name of the bucket.
360
- #
361
- # * +:key+ -- The key of the object.
362
- #
363
- # * +:acl+ -- The new acl. This can be a string (which is
364
- # assumed to contain a valid ACL expressed in XML), a
365
- # AccessControlList or any object whose +to_xml+ returns a
366
- # valid ACL expressed in XML.
367
- #
368
- # == Response
369
- #
370
- # The response contains only the standard fields.
345
+ # @overload set_object_acl(options = {})
346
+ # @param [Hash] options
347
+ # @option options [required,String] :bucket_name
348
+ # @option options [required,String] :key
349
+ # @option options [required,String,AccessControlList,Hash] :acl
350
+ # This may be any of the following:
351
+ # * An XML policy as a string (which is passed to S3 uninterpreted)
352
+ # * An {AccessControlList} object
353
+ # * Any object that responds to +#to_xml+
354
+ # * A hash that is compatible with {AccessControlList} #new.
355
+ # @return [Core::Response]
371
356
  object_method(:set_object_acl, :put, 'acl') do
372
357
  configure_request do |req, options|
373
358
  require_acl!(options[:acl]) unless options[:acl].kind_of?(Symbol)
@@ -384,79 +369,21 @@ module AWS
384
369
  end
385
370
  end
386
371
 
387
- ##
388
372
  # Gets the access control list for an object.
389
- #
390
- # == Required Options
391
- #
392
- # * +:bucket_name+ -- The name of the bucket.
393
- #
394
- # * +:key+ -- The key of the object.
395
- #
396
- # == Response
397
- #
398
- # A successful response will have an +acl+ method that
399
- # returns an instance of AccessControlList.
400
- object_method(:get_object_acl, :get, 'acl',
401
- XML::GetBucketAcl)
373
+ # @overload get_object_acl(options = {})
374
+ # @param [Hash] options
375
+ # @option options [required,String] :bucket_name
376
+ # @option options [required,String] :key
377
+ # @return [Core::Response]
378
+ object_method(:get_object_acl, :get, 'acl', XML::GetBucketAcl)
402
379
 
403
- ##
404
380
  # Puts data into an object, replacing the current contents.
405
381
  #
406
- # == Required Options
407
- #
408
- # * +:bucket_name+ -- The name of the bucket that will contain the data.
409
- #
410
- # * +:key+ -- The key under which the data will be saved.
411
- #
412
- # * +:data+ -- The data to upload. This can be provided as an option
413
- # or when using block form (see below). Valid values include:
414
- #
415
- # * A string
416
- #
417
- # * A Pathname object.
418
- #
419
- # * Any object with +read+ and +eof?+ methods that behave
420
- # like Ruby's IO class (e.g. IO, File, Tempfile, StringIO, etc).
421
- # The object must support the following access methods:
422
- #
423
- # read # all at once
424
- # read(length) until eof? # in chunks
425
- #
426
- # == Optional
427
- #
428
- # * +:content_length+ -- Required if you are using block form to
429
- # write data or if it is not possible to determine the size of
430
- # +:data+. Best effort is made to determine the content length of
431
- # strings, files, tempfiles, io objects, and any object that responds
432
- # to #length or #size.
433
- #
434
- # * +:metadata+ -- A hash of metadata to be included with the
435
- # object. These will be sent to S3 as headers prefixed with
436
- # +x-amz-meta+.
437
- #
438
- # * +:acl+ -- A canned access control policy, valid values are:
439
- # * +:private+
440
- # * +:public_read+
441
- # * ...
442
- # Defaults to +:private+
443
- #
444
- # * +:storage_class+ -- Controls whether Reduced Redundancy
445
- # Storage is enabled for the object. Valid values are
446
- # +:standard+ (the default) or +:reduced_redundancy+
447
- #
448
- # * +:cache_control+ -- Can be used to specify caching
449
- # behavior [...]
450
- #
451
- # * +:content_disposition+ -- Specifies presentational
452
- # information [...]
453
- #
454
- # * +:content_encoding+ -- Specifies what content encodings
455
- # have been [...]
456
- #
457
- # * +:content_md5+ -- The base64 encoded 128-bit [...]
458
- #
459
- # * +:content_type+ -- A standard MIME type describing [...]
382
+ # s3_client.put_object({
383
+ # :bucket_name => 'bucket-name',
384
+ # :key => 'readme.txt',
385
+ # :data => 'This is the readme for ...',
386
+ # })
460
387
  #
461
388
  # == Block Form
462
389
  #
@@ -485,11 +412,45 @@ module AWS
485
412
  # sure the HTTP handler you configure for the client meets
486
413
  # your needs.
487
414
  #
488
- # == Response
489
- #
490
- # If bucket versioning is enabled, a successful response will
491
- # have a +version_id+ method that returns the version ID of
492
- # the version that was written in the request.
415
+ # @overload put_object(options = {})
416
+ # @param [Hash] options
417
+ # @option options [required,String] :bucket_name
418
+ # @option options [required,String] :key
419
+ # @option options [required,String,Pathname,File,IO] :data
420
+ # The data to upload. This can be provided as a string,
421
+ # a Pathname object, or any object that responds to
422
+ # +#read+ and +#eof?+ (e.g. IO, File, Tempfile, StringIO, etc).
423
+ # @option options [Integer] :content_length
424
+ # Required if you are using block form to write data or if it is
425
+ # not possible to determine the size of +:data+. A best effort
426
+ # is made to determine the content length of strings, files,
427
+ # tempfiles, io objects, and any object that responds
428
+ # to +#length+ or +#size+.
429
+ # @option options [Hash] :metadata
430
+ # A hash of metadata to be included with the
431
+ # object. These will be sent to S3 as headers prefixed with
432
+ # +x-amz-meta+.
433
+ # @option options [Symbol] :acl (:private) A canned access
434
+ # control policy. Accepted values include:
435
+ # * +:private+
436
+ # * +:public_read+
437
+ # * ...
438
+ # @option options [Symbol] :storage_class+ (:standard)
439
+ # Controls whether Reduced Redundancy Storage is enabled for
440
+ # the object. Valid values are +:standard+ and
441
+ # +:reduced_redundancy+.
442
+ # @option options [String] :cache_control
443
+ # Can be used to specify caching behavior.
444
+ # @option opitons [String] :content_disposition
445
+ # Specifies presentational information.
446
+ # @option options [String] :content_encoding
447
+ # Specifies the content encoding.
448
+ # @option options [String] :content_md5
449
+ # The base64 encoded content md5 of the +:data+.
450
+ # @option options [String] :content_type
451
+ # Specifies the content type.
452
+ # @option options [String] :expires
453
+ # @return [Core::Response]
493
454
  #
494
455
  object_method(:put_object, :put,
495
456
  :header_options => {
@@ -514,91 +475,54 @@ module AWS
514
475
  end
515
476
 
516
477
  process_response do |response|
517
- Core::MetaUtils.extend_method(response, :version_id) do
478
+
479
+ response.data[:version_id] =
518
480
  response.http_response.header('x-amz-version-id')
481
+
482
+ response.data[:etag] = response.http_response.header('ETag')
483
+
484
+ if time = response.http_response.header('Last-Modified')
485
+ response.data[:last_modified] = Time.parse(time)
519
486
  end
520
- Core::MetaUtils.extend_method(response, :etag) do
521
- response.http_response.header('ETag')
522
- end
523
- Core::MetaUtils.extend_method(response, :last_modified) do
524
- Time.parse(response.http_response.header('Last-Modified'))
525
- end
487
+
526
488
  add_sse_to_response(response)
527
489
  end
528
490
 
529
491
  simulate_response do |response|
530
- Core::MetaUtils.extend_method(response, :etag) { "abc123" }
531
- Core::MetaUtils.extend_method(response, :version_id) { nil }
492
+ response.data[:etag] = 'abc123'
493
+ response.data[:version_id] = nil
532
494
  end
495
+
533
496
  end
534
497
 
535
- ##
536
498
  # Gets the data for a key.
499
+ # @overload get_object(options = {})
500
+ # @param [Hash] options
501
+ # @option options [required,String] :bucket_name
502
+ # @option options [required,String] :key
503
+ # @option options [Time] :if_modified_since If specified, the
504
+ # response will contain an additional +:modified+ value that
505
+ # returns true if the object was modified after the given
506
+ # time. If +:modified+ is false, then the response
507
+ # +:data+ value will be +nil+.
508
+ # @option options [Time] :if_unmodified_since If specified, the
509
+ # response will contain an additional +:unmodified+ value
510
+ # that is true if the object was not modified after the
511
+ # given time. If +:unmodified+ returns false, the +:data+
512
+ # value will be +nil+.
513
+ # @option options [String] :if_match If specified, the response
514
+ # will contain an additional +:matches+ value that is true
515
+ # if the object ETag matches the value for this option. If
516
+ # +:matches+ is false, the +:data+ value of the
517
+ # response will be +nil+.
518
+ # @option options [String] :if_none_match If specified, the
519
+ # response will contain an additional +:matches+ value that
520
+ # is true if and only if the object ETag matches the value for
521
+ # this option. If +:matches+ is true, the +:data+ value
522
+ # of the response will be +nil+.
523
+ # @option options [Range<Integer>] :range A byte range of data to request.
524
+ # @return [Core::Response]
537
525
  #
538
- # == Required Options
539
- #
540
- # * +:bucket_name+ -- The name of the bucket that contains the data.
541
- #
542
- # * +:key+ -- The key under which the data exists.
543
- #
544
- # == Optional
545
- #
546
- # * +:if_modified_since+ -- A Time object; if specified, the
547
- # response will contain an additional +modified?+ method that
548
- # returns true if the object was modified after the given
549
- # time. If +modified?+ returns false, the +data+ method of
550
- # the response will return +nil+.
551
- #
552
- # * +:if_unmodified_since+ -- A Time object; if specified, the
553
- # response will contain an additional +unmodified?+ method
554
- # that returns true if the object was not modified after the
555
- # given time. If +unmodified?+ returns false, the +data+
556
- # method of the response will return +nil+.
557
- #
558
- # * +:if_match+ -- A string; if specified, the response will
559
- # contain an additional +matches?+ method that returns true
560
- # if the object ETag matches the value for this option. If
561
- # +matches?+ returns false, the +data+ method of the
562
- # response will return +nil+.
563
- #
564
- # * +:if_none_match+ -- A string; if specified, the response
565
- # will contain an additional +matches?+ method that returns
566
- # true if and only if the object ETag matches the value for
567
- # this option. If +matches?+ returns true, the +data+
568
- # method of the response will return +nil+.
569
- #
570
- # * +:to+ -- A destination for the data. Valid values:
571
- #
572
- # * The path to a file as a string
573
- #
574
- # * A Pathname object
575
- #
576
- # * Any object that supports <code>write(data)</code> and
577
- # +close+ methods like Ruby's IO class
578
- #
579
- # * +:range+ -- TODO: figure out the format for this
580
- # parameter.
581
- #
582
- # == Response
583
- #
584
- # A successful response will have some combination of the
585
- # following methods:
586
- #
587
- # * +data+ -- The object data as a string. This will return
588
- # +nil+ if one of the conditional options above is specified
589
- # and the condition is not met. It will also return +nil+
590
- # if +deleted?+ returns true. It will not be present if the
591
- # +:to+ option is specified.
592
- #
593
- # * +modified?+, +unmodified?+, +matches?+ -- These will be
594
- # present as documented in the conditional options above.
595
- #
596
- # * +version_id+ -- Returns the version ID of the object that
597
- # was written (only for versioned buckets).
598
- #
599
- # * +deleted?+ -- This will return +true+ if the bucket has
600
- # versioning enabled and the object retrieved was a delete
601
- # marker.
602
526
  object_method(:get_object, :get,
603
527
  :header_options => {
604
528
  :if_modified_since => "If-Modified-Since",
@@ -633,15 +557,20 @@ module AWS
633
557
  end
634
558
 
635
559
  process_response do |resp|
636
- Core::MetaUtils.extend_method(resp, :data) { resp.http_response.body }
637
- Core::MetaUtils.extend_method(resp, :version_id) do
638
- http_response.header('x-amz-version-id')
639
- end
560
+ resp.data[:data] = resp.http_response.body
561
+ resp.data[:version_id] = resp.http_response.header('x-amz-version-id')
640
562
  add_sse_to_response(resp)
641
563
  end
642
564
  end
643
565
 
566
+ # @overload head_object(options = {})
567
+ # @param [Hash] options
568
+ # @option options [required,String] :bucket_name
569
+ # @option options [required,String] :key
570
+ # @option options [String] :version_id
571
+ # @return [Core::Response]
644
572
  object_method(:head_object, :head) do
573
+
645
574
  configure_request do |req, options|
646
575
  super(req, options)
647
576
  if options[:version_id]
@@ -652,51 +581,55 @@ module AWS
652
581
  process_response do |resp|
653
582
 
654
583
  # create a hash of user-supplied metadata
655
- Core::MetaUtils.extend_method(resp, :meta) do
656
- meta = {}
657
- resp.http_response.headers.each_pair do |name,value|
658
- if name =~ /^x-amz-meta-(.+)$/i
659
- meta[$1] = [value].flatten.join
660
- end
584
+ meta = {}
585
+ resp.http_response.headers.each_pair do |name,value|
586
+ if name =~ /^x-amz-meta-(.+)$/i
587
+ meta[$1] = [value].flatten.join
661
588
  end
662
- meta
663
589
  end
590
+ meta
591
+ resp.data[:meta] = meta
664
592
 
665
593
  if expiry = resp.http_response.headers['x-amz-expiration']
666
594
  expiry.first =~ /^expiry-date="(.+)", rule-id="(.+)"$/
667
- date = DateTime.parse($1)
668
- rule_id = $2
595
+ exp_date = DateTime.parse($1)
596
+ exp_rule_id = $2
669
597
  else
670
- date = nil
671
- rule_id = nil
598
+ exp_date = nil
599
+ exp_rule_id = nil
672
600
  end
673
- Core::MetaUtils.extend_method(resp, :expiration_date) { date }
674
- Core::MetaUtils.extend_method(resp, :expiration_rule_id) { rule_id }
675
601
 
676
- # create methods for standard response headers
602
+ resp.data[:expiration_date] = exp_date
603
+ resp.data[:expiration_rule_id] = exp_rule_id
604
+
677
605
  {
678
606
  'x-amz-version-id' => :version_id,
679
607
  'content-type' => :content_type,
680
608
  'etag' => :etag,
681
609
  }.each_pair do |header,method|
682
- Core::MetaUtils.extend_method(resp, method) do
683
- http_response.header(header)
684
- end
610
+ resp.data[method] = resp.http_response.header(header)
685
611
  end
686
612
 
687
- Core::MetaUtils.extend_method(resp, :last_modified) do
688
- Time.parse(resp.http_response.header('Last-Modified'))
613
+ if time = resp.http_response.header('Last-Modified')
614
+ resp.data[:last_modified] = Time.parse(time)
689
615
  end
690
616
 
691
- Core::MetaUtils.extend_method(resp, :content_length) do
692
- http_response.header('content-length').to_i
693
- end
617
+ resp.data[:content_length] =
618
+ resp.http_response.header('content-length').to_i
694
619
 
695
620
  add_sse_to_response(resp)
621
+
696
622
  end
697
623
  end
698
624
 
625
+ # @overload delete_object(options = {})
626
+ # @param [Hash] options
627
+ # @option options [required,String] :bucket_name
628
+ # @option options [required,String] :key
629
+ # @option options [String] :version_id
630
+ # @return [Core::Response]
699
631
  object_method(:delete_object, :delete) do
632
+
700
633
  configure_request do |req, options|
701
634
  super(req, options)
702
635
  if options[:version_id]
@@ -705,13 +638,19 @@ module AWS
705
638
  end
706
639
 
707
640
  process_response do |resp|
708
- Core::MetaUtils.extend_method(resp, :version_id) do
709
- http_response.header('x-amz-version-id')
710
- end
641
+ resp.data[:version_id] = resp.http_response.header('x-amz-version-id')
711
642
  end
712
643
 
713
644
  end
714
645
 
646
+ # @overload list_objects(options = {})
647
+ # @param [Hash] options
648
+ # @option options [required,String] :bucket_name
649
+ # @option options [String] :delimiter
650
+ # @option options [String] :marker
651
+ # @option options [String] :max_keys
652
+ # @option options [String] :prefix
653
+ # @return [Core::Response]
715
654
  bucket_method(:list_objects, :get, XML::ListObjects) do
716
655
  configure_request do |req, options|
717
656
  super(req, options)
@@ -724,6 +663,22 @@ module AWS
724
663
  end
725
664
  end
726
665
 
666
+ alias_method :get_bucket, :list_objects
667
+
668
+ # @overload initiate_multipart_upload(options = {})
669
+ # @param [Hash] options
670
+ # @option options [required,String] :bucket_name
671
+ # @option options [required,String] :key
672
+ # @option options [Hash] :metadata
673
+ # @option options [Symbol] :acl
674
+ # @option options [String] :cache_control
675
+ # @option options [String] :content_disposition
676
+ # @option options [String] :content_encoding
677
+ # @option options [String] :content_type
678
+ # @option options [String] :storage_class
679
+ # @option options [String] :server_side_encryption
680
+ # @option options [String] :expires
681
+ # @return [Core::Response]
727
682
  object_method(:initiate_multipart_upload, :post, 'uploads',
728
683
  XML::InitiateMultipartUpload,
729
684
  :header_options => {
@@ -750,6 +705,16 @@ module AWS
750
705
  end
751
706
  end
752
707
 
708
+ # @overload list_multipart_uploads(options = {})
709
+ # @param [Hash] options
710
+ # @option options [required,String] :bucket_name
711
+ # @option options [String] :delimiter
712
+ # @option options [String] :key_marker
713
+ # @option options [String] :max_keys
714
+ # @option options [String] :upload_id_marker
715
+ # @option options [String] :max_uploads
716
+ # @option options [String] :prefix
717
+ # @return [Core::Response]
753
718
  bucket_method(:list_multipart_uploads,
754
719
  :get, 'uploads',
755
720
  XML::ListMultipartUploads) do
@@ -765,6 +730,12 @@ module AWS
765
730
  end
766
731
  end
767
732
 
733
+ # @overload delete_objects(options = {})
734
+ # @param [Hash] options
735
+ # @option options [required,String] :bucket_name
736
+ # @option options [required,Array<String>] :keys
737
+ # @option options [Boolean] :quiet (true)
738
+ # @return [Core::Response]
768
739
  bucket_method(:delete_objects, :post, 'delete', XML::DeleteObjects) do
769
740
  configure_request do |req, options|
770
741
 
@@ -772,7 +743,10 @@ module AWS
772
743
 
773
744
  quiet = options.key?(:quiet) ? options[:quiet] : true
774
745
 
775
- objects = options[:objects].inject('') do |xml,o|
746
+ # previously named this option :objects, since renamed
747
+ keys = options[:objects] || options[:keys]
748
+
749
+ objects = keys.inject('') do |xml,o|
776
750
  xml << "<Object><Key>#{o[:key]}</Key>"
777
751
  xml << "<VersionId>#{o[:version_id]}</VersionId>" if o[:version_id]
778
752
  xml << "</Object>"
@@ -790,6 +764,17 @@ module AWS
790
764
  end
791
765
  end
792
766
 
767
+ # @overload upload_part(options = {})
768
+ # @param [Hash] options
769
+ # @option options [required,String] :bucket_name
770
+ # @option options [required,String] :key
771
+ # @option options [required,String,Pathname,File,IO] :data
772
+ # The data to upload. This can be provided as a string,
773
+ # a Pathname object, or any object that responds to
774
+ # +#read+ and +#eof?+ (e.g. IO, File, Tempfile, StringIO, etc).
775
+ # @option options [required,String] :upload_id
776
+ # @option options [required,Integer] :part_number
777
+ # @return [Core::Response]
793
778
  object_method(:upload_part, :put,
794
779
  :header_options => {
795
780
  :content_md5 => 'Content-MD5'
@@ -806,20 +791,25 @@ module AWS
806
791
  end
807
792
 
808
793
  process_response do |response|
809
- Core::MetaUtils.extend_method(response, :etag) do
810
- response.http_response.header('ETag')
811
- end
812
- Core::MetaUtils.extend_method(response, :last_modified) do
813
- Time.parse(response.http_response.header('Last-Modified'))
794
+ response.data[:etag] = response.http_response.header('ETag')
795
+ if time = response.http_response.header('Last-Modified')
796
+ response.data[:last_modified] = Time.parse(time)
814
797
  end
815
798
  add_sse_to_response(response)
816
799
  end
817
800
 
818
801
  simulate_response do |response|
819
- Core::MetaUtils.extend_method(response, :etag) { "abc123" }
802
+ response.data[:etag] = 'abc123'
820
803
  end
821
804
  end
822
805
 
806
+ # @overload complete_multipart_upload(options = {})
807
+ # @param [Hash] options
808
+ # @option options [required,String] :bucket_name
809
+ # @option options [required,String] :key
810
+ # @option options [required,String] :upload_id
811
+ # @option options [required,Array<String>] :parts
812
+ # @return [Core::Response]
823
813
  object_method(:complete_multipart_upload, :post,
824
814
  XML::CompleteMultipartUpload) do
825
815
  configure_request do |req, options|
@@ -838,17 +828,22 @@ module AWS
838
828
  end
839
829
 
840
830
  process_response do |response|
841
- Core::MetaUtils.extend_method(response, :version_id) do
842
- response.http_response.header('x-amz-version-id')
843
- end
844
831
  add_sse_to_response(response)
832
+ response.data[:version_id] =
833
+ response.http_response.header('x-amz-version-id')
845
834
  end
846
835
 
847
836
  simulate_response do |response|
848
- Core::MetaUtils.extend_method(response, :version_id) { nil }
837
+ response.data[:version_id] = nil
849
838
  end
850
839
  end
851
840
 
841
+ # @overload abort_multipart_upload(options = {})
842
+ # @param [Hash] options
843
+ # @option options [required,String] :bucket_name
844
+ # @option options [required,String] :key
845
+ # @option options [required,String] :upload_id
846
+ # @return [Core::Response]
852
847
  object_method(:abort_multipart_upload, :delete) do
853
848
  configure_request do |req, options|
854
849
  require_upload_id!(options[:upload_id])
@@ -857,8 +852,16 @@ module AWS
857
852
  end
858
853
  end
859
854
 
860
- object_method(:list_parts, :get,
861
- XML::ListParts) do
855
+ # @overload list_parts(options = {})
856
+ # @param [Hash] options
857
+ # @option options [required,String] :bucket_name
858
+ # @option options [required,String] :key
859
+ # @option options [required,String] :upload_id
860
+ # @option options [Integer] :max_parts
861
+ # @option options [Integer] :part_number_marker
862
+ # @return [Core::Response]
863
+ object_method(:list_parts, :get, XML::ListParts) do
864
+
862
865
  configure_request do |req, options|
863
866
  require_upload_id!(options[:upload_id])
864
867
  super(req, options)
@@ -866,21 +869,22 @@ module AWS
866
869
  req.add_param('max-parts', options[:max_parts])
867
870
  req.add_param('part-number-marker', options[:part_number_marker])
868
871
  end
872
+
869
873
  end
870
874
 
871
- ##
872
- # @param [Hash] options
873
- # @option options [required, String] :bucket_name Name of the bucket
874
- # to copy a object into.
875
- # @option options [required, String] :key Where (object key) in the
876
- # bucket the object should be copied to.
877
- # @option options [required, String] :copy_source The name of the
878
- # source bucket and key name of the source object, separated by a
879
- # slash (/). This string must be URL-encoded. Additionally, the
880
- # source bucket must be valid and you must have READ access to
881
- # the valid source object.
882
- # @option options [Symbol] :acl
883
- #
875
+ # Copies an object from one key to another.
876
+ # @overload copy_object(options = {})
877
+ # @param [Hash] options
878
+ # @option options [required, String] :bucket_name Name of the bucket
879
+ # to copy a object into.
880
+ # @option options [required, String] :key Where (object key) in the
881
+ # bucket the object should be copied to.
882
+ # @option options [required, String] :copy_source The source
883
+ # bucket name and key, joined by a forward slash ('/').
884
+ # This string must be URL-encoded. Additionally, you must
885
+ # have read access to the source object.
886
+ # @option options [Symbol] :acl
887
+ # @return [Core::Response]
884
888
  object_method(:copy_object, :put,
885
889
  :header_options => {
886
890
  :copy_source => 'x-amz-copy-source',
@@ -912,14 +916,11 @@ module AWS
912
916
  end
913
917
 
914
918
  process_response do |response|
915
- Core::MetaUtils.extend_method(response, :version_id) do
919
+ response.data[:version_id] =
916
920
  response.http_response.header('x-amz-version-id')
917
- end
918
- Core::MetaUtils.extend_method(response, :etag) do
919
- response.http_response.header('ETag')
920
- end
921
- Core::MetaUtils.extend_method(response, :last_modified) do
922
- Time.parse(response.http_response.header('Last-Modified'))
921
+ response.data[:etag] = response.http_response.header('ETag')
922
+ if time = response.http_response.header('Last-Modified')
923
+ response.data[:last_modified] = Time.parse(time)
923
924
  end
924
925
  add_sse_to_response(response)
925
926
  end
@@ -927,59 +928,60 @@ module AWS
927
928
  end
928
929
 
929
930
  protected
930
- def extract_error_code response
931
- if (response.http_response.status >= 300 ||
931
+
932
+ def extract_error_details response
933
+ if
934
+ (response.http_response.status >= 300 ||
932
935
  response.request_type == :complete_multipart_upload) and
933
- body = response.http_response.body and
934
- parse = Core::XmlGrammar.parse(body) and
935
- parse.respond_to?(:code)
936
- parse.code
936
+ body = response.http_response.body and
937
+ error = Core::XML::Parser.parse(body) and
938
+ error[:code]
939
+ then
940
+ [error[:code], error[:message]]
937
941
  end
938
942
  end
939
943
 
940
- protected
941
- def populate_error response
942
- code = response.http_response.status
943
- if EMPTY_BODY_ERRORS.include?(code) and
944
- response.http_response.body.nil?
945
- response.error =
946
- EMPTY_BODY_ERRORS[code].new(response.http_request,
947
- response.http_response)
944
+ # There are a few of s3 requests that can generate empty bodies and
945
+ # yet still be errors. These return empty bodies to comply with the
946
+ # HTTP spec. We have to detect these errors specially.
947
+ def populate_error resp
948
+ code = resp.http_response.status
949
+ if EMPTY_BODY_ERRORS.include?(code) and resp.http_response.body.nil?
950
+ error_class = EMPTY_BODY_ERRORS[code]
951
+ resp.error = error_class.new(resp.http_request, resp.http_response)
948
952
  else
949
953
  super
950
954
  end
951
955
  end
952
956
 
953
- protected
954
957
  def should_retry? response
955
958
  super or
956
959
  response.request_type == :complete_multipart_upload &&
957
- extract_error_code(response)
960
+ extract_error_details(response)
961
+ # complete multipart upload can return an error inside a
962
+ # 200 level response -- this forces us to parse the
963
+ # response for errors every time
958
964
  end
959
965
 
960
- protected
961
966
  def set_request_data request, options, block
962
967
  request.body_stream = data_stream_from(options, &block)
963
968
  request.headers['Content-Length'] = content_length_from(options)
964
969
  end
965
970
 
966
- protected
967
971
  def new_request
968
972
  S3::Request.new
969
973
  end
970
974
 
971
- protected
972
- def add_sse_to_response(response)
973
- sse = nil
974
- if value = response.http_response.header('x-amz-server-side-encryption')
975
- sse = value.downcase.to_sym
975
+ def add_sse_to_response response
976
+ if sse = response.http_response.header('x-amz-server-side-encryption')
977
+ sse = sse.downcase.to_sym
976
978
  end
977
- Core::MetaUtils.extend_method(response, :server_side_encryption) { sse }
979
+ response.data[:server_side_encryption] = sse
978
980
  end
979
981
 
980
982
  module Validators
981
983
 
982
- # Returns true if the given bucket name is valid.
984
+ # @return [Boolean] Returns true if the given bucket name is valid.
983
985
  def valid_bucket_name?(bucket_name)
984
986
  validate_bucket_name!(bucket_name) rescue false
985
987
  end
@@ -998,6 +1000,7 @@ module AWS
998
1000
  # @return [Boolean] Returns true if the given bucket name may be
999
1001
  # is dns compatible.
1000
1002
  # this bucket n
1003
+ #
1001
1004
  def dns_compatible_bucket_name?(bucket_name)
1002
1005
  return false if
1003
1006
  !valid_bucket_name?(bucket_name) or
@@ -1034,6 +1037,7 @@ module AWS
1034
1037
  # @return [Boolean] Returns true if the bucket name should be used
1035
1038
  # as a path segement instead of dns prefix when making requests
1036
1039
  # against s3.
1040
+ #
1037
1041
  def path_style_bucket_name? bucket_name
1038
1042
  if dns_compatible_bucket_name?(bucket_name)
1039
1043
  bucket_name =~ /\./ ? true : false
@@ -1042,7 +1046,6 @@ module AWS
1042
1046
  end
1043
1047
  end
1044
1048
 
1045
- protected
1046
1049
  def validate! name, value, &block
1047
1050
  if error_msg = yield
1048
1051
  raise ArgumentError, "#{name} #{error_msg}"
@@ -1050,7 +1053,6 @@ module AWS
1050
1053
  value
1051
1054
  end
1052
1055
 
1053
- protected
1054
1056
  def validate_key!(key)
1055
1057
  validate!('key', key) do
1056
1058
  case
@@ -1060,17 +1062,14 @@ module AWS
1060
1062
  end
1061
1063
  end
1062
1064
 
1063
- protected
1064
1065
  def require_bucket_name! bucket_name
1065
1066
  if [nil, ''].include?(bucket_name)
1066
1067
  raise ArgumentError, "bucket_name may not be blank"
1067
1068
  end
1068
1069
  end
1069
1070
 
1070
-
1071
1071
  # Returns true if the given bucket name is valid. If the name
1072
1072
  # is invalid, an ArgumentError is raised.
1073
- protected
1074
1073
  def validate_bucket_name!(bucket_name)
1075
1074
  validate!('bucket_name', bucket_name) do
1076
1075
  case
@@ -1091,7 +1090,6 @@ module AWS
1091
1090
  end
1092
1091
  end
1093
1092
 
1094
- protected
1095
1093
  def require_policy!(policy)
1096
1094
  validate!('policy', policy) do
1097
1095
  case
@@ -1103,7 +1101,6 @@ module AWS
1103
1101
  end
1104
1102
  end
1105
1103
 
1106
- protected
1107
1104
  def require_acl!(acl)
1108
1105
  validate!('acl', acl) do
1109
1106
  case
@@ -1120,14 +1117,12 @@ module AWS
1120
1117
  end
1121
1118
  end
1122
1119
 
1123
- protected
1124
1120
  def require_upload_id!(upload_id)
1125
1121
  validate!("upload_id", upload_id) do
1126
1122
  "must not be blank" if upload_id.to_s.empty?
1127
1123
  end
1128
1124
  end
1129
1125
 
1130
- protected
1131
1126
  def validate_parts!(parts)
1132
1127
  validate!("parts", parts) do
1133
1128
  if !parts.kind_of?(Array)
@@ -1146,7 +1141,6 @@ module AWS
1146
1141
  end
1147
1142
  end
1148
1143
 
1149
- protected
1150
1144
  def json_validation_message(obj)
1151
1145
  if obj.respond_to?(:to_str)
1152
1146
  obj = obj.to_str
@@ -1163,7 +1157,6 @@ module AWS
1163
1157
  "contains invalid JSON: #{error}" if error
1164
1158
  end
1165
1159
 
1166
- protected
1167
1160
  def xml_validation_message(obj)
1168
1161
  if obj.respond_to?(:to_str)
1169
1162
  obj = obj.to_str