module MikuTwitter::Query

TwitterAPIを叩く機能

Constants

Lock

Public Class Methods

api_lock(url) click to toggle source

同じURLに対して同時にリクエストを送らないように、APIのURL毎にユニークなロックを取得する

# File core/lib/mikutwitter/query.rb, line 26
def self.api_lock(url)
  result = Lock.synchronize{
    @url_lock ||= Hash.new{ |h, k| h[k] = Monitor.new }
    @url_lock[url] }.synchronize(&Proc.new)
  @url_lock.delete(url)
  result end
new(*a, &b) click to toggle source
Calls superclass method MikuTwitter::Connect.new
# File core/lib/mikutwitter/query.rb, line 21
def initialize(*a, &b)
  @unretriable_uri = TimeLimitedStorage.new
  super(*a, &b) end

Public Instance Methods

api(api, options = {}, force_oauth = false) click to toggle source

別のThreadで #query! を実行する。

Args

#query! と同じ

Return

Deferredのインスタンス

# File core/lib/mikutwitter/query.rb, line 38
def api(api, options = {}, force_oauth = false)
  type_strict options => Hash
  promise = Thread.new do
    begin
      query!(api, options, force_oauth)
    rescue MikuTwitter::RateLimitError => exception
      raise exception
    rescue MikuTwitter::Error => exception
      httpresponse = exception.httpresponse
      if httpresponse and httpresponse.body.is_a?(String)
        body = JSON.parse(httpresponse.body, symbolize_names: true)
        if body[:errors].is_a?(Array)
          errobj = body[:errors].first
          raise MikuTwitter::TwitterError(errobj[:code]).new(errobj[:message] || exception.message, httpresponse) end end
      raise exception end end
  promise.abort_on_exception = false
  promise end
query!(api, options = {}, force_oauth = false) click to toggle source

APIを叩く

Args

method

メソッド。:get, :post, :put, :delete の何れか

api

APIの種類(文字列)

options

API引数。ただし、以下のキーは特別扱いされ、API引数からは除外される

:head

HTTPリクエストヘッダ(Hash)

force_oauth

互換性のため

Return

API戻り値(HTTPResponse)

Exceptions

TimeoutError, MikuTwitter::Error

# File core/lib/mikutwitter/query.rb, line 68
def query!(api, options = {}, force_oauth = false)
  type_strict options => Hash
  resource = ratelimit(api.to_s)
  if resource and resource.limit?
    raise MikuTwitter::RateLimitError.new("Rate limit #{resource.endpoint}", nil) end
  method = get_api_property(api, options, method_of_api) || :get
  url = if options[:host]
          "https://#{options[:host]}/#{api}.json"
        else
          "#{@base_path}/#{api}.json" end
  res = _query!(api, options, method, url)
  if('2' == res.code[0])
    res
  else
    raise MikuTwitter::Error.new("#{method} #{api} => #{res.code} #{res.message}", res) end
rescue MikuTwitter::RateLimitError => e
  # 変数 resource の情報は振るい可能性がある(他のTwitterクライアントが同じエンドポイントを使用した時等)
  Plugin.call(:mikutwitter_ratelimit, self, ratelimit(api.to_s))
  raise e end