ruby-aws 1.6.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (76) hide show
  1. data.tar.gz.sig +0 -0
  2. data/.gemtest +0 -0
  3. data/History.txt +75 -0
  4. data/LICENSE.txt +202 -0
  5. data/Manifest.txt +72 -0
  6. data/NOTICE.txt +4 -0
  7. data/README.txt +105 -0
  8. data/Rakefile +33 -0
  9. data/bin/ruby-aws +9 -0
  10. data/lib/amazon/util.rb +10 -0
  11. data/lib/amazon/util/binder.rb +48 -0
  12. data/lib/amazon/util/data_reader.rb +169 -0
  13. data/lib/amazon/util/filter_chain.rb +79 -0
  14. data/lib/amazon/util/hash_nesting.rb +93 -0
  15. data/lib/amazon/util/lazy_results.rb +59 -0
  16. data/lib/amazon/util/logging.rb +23 -0
  17. data/lib/amazon/util/paginated_iterator.rb +70 -0
  18. data/lib/amazon/util/proactive_results.rb +116 -0
  19. data/lib/amazon/util/threadpool.rb +129 -0
  20. data/lib/amazon/util/user_data_store.rb +100 -0
  21. data/lib/amazon/webservices/mechanical_turk.rb +123 -0
  22. data/lib/amazon/webservices/mechanical_turk_requester.rb +274 -0
  23. data/lib/amazon/webservices/mturk/mechanical_turk_error_handler.rb +150 -0
  24. data/lib/amazon/webservices/mturk/question_generator.rb +58 -0
  25. data/lib/amazon/webservices/util/amazon_authentication_relay.rb +72 -0
  26. data/lib/amazon/webservices/util/command_line.rb +157 -0
  27. data/lib/amazon/webservices/util/convenience_wrapper.rb +90 -0
  28. data/lib/amazon/webservices/util/filter_proxy.rb +45 -0
  29. data/lib/amazon/webservices/util/mock_transport.rb +70 -0
  30. data/lib/amazon/webservices/util/request_signer.rb +42 -0
  31. data/lib/amazon/webservices/util/rest_transport.rb +120 -0
  32. data/lib/amazon/webservices/util/soap_simplifier.rb +48 -0
  33. data/lib/amazon/webservices/util/soap_transport.rb +20 -0
  34. data/lib/amazon/webservices/util/soap_transport_header_handler.rb +27 -0
  35. data/lib/amazon/webservices/util/unknown_result_exception.rb +27 -0
  36. data/lib/amazon/webservices/util/validation_exception.rb +55 -0
  37. data/lib/amazon/webservices/util/xml_simplifier.rb +61 -0
  38. data/lib/ruby-aws.rb +19 -0
  39. data/lib/ruby-aws/version.rb +6 -0
  40. data/run_rcov.sh +1 -0
  41. data/samples/mturk/best_image/BestImage.rb +61 -0
  42. data/samples/mturk/best_image/best_image.properties +39 -0
  43. data/samples/mturk/best_image/best_image.question +82 -0
  44. data/samples/mturk/blank_slate/BlankSlate.rb +63 -0
  45. data/samples/mturk/blank_slate/BlankSlate_multithreaded.rb +67 -0
  46. data/samples/mturk/helloworld/MTurkHelloWorld.rb +56 -0
  47. data/samples/mturk/helloworld/mturk.yml +8 -0
  48. data/samples/mturk/review_policy/ReviewPolicy.rb +139 -0
  49. data/samples/mturk/review_policy/review_policy.question +30 -0
  50. data/samples/mturk/reviewer/Reviewer.rb +103 -0
  51. data/samples/mturk/reviewer/mturk.yml +8 -0
  52. data/samples/mturk/simple_survey/SimpleSurvey.rb +90 -0
  53. data/samples/mturk/simple_survey/simple_survey.question +30 -0
  54. data/samples/mturk/site_category/SiteCategory.rb +87 -0
  55. data/samples/mturk/site_category/externalpage.htm +71 -0
  56. data/samples/mturk/site_category/site_category.input +6 -0
  57. data/samples/mturk/site_category/site_category.properties +45 -0
  58. data/samples/mturk/site_category/site_category.question +9 -0
  59. data/test/mturk/test_changehittypeofhit.rb +130 -0
  60. data/test/mturk/test_error_handler.rb +137 -0
  61. data/test/mturk/test_mechanical_turk_requester.rb +178 -0
  62. data/test/mturk/test_mock_mechanical_turk_requester.rb +205 -0
  63. data/test/test_ruby-aws.rb +24 -0
  64. data/test/unit/test_binder.rb +89 -0
  65. data/test/unit/test_data_reader.rb +135 -0
  66. data/test/unit/test_exceptions.rb +32 -0
  67. data/test/unit/test_hash_nesting.rb +99 -0
  68. data/test/unit/test_lazy_results.rb +89 -0
  69. data/test/unit/test_mock_transport.rb +132 -0
  70. data/test/unit/test_paginated_iterator.rb +58 -0
  71. data/test/unit/test_proactive_results.rb +108 -0
  72. data/test/unit/test_question_generator.rb +55 -0
  73. data/test/unit/test_threadpool.rb +50 -0
  74. data/test/unit/test_user_data_store.rb +80 -0
  75. metadata +238 -0
  76. metadata.gz.sig +0 -0
