sprout-ruby-aws 1.2.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 (70) hide show
  1. data/History.txt +38 -0
  2. data/LICENSE.txt +202 -0
  3. data/Manifest.txt +69 -0
  4. data/NOTICE.txt +4 -0
  5. data/README.txt +105 -0
  6. data/Rakefile +20 -0
  7. data/bin/ruby-aws +9 -0
  8. data/lib/amazon/util.rb +10 -0
  9. data/lib/amazon/util/binder.rb +44 -0
  10. data/lib/amazon/util/data_reader.rb +157 -0
  11. data/lib/amazon/util/filter_chain.rb +79 -0
  12. data/lib/amazon/util/hash_nesting.rb +93 -0
  13. data/lib/amazon/util/lazy_results.rb +59 -0
  14. data/lib/amazon/util/logging.rb +23 -0
  15. data/lib/amazon/util/paginated_iterator.rb +70 -0
  16. data/lib/amazon/util/proactive_results.rb +116 -0
  17. data/lib/amazon/util/threadpool.rb +129 -0
  18. data/lib/amazon/util/user_data_store.rb +100 -0
  19. data/lib/amazon/webservices/mechanical_turk.rb +117 -0
  20. data/lib/amazon/webservices/mechanical_turk_requester.rb +340 -0
  21. data/lib/amazon/webservices/mturk/mechanical_turk_error_handler.rb +136 -0
  22. data/lib/amazon/webservices/mturk/question_generator.rb +58 -0
  23. data/lib/amazon/webservices/util/amazon_authentication_relay.rb +64 -0
  24. data/lib/amazon/webservices/util/command_line.rb +156 -0
  25. data/lib/amazon/webservices/util/convenience_wrapper.rb +90 -0
  26. data/lib/amazon/webservices/util/filter_proxy.rb +45 -0
  27. data/lib/amazon/webservices/util/mock_transport.rb +70 -0
  28. data/lib/amazon/webservices/util/request_signer.rb +42 -0
  29. data/lib/amazon/webservices/util/rest_transport.rb +108 -0
  30. data/lib/amazon/webservices/util/soap_simplifier.rb +48 -0
  31. data/lib/amazon/webservices/util/soap_transport.rb +38 -0
  32. data/lib/amazon/webservices/util/soap_transport_header_handler.rb +27 -0
  33. data/lib/amazon/webservices/util/unknown_result_exception.rb +27 -0
  34. data/lib/amazon/webservices/util/validation_exception.rb +55 -0
  35. data/lib/amazon/webservices/util/xml_simplifier.rb +61 -0
  36. data/lib/ruby-aws.rb +21 -0
  37. data/lib/ruby-aws/version.rb +8 -0
  38. data/samples/mturk/best_image/BestImage.rb +61 -0
  39. data/samples/mturk/best_image/best_image.properties +39 -0
  40. data/samples/mturk/best_image/best_image.question +82 -0
  41. data/samples/mturk/blank_slate/BlankSlate.rb +63 -0
  42. data/samples/mturk/blank_slate/BlankSlate_multithreaded.rb +67 -0
  43. data/samples/mturk/helloworld/MTurkHelloWorld.rb +56 -0
  44. data/samples/mturk/helloworld/mturk.yml +8 -0
  45. data/samples/mturk/reviewer/Reviewer.rb +103 -0
  46. data/samples/mturk/reviewer/mturk.yml +8 -0
  47. data/samples/mturk/simple_survey/SimpleSurvey.rb +90 -0
  48. data/samples/mturk/simple_survey/simple_survey.question +30 -0
  49. data/samples/mturk/site_category/SiteCategory.rb +87 -0
  50. data/samples/mturk/site_category/externalpage.htm +71 -0
  51. data/samples/mturk/site_category/site_category.input +6 -0
  52. data/samples/mturk/site_category/site_category.properties +45 -0
  53. data/samples/mturk/site_category/site_category.question +9 -0
  54. data/test/mturk/test_changehittypeofhit.rb +130 -0
  55. data/test/mturk/test_error_handler.rb +135 -0
  56. data/test/mturk/test_mechanical_turk_requester.rb +178 -0
  57. data/test/mturk/test_mock_mechanical_turk_requester.rb +205 -0
  58. data/test/test_ruby-aws.rb +22 -0
  59. data/test/unit/test_binder.rb +89 -0
  60. data/test/unit/test_data_reader.rb +135 -0
  61. data/test/unit/test_exceptions.rb +32 -0
  62. data/test/unit/test_hash_nesting.rb +93 -0
  63. data/test/unit/test_lazy_results.rb +89 -0
  64. data/test/unit/test_mock_transport.rb +132 -0
  65. data/test/unit/test_paginated_iterator.rb +58 -0
  66. data/test/unit/test_proactive_results.rb +108 -0
  67. data/test/unit/test_question_generator.rb +54 -0
  68. data/test/unit/test_threadpool.rb +50 -0
  69. data/test/unit/test_user_data_store.rb +80 -0
  70. metadata +177 -0
