module Github class Client TIMEOUT = 60 DEFAULT_PER_PAGE = 100 attr_reader :connection, :rate_limit def initialize(options) @connection = Faraday.new(url: options.fetch(:url, root_endpoint)) do |faraday| faraday.options.open_timeout = options.fetch(:timeout, TIMEOUT) faraday.options.timeout = options.fetch(:timeout, TIMEOUT) faraday.authorization 'token', options.fetch(:token) faraday.adapter :net_http faraday.ssl.verify = verify_ssl end @rate_limit = RateLimit.new(connection) end def get(url, query = {}) exceed, reset_in = rate_limit.get sleep reset_in if exceed Github::Response.new(connection.get(url, { per_page: DEFAULT_PER_PAGE }.merge(query))) end private def root_endpoint custom_endpoint || github_endpoint end def custom_endpoint github_omniauth_provider.dig('args', 'client_options', 'site') end def verify_ssl # If there is no config, we're connecting to github.com # and we should verify ssl. github_omniauth_provider.fetch('verify_ssl', true) end def github_endpoint OmniAuth::Strategies::GitHub.default_options[:client_options][:site] end def github_omniauth_provider @github_omniauth_provider ||= Gitlab.config.omniauth.providers .find { |provider| provider.name == 'github' } .to_h end end end