kempelen 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (50) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +19 -0
  3. data/.travis.yml +4 -0
  4. data/CODE_OF_CONDUCT.md +22 -0
  5. data/Gemfile +5 -0
  6. data/Guardfile +42 -0
  7. data/LICENSE.txt +21 -0
  8. data/README.md +59 -0
  9. data/Rakefile +27 -0
  10. data/bin/console +14 -0
  11. data/bin/setup +7 -0
  12. data/examples/approve_assignment.rb +16 -0
  13. data/examples/create_hit.rb +20 -0
  14. data/examples/force_expire_hit.rb +16 -0
  15. data/examples/get_account_balance.rb +16 -0
  16. data/examples/get_assignments_for_hit.rb +16 -0
  17. data/examples/get_hit.rb +16 -0
  18. data/examples/get_reviewable_hits.rb +16 -0
  19. data/examples/reject_assignment.rb +16 -0
  20. data/examples/set_hit_as_reviewing.rb +16 -0
  21. data/kempelen.gemspec +35 -0
  22. data/lib/kempelen.rb +35 -0
  23. data/lib/kempelen/API/client.rb +45 -0
  24. data/lib/kempelen/API/common/answers.rb +34 -0
  25. data/lib/kempelen/API/common/assignment.rb +37 -0
  26. data/lib/kempelen/API/common/price.rb +26 -0
  27. data/lib/kempelen/API/common/question_form_answers.rb +57 -0
  28. data/lib/kempelen/API/operations/approve_assignment.rb +17 -0
  29. data/lib/kempelen/API/operations/assignment_operation.rb +36 -0
  30. data/lib/kempelen/API/operations/base.rb +71 -0
  31. data/lib/kempelen/API/operations/create_hit.rb +55 -0
  32. data/lib/kempelen/API/operations/force_expire_hit.rb +25 -0
  33. data/lib/kempelen/API/operations/get_account_balance.rb +30 -0
  34. data/lib/kempelen/API/operations/get_assignments_for_hit.rb +42 -0
  35. data/lib/kempelen/API/operations/get_hit.rb +25 -0
  36. data/lib/kempelen/API/operations/get_reviewable_hits.rb +64 -0
  37. data/lib/kempelen/API/operations/hit_operation.rb +23 -0
  38. data/lib/kempelen/API/operations/parameters.rb +40 -0
  39. data/lib/kempelen/API/operations/register_hit_type.rb +47 -0
  40. data/lib/kempelen/API/operations/reject_assignment.rb +17 -0
  41. data/lib/kempelen/API/operations/set_hit_as_reviewing.rb +34 -0
  42. data/lib/kempelen/API/responses/account_balance_response.rb +27 -0
  43. data/lib/kempelen/API/responses/base.rb +32 -0
  44. data/lib/kempelen/API/responses/empty_response.rb +17 -0
  45. data/lib/kempelen/API/responses/error_response.rb +32 -0
  46. data/lib/kempelen/API/responses/get_assignments_response.rb +31 -0
  47. data/lib/kempelen/API/responses/hit_response.rb +66 -0
  48. data/lib/kempelen/API/responses/reviewable_hits_response.rb +38 -0
  49. data/lib/kempelen/version.rb +3 -0
  50. metadata +260 -0
