ruby-aws 1.7.1 → 1.7.2
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 +4 -4
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +0 -0
- data/History.md +5 -0
- data/Manifest.txt +0 -28
- data/Rakefile +3 -4
- data/lib/ruby-aws.rb +2 -1
- data/lib/ruby-aws/version.rb +2 -2
- metadata +7 -49
- metadata.gz.sig +0 -0
- data/lib/amazon/util.rb +0 -10
- data/lib/amazon/util/binder.rb +0 -48
- data/lib/amazon/util/data_reader.rb +0 -169
- data/lib/amazon/util/filter_chain.rb +0 -79
- data/lib/amazon/util/hash_nesting.rb +0 -93
- data/lib/amazon/util/lazy_results.rb +0 -59
- data/lib/amazon/util/logging.rb +0 -23
- data/lib/amazon/util/paginated_iterator.rb +0 -70
- data/lib/amazon/util/proactive_results.rb +0 -116
- data/lib/amazon/util/threadpool.rb +0 -129
- data/lib/amazon/util/user_data_store.rb +0 -100
- data/lib/amazon/webservices/mechanical_turk.rb +0 -123
- data/lib/amazon/webservices/mechanical_turk_requester.rb +0 -285
- data/lib/amazon/webservices/mturk/mechanical_turk_error_handler.rb +0 -153
- data/lib/amazon/webservices/mturk/question_generator.rb +0 -58
- data/lib/amazon/webservices/util/amazon_authentication_relay.rb +0 -72
- data/lib/amazon/webservices/util/command_line.rb +0 -157
- data/lib/amazon/webservices/util/convenience_wrapper.rb +0 -90
- data/lib/amazon/webservices/util/filter_proxy.rb +0 -45
- data/lib/amazon/webservices/util/mock_transport.rb +0 -70
- data/lib/amazon/webservices/util/request_signer.rb +0 -42
- data/lib/amazon/webservices/util/rest_transport.rb +0 -120
- data/lib/amazon/webservices/util/soap_simplifier.rb +0 -48
- data/lib/amazon/webservices/util/soap_transport.rb +0 -20
- data/lib/amazon/webservices/util/soap_transport_header_handler.rb +0 -27
- data/lib/amazon/webservices/util/unknown_result_exception.rb +0 -27
- data/lib/amazon/webservices/util/validation_exception.rb +0 -55
- data/lib/amazon/webservices/util/xml_simplifier.rb +0 -61
@@ -1,153 +0,0 @@
|
|
1
|
-
# Copyright:: Copyright (c) 2007-2014 Amazon Technologies, Inc.
|
2
|
-
# License:: Apache License, Version 2.0
|
3
|
-
|
4
|
-
require 'amazon/util/logging'
|
5
|
-
require 'amazon/webservices/util/validation_exception'
|
6
|
-
require 'amazon/webservices/util/unknown_result_exception'
|
7
|
-
|
8
|
-
module Amazon
|
9
|
-
module WebServices
|
10
|
-
module MTurk
|
11
|
-
|
12
|
-
class MechanicalTurkErrorHandler
|
13
|
-
include Amazon::Util::Logging
|
14
|
-
|
15
|
-
REQUIRED_PARAMETERS = [:Relay]
|
16
|
-
|
17
|
-
# Commands with these prefixes can be retried if we are unsure of success
|
18
|
-
RETRY_PRE = %w( search get register update disable assign set dispose )
|
19
|
-
|
20
|
-
# Max number of times to retry a call
|
21
|
-
MAX_RETRY = 6
|
22
|
-
|
23
|
-
# Base used in Exponential Backoff retry delay
|
24
|
-
BACKOFF_BASE = 2
|
25
|
-
# Scale factor for Exponential Backoff retry delay
|
26
|
-
BACKOFF_INITIAL = 0.1
|
27
|
-
|
28
|
-
# Matching pattern to find a 'Results' element in the Response
|
29
|
-
RESULT_PATTERN = /Result/
|
30
|
-
# Additional elements to be considered a 'Result' despite not matching RESULT_PATTERN
|
31
|
-
ACCEPTABLE_RESULTS = %w( HIT Qualification QualificationType QualificationRequest Information )
|
32
|
-
|
33
|
-
def initialize( args )
|
34
|
-
missing_parameters = REQUIRED_PARAMETERS - args.keys
|
35
|
-
raise "Missing paramters: #{missing_parameters.join(',')}" unless missing_parameters.empty?
|
36
|
-
@relay = args[:Relay]
|
37
|
-
end
|
38
|
-
|
39
|
-
def dispatch(method, *args)
|
40
|
-
try = 0
|
41
|
-
begin
|
42
|
-
try += 1
|
43
|
-
log "Dispatching call to #{method} (try #{try})"
|
44
|
-
response = @relay.send(method,*args)
|
45
|
-
validateResponse( response )
|
46
|
-
return response
|
47
|
-
rescue Exception => error
|
48
|
-
case handleError( error,method,args )
|
49
|
-
when :RetryWithBackoff
|
50
|
-
retry if doBackoff( try )
|
51
|
-
when :RetryImmediate
|
52
|
-
retry if canRetry( try )
|
53
|
-
when :Ignore
|
54
|
-
return :IgnoredError => error
|
55
|
-
when :Unknown
|
56
|
-
raise Util::UnknownResultException.new( error, method, args )
|
57
|
-
when :Fail
|
58
|
-
raise error
|
59
|
-
else
|
60
|
-
raise "Unknown error handling method: #{handleError( error,method )}"
|
61
|
-
end
|
62
|
-
raise error
|
63
|
-
end
|
64
|
-
end
|
65
|
-
|
66
|
-
def methodRetryable( method )
|
67
|
-
RETRY_PRE.each do |pre|
|
68
|
-
return true if method.to_s =~ /^#{pre}/i
|
69
|
-
end
|
70
|
-
return false
|
71
|
-
end
|
72
|
-
|
73
|
-
def handleError( error, method, args )
|
74
|
-
log "Handling error: #{error.inspect}"
|
75
|
-
idempotent = args.none? {|params| params[:UniqueRequestToken].nil? || params[:UniqueRequestToken].empty? }
|
76
|
-
retryable = methodRetryable( method ) || idempotent
|
77
|
-
|
78
|
-
case error.class.to_s
|
79
|
-
when 'Timeout::Error','SOAP::HTTPStreamError','Errno::ECONNRESET','Errno::EPIPE'
|
80
|
-
if retryable
|
81
|
-
return :RetryImmediate
|
82
|
-
else
|
83
|
-
return :Unknown
|
84
|
-
end
|
85
|
-
when 'SOAP::FaultError'
|
86
|
-
case error.faultcode.data
|
87
|
-
when "aws:Server.ServiceUnavailable"
|
88
|
-
return :RetryWithBackoff
|
89
|
-
else
|
90
|
-
return :Unknown
|
91
|
-
end
|
92
|
-
when 'Amazon::WebServices::Util::ValidationException'
|
93
|
-
case error.message
|
94
|
-
when 'AWS.ServiceUnavailable'
|
95
|
-
return :RetryWithBackoff if retryable
|
96
|
-
end
|
97
|
-
return :Fail
|
98
|
-
when 'RuntimeError'
|
99
|
-
case error.message
|
100
|
-
when 'Throttled'
|
101
|
-
return :RetryWithBackoff
|
102
|
-
else
|
103
|
-
return :RetryImmediate
|
104
|
-
end
|
105
|
-
else
|
106
|
-
return :Unknown
|
107
|
-
end
|
108
|
-
end
|
109
|
-
|
110
|
-
def canRetry( try )
|
111
|
-
try <= MAX_RETRY
|
112
|
-
end
|
113
|
-
|
114
|
-
def doBackoff( try )
|
115
|
-
return false unless canRetry(try)
|
116
|
-
delay = BACKOFF_INITIAL * ( BACKOFF_BASE ** try )
|
117
|
-
sleep delay
|
118
|
-
return true
|
119
|
-
end
|
120
|
-
|
121
|
-
def isResultTag( tag )
|
122
|
-
tag.to_s =~ RESULT_PATTERN or ACCEPTABLE_RESULTS.include?( tag.to_s )
|
123
|
-
end
|
124
|
-
|
125
|
-
def validateResponse(response)
|
126
|
-
log "Validating response: #{response.inspect}"
|
127
|
-
if response[:Errors] and response[:Errors][:Error]
|
128
|
-
if response[:Errors][:Error][:Code] == "ServiceUnavailable"
|
129
|
-
raise 'Throttled'
|
130
|
-
else
|
131
|
-
raise Util::ValidationException.new(response)
|
132
|
-
end
|
133
|
-
end
|
134
|
-
if response[:OperationRequest] and response[:OperationRequest][:Errors]
|
135
|
-
raise Util::ValidationException.new(response)
|
136
|
-
end
|
137
|
-
resultTags = response.keys.find_all {|r| isResultTag( r ) }
|
138
|
-
raise Util::ValidationException.new(response, "Didn't get back an acceptable result tag (got back #{response.keys.join(',')})") if resultTags.empty?
|
139
|
-
resultTags.each do |resultTag|
|
140
|
-
log "using result tag <#{resultTag}>"
|
141
|
-
result = response[resultTag]
|
142
|
-
if result[:Request] and result[:Request][:Errors]
|
143
|
-
raise Util::ValidationException.new(result)
|
144
|
-
end
|
145
|
-
end
|
146
|
-
response
|
147
|
-
end
|
148
|
-
|
149
|
-
end # MechanicalTurkErrorHandler
|
150
|
-
|
151
|
-
end # Amazon::WebServices::MTurk
|
152
|
-
end # Amazon::WebServices
|
153
|
-
end # Amazon
|
@@ -1,58 +0,0 @@
|
|
1
|
-
# Copyright:: Copyright (c) 2007 Amazon Technologies, Inc.
|
2
|
-
# License:: Apache License, Version 2.0
|
3
|
-
|
4
|
-
require 'rexml/element'
|
5
|
-
|
6
|
-
module Amazon
|
7
|
-
module WebServices
|
8
|
-
module MTurk
|
9
|
-
|
10
|
-
class QuestionGenerator
|
11
|
-
|
12
|
-
def self.build(type=:Basic)
|
13
|
-
question = self.new(type)
|
14
|
-
yield question
|
15
|
-
return question.to_xml
|
16
|
-
end
|
17
|
-
|
18
|
-
def initialize(type=:Basic)
|
19
|
-
@overview = nil
|
20
|
-
@questions = []
|
21
|
-
@type = type
|
22
|
-
end
|
23
|
-
|
24
|
-
def ask(*args)
|
25
|
-
case @type
|
26
|
-
when :Basic
|
27
|
-
askBasic( args.join )
|
28
|
-
end
|
29
|
-
end
|
30
|
-
|
31
|
-
def askBasic(text)
|
32
|
-
id = "BasicQuestion#{@questions.size+1}"
|
33
|
-
question = REXML::Element.new 'Text'
|
34
|
-
question.text = text
|
35
|
-
answerSpec = "<FreeTextAnswer/>"
|
36
|
-
@questions << { :Id => id, :Question => question.to_s, :AnswerSpec => answerSpec }
|
37
|
-
end
|
38
|
-
|
39
|
-
def to_xml
|
40
|
-
components = [PREAMBLE]
|
41
|
-
components << OVERVIEW % @overview unless @overview.nil?
|
42
|
-
for question in @questions
|
43
|
-
components << QUESTION % [ question[:Id], question[:Question], question[:AnswerSpec] ]
|
44
|
-
end
|
45
|
-
components << [TAIL]
|
46
|
-
return components.join
|
47
|
-
end
|
48
|
-
|
49
|
-
PREAMBLE = '<?xml version="1.0" encoding="UTF-8"?>'+"\n"+'<QuestionForm xmlns="http://mechanicalturk.amazonaws.com/AWSMechanicalTurkDataSchemas/2005-10-01/QuestionForm.xsd">'
|
50
|
-
OVERVIEW = '<Overview>%s</Overview>'
|
51
|
-
QUESTION = '<Question><QuestionIdentifier>%s</QuestionIdentifier><QuestionContent>%s</QuestionContent><AnswerSpecification>%s</AnswerSpecification></Question>'
|
52
|
-
TAIL = '</QuestionForm>'
|
53
|
-
|
54
|
-
end # QuestionGenerator
|
55
|
-
|
56
|
-
end # Amazon::WebServices::MTurk
|
57
|
-
end # Amazon::WebServices
|
58
|
-
end # Amazon
|
@@ -1,72 +0,0 @@
|
|
1
|
-
# Copyright:: Copyright (c) 2007 Amazon Technologies, Inc.
|
2
|
-
# License:: Apache License, Version 2.0
|
3
|
-
|
4
|
-
require 'amazon/webservices/util/command_line'
|
5
|
-
require 'amazon/webservices/util/request_signer'
|
6
|
-
|
7
|
-
module Amazon
|
8
|
-
module WebServices
|
9
|
-
module Util
|
10
|
-
|
11
|
-
class AmazonAuthenticationRelay
|
12
|
-
|
13
|
-
REQUIRED_PARAMETERS = [:Name,:Transport]
|
14
|
-
|
15
|
-
def initialize( args )
|
16
|
-
missing_parameters = REQUIRED_PARAMETERS - args.keys
|
17
|
-
raise "Missing paramters: #{missing_parameters.join(',')}" unless missing_parameters.empty?
|
18
|
-
@name = args[:Name]
|
19
|
-
@transport = args[:Transport]
|
20
|
-
@keyId, @key = findAuthInfo( args )
|
21
|
-
end
|
22
|
-
|
23
|
-
def withCredential(credential,method,*request)
|
24
|
-
time = Time.now.gmtime.strftime('%Y-%m-%dT%H:%M:%S.123Z')
|
25
|
-
request[0] ||= {}
|
26
|
-
args = { :AWSAccessKeyId => @keyId,
|
27
|
-
:Timestamp => time,
|
28
|
-
:Signature => RequestSigner.sign(@name,method,time,@key),
|
29
|
-
:Credential => credential,
|
30
|
-
:Request => request }
|
31
|
-
@transport.send( method, args )
|
32
|
-
end
|
33
|
-
|
34
|
-
def method_missing(method, *request)
|
35
|
-
time = Time.now.gmtime.strftime('%Y-%m-%dT%H:%M:%S.321Z')
|
36
|
-
request[0] ||= {}
|
37
|
-
args = { :AWSAccessKeyId => @keyId,
|
38
|
-
:Timestamp => time,
|
39
|
-
:Signature => RequestSigner.sign(@name,method,time,@key),
|
40
|
-
:Request => request }
|
41
|
-
@transport.send( method, args )
|
42
|
-
end
|
43
|
-
|
44
|
-
def to_s
|
45
|
-
"AmazonAuthenticationRelay[name:#{@name} transport:#{@transport}]>"
|
46
|
-
end
|
47
|
-
|
48
|
-
def inspect
|
49
|
-
"#<Amazon::WebServices::Util::AmazonAuthenticationRelay:#{object_id} name:#{@name} transport:#{@transport.inspect}>"
|
50
|
-
end
|
51
|
-
|
52
|
-
private
|
53
|
-
|
54
|
-
def findAuthInfo( args )
|
55
|
-
if args.has_key? :AWSAccessKey or args.has_key? :AWSAccessKeyId
|
56
|
-
# user tried to pass authentication information in, so just use that
|
57
|
-
raise "Missing AWSAccessKeyId" if args[:AWSAccessKeyId].nil?
|
58
|
-
raise "Missing AWSAccessKey" if args[:AWSAccessKey].nil?
|
59
|
-
return args[:AWSAccessKeyId], args[:AWSAccessKey]
|
60
|
-
else
|
61
|
-
# didn't get passed in, so load from config or go interactive
|
62
|
-
cmd = CommandLine.new
|
63
|
-
cmd.checkAuthConfig
|
64
|
-
return cmd.authId, cmd.authKey
|
65
|
-
end
|
66
|
-
end
|
67
|
-
|
68
|
-
end # AmazonAuthenticationRelay
|
69
|
-
|
70
|
-
end # Amazon::WebServices::Util
|
71
|
-
end # Amazon::WebServices
|
72
|
-
end # Amazon
|
@@ -1,157 +0,0 @@
|
|
1
|
-
# Copyright:: Copyright (c) 2007 Amazon Technologies, Inc.
|
2
|
-
# License:: Apache License, Version 2.0
|
3
|
-
|
4
|
-
require 'optparse'
|
5
|
-
require 'highline'
|
6
|
-
require 'amazon/util/user_data_store'
|
7
|
-
|
8
|
-
module Amazon
|
9
|
-
module WebServices
|
10
|
-
module Util
|
11
|
-
|
12
|
-
class CommandLine
|
13
|
-
|
14
|
-
SDKS = ['Mechanical Turk']
|
15
|
-
|
16
|
-
MISSING_AUTH = "You are missing authentication information required to utilize Amazon Web Services. You will now be prompted for your <%= color('Access Key ID',BOLD) %> and your <%= color('Secret Access Key',BOLD) %>. If you do not have this information, please log into http://www.amazonaws.com/ \n\n"
|
17
|
-
RESUME_AUTH = "Authentication information has been initialized. Continuing... \n\n"
|
18
|
-
|
19
|
-
MAIN_HELP = <<EOF
|
20
|
-
|
21
|
-
This is the <%= color('RubyAWS', RED, BOLD) %> Command Line Application's Interactive mode.
|
22
|
-
You got here by typing:
|
23
|
-
|
24
|
-
<%= color('$ ruby-aws',GREEN) %>
|
25
|
-
|
26
|
-
This application currently supports the following functionality:
|
27
|
-
|
28
|
-
<%= list( ['Amazon Web Services Authentication Configuration'] ) %>
|
29
|
-
You can also invoke this tool with commandline parameters. For more information:
|
30
|
-
|
31
|
-
<%= color('$ ruby-aws --help',GREEN) %>
|
32
|
-
|
33
|
-
Thanks for using Amazon Web Services!
|
34
|
-
|
35
|
-
EOF
|
36
|
-
|
37
|
-
def initialize( interactive = true )
|
38
|
-
@interactive = interactive
|
39
|
-
@h = HighLine.new
|
40
|
-
@h.wrap_at = :auto
|
41
|
-
@store = Amazon::Util::UserDataStore.new :AWS
|
42
|
-
HighLine.use_color = useColor?
|
43
|
-
HighLine.track_eof = false # disabling because it misbehaves
|
44
|
-
end
|
45
|
-
|
46
|
-
def checkAuthConfig
|
47
|
-
if @store.get(:Auth,:AccessKeyId).nil? or @store.get(:Auth,:SecretAccessKey).nil?
|
48
|
-
@h.say MISSING_AUTH
|
49
|
-
getAuthConfig
|
50
|
-
@h.say RESUME_AUTH
|
51
|
-
end
|
52
|
-
end
|
53
|
-
|
54
|
-
def getAuthConfig( default={} )
|
55
|
-
id = @h.ask( 'What is your Access Key ID?' ) {|q| q.validate = /^[A-Z0-9]{20}$/ ; q.default = authId.to_s ; q.first_answer = default[:ID] }
|
56
|
-
key = @h.ask( 'What is your Secret Access Key?' ) {|q| q.validate = /^[\w\/+]{40}$/ ; q.default = authKey.to_s ; q.first_answer = default[:Key] }
|
57
|
-
|
58
|
-
@store.set(:Auth,:AccessKeyId,id)
|
59
|
-
@store.set(:Auth,:SecretAccessKey,key)
|
60
|
-
|
61
|
-
should_save = @h.agree( 'Would you like to save your authentication information?' )
|
62
|
-
@store.save if should_save
|
63
|
-
rescue
|
64
|
-
raise "Unable to retrieve authentication information from the Console"
|
65
|
-
end
|
66
|
-
|
67
|
-
def authKey
|
68
|
-
@store.get(:Auth,:SecretAccessKey)
|
69
|
-
end
|
70
|
-
def authId
|
71
|
-
@store.get(:Auth,:AccessKeyId)
|
72
|
-
end
|
73
|
-
|
74
|
-
def useColor?
|
75
|
-
if @store.get(:Misc,:ColorTerminal).nil?
|
76
|
-
if @interactive and @h.agree( "Should the console application use color? (y/n)" )
|
77
|
-
@store.set(:Misc,:ColorTerminal,true)
|
78
|
-
else
|
79
|
-
@store.set(:Misc,:ColorTerminal,false)
|
80
|
-
end
|
81
|
-
@store.save
|
82
|
-
end
|
83
|
-
return @store.get(:Misc,:ColorTerminal)
|
84
|
-
end
|
85
|
-
|
86
|
-
def toggleColor
|
87
|
-
value = !useColor?
|
88
|
-
@store.set(:Misc,:ColorTerminal,value)
|
89
|
-
HighLine.use_color = value
|
90
|
-
end
|
91
|
-
|
92
|
-
def default_menu
|
93
|
-
loop do
|
94
|
-
@h.choose do |menu|
|
95
|
-
menu.header = "\n" + @h.color('RubyAWS',HighLine::BOLD,HighLine::RED) + " " + @h.color('Command Line Application',HighLine::BOLD) + " " + @h.color('[Interactive Mode]',HighLine::GREEN,HighLine::BOLD)
|
96
|
-
menu.select_by = :index
|
97
|
-
menu.choice( 'Configure Amazon Web Services Authentication' ) do
|
98
|
-
if @h.agree( "\nCurrent ID: #{@h.color(authId,HighLine::BOLD)}\nCurrent Key: #{@h.color(authKey,HighLine::BOLD)}\nDo you want to change?" )
|
99
|
-
getAuthConfig
|
100
|
-
end
|
101
|
-
end
|
102
|
-
menu.choice( 'Toggle Color' ) { toggleColor }
|
103
|
-
menu.choice( :help ) do
|
104
|
-
@h.say MAIN_HELP
|
105
|
-
end
|
106
|
-
menu.choice( 'Save and Quit' ) { @store.save ; exit }
|
107
|
-
menu.prompt = "\nWhat would you like to do? "
|
108
|
-
end
|
109
|
-
end
|
110
|
-
end
|
111
|
-
|
112
|
-
def parseOptions
|
113
|
-
res = {}
|
114
|
-
opts = OptionParser.new
|
115
|
-
|
116
|
-
opts.on( '-i', '--interactive', 'Load Interactive Mode' ) { res[:Interactive] = true }
|
117
|
-
opts.on( '-a', '--authenticate', 'Configure Authentication Options' ) { res[:Auth] = true }
|
118
|
-
opts.on( '--id=ID', 'Set Access Key ID (requires "-a")' ) { |id| res[:ID] = id }
|
119
|
-
opts.on( '--key=KEY', 'Set Secret Access Key (requires "-a")' ) { |key| res[:Key] = key }
|
120
|
-
|
121
|
-
begin
|
122
|
-
opts.parse(ARGV)
|
123
|
-
raise "-i and -a are exclusive options. Please pick one." if res[:Interactive] and res[:Auth]
|
124
|
-
raise "--id requires -a" if res[:ID] and !res[:Auth]
|
125
|
-
raise "--key requires -a" if res[:Key] and !res[:Auth]
|
126
|
-
res[:Mode] = res[:Auth] ? :Auth : :Interactive
|
127
|
-
rescue => e
|
128
|
-
p e.message
|
129
|
-
end
|
130
|
-
res
|
131
|
-
end
|
132
|
-
|
133
|
-
def run
|
134
|
-
|
135
|
-
opts = parseOptions
|
136
|
-
|
137
|
-
case opts[:Mode]
|
138
|
-
when :Interactive
|
139
|
-
|
140
|
-
@h.say "\n<%= color('Welcome to',BOLD) %> <%= color('RubyAWS #{RubyAWS::VERSION}',BOLD,RED) %>"
|
141
|
-
@h.say "This version includes SDK extensions for: <%= list (#{SDKS.inspect}.collect {|a| color(a,BOLD)}), :inline, ' and ' %>\n\n"
|
142
|
-
|
143
|
-
checkAuthConfig
|
144
|
-
|
145
|
-
default_menu
|
146
|
-
when :Auth
|
147
|
-
|
148
|
-
getAuthConfig( :Key => opts[:Key], :ID => opts[:ID] )
|
149
|
-
|
150
|
-
end
|
151
|
-
end
|
152
|
-
|
153
|
-
end
|
154
|
-
|
155
|
-
end # Amazon::WebServices::Util
|
156
|
-
end # Amazon::WebServices
|
157
|
-
end # Amazon::WebServices
|
@@ -1,90 +0,0 @@
|
|
1
|
-
# Copyright:: Copyright (c) 2007 Amazon Technologies, Inc.
|
2
|
-
# License:: Apache License, Version 2.0
|
3
|
-
|
4
|
-
require 'amazon/util'
|
5
|
-
|
6
|
-
module Amazon
|
7
|
-
module WebServices
|
8
|
-
module Util
|
9
|
-
|
10
|
-
class ConvenienceWrapper
|
11
|
-
include Amazon::Util::Logging
|
12
|
-
|
13
|
-
REQUIRED_PARAMETERS = [:ServiceClass]
|
14
|
-
|
15
|
-
def initialize(args)
|
16
|
-
missing_parameters = REQUIRED_PARAMETERS - args.keys
|
17
|
-
raise "Missing paramters: #{missing_parameters.join(',')}" unless missing_parameters.empty?
|
18
|
-
@service = args[:ServiceClass].new( args )
|
19
|
-
end
|
20
|
-
|
21
|
-
def callService( method, *args )
|
22
|
-
@service.send( method, *args )
|
23
|
-
end
|
24
|
-
|
25
|
-
def method_missing( method, *args )
|
26
|
-
if @service.respond_to? method
|
27
|
-
callService( method, *args )
|
28
|
-
else
|
29
|
-
callService( ConvenienceWrapper.real_method( method ), *args )
|
30
|
-
end
|
31
|
-
end
|
32
|
-
|
33
|
-
def self.serviceCall( method, responseTag, defaultArgs={} )
|
34
|
-
method = method.to_s
|
35
|
-
name = ( method[0..0].downcase + method[1..-1] ).to_sym
|
36
|
-
rawName = ( name.to_s + "Raw" ).to_sym
|
37
|
-
method = real_method( method )
|
38
|
-
|
39
|
-
raise 'Stop redifining service methods!' if self.instance_methods.include? name.to_s
|
40
|
-
|
41
|
-
define_method( rawName ) do |args|
|
42
|
-
log "Sending service request '#{name}' with args: #{args.inspect}"
|
43
|
-
result = callService( method, args )
|
44
|
-
return result[responseTag]
|
45
|
-
end
|
46
|
-
|
47
|
-
define_method( name ) do |*params|
|
48
|
-
userArgs = params[0] || {}
|
49
|
-
args = defaultArgs.merge( userArgs )
|
50
|
-
self.send rawName, args
|
51
|
-
end
|
52
|
-
end
|
53
|
-
|
54
|
-
def self.paginate( method, elementTag, pageSize=25 )
|
55
|
-
method = method.to_s
|
56
|
-
all_name = ( method[0..0].downcase + method[1..-1] + "All" ).to_sym
|
57
|
-
iterator_name = ( method[0..0].downcase + method[1..-1] + "Iterator" ).to_sym
|
58
|
-
proactive_name = ( method[0..0].downcase + method[1..-1] + "AllProactive" ).to_sym
|
59
|
-
method = ( method[0..0].downcase + method[1..-1] ).to_sym
|
60
|
-
|
61
|
-
raise 'Stop redifining service methods!' if self.instance_methods.include? name.to_s
|
62
|
-
|
63
|
-
processors = { all_name => Amazon::Util::LazyResults,
|
64
|
-
iterator_name => Amazon::Util::PaginatedIterator,
|
65
|
-
proactive_name => Amazon::Util::ProactiveResults }
|
66
|
-
|
67
|
-
processors.each do |name,processor|
|
68
|
-
define_method( name ) do |*params|
|
69
|
-
userArgs = params[0] || {}
|
70
|
-
args = {:PageSize => pageSize}.merge( userArgs ) # allow user to override page size
|
71
|
-
return processor.new do |pageNumber|
|
72
|
-
pageArgs = args.merge({:PageNumber => pageNumber}) # don't allow override of page number
|
73
|
-
res = self.send( method, pageArgs)[elementTag]
|
74
|
-
res.nil? ? nil : [res].flatten
|
75
|
-
end
|
76
|
-
end
|
77
|
-
end
|
78
|
-
|
79
|
-
end
|
80
|
-
|
81
|
-
def self.real_method( method )
|
82
|
-
method = method.to_s
|
83
|
-
method = ( method[0..0].upcase + method[1..-1] ).to_sym
|
84
|
-
end
|
85
|
-
|
86
|
-
end # ConvenienceWrapper
|
87
|
-
|
88
|
-
end # Amazon::WebServices::Util
|
89
|
-
end # Amazon::WebServices
|
90
|
-
end # Amazon
|