aws-sdk 1.6.3 → 1.6.4

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 (73) hide show
  1. data/lib/aws/api_config/AutoScaling-2011-01-01.yml +1 -0
  2. data/lib/aws/api_config/CloudFormation-2010-05-15.yml +1 -0
  3. data/lib/aws/api_config/CloudFront-2012-05-05.yml +2137 -0
  4. data/lib/aws/api_config/CloudWatch-2010-08-01.yml +9 -0
  5. data/lib/aws/api_config/DynamoDB-2011-12-05.yml +616 -0
  6. data/lib/aws/api_config/EC2-2012-07-20.yml +1 -0
  7. data/lib/aws/api_config/ELB-2012-06-01.yml +1 -0
  8. data/lib/aws/api_config/EMR-2009-03-31.yml +1 -0
  9. data/lib/aws/api_config/IAM-2010-05-08.yml +1 -0
  10. data/lib/aws/api_config/Route53-2012-02-29.yml +350 -349
  11. data/lib/aws/api_config/SNS-2010-03-31.yml +1 -0
  12. data/lib/aws/api_config/SQS-2011-10-01.yml +1 -0
  13. data/lib/aws/api_config/STS-2011-06-15.yml +1 -0
  14. data/lib/aws/api_config/SimpleDB-2009-04-15.yml +1 -0
  15. data/lib/aws/api_config/SimpleEmailService-2010-12-01.yml +62 -0
  16. data/lib/aws/api_config/SimpleWorkflow-2012-01-25.yml +1637 -0
  17. data/lib/aws/auto_scaling/client.rb +2 -37
  18. data/lib/aws/cloud_formation/client.rb +2 -17
  19. data/lib/aws/cloud_watch/client.rb +2 -15
  20. data/lib/aws/core.rb +24 -4
  21. data/lib/aws/core/client.rb +115 -46
  22. data/lib/aws/core/configuration.rb +6 -0
  23. data/lib/aws/core/credential_providers.rb +1 -0
  24. data/lib/aws/core/http/curb_handler.rb +3 -3
  25. data/lib/aws/core/http/httparty_handler.rb +15 -15
  26. data/lib/aws/core/json_client.rb +19 -77
  27. data/lib/aws/core/json_error_parser.rb +25 -0
  28. data/lib/aws/core/json_request_builder.rb +34 -0
  29. data/lib/aws/core/json_response_parser.rb +81 -0
  30. data/lib/aws/core/log_formatter.rb +25 -25
  31. data/lib/aws/core/option_grammar.rb +123 -115
  32. data/lib/aws/core/options/xml_serializer.rb +13 -9
  33. data/lib/aws/core/query_client.rb +13 -104
  34. data/lib/aws/core/query_error_parser.rb +24 -0
  35. data/lib/aws/core/query_request_builder.rb +47 -0
  36. data/lib/aws/core/query_response_parser.rb +35 -0
  37. data/lib/aws/core/rest_client.rb +13 -62
  38. data/lib/aws/core/rest_error_parser.rb +24 -0
  39. data/lib/aws/core/rest_request_builder.rb +124 -0
  40. data/lib/aws/core/rest_response_parser.rb +48 -0
  41. data/lib/aws/core/xml/parser.rb +2 -2
  42. data/lib/aws/core/xml/root_frame.rb +1 -1
  43. data/lib/aws/dynamo_db.rb +10 -9
  44. data/lib/aws/dynamo_db/binary.rb +35 -0
  45. data/lib/aws/dynamo_db/client.rb +103 -20
  46. data/lib/aws/dynamo_db/config.rb +2 -0
  47. data/lib/aws/dynamo_db/item.rb +3 -0
  48. data/lib/aws/dynamo_db/primary_key_element.rb +2 -1
  49. data/lib/aws/dynamo_db/table.rb +32 -36
  50. data/lib/aws/dynamo_db/table_collection.rb +13 -13
  51. data/lib/aws/dynamo_db/types.rb +34 -9
  52. data/lib/aws/ec2/client.rb +884 -344
  53. data/lib/aws/ec2/filtered_collection.rb +2 -3
  54. data/lib/aws/elb/client.rb +59 -45
  55. data/lib/aws/emr/client.rb +2 -11
  56. data/lib/aws/iam/client.rb +9 -80
  57. data/lib/aws/record/hash_model/attributes.rb +28 -13
  58. data/lib/aws/route_53/client.rb +6 -16
  59. data/lib/aws/s3/client.rb +2 -1
  60. data/lib/aws/s3/encryption_utils.rb +2 -7
  61. data/lib/aws/s3/s3_object.rb +5 -0
  62. data/lib/aws/simple_db/client.rb +2 -14
  63. data/lib/aws/simple_email_service/client.rb +35 -19
  64. data/lib/aws/simple_email_service/identity.rb +49 -10
  65. data/lib/aws/simple_email_service/identity_collection.rb +4 -4
  66. data/lib/aws/simple_workflow/client.rb +2 -38
  67. data/lib/aws/sns/client.rb +2 -19
  68. data/lib/aws/sqs/client.rb +2 -19
  69. data/lib/aws/sqs/errors.rb +5 -5
  70. data/lib/aws/sts/client.rb +2 -6
  71. metadata +14 -5
  72. data/lib/aws/core/rest_client/input_handler.rb +0 -145
  73. data/lib/aws/core/rest_client/output_handler.rb +0 -53
