Class: GH::Remote
Overview
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.
Instance Attribute Summary collapse
-
#api_host ⇒ Object
readonly
Returns the value of attribute api_host.
-
#connection ⇒ Object
readonly
Returns the value of attribute connection.
-
#headers ⇒ Object
readonly
Returns the value of attribute headers.
-
#prefix ⇒ Object
readonly
Returns the value of attribute prefix.
Attributes inherited from Wrapper
Instance Method Summary collapse
-
#delete(key) ⇒ Object
Public: …
-
#fetch_resource(key) ⇒ Object
Internal: …
- #full_url(key) ⇒ Object
-
#generate_response(key, response) ⇒ Object
Internal: …
-
#head(key) ⇒ Object
Public: …
-
#http(verb, url, headers = {}, &block) ⇒ Object
Internal: …
-
#in_parallel ⇒ Object
Public: …
-
#inspect ⇒ Object
Public: …
-
#load(data) ⇒ Object
Public: …
-
#patch(key, body) ⇒ Object
Public: …
- #path_for(key) ⇒ Object
-
#post(key, body) ⇒ Object
Public: …
-
#put(key, body) ⇒ Object
Public: …
-
#request(verb, key, body = nil) ⇒ Object
Internal: …
-
#reset ⇒ Object
Public: …
-
#setup(api_host, options) ⇒ Object
Public: Generates a new Rempte instance.
Methods inherited from Wrapper
[], #[], #frontend, #frontend=, #initialize, #prefixed, wraps
Constructor Details
This class inherits a constructor from GH::Wrapper
Instance Attribute Details
#api_host ⇒ Object (readonly)
Returns the value of attribute api_host.
8 9 10 |
# File 'lib/gh/remote.rb', line 8 def api_host @api_host end |
#connection ⇒ Object (readonly)
Returns the value of attribute connection.
8 9 10 |
# File 'lib/gh/remote.rb', line 8 def connection @connection end |
#headers ⇒ Object (readonly)
Returns the value of attribute headers.
8 9 10 |
# File 'lib/gh/remote.rb', line 8 def headers @headers end |
#prefix ⇒ Object (readonly)
Returns the value of attribute prefix.
8 9 10 |
# File 'lib/gh/remote.rb', line 8 def prefix @prefix end |
Instance Method Details
#delete(key) ⇒ Object
Public: …
100 101 102 |
# File 'lib/gh/remote.rb', line 100 def delete(key) frontend.request(:delete, key) end |
#fetch_resource(key) ⇒ Object
Internal: …
64 65 66 |
# File 'lib/gh/remote.rb', line 64 def fetch_resource(key) frontend.http(:get, frontend.path_for(key), headers) end |
#full_url(key) ⇒ Object
133 134 135 136 137 138 139 |
# File 'lib/gh/remote.rb', line 133 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) ⇒ Object
Internal: …
69 70 71 72 73 74 |
# File 'lib/gh/remote.rb', line 69 def generate_response(key, response) body, headers = response.body, response.headers url = response.respond_to?(:url) ? response.url : response.env.try(:[], :url) url = frontend.full_url(key) if url.to_s.empty? modify(body, headers, url) end |
#head(key) ⇒ Object
Public: …
105 106 107 |
# File 'lib/gh/remote.rb', line 105 def head(key) frontend.request(:head, key) end |
#http(verb, url, headers = {}, &block) ⇒ Object
Internal: …
77 78 79 80 81 |
# File 'lib/gh/remote.rb', line 77 def http(verb, url, headers = {}, &block) connection.run_request(verb, url, nil, headers, &block) rescue Exception => error raise Error.new(error, nil, :verb => verb, :url => url, :headers => headers) end |
#in_parallel ⇒ Object
Public: …
129 130 131 |
# File 'lib/gh/remote.rb', line 129 def in_parallel raise RuntimeError, "use GH::Parallel middleware for #in_parallel support" end |
#inspect ⇒ Object
Public: …
59 60 61 |
# File 'lib/gh/remote.rb', line 59 def inspect "#<#{self.class}: #{api_host}>" end |
#load(data) ⇒ Object
Public: …
124 125 126 |
# File 'lib/gh/remote.rb', line 124 def load(data) modify(data) end |
#patch(key, body) ⇒ Object
Public: …
110 111 112 |
# File 'lib/gh/remote.rb', line 110 def patch(key, body) frontend.request(:patch, key, body) end |
#path_for(key) ⇒ Object
141 142 143 |
# File 'lib/gh/remote.rb', line 141 def path_for(key) frontend.full_url(key).request_uri end |
#post(key, body) ⇒ Object
Public: …
95 96 97 |
# File 'lib/gh/remote.rb', line 95 def post(key, body) frontend.request(:post, key, body) end |
#put(key, body) ⇒ Object
Public: …
115 116 117 |
# File 'lib/gh/remote.rb', line 115 def put(key, body) frontend.request(:put, key, body) end |
#request(verb, key, body = nil) ⇒ Object
Internal: …
84 85 86 87 88 89 90 91 92 |
# File 'lib/gh/remote.rb', line 84 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 ⇒ Object
Public: …
120 121 |
# File 'lib/gh/remote.rb', line 120 def reset end |
#setup(api_host, options) ⇒ Object
Public: Generates a new Rempte 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).
:adapter - HTTP library to use for making requests (optional, default: :net_http)
It is highly recommended to set origin, but not to set headers. If you set the username, you should also set the password.
23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
# File 'lib/gh/remote.rb', line 23 def setup(api_host, ) token, username, password = .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" => [:user_agent] || "GH/#{GH::VERSION}", "Accept" => "application/vnd.github.v3+json," \ "application/vnd.github.beta+json;q=0.5," \ "application/json;q=0.1", "Accept-Charset" => "utf-8", } @headers.merge! [:headers] if [:headers] @headers['Origin'] = [:origin] if [:origin] @prefix = "" @prefix << "#{token}@" if token @prefix << "#{username}:#{password}@" if username and password @prefix << @api_host.host = {:url => api_host} [:ssl] = [:ssl] if [:ssl] .merge! [:faraday_options] if [:faraday_options] @connection = Faraday.new() 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) #builder.use(options[:adapter] || GH::FaradayAdapter) builder.adapter(:net_http) end end |