aws-sdk 1.4.1 → 1.5.0

Sign up to get free protection for your applications and to get access to all the features.
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