@@ -0,0 +1,42 @@
1
+ # Copyright:: Copyright (c) 2007 Amazon Technologies, Inc.
2
+ # License:: Apache License, Version 2.0
3
+
4
+ require 'base64'
5
+ require 'digest/sha1'
6
+
7
+ module Amazon
8
+ module WebServices
9
+ module Util
10
+
11
+ module RequestSigner
12
+
13
+ def RequestSigner.sign(service,method,time,key)
14
+ msg = "#{service}#{method}#{time}"
15
+ return hmac_sha1( key, msg )
16
+ end
17
+
18
+
19
+ private
20
+
21
+ def RequestSigner.hmac_sha1(key, s)
22
+ ipad = [].fill(0x36, 0, 64)
23
+ opad = [].fill(0x5C, 0, 64)
24
+ key = key.unpack("C*")
25
+ key += [].fill(0, 0, 64-key.length) if key.length < 64
26
+
27
+ inner = []
28
+ 64.times { |i| inner.push(key[i] ^ ipad[i]) }
29
+ inner += s.unpack("C*")
30
+
31
+ outer = []
32
+ 64.times { |i| outer.push(key[i] ^ opad[i]) }
33
+ outer = outer.pack("c*")
34
+ outer += Digest::SHA1.digest(inner.pack("c*"))
35
+
36
+ return Base64::encode64(Digest::SHA1.digest(outer)).chomp
37
+ end
38
+
39
+ end # Amazon::MTS::Util::RequestSigner
40
+ end # Amazon::MTS::Util
41
+ end # Amazon::MTS
42
+ end # Amazon
@@ -0,0 +1,108 @@
1
+ # Copyright:: Copyright (c) 2007 Amazon Technologies, Inc.
2
+ # License:: Apache License, Version 2.0
3
+
4
+ require 'cgi'
5
+ require 'net/http'
6
+ require 'rexml/document'
7
+ require 'amazon/webservices/util/xml_simplifier'
8
+
9
+ module Amazon
10
+ module WebServices
11
+ module Util
12
+
13
+ class RESTTransport
14
+
15
+ REQUIRED_PARAMETERS = [:Endpoint]
16
+
17
+ def self.canPost?
18
+ Net::HTTP.respond_to? :post_form
19
+ end
20
+
21
+ def initialize( args )
22
+ missing_parameters = REQUIRED_PARAMETERS - args.keys
23
+ raise "Missing paramters: #{missing_parameters.join(',')}" unless missing_parameters.empty?
24
+ @url = args[:Endpoint]
25
+ @httpMethod = resolveHTTPMethod( args[:RestStyle] )
26
+ @version = args[:Version]
27
+
28
+ agent = RubyAWS::agent( args[:SoftwareName] )
29
+ @headers = {
30
+ 'User-Agent' => agent,
31
+ 'X-Amazon-Software' => agent,
32
+ 'Content-Type' => 'application/x-www-form-urlencoded; charset=utf-8',
33
+ }
34
+ end
35
+
36
+ def resolveHTTPMethod( method )
37
+ case method.to_s.upcase
38
+ when "GET"
39
+ return :GET
40
+ when "POST"
41
+ raise "Your version of Ruby does not support HTTP Post" unless RESTTransport.canPost?
42
+ return :POST
43
+ else
44
+ return ( RESTTransport.canPost? ? :POST : :GET )
45
+ end
46
+ end
47
+
48
+ def method_missing( method, *args )
49
+ params = { :Operation => method, :Version => @version }
50
+ params.merge!( args[0].delete( :Request )[0] )
51
+ params.merge!( args[0] )
52
+ res = nil
53
+ if @httpMethod == :GET
54
+ url = URI.parse( @url + toQueryString(params) )
55
+ res = Net::HTTP.new( url.host, url.port ).start { |http|
56
+ http.get( url.request_uri, @headers )
57
+ }.body
58
+ else
59
+ url = URI.parse( @url )
60
+ res = Net::HTTP.new( url.host, url.port ).start { |http|
61
+ req = Net::HTTP::Post.new( url.path, @headers )
62
+ req.form_data = toPostParams( params )
63
+ req['Content-Type'] = @headers['Content-Type'] # necessary because req.form_data resets Content-Type header
64
+ http.request( req )
65
+ }.body
66
+ end
67
+ xml = REXML::Document.new( res )
68
+ XMLSimplifier.simplify xml
69
+ end
70
+
71
+ private
72
+
73
+ def toQueryString(params)
74
+ queryString = ""
75
+ each_http_param(params) { |key,value|
76
+ queryString << ( '&' + key + '=' + CGI.escape(value) )
77
+ }
78
+ return queryString
79
+ end
80
+
81
+ def toPostParams(params)
82
+ postParams = {}
83
+ each_http_param(params) { |key,value|
84
+ postParams[key] = value }
85
+ return postParams
86
+ end
87
+
88
+ def each_http_param(params,&block)
89
+ params.each {|k,v| each_http_param_helper( k, v, false, &block ) unless v.nil? }
90
+ end
91
+
92
+ def each_http_param_helper(key,value,num=false,&block)
93
+ key = key.to_s
94
+ case value.class.to_s
95
+ when 'Array'
96
+ value.each_with_index { |v,i| each_http_param_helper( "#{key}.#{i+1}", v, true, &block ) unless v.nil? }
97
+ when 'Hash'
98
+ value.each { |k,v| each_http_param_helper( "#{key}#{num ? '.' : '.1.'}#{k}", v, false, &block ) unless v.nil? }
99
+ else
100
+ yield key, value.to_s
101
+ end
102
+ end
103
+
104
+ end # RESTTransport
105
+
106
+ end # Amazon::WebServices::Util
107
+ end # Amazon::WebServices
108
+ end # Amazon
@@ -0,0 +1,48 @@
1
+ # Copyright:: Copyright (c) 2007 Amazon Technologies, Inc.
2
+ # License:: Apache License, Version 2.0
3
+
4
+ module Amazon
5
+ module WebServices
6
+ module Util
7
+
8
+ class SOAPSimplifier
9
+
10
+ # simplify(item) -- convert a soap object into a simple nested hash
11
+ def self.simplify(item)
12
+ case item.class.to_s
13
+ when 'SOAP::Mapping::Object'
14
+ simple = {}
15
+ item.__xmlattr.each {|name,at| simple["*#{name}*"] = simplify(at)}
16
+ item.__xmlele.each { |element|
17
+ # element consists of a QName and a payload
18
+ name = element[0].name
19
+ payload = simplify(element[1])
20
+ simple[name.to_sym] = payload
21
+ }
22
+ simple
23
+ when 'Array'
24
+ item.collect {|i| simplify(i) }
25
+ else
26
+ str = item.to_s
27
+ case str
28
+ when /^(\d+)-(\d+)-(\d+)T(\d+):(\d+):(\d+)Z$/
29
+ Time.gm($1,$2,$3,$4,$5,$6)
30
+ when /^\d+$/
31
+ if str.to_i.to_s == str
32
+ str.to_i
33
+ else
34
+ str
35
+ end
36
+ when /^\d+\.\d+$/
37
+ str.to_f
38
+ else
39
+ str
40
+ end
41
+ end
42
+ end
43
+
44
+ end # Amazon::WebServices::Util::SoapSimplifier
45
+
46
+ end # Amazon::WebServices::Util
47
+ end # Amazon::WebServices
48
+ end # Amazon
@@ -0,0 +1,38 @@
1
+ # Copyright:: Copyright (c) 2007 Amazon Technologies, Inc.
2
+ # License:: Apache License, Version 2.0
3
+
4
+ require 'soap/wsdlDriver'
5
+ require 'amazon/webservices/util/soap_simplifier'
6
+ require 'amazon/webservices/util/soap_transport_header_handler'
7
+
8
+ module Amazon
9
+ module WebServices
10
+ module Util
11
+
12
+ class SOAPTransport
13
+
14
+ REQUIRED_PARAMETERS = [:Wsdl]
15
+
16
+ def self.canSOAP?
17
+ SOAP::Version >= "1.5.5"
18
+ end
19
+
20
+ def initialize( args )
21
+ raise "SOAP version 1.5.5+ (included in Ruby 1.8.3+) required to use SOAP Transport" unless SOAPTransport::canSOAP?
22
+
23
+ missing_parameters = REQUIRED_PARAMETERS - args.keys
24
+ raise "Missing paramters: #{missing_parameters.join(',')}" unless missing_parameters.empty?
25
+ @driver = SOAP::WSDLDriverFactory.new( args[:Wsdl] ).create_rpc_driver
26
+ @driver.endpoint_url = args[:Endpoint] unless args[:Endpoint].nil?
27
+ @driver.headerhandler << SOAPTransportHeaderHandler.new('http://amazonaws.com/header', 'X-Amazon-Software', RubyAWS::agent(args[:SoftwareName]) )
28
+ end
29
+
30
+ def method_missing( method, *args )
31
+ SOAPSimplifier.simplify @driver.send( method, *args )
32
+ end
33
+
34
+ end # SOAPTransport
35
+
36
+ end # Amazon::WebServices::Util
37
+ end # Amazon::WebServices
38
+ end # Amazon
@@ -0,0 +1,27 @@
1
+ # Copyright:: Copyright (c) 2007 Amazon Technologies, Inc.
2
+ # License:: Apache License, Version 2.0
3
+
4
+ require 'soap/header/simplehandler.rb'
5
+ require 'xsd/qname.rb'
6
+
7
+ module Amazon
8
+ module WebServices
9
+ module Util
10
+
11
+ class SOAPTransportHeaderHandler < SOAP::Header::SimpleHandler
12
+
13
+ def initialize(ns, tag, value)
14
+ super(XSD::QName.new(ns, tag))
15
+ @tag = tag
16
+ @value = value
17
+ end
18
+
19
+ def on_simple_outbound
20
+ @value
21
+ end
22
+
23
+ end # SOAPTransportHeaderHandler
24
+
25
+ end # Amazon::WebServices::Util
26
+ end # Amazon::WebServices
27
+ end # Amazon
@@ -0,0 +1,27 @@
1
+ # Copyright:: Copyright (c) 2007 Amazon Technologies, Inc.
2
+ # License:: Apache License, Version 2.0
3
+
4
+ module Amazon
5
+ module WebServices
6
+ module Util
7
+
8
+ # This exception is thrown when we don't know if a service call succeeded or not
9
+ class UnknownResultException < RuntimeError
10
+
11
+ attr_reader :method, :args, :exception
12
+
13
+ def initialize( exception, method, args={} )
14
+ @method = method
15
+ @args = args
16
+ @exception = exception
17
+ end
18
+
19
+ def to_s
20
+ "UnknownResultException: got #{@exception} calling #{@method}"
21
+ end
22
+
23
+ end
24
+
25
+ end # Amazon::WebServices::Util
26
+ end # Amazon::WebServices
27
+ end # Amazon
@@ -0,0 +1,55 @@
1
+ # Copyright:: Copyright (c) 2007 Amazon Technologies, Inc.
2
+ # License:: Apache License, Version 2.0
3
+
4
+ module Amazon
5
+ module WebServices
6
+ module Util
7
+
8
+ class ValidationException < RuntimeError
9
+
10
+ attr_reader :message, :description, :result
11
+
12
+ def initialize( result, message=nil )
13
+ @result = result
14
+
15
+ @message = [
16
+ message,
17
+ get_nested_key( result, :OperationRequest, :Errors, :Error, :Code ),
18
+ get_nested_key( result, :Request, :Errors, :Error, :Code ),
19
+ get_nested_key( result, :Errors, :Error, :Code ),
20
+ ].detect { |v| !v.nil? }
21
+
22
+ @description = [
23
+ get_nested_key( result, :OperationRequest, :Errors, :Error, :Message ),
24
+ get_nested_key( result, :Request, :Errors, :Error, :Message ),
25
+ get_nested_key( result, :Errors, :Error, :Message ),
26
+ ].detect { |v| !v.nil? }
27
+
28
+ end
29
+
30
+ def to_s
31
+ "ValidationException: #{message}"
32
+ end
33
+
34
+ private
35
+
36
+ def get_nested_key( hash, *keys )
37
+ return nil unless hash.kind_of?(Hash)
38
+ result = hash
39
+ if hash.key? keys.first
40
+ keys.each do |key|
41
+ return nil unless result.kind_of?(Hash)
42
+ result = result[key]
43
+ end
44
+ return result
45
+ else
46
+ nested = hash.collect { |k,v| get_nested_key( v, *keys ) }
47
+ return ([nested].flatten - [nil]).first
48
+ end
49
+ end
50
+
51
+ end
52
+
53
+ end # Amazon::WebServices::Util
54
+ end # Amazon::WebServices
55
+ end # Amazon
@@ -0,0 +1,61 @@
1
+ # Copyright:: Copyright (c) 2007 Amazon Technologies, Inc.
2
+ # License:: Apache License, Version 2.0
3
+
4
+ require 'rexml/document'
5
+
6
+ module Amazon
7
+ module WebServices
8
+ module Util
9
+
10
+ class XMLSimplifier
11
+
12
+ # simplify(xml) -- convert an xml document into a simple nested hash
13
+ def self.simplify(xml)
14
+ case xml.class.to_s
15
+ when 'REXML::Text'
16
+ {}
17
+ when 'REXML::Document'
18
+ xml.root.children.inject({}) {|data,child| self.merge( data, simplify(child) ) }
19
+ when 'REXML::Element'
20
+ if xml.children.size > 1 || xml.text.nil?
21
+ value = xml.children.inject({}) { |data,child| self.merge( data, simplify(child) ) }
22
+ { xml.name.to_sym => value }
23
+ else
24
+ str = xml.text
25
+ value = case str
26
+ when /^(\d+)-(\d+)-(\d+)T(\d+):(\d+):(\d+)Z$/
27
+ Time.gm($1,$2,$3,$4,$5,$6)
28
+ when /^\d+$/
29
+ if str.to_i.to_s == str
30
+ str.to_i
31
+ else
32
+ str
33
+ end
34
+ when /^\d+\.\d+$/
35
+ str.to_f
36
+ else
37
+ str
38
+ end
39
+ { xml.name.to_sym => value }
40
+ end
41
+ else
42
+ raise "XMLSimplifier -- failed to simplify: #{xml.inspect}"
43
+ end
44
+ end
45
+
46
+ def self.merge(hash1, hash2)
47
+ hash2.each_key { |key|
48
+ if hash1[key]
49
+ hash1[key] = [hash1[key], hash2[key]].flatten
50
+ else
51
+ hash1[key] = hash2[key]
52
+ end
53
+ }
54
+ hash1
55
+ end
56
+
57
+ end # Amazon::WebServices::Util::XMLSimplifier
58
+
59
+ end # Amazon::WebServices::Util
60
+ end # Amazon::WebServices
61
+ end # Amazon
data/lib/ruby-aws.rb ADDED
@@ -0,0 +1,21 @@
1
+ # Copyright:: Copyright (c) 2007 Amazon Technologies, Inc.
2
+ # License:: Apache License, Version 2.0
3
+
4
+ require 'ruby-aws/version'
5
+
6
+ begin ; require 'rubygems' ; rescue LoadError => e ; end
7
+
8
+ require 'amazon/webservices/mechanical_turk_requester'
9
+
10
+ module RubyAWS
11
+
12
+ def self.agent(software_name="")
13
+ version = "ruby-aws/#{RubyAWS::VERSION}"
14
+ if software_name.to_s == ""
15
+ version
16
+ else
17
+ "#{version} #{software_name}"
18
+ end
19
+ end
20
+
21
+ end
@@ -0,0 +1,8 @@
1
+ # Copyright:: Copyright (c) 2007 Amazon Technologies, Inc.
2
+ # License:: Apache License, Version 2.0
3
+
4
+ module RubyAWS
5
+ SRC_PATH = " $URL$ "
6
+ SRC_PATH =~ /tags\/(\d+\.\d+\.\d+)\/.*\/ruby-aws\/version.rb/
7
+ VERSION = ($1 || "0.0.1").freeze
8
+ end