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
@@ -0,0 +1,110 @@
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
+ class Client
17
+
18
+ # When a client class extends this module, its API configuration is
19
+ # parsed. For each operation in the API configuration, one client
20
+ # method is added.
21
+ #
22
+ # Clients extending QueryJSON all have in common their method of
23
+ # serializing request (input) parameters and parsing response
24
+ # (output) JSON.
25
+ #
26
+ module QueryJSON
27
+
28
+ def self.extended base
29
+ base.send(:include, ErrorParser)
30
+ base.send(:define_client_methods)
31
+ end
32
+
33
+ # @return [Hash<Symbol,OptionGrammar>] Returns a hash option
34
+ # parsers. Hash keys are client method names and hash
35
+ # values are {OptionGrammar} objects.
36
+ # @private
37
+ def option_parsers
38
+ @option_parsers ||= {}
39
+ end
40
+
41
+ protected
42
+
43
+ # Enumerates through the operations specified in the API
44
+ # configuration (yaml configuration file found in lib/api_config/)
45
+ # and defines one request method per operation.
46
+ def define_client_methods
47
+ api_config[:operations].each do |op|
48
+
49
+ method_name = op[:method]
50
+
51
+ option_parsers[method_name] = OptionGrammar.customize(op[:inputs])
52
+
53
+ end
54
+ end
55
+
56
+ def define_client_method method_name, operation
57
+ add_client_request_method(method_name) do
58
+
59
+ configure_request do |request, options|
60
+
61
+ parser = self.class.option_parsers[method_name]
62
+ x_amz_target = self.class::TARGET_PREFIX + operation
63
+
64
+ request.headers["content-type"] = "application/x-amz-json-1.0"
65
+ request.headers["x-amz-target"] = x_amz_target
66
+ request.body = parser.to_json(options)
67
+
68
+ end
69
+
70
+ process_response do |response|
71
+ response_body = response.http_response.body
72
+ response_body = "{}" if response_body == ""
73
+ data = JSON.load(response_body)
74
+ MetaUtils.extend_method(response, :data) { data }
75
+ end
76
+
77
+ simulate_response do |response|
78
+ data = {}
79
+ MetaUtils.extend_method(response, :data) { data }
80
+ end
81
+
82
+ end
83
+ end
84
+
85
+ module ErrorParser
86
+
87
+ def extract_error_details response
88
+ if
89
+ response.http_response.status >= 300 and
90
+ body = response.http_response.body and
91
+ json = (JSON.load(body) rescue nil) and
92
+ type = json["__type"] and
93
+ matches = type.match(/\#(.*)$/)
94
+ then
95
+ code = matches[1]
96
+ if code == 'RequestEntityTooLarge'
97
+ message = 'Request body must be less than 1 MB'
98
+ else
99
+ message = json['message']
100
+ end
101
+ [code, message]
102
+ end
103
+ end
104
+
105
+ end
106
+
107
+ end
108
+ end
109
+ end
110
+ end
@@ -0,0 +1,122 @@
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
+ class Client
17
+
18
+ # When a client class extends this module, its API configuration
19
+ # is parsed. For each operation in the API configuration, one
20
+ # client method is added.
21
+ #
22
+ # Clients extending QueryXML all have in common their method
23
+ # of serializing request (input) paramters and parsing response
24
+ # (output) XML.
25
+ #
26
+ module QueryXML
27
+
28
+ # @private
29
+ def self.extended base
30
+ base.send(:include, ErrorParser)
31
+ base.send(:define_parsers)
32
+ end
33
+
34
+ # @return [Hash<Symbol,OptionGrammar>] Returns a hash option
35
+ # parsers. Hash keys are client method names and hash
36
+ # values are {OptionGrammar} objects.
37
+ # @private
38
+ def option_parsers
39
+ @option_parsers ||= {}
40
+ end
41
+
42
+ # @return [Hash<Symbol,XML::Parser>] Returns a hash of xml
43
+ # parsers. Hash keys are client method names and hash
44
+ # values are {XML::Parser} objects.
45
+ # @private
46
+ def xml_parsers
47
+ @xml_parsers ||= {}
48
+ end
49
+
50
+ protected
51
+
52
+ # Enumerates through the operations specified in the API
53
+ # configuration (yaml configuration file found in lib/api_config/)
54
+ # and defines one request method per operation.
55
+ def define_parsers
56
+ api_config[:operations].each do |op|
57
+
58
+ method_name = op[:method]
59
+
60
+ option_parsers[method_name] = OptionGrammar.customize(op[:inputs])
61
+ xml_parsers[method_name] = XML::Parser.new(op[:outputs])
62
+
63
+ end
64
+ end
65
+
66
+ def define_client_method method_name, operation_name
67
+ add_client_request_method(method_name) do
68
+
69
+ configure_request do |request, options|
70
+
71
+ now = Time.now.utc.strftime('%Y-%m-%dT%H:%M:%SZ')
72
+
73
+ request.headers['Content-Type'] =
74
+ 'application/x-www-form-urlencoded; charset=utf-8'
75
+
76
+ request.http_method = 'POST'
77
+ request.add_param 'Timestamp', now
78
+ request.add_param 'Version', self.class::API_VERSION
79
+ request.add_param 'Action', operation_name
80
+
81
+ parser = self.class.option_parsers[method_name]
82
+ parser.request_params(options).each do |param|
83
+ request.add_param(param)
84
+ end
85
+
86
+ end
87
+
88
+ process_response do |response|
89
+ parser = self.class.xml_parsers[method_name]
90
+ response.data = parser.parse(response.http_response.body)
91
+ end
92
+
93
+ simulate_response do |response|
94
+ parser = self.class.xml_parsers[method_name]
95
+ response.data = parser.simulate
96
+ end
97
+
98
+ end
99
+ end
100
+
101
+ module ErrorParser
102
+
103
+ protected
104
+
105
+ def extract_error_details response
106
+ if
107
+ response.http_response.status >= 300 and
108
+ body = response.http_response.body and
109
+ error = errors_module::GRAMMAR.parse(body) and
110
+ error[:code]
111
+ then
112
+ [error[:code], error[:message]]
113
+ end
114
+ end
115
+
116
+ end
117
+
118
+ end
119
+ end
120
+ end
121
+ end
122
+
@@ -0,0 +1,242 @@
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
+ # Data is a light wrapper around a Ruby hash that provides
18
+ # method missing access to the hash contents.
19
+ #
20
+ # == Method Missing Access
21
+ #
22
+ # You can access hash content with methods if their keys
23
+ # are symbols.
24
+ #
25
+ # data = AWS::Core::Data.new({ :a => 1, :b => 2, :c => true })
26
+ # data.a #=> 1
27
+ # data.b #=> 2
28
+ # data.c #=> true
29
+ # data.d #=> raises NoMethodError
30
+ #
31
+ # == Boolean Methods
32
+ #
33
+ # Given the structure above you can also use question-mark methods.
34
+ #
35
+ # data.c? #=> true
36
+ # data.d? #=> raises NoMethodError
37
+ #
38
+ # == Nested Hashes
39
+ #
40
+ # If the data contains nested hashes you can chain methods into
41
+ # the structure.
42
+ #
43
+ # data = AWS::Core::Data.new(:a => { :b => { :c => 'abc' }})
44
+ # data.a.b.c #=> 'abc'
45
+ #
46
+ # == Nested Arrays
47
+ #
48
+ # Arrays are wrapped in {Data::List} objects. They ensure any
49
+ # data returned is correctly wrapped so you can continue using
50
+ # method-missing access.
51
+ #
52
+ # data = AWS::Core::Data.new(
53
+ # :people => [
54
+ # {:name => 'john'},
55
+ # {:name => 'jane'},
56
+ # ]})
57
+ #
58
+ # data.people[0].name #=> 'john'
59
+ # data.people[1].name #=> 'jane'
60
+ #
61
+ # data.people.map(&:name) #=> ['john','jane']
62
+ #
63
+ class Data
64
+
65
+ module MethodMissingProxy
66
+
67
+ # @private
68
+ def id
69
+ self[:id] || self.id
70
+ end
71
+
72
+ def [] index_or_key
73
+ Data.cast(@data[index_or_key])
74
+ end
75
+
76
+ # @return [Boolean] Returns true if the passed object equals
77
+ # the wrapped array.
78
+ def eql? other
79
+ if other.is_a?(MethodMissingProxy)
80
+ @data == other._data
81
+ else
82
+ @data == other
83
+ end
84
+ end
85
+ alias_method :==, :eql?
86
+
87
+ protected
88
+
89
+ def method_missing *args, &block
90
+ if block_given?
91
+ return_value = @data.send(*args) do |*values|
92
+ yield(*values.flatten.map{|v| Data.cast(v) })
93
+ end
94
+ Data.cast(return_value)
95
+ else
96
+ Data.cast(@data.send(*args))
97
+ end
98
+ end
99
+
100
+ def _data
101
+ @data
102
+ end
103
+
104
+ end
105
+
106
+ include MethodMissingProxy
107
+
108
+ def method_missing method_name, *args, &block
109
+ if
110
+ args.empty? and !block_given? and
111
+ key = _remove_question_mark(method_name) and
112
+ @data.has_key?(key)
113
+ then
114
+ Data.cast(@data[key])
115
+ else
116
+ super
117
+ end
118
+ end
119
+
120
+ # @param [Hash] data The ruby hash of data you need wrapped.
121
+ def initialize data
122
+ @data = data
123
+ end
124
+
125
+ # @return [Hash] Returns contents of this Data object as a raw hash.
126
+ def to_hash
127
+ @data
128
+ end
129
+ alias_method :to_h, :to_hash
130
+
131
+ # @return [Array]
132
+ def to_a
133
+ @data.to_a
134
+ end
135
+ alias_method :to_ary, :to_a
136
+
137
+ # @param [String,Symbol] method_name
138
+ # @return [Boolean] Returns true if this data object will
139
+ # respond to the given method name.
140
+ def respond_to? method_name
141
+ @data.key?(_remove_question_mark(method_name)) or
142
+ @data.respond_to?(method_name)
143
+ end
144
+
145
+ # Returns an inspection string from the wrapped data.
146
+ #
147
+ # data = AWS::Core::Data.new({ :a => 1, :b => 2, :c => true })
148
+ # data.inspect #=> '{:a=>1, :b=>2, :c=>true}'
149
+ #
150
+ # @return [String]
151
+ #
152
+ def inspect
153
+ @data.inspect
154
+ end
155
+
156
+ # @private
157
+ def kind_of? klass
158
+ if klass == Hash
159
+ true
160
+ else
161
+ super
162
+ end
163
+ end
164
+ alias_method :is_a?, :kind_of?
165
+
166
+ protected
167
+
168
+ def _remove_question_mark method_name
169
+ case method_name
170
+ when Symbol then method_name.to_s.sub(/\?$/, '').to_sym
171
+ when String then method_name.sub(/\?$/, '')
172
+ else method_name
173
+ end
174
+ end
175
+
176
+ class << self
177
+
178
+ # Given a hash, this method returns a {Data} object. Given
179
+ # an Array, this method returns a {Data::List} object. Everything
180
+ # else is returned as is.
181
+ #
182
+ # @param [Object] value The value to conditionally wrap.
183
+ #
184
+ # @return [Data,Data::List,Object] Wraps hashes and lists with
185
+ # Data and List objects, all other objects are returned as
186
+ # is.
187
+ #
188
+ def cast value
189
+ case value
190
+ when Hash then Data.new(value)
191
+ when Array then Data::List.new(value)
192
+ else value
193
+ end
194
+ end
195
+
196
+ end
197
+
198
+ class List
199
+
200
+ include MethodMissingProxy
201
+
202
+ # @param [Array] array
203
+ def initialize array
204
+ @data = array
205
+ end
206
+
207
+ # @return [String] Returns the inspection string for the
208
+ # wrapped array.
209
+ def inspect
210
+ @data.inspect
211
+ end
212
+
213
+ # @return [Array] Returns the contents of this Data::List as
214
+ # a raw array.
215
+ def to_ary
216
+ @data
217
+ end
218
+ alias_method :to_a, :to_ary
219
+
220
+ # #inject works on Core::Data::List in in 1.8.7 and 1.9.3, but not
221
+ # in 1.9.2 unless we define it like so.
222
+ # @private
223
+ def inject *args, &block
224
+ @data.inject(*args) do |obj,value|
225
+ yield(Data.cast(obj),Data.cast(value))
226
+ end
227
+ end
228
+
229
+ # @private
230
+ def kind_of? klass
231
+ if klass == Array
232
+ true
233
+ else
234
+ super
235
+ end
236
+ end
237
+ alias_method :is_a?, :kind_of?
238
+
239
+ end
240
+ end
241
+ end
242
+ end