class Travis::Client::Session

Constants

Attributes

connection[R]
request_headers[R]
response_cache[R]

Public Class Methods

new(connection, access_token: nil, request_headers: {}) click to toggle source
# File lib/travis/client/session.rb, line 9
def initialize(connection, access_token: nil, request_headers: {})
  @connection                       = connection
  @http_connections                 = {}
  @response_cache                   = {}
  @request_headers                  = connection.request_headers.merge(request_headers)
  @request_headers['Authorization'] = "token #{access_token}" if access_token
end

Public Instance Methods

call(resource_type, action_name, variables = {}) click to toggle source
# File lib/travis/client/session.rb, line 31
def call(resource_type, action_name, variables = {})
  action(resource_type, action_name).call(self, variables)
end
define_constants(container) click to toggle source
# File lib/travis/client/session.rb, line 49
def define_constants(container)
  set_default_types
  error_types.merge(resource_types).each do |key, factory|
    constant = key.split('_').map(&:capitalize).join
    container.const_set(constant, factory) unless container.const_defined?(constant, false)
  end
  container.extend connection.mixin
  container
end
error_types() click to toggle source
# File lib/travis/client/session.rb, line 35
def error_types
  # we currently don't allow/need to override error types
  connection.error_types
end
fetch(link) click to toggle source
# File lib/travis/client/session.rb, line 59
def fetch(link)
  response_cache.fetch(link) { request('GET', link) }
end
inspect() click to toggle source
# File lib/travis/client/session.rb, line 17
def inspect
  "#<#{Session}>"
end
request(method, uri, params = {}) click to toggle source
# File lib/travis/client/session.rb, line 21
def request(method, uri, params = {})
  method         = method.to_s.upcase
  options        = {}
  options[:json] = params if params.any?
  uri            = Addressable::URI.parse(uri) unless uri.is_a? Addressable::URI
  response       = connection.notify(method, uri, params) { http_connection(uri).request(method, uri, options) }
  payload        = JSON.load(response.body)
  wrap(payload, uri)
end
resource_types() click to toggle source
# File lib/travis/client/session.rb, line 40
def resource_types
  return @resource_types if defined? @resource_types and @resource_types
  connection.resource_types
end
set_default_types() click to toggle source
# File lib/travis/client/session.rb, line 45
def set_default_types
  @resource_types ||= connection.resource_types.map { |k,v| [k,v.for_session(self)] }.to_h
end

Private Instance Methods

http_connection(uri) click to toggle source
# File lib/travis/client/session.rb, line 67
        def http_connection(uri)
  raise ArgumentError, 'request URI needs to be absolute' unless uri.absolute?
  @http_connections[uri.authority] ||= connection.http_factory.persistent(uri.join('/')).headers(request_headers)
end
load(payload, uri) click to toggle source
# File lib/travis/client/session.rb, line 80
        def load(payload, uri)
  return payload unless payload['@type'] or payload['@href']

  if payload['@type'] == 'error'
    factory = error_types.fetch(payload['error_type']) { resource_types.fetch('error', Error) }
    error   = factory.new(self, payload['error_message'] || factory.default_message)
    error.merge! payload
    raise error
  end

  if payload['@href']
    href    = uri.join(payload['@href'])
    return response_cache[href] || Link.new(self, href, payload) if payload.all? { |a, _| LINK_ATTRIBUTES.include?(a) }
    current = response_cache[href]
  end

  current ||= resource_types.fetch(payload['@type'], Unknown).new(self, href)
  current.merge! payload
  response_cache[href] = current
end
session() click to toggle source
# File lib/travis/client/session.rb, line 63
        def session
  self
end
wrap(payload, uri) click to toggle source
# File lib/travis/client/session.rb, line 72
        def wrap(payload, uri)
  case payload
  when Array then payload.map { |e| wrap(e, uri) }
  when Hash  then load(payload.map { |k,v| [k, wrap(v, uri)] }.to_h, uri)
  else payload
  end
end