@@ -0,0 +1,25 @@
1
+ # Copyright 2011-2012 Amazon.com, Inc. or its affiliates. All Rights Reserved.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License"). You
4
+ # may not use this file except in compliance with the License. A copy of
5
+ # the License is located at
6
+ #
7
+ # http://aws.amazon.com/apache2.0/
8
+ #
9
+ # or in the "license" file accompanying this file. This file is
10
+ # distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
11
+ # ANY KIND, either express or implied. See the License for the specific
12
+ # language governing permissions and limitations under the License.
13
+
14
+ module AWS
15
+ module Core
16
+
17
+ # @private
18
+ module JSONErrorParser
19
+
20
+ end
21
+
22
+ end
23
+
24
+ end
25
+ end
@@ -0,0 +1,34 @@
1
+ # Copyright 2011-2012 Amazon.com, Inc. or its affiliates. All Rights Reserved.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License"). You
4
+ # may not use this file except in compliance with the License. A copy of
5
+ # the License is located at
6
+ #
7
+ # http://aws.amazon.com/apache2.0/
8
+ #
9
+ # or in the "license" file accompanying this file. This file is
10
+ # distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
11
+ # ANY KIND, either express or implied. See the License for the specific
12
+ # language governing permissions and limitations under the License.
13
+
14
+ module AWS
15
+ module Core
16
+
17
+ # @private
18
+ class JSONRequestBuilder
19
+
20
+ def initialize target_prefix, operation
21
+ @x_amz_target = target_prefix + operation[:name]
22
+ @grammar = OptionGrammar.customize(operation[:inputs])
23
+ end
24
+
25
+ def populate_request request, options
26
+ request.headers["content-type"] = "application/x-amz-json-1.0"
27
+ request.headers["x-amz-target"] = @x_amz_target
28
+ request.body = @grammar.to_json(options)
29
+ end
30
+
31
+ end
32
+
33
+ end
34
+ end
@@ -0,0 +1,81 @@
1
+ # Copyright 2011-2012 Amazon.com, Inc. or its affiliates. All Rights Reserved.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License"). You
4
+ # may not use this file except in compliance with the License. A copy of
5
+ # the License is located at
6
+ #
7
+ # http://aws.amazon.com/apache2.0/
8
+ #
9
+ # or in the "license" file accompanying this file. This file is
10
+ # distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
11
+ # ANY KIND, either express or implied. See the License for the specific
12
+ # language governing permissions and limitations under the License.
13
+
14
+ require 'json'
15
+ require 'time'
16
+ require 'bigdecimal'
17
+ require 'base64'
18
+
19
+ module AWS
20
+ module Core
21
+
22
+ # @private
23
+ class JSONResponseParser
24
+
25
+ def initialize rules
26
+ @rules = rules
27
+ end
28
+
29
+ def extract_data response
30
+ body = response.http_response.body
31
+ body = "{}" if [nil, ''].include?(body)
32
+ translate(JSON.load(body))
33
+ end
34
+
35
+ def simulate
36
+ {}
37
+ end
38
+
39
+ protected
40
+
41
+ # @param [Hash] values
42
+ # @param [Hash] rules
43
+ # @return [Hash]
44
+ def translate values, rules = @rules
45
+ rules.inject({}) do |data,(key,rule)|
46
+ if values.key?(key)
47
+ #data.merge(rule[:symbol] => translate_value(values[key], rule))
48
+ data.merge(key => translate_value(values[key], rule))
49
+ else
50
+ data
51
+ end
52
+ end
53
+ end
54
+
55
+ def translate_hash values, rules
56
+ translate(values, rules[:members])
57
+ end
58
+
59
+ def translate_map values, rules
60
+ values.inject({}) do |data,(key,value)|
61
+ data.merge(key => translate_value(value, rules[:members]))
62
+ end
63
+ end
64
+
65
+ def translate_value value, rule
66
+ case
67
+ when value.is_a?(Array) then value.map{|v| translate_value(v, rule) }
68
+ #when rule[:list] then value.map{|v| translate_value(v, rule) }
69
+ when rule[:type] == :hash then translate_hash(value, rule)
70
+ when rule[:type] == :map then translate_map(value, rule)
71
+ when rule[:type] == :blob then Base64.decode64(value)
72
+ when rule[:type] == :time then Time.at(value)
73
+ when rule[:type] == :big_decimal then BigDecimal.new(value)
74
+ else value
75
+ end
76
+ end
77
+
78
+ end
79
+
80
+ end
81
+ end
@@ -51,8 +51,8 @@ module AWS
51
51
  # * {LogFormatter.colored}
