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,22 @@
1
+ # Copyright:: Copyright (c) 2007 Amazon Technologies, Inc.
2
+ # License:: Apache License, Version 2.0
3
+
4
+ # Copyright:: Copyright (c) 2007 Amazon Technologies, Inc.
5
+ # License:: Apache License, Version 2.0
6
+
7
+ require 'test/unit'
8
+ require 'ruby-aws'
9
+
10
+ class TestRubyAWS < Test::Unit::TestCase
11
+
12
+ def testVersion
13
+ assert( RubyAWS::VERSION =~ /^\d+\.\d+\.\d+$/ , "RubyAWS::VERSION is incorrectly formatted")
14
+ end
15
+
16
+ def testAgent
17
+ assert( RubyAWS.agent =~ /^ruby-aws\/\d+\.\d+\.\d+$/ )
18
+ assert( RubyAWS.agent('Tester') =~ /^ruby-aws\/\d+\.\d+\.\d+ Tester$/ )
19
+ end
20
+
21
+ end
22
+
@@ -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/binder'
6
+
7
+ class TestBinder < Test::Unit::TestCase
8
+ include Amazon::Util
9
+
10
+ SAMPLE_VARS = { :a => 'pudding', :b => 'pie', :c => 'cheesecake' }
11
+
12
+ SAMPLE_TEMPLATE = "I love <%= @b %> (especially with <%= @a %>), but I love <%= @c %> even more!"
13
+
14
+ SAMPLE_EXPECTED = "I love pie (especially with pudding), but I love cheesecake even more!"
15
+
16
+ def testConstructorConfig
17
+ b = Binder.new( SAMPLE_VARS )
18
+ result = b.erb_eval( SAMPLE_TEMPLATE )
19
+ assert_equal SAMPLE_EXPECTED, result
20
+ end
21
+
22
+ def testBuilderConfig
23
+ b = Binder.new { |bb| SAMPLE_VARS.each {|k,v| bb.set( k, v ) } }
24
+ result = b.erb_eval( SAMPLE_TEMPLATE )
25
+ assert_equal SAMPLE_EXPECTED, result
26
+ end
27
+
28
+ def testInstanceConfig
29
+ b = Binder.new
30
+ SAMPLE_VARS.each { |k,v| b.set( k, v ) }
31
+ result = b.erb_eval( SAMPLE_TEMPLATE )
32
+ assert_equal SAMPLE_EXPECTED, result
33
+ end
34
+
35
+ def testMergeConfig
36
+ b = Binder.new
37
+ b.merge SAMPLE_VARS
38
+ result = b.erb_eval( SAMPLE_TEMPLATE )
39
+ assert_equal SAMPLE_EXPECTED, result
40
+ end
41
+
42
+ def testCombinedConfig
43
+ keys = SAMPLE_VARS.keys
44
+ b = Binder.new( keys[0] => SAMPLE_VARS[ keys[0] ] ) { |bb|
45
+ bb.set( keys[1], SAMPLE_VARS[ keys[1] ] ) }
46
+ b.set( keys[2], SAMPLE_VARS[ keys[2] ] )
47
+ result = b.erb_eval( SAMPLE_TEMPLATE )
48
+ assert_equal SAMPLE_EXPECTED, result
49
+ end
50
+
51
+ def testConfigPrecedence
52
+ b = Binder.new( SAMPLE_VARS ) { |bb|
53
+ bb.merge( 'a' => 'rhubarb', 'c'=> 'gelato' ) }
54
+ b.merge( :c => 'jello' )
55
+ result = b.erb_eval( SAMPLE_TEMPLATE )
56
+ assert_equal "I love pie (especially with rhubarb), but I love jello even more!", result
57
+ end
58
+
59
+ def testMissingVar
60
+ b = Binder.new
61
+ result = silently { b.erb_eval( "Going to the <%=@blue%> moon" ) }
62
+ assert_equal "Going to the moon", result
63
+ end
64
+
65
+ def testScopeCaller
66
+ b = Binder.new
67
+ @arg = "ocean"
68
+ result = silently { b.erb_eval( "swim in the <%= @arg %> seas" ) }
69
+ assert_equal "swim in the seas", result
70
+ end
71
+
72
+ def testScopeBoth
73
+ @zip = '--zip--'
74
+ b = Binder.new( :zip => '++zap++' )
75
+ result = b.erb_eval( "The line went <%= @zip %>" )
76
+ assert_equal "The line went ++zap++", result
77
+ end
78
+
79
+ private
80
+
81
+ def silently( &block )
82
+ warn_level = $VERBOSE
83
+ $VERBOSE = nil
84
+ result = block.call
85
+ $VERBOSE = warn_level
86
+ result
87
+ end
88
+
89
+ end
@@ -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