mturk 1.8.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (78) hide show
  1. checksums.yaml +7 -0
  2. checksums.yaml.gz.sig +0 -0
  3. data.tar.gz.sig +2 -0
  4. data/.gemtest +0 -0
  5. data/History.md +105 -0
  6. data/LICENSE.txt +202 -0
  7. data/Manifest.txt +72 -0
  8. data/NOTICE.txt +4 -0
  9. data/README.md +100 -0
  10. data/Rakefile +33 -0
  11. data/bin/mturk +9 -0
  12. data/lib/amazon/util.rb +10 -0
  13. data/lib/amazon/util/binder.rb +48 -0
  14. data/lib/amazon/util/data_reader.rb +169 -0
  15. data/lib/amazon/util/filter_chain.rb +79 -0
  16. data/lib/amazon/util/hash_nesting.rb +93 -0
  17. data/lib/amazon/util/lazy_results.rb +59 -0
  18. data/lib/amazon/util/logging.rb +23 -0
  19. data/lib/amazon/util/paginated_iterator.rb +70 -0
  20. data/lib/amazon/util/proactive_results.rb +116 -0
  21. data/lib/amazon/util/threadpool.rb +129 -0
  22. data/lib/amazon/util/user_data_store.rb +100 -0
  23. data/lib/amazon/webservices/mechanical_turk.rb +123 -0
  24. data/lib/amazon/webservices/mechanical_turk_requester.rb +285 -0
  25. data/lib/amazon/webservices/mturk/mechanical_turk_error_handler.rb +153 -0
  26. data/lib/amazon/webservices/mturk/question_generator.rb +58 -0
  27. data/lib/amazon/webservices/util/amazon_authentication_relay.rb +72 -0
  28. data/lib/amazon/webservices/util/command_line.rb +155 -0
  29. data/lib/amazon/webservices/util/convenience_wrapper.rb +90 -0
  30. data/lib/amazon/webservices/util/filter_proxy.rb +45 -0
  31. data/lib/amazon/webservices/util/mock_transport.rb +70 -0
  32. data/lib/amazon/webservices/util/request_signer.rb +42 -0
  33. data/lib/amazon/webservices/util/rest_transport.rb +120 -0
  34. data/lib/amazon/webservices/util/soap_simplifier.rb +48 -0
  35. data/lib/amazon/webservices/util/soap_transport.rb +20 -0
  36. data/lib/amazon/webservices/util/soap_transport_header_handler.rb +27 -0
  37. data/lib/amazon/webservices/util/unknown_result_exception.rb +27 -0
  38. data/lib/amazon/webservices/util/validation_exception.rb +55 -0
  39. data/lib/amazon/webservices/util/xml_simplifier.rb +61 -0
  40. data/lib/mturk.rb +19 -0
  41. data/lib/mturk/version.rb +6 -0
  42. data/run_rcov.sh +1 -0
  43. data/samples/best_image/BestImage.rb +61 -0
  44. data/samples/best_image/best_image.properties +39 -0
  45. data/samples/best_image/best_image.question +82 -0
  46. data/samples/blank_slate/BlankSlate.rb +63 -0
  47. data/samples/blank_slate/BlankSlate_multithreaded.rb +67 -0
  48. data/samples/helloworld/MTurkHelloWorld.rb +56 -0
  49. data/samples/helloworld/mturk.yml +8 -0
  50. data/samples/review_policy/ReviewPolicy.rb +139 -0
  51. data/samples/review_policy/review_policy.question +30 -0
  52. data/samples/reviewer/Reviewer.rb +103 -0
  53. data/samples/reviewer/mturk.yml +8 -0
  54. data/samples/simple_survey/SimpleSurvey.rb +98 -0
  55. data/samples/simple_survey/simple_survey.question +30 -0
  56. data/samples/site_category/SiteCategory.rb +87 -0
  57. data/samples/site_category/externalpage.htm +71 -0
  58. data/samples/site_category/site_category.input +6 -0
  59. data/samples/site_category/site_category.properties +56 -0
  60. data/samples/site_category/site_category.question +9 -0
  61. data/test/mturk/test_changehittypeofhit.rb +130 -0
  62. data/test/mturk/test_error_handler.rb +403 -0
  63. data/test/mturk/test_mechanical_turk_requester.rb +178 -0
  64. data/test/mturk/test_mock_mechanical_turk_requester.rb +205 -0
  65. data/test/test_mturk.rb +21 -0
  66. data/test/unit/test_binder.rb +89 -0
  67. data/test/unit/test_data_reader.rb +135 -0
  68. data/test/unit/test_exceptions.rb +32 -0
  69. data/test/unit/test_hash_nesting.rb +99 -0
  70. data/test/unit/test_lazy_results.rb +89 -0
  71. data/test/unit/test_mock_transport.rb +132 -0
  72. data/test/unit/test_paginated_iterator.rb +58 -0
  73. data/test/unit/test_proactive_results.rb +108 -0
  74. data/test/unit/test_question_generator.rb +55 -0
  75. data/test/unit/test_threadpool.rb +50 -0
  76. data/test/unit/test_user_data_store.rb +80 -0
  77. metadata +225 -0
  78. metadata.gz.sig +0 -0