@@ -0,0 +1,33 @@
1
+ # -*- ruby -*-
2
+
3
+ require 'rubygems'
4
+ require 'hoe'
5
+ require './lib/ruby-aws/version.rb'
6
+
7
+ Hoe.spec 'ruby-aws' do
8
+ self.version = RubyAWS::VERSION.dup
9
+ self.rubyforge_name = 'ruby-aws'
10
+ developer 'David J Parrott', 'valthon@nothlav.net'
11
+ extra_deps << ['highline','>= 1.2.7']
12
+ extra_deps << ['nokogiri','>= 1.4']
13
+ need_tar
14
+ need_zip
15
+
16
+ self.summary = 'Ruby libraries for working with Amazon Web Services ( Mechanical Turk )'
17
+ self.email = 'ruby-aws-develop@rubyforge.org'
18
+ self.urls = ["http://rubyforge.org/projects/ruby-aws/"]
19
+ end
20
+
21
+ task :gitversion do
22
+ gv = `git describe --dirty`.chomp.gsub(/^v/,'').gsub('-','.')
23
+ File.open('lib/ruby-aws/version.rb', File::WRONLY | File::CREAT | File::TRUNC ) do |f|
24
+ f << "# Copyright:: Copyright (c) 2007 Amazon Technologies, Inc.\n"
25
+ f << "# License:: Apache License, Version 2.0\n"
26
+ f << "\n"
27
+ f << "module RubyAWS\n"
28
+ f << " VERSION = '#{gv}'.freeze\n"
29
+ f << "end\n"
30
+ end
31
+ end
32
+
33
+ # vim: syntax=ruby
@@ -0,0 +1,9 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ # Copyright:: Copyright (c) 2007 Amazon Technologies, Inc.
4
+ # License:: Apache License, Version 2.0
5
+
6
+ require 'ruby-aws'
7
+ require 'amazon/webservices/util/command_line'
8
+
9
+ Amazon::WebServices::Util::CommandLine.new.run
@@ -0,0 +1,10 @@
1
+ # Copyright:: Copyright (c) 2007 Amazon Technologies, Inc.
2
+ # License:: Apache License, Version 2.0
3
+
4
+ require 'amazon/util/logging'
5
+ require 'amazon/util/paginated_iterator'
6
+ require 'amazon/util/lazy_results'
7
+ require 'amazon/util/proactive_results'
8
+ require 'amazon/util/binder'
9
+ require 'amazon/util/data_reader'
10
+ require 'amazon/util/threadpool'
@@ -0,0 +1,48 @@
1
+ # Copyright:: Copyright (c) 2007 Amazon Technologies, Inc.
2
+ # License:: Apache License, Version 2.0
3
+
4
+ require 'erb'
5
+
6
+ module Amazon
7
+ module Util
8
+
9
+ # Simple class for holding eval information
10
+ # useful for feeding to ERB templates and the like
11
+ class Binder
12
+
13
+ def initialize(initial={},&block) # :yields: self
14
+ initial.each {|k,v| set(k,v) }
15
+ yield self unless block.nil?
16
+ end
17
+
18
+ def merge(hash)
19
+ hash.each {|k,v| set(k,v) }
20
+ end
21
+
22
+ def set(k,v)
23
+ self.instance_variable_set "@#{k.to_s}", "#{v.to_s}"
24
+ end
25
+
26
+ def bind
27
+ binding
28
+ end
29
+
30
+ # Helper method to simplify ERB evaluation
31
+ def old_erb_eval( template )
32
+ buffer = ""
33
+ c = ERB::Compiler.new("")
34
+ c.put_cmd = "buffer <<" if c.respond_to? :put_cmd=
35
+ c.insert_cmd = "buffer <<" if c.respond_to? :insert_cmd=
36
+ compiled = c.compile template
37
+ eval compiled
38
+ return buffer
39
+ end
40
+ def erb_eval( template )
41
+ t = ERB.new template
42
+ return t.result(binding)
43
+ end
44
+
45
+ end # Binder
46
+
47
+ end # Amazon::Util
48
+ end # Amazon
@@ -0,0 +1,169 @@
1
+ # Copyright:: Copyright (c) 2007 Amazon Technologies, Inc.
2
+ # License:: Apache License, Version 2.0
3
+
4
+ require 'yaml'
5
+ require 'csv'
6
+ require 'amazon/util/hash_nesting'
7
+
8
+ module Amazon
9
+ module Util
10
+
11
+ # DataReader is a class for loading in data files. It is used to support bulk file-based operations.
12
+ # DataReader supports a number of different formats:
13
+ # * YAML
14
+ # * Tabular
15
+ # * CSV
16
+ # * Java Properties
17
+ # By default, DataReader assumes Tabular, but load and save both support your choice of format
18
+ class DataReader
19
+
20
+ attr_accessor :data
21
+
22
+ def initialize(data=[])
23
+ @data = data
24
+ end
25
+
26
+ def [](index)
27
+ return @data[index]
28
+ end
29
+
30
+ def []=(index)
31
+ return @data[index]
32
+ end
33
+
34
+ def load( filename, format=:Tabular )
35
+ return {} unless File.exists? filename
36
+ raw_data = File.read( filename )
37
+ case format
38
+ when :Tabular
39
+ @data = parse_csv( raw_data, "\t" )
40
+ when :YAML
41
+ @data = YAML.load( raw_data ) || {}
42
+ when :CSV
43
+ @data = parse_csv( raw_data )
44
+ when :Properties
45
+ @data = parse_properties( raw_data )
46
+ else
47
+ raise "invalid format. options are :Tabular, :YAML, :CSV, :Properties"
48
+ end
49
+ end
50
+
51
+ def save( filename, format=:Tabular, force_headers=false )
52
+ return if @data.nil? or @data.empty?
53
+ existing = File.exists?( filename ) && File.size( filename ) > 0
54
+ File.open( filename, 'a+' ) {|f|
55
+ f << case format
56
+ when :Tabular
57
+ generate_csv( @data, force_headers || !existing, "\t" )
58
+ when :YAML
59
+ YAML.dump( @data )
60
+ when :CSV
61
+ generate_csv( @data, force_headers || !existing )
62
+ when :Properties
63
+ generate_properties( @data )
64
+ end
65
+ f << "\n" # adding a newline on the end, so appending is happy
66
+ }
67
+ end
68
+
69
+ def self.load( filename, format=:Tabular )
70
+ reader = DataReader.new()
71
+ reader.load( filename, format )
72
+ end
73
+
74
+ def self.save( filename, data, format=:Tabular, force_headers=false )
75
+ reader = DataReader.new( data )
76
+ reader.save( filename, format, force_headers )
77
+ end
78
+
79
+ private
80
+
81
+ def parse_csv( raw_data, delim=nil )
82
+ rows = nil
83
+ if CSV.const_defined? :Reader
84
+ rows = CSV.parse( raw_data, delim )
85
+ else
86
+ ops = {:row_sep => :auto}
87
+ ops[:col_sep] = delim unless delim.nil?
88
+ rows = CSV.parse( raw_data, ops )
89
+ end
90
+ return parse_rows( rows )
91
+ end
92
+
93
+ def parse_rows( rows )
94
+ processed = []
95
+ headers = rows.shift
96
+ for row in rows
97
+ item = {}
98
+ headers.each_index do |i|
99
+ item[headers[i].to_sym] = correct_type(row[i]) unless row[i].nil? or row[i].empty?
100
+ end
101
+ item.extend HashNesting
102
+ processed << item.unnest
103
+ end
104
+ return processed
105
+ end
106
+
107
+ def split_data( data )
108
+ data = data.collect {|d| d.extend(HashNesting).nest }
109
+ headers = data[0].keys.sort
110
+ rows = data.collect { |item|
111
+ row = []
112
+ item.keys.each {|k|
113
+ headers << k unless headers.include? k
114
+ index = headers.index k
115
+ row[index] = item[k].to_s
116
+ }
117
+ row
118
+ }
119
+ return headers, rows
120
+ end
121
+
122
+ def generate_csv( data, dump_header, delim=nil )
123
+ return "" if data.nil? or data.empty?
124
+ headers, rows = split_data( data )
125
+ return generate_rows( headers, rows, dump_header, delim )
126
+ end
127
+
128
+ def generate_rows( headers, rows, dump_header, record_seperator=nil )
129
+ rows.unshift headers if dump_header
130
+ buff = rows.collect { |row|
131
+ if CSV.const_defined? :Reader
132
+ CSV.generate_line( row, record_seperator )
133
+ else
134
+ ops = {:row_sep => ''}
135
+ ops[:col_sep] = record_seperator unless record_seperator.nil?
136
+ CSV.generate_line( row, ops )
137
+ end
138
+ }
139
+ return buff.join("\n")
140
+ end
141
+
142
+ def parse_properties( raw_data )
143
+ processed = {}
144
+ for line in raw_data.split(/\n\r?/)
145
+ next if line =~ /^\W*(#.*)?$/ # ignore lines beginning w/ comments
146
+ if md = /^([^:=]+)[=:](.*)/.match(line)
147
+ processed[md[1].strip] = correct_type(md[2].strip)
148
+ end
149
+ end
150
+ processed.extend HashNesting
151
+ return processed.unnest
152
+ end
153
+
154
+ def generate_properties( raw_data )
155
+ raw_data.extend HashNesting
156
+ (raw_data.nest.collect {|k,v| "#{k}:#{v}" }).join("\n")
157
+ end
158
+
159
+ # convert to integer if possible
160
+ def correct_type( str )
161
+ return str.to_f if str =~ /^\d+\.\d+$/ unless str =~ /^0\d/
162
+ return str.to_i if str =~ /^\d+$/ unless str =~ /^0\d/
163
+ return str
164
+ end
165
+
166
+ end # DataReader
167
+
168
+ end # Amazon::Util
169
+ end # Amazon
@@ -0,0 +1,79 @@
1
+ # Copyright:: Copyright (c) 2007 Amazon Technologies, Inc.
2
+ # License:: Apache License, Version 2.0
3
+
4
+ module Amazon
5
+ module Util
6
+
7
+ # A class for managing around style interceptors,
8
+ # which can be used to implement a decorator design pattern.
9
+ class FilterChain
10
+
11
+ class Filter
12
+
13
+ attr_reader :name, :filter_params, :filter_block
14
+
15
+ def initialize( name, filter_params, filter_block )
16
+ @name = name
17
+ @filter_params = filter_params
18
+ @filter_block = filter_block
19
+ end
20
+
21
+ def execute( chain, block_params )
22
+ @filter_block.call( chain, block_params, *@filter_params )
23
+ end
24
+
25
+ end
26
+
27
+ attr_reader :filters
28
+
29
+ def initialize()
30
+ @filters = []
31
+ end
32
+
33
+ def execute( *block_params, &block )
34
+ if @filters.size == 0
35
+ block.call( *block_params )
36
+ else
37
+ create_chain( @filters, 0, block, block_params ).call
38
+ end
39
+ end
40
+
41
+ def add( name=nil, *filter_params, &filter_block )
42
+ add_filter( Filter.new( name, filter_params, filter_block ) )
43
+ end
44
+
45
+ def add_filter( filter )
46
+ if !filter.name.nil?
47
+ @filters.each_with_index { |existing_filter,i|
48
+ if filter.name == existing_filter.name
49
+ @filters[i] = filter
50
+ return
51
+ end
52
+ }
53
+ end
54
+ @filters << filter
55
+ end
56
+
57
+ def remove( name )
58
+ @filters.delete_if { |filter| name == filter.name }
59
+ end
60
+
61
+ def remove_all()
62
+ @filters.clear
63
+ end
64
+
65
+ private
66
+
67
+ def create_chain( filters, pos, block, block_params )
68
+ if pos >= filters.size
69
+ return proc{ block.call( *block_params ) }
70
+ else
71
+ chain = create_chain( filters, pos+1, block, block_params )
72
+ return proc { filters[pos].execute( chain, block_params ) }
73
+ end
74
+ end
75
+
76
+ end
77
+
78
+ end # Amazon::Util
79
+ end # Amazon
@@ -0,0 +1,93 @@
1
+ # Copyright:: Copyright (c) 2007 Amazon Technologies, Inc.
2
+ # License:: Apache License, Version 2.0
3
+
4
+ module Amazon
5
+ module Util
6
+
7
+ module HashNesting
8
+
9
+ def nest
10
+ result = {}.extend HashNesting
11
+ primaryKeys.each { |key| traverse_nest( "#{key}", self[key] ) { |k,v| result[k] = v } }
12
+ result
13
+ end
14
+
15
+ def nest!
16
+ keys = primaryKeys
17
+ tmp = self.dup
18
+ self.keys.each { |k| self.delete k}
19
+ keys.each { |key| traverse_nest( "#{key}", tmp[key] ) { |k,v| self[k] = v} }
20
+ self
21
+ end
22
+
23
+ def unnest
24
+ result = {}.extend HashNesting
25
+ for key in primaryKeys
26
+ true_keys = key.to_s.split('.')
27
+ resolve_nesting( result, self[key], *true_keys)
28
+ end
29
+ result
30
+ end
31
+
32
+ def unnest!
33
+ for key in primaryKeys
34
+ true_keys = key.to_s.split('.')
35
+ value = self[key]
36
+ self.delete key
37
+ resolve_nesting( self, value, *true_keys)
38
+ end
39
+ self
40
+ end
41
+
42
+ private
43
+
44
+ # if hash has both string and symbol keys, symbol wins
45
+ def primaryKeys
46
+ sym_keys = []
47
+ str_keys = []
48
+ self.keys.each { |k|
49
+ case k
50
+ when Symbol
51
+ sym_keys << k
52
+ when String
53
+ str_keys << k
54
+ else
55
+ str_keys << k
56
+ end
57
+ }
58
+ str_keys.delete_if {|k| sym_keys.member? k.to_s.to_sym }
59
+ sym_keys + str_keys
60
+ end
61
+
62
+ def resolve_nesting( dest, data, *keys )
63
+ return data if keys.empty?
64
+ dest ||= {}
65
+ key = keys.shift.to_sym
66
+ if keys.first.to_i.to_s == keys.first
67
+ # array
68
+ index = keys.shift.to_i - 1
69
+ raise "illegal index: #{keys.join '.'} index must be >= 1" if index < 0
70
+ dest[key] ||= []
71
+ dest[key][index] = resolve_nesting( dest[key][index], data, *keys )
72
+ else
73
+ # hash
74
+ dest[key] = resolve_nesting( dest[key], data, *keys )
75
+ end
76
+ dest
77
+ end
78
+
79
+ def traverse_nest( namespace, data, &block )
80
+ case data.class.to_s
81
+ when 'Array'
82
+ data.each_with_index { |v,i| traverse_nest( "#{namespace}.#{i+1}", v, &block ) }
83
+ when 'Hash'
84
+ data.each { |k,v| traverse_nest( "#{namespace}.#{k}", v, &block ) }
85
+ else
86
+ yield namespace, data.to_s
87
+ end
88
+ end
89
+
90
+ end # HashNesting
91
+
92
+ end # Amazon::Util
93
+ end # Amazon