Class: Travis::Client::Session

Inherits:
Object
  • Object
show all
Includes:
Methods
Defined in:
lib/travis/client/session.rb

Constant Summary collapse

PRIMITIVE =
[nil, false, true].freeze
SSL_OPTIONS =
{ ca_file: Tools::Assets['cacert.pem'] }

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from Methods

#account, #accounts, #api_endpoint, #api_endpoint=, #artifact, #broadcasts, #build, #cancel, #explicit_api_endpoint?, #github_auth, #hooks, #job, #lint, #listen, #logout, #regenerate_token, #remove_token, #repo, #repos, #restart, #user

Constructor Details

#initialize(options = Travis::Client::COM_URI) ⇒ Session

Returns a new instance of Session.

Raises:

  • (ArgumentError)


28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
# File 'lib/travis/client/session.rb', line 28

def initialize(options = Travis::Client::COM_URI)
  @headers         = {}
  @cache           = {}
  @instruments     = []
  @agent_info      = []
  @config          = nil
  @faraday_adapter = defined?(Typhoeus) ? :typhoeus : :net_http
  @ssl             = SSL_OPTIONS

  options = { uri: options } unless options.respond_to? :each_pair
  options.each_pair { |key, value| public_send("#{key}=", value) }

  raise ArgumentError, 'neither :uri nor :connection specified' unless connection

  headers['Accept'] = 'application/vnd.travis-ci.2+json'
  set_user_agent
  check_ssl
end

Instance Attribute Details

#access_tokenObject

Returns the value of attribute access_token.



25
26
27
# File 'lib/travis/client/session.rb', line 25

def access_token
  @access_token
end

#agent_infoObject

Returns the value of attribute agent_info.



25
26
27
# File 'lib/travis/client/session.rb', line 25

def agent_info
  @agent_info
end

#connectionObject

Returns the value of attribute connection.



25
26
27
# File 'lib/travis/client/session.rb', line 25

def connection
  @connection
end

#debug_httpObject

Returns the value of attribute debug_http.



26
27
28
# File 'lib/travis/client/session.rb', line 26

def debug_http
  @debug_http
end

#faraday_adapterObject

Returns the value of attribute faraday_adapter.



25
26
27
# File 'lib/travis/client/session.rb', line 25

def faraday_adapter
  @faraday_adapter
end

#headersObject

Returns the value of attribute headers.



25
26
27
# File 'lib/travis/client/session.rb', line 25

def headers
  @headers
end

#instrumentsObject (readonly)

Returns the value of attribute instruments.



25
26
27
# File 'lib/travis/client/session.rb', line 25

def instruments
  @instruments
end

#sslObject

Returns the value of attribute ssl.



25
26
27
# File 'lib/travis/client/session.rb', line 25

def ssl
  @ssl
end

Instance Method Details

#clear_cacheObject



259
260
261
262
263
# File 'lib/travis/client/session.rb', line 259

def clear_cache
  reset_entities
  clear_find_cache
  self
end

#clear_cache!Object



265
266
267
268
269
# File 'lib/travis/client/session.rb', line 265

def clear_cache!
  reset_entities
  @cache.clear
  self
end

#configObject



143
144
145
# File 'lib/travis/client/session.rb', line 143

def config
  @config ||= get_raw('/config')['config'] || {}
end

#delete(*args) ⇒ Object



180
181
182
# File 'lib/travis/client/session.rb', line 180

def delete(*args)
  load delete_raw(*args)
end

#delete_raw(*args) ⇒ Object



212
213
214
# File 'lib/travis/client/session.rb', line 212

def delete_raw(*args)
  raw(:delete, *args)
end

#find_many(entity, args = {}) ⇒ Object



105
106
107
108
109
# File 'lib/travis/client/session.rb', line 105

def find_many(entity, args = {})
  raise Travis::Client::Error, "cannot fetch #{entity}" unless entity.respond_to?(:many) && entity.many

  cached(entity, :many, args) { fetch_many(entity, args) }
end

#find_one(entity, id = nil) ⇒ Object



98
99
100
101
102
103
# File 'lib/travis/client/session.rb', line 98

def find_one(entity, id = nil)
  raise Travis::Client::Error, "cannot fetch #{entity}" unless entity.respond_to?(:many) && entity.many
  return create_entity(entity, entity.id_field => id) if entity.id? id

  cached(entity, :by, id) { fetch_one(entity, id) }
end

#find_one_or_many(entity, args = nil) ⇒ Object



111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
# File 'lib/travis/client/session.rb', line 111

def find_one_or_many(entity, args = nil)
  raise Travis::Client::Error, "cannot fetch #{entity}" unless entity.respond_to?(:many) && entity.many

  cached(entity, :one_or_many, args) do
    path = "/#{entity.many}"
    unless args.is_a? Hash
      path = "#{path}/#{args}"
      args = {}
    end
    result     = get(path, args)
    one        = result[entity.one]

    if result.include? entity.many
      Array(one) + Array(result[entity.many])
    else
      one
    end
  end
end

#get(*args) ⇒ Object



176
177
178
# File 'lib/travis/client/session.rb', line 176

def get(*args)
  load get_raw(*args)
end

#get_raw(*args) ⇒ Object



196
197
198
# File 'lib/travis/client/session.rb', line 196