@@ -0,0 +1,135 @@
1
+ # Copyright:: Copyright (c) 2007 Amazon Technologies, Inc.
2
+ # License:: Apache License, Version 2.0
3
+
4
+ require 'tempfile'
5
+ require 'test/unit/testcase'
6
+ require 'amazon/util/data_reader'
7
+
8
+ class TestDataReader < Test::Unit::TestCase
9
+ include Amazon::Util
10
+
11
+ SAMPLE_LIST_DATA = [ { :a => 1, :b => { :c => 2, :d => 3 }, :e => [ {:f => 4, :g => 5}, {:f => "anew\nline", :g => 7} ] },
12
+ { :a => 2, :b => { :c => 4, :d => "for fun" }, :e => [ {:f => 2, :g => 4}, {:f => 8, :g => 7} ] },
13
+ { :a => 3, :b => { :c => "apples, oranges", :d => 1 }, :e => [ {:f => 2, :g => 3}, {:f => 9, :g => 6} ] }, ]
14
+
15
+ YAML_LIST_DATA = <<EOF
16
+ ---
17
+ - :b:
18
+ :c: 2
19
+ :d: 3
20
+ :a: 1
21
+ :e:
22
+ - :f: 4
23
+ :g: 5
24
+ - :f: "anew\\nline"
25
+ :g: 7
26
+ - :b:
27
+ :c: 4
28
+ :d: for fun
29
+ :a: 2
30
+ :e:
31
+ - :f: 2
32
+ :g: 4
33
+ - :f: 8
34
+ :g: 7
35
+ - :b:
36
+ :c: apples, oranges
37
+ :d: 1
38
+ :a: 3
39
+ :e:
40
+ - :f: 2
41
+ :g: 3
42
+ - :f: 9
43
+ :g: 6
44
+ EOF
45
+
46
+ TABULAR_LIST_DATA = <<EOF
47
+ a b.c b.d e.1.f e.1.g e.2.f e.2.g
48
+ 1 2 3 4 5 "anew
49
+ line" 7
50
+ 2 4 "for fun" 2 4 8 7
51
+ 3 apples, oranges 1 2 3 9 6
52
+ EOF
53
+
54
+ CSV_LIST_DATA = <<EOF
55
+ a,b.c,b.d,e.1.f,e.1.g,e.2.f,e.2.g
56
+ 1,2,3,4,5,"anew
57
+ line",7
58
+ 2,4,for fun,2,4,8,7
59
+ 3,"apples, oranges",1,2,3,9,6
60
+ EOF
61
+
62
+ SAMPLE_PROPERTIES_DATA = { :a => 1, :b => { :c => 2, :d => 3 }, :e => 4, :f => "Such a complex, yet whimsical fancy" }
63
+
64
+ YAML_PROPERTIES_DATA = <<EOF
65
+ ---
66
+ :b:
67
+ :c: 2
68
+ :d: 3
69
+ :a: 1
70
+ :e: 4
71
+ :f: Such a complex, yet whimsical fancy
72
+ EOF
73
+
74
+ PROP_PROPERTIES_DATA = <<EOF
75
+ b.c=2
76
+ b.d=3
77
+ a=1
78
+ e=4
79
+ f=Such a complex, yet whimsical fancy
80
+ EOF
81
+
82
+ include Amazon::Util
83
+
84
+ def saveAndLoad( raw, format, sample )
85
+ @tmp = Tempfile.new( 'mturk-test')
86
+ @tmp << raw
87
+ @tmp.close
88
+ data = DataReader.load( @tmp.path, format )
89
+ assert_equal sample, data
90
+ end
91
+
92
+ def reloadCheck( format, data )
93
+ @tmp = Tempfile.new( 'mturk-test')
94
+ @tmp.close
95
+ DataReader.save( @tmp.path, data, format )
96
+ restore = DataReader.load( @tmp.path, format )
97
+ assert_equal data, restore
98
+ end
99
+
100
+ def testReadYAML
101
+ saveAndLoad( YAML_LIST_DATA, :YAML, SAMPLE_LIST_DATA )
102
+ saveAndLoad( YAML_PROPERTIES_DATA, :YAML, SAMPLE_PROPERTIES_DATA )
103
+ end
104
+
105
+ def testReadProp
106
+ saveAndLoad( PROP_PROPERTIES_DATA, :Properties, SAMPLE_PROPERTIES_DATA )
107
+ end
108
+
109
+ def testReadTabular
110
+ saveAndLoad( TABULAR_LIST_DATA, :Tabular, SAMPLE_LIST_DATA )
111
+ end
112
+
113
+ def testReadCSV
114
+ saveAndLoad( CSV_LIST_DATA, :CSV, SAMPLE_LIST_DATA )
115
+ end
116
+
117
+ def testRestoreYAML
118
+ reloadCheck( :YAML, SAMPLE_LIST_DATA )
119
+ reloadCheck( :YAML, SAMPLE_PROPERTIES_DATA )
120
+ end
121
+
122
+ def testRestoreProp
123
+ reloadCheck( :Properties, SAMPLE_PROPERTIES_DATA )
124
+ end
125
+
126
+ def testRestoreTabular
127
+ reloadCheck( :Tabular, SAMPLE_LIST_DATA )
128
+ end
129
+
130
+ def testRestoreCSV
131
+ reloadCheck( :CSV, SAMPLE_LIST_DATA )
132
+ end
133
+
134
+
135
+ end # TestDataReader
@@ -0,0 +1,32 @@
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/unknown_result_exception'
6
+ require 'amazon/webservices/util/validation_exception'
7
+
8
+ class TestExceptions < Test::Unit::TestCase
9
+ include Amazon::WebServices::Util
10
+
11
+ def testUnknownString
12
+ @methodName = :Method17
13
+ ex = UnknownResultException.new( RuntimeError.new('superRuntimeError'), @methodName, nil )
14
+
15
+ assert_equal "UnknownResultException: got superRuntimeError calling Method17", ex.to_s
16
+ end
17
+
18
+ def testValidationString
19
+ @result = { :OperationRequest => {:RequestId=>"aa718afb-a1f2-4812-9962-4058c20d75a8"},
20
+ :HIT => { :Request => { :IsValid=>"False",
21
+ :Errors => { :Error => { :Message => "your xml broke",
22
+ :Code => "AWS.MechanicalTurk.XMLParseError"}
23
+ }
24
+ }
25
+ }
26
+ }
27
+ ex = ValidationException.new( @result )
28
+
29
+ assert_equal "ValidationException: AWS.MechanicalTurk.XMLParseError", ex.to_s
30
+ end
31
+
32
+ end
@@ -0,0 +1,99 @@
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/hash_nesting'
6
+
7
+ class TestHashNesting < Test::Unit::TestCase
8
+ include Amazon::Util
9
+
10
+ def setup
11
+ @hash = {}.extend HashNesting
12
+ @nested = { 'a' => 'b', 'c.d' => 'e', 'c.f' => 'g', 'h.1.i' => 'j', 'h.2.k' => 'l' }.extend HashNesting
13
+ @unnested = { :a => 'b', :c => { :d => 'e', :f => 'g' }, :h => [ {:i => 'j'}, {:k => 'l'} ] }.extend HashNesting
14
+ end
15
+
16
+ def testSimpleNest
17
+ @hash[:a] = 'b'
18
+ @hash[:p] = { :q => 'r', :s => 't' }
19
+ @hash[:x] = [{:y => 'z'}, {:y => 'w'}]
20
+ nest = @hash.nest
21
+ assert_equal 'b', nest['a']
22
+ assert_equal 'r', nest['p.q']
23
+ assert_equal 't', nest['p.s']
24
+ assert_equal 'z', nest['x.1.y']
25
+ assert_equal 'w', nest['x.2.y']
26
+ assert_equal [], %w( a p.q p.s x.1.y x.2.y) - nest.keys
27
+ assert_equal [], nest.keys - %w( a p.q p.s x.1.y x.2.y)
28
+ end
29
+
30
+ def testSimpleUnnest
31
+ @hash['a'] = 'b'
32
+ @hash['p.q'] = 'r'
33
+ @hash['x.1.w'] = 'q'
34
+ @hash['x.2.w'] = 'z'
35
+ unnest = @hash.unnest
36
+ assert_equal 'b', unnest[:a]
37
+ assert_equal 'r', unnest[:p][:q]
38
+ assert_equal 'q', unnest[:x][0][:w]
39
+ assert_equal 'z', unnest[:x][1][:w]
40
+ end
41
+
42
+ def testMutability
43
+ cpy = @unnested.dup
44
+
45
+ unnest = @unnested.unnest
46
+ assert_equal cpy, @unnested
47
+ assert_not_nil unnest
48
+ unnest[:q] = 'p'
49
+ assert_equal cpy, @unnested
50
+
51
+ nest = @unnested.nest
52
+ assert_equal cpy, @unnested
53
+ assert_not_nil nest
54
+ nest['q'] = 'p'
55
+ assert_equal cpy, @unnested
56
+
57
+ @unnested.nest!
58
+ assert_equal @nested, @unnested
59
+ @unnested.unnest!
60
+ assert_equal cpy, @unnested
61
+
62
+ @unnested.nest!.unnest!
63
+ assert_equal cpy, @unnested
64
+
65
+ assert_equal cpy, @unnested.unnest!
66
+
67
+ cpy = @nested.dup
68
+
69
+ @nested.unnest!.nest!
70
+ assert_equal cpy, @nested
71
+
72
+ assert_equal cpy, @nested.nest!
73
+ end
74
+
75
+ def testChaining
76
+ assert_equal @unnested, @nested.unnest.unnest!.unnest
77
+ assert_equal @nested, @unnested.nest.nest!.nest
78
+ assert_equal @nested, @nested.unnest.unnest!.nest!.nest
79
+ assert_equal @unnested, @unnested.nest.nest!.unnest!.unnest
80
+ end
81
+
82
+ def testPrecedence
83
+ @hash['a'] = 'b'
84
+ @hash[:a] = 'c'
85
+ @hash[:z] = 'x'
86
+ @hash['z'] = 'y'
87
+
88
+ assert_equal 'c', @hash.nest['a']
89
+ assert_equal 'c', @hash.unnest[:a]
90
+ assert_equal 'x', @hash.nest['z']
91
+ assert_equal 'x', @hash.unnest[:z]
92
+
93
+ @hash['a'] = 'd'
94
+
95
+ assert_equal 'c', @hash.nest['a']
96
+ assert_equal 'c', @hash.unnest[:a]
97
+ end
98
+
99
+ end
@@ -0,0 +1,89 @@
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/lazy_results'
6
+
7
+ class TestLazyResults < 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_lazy = LazyResults.new {|page| @call_count += 1 ; @simple_data[ page-1 ] }
16
+ end
17
+
18
+ def testBasic
19
+ assert_equal 0, @call_count
20
+ assert_equal @simple_data.flatten, @simple_lazy.to_a
21
+ assert_equal 4, @call_count
22
+ assert_equal @simple_data.flatten, @simple_lazy.to_a
23
+ assert_equal 4, @call_count
24
+ assert_equal Array, @simple_lazy.to_a.class
25
+ end
26
+
27
+ def testEnumerable
28
+ result = @simple_lazy.collect
29
+ assert_equal @simple_data.flatten, result.to_a
30
+ assert_equal 4, @call_count
31
+ result = @simple_lazy.collect
32
+ assert_equal @simple_data.flatten, result.to_a
33
+ assert_equal 4, @call_count
34
+ minus1 = @simple_lazy.collect {|i| i-1}
35
+ minus1.each_with_index {|i,n| assert_equal i, n }
36
+ evenodd = @simple_lazy.inject({:even => [],:odd => []}) {|a,num| a[ num % 2 == 0 ? :even : :odd ] << num ; a }
37
+ expected = {:even => [2,4,6], :odd => [1,3,5] }
38
+ assert_equal expected, evenodd
39
+ end
40
+
41
+ def testIncremental
42
+ count = 0
43
+ @simple_lazy.each { |value|
44
+ assert_equal count+1, value
45
+ assert_equal( (count / @simple_pagesize)+1, @call_count )
46
+ count += 1
47
+ }
48
+ assert_equal 4, @call_count
49
+ end
50
+
51
+ def testRandomAccess
52
+ assert_equal 4, @simple_lazy[3]
53
+ assert_equal 2, @call_count
54
+ assert_nil @simple_lazy[@simple_data_size]
55
+ assert_equal 4, @call_count
56
+ 10.times do
57
+ index = rand(@simple_data_size+@simple_pagesize)
58
+ assert_equal( ( index >= @simple_data_size ? nil : index+1 ), @simple_lazy[index] )
59
+ end
60
+ assert_equal 4, @call_count
61
+ assert_equal @simple_data.flatten, @simple_lazy.to_a
62
+ end
63
+
64
+ def testFlush
65
+ @simple_lazy.to_a
66
+ @simple_lazy.to_a
67
+ assert_equal 4, @call_count
68
+ @simple_lazy.flush
69
+ @simple_lazy.to_a
70
+ assert_equal 8, @call_count
71
+ end
72
+
73
+ def testError
74
+ @picky_message = "picky picky picky"
75
+ @picky_lazy = LazyResults.new {|page| @call_count += 1 ; if page < 3 ; @simple_data[ page-1 ] ; else ; raise @picky_message ; end }
76
+ assert_equal 4, @picky_lazy[3]
77
+ e = assert_raises( RuntimeError ) { @picky_lazy[4] }
78
+ assert_equal @picky_message, e.message
79
+ end
80
+
81
+ def testImmutability
82
+ assert_equal 3, @simple_lazy[2]
83
+ a = @simple_lazy.to_a
84
+ assert_equal 3, a[2]
85
+ a[2] = 7
86
+ assert_equal 3, @simple_lazy[2]
87
+ end
88
+
89
+ end
@@ -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
+