52
52
  #
53
53
  # = Pattern Substitutions
54
- #
55
- # You can put any of these placeholders into you pattern.
54
+ #
55
+ # You can put any of these placeholders into you pattern.
56
56
  #
57
57
  # [+:service+]
58
58
  # The AWS service name (e.g. 'S3', 'EC2', 'SimpleDB', etc)
@@ -61,32 +61,32 @@ module AWS
61
61
  # The AWS region name (e.g. 'us-east-1', 'us-west-1', etc)
62
62
  #
63
63
  # [+:operation+]
64
- # The name of the client request method. This maps to the name of
64
+ # The name of the client request method. This maps to the name of
65
65
  # the serivce API operation (e.g. :describe_instances).
66
66
  #
67
- # [+:options+]
67
+ # [+:options+]
68
68
  # The hash of options passed to the client request method.
69
69
  # Long strings are truncated/summarized if they excede the log
70
70
  # formatters {#max_string_size}. Other objects are inspected.
71
- #
72
- # [+:retry_count+]
71
+ #
72
+ # [+:retry_count+]
73
73
  # The number of times a client request was retried.
74
74
  # Throttlings and service errors trigger the automatic retry logic.
75
75
  # This value indicates how many extra attempts were made before
76
76
  # getting a successful response or giving up.
77
77
  #
78
- # [+:duration+]
78
+ # [+:duration+]
79
79
  # The time it took to generate a response, expressed
80
80
  # in decimal seconds. This time includes everything from
81
81
  # calling the client request method, until that method returns
82
82
  # a value (event retries and retry delays).
83
83
  #
84
- # [+:error_class+]
85
- # The class name of the error returned by the
84
+ # [+:error_class+]
85
+ # The class name of the error returned by the
86
86
  # service. If no error was returned, this will be replcaed by
87
87
  # an empty string.
88
88
  #
89
- # [+:error_message+]
89
+ # [+:error_message+]
90
90
  # The message of the error returned. If
91
91
  # no error was returned by the service, this will be an empty
92
92
  # string.
@@ -94,17 +94,17 @@ module AWS
94
94
  # [+:http_request_method+]
95
95
  # The HTTP request verb (e.g. 'POST', 'PUT', 'GET', etc).
96
96
  #
97
- # [+:http_request_protocol+]
97
+ # [+:http_request_protocol+]
98
98
  # This is replaced by 'http' or 'https'.
99
99
  #