def get_raw(*args)
  raw(:get, *args)
end

#inspectObject



255
256
257
# File 'lib/travis/client/session.rb', line 255

def inspect
  "#<#{self.class}: #{uri}>"
end

#instrument(&block) ⇒ Object



275
276
277
# File 'lib/travis/client/session.rb', line 275

def instrument(&block)
  instruments << block
end

#load(data) ⇒ Object



147
148
149
150
151
152
153
154
# File 'lib/travis/client/session.rb', line 147

def load(data)
  result = {}
  (data || {}).each_pair do |key, value|
    entity      = load_entity(key, value)
    result[key] = entity if entity
  end
  result
end

#load_entity(key, value) ⇒ Object



156
157
158
159
160
161
162
163
164
# File 'lib/travis/client/session.rb', line 156

def load_entity(key, value)
  type = Entity.subclass_for(key)
  if value.respond_to? :to_ary
    value.to_ary.map { |e| create_entity(type, e) }
  else
    create_entity(type, value)
  end
rescue IndexError
end

#patch(*args) ⇒ Object



184
185
186
# File 'lib/travis/client/session.rb', line 184

def patch(*args)
  load patch_raw(*args)
end

#patch_raw(*args) ⇒ Object



208
209
210
# File 'lib/travis/client/session.rb', line 208

def patch_raw(*args)
  raw(:patch, *args)
end

#post(*args) ⇒ Object



188
189
190
# File 'lib/travis/client/session.rb', line 188

def post(*args)
  load post_raw(*args)
end

#post_raw(*args) ⇒ Object



200
201
202
# File 'lib/travis/client/session.rb', line 200

def post_raw(*args)
  raw(:post, *args)
end

#preload(list) ⇒ Object



166
167
168
169
170
171
172
173
174
# File 'lib/travis/client/session.rb', line 166

def preload(list)
  list.group_by(&:class).each do |type, instances|
    next unless type.preloadable?

    ids = instances.map { |e| e.id unless e.complete? }.compact
    find_many(type, ids:) if ids.any?
  end
  list
end

#private_channels?Boolean

Returns:

  • (Boolean)


279
280
281
# File 'lib/travis/client/session.rb', line 279

def private_channels?
  !!config['pusher']['private']
end

#put(*args) ⇒ Object



192
193
194
# File 'lib/travis/client/session.rb', line 192

def put(*args)
  load put_raw(*args)
end

#put_raw(*args) ⇒ Object



204
205
206
# File 'lib/travis/client/session.rb', line 204

def put_raw(*args)
  raw(:put, *args)
end

#raw(verb, url, *args) ⇒ Object



216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
# File 'lib/travis/client/session.rb', line 216

def raw(verb, url, *args)
  url     = url.sub(%r{^/}, '')
  result  = instrumented(verb.to_s.upcase, url, *args) do
    if url !~ (/^https?:/) || url.start_with?(api_endpoint)
      connection.public_send(verb, url, *args)
    else
      Faraday.public_send(verb, url, *args) { |r| r.headers.delete('Authorization') }
    end
  end

  case result.status
  when 0             then raise Travis::Client::SSLError, 'SSL error: could not verify peer'
  when 200..299      then begin
    JSON.parse(result.body)
  rescue StandardError
    result.body
  end
  when 301, 303      then raw(:get, result.headers['Location'])
  when 302, 307, 308 then raw(verb, result.headers['Location'])
  when 401           then raise Travis::Client::NotLoggedIn, 'not logged in'
  when 403
    body = begin
      JSON.parse(result.body)
    rescue StandardError
      {}
    end
    raise Travis::Client::RepositoryMigrated, body['error_message'] if body['error_type'] == 'migrated_repository'

    raise Travis::Client::NotLoggedIn, 'invalid access token'

  when 404           then raise Travis::Client::NotFound,         result.body
  when 422           then raise Travis::Client::ValidationFailed, result.body
  when 400..499      then raise Travis::Client::Error,            format('%s: %p', result.status, result.body)
  when 500..599      then raise Travis::Client::Error,
                                format('server error (%s: %p)', result.status, result.body)
  else raise Travis::Client::Error, "unhandled status code #{result.status}"
  end
end

#reload(entity) ⇒ Object



136
137
138
139
140
141
# File 'lib/travis/client/session.rb', line 136

def reload(entity)
  reset(entity)
  result = fetch_one(entity.class, entity.id)
  entity.update_attributes(result.attributes) if result.attributes != entity.attributes
  result
end

#reset(entity) ⇒ Object



131
132
133
134
# File 'lib/travis/client/session.rb', line 131

def reset(entity)
  entity.attributes.clear
  entity
end

#sessionObject



271
272
273
# File 'lib/travis/client/session.rb', line 271

def session
  self
end

#uriObject



47
48
49
# File 'lib/travis/client/session.rb', line 47

def uri
  connection.url_prefix.to_s if connection
end

#uri=(uri) ⇒ Object



61
62
63
64
65
66
67
68
69
# File 'lib/travis/client/session.rb', line 61

def uri=(uri)
  clear_cache!
  self.connection = Faraday.new(url: uri, ssl:) do |faraday|
    faraday.request :url_encoded
    faraday.request :retry
    faraday.response :logger if debug_http
    faraday.adapter(*faraday_adapter)
  end
end