class SE::API::Client

Constants

API_VERSION

Attributes

params[RW]
quota[R]
quota_used[R]

Public Class Methods

new(key = "", log_api_raw: false, log_api_json: false, log_meta: true, **params) click to toggle source
# File lib/se/api.rb, line 22
def initialize(key = "", log_api_raw: false, log_api_json: false, log_meta: true, **params)
  @key = key
  @params = params.merge({filter: '!*1_).BnZb8pdvWlZpJYNyauMekouxK9-RzUNUrwiB'})
  @quota = nil
  @quota_used = 0
  @backoff = Time.now
  @logger_raw = Logger.new 'api_raw.log'
  @logger_json = Logger.new 'api_json.log'
  @logger = Logger.new 'se-api.log'
  @logger_raw.level = Logger::Severity::UNKNOWN unless log_api_raw
  @logger_json.level = Logger::Severity::UNKNOWN unless log_api_json
  @logger.level = Logger::Severity::UNKNOWN unless log_meta
end

Public Instance Methods

answer(id, **params) click to toggle source
# File lib/se/api.rb, line 56
def answer(id, **params)
  answers(id, **params).first
end
answers(*ids, **params) click to toggle source
# File lib/se/api.rb, line 52
def answers(*ids, **params)
  objectify Answer, ids, **params
end
comment(id, **params) click to toggle source
# File lib/se/api.rb, line 64
def comment(id, **params)
  comments(id, **params).first
end
comments(*ids, **params) click to toggle source
# File lib/se/api.rb, line 60
def comments(*ids, **params)
  objectify Comment, ids, **params
end
post(id, **params) click to toggle source
# File lib/se/api.rb, line 40
def post(id, **params)
  posts(id, **params).first
end
posts(*ids, **params) click to toggle source
# File lib/se/api.rb, line 36
def posts(*ids, **params)
  objectify Post, ids, **params
end
question(id, **params) click to toggle source
# File lib/se/api.rb, line 48
def question(id, **params)
  questions(id, **params).first
end
questions(*ids, **params) click to toggle source
# File lib/se/api.rb, line 44
def questions(*ids, **params)
  objectify Question, ids, **params
end
user(id, **params) click to toggle source
# File lib/se/api.rb, line 72
def user(id, **params)
  users(id, **params).first
end
users(*ids, **params) click to toggle source
# File lib/se/api.rb, line 68
def users(*ids, **params)
  objectify User, ids, **params
end

Private Instance Methods

json(uri, **params) click to toggle source
# File lib/se/api.rb, line 86
def json(uri, **params)
  params = @params.merge(params)
  throw "No site specified" if params[:site].nil?
  backoff_for = @backoff-Time.now
  backoff_for = 0 if backoff_for <= 0
  if backoff_for > 0
    @logger.warn "Backing off for #{backoff_for}"
    sleep backoff_for+2
    @logger.warn "Finished backing off!"
  end
  params = @params.merge(params).merge({key: @key}).map { |k,v| "#{k}=#{v}" }.join('&')
  @logger.info "Posting to https://api.stackexchange.com/#{API_VERSION}/#{uri}?#{params}"
  begin
    resp_raw  = Net::HTTP.get_response(URI("https://api.stackexchange.com/#{API_VERSION}/#{uri}?#{params}")).body
  rescue Net::OpenTimeout, SocketError => e
    @logger.warn "Got timeout on API request (#{e}). Retrying..."
    puts "Got timeout on API request (#{e}). Retrying..."
    sleep 0.3
    retry
  end
  @logger_raw.info "https://api.stackexchange.com/#{API_VERSION}/#{uri}?#{params} => #{resp_raw}"
  resp = JSON.parse(resp_raw)
  @backoff = Time.now + resp["backoff"].to_i
  @logger_json.info "https://api.stackexchange.com/#{API_VERSION}/#{uri}?#{params} => #{resp}"
  @quota = resp["quota_remaining"]
  @quota_used += 1
  Array(resp["items"])
end
objectify(type, ids = "", uri: nil, **params) click to toggle source
# File lib/se/api.rb, line 78
def objectify(type, ids = "", uri: nil, **params)
  return if ids == ""
  uri = "#{type.to_s.split('::').last.downcase}s" if uri.nil?
  json("#{uri}/#{Array(ids).join(';')}", **params).map do |i|
    type.new(i)
  end
end