100
- # [+:http_request_host+]
100
+ # [+:http_request_host+]
101
101
  # The host name of the http request endpoint (e.g. 's3.amazon.com').
102
102
  #
103
- # [+:http_request_port+]
103
+ # [+:http_request_port+]
104
104
  # The port number (e.g. '443' or '80').
105
105
  #
106
106
  # [+:http_request_uri+]
107
- # The http request uri folling the host (e.g.
107
+ # The http request uri folling the host (e.g.
108
108
  # '/bucket_name/objects/key?versions').
109
109
  #
110
110
  # [+:http_request_body+]
@@ -124,7 +124,7 @@ module AWS
124
124
  #
125
125
  # [+:http_response_body+]
126
126
  # The http response body contents.
127
- #
127
+ #
128
128
  class LogFormatter
129
129
 
130
130
  # @param [String] pattern The log format pattern should be a string
@@ -272,7 +272,7 @@ module AWS
272
272
  # @return [String]
273
273
  def summarize_hash hash
274
274
  hash.map do |key,v|
275
- ":#{key}=>#{summarize_value(v)}"
275
+ "#{key.inspect}=>#{summarize_value(v)}"
276
276
  end.sort.join(",")
277
277
  end
278
278
 
@@ -288,7 +288,7 @@ module AWS
288
288
  else value.inspect
289
289
  end
290
290
  end
291
-
291
+
292
292
  # @param [String] str
293
293
  # @return [String]
294
294
  def summarize_string str
@@ -307,7 +307,7 @@ module AWS
307
307
  def summarize_file path
308
308
  "#<File:#{path} (#{File.size(path)} bytes)>"
309
309
  end
310
-
310
+
311
311
  # @param [Array] array
312
312
  # @return [String]
313
313
  def summarize_array array
@@ -315,13 +315,13 @@ module AWS
315
315
  end
316
316
 
317
317
  class << self
318
-
318
+
319
319
  # The default log format.
320
320
  #
321
321
  # @example A sample of the default format.
322
322
  #
323
323
  # [AWS SimpleEmailService 200 0.580066 0 retries] list_verified_email_addresses()
324
- #
324
+ #
325
325
  # @return [LogFormatter]
326
326
  #
327
327
  def default
@@ -346,7 +346,7 @@ module AWS
346
346
  # @example A sample of the short format
347
347
  #
348
348
  # [AWS SimpleEmailService 200 0.494532] list_verified_email_addresses
349
- #
349
+ #
350
350
  # @return [LogFormatter]
351
351
  #
352
352
  def short
@@ -375,7 +375,7 @@ module AWS
375
375
  # +-------------------------------------------------------------------------------
376
376
  # | METHOD: POST
377
377
  # | URL: https://email.us-east-1.amazonaws.com::443:/
378
- # | HEADERS: {"content-type"=>"application/x-www-form-urlencoded" ...
378
+ # | HEADERS: {"content-type"=>"application/x-www-form-urlencoded" ...
379
379
  # | BODY: Action=ListVerifiedEmailAddresses&Timestamp= ...
380
380
  # +-------------------------------------------------------------------------------
381
381
  # | RESPONSE
@@ -383,7 +383,7 @@ module AWS
383
383
  # | STATUS: 200
384
384
  # | HEADERS: {"x-amzn-requestid"=>["..."], ...
385
385
  # | BODY: <ListVerifiedEmailAddressesResponse ...
386
- #
386
+ #
387
387
  # @return [LogFormatter]
388
388
  #
389
389
  def debug
@@ -404,7 +404,7 @@ module AWS
404
404
  uri_pattern << ':'
405
405
  uri_pattern << ':http_request_uri'
406
406
 
407
- line = "+" + '-' * 79
407
+ line = "+" + '-' * 79
408
408
 
409
409
  pattern = []
410
410
  pattern << line
@@ -432,7 +432,7 @@ module AWS
432
432
  # @example A sample of the colored format (sans the ansi colors).
433
433
  #
434
434
  # [AWS SimpleEmailService 200 0.580066 0 retries] list_verified_email_addresses()
435
- #
435
+ #
436
436
  # @return [LogFormatter]
437
437
  #
438
438
  def colored
