rturk 1.0.5 → 2.0.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 (84) hide show
  1. data/.gitmodules +3 -0
  2. data/.yardoc +0 -0
  3. data/README.markdown +49 -29
  4. data/Rakefile +53 -0
  5. data/TODO.markdown +3 -0
  6. data/VERSION +1 -1
  7. data/examples/blank_slate.rb +21 -4
  8. data/examples/create_hit.rb +19 -0
  9. data/examples/newtweet.html +0 -1
  10. data/examples/review_answer.rb +18 -5
  11. data/lib/rturk.rb +33 -6
  12. data/lib/rturk/adapters/answers.rb +38 -0
  13. data/lib/rturk/adapters/assignment.rb +75 -0
  14. data/lib/rturk/adapters/hit.rb +97 -0
  15. data/lib/rturk/builders/qualification_builder.rb +68 -0
  16. data/lib/rturk/builders/qualifications_builder.rb +43 -0
  17. data/lib/rturk/builders/question_builder.rb +51 -0
  18. data/lib/rturk/errors.rb +5 -0
  19. data/lib/rturk/logger.rb +20 -0
  20. data/lib/rturk/macros.rb +35 -0
  21. data/lib/rturk/operation.rb +86 -0
  22. data/lib/rturk/operations/approve_assignment.rb +28 -0
  23. data/lib/rturk/operations/create_hit.rb +77 -0
  24. data/lib/rturk/operations/disable_hit.rb +19 -0
  25. data/lib/rturk/operations/dispose_hit.rb +19 -0
  26. data/lib/rturk/operations/force_expire_hit.rb +18 -0
  27. data/lib/rturk/operations/get_account_balance.rb +15 -0
  28. data/lib/rturk/operations/get_assignments_for_hit.rb +24 -0
  29. data/lib/rturk/operations/get_hit.rb +21 -0
  30. data/lib/rturk/operations/get_reviewable_hits.rb +23 -0
  31. data/lib/rturk/operations/grant_bonus.rb +26 -0
  32. data/lib/rturk/operations/reject_assignment.rb +23 -0
  33. data/lib/rturk/requester.rb +58 -76
  34. data/lib/rturk/response.rb +58 -0
  35. data/lib/rturk/responses/create_hit_response.rb +33 -0
  36. data/lib/rturk/responses/get_account_balance_response.rb +11 -0
  37. data/lib/rturk/responses/get_assignments_for_hit_response.rb +43 -0
  38. data/lib/rturk/responses/get_hit_response.rb +80 -0
  39. data/lib/rturk/responses/get_reviewable_hits_response.rb +33 -0
  40. data/lib/rturk/utilities.rb +19 -1
  41. data/lib/rturk/xml_utilities.rb +23 -0
  42. data/rturk.gemspec +143 -0
  43. data/spec/adapters/answers_spec.rb +27 -0
  44. data/spec/adapters/assignment_spec.rb +0 -0
  45. data/spec/adapters/hit_spec.rb +46 -0
  46. data/spec/builders/qualification_spec.rb +53 -0
  47. data/spec/builders/qualifications_spec.rb +30 -0
  48. data/spec/builders/question_spec.rb +46 -0
  49. data/spec/fake_responses/approve_assignment.xml +5 -0
  50. data/spec/fake_responses/create_hit.xml +12 -0
  51. data/spec/fake_responses/disable_hit.xml +5 -0
  52. data/spec/fake_responses/dispose_hit.xml +5 -0
  53. data/spec/fake_responses/force_expire_hit.xml +5 -0
  54. data/spec/fake_responses/get_account_balance.xml +10 -0
  55. data/spec/fake_responses/get_assignments.xml +35 -0
  56. data/spec/fake_responses/get_hit.xml +41 -0
  57. data/spec/fake_responses/get_reviewable_hits.xml +17 -0
  58. data/spec/fake_responses/grant_bonus.xml +5 -0
  59. data/spec/fake_responses/invalid_credentials.xml +12 -0
  60. data/spec/fake_responses/reject_assignment.xml +5 -0
  61. data/spec/operations/approve_assignment_spec.rb +27 -0
  62. data/spec/operations/create_hit_spec.rb +66 -0
  63. data/spec/operations/disable_hit_spec.rb +26 -0
  64. data/spec/operations/dispose_hit_spec.rb +26 -0
  65. data/spec/operations/force_expire_hit_spec.rb +26 -0
  66. data/spec/operations/get_account_balance_spec.rb +15 -0
  67. data/spec/operations/get_assignments_spec.rb +26 -0
  68. data/spec/operations/get_hit_spec.rb +18 -0
  69. data/spec/operations/get_reviewable_hits_spec.rb +0 -0
  70. data/spec/operations/grant_bonus_spec.rb +32 -0
  71. data/spec/operations/reject_assignment_spec.rb +26 -0
  72. data/spec/requester_spec.rb +7 -18
  73. data/spec/response_spec.rb +48 -0
  74. data/spec/rturk_spec.rb +27 -0
  75. data/spec/spec_helper.rb +28 -3
  76. data/spec/tmp +2 -0
  77. data/spec/xml_parse_spec.rb +32 -0
  78. metadata +94 -34
  79. data/examples/external_page.rb +0 -33
  80. data/lib/rturk/answer.rb +0 -20
  81. data/lib/rturk/custom_operations.rb +0 -80
  82. data/lib/rturk/external_question_builder.rb +0 -22
  83. data/spec/answer_spec.rb +0 -24
  84. data/spec/external_question_spec.rb +0 -27
