class GH::Remote

Public: This class deals with HTTP requests to Github. It is the base Wrapper you always want to use. Note that it is usually used implicitely by other wrapper classes if not specified.

Attributes

api_host[R]
connection[R]
headers[R]
prefix[R]

Public Instance Methods

delete(key, body = nil) click to toggle source

Public: …

# File lib/gh/remote.rb, line 103
def delete(key, body = nil)
  frontend.request(:delete, key, body)
end
fetch_resource(key) click to toggle source

Internal: …

# File lib/gh/remote.rb, line 65
def fetch_resource(key)
  frontend.http(:get, frontend.path_for(key), headers)
end
full_url(key) click to toggle source
# File lib/gh/remote.rb, line 136
def full_url(key)
  uri      = Addressable::URI.parse(key)
  uri.path = File.join(api_host.path, uri.path) unless uri.absolute? or uri.path.start_with?(api_host.path)
  uri      = api_host + uri
  raise ArgumentError, "URI out of scope: #{key}" if uri.host != api_host.host
  uri
end
generate_response(key, response) click to toggle source

Internal: …

# File lib/gh/remote.rb, line 70
def generate_response(key, response)
  body, headers = response.body, response.headers
  url = response.env[:url]     if response.respond_to? :env and response.env
  url = response.url           if response.respond_to?(:url)
  url = frontend.full_url(key) if url.to_s.empty?
  modify(body, headers, url)
end
head(key) click to toggle source

Public: …

# File lib/gh/remote.rb, line 108
def head(key)
  frontend.request(:head, key)
end
http(verb, url, headers = {}, &block) click to toggle source

Internal: …

# File lib/gh/remote.rb, line 79
def http(verb, url, headers = {}, &block)
  body = headers.delete :body
  connection.run_request(verb, url, body, headers, &block)
rescue Exception => error
  raise Error.new(error, nil, :verb => verb, :url => url, :headers => headers)
end
in_parallel() click to toggle source

Public: …

# File lib/gh/remote.rb, line 132
def in_parallel
  raise RuntimeError, "use GH::Parallel middleware for #in_parallel support"
end
inspect() click to toggle source

Public: …

# File lib/gh/remote.rb, line 60
def inspect
  "#<#{self.class}: #{api_host}>"
end
load(data) click to toggle source

Public: …

# File lib/gh/remote.rb, line 127
def load(data)
  modify(data)
end
patch(key, body) click to toggle source

Public: …

# File lib/gh/remote.rb, line 113
def patch(key, body)
  frontend.request(:patch, key, body)
end
path_for(key) click to toggle source
# File lib/gh/remote.rb, line 144
def path_for(key)
  frontend.full_url(key).request_uri
end
post(key, body) click to toggle source

Public: …

# File lib/gh/remote.rb, line 98
def post(key, body)
  frontend.request(:post, key, body)
end
put(key, body) click to toggle source

Public: …

# File lib/gh/remote.rb, line 118
def put(key, body)
  frontend.request(:put, key, body)
end
request(verb, key, body = nil) click to toggle source

Internal: …

# File lib/gh/remote.rb, line 87
def request(verb, key, body = nil)
  response = frontend.http(verb, path_for(key), headers) do |req|
    req.body = Response.new(body).to_s if body
  end
  frontend.generate_response(key, response)
rescue GH::Error => error
  error.info[:payload] = Response.new(body).to_s if body
  raise error
end
reset() click to toggle source

Public: …

# File lib/gh/remote.rb, line 123
def reset
end
setup(api_host, options) click to toggle source

Public: Generates a new Remote instance.

api_host - HTTP host to send requests to, has to include schema (https or http) options - Hash with configuration options:

:token    - OAuth token to use (optional).
:username - Github user used for login (optional).
:password - Github password used for login (optional).
:origin   - Value of the origin request header (optional).
:headers  - HTTP headers to be send on every request (optional).

It is highly recommended to set origin, but not to set headers. If you set the username, you should also set the password.

# File lib/gh/remote.rb, line 23
def setup(api_host, options)
  token, username, password = options.values_at :token, :username, :password

  api_host  = api_host.api_host if api_host.respond_to? :api_host
  @api_host = Addressable::URI.parse(api_host)
  @headers  = {
    "User-Agent"      => options[:user_agent] || "GH/#{GH::VERSION}",
    "Accept"          => options[:accept] || "application/vnd.github.v3+json",
    "Accept-Charset"  => "utf-8",
  }

  @headers.merge! options[:headers] if options[:headers]
  @headers['Origin'] = options[:origin] if options[:origin]

  @prefix = ""
  @prefix << "#{token}@" if token
  @prefix << "#{username}:#{password}@" if username and password
  @prefix << @api_host.host

  faraday_options = {:url => api_host}
  faraday_options[:ssl] = options[:ssl] if options[:ssl]
  faraday_options.merge! options[:faraday_options] if options[:faraday_options]

  @connection = Faraday.new(faraday_options) do |builder|
    builder.request(:authorization, :token, token) if token
    builder.request(:basic_auth, username, password)  if username and password
    builder.request(:retry)
    builder.response(:raise_error)
    if defined? FaradayMiddleware::Instrumentation
      builder.use :instrumentation
    end
    builder.response(:logger, nil, formatter: GH.const_get(options[:formatter].camelize)) if options[:formatter]
    builder.adapter(:net_http)
  end
end

Private Instance Methods

identifier(key) click to toggle source
# File lib/gh/remote.rb, line 150
def identifier(key)
  path_for(key)
end
modify(body, headers = {}, url = nil) click to toggle source
# File lib/gh/remote.rb, line 154
def modify(body, headers = {}, url = nil)
  return body if body.is_a? Response
  Response.new(body, headers, url)
end