@@ -20,44 +20,44 @@ module AWS
20
20
 
21
21
  # @private
22
22
  class OptionGrammar
23
-
23
+
24
24
  # @private
25
25
  class DefaultOption; end
26
-
26
+
27
27
  # @private
28
28
  class FormatError < ArgumentError
29
29
  attr_accessor :expectation
30
30
  attr_accessor :context_description
31
-
31
+
32
32
  def initialize(expectation, context)
33
33
  @expectation = expectation
34
34
  @context_description = context
35
35
  end
36
-
36
+
37
37
  def to_s
38
38
  "expected #{expectation} for #{context_description}"
39
39
  end
40
40
  end
41
-
41
+
42
42
  # @private
43
43
  module Descriptors
44
-
44
+
45
45
  # @private
46
46
  module NoArgs
47
47
  def apply(option)
48
48
  option.extend self
49
49
  end
50
50
  end
51
-
51
+
52
52
  module Timestamp
53
-
53
+
54
54
  extend NoArgs
55
-
55
+
56
56
  def validate(value, context = nil)
57
57
  true
58
58
  # raise format_error("timestamp value", context) unless
59
59
  # case value
60
- # when String
60
+ # when String
61
61
  # value =~ /^\d+$/ or value =~ /^\d{4}-\d{2}-d{2}T\d{2}:\d{2}:\d{2}Z$/
62
62
  # when String then value =~ /^2009-12-04T20:56:05.000Z\d+$/
63
63
  # when Integer then true
@@ -69,13 +69,13 @@ module AWS
69
69
  # end
70
70
  # value.respond_to? :to_str
71
71
  end
72
-
72
+
73
73
  def encode_value(value)
74
74
  value.to_s
75
75
  # value.to_s
76
76
  # case value
77
77
  # when Integer
78
- # when
78
+ # when
79
79
  # case value
80
80
  # when nil, '' then nil
81
81
  # when DateTime then raw
@@ -84,98 +84,106 @@ module AWS
84
84
  # end
85
85
  end
86
86
  end
87
-
87
+
88
88
  # @private
89
89
  module String
90
-
90
+
91
91
  extend NoArgs
92
-
92
+
93
93
  def validate(value, context = nil)
94
94
  raise format_error("string value", context) unless
95
95
  value.respond_to? :to_str
96
96
  end
97
-
97
+
98
98
  def encode_value(value)
99
99
  value.to_s
100
100
  end
101
-
101
+
102
102
  end
103
-
103
+
104
104
  # @private
105
105
  module Blob
106
-
106
+
107
107
  extend NoArgs
108
-
108
+
109
109
  def validate(value, context = nil)
110
110
  raise format_error("string value", context) unless
111
111
  value.respond_to? :to_str
112
112
  end
113
-
113
+
114
114
  def encode_value(value)
115
115
  Base64.encode64(value.to_s)
116
116
  end
117
-
117
+
118
+ def hash_format(value)
119
+ Base64.encode64(value.to_s).strip
120
+ end
121
+
118
122
  end
119
-
123
+
120
124
  # @private
121
125
  module Integer
122
-
126
+
123
127
  extend NoArgs
124
-
128
+
125
129
  def validate(value, context = nil)
126
130
  raise format_error("integer value", context) unless
127
131
  value.respond_to? :to_int
128
132
  end
129
-
133
+
130
134
  def encode_value(value)
131
135
  value.to_s
132
136
  end
133
-
137
+
134
138
  end
135
139
 
136
140
  Long = Integer
137
-
141
+
138
142
  # @private
139
143
  module Boolean
140
-
144
+
141
145
  extend NoArgs
142
-
146
+
143
147
  def validate(value, context = nil)
144
148
  raise format_error("boolean value", context) unless
145
149
  value == true || value == false
146
150
  end
147
-
151
+
148
152
  def encode_value(value)
149
153
  value.to_s
150
154
  end
151
-
155
+
152
156
  end
153
-
157
+
154
158
  # @private
155
159
  module Required
156
160
  extend NoArgs
157
161
  def required?; true; end
158
162
  end
159
-
163
+
164
+ module Position
165
+ def self.apply *args; end
166
+ end
167
+
160
168
  # @private
