Class: Grape::API::Instance

Inherits:
Object
  • Object
show all
Includes:
DSL::API
Defined in:
lib/grape/api/instance.rb,
lib/grape/validations/validators/coerce.rb

Overview

The API Instance class, is the engine behind Grape::API. Each class that inherits from this will represent a different API instance

Constant Summary collapse

LOCK =

A class-level lock to ensure the API is not compiled by multiple threads simultaneously within the same process.

Mutex.new
Boolean =
Grape::API::Boolean

Class Attribute Summary collapse

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initializeInstance

Builds the routes from the defined endpoints, effectively compiling this API into a usable form.



154
155
156
157
158
159
160
161
162
163
# File 'lib/grape/api/instance.rb', line 154

def initialize
  @router = Router.new
  add_head_not_allowed_methods_and_options_methods
  self.class.endpoints.each do |endpoint|
    endpoint.mount_in(@router)
  end

  @router.compile!
  @router.freeze
end

Class Attribute Details

.baseObject

Returns the value of attribute base.



14
15
16
# File 'lib/grape/api/instance.rb', line 14

def base
  @base
end

.configurationObject

Returns the value of attribute configuration.



15
16
17
# File 'lib/grape/api/instance.rb', line 15

def configuration
  @configuration
end

.instanceObject (readonly)

Returns the value of attribute instance.



13
14
15
# File 'lib/grape/api/instance.rb', line 13

def instance
  @instance
end

Instance Attribute Details

#routerObject (readonly)

Returns the value of attribute router.



150
151
152
# File 'lib/grape/api/instance.rb', line 150

def router
  @router
end

Class Method Details

.base_instance?Boolean

Returns:



34
35
36
# File 'lib/grape/api/instance.rb', line 34

def base_instance?
  self == base.base_instance
end

.call(env) ⇒ Object

This is the interface point between Rack and Grape; it accepts a request from Rack and ultimately returns an array of three values: the status, the headers, and the body. See [the rack specification] (www.rubydoc.info/github/rack/rack/master/file/SPEC) for more.



64
65
66
67
# File 'lib/grape/api/instance.rb', line 64

def call(env)
  compile!
  call!(env)
end

.call!(env) ⇒ Object

A non-synchronized version of ::call.



70
71
72
# File 'lib/grape/api/instance.rb', line 70

def call!(env)
  instance.call(env)
end

.cascade(value = nil) ⇒ Object

Some requests may return a HTTP 404 error if grape cannot find a matching route. In this case, Grape::Router adds a X-Cascade header to the response and sets it to ‘pass’, indicating to grape’s parents they should keep looking for a matching route on other resources.

In some applications (e.g. mounting grape on rails), one might need to trap errors from reaching upstream. This is effectivelly done by unsetting X-Cascade. Default :cascade is true.



75
76
77
78
79
80
81
# File 'lib/grape/api/instance.rb', line 75

def cascade(value = nil)
  if value.nil?
    inheritable_setting.namespace_inheritable.key?(:cascade) ? !namespace_inheritable(:cascade).nil? : true
  else
    namespace_inheritable(:cascade, value)
  end
end

.change!Object

Wipe the compiled API so we can recompile after changes were made.



56
57
58
# File 'lib/grape/api/instance.rb', line 56

def change!
  @instance = nil
end

.compileObject

Parses the API’s definition and compiles it into an instance of Grape::API.



51
52
53
# File 'lib/grape/api/instance.rb', line 51

def compile
  @instance ||= new
end

.compile!Object



83
84
85
86
# File 'lib/grape/api/instance.rb', line 83

def compile!
  return if instance
  LOCK.synchronize { compile unless instance }
end

.given(conditional_option, &block) ⇒ Object



17
18
19
# File 'lib/grape/api/instance.rb', line 17

def given(conditional_option, &block)
  evaluate_as_instance_with_configuration(block, lazy: true) if conditional_option && block_given?
end

.mounted(&block) ⇒ Object



21
22
23
# File 'lib/grape/api/instance.rb', line 21

def mounted(&block)
  evaluate_as_instance_with_configuration(block, lazy: true)
end

.recognize_path(path) ⇒ Object

see Grape::Router#recognize_path



89
90
91
92
# File 'lib/grape/api/instance.rb', line 89

def recognize_path(path)
  compile!
  instance.router.recognize_path(path)
end

.reset!Object

Clears all defined routes, endpoints, etc., on this API.



43
44
45
46
47
# File 'lib/grape/api/instance.rb', line 43

def reset!
  reset_endpoints!
  reset_routes!
  reset_validations!
end

.to_sObject



30
31
32
# File 'lib/grape/api/instance.rb', line 30

def to_s
  (base && base.to_s) || super
end

Instance Method Details

#call(env) ⇒ Object

Handle a request. See Rack documentation for what ‘env` is.



166
167
168
169
170
# File 'lib/grape/api/instance.rb', line 166

def call(env)
  result = @router.call(env)
  result[1].delete(Grape::Http::Headers::X_CASCADE) unless cascade?
  result
end

#cascade?Boolean

Some requests may return a HTTP 404 error if grape cannot find a matching route. In this case, Grape::Router adds a X-Cascade header to the response and sets it to ‘pass’, indicating to grape’s parents they should keep looking for a matching route on other resources.

In some applications (e.g. mounting grape on rails), one might need to trap errors from reaching upstream. This is effectivelly done by unsetting X-Cascade. Default :cascade is true.

Returns:



180
181
182
183
184
# File 'lib/grape/api/instance.rb', line 180

def cascade?
  return self.class.namespace_inheritable(:cascade) if self.class.inheritable_setting.namespace_inheritable.key?(:cascade)
  return self.class.namespace_inheritable(:version_options)[:cascade] if self.class.namespace_inheritable(:version_options) && self.class.namespace_inheritable(:version_options).key?(:cascade)
  true
end