opennorth/pybossa-api-ruby

View on GitHub
lib/pybossa-api.rb

Summary

Maintainability
A
25 mins
Test Coverage
require 'json'

require 'httparty'
require 'sanitize'

module PyBossa
  # A Ruby wrapper for the PyBossa API.
  # @see http://docs.pybossa.com/en/latest/model.html#restful-api
  class API
    include HTTParty
    base_uri 'crowdcrafting.org/api'

    class Error < StandardError; end

    class << self
      attr_accessor :api_key

      # Lists objects. To filter objects, add key-value pairs to the +:opts+
      # argument in which each key is the name of a field on which you want to
      # filter. For example, you may want to filter tasks by +app_id+.
      #
      # @param [String] klass one of "app", "task" or "taskrun"
      # @param [Hash] opts optional arguments
      # @option opts [Integer] :limit number of results to return [default 20]
      # @option opts [String] :api_key an API key
      # @return [Array] a list of objects
      def many(klass, opts = {})
        request :get, "/#{klass}", opts
      end

      # Gets an object by ID.
      #
      # @param [String] klass one of "app", "task" or "taskrun"
      # @param [Integer] id an object ID
      # @param [Hash] opts optional arguments
      # @option opts [String] :api_key an API key
      # @return [Hash] an object
      def retrieve(klass, id, opts = {})
        request :get, "/#{klass}/#{id}", opts
      end

      # Creates an object.
      #
      # @param [String] klass one of "app", "task" or "taskrun"
      # @param [Hash] opts optional arguments
      # @option opts [String] :api_key an API key
      # @return [Hash] an object
      # @raise [PyBossa::API::Error] if operation failed
      #
      # @see https://github.com/PyBossa/pybossa/blob/master/pybossa/api.py#L91
      def create(klass, opts = {})
        request :post, "/#{klass}", opts
      end

      # Updates an object.
      #
      # @param [String] klass one of "app", "task" or "taskrun"
      # @param [Integer] id an object ID
      # @param [Hash] opts optional arguments
      # @option opts [String] :api_key an API key
      # @raise [PyBossa::API::Error] if operation failed
      #
      # @see https://github.com/PyBossa/pybossa/blob/master/pybossa/api.py#L129
      def update(klass, id, opts = {})
        request :put, "/#{klass}/#{id}", opts
      end

      # Deletes an object.
      #
      # @param [String] klass one of "app", "task" or "taskrun"
      # @param [Integer] id an object ID
      # @param [Hash] opts optional arguments
      # @option opts [String] :api_key an API key
      # @raise [PyBossa::API::Error] if operation failed
      #
      # @see https://github.com/PyBossa/pybossa/blob/master/pybossa/api.py#L108
      def destroy(klass, id, opts = {})
        request :delete, "/#{klass}/#{id}", opts
      end

      # @todo new_task user_progress
      # https://github.com/PyBossa/pybossa/blob/master/pybossa/api.py#L198
      # https://github.com/PyBossa/pybossa/blob/master/pybossa/api.py#L238

    private

      def request(http_method, path, opts)
        opts[:api_key] ||= api_key if api_key
        response = if [:get, :delete].include? http_method
          send http_method, path, :query => opts
        else
          send http_method, path, :query => {:api_key => opts.delete(:api_key)}, :body => JSON.dump(opts), :headers => {'Content-type' => 'application/json'}
        end
        unless [200, 204].include? response.response.code.to_i
          raise PyBossa::API::Error.new Sanitize.clean(response.response.body)
        end
        response.parsed_response
      end
    end
  end
end

require 'pybossa-api/app'
require 'pybossa-api/task'
require 'pybossa-api/task_run'