161
169
  module Float
162
-
170
+
163
171
  extend NoArgs
164
-
172
+
165
173
  def validate(value, context = nil)
166
174
  raise format_error("float value", context) unless
167
175
  value.kind_of?(Numeric) or
168
176
  value.respond_to? :to_f
169
177
  end
170
-
178
+
171
179
  def encode_value(value)
172
180
  value.to_f.to_s
173
181
  end
174
-
182
+
175
183
  end
176
184
 
177
185
  Double = Float
178
-
186
+
179
187
  # @private
180
188
  module Rename
181
189
  def self.apply(option, new_name)
@@ -183,31 +191,31 @@ module AWS
183
191
  MetaUtils.extend_method(option, :ruby_name) { new_name }
184
192
  end
185
193
  end
186
-
194
+
187
195
  # @private
188
196
  module Pattern
189
-
197
+
190
198
  # def validate value, context = nil
191
199
  # unless value =~ regex
192
200
  # raise format_error("value to match #{regex}", context)
193
201
  # end
194
202
  # end
195
- #
203
+ #
196
204
  # def self.apply option, regex
197
205
  # option.extend(self)
198
206
  # MetaUtils.extend_method(option, :regex) { regex }
199
207
  # end
200
-
208
+
201
209
  def self.apply *args
202
210
  end
203
-
211
+
204
212
  end
205
-
213
+
206
214
  # @private
207
215
  module ListMethods
208
-
216
+
209
217
  module ClassMethods
210
-
218
+
211
219
  def apply(option, member_descriptors)
212
220
  super(option)
213
221
  member_option = option.member_option if option.respond_to?(:member_option)
@@ -224,11 +232,11 @@ module AWS
224
232
  member_option = member_option.extend_with_config(*descriptors)
225
233
  MetaUtils.extend_method(option, :member_option) { member_option }
226
234
  end
227
-
235
+
228
236
  end
229
-
237
+
230
238
  module InstanceMethods
231
-
239
+
232
240
  def validate(value, context = nil)
233
241
  raise format_error("enumerable value", context) unless
234
242
  value.respond_to? :each
@@ -239,7 +247,7 @@ module AWS
239
247
  "member #{i} of #{context_description(context)}")
240
248
  end
241
249
  end
242
-
250
+
243
251
  def request_params(value, prefix = nil)
244
252
  params = []
245
253
  value.each do |v|
@@ -259,64 +267,64 @@ module AWS
259
267
  def join
260
268
  '.'
261
269
  end
262
-
270
+
263
271
  end
264
-
272
+
265
273
  end
266
-
274
+
267
275
  module List
268
-
276
+
269
277
  extend NoArgs
270
278
  extend ListMethods::ClassMethods
271
279
  include ListMethods::InstanceMethods
272
-
280
+
273
281
  end
274
-
282
+
275
283
  module MemberedList
276
-
284
+
277
285
  extend NoArgs
278
286
  extend ListMethods::ClassMethods
279
287
  include ListMethods::InstanceMethods
280
-
288
+
281
289
  def join
282
290
  '.member.'
283
291
  end
284
-
292
+
285
293
  end
286
-
294
+
287
295
  class ListMember < DefaultOption
288
-
296
+
289
297
  def initialize options = {}
290
298
  super("##list-member##")
291
299
  @prefix = options[:prefix] || ''
292
300
  end
293
-
301
+
294
302
  def prefixed_name(prefix)
295
303
  "#{prefix}#{@prefix}"
296
304
  end
297
-
305
+
298
306
  end
299
-
307
+
300
308
  # @private
301
309
  module Structure
302
-
310
+
303
311
  extend NoArgs
304
-
312
+
305
313
  def self.apply(option, members)
306
314
  options = {}
307
315
  options = option.member_options.inject({}) do |memo, member_option|
308
316
  memo[member_option.name] = member_option
309
317
  memo
310
318
  end if option.respond_to?(:member_options)
311
-
319
+
312
320
  super(option)
313
-
321
+
314
322
  members.each do |(name, descriptors)|
315
323
  member_option = options[name] || DefaultOption.new(name)
316
324
  member_option = member_option.extend_with_config(*descriptors)
