class ComicVine::API

Class to interact and query the ComicVine API @since 0.1.0

Public Class Methods

api_key() click to toggle source

Returns ComicVine API Key. Set to the environmental variable CV_API_KEY by default if present @return [String] @since 0.1.0

# File lib/comicvine.rb, line 79
def api_key
  @@api_key || ENV['CV_API_KEY']
end
api_key=(key) click to toggle source

Sets the ComicVine API Key. Overrides the environmental variable CV_API_KEY @param key [String] @since 0.1.0

# File lib/comicvine.rb, line 87
def api_key=(key)
  @@api_key = key
end
api_timeout() click to toggle source

Returns ComicVine API request timeout value @return [Integer] @since 0.1.2

# File lib/comicvine.rb, line 95
def api_timeout
  @@api_timeout
end
api_timeout=(seconds) click to toggle source

Sets the ComicVine API request timeout value in seconds @param seconds [Integer] @since 0.1.0

# File lib/comicvine.rb, line 103
def api_timeout=(seconds)
  @@api_timeout = seconds.to_i
end
find_detail(resource) click to toggle source

Cycles through type hash to return the resource hash of the matching the detail_resource_name @example

ComicVine::API.find_detail(:issue) #=> { "detail_resource_name": "issue", "list_resource_name": "issues", "id": 4000 }

@param resource [Symbol] The symbol of the resource to return @return [Hash] @since 0.1.0

# File lib/comicvine.rb, line 157
def find_detail(resource)
  types.find { |t| t['detail_resource_name'] == resource.to_s }
end
find_list(resource) click to toggle source

Cycles through type hash to return the resource hash of the matching the list_resource_name @example

ComicVine::API.find_list(:issues) #=> { "detail_resource_name": "issue", "list_resource_name": "issues", "id": 4000 }

@param resource [Symbol] The symbol of the resource to return @return [Hash] @since 0.1.0

# File lib/comicvine.rb, line 168
def find_list(resource)
  types.find { |t| t['list_resource_name'] == resource.to_s }
end
get_api_version() click to toggle source

Makes request for the current api version

@return [String] @since 0.1.0

# File lib/comicvine.rb, line 112
def get_api_version
  _make_request(:types)['version'].to_s
end
get_details(resource, id, **params) click to toggle source

Fetches provided resource with associated id @example

ComicVine::API.get_details(:issue, '371103')

@param resource [Symbol] The symbol of the resource to fetch @param id [String] The id of the resource you would like to fetch @param params [Hash] optional parameters to pass to CV API @return [ComicVine::Resource] @since 0.1.0

# File lib/comicvine.rb, line 194
def get_details(resource, id, **params)
  ops_hash = {
      id: id
  }
  ops_hash.merge! params
  resp = _make_request(resource, ops_hash)
  ComicVine::Resource.create_resource(resp['results'])
end
get_details_by_url(url) click to toggle source

Will fetch the provided url as a {ComicVine::Resource} @example

ComicVine::API.get_details_by_url('http://comicvine.gamespot.com/api/issue/4000-371103') #=> ComicVine::Resource::Issue

@param url [String] @return [ComicVine::Resource]

# File lib/comicvine.rb, line 209
def get_details_by_url(url)
  resp = _make_url_request(url)
  ComicVine::Resource::create_resource(resp['results'])
end
get_list(resource, **params) click to toggle source

Fetches provided @example

ComicVine::API.get_list(:volumes, limit: 50)

@param resource [Symbol] The symbol of the resource to fetch (plural) @param params [Hash] optional parameters to pass to CV API @return [ComicVine::ResourceList] @since 0.1.0

# File lib/comicvine.rb, line 180
def get_list(resource, **params)
  resp = _make_request(resource, params)
  ComicVine::ResourceList.new(resp, resource)
end
method_missing(method_sym, *arguments, &block) click to toggle source

Checks missing method against the resource {@@types types} and passes it to {find_list} or {get_details}

Calls superclass method
# File lib/comicvine.rb, line 216
def method_missing(method_sym, *arguments, &block)
  if find_list(method_sym)
    get_list method_sym, arguments.first
  elsif find_detail(method_sym)
    get_details method_sym, *arguments
  elsif super
  end
end
new(key) click to toggle source

@return [ComicVine::API] @since 0.1.0

# File lib/comicvine.rb, line 70
def new(key)
  @@api_key=key
  self
end
types() click to toggle source

Returns comicvine type information

@return [Hash] @since 0.1.0

# File lib/comicvine.rb, line 142
def types
  if @@types.nil? || (@@last_type_check + (4 * 60 * 60)) < Time.now
    @@last_type_check = Time.now
    @@types = _make_request(:types)['results']
  end
  @@types
end

Private Class Methods

_build_base_url(resource, id = nil) click to toggle source

Builds api url string based on provided resource and optional id

@example Build a url for resource :issue with an id of 371103

_build_base_url(:issue, '371103') #=> "http://comicvine.gamespot.com/api/issue/4000-371103"

@example Build a url for resource :issues

_build_base_url(:issues) #=> "http://comicvine.gamespot.com/api/issues"

@param resource [Symbol] The symbol of the resource to build the url for @param id [String] optional id for specific resource requests @return [String] Full url of the requested resource @macro raise.ResourceNotSupportedError

# File lib/comicvine.rb, line 239
def _build_base_url(resource, id = nil)
  if ComicVine::API_RESOURCES.include? resource
    if !id.nil?
      API_URL + '/' + resource.to_s + '/' + "#{self.find_detail(resource)['id']}-#{id.to_s}/"
    else
      API_URL + '/' + resource.to_s + '/'
    end
  else
    raise ResourceNotSupportedError, resource.to_s + ' is not a supported resource'
  end
end
_make_request(resource, **params) click to toggle source

Executes api request based on provided resource and params

@example Return 5 results from the :characters resource

_make_request(:characters, limit: 5)

@param resource [Symbol] The symbol of the resource to fetch @param params [Hash] The named key value pairs of query parameters @return [Hash] @since 0.1.0 @macro raise.ComicVineAPIError @macro raise.ResourceNotSupportedError

# File lib/comicvine.rb, line 263
def _make_request(resource, **params)
  _make_url_request(_build_base_url(resource, params[:id] || nil), params)
end
_make_url_request(url, **params) click to toggle source

Executes api request based on provided resource and params

@example Make a simple request with +limit: 1+

_make_url_request('http://comicvine.gamespot.com/api/issues', limit: 1)

@param url [String] Request url @param params [Hash] optional request parameters @return [Hash] @since 0.1.0 @macro raise.ComicVineAPIError

# File lib/comicvine.rb, line 278
def _make_url_request(url, **params)
  # Default options hash
  options = {
      params: {
          api_key: self.api_key,
          format: ComicVine::API_FORMAT
      }
  }

  options[:params].merge! params

  begin
    # Sleep for 1 sec to avoid rate limit
    sleep 1
    # Perform request
    request = RestClient::Request.execute(
        method: :get,
        url: url,
        timeout: self.api_timeout,
        headers: options
    )
      #request = RestClient.get(url, options)
  rescue RestClient::NotFound, RestClient::Exceptions::ReadTimeout => e
    raise ComicVineAPIError, e.message
  end

  case request.code
    when 200
      req = JSON.parse(request.body)
      if req['error'].eql?('OK')
        req
      else
        raise ComicVineAPIError, req['error']
      end
    when 420
      raise ComicVineAPIError, 'Recived a '+request.code+' http response: You\'ve been rate limited'
    else
      raise ComicVineAPIError, 'Recived a '+request.code+' http response'
  end
end