Class: GH::Response

Inherits:
Object
  • Object
show all
Extended by:
Forwardable
Includes:
Enumerable, Case
Defined in:
lib/gh/response.rb

Overview

Public: Class wrapping low level Github responses.

Delegates safe methods to the parsed body (expected to be an Array or Hash).

Constant Summary collapse

CONTENT_TYPE =

Internal: Content-Type header value expected from Github

"application/json; charset=utf-8"

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(body = "{}", headers = {}, url = nil) ⇒ Response

Internal: Initializes a new instance.

headers - HTTP headers as a Hash body - HTTP body as a String



26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
# File 'lib/gh/response.rb', line 26

def initialize(body = "{}", headers = {}, url = nil)
  @url     = url
  @headers = Hash[headers.map { |k,v| [k.downcase, v] }]

  raise ArgumentError, "unexpected Content-Type #{content_type}" if content_type and content_type != CONTENT_TYPE

  case body
  when respond_to(:to_str)  then @body = body.to_str
  when respond_to(:to_hash) then @data = body.to_hash
  when respond_to(:to_ary)  then @data = body.to_ary
  when nil                  then @data = {}
  else raise ArgumentError, "cannot parse #{body.inspect}"
  end

  @body.force_encoding("utf-8") if @body.respond_to? :force_encoding
  @body ||= MultiJson.encode(@data)
  @data ||= MultiJson.decode(@body)
rescue EncodingError => error
  fail "Invalid encoding in #{url.to_s}, please contact github."
end

Instance Attribute Details

#bodyObject

Returns the value of attribute body.



15
16
17
# File 'lib/gh/response.rb', line 15

def body
  @body
end

#dataObject

Returns the value of attribute data.



15
16
17
# File 'lib/gh/response.rb', line 15

def data
  @data
end

#headersObject

Returns the value of attribute headers.



15
16
17
# File 'lib/gh/response.rb', line 15

def headers
  @headers
end

#urlObject

Returns the value of attribute url.



15
16
17
# File 'lib/gh/response.rb', line 15

def url
  @url
end

Instance Method Details

#==(other) ⇒ Object

Public: …



83
84
85
# File 'lib/gh/response.rb', line 83

def ==(other)
  super or @data == other
end

#dupObject

Public: Duplicates the instance. Will also duplicate some instance variables to behave as expected.

Returns new Response instance.



50
51
52
# File 'lib/gh/response.rb', line 50

def dup
  super.dup_ivars
end

#respond_to?(method) ⇒ Boolean

Public: Returns true or false indicating whether it supports method.

Returns:

  • (Boolean)


60
61
62
63
# File 'lib/gh/response.rb', line 60

def respond_to?(method, *)
  return super unless method.to_s == "to_hash" or method.to_s == "to_ary"
  data.respond_to? method
end

#to_aryObject

Public: Implements to_ary conventions, please check respond_to?(:to_hash).



72
73
74
75
# File 'lib/gh/response.rb', line 72

def to_ary
  return method_missing(__method__) unless respond_to? __method__
  @data.dup.to_ary
end

#to_ghObject

Public: …



78
79
80
# File 'lib/gh/response.rb', line 78

def to_gh
  self
end

#to_hashObject

Public: Implements to_hash conventions, please check respond_to?(:to_hash).



66
67
68
69
# File 'lib/gh/response.rb', line 66

def to_hash
  return method_missing(__method__) unless respond_to? __method__
  @data.dup.to_hash
end

#to_sObject

Public: Returns the response body as a String.



55
56
57
# File 'lib/gh/response.rb', line 55

def to_s
  @body.dup
end