317
325
  options[name] = member_option
318
326
  end
319
-
327
+
320
328
  MetaUtils.extend_method(option, :member_options) { options.values }
321
329
  by_ruby_name = options.values.inject({}) do |memo, member_option|
322
330
  memo[member_option.ruby_name] = member_option
@@ -325,20 +333,20 @@ module AWS
325
333
  end
326
334
  MetaUtils.extend_method(option, :member_option) { |n| by_ruby_name[n] }
327
335
  end
328
-
336
+
329
337
  def validate(value, context = nil)
330
338
  raise format_error("hash value", context) unless
331
339
  value.respond_to?(:to_hash)
332
-
340
+
333
341
  context = context_description(context)
334
-
342
+
335
343
  value.each do |name, v|
336
344
  name = name.to_s
337
345
  raise ArgumentError.new("unexpected key #{name} for #{context}") unless
338
346
  member_option(name)
339
347
  member_option(name).validate(v, "key #{name} of #{context}")
340
348
  end
341
-
349
+
342
350
  member_options.each do |option|
343
351
  raise ArgumentError.new("missing required key #{option.ruby_name} for #{context}") if
344
352
  option.required? and
@@ -347,7 +355,7 @@ module AWS
347
355
  !value.has_key?(option.name)
348
356
  end
349
357
  end
350
-
358
+
351
359
  def request_params(values, prefix = nil)
352
360
  values.map do |name, value|
353
361
  name = name.to_s
@@ -416,7 +424,7 @@ module AWS
416
424
 
417
425
  end
418
426
  end
419
-
427
+
420
428
 
421
429
  def hash_format(value)
422
430
  value.inject({}) do |hash, (key, value)|
@@ -451,26 +459,26 @@ module AWS
451
459
  end
452
460
 
453
461
  end
454
-
462
+
455
463
  # @private
456
464
  module Boolean
457
465
  extend NoArgs
458
466
  end
459
-
467
+
460
468
  end
461
-
469
+
462
470
  class DefaultOption
463
-
471
+
464
472
  attr_reader :name
465
-
473
+
466
474
  def initialize(name)
467
475
  @name = name
468
476
  end
469
-
477
+
470
478
  def ruby_name
471
479
  Inflection.ruby_name(name)
472
480
  end
473
-
481
+
474
482
  def request_params(value, prefix = nil)
475
483
  [Http::Request::Param.new(prefixed_name(prefix), encode_value(value))]
476
484
  end
@@ -483,24 +491,24 @@ module AWS
483
491
  return "#{prefix}.#{name}" if prefix
484
492
  name
485
493
  end
486
-
494
+
487
495
  def encode_value(value)
488
496
  value
489
497
  end
490
-
498
+
491
499
  def required?
492
500
  false
493
501
  end
494
-
502
+
495
503
  def format_error(expected, context = nil)
496
504
  context = context_description(context)
497
505
  FormatError.new(expected, context)
498
506
  end
499
-
507
+
500
508
  def context_description(context)
501
509
  context or "option #{ruby_name}"
502
510
  end
503
-
511
+
504
512
  def extend_with_config(*descriptors)
505
513
  option = clone
506
514
  descriptors.each do |desc|
@@ -521,16 +529,16 @@ module AWS
521
529
  end
522
530
  option
523
531
  end
524
-
532
+
525
533
  include Descriptors::String
526
-
534
+
527
535
  end
528
-
536
+
529
537
  # @private
530
538
  module ModuleMethods
531
-
539
+
532
540
  include Inflection
533
-
541
+
534
542
  def customize(config = [])
535
543
  m = Class.new(self)
536
544
  supported_options = m.supported_options.inject({}) do |memo, opt|
@@ -547,7 +555,7 @@ module AWS
547
555
  option = option.extend_with_config(*value_desc)
548
556
  supported_options[option.name] = option
549
557
  end
550
-
558
+
551
559
  supported_ary = supported_options.values
552
560
  MetaUtils.extend_method(m, :supported_options) { supported_ary }
553
561
  supported_ruby_names = supported_ary.inject({}) do |memo, opt|
@@ -560,18 +568,18 @@ module AWS
560
568
  opt.validate(value)
