class Travis::Client::Connection
Constants
- DEFAULT_HEADERS
- Env
- PREDEFINED
Attributes
access_token[R]
actions[R]
error_types[R]
http_factory[R]
mixin[R]
request_headers[R]
resource_types[R]
service_index[R]
Public Class Methods
new(endpoint: Travis.default_endpoint, request_headers: {}, access_token: nil, http_factory: HTTP) { |self| ... }
click to toggle source
# File lib/travis/client/connection.rb, line 18 def initialize(endpoint: Travis.default_endpoint, request_headers: {}, access_token: nil, http_factory: HTTP) @request_headers, @mixin = DEFAULT_HEADERS.merge(request_headers).freeze, Module.new @error_types, @resource_types, @actions = {}, {}, {} @before_callbacks, @after_callbacks = [], [] @session_factory, @http_factory = Class.new(Session), http_factory @access_token = access_token @default_session = create_session yield self if block_given? load_resource(PREDEFINED, endpoint) @service_index = @default_session.request(:get, endpoint) load_resource(service_index.resources, endpoint) load_errors(service_index.errors) define_actions @session_factory.include(@mixin) end
Public Instance Methods
action(resource_type, action_name)
click to toggle source
# File lib/travis/client/connection.rb, line 58 def action(resource_type, action_name) actions. fetch(resource_type.to_s) { raise ArgumentError, 'unknown resource type' }. fetch(action_name.to_s) { raise ArgumentError, 'unknown action' } end
after_request(callback = Proc.new)
click to toggle source
# File lib/travis/client/connection.rb, line 46 def after_request(callback = Proc.new) @after_callbacks << callback end
before_request(callback = Proc.new)
click to toggle source
# File lib/travis/client/connection.rb, line 42 def before_request(callback = Proc.new) @before_callbacks << callback end
create_session(**options)
click to toggle source
# File lib/travis/client/connection.rb, line 37 def create_session(**options) options[:access_token] ||= access_token @session_factory.new(self, **options) end
notify(method, uri, params) { || ... }
click to toggle source
# File lib/travis/client/connection.rb, line 50 def notify(method, uri, params) env = Env.new(method, uri, params, nil, {}) @before_callbacks.each { |c| c.call(env) } env.response = yield @after_callbacks.each { |c| c.call(env) } env.response end
Private Instance Methods
add_action(base_href, type, name, templates)
click to toggle source
# File lib/travis/client/connection.rb, line 64 def add_action(base_href, type, name, templates) action = Action.new(base_href, type, name) actions[type] ||= {} actions[type][name] = action templates.each { |t| action.add_template(t.request_method, t.uri_template, t.accepted_params)} end
define_actions()
click to toggle source
# File lib/travis/client/connection.rb, line 92 def define_actions actions.each do |resource_type, mapping| factory = resource_types[resource_type] mapping.each do |name, action| factory.add_action(resource_type, name, action) action.accepted_types.each { |t| resource_types[t].add_related_action(t, resource_type, name, action) if t != resource_type and resource_types.include? t } @mixin.module_eval { define_method("#{resource_type}_#{name}") { |params={}| action.call(session, params) }} unless @mixin.method_defined? "#{resource_type}_#{name}" @mixin.module_eval { define_method("#{name}_#{resource_type}") { |params={}| action.call(session, params) }} unless @mixin.method_defined? "#{name}_#{resource_type}" end end end
load_errors(errors)
click to toggle source
# File lib/travis/client/connection.rb, line 84 def load_errors(errors) errors.each do |type, definition| factory = error_types.fetch(type) { error_types[type] = Class.new(resource_types.fetch('error')) } Array(definition['additional_attributes']).each { |attribute| factory.add_attribute(attribute) } factory.default_message = definition['default_message'] end end
load_resource(resources, base_href)
click to toggle source
# File lib/travis/client/connection.rb, line 71 def load_resource(resources, base_href) resources.each do |type, definition| factory = resource_types.fetch(type) { resource_types[type] = Class.new(superclass_for(type, definition)) } Array(definition['attributes']).each { |attribute| factory.add_attribute(attribute) } Hash(definition['actions']).each { |key, value| add_action(base_href, type, key, Array(value)) } end end
superclass_for(type, definition)
click to toggle source
# File lib/travis/client/connection.rb, line 79 def superclass_for(type, definition) return Error if type == 'error' definition['attributes'] == [type] ? Collection : Entity end