scaleapi-ruby 0.0.1

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 (41) hide show
  1. checksums.yaml +7 -0
  2. data/.document +5 -0
  3. data/CONTRIBUTING.md +29 -0
  4. data/Gemfile +19 -0
  5. data/Gemfile.lock +121 -0
  6. data/LICENSE.md +25 -0
  7. data/README.md +237 -0
  8. data/Rakefile +52 -0
  9. data/VERSION +1 -0
  10. data/lib/scale.rb +42 -0
  11. data/lib/scale/api.rb +104 -0
  12. data/lib/scale/callbacks/base.rb +25 -0
  13. data/lib/scale/callbacks/task.rb +23 -0
  14. data/lib/scale/endpoints/endpoint.rb +31 -0
  15. data/lib/scale/endpoints/tasks/cancel_task.rb +23 -0
  16. data/lib/scale/endpoints/tasks/create_annotation_task.rb +16 -0
  17. data/lib/scale/endpoints/tasks/create_categorization_task.rb +16 -0
  18. data/lib/scale/endpoints/tasks/create_comparison_task.rb +16 -0
  19. data/lib/scale/endpoints/tasks/create_phonecall_task.rb +16 -0
  20. data/lib/scale/endpoints/tasks/create_transcription_task.rb +16 -0
  21. data/lib/scale/endpoints/tasks/list_tasks.rb +27 -0
  22. data/lib/scale/endpoints/tasks/retrieve_task.rb +23 -0
  23. data/lib/scale/endpoints/tasks/task_endpoint.rb +22 -0
  24. data/lib/scale/generic_error.rb +4 -0
  25. data/lib/scale/http_error.rb +16 -0
  26. data/lib/scale/resources/base.rb +6 -0
  27. data/lib/scale/resources/task.rb +26 -0
  28. data/test/callbacks/test_task_callback.rb +35 -0
  29. data/test/fixtures/callback.json +29 -0
  30. data/test/fixtures/vcr_cassettes/tasks.yml +2629 -0
  31. data/test/helper.rb +42 -0
  32. data/test/tasks/test_cancel_task.rb +21 -0
  33. data/test/tasks/test_create_annotation_task.rb +40 -0
  34. data/test/tasks/test_create_categorization_task.rb +40 -0
  35. data/test/tasks/test_create_comparison_task.rb +43 -0
  36. data/test/tasks/test_create_phonecall_task.rb +41 -0
  37. data/test/tasks/test_create_transcription_task.rb +41 -0
  38. data/test/tasks/test_list_tasks.rb +14 -0
  39. data/test/tasks/test_retrieve_task.rb +37 -0
  40. data/test/test_api.rb +27 -0
  41. metadata +182 -0