561
569
  end
562
570
  end
563
-
571
+
564
572
  m
565
573
  end
566
-
574
+
567
575
  def option(name)
568
576
  nil
569
577
  end
570
-
578
+
571
579
  def supported_options
572
580
  []
573
581
  end
574
-
582
+
575
583
  def validate(options)
576
584
  options.each do |name, value|
577
585
  name = name.to_s
@@ -614,20 +622,20 @@ module AWS
614
622
  def included(m)
615
623
  m.extend(self::ModuleMethods)
616
624
  end
617
-
625
+
618
626
  protected
619
627
  def parse_option(option)
620
628
  value_desc = nil
621
629
  if option.kind_of? Hash
622
630
  raise ArgumentError.new("passed empty hash where an option was expected") if
623
631
  option.empty?
624
-
632
+
625
633
  raise ArgumentError.new("too many entries in option description") if
626
634
  option.size > 1
627
-
635
+
628
636
  (name, value_desc) = option.to_a.first
629
637
  name = name.to_s
630
-
638
+
631
639
  raise ArgumentError.new("expected an array for "+
632
640
  "value description of option #{name},"+
633
641
  "got #{value_desc.inspect}") unless
@@ -635,12 +643,12 @@ module AWS
635
643
  else
636
644
  name = option
637
645
  end
638
-
646
+
639
647
  value_desc ||= []
640
-
648
+
641
649
  [name, value_desc]
642
650
  end
643
-
651
+
644
652
  protected
645
653
  def apply_required_descriptor(m, name)
646
654
  name = ruby_name(name)
@@ -649,7 +657,7 @@ module AWS
649
657
  opts.key? name or opts.key? name.to_sym
650
658
  end
651
659
  end
652
-
660
+
653
661
  protected
654
662
  def apply_integer_descriptor(m, name)
655
663
  MetaUtils.extend_method(m, "validate_#{ruby_name(name)}") do |value|
@@ -657,7 +665,7 @@ module AWS
657
665
  value.respond_to? :to_int
658
666
  end
659
667
  end
660
-
668
+
661
669
  protected
662
670
  def apply_string_descriptor(m, name)
663
671
  MetaUtils.extend_method(m, "validate_#{ruby_name(name)}") do |value|
@@ -665,7 +673,7 @@ module AWS
665
673
  value.respond_to? :to_str
666
674
  end
667
675
  end
668
-
676
+
669
677
  protected
670
678
  def apply_list_descriptor(m, name, arg)
671
679
  MetaUtils.extend_method(m, "validate_#{ruby_name(name)}") do |value|
@@ -687,14 +695,14 @@ module AWS
687
695
  end
688
696
  end
689
697
  end
690
-
698
+
691
699
  protected
692
700
  def apply_rename_descriptor(m, name, new_name)
693
701
  name = ruby_name(name)
694
702
  MetaUtils.extend_method(m, :validate) do |opts|
695
703
  raise ArgumentError.new("unexpected option foo") if
696
704
  opts.key?(name) or opts.key?(name.to_sym)
697
-
705
+
698
706
  opts = opts.dup
699
707
  opts[name] = opts[new_name] if opts.key?(new_name)
700
708
  opts[name.to_sym] = opts[new_name.to_sym] if opts.key?(new_name.to_sym)
@@ -702,27 +710,27 @@ module AWS
702
710
  opts.delete(new_name.to_sym)
703
711
  super(opts)
704
712
  end
705
-
713
+
706
714
  # couldn't find a better way to alias a class method
707
715
  method = m.method("params_for_#{name}")
708
716
  MetaUtils.extend_method(m, "params_for_#{new_name}") do |value|
709
717
  method.call(value)
710
718
  end
711
719
  end
712
-
720
+
713
721
  end
714
722
 
715
723
  class MapOption < DefaultOption
716
724
  def param_name
717
- @param_name || name
725
+ @param_name || name
718
726
  end
719
727
  def param_name= name
720
728
  @param_name = name
721
729
  end
722
730
  end
723
-
731
+
724
732
  extend ModuleMethods
725
-
733
+
726
734
  end
727
735
  end
728
736
  end