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,132 @@
1
+ # Copyright:: Copyright (c) 2007 Amazon Technologies, Inc.
2
+ # License:: Apache License, Version 2.0
3
+
4
+ require 'test/unit/testcase'
5
+ require 'amazon/webservices/util/mock_transport'
6
+
7
+ class TestMockTransport < Test::Unit::TestCase
8
+ include Amazon::WebServices::Util
9
+
10
+ SAMPLE_REQUEST = { :speed => :slow }
11
+ SAMPLE_ARGS = { :Auth => :fake, :Request => [SAMPLE_REQUEST] }
12
+
13
+ def setup
14
+ @mock = MockTransport.new
15
+ end
16
+
17
+ def testBasic
18
+ result = @mock.dance SAMPLE_ARGS
19
+
20
+ assert result[:OperationRequest]
21
+ assert result[:MockResult]
22
+ assert_equal SAMPLE_REQUEST, result[:MockResult][:Request]
23
+
24
+ request = @mock.call_buffer[0]
25
+ assert request
26
+ assert request.args
27
+ assert request.request
28
+ assert_equal :dance, request.name
29
+ assert_equal SAMPLE_ARGS, request.args
30
+ assert_equal SAMPLE_REQUEST, request.request
31
+ end
32
+
33
+ def testListener
34
+ @a = []
35
+ log_listener = proc { |call| @a << call }
36
+
37
+ mock = MockTransport.new :MockListener => log_listener
38
+ mock.dance SAMPLE_ARGS
39
+
40
+ assert_equal 1, @a.size
41
+ assert_equal SAMPLE_REQUEST, @a.first.request
42
+ end
43
+
44
+ def testListenerInjection
45
+ injection_listener = proc {|call| {:Param => :Injected } }
46
+
47
+ mock = MockTransport.new :MockListener => injection_listener
48
+ result = mock.dance SAMPLE_ARGS
49
+
50
+ assert_equal :Injected, result[:Param], "Should have injected our parameter"
51
+ assert result[:MockResult], "Injection should not have precluded MockResult"
52
+ end
53
+
54
+ def testMockReply
55
+ result = @mock.dance SAMPLE_ARGS
56
+ @mock.mock_reply = {:Bogus => :Fun}
57
+ result2 = @mock.dance SAMPLE_ARGS
58
+
59
+ assert result[:MockResult]
60
+ assert_nil result2[:MockResult]
61
+
62
+ assert_nil result[:Bogus]
63
+ assert result2[:Bogus]
64
+ end
65
+
66
+ def testEnumerable
67
+
68
+ # should start out with empty buffer
69
+ calls = @mock.collect { |call| call.name }
70
+ assert_equal [], calls
71
+
72
+ # now generate 3 calls
73
+ @mock.dance SAMPLE_ARGS
74
+ @mock.fall SAMPLE_ARGS
75
+ @mock.sing SAMPLE_ARGS
76
+
77
+ # ensure we got all 3 args in proper order
78
+ calls = @mock.collect { |call| call.name }
79
+ assert_equal [:dance,:fall,:sing], calls
80
+
81
+ # should be repeatable
82
+ calls = @mock.collect { |call| call.name }
83
+ assert_equal [:dance,:fall,:sing], calls
84
+
85
+ # now flush the buffer and ensure it's empty again
86
+ @mock.flush
87
+ calls = @mock.collect { |call| call.name }
88
+ assert_equal [], calls
89
+ end
90
+
91
+ def testNext
92
+
93
+ # should start out with empty buffer
94
+ assert_nil @mock.next
95
+
96
+ # make a call
97
+ @mock.dance SAMPLE_ARGS
98
+
99
+ # call shows up with #next
100
+ n = @mock.next
101
+ assert_equal :dance, n.name
102
+
103
+ # should only have been one call in the buffer
104
+ assert_nil @mock.next
105
+
106
+ # two more calls
107
+ @mock.fall SAMPLE_ARGS
108
+ @mock.sing SAMPLE_ARGS
109
+
110
+ # ensure we get them in proper order
111
+ assert_equal :fall, @mock.next.name
112
+ assert_equal :sing, @mock.next.name
113
+
114
+ # and we should have no more
115
+ assert_nil @mock.next
116
+
117
+ # after flushing, we should still have none
118
+ @mock.flush
119
+ assert_nil @mock.next
120
+
121
+ # add one more call
122
+ @mock.smile SAMPLE_ARGS
123
+
124
+ # we should have just one queued up now
125
+ assert_equal :smile, @mock.next.name
126
+ assert_nil @mock.next
127
+
128
+ end
129
+
130
+ end
131
+
132
+
@@ -0,0 +1,58 @@
1
+ # Copyright:: Copyright (c) 2007 Amazon Technologies, Inc.
2
+ # License:: Apache License, Version 2.0
3
+
4
+ require 'test/unit/testcase'
5
+ require 'amazon/util/paginated_iterator'
6
+
7
+ class TestPaginatedIterator < Test::Unit::TestCase
8
+ include Amazon::Util
9
+
10
+ def setup
11
+ @call_count = 0
12
+ @simple_pagesize = 2
13
+ @simple_data_size = 6
14
+ @simple_data = [ [1,2],[3,4],[5,6] ]
15
+ @simple_iter = PaginatedIterator.new {|page| @call_count += 1 ; @simple_data[ page-1 ] }
16
+ end
17
+
18
+ def testNext
19
+ assert_equal 0, @call_count
20
+ @simple_data.flatten.each do |i|
21
+ assert_equal i, @simple_iter.next
22
+ end
23
+ assert_equal 3, @call_count
24
+ assert !@simple_iter.done
25
+ assert_nil @simple_iter.next
26
+ assert_equal 4, @call_count
27
+ assert @simple_iter.done
28
+ end
29
+
30
+ def testRestart
31
+ assert_equal 0, @call_count
32
+ @simple_iter.next until @simple_iter.done
33
+ assert_equal 4, @call_count
34
+ @simple_iter.restart
35
+ assert !@simple_iter.done
36
+ @simple_iter.next until @simple_iter.done
37
+ assert_equal 8, @call_count
38
+ end
39
+
40
+ def testEach
41
+ res = []
42
+ @simple_iter.each {|i| res << i }
43
+ assert_equal @simple_data.flatten, res
44
+ assert_equal 4, @call_count
45
+ assert @simple_iter.done
46
+ @simple_iter.each {|i| fail }
47
+ end
48
+
49
+ def testError
50
+ @picky_message = "picky picky picky"
51
+ @picky_iter = PaginatedIterator.new {|page| @call_count += 1 ; if page < 3 ; @simple_data[ page-1 ] ; else ; raise @picky_message ; end }
52
+ 3.times { @picky_iter.next }
53
+ assert_equal 4, @picky_iter.next
54
+ e = assert_raises( RuntimeError ) { @picky_iter.next }
55
+ assert_equal @picky_message, e.message
56
+ end
57
+
58
+ end
@@ -0,0 +1,108 @@
1
+ # Copyright:: Copyright (c) 2007 Amazon Technologies, Inc.
2
+ # License:: Apache License, Version 2.0
3
+
4
+ require 'test/unit/testcase'
5
+ require 'amazon/util/proactive_results'
6
+
7
+ class TestProactiveResults < Test::Unit::TestCase
8
+ include Amazon::Util
9
+
10
+ def setup
11
+ @call_count = 0
12
+ @exception_count = 0
13
+ @simple_pagesize = 2
14
+ @simple_data_size = 6
15
+ @simple_data = [ [1,2],[3,4],[5,6] ]
16
+ @simple_proactive = ProactiveResults.new {|page| @call_count += 1 ; @simple_data[ page-1 ] }
17
+ end
18
+
19
+ def testBasic
20
+ assert @call_count >= 0
21
+ assert_equal @simple_data.flatten, @simple_proactive.to_a
22
+ assert_equal 6, @call_count
23
+ assert_equal @simple_data.flatten, @simple_proactive.to_a
24
+ assert_equal 6, @call_count
25
+ assert_equal Array, @simple_proactive.to_a.class
26
+ end
27
+
28
+ def testEnumerable
29
+ result = @simple_proactive.collect
30
+ assert_equal @simple_data.flatten, result
31
+ assert_equal 6, @call_count
32
+ result = @simple_proactive.collect
33
+ assert_equal @simple_data.flatten, result
34
+ assert_equal 6, @call_count
35
+ minus1 = @simple_proactive.collect {|i| i-1}
36
+ minus1.each_with_index {|i,n| assert_equal i, n }
37
+ evenodd = @simple_proactive.inject({:even => [],:odd => []}) {|a,num| a[ num % 2 == 0 ? :even : :odd ] << num ; a }
38
+ expected = {:even => [2,4,6], :odd => [1,3,5] }
39
+ assert_equal expected, evenodd
40
+ end
41
+
42
+ def testIncremental
43
+ count = 0
44
+ remaining = @simple_data.flatten
45
+ @simple_proactive.each { |value|
46
+ assert_not_nil value
47
+ assert_not_nil remaining.delete( value )
48
+ assert @call_count >= (count / @simple_pagesize)+1
49
+ count += 1
50
+ }
51
+ assert_equal 6, count
52
+ assert_equal 6, @call_count
53
+ end
54
+
55
+ def testRandomAccess
56
+ assert [2,4,6].member?( @simple_proactive[3] )
57
+ assert @call_count >= 2
58
+ assert_nil @simple_proactive[@simple_data_size]
59
+ assert_equal 6, @call_count
60
+ 10.times do
61
+ index = rand(@simple_data_size+@simple_pagesize)
62
+ if index >= @simple_data_size
63
+ assert_nil @simple_proactive[index]
64
+ else
65
+ if index % 2 == 0
66
+ assert [1,3,5].member?( @simple_proactive[index] )
67
+ else
68
+ assert [2,4,6].member?( @simple_proactive[index] )
69
+ end
70
+ end
71
+ end
72
+ assert_equal 6, @call_count
73
+ assert_equal @simple_data.flatten, @simple_proactive.to_a.sort
74
+ end
75
+
76
+ def testFlush
77
+ @simple_proactive.to_a
78
+ @simple_proactive.to_a
79
+ assert_equal 6, @call_count
80
+ @simple_proactive.flush
81
+ @simple_proactive.to_a
82
+ assert_equal 12, @call_count
83
+ end
84
+
85
+ def testError
86
+ @picky_message = "picky picky picky"
87
+ exception_count = 0
88
+ @picky_proactive = ProactiveResults.new(Proc.new {|i| exception_count += 1 }) do |page|
89
+ @call_count += 1
90
+ if page < 3
91
+ @simple_data[ page-1 ]
92
+ else
93
+ raise @picky_message
94
+ end
95
+ end
96
+ assert_equal @simple_data.flatten[0..3], @picky_proactive.to_a
97
+ assert_equal 3, exception_count
98
+ end
99
+
100
+ def testImmutability
101
+ assert_equal 3, @simple_proactive[2]
102
+ a = @simple_proactive.to_a
103
+ assert_equal 3, a[2]
104
+ a[2] = 7
105
+ assert_equal 3, @simple_proactive[2]
106
+ end
107
+
108
+ end
@@ -0,0 +1,54 @@
1
+ # Copyright:: Copyright (c) 2007 Amazon Technologies, Inc.
2
+ # License:: Apache License, Version 2.0
3
+
4
+ require 'test/unit/testcase'
5
+ require 'amazon/webservices/mturk/question_generator'
6
+
7
+ class TestQuestionGenerator < Test::Unit::TestCase
8
+ include Amazon::WebServices::MTurk
9
+
10
+ def testBuilder
11
+ xml = QuestionGenerator.build { |gen| gen.ask "What color is the sky?" }
12
+ assert_equal String, xml.class
13
+ assert !xml.empty?
14
+ assert xml =~ /What color is the sky/
15
+ end
16
+
17
+ def testXmlEscaping
18
+ xml = QuestionGenerator.build{ |gen| gen.ask "Is 1 > 2 & < 7 ?" }
19
+ assert xml =~ /<Text>(.*)<\/Text>/
20
+ escaped_text = $1
21
+ assert_equal "Is 1 &gt; 2 &amp; &lt; 7 ?", escaped_text
22
+ end
23
+
24
+ def testValidXML
25
+ xml = QuestionGenerator.build{ |gen| gen.ask "who loves chocolate most?" }
26
+ require 'rexml/document'
27
+ # REXML will throw an exception if the xml is invalid / malformatted
28
+ valid = REXML::Document.new(xml)
29
+ end
30
+
31
+ def testAlternateInvocations
32
+ myQuestion = "how many tuna fit in a can?"
33
+
34
+ built = QuestionGenerator.build { |gen| gen.ask myQuestion }
35
+ built_basic = QuestionGenerator.build( :Basic ) { |gen| gen.ask myQuestion }
36
+ built_askbasic = QuestionGenerator.build { |gen| gen.askBasic myQuestion }
37
+
38
+ defaultgen = QuestionGenerator.new
39
+ defaultgen.ask myQuestion
40
+ obj = defaultgen.to_xml
41
+
42
+ defaultgen = QuestionGenerator.new
43
+ defaultgen.askBasic myQuestion
44
+ obj_askbasic = defaultgen.to_xml
45
+
46
+ basicgen = QuestionGenerator.new( :Basic )
47
+ basicgen.ask myQuestion
48
+ obj_basic = basicgen.to_xml
49
+
50
+ # all methods should generate the exact same string
51
+ [built_basic,built_askbasic,obj,obj_askbasic,obj_basic].each { |comp| assert_equal built, comp }
52
+ end
53
+
54
+ end
@@ -0,0 +1,50 @@
1
+ # Copyright:: Copyright (c) 2007 Amazon Technologies, Inc.
2
+ # License:: Apache License, Version 2.0
3
+
4
+ require 'amazon/util/threadpool'
5
+
6
+ class TestThreadpool < Test::Unit::TestCase
7
+ include Amazon::Util
8
+
9
+ def setup
10
+ @tp = ThreadPool.new 5
11
+ end
12
+
13
+ def teardown
14
+ @tp.finish
15
+ end
16
+
17
+ def testNothing
18
+ assert true
19
+ end
20
+
21
+ def testDoSomething
22
+ @tp.addWork { sleep(0.1) }
23
+ assert true
24
+ end
25
+
26
+ def testSimple
27
+ q = Queue.new
28
+
29
+ 5.times {|t| @tp.addWork(t) {|i| sleep(rand(4)*0.1) ; q << i } }
30
+ @tp.finish
31
+
32
+ s = []
33
+ 5.times { s << q.pop }
34
+ assert_equal [0,1,2,3,4], s.sort
35
+ end
36
+
37
+ def testSync
38
+ s = []
39
+
40
+ 5.times { |t| @tp.addWork(t) {|i| s << i } }
41
+ @tp.sync
42
+ assert_equal [0,1,2,3,4], s.sort
43
+ 5.times { |t| @tp.addWork(t) {|i| s << i+5 } }
44
+ @tp.sync
45
+
46
+ assert_equal [0,1,2,3,4], s[0,5].sort
47
+ assert_equal [5,6,7,8,9], s[5,5].sort
48
+ end
49
+
50
+ end
@@ -0,0 +1,80 @@
1
+ # Copyright:: Copyright (c) 2007 Amazon Technologies, Inc.
2
+ # License:: Apache License, Version 2.0
3
+
4
+ require 'test/unit/testcase'
5
+ require 'amazon/util/binder'
6
+ require 'tempfile'
7
+ require 'fileutils'
8
+
9
+ class TestUserDataStore < Test::Unit::TestCase
10
+ include Amazon::Util
11
+
12
+ def setup
13
+ @tmpfile = Tempfile.new('RubyAWSTesting')
14
+ @fakehome = @tmpfile.path + 'homedir'
15
+ FileUtils.mkdir( @fakehome )
16
+ ENV['TEST_HOME_OVERRIDE'] = @fakehome
17
+ end
18
+
19
+ def teardown
20
+ ENV.delete 'TEST_HOME_OVERRIDE'
21
+ FileUtils.remove_dir( @fakehome )
22
+ @tmpfile = nil
23
+ end
24
+
25
+ def testSimpleValue
26
+ store = UserDataStore.new('TEST_MTURK')
27
+ store.set( :pudding, :color, 'yellow' )
28
+ store.save
29
+
30
+ store2 = UserDataStore.new('TEST_MTURK')
31
+ color = store.get :pudding, :color
32
+
33
+ assert_equal 'yellow', color, 'pudding was the wrong color'
34
+ end
35
+
36
+ def testEmpty
37
+ store = UserDataStore.new('TEST_MTURK')
38
+ color = store.get :pudding, :color
39
+ assert_nil color
40
+ end
41
+
42
+ def testClear
43
+ store = UserDataStore.new('TEST_MTURK')
44
+ store.set( :pudding, :color, 'green' )
45
+ store.set( :pudding, :smell, 'sweet' )
46
+ store.save
47
+
48
+ store.clear(:pudding)
49
+ store.save
50
+
51
+ store2 = UserDataStore.new('TEST_MTURK')
52
+ assert_nil store.get(:pudding,:color)
53
+ assert_nil store.get(:pudding,:smell)
54
+ end
55
+
56
+ def testClearPartial
57
+ store = UserDataStore.new('TEST_MTURK')
58
+ store.set( :pudding, :color, 'pink' )
59
+ store.set( :pudding, :smell, 'sour' )
60
+ store.save
61
+
62
+ store.clear(:pudding,:smell)
63
+ store.save
64
+
65
+ store2 = UserDataStore.new('TEST_MTURK')
66
+ assert_equal 'pink', store.get(:pudding,:color)
67
+ assert_nil store.get(:pudding,:smell)
68
+ end
69
+
70
+ def testNamespaces
71
+ store = UserDataStore.new('TEST_MTURK')
72
+ store.set( :pudding, :color, 'purple' )
73
+
74
+ same_namespaces = [ :Pudding, :PUDDING, :pUDDING, 'pudding', 'PUDDING', 'PuDDinG' ]
75
+ same_namespaces.each do |ns|
76
+ assert_equal 'purple', store.get(ns,:color)
77
+ end
78
+ end
79
+
80
+ end