data/test/helper.rb ADDED
@@ -0,0 +1,42 @@
1
+ require 'rubygems'
2
+ require 'bundler'
3
+ begin
4
+ Bundler.setup(:default, :development)
5
+ rescue Bundler::BundlerError => e
6
+ $stderr.puts e.message
7
+ $stderr.puts 'Run `bundle install` to install missing gems'
8
+ exit e.status_code
9
+ end
10
+ require 'test/unit'
11
+ require 'shoulda'
12
+
13
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
14
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
15
+ require 'scale'
16
+
17
+ class Test::Unit::TestCase
18
+ def scale
19
+ @scale ||= Scale.setup api_key: (ENV['SCALE_API_KEY'] || 'test_abcdefghijklmopqrstuvwxyz'),
20
+ default_request_params: { callback_url: 'http://www.example.com/callback' },
21
+ callback_key: 'TEST'
22
+ end
23
+
24
+ def load_file(file)
25
+ File.read "test/fixtures/#{file}"
26
+ end
27
+
28
+ def load_json(file)
29
+ Scale.hash JSON.parse(load_file(file))
30
+ end
31
+ end
32
+
33
+ require 'vcr'
34
+
35
+ VCR.configure do |config|
36
+ config.cassette_library_dir = 'test/fixtures/vcr_cassettes'
37
+ config.hook_into :webmock
38
+ config.default_cassette_options = config.default_cassette_options.merge(
39
+ match_requests_on: %i(method uri host path query body headers),
40
+ record: :new_episodes
41
+ )
42
+ end
@@ -0,0 +1,21 @@
1
+ require 'helper'
2
+
3
+ class TestCancelTask < Test::Unit::TestCase
4
+ context 'cancel a completed task' do
5
+ should 'raise an error' do
6
+ VCR.use_cassette 'tasks' do
7
+ # First, create a task
8
+ task = scale.create_phonecall_task instruction: "Call this person and tell me his email address. Ask if he's happy too.",
9
+ phone_number: '5055006865',
10
+ entity_name: 'Alexandr Wang',
11
+ fields: { email: 'Email Address' },
12
+ choices: ['He is happy', 'He is not happy']
13
+
14
+ # Then, try canceling it
15
+ assert_raise Scale::HttpError do
16
+ scale.cancel_task task.id
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,40 @@
1
+ require 'helper'
2
+
3
+ class TestCreateAnnotationTask < Test::Unit::TestCase
4
+ context 'create a annotation task' do
5
+ setup do
6
+ @valid_parameters = Scale.hash instruction: 'Draw a box around each baby cow and big cow.',
7
+ attachment_type: "image",
8
+ attachment: "http://i.imgur.com/v4cBreD.jpg",
9
+ objects_to_annotate: ["baby cow", "big cow"],
10
+ with_labels: true
11
+
12
+ @invalid_parameters = Scale.hash
13
+ end
14
+
15
+ should 'create a valid annotation task' do
16
+ VCR.use_cassette 'tasks' do
17
+ task = scale.create_annotation_task @valid_parameters
18
+ assert_equal task.class, Scale::Resources::Task
19
+ assert_equal task.params, @valid_parameters.select { |k| %Q(attachment_type attachment objects_to_annotate with_labels).include? k.to_s }
20
+ end
21
+ end
22
+
23
+ should 'raise a 400 (bad request) error with invalid parameters' do
24
+ VCR.use_cassette 'tasks' do
25
+ assert_raise Scale::HttpError do
26
+ scale.create_annotation_task @invalid_parameters
27
+ end
28
+
29
+ begin
30
+ scale.create_annotation_task @invalid_parameters
31
+ rescue => e
32
+ exception = e
33
+ end
34
+
35
+ assert_equal exception.code, 400
36
+ assert_equal exception.message, 'Please provide a plaintext instruction to the worker in the instruction field.'
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,40 @@
1
+ require 'helper'
2
+
3
+ class TestCreateCategorizationTask < Test::Unit::TestCase
4
+ context 'create a categorization task' do
5
+ setup do
6
+ @valid_parameters = Scale.hash instruction: 'Is this company public or private?',
7
+ attachment_type: 'website',
8
+ attachment: 'http://www.google.com/',
9
+ categories: ['public', 'private'],
10
+ allow_multiple: false
11
+
12
+ @invalid_parameters = Scale.hash instruction: 'Test instruction'
13
+ end
14
+
15
+ should 'create a valid categorization task' do
16
+ VCR.use_cassette 'tasks' do
17
+ task = scale.create_categorization_task @valid_parameters
18
+ assert_equal task.class, Scale::Resources::Task
19
+ assert_equal task.params, @valid_parameters.select { |k| %Q(attachment_type attachment categories allow_multiple).include? k.to_s }
20
+ end
21
+ end
22
+
23
+ should 'raise a 400 (bad request) error with invalid parameters' do
24
+ VCR.use_cassette 'tasks' do
25
+ assert_raise Scale::HttpError do
26
+ scale.create_categorization_task @invalid_parameters
27
+ end
28
+
29
+ begin
30
+ scale.create_categorization_task @invalid_parameters
31
+ rescue => e
32
+ exception = e
33
+ end
34
+
35
+ assert_equal exception.code, 400
36
+ assert_equal exception.message, 'Please provide an attachment as a URL or plaintext.'
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,43 @@
1
+ require 'helper'
2
+
3
+ class TestCreateAnnotationTask < Test::Unit::TestCase
4
+ context 'create a comparison task' do
5
+ setup do
6
+ @valid_parameters = Scale.hash instruction: 'Do the objects in these images have the same pattern?',
7
+ attachment_type: 'image',
8
+ choices: ['yes', 'no'],
9
+ attachments: [
10
+ 'http://i.ebayimg.com/00/$T2eC16dHJGwFFZKjy5ZjBRfNyMC4Ig~~_32.JPG',
11
+ 'http://images.wisegeek.com/checkered-tablecloth.jpg'
12
+ ]
13
+
14
+ @invalid_parameters = Scale.hash instruction: 'Test instruction',
15
+ choices: ['a', 'b']
16
+ end
17
+
18
+ should 'create a valid comparison task' do
19
+ VCR.use_cassette 'tasks' do
20
+ task = scale.create_comparison_task @valid_parameters
21
+ assert_equal task.class, Scale::Resources::Task
22
+ assert_equal task.params, @valid_parameters.select { |k| %Q(attachment_type choices attachments).include? k.to_s }
23
+ end
24
+ end
25
+
26
+ should 'raise a 400 (bad request) error with invalid parameters' do
27
+ VCR.use_cassette 'tasks' do
28
+ assert_raise Scale::HttpError do
29
+ scale.create_comparison_task @invalid_parameters
30
+ end
31
+
32
+ begin
33
+ scale.create_comparison_task @invalid_parameters
34
+ rescue => e
35
+ exception = e
36
+ end
37
+
38
+ assert_equal exception.code, 400
39
+ assert_equal exception.message, 'Please provide attachments for the worker to compare for the task.'
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,41 @@
1
+ require 'helper'
2
+
3
+ class TestCreatePhonecallTask < Test::Unit::TestCase
4
+ context 'create a phonecall task' do
5
+ setup do
6
+ @valid_parameters = Scale.hash instruction: "Call this person and tell me his email address. Ask if he's happy too.",
7
+ phone_number: '5055006865',
8
+ entity_name: 'Alexandr Wang',
9
+ fields: { email: 'Email Address' },
10
+ choices: ['He is happy', 'He is not happy']
11
+
12
+ @invalid_parameters = Scale.hash instruction: 'Test instruction',
13
+ phone_number: '5055006865'
14
+ end
15
+
16
+ should 'create a valid phone call task' do
17
+ VCR.use_cassette 'tasks' do
18
+ task = scale.create_phonecall_task @valid_parameters
19
+ assert_equal task.class, Scale::Resources::Task
20
+ assert_equal task.params, @valid_parameters.select { |k| %Q(phone_number entity_name fields choices).include? k.to_s }
21
+ end
22
+ end
23
+
24
+ should 'raise a 400 (bad request) error with invalid parameters' do
25
+ VCR.use_cassette 'tasks' do
26
+ assert_raise Scale::HttpError do
27
+ scale.create_phonecall_task @invalid_parameters
28
+ end
29
+
30
+ begin
31
+ scale.create_phonecall_task @invalid_parameters
32
+ rescue => e
33
+ exception = e
34
+ end
35
+
36
+ assert_equal exception.code, 400
37
+ assert_equal exception.message, 'Please provide an entity name (name, business name, etc.) corresponding to the phone number for the worker.'
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,41 @@
1
+ require 'helper'
2
+
3
+ class TestCreateTranscriptionTask < Test::Unit::TestCase
4
+ context 'create a categorization task' do
5
+ setup do
6
+ @valid_parameters = Scale.hash instruction: 'Transcribe the given fields. Then for each news item on the page, transcribe the information for the row.',
7
+ attachment_type: 'website',
8
+ attachment: 'http://www.google.com/',
9
+ fields: { title: 'Title of Webpage', top_result: 'Title of the top result' },
10
+ row_fields: { username: 'Username of submitter', comment_count: 'Number of comments' }
11
+
12
+ @invalid_parameters = Scale.hash instruction: 'Test instruction',
13
+ attachment_type: 'website'
14
+ end
15
+
16
+ should 'create a valid transcription task' do
17
+ VCR.use_cassette 'tasks' do
18
+ task = scale.create_transcription_task @valid_parameters
19
+ assert_equal task.class, Scale::Resources::Task
20
+ assert_equal task.params, @valid_parameters.select { |k| %Q(attachment_type attachment fields row_fields).include? k.to_s }
21
+ end
22
+ end
23
+
24
+ should 'raise a 400 (bad request) error with invalid parameters' do
25
+ VCR.use_cassette 'tasks' do
26
+ assert_raise Scale::HttpError do
27
+ scale.create_transcription_task @invalid_parameters
28
+ end
29
+
30
+ begin
31
+ scale.create_transcription_task @invalid_parameters
32
+ rescue => e
33
+ exception = e
34
+ end
35
+
36
+ assert_equal exception.code, 400
37
+ assert_equal exception.message, 'Please provide an attachment as a URL or plaintext.'
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,14 @@
1
+ require 'helper'
2
+
3
+ class TestListTasks < Test::Unit::TestCase
4
+ context 'list available tasks' do
5
+ should 'retrieve a list of tasks' do
6
+ VCR.use_cassette 'tasks' do
7
+ tasks = scale.tasks
8
+ assert_equal(tasks.class, Array)
9
+ assert(tasks.count > 0)
10
+ assert tasks.all? { |t| t.is_a? Scale::Resources::Task }
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,37 @@
1
+ require 'helper'
2
+
3
+ class TestRetrieveTask < Test::Unit::TestCase
4
+ context 'retrieve an available tasks' do
5
+ should 'return a task object' do
6
+ VCR.use_cassette 'tasks' do
7
+ # First, create a task
8
+ task1 = scale.create_phonecall_task instruction: "Call this person and tell me his email address. Ask if he's happy too.",
9
+ phone_number: '5055006865',
10
+ entity_name: 'Alexandr Wang',
11
+ fields: { email: 'Email Address' },
12
+ choices: ['He is happy', 'He is not happy']
13
+
14
+ # Retrieve that task, and compare it with the previous task
15
+ task2 = scale.retrieve_task task1.id
16
+ assert_equal(task1.id, task2.id)
17
+ assert_equal(task1.instruction, task2.instruction)
18
+ assert_equal(task1.callback_url, task2.callback_url)
19
+ assert_equal(task1.created_at, task2.created_at)
20
+ end
21
+ end
22
+ end
23
+
24
+ context 'retrieve a non existent tasks' do
25
+ setup do
26
+ @fake_task_id = 'abcdefghijklmn0123456789'
27
+ end
28
+
29
+ should 'raise an http error' do
30
+ VCR.use_cassette 'tasks' do
31
+ assert_raise Scale::HttpError do
32
+ scale.retrieve_task @fake_task_id
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
data/test/test_api.rb ADDED
@@ -0,0 +1,27 @@
1
+ require 'helper'
2
+
3
+ class TestAPI < Test::Unit::TestCase
4
+ context 'create a valid API handler' do
5
+ should 'create an API object with default parameters' do
6
+ assert_nothing_raised do
7
+ Scale.setup api_key: scale.api_key
8
+ end
9
+ end
10
+ end
11
+
12
+ context 'create an API handler with an invalid token' do
13
+ should 'raise an error' do
14
+ assert_raise Scale::GenericError do
15
+ Scale.setup api_key: ''
16
+ end
17
+ end
18
+ end
19
+
20
+ context 'create an API handler with an invalid endpoint' do
21
+ should 'raise an error' do
22
+ assert_raise Scale::GenericError do
23
+ Scale.setup endpoint: 'invalid-url'
24
+ end
25
+ end
26
+ end
27
+ end
metadata ADDED
@@ -0,0 +1,182 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: scaleapi-ruby
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Daniel Herzog
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2016-09-21 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rest-client
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: activesupport
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rdoc
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '3.12'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '3.12'
55
+ - !ruby/object:Gem::Dependency
56
+ name: bundler
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '1.0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '1.0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: juwelier
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: 2.1.0
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: 2.1.0
83
+ - !ruby/object:Gem::Dependency
84
+ name: pry
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: pry-nav
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ description: A ruby gem wrapper for the Scale API, containing all the endpoints available.
112
+ email: info@danielherzog.es
113
+ executables: []
114
+ extensions: []
115
+ extra_rdoc_files:
116
+ - LICENSE.md
117
+ - README.md
118
+ files:
119
+ - ".document"
120
+ - CONTRIBUTING.md
121
+ - Gemfile
122
+ - Gemfile.lock
123
+ - LICENSE.md
124
+ - README.md
125
+ - Rakefile
126
+ - VERSION
127
+ - lib/scale.rb
128
+ - lib/scale/api.rb
129
+ - lib/scale/callbacks/base.rb
130
+ - lib/scale/callbacks/task.rb
131
+ - lib/scale/endpoints/endpoint.rb
132
+ - lib/scale/endpoints/tasks/cancel_task.rb
133
+ - lib/scale/endpoints/tasks/create_annotation_task.rb
134
+ - lib/scale/endpoints/tasks/create_categorization_task.rb
135
+ - lib/scale/endpoints/tasks/create_comparison_task.rb
136
+ - lib/scale/endpoints/tasks/create_phonecall_task.rb
137
+ - lib/scale/endpoints/tasks/create_transcription_task.rb
138
+ - lib/scale/endpoints/tasks/list_tasks.rb
139
+ - lib/scale/endpoints/tasks/retrieve_task.rb
140
+ - lib/scale/endpoints/tasks/task_endpoint.rb
141
+ - lib/scale/generic_error.rb
142
+ - lib/scale/http_error.rb
143
+ - lib/scale/resources/base.rb
144
+ - lib/scale/resources/task.rb
145
+ - test/callbacks/test_task_callback.rb
146
+ - test/fixtures/callback.json
147
+ - test/fixtures/vcr_cassettes/tasks.yml
148
+ - test/helper.rb
149
+ - test/tasks/test_cancel_task.rb
150
+ - test/tasks/test_create_annotation_task.rb
151
+ - test/tasks/test_create_categorization_task.rb
152
+ - test/tasks/test_create_comparison_task.rb
153
+ - test/tasks/test_create_phonecall_task.rb
154
+ - test/tasks/test_create_transcription_task.rb
155
+ - test/tasks/test_list_tasks.rb
156
+ - test/tasks/test_retrieve_task.rb
157
+ - test/test_api.rb
158
+ homepage: http://github.com/wikiti/scaleapi-ruby
159
+ licenses:
160
+ - MIT
161
+ metadata: {}
162
+ post_install_message:
163
+ rdoc_options: []
164
+ require_paths:
165
+ - lib
166
+ required_ruby_version: !ruby/object:Gem::Requirement
167
+ requirements:
168
+ - - ">="
169
+ - !ruby/object:Gem::Version
170
+ version: '0'
171
+ required_rubygems_version: !ruby/object:Gem::Requirement
172
+ requirements:
173
+ - - ">="
174
+ - !ruby/object:Gem::Version
175
+ version: '0'
176
+ requirements: []
177
+ rubyforge_project:
178
+ rubygems_version: 2.4.5.1
179
+ signing_key:
180
+ specification_version: 4
181
+ summary: A ruby gem wrapper for the Scale API
182
+ test_files: []