dbgrandi-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 +261 -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 +158 -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( 'ruby-aws-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( 'ruby-aws-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,93 @@
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
+
48
+ nest = @unnested.nest
49
+ assert_equal cpy, @unnested
50
+
51
+ @unnested.nest!
52
+ assert_equal @nested, @unnested
53
+ @unnested.unnest!
54
+ assert_equal cpy, @unnested
55
+
56
+ @unnested.nest!.unnest!
57
+ assert_equal cpy, @unnested
58
+
59
+ assert_equal cpy, @unnested.unnest!
60
+
61
+ cpy = @nested.dup
62
+
63
+ @nested.unnest!.nest!
64
+ assert_equal cpy, @nested
65
+
66
+ assert_equal cpy, @nested.nest!
67
+ end
68
+
69
+ def testChaining
70
+ assert_equal @unnested, @nested.unnest.unnest!.unnest
71
+ assert_equal @nested, @unnested.nest.nest!.nest
72
+ assert_equal @nested, @nested.unnest.unnest!.nest!.nest
73
+ assert_equal @unnested, @unnested.nest.nest!.unnest!.unnest
74
+ end
75
+
76
+ def testPrecedence
77
+ @hash['a'] = 'b'
78
+ @hash[:a] = 'c'
79
+ @hash[:z] = 'x'
80
+ @hash['z'] = 'y'
81
+
82
+ assert_equal 'c', @hash.nest['a']
83
+ assert_equal 'c', @hash.unnest[:a]
84
+ assert_equal 'x', @hash.nest['z']
85
+ assert_equal 'x', @hash.unnest[:z]
86
+
87
+ @hash['a'] = 'd'
88
+
89
+ assert_equal 'c', @hash.nest['a']
90
+ assert_equal 'c', @hash.unnest[:a]
91
+ end
92
+
93
+ 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
30
+ assert_equal 4, @call_count
31
+ result = @simple_lazy.collect
32
+ assert_equal @simple_data.flatten, result
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
+