class PCO::API::Endpoint
Attributes
last_result[R]
retry_when_rate_limited[RW]
url[R]
Public Class Methods
new(url: URL, oauth_access_token: nil, basic_auth_token: nil, basic_auth_secret: nil, connection: nil)
click to toggle source
# File lib/pco/api/endpoint.rb, line 17 def initialize(url: URL, oauth_access_token: nil, basic_auth_token: nil, basic_auth_secret: nil, connection: nil) @url = url @oauth_access_token = oauth_access_token @basic_auth_token = basic_auth_token @basic_auth_secret = basic_auth_secret @connection = connection || _build_connection @cache = {} @retry_when_rate_limited = true end
Public Instance Methods
[](id)
click to toggle source
# File lib/pco/api/endpoint.rb, line 31 def [](id) _build_endpoint(id.to_s) end
delete()
click to toggle source
# File lib/pco/api/endpoint.rb, line 71 def delete @last_result = @connection.delete(@url) if @last_result.status == 204 true else _build_response(@last_result) end rescue Errors::TooManyRequests => e _retry_after_timeout?(e) ? retry : raise end
get(params = {})
click to toggle source
# File lib/pco/api/endpoint.rb, line 46 def get(params = {}) @last_result = @connection.get(@url, params) _build_response(@last_result) rescue Errors::TooManyRequests => e _retry_after_timeout?(e) ? retry : raise end
method_missing(method_name, *_args)
click to toggle source
# File lib/pco/api/endpoint.rb, line 27 def method_missing(method_name, *_args) _build_endpoint(method_name.to_s) end
patch(body = {})
click to toggle source
# File lib/pco/api/endpoint.rb, line 62 def patch(body = {}) @last_result = @connection.patch(@url) do |req| req.body = _build_body(body) end _build_response(@last_result) rescue Errors::TooManyRequests => e _retry_after_timeout?(e) ? retry : raise end
post(body = {})
click to toggle source
# File lib/pco/api/endpoint.rb, line 53 def post(body = {}) @last_result = @connection.post(@url) do |req| req.body = _build_body(body) end _build_response(@last_result) rescue Errors::TooManyRequests => e _retry_after_timeout?(e) ? retry : raise end
respond_to?(method_name, _include_all = false)
click to toggle source
# File lib/pco/api/endpoint.rb, line 35 def respond_to?(method_name, _include_all = false) endpoint = _build_endpoint(method_name.to_s) begin endpoint.get rescue Errors::NotFound false else true end end
Private Instance Methods
_build_body(body)
click to toggle source
# File lib/pco/api/endpoint.rb, line 115 def _build_body(body) if _needs_url_encoded? Faraday::Utils.build_nested_query(body) else body.to_json end end
_build_connection()
click to toggle source
# File lib/pco/api/endpoint.rb, line 136 def _build_connection Faraday.new(url: url) do |faraday| faraday.response :json, content_type: /\bjson$/ if @basic_auth_token && @basic_auth_secret faraday.basic_auth @basic_auth_token, @basic_auth_secret elsif @oauth_access_token faraday.headers['Authorization'] = "Bearer #{@oauth_access_token}" else fail Errors::AuthRequiredError, "You must specify either HTTP basic auth credentials or an OAuth2 access token." end faraday.adapter :excon end end
_build_endpoint(path)
click to toggle source
# File lib/pco/api/endpoint.rb, line 127 def _build_endpoint(path) @cache[path] ||= begin self.class.new( url: File.join(url, path.to_s), connection: @connection ) end end
_build_response(result)
click to toggle source
# File lib/pco/api/endpoint.rb, line 84 def _build_response(result) case result.status when 200..299 res = Response[result.body] res.headers = result.headers res when 400 fail Errors::BadRequest, result when 401 fail Errors::Unauthorized, result when 403 fail Errors::Forbidden, result when 404 fail Errors::NotFound, result when 405 fail Errors::MethodNotAllowed, result when 422 fail Errors::UnprocessableEntity, result when 429 fail Errors::TooManyRequests, result when 400..499 fail Errors::ClientError, result when 500 fail Errors::InternalServerError, result when 500..599 fail Errors::ServerError, result else fail "unknown status #{result.status}" end end
_needs_url_encoded?()
click to toggle source
# File lib/pco/api/endpoint.rb, line 123 def _needs_url_encoded? @url =~ /oauth\/[a-z]+\z/ end
_retry_after_timeout?(e)
click to toggle source
# File lib/pco/api/endpoint.rb, line 150 def _retry_after_timeout?(e) if @retry_when_rate_limited secs = e.headers['Retry-After'] Kernel.sleep(secs ? secs.to_i : 1) true else false end end