@@ -1,33 +0,0 @@
1
- require '../lib/rturk'
2
-
3
- props = {:Title=>"Write a twitter update",
4
- :MaxAssignments=>1, :LifetimeInSeconds=>3600,
5
- :Reward=>{:Amount=>0.10, :CurrencyCode=>"USD"},
6
- :Keywords=>"twitter, blogging, writing, english",
7
- :Description=>"Simply write a twitter update for me",
8
- :RequesterAnnotation=>"OptionalNote",
9
- :AssignmentDurationInSeconds=>3600, :AutoApprovalDelayInSeconds=>3600,
10
- :QualificationRequirement=>[{
11
- :QualificationTypeId=>"000000000000000000L0",
12
- :IntegerValue=>90,
13
- :Comparator=>"GreaterThan",
14
- :RequiredToPreview=>"false"
15
- }]
16
- }
17
- root = File.expand_path(File.dirname(__FILE__))
18
- aws = YAML.load(File.open(File.join(root, 'mturk.yml')))
19
- @turk = RTurk::Requester.new(aws['AWSAccessKeyId'], aws['AWSAccessKey'], :sandbox => true)
20
- page = RTurk::ExternalQuestionBuilder.build("http://s3.amazonaws.com/mpercival.com/newtweet.html", :id => 'foo')
21
-
22
- puts "*" * 80
23
- puts "This is the XML created for the external page question \n #{page}"
24
-
25
- puts "*" * 80
26
- hit = @turk.create_hit(props, page)
27
- puts "And the response from CreateHIT operation"
28
- p hit
29
-
30
- puts "*" * 80
31
- puts "Created a new HIT which can be found at #{@turk.url_for_hit_type(hit['HIT']['HITTypeId'])}"
32
-
33
- File.open(File.join(root ,"last_hit"), "w") {|f| f.write(hit['HIT']['HITId']) }
data/lib/rturk/answer.rb DELETED
@@ -1,20 +0,0 @@
1
- module RTurk
2
- class Answer
3
-
4
- def self.parse(xml)
5
- answer = XmlSimple.xml_in(xml, {'ForceArray' => false})
6
- response = {}
7
- answers = answer['Answer']
8
- answers = Array.new(1) { answers } unless answers.instance_of? Array
9
- answers.each do |a|
10
- question = a['QuestionIdentifier']
11
- a.delete('QuestionIdentifier')
12
- a.each_value do |v|
13
- response[question] = v
14
- end
15
- end
16
- response
17
- end
18
-
19
- end
20
- end
@@ -1,80 +0,0 @@
1
- module RTurk::CustomOperations
2
- # Overides createHIT to allow for easier entry
3
- def create_hit(props, page)
4
- props = format_props(props)
5
- props = props.merge(:Question => page, :Operation => 'CreateHIT')
6
- request(props)
7
- end
8
-
9
- # Attempt to expire hit, then approve assignments, and finally dispose of
10
- def kill_hit(hit_id)
11
- forceExpireHIT(:HITId => hit_id)
12
- get_assignments_for_hit(hit_id).each do |assignment|
13
- approveAssignment(:AssignmentId => assignment[:AssignmentId])
14
- end
15
- disposeHIT(:HITId => hit_id)
16
- end
17
-
18
- # Wipe out all HIT's associated with this account
19
- def blank_slate
20
- search_response = searchHITs(:PageSize => 100)
21
- if search_results = search_response['SearchHITsResult']['HIT']
22
- search_results.each do |hit|
23
- kill_hit(hit['HITId'])
24
- end
25
- end
26
- end
27
-
28
-
29
- def get_assignments_for_hit(hit)
30
- response = request(:Operation => 'GetAssignmentsForHIT', :HITId => hit)
31
- assignments = []
32
- if response['GetAssignmentsForHITResult']['Assignment'].instance_of?(Array)
33
- response['GetAssignmentsForHITResult']['Assignment'].each do |assignment|
34
- answer = RTurk::Answer.parse(assignment['Answer'])
35
- assignment.delete('Answer')
36
- assignment['Answer'] = answer
37
- assignments << assignment
38
- end
39
- else
40
- if assignment = response['GetAssignmentsForHITResult']['Assignment']
41
- answer = RTurk::Answer.parse(response['GetAssignmentsForHITResult']['Assignment']['Answer'])
42
- assignment.delete('Answer')
43
- assignment['Answer'] = answer
44
- assignments << assignment
45
- end
46
- end
47
- assignments
48
- end
49
-
50
- def url_for_hit(hit_id)
51
- url_for_hit_type(getHIT(:HITId => hit_id)[:HITTypeId])
52
- end
53
-
54
- def url_for_hit_type(hit_type_id)
55
- if @host =~ /sandbox/
56
- "http://workersandbox.mturk.com/mturk/preview?groupId=#{hit_type_id}" # Sandbox Url
57
- else
58
- "http://mturk.com/mturk/preview?groupId=#{hit_type_id}" # Production Url
59
- end
60
- end
61
-
62
- private
63
-
64
- def format_props(params)
65
- reward = params[:Reward]
66
- qualifiers = params[:QualificationRequirement]
67
- params.delete(:Reward)
68
- params.delete(:QualificationRequirement)
69
- params.merge!('Reward.1.Amount' => reward[:Amount], 'Reward.1.CurrencyCode' => reward[:CurrencyCode])
70
- qualifiers.each_with_index do |qualifier, i|
71
- params["QualificationRequirement.#{i+1}.QualificationTypeId"] = qualifier[:QualificationTypeId]
72
- params["QualificationRequirement.#{i+1}.Comparator"] = qualifier[:Comparator]
73
- params["QualificationRequirement.#{i+1}.IntegerValue"] = qualifier[:IntegerValue] if qualifier[:IntegerValue]
74
- params["QualificationRequirement.#{i+1}.LocaleValue.Country"] = qualifier[:Country] if qualifier[:Country]
75
- params["QualificationRequirement.#{i+1}.RequiredToPreview"] = qualifier[:RequiredToPreview]
76
- end
77
- params
78
- end
79
-
80
- end
@@ -1,22 +0,0 @@
1
- module RTurk
2
- class ExternalQuestionBuilder
3
-
4
-
5
- def self.build(url, opts = {})
6
- frame_height = opts[:frame_height] || 400
7
- opts.delete(:frame_height)
8
- querystring = opts.collect { |key, value| [CGI.escape(key.to_s), CGI.escape(value.to_s)].join('=') }.join('&')
9
- url = opts.empty? ? url : "#{url}?#{querystring}"
10
- xml = <<-XML
11
- <ExternalQuestion xmlns="http://mechanicalturk.amazonaws.com/AWSMechanicalTurkDataSchemas/2006-07-14/ExternalQuestion.xsd">
12
- <ExternalURL>#{url}</ExternalURL>
13
- <FrameHeight>#{frame_height}</FrameHeight>
14
- </ExternalQuestion>
15
- XML
16
- xml
17
- end
18
-
19
- end
20
-
21
-
22
- end
data/spec/answer_spec.rb DELETED
@@ -1,24 +0,0 @@
1
- require File.dirname(__FILE__) + '/spec_helper'
2
-
3
-
4
- describe RTurk::Answer do
5
-
6
- before(:all) do
7
- @answer = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>
8
- <QuestionFormAnswers xmlns=\"http://mechanicalturk.amazonaws.com/AWSMechanicalTurkDataSchemas/2005-10-01/QuestionFormAnswers.xsd\">
9
- <Answer>\n<QuestionIdentifier>tweet</QuestionIdentifier>\n<FreeText>Spec example</FreeText>\n</Answer>
10
- <Answer>\n<QuestionIdentifier>Submit</QuestionIdentifier>\n<FreeText>Submit</FreeText>\n</Answer>
11
- <Answer>\n<QuestionIdentifier>Foo</QuestionIdentifier>\n<RandomSelector>Bar</RandomSelector>\n</Answer>
12
- </QuestionFormAnswers>\n"
13
- @answer2 = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>
14
- <QuestionFormAnswers xmlns=\"http://mechanicalturk.amazonaws.com/AWSMechanicalTurkDataSchemas/2005-10-01/QuestionFormAnswers.xsd\">
15
- <Answer>\n<QuestionIdentifier>tweet</QuestionIdentifier>\n<FreeText>Spec example</FreeText>\n</Answer>
16
- </QuestionFormAnswers>\n"
17
- end
18
-
19
- it "should parse an answer" do
20
- RTurk::Answer.parse(@answer).should == {'Submit' => 'Submit', 'tweet' => 'Spec example', 'Foo' => 'Bar'}
21
- RTurk::Answer.parse(@answer2).should == {'tweet' => 'Spec example'}
22
- end
23
-
24
- end
@@ -1,27 +0,0 @@
1
- require File.dirname(__FILE__) + '/spec_helper'
2
-
3
-
4
- describe RTurk::ExternalQuestionBuilder do
5
-
6
-
7
- it "should build a question with params" do
8
- RTurk::ExternalQuestionBuilder.build('http://google.com/', :id => 'foo').should ==
9
- <<-XML
10
- <ExternalQuestion xmlns="http://mechanicalturk.amazonaws.com/AWSMechanicalTurkDataSchemas/2006-07-14/ExternalQuestion.xsd">
11
- <ExternalURL>http://google.com/?id=foo</ExternalURL>
12
- <FrameHeight>400</FrameHeight>
13
- </ExternalQuestion>
14
- XML
15
- end
16
-
17
- it "should build a question without params" do
18
- RTurk::ExternalQuestionBuilder.build('http://google.com/').should ==
19
- <<-XML
20
- <ExternalQuestion xmlns="http://mechanicalturk.amazonaws.com/AWSMechanicalTurkDataSchemas/2006-07-14/ExternalQuestion.xsd">
21
- <ExternalURL>http://google.com/</ExternalURL>
22
- <FrameHeight>400</FrameHeight>
23
- </ExternalQuestion>
24
- XML
25
- end
26
-
27
- end