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