Class: Hyperdrive::Endpoint

Inherits:
Object
  • Object
show all
Defined in:
lib/hyperdrive/endpoint.rb

Class Attribute Summary collapse

Class Method Summary collapse

Class Attribute Details

.env ⇒ Object (readonly)

Returns the value of attribute env.



21
22
23
# File 'lib/hyperdrive/endpoint.rb', line 21

def env
  @env
end

.headers ⇒ Object

Returns the value of attribute headers.



22
23
24
# File 'lib/hyperdrive/endpoint.rb', line 22

def headers
  @headers
end

.media_type ⇒ Object (readonly)

Returns the value of attribute media_type.



21
22
23
# File 'lib/hyperdrive/endpoint.rb', line 21

def media_type
  @media_type
end

.params ⇒ Object (readonly)

Returns the value of attribute params.



21
22
23
# File 'lib/hyperdrive/endpoint.rb', line 21

def params
  @params
end

.request ⇒ Object (readonly)

Returns the value of attribute request.



21
22
23
# File 'lib/hyperdrive/endpoint.rb', line 21

def request
  @request
end

.resource ⇒ Object (readonly)

Returns the value of attribute resource.



21
22
23
# File 'lib/hyperdrive/endpoint.rb', line 21

def resource
  @resource
end

Class Method Details

.before_response ⇒ Object



71
72
73
74
75
# File 'lib/hyperdrive/endpoint.rb', line 71

def self.before_response
  if resource.has_callback?(:before, env['REQUEST_METHOD'], requested_version)
    instance_eval(&resource.callback(:before, env['REQUEST_METHOD'], requested_version))
  end
end

.body ⇒ Object



88
89
90
91
92
# File 'lib/hyperdrive/endpoint.rb', line 88

def self.body
  body = instance_eval(&resource.request_handler(env['REQUEST_METHOD'], requested_version))
  body = '' if env['REQUEST_METHOD'] == 'DELETE'
  body
end

.call(env) ⇒ Object



6
7
8
9
10
11
12
13
14
15
16
# File 'lib/hyperdrive/endpoint.rb', line 6

def self.call(env)
  @env = env
  @request = Rack::Request.new(@env)
  @media_type = env['hyperdrive.media_type']
  @params = env['hyperdrive.params']
  @resource = env['hyperdrive.resource']
  @headers = Hyperdrive::Values.default_headers.dup
  @headers.merge!('Allow' => resource.allowed_methods.join(', '), 'Content-Type' => @media_type)
  before_response
  response.finish
end

.error(status, message) ⇒ Object

Raises:



63
64
65
# File 'lib/hyperdrive/endpoint.rb', line 63

def self.error(status, message)
  raise Errors::HTTPError.new(message, status)
end

.instrument(*args) ⇒ Object



67
68
69
# File 'lib/hyperdrive/endpoint.rb', line 67

def self.instrument(*args)
  hyperdrive.instrument(*args)
end

.json? ⇒ Boolean

Returns:

  • (Boolean)


25
26
27
# File 'lib/hyperdrive/endpoint.rb', line 25

def self.json?
  media_type =~ /json$/ ? true : false
end

.page ⇒ Object



38
39
40
# File 'lib/hyperdrive/endpoint.rb', line 38

def self.page
  env['hyperdrive.page']
end

.per_page ⇒ Object



42
43
44
# File 'lib/hyperdrive/endpoint.rb', line 42

def self.per_page
  env['hyperdrive.per_page']
end

.render(body) ⇒ Object



46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
# File 'lib/hyperdrive/endpoint.rb', line 46

def self.render(body)
  case body
  when Array, Hash
    if json?
      MultiJson.dump(body)
    else
      puts "Hyperdrive::Endpoint: Can't serialize response automatically"
      raise Errors::NoResponse.new
    end
  when String
    body
  else
    puts "Hyperdrive::Endpoint: Coerceing response to string. Probably not what you want"
    body.to_s
  end
end

.requested_version ⇒ Object



33
34
35
36
# File 'lib/hyperdrive/endpoint.rb', line 33

def self.requested_version
  regex = /.*\/vnd.#{hyperdrive.config[:vendor]}\..*\.(.*?)\+.*$/
  regex.match(media_type) { |version| version.captures.first } or resource.latest_version(env['REQUEST_METHOD'])
end

.response ⇒ Object



94
95
96
# File 'lib/hyperdrive/endpoint.rb', line 94

def self.response
  ::Rack::Response.new(render(body), status, headers)
end

.status ⇒ Object



77
78
79
80
81
82
83
84
85
86
# File 'lib/hyperdrive/endpoint.rb', line 77

def self.status
  case env['REQUEST_METHOD']
  when 'POST'
    201
  when 'DELETE'
    204
  else
    200
  end
end

.xml? ⇒ Boolean

Returns:

  • (Boolean)


29
30
31
# File 'lib/hyperdrive/endpoint.rb', line 29

def self.xml?
  media_type =~ /xml$/ ? true : false
end