@@ -0,0 +1,30 @@
1
+ module Kempelen
2
+ module API
3
+ module Operations
4
+ class GetAccountBalance < Base
5
+ AWS_OPERATION_NAME = "GetAccountBalance".freeze
6
+ AWS_RESPONSE_OBJECT = "GetAccountBalanceResponse".freeze
7
+
8
+ def initialize(client)
9
+ super(client)
10
+
11
+ @response_object = AWS_RESPONSE_OBJECT
12
+ end
13
+
14
+ def create_parameters
15
+ @parameters[:operation] = AWS_OPERATION_NAME
16
+
17
+ super
18
+ end
19
+
20
+ def perform_operation
21
+ create_request_string
22
+
23
+ super
24
+
25
+ Kempelen::API::Responses::AccountBalanceResponse.new(@raw_response)
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,42 @@
1
+ module Kempelen
2
+ module API
3
+ module Operations
4
+ class GetAssignmentsForHit < HitOperation
5
+ attr_accessor :assignment_status
6
+ attr_accessor :page_size
7
+ attr_accessor :page_number
8
+
9
+ AWS_OPERATION_NAME = "GetAssignmentsForHIT".freeze
10
+ AWS_RESPONSE_OBJECT = "GetAssignmentsForHITResponse".freeze
11
+ AWS_DEFAULT_PAGE_SIZE = 10
12
+ AWS_DEFAULT_PAGE_NUMBER = 1
13
+
14
+ def initialize(client, hit_id)
15
+ super(client, hit_id)
16
+
17
+ @operation_name = AWS_OPERATION_NAME
18
+ @response_object = AWS_RESPONSE_OBJECT
19
+ @assignment_status = nil
20
+ @page_size = AWS_DEFAULT_PAGE_SIZE
21
+ @page_number = AWS_DEFAULT_PAGE_NUMBER
22
+ end
23
+
24
+ def create_parameters
25
+ @parameters[:assignment_status] = @assignment_status
26
+ @parameters[:page_size] = @page_size
27
+ @parameters[:page_number] = @page_number
28
+
29
+ super
30
+ end
31
+
32
+ def perform_operation
33
+ create_request_string
34
+
35
+ super
36
+
37
+ Kempelen::API::Responses::GetAssignmentsResponse.new(@raw_response)
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,25 @@
1
+ module Kempelen
2
+ module API
3
+ module Operations
4
+ class GetHit < HitOperation
5
+ AWS_OPERATION_NAME = "GetHIT".freeze
6
+ AWS_RESPONSE_OBJECT = "GetHITResponse".freeze
7
+
8
+ def initialize(client, hit_id)
9
+ super(client, hit_id)
10
+
11
+ @operation_name = AWS_OPERATION_NAME
12
+ @response_object = AWS_RESPONSE_OBJECT
13
+ end
14
+
15
+ def perform_operation
16
+ create_request_string
17
+
18
+ super
19
+
20
+ Kempelen::API::Responses::HitResponse.new(@raw_response)
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,64 @@
1
+ module Kempelen
2
+ module API
3
+ module Operations
4
+ class GetReviewableHits < Base
5
+ attr_accessor :hit_type_id
6
+ attr_accessor :status
7
+ attr_accessor :page_size
8
+ attr_accessor :page_number
9
+ attr_accessor :sort_property
10
+ attr_accessor :sort_direction
11
+
12
+ AWS_OPERATION_NAME = "GetReviewableHITs".freeze
13
+ AWS_RESPONSE_OBJECT = "GetReviewableHITsResponse".freeze
14
+ AWS_DEFAULT_PAGE_SIZE = 100
15
+ AWS_DEFAULT_PAGE_NUMBER = 1
16
+
17
+ def initialize(client, hit_type_id)
18
+ super(client)
19
+
20
+ @response_object = AWS_RESPONSE_OBJECT
21
+ @hit_type_id = hit_type_id
22
+ @status = :reviewable
23
+ @page_size = AWS_DEFAULT_PAGE_SIZE
24
+ @page_number = AWS_DEFAULT_PAGE_NUMBER
25
+ @sort_property = :enumeration
26
+ @sort_direction = :descending
27
+ end
28
+
29
+ def amazon_status
30
+ @status.to_s.capitalize.freeze
31
+ end
32
+
33
+ def amazon_sort_property
34
+ @sort_property.to_s.capitalize.freeze
35
+ end
36
+
37
+ def amazon_sort_direction
38
+ @sort_direction.to_s.capitalize.freeze
39
+ end
40
+
41
+ def create_parameters
42
+ @parameters[:operation] = AWS_OPERATION_NAME
43
+ @parameters[:hit_type_id] = @hit_type_id
44
+ @parameters[:status] = amazon_status
45
+ @parameters[:page_size] = @page_size
46
+ @parameters[:page_number] = @page_number
47
+ @parameters[:sort_property] = amazon_sort_property
48
+ @parameters[:sort_direction] = amazon_sort_direction
49
+
50
+ super
51
+ end
52
+
53
+ def perform_operation
54
+ create_request_string
55
+
56
+ super
57
+
58
+ Kempelen::API::Responses::ReviewableHitsResponse.new(@raw_response)
59
+ end
60
+ end
61
+ end
62
+ end
63
+ end
64
+
@@ -0,0 +1,23 @@
1
+ module Kempelen
2
+ module API
3
+ module Operations
4
+ class HitOperation < Base
5
+ attr_accessor :hit_id
6
+ attr_accessor :operation_name
7
+
8
+ def initialize(client, hit_id)
9
+ super(client)
10
+
11
+ @hit_id = hit_id
12
+ end
13
+
14
+ def create_parameters
15
+ @parameters[:operation] = @operation_name
16
+ @parameters[:hit_id] = @hit_id
17
+
18
+ super
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,40 @@
1
+ module Kempelen
2
+ module API
3
+ module Operations
4
+ PARAMETERS = {
5
+ service: "Service".freeze,
6
+ operation: "Operation".freeze,
7
+ access_key: "AWSAccessKeyId".freeze,
8
+ timestamp: "Timestamp".freeze,
9
+ signature: "Signature".freeze,
10
+ hit_type_id: "HITTypeId".freeze,
11
+ layout_id: "HITLayoutId".freeze,
12
+ lifetime_in_seconds: "LifetimeInSeconds".freeze,
13
+ max_assignments: "MaxAssignments".freeze,
14
+ requester_annotation: "RequesterAnnotation".freeze,
15
+ unique_request_token: "UniqueRequestToken".freeze,
16
+ hit_id: "HITId".freeze,
17
+ status: "Status".freeze,
18
+ page_size: "PageSize".freeze,
19
+ page_number: "PageNumber".freeze,
20
+ sort_property: "SortProperty".freeze,
21
+ sort_direction: "SortDirection".freeze,
22
+ assignment_id: "AssignmentId".freeze,
23
+ requester_feedback: "RequesterFeedback".freeze,
24
+ assignment_status: "AssignmentStatus".freeze,
25
+ revert: "Revert".freeze,
26
+ title: "Title".freeze,
27
+ description: "Description".freeze,
28
+ reward: "Reward".freeze,
29
+ assignment_duration: "AssignmentDurationInSeconds".freeze,
30
+ keywords: "Keywords".freeze,
31
+ auto_approval_delay: "AutoApprovalDelayInSeconds".freeze,
32
+ qualification_requirement: "QualificationRequirement".freeze
33
+ }
34
+
35
+ ARRAY_PARAMETERS = {
36
+ layout_parameters: "HITLayoutParameter".freeze
37
+ }
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,47 @@
1
+ module Kempelen
2
+ module API
3
+ module Operations
4
+ class RegisterHitType < Base
5
+ attr_accessor :title
6
+ attr_accessor :description
7
+ attr_accessor :reward
8
+ attr_accessor :assignment_duration
9
+ attr_accessor :keywords
10
+ attr_accessor :auto_approval_delay
11
+
12
+ # TODO: Support qualification requirements
13
+ attr_accessor :qualification_requirement
14
+
15
+ AWS_OPERATION_NAME = "RegisterHITType".freeze
16
+
17
+ def initialize(client, title, description, reward, assignment_duration, &block)
18
+ super(client)
19
+
20
+ @title = title
21
+ @description = description
22
+ @reward = reward
23
+ @assignment_duration = assignment_duration
24
+ @keywords = []
25
+
26
+ yield self unless block == nil
27
+ end
28
+
29
+ def amazon_keywords
30
+ @keywords.map {|k| k.strip}.join(',')
31
+ end
32
+
33
+ def create_parameters
34
+ @parameters[:operation] = AWS_OPERATION_NAME
35
+ @parameters[:title] = @title
36
+ @parameters[:description] = @description
37
+ @parameters[:reward] = @reward
38
+ @parameters[:assignment_duration] = @assignment_duration
39
+ @parameters[:keywords] = amazon_keywords
40
+ @parameters[:auto_approval_delay] = @auto_approval_delay
41
+
42
+ super
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,17 @@
1
+ module Kempelen
2
+ module API
3
+ module Operations
4
+ class RejectAssignment < AssignmentOperation
5
+ AWS_OPERATION_NAME = "RejectAssignment".freeze
6
+ AWS_RESPONSE_OBJECT = "RejectAssignmentResponse".freeze
7
+
8
+ def initialize(client, assignment_id, requester_feedback = nil)
9
+ super(client, assignment_id, requester_feedback)
10
+
11
+ @operation_name = AWS_OPERATION_NAME
12
+ @response_object = AWS_RESPONSE_OBJECT
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,34 @@
1
+ module Kempelen
2
+ module API
3
+ module Operations
4
+ class SetHitAsReviewing < HitOperation
5
+ attr_accessor :revert
6
+
7
+ AWS_OPERATION_NAME = "SetHITAsReviewing".freeze
8
+ AWS_RESPONSE_OBJECT = "SetHITAsReviewingResponse".freeze
9
+
10
+ def initialize(client, hit_id, revert = false)
11
+ super(client, hit_id)
12
+
13
+ @operation_name = AWS_OPERATION_NAME
14
+ @response_object = AWS_RESPONSE_OBJECT
15
+ @revert = revert
16
+ end
17
+
18
+ def create_parameters
19
+ @parameters[:revert] = @revert
20
+
21
+ super
22
+ end
23
+
24
+ def perform_operation
25
+ create_request_string
26
+
27
+ super
28
+
29
+ Kempelen::API::Responses::EmptyResponse.new(@raw_response)
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,27 @@
1
+ module Kempelen
2
+ module API
3
+ module Responses
4
+ class AccountBalanceResponse < Base
5
+ attr_reader :available_balance
6
+ attr_reader :on_hold_balance
7
+
8
+ def initialize(response)
9
+ super()
10
+
11
+ load_from_response(response)
12
+ end
13
+
14
+ def load_from_response(response)
15
+ super(response)
16
+
17
+ balance_response = response["GetAccountBalanceResult"]
18
+ unless balance_response.nil?
19
+ @available_balance = Kempelen::API::Common::Price.create_from_response(balance_response["AvailableBalance"])
20
+ @on_hold_balance = Kempelen::API::Common::Price.create_from_response(balance_response["OnHoldBalance"])
21
+ end
22
+ end
23
+
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,32 @@
1
+ module Kempelen
2
+ module API
3
+ module Responses
4
+ class Base
5
+ attr_accessor :success
6
+ attr_accessor :request_id
7
+ attr_accessor :error
8
+
9
+ def initialize
10
+ @success = false
11
+ @error = nil
12
+ end
13
+
14
+ def load_from_response(response)
15
+ @request_id = response["OperationRequest"]["RequestId"] rescue nil
16
+
17
+ response.each_key do |k|
18
+ if response[k].has_key?("Request")
19
+ request_response = response[k]["Request"]
20
+ @success = (request_response["IsValid"] == "True")
21
+
22
+ if request_response.has_key?("Errors")
23
+ @success = false
24
+ @error = ErrorResponse.new(request_response["Errors"])
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,17 @@
1
+ module Kempelen
2
+ module API
3
+ module Responses
4
+ class EmptyResponse < Base
5
+ def initialize(response)
6
+ super()
7
+
8
+ load_from_response(response)
9
+ end
10
+
11
+ def load_from_response(response)
12
+ super(response)
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,32 @@
1
+ module Kempelen
2
+ module API
3
+ module Responses
4
+ class ErrorResponse
5
+ attr_accessor :code
6
+ attr_accessor :message
7
+ attr_accessor :data
8
+
9
+ def initialize(response = nil)
10
+ @data = []
11
+
12
+ parse_from_response(response) unless response.nil?
13
+ end
14
+
15
+ def parse_from_response(response)
16
+ error = response["Error"]
17
+ unless error.nil?
18
+ @code = error["Code"]
19
+ @message = error["Message"]
20
+ end
21
+
22
+ data = error["Data"].nil? ? [] : error["Data"]
23
+ data.each do |data_value|
24
+ key = data_value["Key"] rescue nil
25
+ value = data_value["Value"] rescue nil
26
+ @data << {key: key, value: value}
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end