mss-sdk 1.0.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.
- checksums.yaml +7 -0
- data/.yardopts +9 -0
- data/LICENSE.txt +0 -0
- data/README.md +192 -0
- data/bin/mss-rb +178 -0
- data/ca-bundle.crt +3554 -0
- data/lib/mss/core/async_handle.rb +89 -0
- data/lib/mss/core/cacheable.rb +76 -0
- data/lib/mss/core/client.rb +786 -0
- data/lib/mss/core/collection/simple.rb +81 -0
- data/lib/mss/core/collection/with_limit_and_next_token.rb +70 -0
- data/lib/mss/core/collection/with_next_token.rb +96 -0
- data/lib/mss/core/collection.rb +262 -0
- data/lib/mss/core/configuration.rb +527 -0
- data/lib/mss/core/credential_providers.rb +653 -0
- data/lib/mss/core/data.rb +251 -0
- data/lib/mss/core/deprecations.rb +83 -0
- data/lib/mss/core/endpoints.rb +36 -0
- data/lib/mss/core/http/connection_pool.rb +374 -0
- data/lib/mss/core/http/curb_handler.rb +150 -0
- data/lib/mss/core/http/handler.rb +88 -0
- data/lib/mss/core/http/net_http_handler.rb +144 -0
- data/lib/mss/core/http/patch.rb +98 -0
- data/lib/mss/core/http/request.rb +258 -0
- data/lib/mss/core/http/response.rb +80 -0
- data/lib/mss/core/indifferent_hash.rb +87 -0
- data/lib/mss/core/inflection.rb +55 -0
- data/lib/mss/core/ini_parser.rb +41 -0
- data/lib/mss/core/json_client.rb +46 -0
- data/lib/mss/core/json_parser.rb +75 -0
- data/lib/mss/core/json_request_builder.rb +34 -0
- data/lib/mss/core/json_response_parser.rb +78 -0
- data/lib/mss/core/lazy_error_classes.rb +107 -0
- data/lib/mss/core/log_formatter.rb +426 -0
- data/lib/mss/core/managed_file.rb +31 -0
- data/lib/mss/core/meta_utils.rb +44 -0
- data/lib/mss/core/model.rb +61 -0
- data/lib/mss/core/naming.rb +29 -0
- data/lib/mss/core/option_grammar.rb +737 -0
- data/lib/mss/core/options/json_serializer.rb +81 -0
- data/lib/mss/core/options/validator.rb +154 -0
- data/lib/mss/core/options/xml_serializer.rb +117 -0
- data/lib/mss/core/page_result.rb +74 -0
- data/lib/mss/core/policy.rb +938 -0
- data/lib/mss/core/query_client.rb +40 -0
- data/lib/mss/core/query_error_parser.rb +23 -0
- data/lib/mss/core/query_request_builder.rb +46 -0
- data/lib/mss/core/query_response_parser.rb +34 -0
- data/lib/mss/core/region.rb +84 -0
- data/lib/mss/core/region_collection.rb +79 -0
- data/lib/mss/core/resource.rb +412 -0
- data/lib/mss/core/resource_cache.rb +39 -0
- data/lib/mss/core/response.rb +214 -0
- data/lib/mss/core/response_cache.rb +49 -0
- data/lib/mss/core/rest_error_parser.rb +23 -0
- data/lib/mss/core/rest_json_client.rb +39 -0
- data/lib/mss/core/rest_request_builder.rb +153 -0
- data/lib/mss/core/rest_response_parser.rb +65 -0
- data/lib/mss/core/rest_xml_client.rb +46 -0
- data/lib/mss/core/service_interface.rb +82 -0
- data/lib/mss/core/signers/base.rb +45 -0
- data/lib/mss/core/signers/cloud_front.rb +55 -0
- data/lib/mss/core/signers/s3.rb +158 -0
- data/lib/mss/core/signers/version_2.rb +71 -0
- data/lib/mss/core/signers/version_3.rb +85 -0
- data/lib/mss/core/signers/version_3_https.rb +60 -0
- data/lib/mss/core/signers/version_4/chunk_signed_stream.rb +190 -0
- data/lib/mss/core/signers/version_4.rb +227 -0
- data/lib/mss/core/uri_escape.rb +43 -0
- data/lib/mss/core/xml/frame.rb +245 -0
- data/lib/mss/core/xml/frame_stack.rb +84 -0
- data/lib/mss/core/xml/grammar.rb +306 -0
- data/lib/mss/core/xml/parser.rb +69 -0
- data/lib/mss/core/xml/root_frame.rb +64 -0
- data/lib/mss/core/xml/sax_handlers/libxml.rb +46 -0
- data/lib/mss/core/xml/sax_handlers/nokogiri.rb +55 -0
- data/lib/mss/core/xml/sax_handlers/ox.rb +40 -0
- data/lib/mss/core/xml/sax_handlers/rexml.rb +46 -0
- data/lib/mss/core/xml/stub.rb +122 -0
- data/lib/mss/core.rb +602 -0
- data/lib/mss/errors.rb +161 -0
- data/lib/mss/rails.rb +194 -0
- data/lib/mss/s3/access_control_list.rb +262 -0
- data/lib/mss/s3/acl_object.rb +263 -0
- data/lib/mss/s3/acl_options.rb +200 -0
- data/lib/mss/s3/bucket.rb +757 -0
- data/lib/mss/s3/bucket_collection.rb +161 -0
- data/lib/mss/s3/bucket_lifecycle_configuration.rb +472 -0
- data/lib/mss/s3/bucket_region_cache.rb +51 -0
- data/lib/mss/s3/bucket_tag_collection.rb +110 -0
- data/lib/mss/s3/bucket_version_collection.rb +78 -0
- data/lib/mss/s3/cipher_io.rb +119 -0
- data/lib/mss/s3/client/xml.rb +265 -0
- data/lib/mss/s3/client.rb +2076 -0
- data/lib/mss/s3/config.rb +60 -0
- data/lib/mss/s3/cors_rule.rb +107 -0
- data/lib/mss/s3/cors_rule_collection.rb +193 -0
- data/lib/mss/s3/data_options.rb +190 -0
- data/lib/mss/s3/encryption_utils.rb +145 -0
- data/lib/mss/s3/errors.rb +93 -0
- data/lib/mss/s3/multipart_upload.rb +353 -0
- data/lib/mss/s3/multipart_upload_collection.rb +75 -0
- data/lib/mss/s3/object_collection.rb +355 -0
- data/lib/mss/s3/object_metadata.rb +102 -0
- data/lib/mss/s3/object_upload_collection.rb +76 -0
- data/lib/mss/s3/object_version.rb +153 -0
- data/lib/mss/s3/object_version_collection.rb +88 -0
- data/lib/mss/s3/paginated_collection.rb +74 -0
- data/lib/mss/s3/policy.rb +73 -0
- data/lib/mss/s3/prefix_and_delimiter_collection.rb +46 -0
- data/lib/mss/s3/prefixed_collection.rb +84 -0
- data/lib/mss/s3/presign_v4.rb +135 -0
- data/lib/mss/s3/presigned_post.rb +574 -0
- data/lib/mss/s3/region_detection.rb +75 -0
- data/lib/mss/s3/request.rb +61 -0
- data/lib/mss/s3/s3_object.rb +1795 -0
- data/lib/mss/s3/tree/branch_node.rb +67 -0
- data/lib/mss/s3/tree/child_collection.rb +103 -0
- data/lib/mss/s3/tree/leaf_node.rb +93 -0
- data/lib/mss/s3/tree/node.rb +21 -0
- data/lib/mss/s3/tree/parent.rb +86 -0
- data/lib/mss/s3/tree.rb +115 -0
- data/lib/mss/s3/uploaded_part.rb +81 -0
- data/lib/mss/s3/uploaded_part_collection.rb +83 -0
- data/lib/mss/s3/website_configuration.rb +101 -0
- data/lib/mss/s3.rb +161 -0
- data/lib/mss/version.rb +16 -0
- data/lib/mss-sdk.rb +2 -0
- data/lib/mss.rb +14 -0
- data/rails/init.rb +14 -0
- metadata +201 -0
@@ -0,0 +1,81 @@
|
|
1
|
+
# Copyright 2011-2013 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
|
+
#
|
8
|
+
# or in the "license" file accompanying this file. This file is
|
9
|
+
# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
|
10
|
+
# ANY KIND, either express or implied. See the License for the specific
|
11
|
+
# language governing permissions and limitations under the License.
|
12
|
+
|
13
|
+
require 'json'
|
14
|
+
require 'base64'
|
15
|
+
|
16
|
+
module MSS
|
17
|
+
module Core
|
18
|
+
module Options
|
19
|
+
|
20
|
+
# Given a hash of serialization rules, a JSONSerializer can convert
|
21
|
+
# a hash of request options into a JSON document. The request options
|
22
|
+
# are validated before returning JSON.
|
23
|
+
class JSONSerializer
|
24
|
+
|
25
|
+
# @param [Hash] rules A hash of option rules to validate against.
|
26
|
+
# @param [String,nil] payload_param
|
27
|
+
def initialize rules, payload_param
|
28
|
+
@payload_param = payload_param
|
29
|
+
@rules = @payload_param ? rules[@payload_param][:members] : rules
|
30
|
+
end
|
31
|
+
|
32
|
+
# @return [String] Returns the name of the API operation.
|
33
|
+
attr_reader :operation_name
|
34
|
+
|
35
|
+
# @return [String]
|
36
|
+
attr_reader :namespace
|
37
|
+
|
38
|
+
# @return [Hash]
|
39
|
+
attr_reader :rules
|
40
|
+
|
41
|
+
# @overload serialize!(request_options)
|
42
|
+
# @param [Hash] request_options A hash of already validated
|
43
|
+
# request options with normalized values.
|
44
|
+
# @return [String] Returns an string of the request parameters
|
45
|
+
# serialized into XML.
|
46
|
+
def serialize request_options
|
47
|
+
request_options = request_options[@payload_param] if @payload_param
|
48
|
+
data = normalize_keys(request_options, rules)
|
49
|
+
if rules.any?{|k,v| v[:location] == 'body' }
|
50
|
+
data = data.values.first
|
51
|
+
end
|
52
|
+
JSON.pretty_generate(data)
|
53
|
+
end
|
54
|
+
|
55
|
+
protected
|
56
|
+
|
57
|
+
def normalize_keys values, rules
|
58
|
+
values.inject({}) do |h,(k,v)|
|
59
|
+
child_rules = rules[k]
|
60
|
+
child_name = child_rules[:name] || Inflection.class_name(k.to_s)
|
61
|
+
h.merge(child_name => normalize_value(v, child_rules))
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
def normalize_value value, rules
|
66
|
+
case rules[:type]
|
67
|
+
when :hash then normalize_keys(value, rules[:members])
|
68
|
+
when :array then value.map{|v| normalize_value(v, rules[:members]) }
|
69
|
+
when :map
|
70
|
+
value.inject({}) do |h,(k,v)|
|
71
|
+
h.merge(k => normalize_value(v, rules[:members]))
|
72
|
+
end
|
73
|
+
when :blob then Base64.encode64(value.read).strip
|
74
|
+
else value
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
@@ -0,0 +1,154 @@
|
|
1
|
+
# Copyright 2011-2013 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
|
+
#
|
8
|
+
# or in the "license" file accompanying this file. This file is
|
9
|
+
# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
|
10
|
+
# ANY KIND, either express or implied. See the License for the specific
|
11
|
+
# language governing permissions and limitations under the License.
|
12
|
+
|
13
|
+
module MSS
|
14
|
+
module Core
|
15
|
+
module Options
|
16
|
+
|
17
|
+
# Given a hash of validation rules, a validator validate request
|
18
|
+
# options. Validations support:
|
19
|
+
#
|
20
|
+
# * rejecting unknown options
|
21
|
+
# * ensuring presence of required options
|
22
|
+
# * validating expected option types (e.g. hash, array, string,
|
23
|
+
# integer, etc).
|
24
|
+
#
|
25
|
+
# After validating, a hash of request options is returned with
|
26
|
+
# with normalized values (with converted types).
|
27
|
+
class Validator
|
28
|
+
|
29
|
+
# @param [Hash] rules A hash of option rules to validate against.
|
30
|
+
def initialize rules
|
31
|
+
@rules = rules
|
32
|
+
end
|
33
|
+
|
34
|
+
# @return [Hash]
|
35
|
+
attr_reader :rules
|
36
|
+
|
37
|
+
# @overload validate!(request_options)
|
38
|
+
# @param [Hash] request_options The hash of options to validate.
|
39
|
+
# @raise [ArgumentError] Raised when the options do not validate.
|
40
|
+
# @return [Hash]
|
41
|
+
def validate! request_options, rules = @rules
|
42
|
+
|
43
|
+
# Verify all required options are present.
|
44
|
+
rules.each_pair do |opt_name, opt_rules|
|
45
|
+
if opt_rules[:required]
|
46
|
+
unless request_options.key?(opt_name)
|
47
|
+
raise ArgumentError, "missing required option #{opt_name.inspect}"
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
request_options.inject({}) do |options, (opt_name, value)|
|
53
|
+
|
54
|
+
# Ensure this is a valid/accepted option
|
55
|
+
unless rules.key?(opt_name)
|
56
|
+
raise ArgumentError, "unexpected option #{opt_name.inspect}"
|
57
|
+
end
|
58
|
+
|
59
|
+
# Validate and convert the value
|
60
|
+
valid_value = validate_value(rules[opt_name], value, opt_name)
|
61
|
+
|
62
|
+
options.merge(opt_name => valid_value)
|
63
|
+
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
protected
|
68
|
+
|
69
|
+
# Proxies calls to the correct validation method based on the
|
70
|
+
# rules[:type].
|
71
|
+
def validate_value *args
|
72
|
+
send("validate_#{args.first[:type]}", *args)
|
73
|
+
end
|
74
|
+
|
75
|
+
# Ensures the value is a hash and validates the hash context.
|
76
|
+
def validate_hash rules, value, opt_name, context = nil
|
77
|
+
unless value.respond_to?(:to_hash)
|
78
|
+
format_error('hash value', opt_name, context)
|
79
|
+
end
|
80
|
+
validate!(value.to_hash, rules[:members])
|
81
|
+
end
|
82
|
+
|
83
|
+
def validate_map rules, value, opt_name, context = nil
|
84
|
+
unless value.respond_to?(:to_hash)
|
85
|
+
format_error('hash value', opt_name, context)
|
86
|
+
end
|
87
|
+
value.inject({}) do |values,(k,v)|
|
88
|
+
context = "member #{k.inspect} of :#{opt_name}"
|
89
|
+
values[k] = validate_value(rules[:members], v, opt_name, context)
|
90
|
+
values
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
# Ensures the value is an array (or at least enumerable) and
|
95
|
+
# that the yielded values are valid.
|
96
|
+
def validate_array rules, value, opt_name, context = nil
|
97
|
+
unless value.respond_to?(:each)
|
98
|
+
format_error('enumerable value', opt_name, context)
|
99
|
+
end
|
100
|
+
values = []
|
101
|
+
value.each do |v|
|
102
|
+
context = "member #{values.size} of :#{opt_name}"
|
103
|
+
values << validate_value(rules[:members], v, opt_name, context)
|
104
|
+
end
|
105
|
+
values
|
106
|
+
end
|
107
|
+
|
108
|
+
# Ensures the value is a string.
|
109
|
+
def validate_string rules, value, opt_name, context = nil
|
110
|
+
|
111
|
+
unless value.respond_to?(:to_str)
|
112
|
+
format_error('string value', opt_name, context)
|
113
|
+
end
|
114
|
+
|
115
|
+
rules[:lstrip] ?
|
116
|
+
value.to_str.sub(/^#{rules[:lstrip]}/, '') :
|
117
|
+
value.to_str
|
118
|
+
end
|
119
|
+
|
120
|
+
# Ensures the value is a boolean.
|
121
|
+
def validate_boolean rules, value, opt_name, context = nil
|
122
|
+
unless [true, false].include?(value)
|
123
|
+
format_error('true or false', opt_name, context)
|
124
|
+
end
|
125
|
+
value
|
126
|
+
end
|
127
|
+
|
128
|
+
# Ensures the value is an integer.
|
129
|
+
def validate_integer rules, value, opt_name, context = nil
|
130
|
+
unless value.respond_to?(:to_int)
|
131
|
+
format_error('integer value', opt_name, context)
|
132
|
+
end
|
133
|
+
value.to_int
|
134
|
+
end
|
135
|
+
|
136
|
+
# Ensures the value is a timestamp.
|
137
|
+
def validate_timestamp rules, value, opt_name, context = nil
|
138
|
+
# TODO : add validation to timestamps values
|
139
|
+
value.to_s
|
140
|
+
end
|
141
|
+
|
142
|
+
def validate_blob rules, value, opt_name, context = nil
|
143
|
+
value
|
144
|
+
end
|
145
|
+
|
146
|
+
def format_error description, opt_name, context
|
147
|
+
context = context || "option :#{opt_name}"
|
148
|
+
raise ArgumentError, "expected #{description} for #{context}"
|
149
|
+
end
|
150
|
+
|
151
|
+
end
|
152
|
+
end
|
153
|
+
end
|
154
|
+
end
|
@@ -0,0 +1,117 @@
|
|
1
|
+
# Copyright 2011-2013 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
|
+
#
|
8
|
+
# or in the "license" file accompanying this file. This file is
|
9
|
+
# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
|
10
|
+
# ANY KIND, either express or implied. See the License for the specific
|
11
|
+
# language governing permissions and limitations under the License.
|
12
|
+
|
13
|
+
require 'nokogiri'
|
14
|
+
|
15
|
+
module MSS
|
16
|
+
module Core
|
17
|
+
module Options
|
18
|
+
|
19
|
+
# Given a hash of serialization rules, an XMLSerializer can convert
|
20
|
+
# a hash of request options into XML. The request options are
|
21
|
+
# validated before returning XML.
|
22
|
+
class XMLSerializer
|
23
|
+
|
24
|
+
# @param [String] namespace
|
25
|
+
# @param [String] operation_name
|
26
|
+
# @param [Hash] operation
|
27
|
+
def initialize namespace, operation_name, operation
|
28
|
+
@namespace = namespace
|
29
|
+
@operation_name = operation_name
|
30
|
+
@rules = operation[:inputs]
|
31
|
+
@http = operation[:http]
|
32
|
+
@validator = Validator.new(rules)
|
33
|
+
end
|
34
|
+
|
35
|
+
# @return [String] Returns the name of the API operation.
|
36
|
+
attr_reader :operation_name
|
37
|
+
|
38
|
+
# @return [String]
|
39
|
+
attr_reader :namespace
|
40
|
+
|
41
|
+
# @return [Hash]
|
42
|
+
attr_reader :rules
|
43
|
+
|
44
|
+
# @return [Hash,nil]
|
45
|
+
attr_reader :http
|
46
|
+
|
47
|
+
# @return [Validator]
|
48
|
+
attr_reader :validator
|
49
|
+
|
50
|
+
# @overload serialize!(request_options)
|
51
|
+
# @param [Hash] request_options A hash of already validated
|
52
|
+
# request options with normalized values.
|
53
|
+
# @return [String] Returns an string of the request parameters
|
54
|
+
# serialized into XML.
|
55
|
+
def serialize request_options
|
56
|
+
if http && http[:request_payload]
|
57
|
+
payload = http[:request_payload]
|
58
|
+
root_node_name = rules[payload][:name]
|
59
|
+
params = request_options[payload]
|
60
|
+
rules = self.rules[payload][:members]
|
61
|
+
else
|
62
|
+
root_node_name = "#{operation_name}Request"
|
63
|
+
params = request_options
|
64
|
+
rules = self.rules
|
65
|
+
end
|
66
|
+
xml = Nokogiri::XML::Builder.new
|
67
|
+
xml.send(root_node_name, :xmlns => namespace) do |xml|
|
68
|
+
hash_members_xml(params, rules, xml)
|
69
|
+
end
|
70
|
+
xml.doc.root.to_xml
|
71
|
+
end
|
72
|
+
|
73
|
+
protected
|
74
|
+
|
75
|
+
def to_xml builder, opt_name, rules, value
|
76
|
+
|
77
|
+
xml_name = rules[:name]
|
78
|
+
xml_name ||= opt_name.is_a?(String) ?
|
79
|
+
opt_name : Inflection.class_name(opt_name.to_s)
|
80
|
+
|
81
|
+
case value
|
82
|
+
when Hash
|
83
|
+
|
84
|
+
builder.send(xml_name) do |builder|
|
85
|
+
hash_members_xml(value, rules[:members], builder)
|
86
|
+
end
|
87
|
+
|
88
|
+
when Array
|
89
|
+
builder.send(xml_name) do
|
90
|
+
value.each do |member_value|
|
91
|
+
to_xml(builder, 'member', rules[:members], member_value)
|
92
|
+
end
|
93
|
+
end
|
94
|
+
else builder.send(xml_name, value)
|
95
|
+
end
|
96
|
+
|
97
|
+
end
|
98
|
+
|
99
|
+
def hash_members_xml hash, rules, builder
|
100
|
+
xml_ordered_members(rules).each do |member_name|
|
101
|
+
if hash.key?(member_name)
|
102
|
+
value = hash[member_name]
|
103
|
+
to_xml(builder, member_name, rules[member_name], value)
|
104
|
+
end
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
def xml_ordered_members members
|
109
|
+
members.inject([]) do |list,(member_name, member)|
|
110
|
+
list << [member[:position] || 0, member_name]
|
111
|
+
end.sort_by(&:first).map(&:last)
|
112
|
+
end
|
113
|
+
|
114
|
+
end
|
115
|
+
end
|
116
|
+
end
|
117
|
+
end
|
@@ -0,0 +1,74 @@
|
|
1
|
+
# Copyright 2011-2013 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
|
+
#
|
8
|
+
# or in the "license" file accompanying this file. This file is
|
9
|
+
# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
|
10
|
+
# ANY KIND, either express or implied. See the License for the specific
|
11
|
+
# language governing permissions and limitations under the License.
|
12
|
+
|
13
|
+
module MSS
|
14
|
+
module Core
|
15
|
+
class PageResult < Array
|
16
|
+
|
17
|
+
# @return [Collection] Returns the collection that was used to
|
18
|
+
# populated this page of results.
|
19
|
+
attr_reader :collection
|
20
|
+
|
21
|
+
# @return [Integer] Returns the maximum number of results per page.
|
22
|
+
# The final page in a collection may return fewer than `:per_page`
|
23
|
+
# items (e.g. `:per_page` is 10 and there are only 7 items).
|
24
|
+
attr_reader :per_page
|
25
|
+
|
26
|
+
# @return [String] An opaque token that can be passed the #page method
|
27
|
+
# of the collection that returned this page of results. This next
|
28
|
+
# token behaves as a pseudo offset. If `next_token` is `nil` then
|
29
|
+
# there are no more results for the collection.
|
30
|
+
attr_reader :next_token
|
31
|
+
|
32
|
+
# @param [Collection] collection The collection that was used to
|
33
|
+
# request this page of results. The collection should respond to
|
34
|
+
# #page and accept a :next_token option.
|
35
|
+
#
|
36
|
+
# @param [Array] items An array of result items that represent a
|
37
|
+
# page of results.
|
38
|
+
#
|
39
|
+
# @param [Integer] per_page The number of requested items for this
|
40
|
+
# page of results. If the count of items is smaller than `per_page`
|
41
|
+
# then this is the last page of results.
|
42
|
+
#
|
43
|
+
# @param [String] next_token (nil) A token that can be passed to the
|
44
|
+
#
|
45
|
+
def initialize collection, items, per_page, next_token
|
46
|
+
@collection = collection
|
47
|
+
@per_page = per_page
|
48
|
+
@next_token = next_token
|
49
|
+
super(items)
|
50
|
+
end
|
51
|
+
|
52
|
+
# @return [PageResult]
|
53
|
+
# @raise [RuntimeError] Raises a runtime error when called against
|
54
|
+
# a collection that has no more results (i.e. #last_page? == true).
|
55
|
+
def next_page
|
56
|
+
if last_page?
|
57
|
+
raise 'unable to get the next page, already at the last page'
|
58
|
+
end
|
59
|
+
collection.page(:per_page => per_page, :next_token => next_token)
|
60
|
+
end
|
61
|
+
|
62
|
+
# @return [Boolean] Returns `true` if this is the last page of results.
|
63
|
+
def last_page?
|
64
|
+
next_token.nil?
|
65
|
+
end
|
66
|
+
|
67
|
+
# @return [Boolean] Returns `true` if there are more pages of results.
|
68
|
+
def more?
|
69
|
+
!!next_token
|
70
|
+
end
|
71
|
+
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|