diff --git a/.gitignore b/.gitignore index 0cb6eeb..e457299 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,6 @@ /.bundle/ +/.idea/ +/.ruby-version /.yardoc /Gemfile.lock /_yardoc/ diff --git a/README.md b/README.md index fb07de7..6c140e5 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ # Scale API ![Scale API Logo](https://www.scaleapi.com/static/global/facebook-card.png) -This is the official Scale API RubyGem (`scaleapi`). +This is the official Scale API RubyGem (`scale_api`). [Scale](https://www.scaleapi.com) is an API for Human Intelligence. Businesses like Alphabet (Google), Uber, Proctor & Gamble, Houzz, and many more use us to power tasks such as: - Draw bounding boxes and label parts of images (to train ML algorithms for self-driving cars) @@ -18,7 +18,7 @@ Scale is actively hiring software engineers - [apply here](https://www.scaleapi. Add this line to your application's Gemfile: ```ruby -gem 'scaleapi' +gem 'scale_api' ``` And then execute: @@ -27,16 +27,16 @@ And then execute: Or install it yourself as: - $ gem install scaleapi + $ gem install scale_api ## Usage First, initialize the Scale API client: ```ruby -require 'scale' +require 'scale_api' -scale = Scale.new(api_key: 'SCALE_API_KEY') +scale = ScaleApi.new(api_key: 'SCALE_API_KEY') ``` Note that you can optionally provide a `callback_auth_key` and `callback_url` when initializing the Scale API client. You can also set `default_request_params` which is a `Hash` that will be included in every request sent to Scale (either as a query string param or part of the request body). @@ -56,8 +56,8 @@ For every type of task, you can pass in the following options when creating: To create a [categorization task](https://docs.scaleapi.com/#create-categorization-task), run the following: ```ruby -require 'scale' -scale = Scale.new(api_key: 'SCALE_API_KEY') +require 'scale_api' +scale = ScaleApi.new(api_key: 'SCALE_API_KEY') scale.create_categorization_task({ callback_url: 'http://www.example.com/callback', @@ -68,12 +68,12 @@ scale.create_categorization_task({ }) ``` -Upon success, this will return a `Scale::Api::Tasks::Categorization` object. It will raise one of the [errors](#user-content-errors) if it's not successful. +Upon success, this will return a `ScaleApi::Api::Tasks::Categorization` object. It will raise one of the [errors](#user-content-errors) if it's not successful. Alternatively, you can also create a task this way ```ruby -require 'scale' -scale = Scale.new(api_key: 'SCALE_API_KEY') +require 'scale_api' +scale = ScaleApi.new(api_key: 'SCALE_API_KEY') scale.tasks.create({ type: 'categorization', @@ -85,7 +85,7 @@ scale.tasks.create({ }) ``` -This will also return a `Scale::Api::Tasks::Categorization` object. +This will also return a `ScaleApi::Api::Tasks::Categorization` object. [Read more about creating categorization tasks](https://docs.scaleapi.com/#create-categorization-task) @@ -93,8 +93,8 @@ This will also return a `Scale::Api::Tasks::Categorization` object. To create a [comparison task](https://docs.scaleapi.com/#create-comparison-task), run the following: ```ruby -require 'scale' -scale = Scale.new(api_key: 'SCALE_API_KEY') +require 'scale_api' +scale = ScaleApi.new(api_key: 'SCALE_API_KEY') scale.create_comparison_task({ callback_url: 'http://www.example.com/callback', @@ -108,12 +108,12 @@ scale.create_comparison_task({ }) ``` -Upon success, this will return a `Scale::Api::Tasks::Comparison` object. If it fails, it will raise one of the [errors](#user-content-errors). +Upon success, this will return a `ScaleApi::Api::Tasks::Comparison` object. If it fails, it will raise one of the [errors](#user-content-errors). Alternatively, you can also create a task this way ```ruby -require 'scale' -scale = Scale.new(api_key: 'SCALE_API_KEY') +require 'scale_api' +scale = ScaleApi.new(api_key: 'SCALE_API_KEY') scale.tasks.create({ type: 'comparison', @@ -128,7 +128,7 @@ scale.tasks.create({ }) ``` -This will also return a `Scale::Api::Tasks::Comparison` object. +This will also return a `ScaleApi::Api::Tasks::Comparison` object. [Read more about creating comparison tasks](https://docs.scaleapi.com/#create-comparison-task) @@ -136,8 +136,8 @@ This will also return a `Scale::Api::Tasks::Comparison` object. To create a [datacollection task](https://docs.scaleapi.com/#create-datacollection-task), run the following: ```ruby -require 'scale' -scale = Scale.new(api_key: 'SCALE_API_KEY') +require 'scale_api' +scale = ScaleApi.new(api_key: 'SCALE_API_KEY') scale.create_datacollection_task({ callback_url: 'http://www.example.com/callback', @@ -150,12 +150,12 @@ scale.create_datacollection_task({ }) ``` -Upon success, this will return a `Scale::Api::Tasks::Datacollection` object. If it fails, it will raise one of the [errors](#user-content-errors). +Upon success, this will return a `ScaleApi::Api::Tasks::Datacollection` object. If it fails, it will raise one of the [errors](#user-content-errors). Alternatively, you can also create a task this way ```ruby -require 'scale' -scale = Scale.new(api_key: 'SCALE_API_KEY') +require 'scale_api' +scale = ScaleApi.new(api_key: 'SCALE_API_KEY') scale.tasks.create({ type: 'datacollection', @@ -169,7 +169,7 @@ scale.tasks.create({ }) ``` -This will also return a `Scale::Api::Tasks::Datacollection` object. +This will also return a `ScaleApi::Api::Tasks::Datacollection` object. [Read more about creating datacollection tasks](https://docs.scaleapi.com/#create-data-collection-task) @@ -178,8 +178,8 @@ This will also return a `Scale::Api::Tasks::Datacollection` object. To create an [image recognition task](https://docs.scaleapi.com/#create-image-recognition-task), run the following: ```ruby -require 'scale' -scale = Scale.new(api_key: 'SCALE_API_KEY') +require 'scale_api' +scale = ScaleApi.new(api_key: 'SCALE_API_KEY') scale.create_annotation_task({ callback_url: 'http://www.example.com/callback', @@ -202,15 +202,15 @@ scale.create_annotation_task({ ] }) ``` -Upon success, this will return a `Scale::Api::Tasks::ImageRecognition` object. If it fails, it will raise one of the [errors]( +Upon success, this will return a `ScaleApi::Api::Tasks::ImageRecognition` object. If it fails, it will raise one of the [errors]( ). Note: `create_annotation_task` is also aliased to `create_image_recognition_task`, to help avoid confusion. Alternatively, you can also create a task this way ```ruby -require 'scale' -scale = Scale.new(api_key: 'SCALE_API_KEY') +require 'scale_api' +scale = ScaleApi.new(api_key: 'SCALE_API_KEY') scale.tasks.create({ type: 'annotation', @@ -235,7 +235,7 @@ scale.tasks.create({ }) ``` -This will also return a `Scale::Api::Tasks::ImageRecognition` object. +This will also return a `ScaleApi::Api::Tasks::ImageRecognition` object. [Read more about creating image recognition tasks](https://docs.scaleapi.com/#create-image-recognition-task) @@ -245,8 +245,8 @@ You can use this to have real people call other people! Isn't that cool? To create a [phone call task](https://docs.scaleapi.com/#create-phone-call-task), run the following: ```ruby -require 'scale' -scale = Scale.new(api_key: 'SCALE_API_KEY') +require 'scale_api' +scale = ScaleApi.new(api_key: 'SCALE_API_KEY') scale.create_phone_call_task({ callback_url: 'http://www.example.com/callback', @@ -260,14 +260,14 @@ scale.create_phone_call_task({ choices: ['He is happy', 'He is not happy'] }) ``` -Upon success, this will return a `Scale::Api::Tasks::PhoneCall` object. If it fails, it will raise one of the [errors](#user-content-errors). +Upon success, this will return a `ScaleApi::Api::Tasks::PhoneCall` object. If it fails, it will raise one of the [errors](#user-content-errors). Note: `create_phone_call_task` is also aliased to `create_phonecall_task`, to help avoid confusion. Alternatively, you can also create a task this way ```ruby -require 'scale' -scale = Scale.new(api_key: 'SCALE_API_KEY') +require 'scale_api' +scale = ScaleApi.new(api_key: 'SCALE_API_KEY') scale.tasks.create({ type: 'phonecall', @@ -283,7 +283,7 @@ scale.tasks.create({ }) ``` -This will also return a `Scale::Api::Tasks::PhoneCall` object. +This will also return a `ScaleApi::Api::Tasks::PhoneCall` object. [Read more about creating phone call tasks](https://docs.scaleapi.com/#create-phone-call-task) @@ -292,8 +292,8 @@ This will also return a `Scale::Api::Tasks::PhoneCall` object. To create a [transcription task](https://docs.scaleapi.com/#create-transcription-task), run the following: ```ruby -require 'scale' -scale = Scale.new(api_key: 'SCALE_API_KEY') +require 'scale_api' +scale = ScaleApi.new(api_key: 'SCALE_API_KEY') scale.create_transcription_task({ callback_url: 'http://www.example.com/callback', @@ -306,12 +306,12 @@ scale.create_transcription_task({ } }) ``` -Upon success, this will return a `Scale::Api::Tasks::Transcription` object. If it fails, it will raise one of the [errors](#user-content-errors). +Upon success, this will return a `ScaleApi::Api::Tasks::Transcription` object. If it fails, it will raise one of the [errors](#user-content-errors). Alternatively, you can also create a task this way ```ruby -require 'scale' -scale = Scale.new(api_key: 'SCALE_API_KEY') +require 'scale_api' +scale = ScaleApi.new(api_key: 'SCALE_API_KEY') scale.tasks.create({ type: 'transcription', @@ -326,7 +326,7 @@ scale.tasks.create({ }) ``` -This will also return a `Scale::Api::Tasks::Transcription` object. +This will also return a `ScaleApi::Api::Tasks::Transcription` object. [Read more about creating transcription tasks](https://docs.scaleapi.com/#create-transcription-task) @@ -335,8 +335,8 @@ This will also return a `Scale::Api::Tasks::Transcription` object. To create an [audio transcription task](https://docs.scaleapi.com/#create-audio-transcription-task), run the following: ```ruby -require 'scale' -scale = Scale.new(api_key: 'SCALE_API_KEY') +require 'scale_api' +scale = ScaleApi.new(api_key: 'SCALE_API_KEY') scale.create_audiotranscription_task({ callback_url: 'http://www.example.com/callback', @@ -346,12 +346,12 @@ scale.create_audiotranscription_task({ }) ``` -Upon success, this will return a `Scale::Api::Tasks::AudioTranscription` object. If it fails, it will raise one of the [errors](#user-content-errors). +Upon success, this will return a `ScaleApi::Api::Tasks::AudioTranscription` object. If it fails, it will raise one of the [errors](#user-content-errors). Alternatively, you can also create a task this way ```ruby -require 'scale' -scale = Scale.new(api_key: 'SCALE_API_KEY') +require 'scale_api' +scale = ScaleApi.new(api_key: 'SCALE_API_KEY') scale.tasks.create({ type: 'audiotranscription', @@ -362,7 +362,7 @@ scale.tasks.create({ }) ``` -This will also return a `Scale::Api::Tasks::AudioTranscription` object. +This will also return a `ScaleApi::Api::Tasks::AudioTranscription` object. [Read more about creating audio transcription tasks](https://docs.scaleapi.com/#create-audio-transcription-task) @@ -371,19 +371,19 @@ This will also return a `Scale::Api::Tasks::AudioTranscription` object. To get a list of tasks, run the following command: ```ruby -require 'scale' -scale = Scale.new(api_key: 'SCALE_API_KEY') +require 'scale_api' +scale = ScaleApi.new(api_key: 'SCALE_API_KEY') scale.tasks.list ``` -This will return a `Scale::Api::TaskList` object. +This will return a `ScaleApi::Api::TaskList` object. -`Scale::Api::TaskList` implements `Enumerable`, meaning you can do fun stuff like this: +`ScaleApi::Api::TaskList` implements `Enumerable`, meaning you can do fun stuff like this: ```ruby -require 'scale' -scale = Scale.new(api_key: 'SCALE_API_KEY') +require 'scale_api' +scale = ScaleApi.new(api_key: 'SCALE_API_KEY') scale.tasks.list.map(&:id) ``` @@ -392,8 +392,8 @@ This will return an array containing the last 100 tasks' `task_id`. You can also access it like a normal array: ```ruby -require 'scale' -scale = Scale.new(api_key: 'SCALE_API_KEY') +require 'scale_api' +scale = ScaleApi.new(api_key: 'SCALE_API_KEY') scale.tasks.list[0] ``` @@ -409,27 +409,27 @@ You can filter this list by: For example: ```ruby -require 'scale' -scale = Scale.new(api_key: 'SCALE_API_KEY') +require 'scale_api' +scale = ScaleApi.new(api_key: 'SCALE_API_KEY') scale.tasks.list(end_time: Time.parse('January 20th, 2017'), status: 'completed') ``` -This will return a `Scale::Api::TaskList` object up to 100 tasks that were completed by January 20th, 2017. +This will return a `ScaleApi::Api::TaskList` object up to 100 tasks that were completed by January 20th, 2017. By default, `scale.tasks.list` only returns up to 100 tasks, but you can pass in the `limit` yourself. It also supports pagination, here's an example: ```ruby -require 'scale' -scale = Scale.new(api_key: 'SCALE_API_KEY') +require 'scale_api' +scale = ScaleApi.new(api_key: 'SCALE_API_KEY') first_page = scale.tasks.list second_page = first_page.next_page ``` -`Scale::Api::TaskList#next_page` returns the next page in the list of tasks (as a new `Scale::Api::TaskList`). You can see if there are more pages by calling `Scale::Api::TaskList#has_more?` on the object. +`ScaleApi::Api::TaskList#next_page` returns the next page in the list of tasks (as a new `ScaleApi::Api::TaskList`). You can see if there are more pages by calling `ScaleApi::Api::TaskList#has_more?` on the object. `scale.tasks.list` is aliased to `scale.tasks.where` and `scale.tasks.all`. @@ -440,8 +440,8 @@ For more information, [read our documentation](https://docs.scaleapi.com/#list-a To find a task by ID, run the following: ```ruby -require 'scale' -scale = Scale.new(api_key: 'SCALE_API_KEY') +require 'scale_api' +scale = ScaleApi.new(api_key: 'SCALE_API_KEY') task_id = 'TASK_ID' scale.tasks.find(task_id) @@ -456,8 +456,8 @@ There are two ways to cancel a task. Cancel by `task_id`: ```ruby -require 'scale' -scale = Scale.new(api_key: 'SCALE_API_KEY') +require 'scale_api' +scale = ScaleApi.new(api_key: 'SCALE_API_KEY') task_id = 'TASK_ID' scale.tasks.cancel(task_id) @@ -466,8 +466,8 @@ scale.tasks.cancel(task_id) Cancel on the task object: ```ruby -require 'scale' -scale = Scale.new(api_key: 'SCALE_API_KEY') +require 'scale_api' +scale = ScaleApi.new(api_key: 'SCALE_API_KEY') task_id = 'TASK_ID' scale.tasks.find(task_id).cancel! @@ -478,13 +478,13 @@ Both ways will return a new [task object](#user-content-task-object) for the typ ## Task Object All tasks return a task object for their `type`. Currently, this gem supports the following task types: -- `categorization` (`Scale::Api::Tasks::Categorization`) -- `comparison` (`Scale::Api::Tasks::Comparison`) -- `datacollection` (`Scale::Api::Tasks::Datacollection`) -- `annotation` (`Scale::Api::Tasks::ImageRecognition`) -- `phonecall` (`Scale::Api::Tasks::PhoneCall`) -- `transcription` (`Scale::Api::Tasks::Transcription`) -- `audiotranscription` (`Scale::Api::Tasks::AudioTranscription`) +- `categorization` (`ScaleApi::Api::Tasks::Categorization`) +- `comparison` (`ScaleApi::Api::Tasks::Comparison`) +- `datacollection` (`ScaleApi::Api::Tasks::Datacollection`) +- `annotation` (`ScaleApi::Api::Tasks::ImageRecognition`) +- `phonecall` (`ScaleApi::Api::Tasks::PhoneCall`) +- `transcription` (`ScaleApi::Api::Tasks::Transcription`) +- `audiotranscription` (`ScaleApi::Api::Tasks::AudioTranscription`) At the time of writing, this is every task type that Scale supports. @@ -524,18 +524,18 @@ For example, for Ruby on Rails: ```ruby # app/controllers/scale_api_controller.rb -require 'scale' +require 'scale_api' class ScaleApiController < ApplicationController # POST /scale_api def create - scale = Scale.new(api_key: 'SCALE_API_KEY', callback_auth_key: 'SCALE_CALLBACK_AUTH_KEY') + scale = ScaleApi.new(api_key: 'SCALE_API_KEY', callback_auth_key: 'SCALE_CALLBACK_AUTH_KEY') callback = scale.build_callback params, callback_key: request.headers['scale-callback-auth'] return render status: 403 unless callback.verified? # Render forbidden if verifying the callback fails callback.response # Response content hash (code and result) - callback.task # Scale::Api::Tasks object for task type + callback.task # ScaleApi::Api::Tasks object for task type end end @@ -546,13 +546,13 @@ end This gem will raise exceptions on application-level errors. Here are the list of errors: ```ruby -Scale::Api::BadRequest -Scale::Api::TooManyRequests -Scale::Api::NotFound -Scale::Api::Unauthorized -Scale::Api::InternalServerError -Scale::Api::ConnectionError -Scale::Api::APIKeyInvalid +ScaleApi::Api::BadRequest +ScaleApi::Api::TooManyRequests +ScaleApi::Api::NotFound +ScaleApi::Api::Unauthorized +ScaleApi::Api::InternalServerError +ScaleApi::Api::ConnectionError +ScaleApi::Api::APIKeyInvalid ``` ## Development diff --git a/lib/scale/api/task_list.rb b/lib/scale/api/task_list.rb deleted file mode 100644 index ee969b0..0000000 --- a/lib/scale/api/task_list.rb +++ /dev/null @@ -1,59 +0,0 @@ -require 'scale/api/tasks/base_task' -require 'scale/api/tasks/audio_transcription' -require 'scale/api/tasks/datacollection' -require 'scale/api/tasks/categorization' -require 'scale/api/tasks/comparison' -require 'scale/api/tasks/image_recognition' -require 'scale/api/tasks/polygonannotation' -require 'scale/api/tasks/lineannotation' -require 'scale/api/tasks/phone_call' -require 'scale/api/tasks/transcription' - -class Scale - class Api - class TaskList - include Enumerable - extend Forwardable - def_delegators :@docs, :each, :<<, :[], :[]=, :length, :count - attr_accessor :client, :docs, :limit, :offset, :has_more, :params - TASK_TYPES_TO_CLASSNAMES = { - 'audiotranscription' => ::Scale::Api::Tasks::AudioTranscription, - 'categorization' => ::Scale::Api::Tasks::Categorization, - 'comparison' => ::Scale::Api::Tasks::Comparison, - 'datacollection' => ::Scale::Api::Tasks::Datacollection, - 'annotation' => ::Scale::Api::Tasks::ImageRecognition, - 'polygonannotation' => ::Scale::Api::Tasks::Polygonannotation, - 'lineannotation' => ::Scale::Api::Tasks::Lineannotation, - 'phonecall' => ::Scale::Api::Tasks::PhoneCall, - 'transcription' => ::Scale::Api::Tasks::Transcription - }.freeze - - def initialize(client: nil, docs: [], limit: 99, offset: 0, has_more: false, params: {}) - self.client = client - self.docs = docs.map do |doc| - ::Scale::Api::Tasks::BaseTask.from_hash(doc.merge('client' => client)) - end - - self.limit = limit - self.offset = offset - self.has_more = has_more - self.params = params # Used to get next page - end - - def has_more? - !!has_more - end - - def page - (offset + (limit * 1)) / limit - end - - def next_page - next_page_params = params.dup - params[:offset] = params[:limit] + params[:offset] - Scale::Api::Tasks.new(client).list(params) - end - - end - end -end \ No newline at end of file diff --git a/lib/scale.rb b/lib/scale_api.rb similarity index 77% rename from lib/scale.rb rename to lib/scale_api.rb index a48dc5a..ffde9d2 100644 --- a/lib/scale.rb +++ b/lib/scale_api.rb @@ -1,4 +1,4 @@ -class Scale +class ScaleApi attr_accessor :api_key, :callback_auth_key, :default_request_params, :logging def self.validate_api_key(api_key) @@ -8,7 +8,7 @@ def self.validate_api_key(api_key) end def initialize(api_key: nil, callback_auth_key: nil, default_request_params: {}, logging: false, callback_url: nil) - Scale.validate_api_key(api_key) + ScaleApi.validate_api_key(api_key) self.api_key = api_key self.callback_auth_key = callback_auth_key @@ -29,7 +29,7 @@ def client end def tasks - @tasks ||= Scale::Api::Tasks.new(client) + @tasks ||= ScaleApi::Api::Tasks.new(client) end def create_datacollection_task(args = {}) @@ -87,18 +87,18 @@ def build_callback(params, callback_key: nil) alias_method :create_audiotranscription_task, :create_audio_transcription_task end -require 'scale/api' -require 'scale/api/errors' -require 'scale/api/callback' -require 'scale/api/tasks' -require 'scale/api/tasks/audio_transcription' -require 'scale/api/tasks/base_task' -require 'scale/api/tasks/datacollection' -require 'scale/api/tasks/categorization' -require 'scale/api/tasks/comparison' -require 'scale/api/tasks/image_recognition' -require 'scale/api/tasks/polygonannotation' -require 'scale/api/tasks/lineannotation' -require 'scale/api/tasks/phone_call' -require 'scale/api/tasks/transcription' -require 'scale/api/task_list' +require 'scale_api/api' +require 'scale_api/api/errors' +require 'scale_api/api/callback' +require 'scale_api/api/tasks' +require 'scale_api/api/tasks/audio_transcription' +require 'scale_api/api/tasks/base_task' +require 'scale_api/api/tasks/datacollection' +require 'scale_api/api/tasks/categorization' +require 'scale_api/api/tasks/comparison' +require 'scale_api/api/tasks/image_recognition' +require 'scale_api/api/tasks/polygonannotation' +require 'scale_api/api/tasks/lineannotation' +require 'scale_api/api/tasks/phone_call' +require 'scale_api/api/tasks/transcription' +require 'scale_api/api/task_list' diff --git a/lib/scale/api.rb b/lib/scale_api/api.rb similarity index 76% rename from lib/scale/api.rb rename to lib/scale_api/api.rb index b6e5139..3de90de 100644 --- a/lib/scale/api.rb +++ b/lib/scale_api/api.rb @@ -2,7 +2,7 @@ require 'faraday' require 'json' -class Scale +class ScaleApi class Api < Struct.new(:api_key, :callback_auth_key, :default_request_params, :logging) SCALE_API_URL = 'https://api.scaleapi.com/v1/' @@ -29,7 +29,7 @@ def get(url, params = {}) response rescue Faraday::Error::ConnectionFailed - raise Scale::Api::ConnectionError + raise ScaleApi::Api::ConnectionError end def post(url, body = {}) @@ -50,26 +50,26 @@ def post(url, body = {}) response rescue Faraday::Error::ConnectionFailed - raise Scale::Api::ConnectionError + raise ScaleApi::Api::ConnectionError end def handle_error(response) error_body = JSON.parse(response.body) if response.status == 404 - raise Scale::Api::NotFound.new(error_body['error'], response.status) + raise ScaleApi::Api::NotFound.new(error_body['error'], response.status) elsif response.status == 429 - raise Scale::Api::TooManyRequests.new(error_body['error'], response.status) + raise ScaleApi::Api::TooManyRequests.new(error_body['error'], response.status) elsif response.status > 499 - raise Scale::Api::InternalServerError.new(error_body['error'], response.status) + raise ScaleApi::Api::InternalServerError.new(error_body['error'], response.status) elsif response.status == 401 - raise Scale::Api::Unauthorized.new(error_body['error'], response.status) + raise ScaleApi::Api::Unauthorized.new(error_body['error'], response.status) else - raise Scale::Api::BadRequest.new(error_body['error'], response.status) + raise ScaleApi::Api::BadRequest.new(error_body['error'], response.status) end rescue JSON::ParserError - raise Scale::Api::InternalServerError + raise ScaleApi::Api::InternalServerError end end end -require 'scale/api/errors' +require 'scale_api/api/errors' diff --git a/lib/scale/api/callback.rb b/lib/scale_api/api/callback.rb similarity index 78% rename from lib/scale/api/callback.rb rename to lib/scale_api/api/callback.rb index e936a53..a843bc6 100644 --- a/lib/scale/api/callback.rb +++ b/lib/scale_api/api/callback.rb @@ -1,4 +1,4 @@ -class Scale +class ScaleApi class Api class Callback attr_reader :client, :response, :task, :task_id, :request_callback_key @@ -10,7 +10,7 @@ def initialize(params, callback_key: nil, client: nil) if params['task'] @task_id = params['task']['id'] - @task = Scale::Api::Tasks::BaseTask.from_hash(params['task'].merge('client' => client)) + @task = ScaleApi::Api::Tasks::BaseTask.from_hash(params['task'].merge('client' => client)) end end @@ -25,5 +25,5 @@ def self.valid_callback_auth_key?(callback_key, request_callback_key) end end -require 'scale/api/tasks' -require 'scale/api/tasks/base_task' \ No newline at end of file +require 'scale_api/api/tasks' +require 'scale_api/api/tasks/base_task' diff --git a/lib/scale/api/errors.rb b/lib/scale_api/api/errors.rb similarity index 98% rename from lib/scale/api/errors.rb rename to lib/scale_api/api/errors.rb index 2231085..962fd65 100644 --- a/lib/scale/api/errors.rb +++ b/lib/scale_api/api/errors.rb @@ -1,4 +1,4 @@ -class Scale +class ScaleApi class Api class Error < StandardError attr_accessor :status_code @@ -43,4 +43,4 @@ def initialize(message = "Provided api_key is invalid. Please double check you p end end -end \ No newline at end of file +end diff --git a/lib/scale_api/api/task_list.rb b/lib/scale_api/api/task_list.rb new file mode 100644 index 0000000..73c94a8 --- /dev/null +++ b/lib/scale_api/api/task_list.rb @@ -0,0 +1,59 @@ +require 'scale_api/api/tasks/base_task' +require 'scale_api/api/tasks/audio_transcription' +require 'scale_api/api/tasks/datacollection' +require 'scale_api/api/tasks/categorization' +require 'scale_api/api/tasks/comparison' +require 'scale_api/api/tasks/image_recognition' +require 'scale_api/api/tasks/polygonannotation' +require 'scale_api/api/tasks/lineannotation' +require 'scale_api/api/tasks/phone_call' +require 'scale_api/api/tasks/transcription' + +class ScaleApi + class Api + class TaskList + include Enumerable + extend Forwardable + def_delegators :@docs, :each, :<<, :[], :[]=, :length, :count + attr_accessor :client, :docs, :limit, :offset, :has_more, :params + TASK_TYPES_TO_CLASSNAMES = { + 'audiotranscription' => ::ScaleApi::Api::Tasks::AudioTranscription, + 'categorization' => ::ScaleApi::Api::Tasks::Categorization, + 'comparison' => ::ScaleApi::Api::Tasks::Comparison, + 'datacollection' => ::ScaleApi::Api::Tasks::Datacollection, + 'annotation' => ::ScaleApi::Api::Tasks::ImageRecognition, + 'polygonannotation' => ::ScaleApi::Api::Tasks::Polygonannotation, + 'lineannotation' => ::ScaleApi::Api::Tasks::Lineannotation, + 'phonecall' => ::ScaleApi::Api::Tasks::PhoneCall, + 'transcription' => ::ScaleApi::Api::Tasks::Transcription + }.freeze + + def initialize(client: nil, docs: [], limit: 99, offset: 0, has_more: false, params: {}) + self.client = client + self.docs = docs.map do |doc| + ::ScaleApi::Api::Tasks::BaseTask.from_hash(doc.merge('client' => client)) + end + + self.limit = limit + self.offset = offset + self.has_more = has_more + self.params = params # Used to get next page + end + + def has_more? + !!has_more + end + + def page + (offset + (limit * 1)) / limit + end + + def next_page + next_page_params = params.dup + params[:offset] = params[:limit] + params[:offset] + ScaleApi::Api::Tasks.new(client).list(params) + end + + end + end +end diff --git a/lib/scale/api/tasks.rb b/lib/scale_api/api/tasks.rb similarity index 85% rename from lib/scale/api/tasks.rb rename to lib/scale_api/api/tasks.rb index 8188671..2265776 100644 --- a/lib/scale/api/tasks.rb +++ b/lib/scale_api/api/tasks.rb @@ -1,4 +1,4 @@ -class Scale +class ScaleApi class Api class Tasks < Struct.new(:client) def list(start_time: nil, end_time: nil, limit: 99, offset: 0, type: nil, status: nil) @@ -36,10 +36,10 @@ def cancel(task_id) def create(args = {}) raise ArgumentError.new('Task type is required') if (args[:type].nil? && args['type'].nil?) - klass = ::Scale::Api::TaskList::TASK_TYPES_TO_CLASSNAMES[(args[:type] || args['type']).to_s] + klass = ::ScaleApi::Api::TaskList::TASK_TYPES_TO_CLASSNAMES[(args[:type] || args['type']).to_s] unless klass - raise ArgumentError.new('Unsupported task type. Supported task types: ' + ::Scale::Api::TaskList::TASK_TYPES_TO_CLASSNAMES.keys.join(',')) + raise ArgumentError.new('Unsupported task type. Supported task types: ' + ::ScaleApi::Api::TaskList::TASK_TYPES_TO_CLASSNAMES.keys.join(',')) end args.delete(:type) @@ -52,4 +52,4 @@ def create(args = {}) end end -require 'scale/api/task_list' \ No newline at end of file +require 'scale_api/api/task_list' diff --git a/lib/scale/api/tasks/audio_transcription.rb b/lib/scale_api/api/tasks/audio_transcription.rb similarity index 92% rename from lib/scale/api/tasks/audio_transcription.rb rename to lib/scale_api/api/tasks/audio_transcription.rb index 0ab4098..c835d05 100644 --- a/lib/scale/api/tasks/audio_transcription.rb +++ b/lib/scale_api/api/tasks/audio_transcription.rb @@ -1,7 +1,7 @@ require 'json' -require 'scale/api/tasks/base_task' +require 'scale_api/api/tasks/base_task' -class Scale +class ScaleApi class Api class Tasks class AudioTranscription < BaseTask @@ -23,4 +23,4 @@ def self.create(callback_url: nil, instruction: nil, attachment_type: 'audio', a end end end -end \ No newline at end of file +end diff --git a/lib/scale/api/tasks/base_task.rb b/lib/scale_api/api/tasks/base_task.rb similarity index 91% rename from lib/scale/api/tasks/base_task.rb rename to lib/scale_api/api/tasks/base_task.rb index f7b2b17..0a7c114 100644 --- a/lib/scale/api/tasks/base_task.rb +++ b/lib/scale_api/api/tasks/base_task.rb @@ -1,6 +1,6 @@ require 'time' -class Scale +class ScaleApi class Api class Tasks class BaseTask @@ -11,7 +11,7 @@ class BaseTask alias_method :id, :task_id def self.from_hash(hash) - klass = ::Scale::Api::TaskList::TASK_TYPES_TO_CLASSNAMES[(hash[:type] || hash['type']).to_s] || self + klass = ::ScaleApi::Api::TaskList::TASK_TYPES_TO_CLASSNAMES[(hash[:type] || hash['type']).to_s] || self klass.new(hash) end diff --git a/lib/scale/api/tasks/categorization.rb b/lib/scale_api/api/tasks/categorization.rb similarity index 94% rename from lib/scale/api/tasks/categorization.rb rename to lib/scale_api/api/tasks/categorization.rb index a67c12c..3ef3e10 100644 --- a/lib/scale/api/tasks/categorization.rb +++ b/lib/scale_api/api/tasks/categorization.rb @@ -1,7 +1,7 @@ require 'json' -require 'scale/api/tasks/base_task' +require 'scale_api/api/tasks/base_task' -class Scale +class ScaleApi class Api class Tasks class Categorization < BaseTask @@ -29,4 +29,4 @@ def self.create(callback_url: nil, instruction: nil, attachment_type: nil, attac end end end -end \ No newline at end of file +end diff --git a/lib/scale/api/tasks/comparison.rb b/lib/scale_api/api/tasks/comparison.rb similarity index 92% rename from lib/scale/api/tasks/comparison.rb rename to lib/scale_api/api/tasks/comparison.rb index 4c3cf90..9c74235 100644 --- a/lib/scale/api/tasks/comparison.rb +++ b/lib/scale_api/api/tasks/comparison.rb @@ -1,7 +1,7 @@ require 'json' -require 'scale/api/tasks/base_task' +require 'scale_api/api/tasks/base_task' -class Scale +class ScaleApi class Api class Tasks class Comparison < BaseTask @@ -24,4 +24,4 @@ def self.create(callback_url: nil, instruction: nil, attachment_type: nil, attac end end end -end \ No newline at end of file +end diff --git a/lib/scale/api/tasks/datacollection.rb b/lib/scale_api/api/tasks/datacollection.rb similarity index 92% rename from lib/scale/api/tasks/datacollection.rb rename to lib/scale_api/api/tasks/datacollection.rb index c4e4081..3b261ae 100644 --- a/lib/scale/api/tasks/datacollection.rb +++ b/lib/scale_api/api/tasks/datacollection.rb @@ -1,7 +1,7 @@ require 'json' -require 'scale/api/tasks/base_task' +require 'scale_api/api/tasks/base_task' -class Scale +class ScaleApi class Api class Tasks class Datacollection < BaseTask @@ -23,4 +23,4 @@ def self.create(callback_url: nil, instruction: nil, attachment_type: nil, attac end end end -end \ No newline at end of file +end diff --git a/lib/scale/api/tasks/image_recognition.rb b/lib/scale_api/api/tasks/image_recognition.rb similarity index 88% rename from lib/scale/api/tasks/image_recognition.rb rename to lib/scale_api/api/tasks/image_recognition.rb index dabdb7d..bab0520 100644 --- a/lib/scale/api/tasks/image_recognition.rb +++ b/lib/scale_api/api/tasks/image_recognition.rb @@ -1,10 +1,10 @@ require 'json' -require 'scale/api/tasks/base_task' +require 'scale_api/api/tasks/base_task' -class Scale +class ScaleApi class Api class Tasks - class ImageRecognition < Scale::Api::Tasks::BaseTask + class ImageRecognition < ScaleApi::Api::Tasks::BaseTask CREATE_PATH = 'task/annotation'.freeze def self.create(callback_url: nil, instruction: nil, attachment_type: nil, attachment: null, objects_to_annotate: [], with_labels: false, min_width: nil, min_height: nil, examples: [], urgency: 'day', metadata: {}, client: nil) diff --git a/lib/scale/api/tasks/lineannotation.rb b/lib/scale_api/api/tasks/lineannotation.rb similarity index 87% rename from lib/scale/api/tasks/lineannotation.rb rename to lib/scale_api/api/tasks/lineannotation.rb index 3d8c9bf..0909417 100644 --- a/lib/scale/api/tasks/lineannotation.rb +++ b/lib/scale_api/api/tasks/lineannotation.rb @@ -1,10 +1,10 @@ require 'json' -require 'scale/api/tasks/base_task' +require 'scale_api/api/tasks/base_task' -class Scale +class ScaleApi class Api class Tasks - class Lineannotation < Scale::Api::Tasks::BaseTask + class Lineannotation < ScaleApi::Api::Tasks::BaseTask CREATE_PATH = 'task/lineannotation'.freeze def self.create(callback_url: nil, instruction: nil, attachment_type: nil, attachment: null, objects_to_annotate: [], with_labels: false, examples: [], urgency: 'day', metadata: {}, client: nil) diff --git a/lib/scale/api/tasks/phone_call.rb b/lib/scale_api/api/tasks/phone_call.rb similarity index 88% rename from lib/scale/api/tasks/phone_call.rb rename to lib/scale_api/api/tasks/phone_call.rb index 7e13f65..e66fbdb 100644 --- a/lib/scale/api/tasks/phone_call.rb +++ b/lib/scale_api/api/tasks/phone_call.rb @@ -1,10 +1,10 @@ require 'json' -require 'scale/api/tasks/base_task' +require 'scale_api/api/tasks/base_task' -class Scale +class ScaleApi class Api class Tasks - class PhoneCall < Scale::Api::Tasks::BaseTask + class PhoneCall < ScaleApi::Api::Tasks::BaseTask CREATE_PATH = 'task/phonecall'.freeze def self.create(callback_url: nil, instruction: nil, phone_number: nil, script: nil, entity_name: nil, attachment: nil, attachment_type: nil, fields: {}, choices: {}, urgency: 'day', metadata: {}, client: nil) @@ -27,4 +27,4 @@ def self.create(callback_url: nil, instruction: nil, phone_number: nil, script: end end end -end \ No newline at end of file +end diff --git a/lib/scale/api/tasks/polygonannotation.rb b/lib/scale_api/api/tasks/polygonannotation.rb similarity index 87% rename from lib/scale/api/tasks/polygonannotation.rb rename to lib/scale_api/api/tasks/polygonannotation.rb index 472aec5..bf5d9f1 100644 --- a/lib/scale/api/tasks/polygonannotation.rb +++ b/lib/scale_api/api/tasks/polygonannotation.rb @@ -1,10 +1,10 @@ require 'json' -require 'scale/api/tasks/base_task' +require 'scale_api/api/tasks/base_task' -class Scale +class ScaleApi class Api class Tasks - class Polygonannotation < Scale::Api::Tasks::BaseTask + class Polygonannotation < ScaleApi::Api::Tasks::BaseTask CREATE_PATH = 'task/polygonannotation'.freeze def self.create(callback_url: nil, instruction: nil, attachment_type: nil, attachment: null, objects_to_annotate: [], with_labels: false, examples: [], urgency: 'day', metadata: {}, client: nil) diff --git a/lib/scale/api/tasks/transcription.rb b/lib/scale_api/api/tasks/transcription.rb similarity index 92% rename from lib/scale/api/tasks/transcription.rb rename to lib/scale_api/api/tasks/transcription.rb index 8a86e99..644e563 100644 --- a/lib/scale/api/tasks/transcription.rb +++ b/lib/scale_api/api/tasks/transcription.rb @@ -1,7 +1,7 @@ require 'json' -require 'scale/api/tasks/base_task' +require 'scale_api/api/tasks/base_task' -class Scale +class ScaleApi class Api class Tasks class Transcription < BaseTask @@ -24,4 +24,4 @@ def self.create(callback_url: nil, instruction: nil, attachment_type: nil, choic end end end -end \ No newline at end of file +end diff --git a/scaleapi-ruby.gemspec b/scale_api-ruby.gemspec similarity index 93% rename from scaleapi-ruby.gemspec rename to scale_api-ruby.gemspec index e2b7e5a..543b787 100644 --- a/scaleapi-ruby.gemspec +++ b/scale_api-ruby.gemspec @@ -3,8 +3,8 @@ lib = File.expand_path('../lib', __FILE__) $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib) Gem::Specification.new do |spec| - spec.name = "scaleapi" - spec.version = "0.3.0" + spec.name = "scale_api" + spec.version = "0.4.0" spec.authors = ["Alexandr Wang"] spec.email = ["alex@scaleapi.com"]