Class: Grape::API

Inherits:
Object
  • Object
show all
Extended by:
ActiveSupport::Autoload
Defined in:
lib/grape/api.rb,
lib/grape.rb,
lib/grape/api/helpers.rb,
lib/grape/api/instance.rb

Overview

The API class is the primary entry point for creating Grape APIs. Users should subclass this class in order to build an API.

Defined Under Namespace

Modules: Helpers Classes: Boolean, Instance

Constant Summary collapse

NON_OVERRIDABLE =

Class methods that we want to call on the API rather than on the API object

(Class.new.methods + %i[call call! configuration compile! inherited]).freeze

Class Attribute Summary collapse

Class Method Summary collapse

Class Attribute Details

.base_instanceObject

Returns the value of attribute base_instance.


26
27
28
# File 'lib/grape/api.rb', line 26

def base_instance
  @base_instance
end

.instancesObject

Returns the value of attribute instances.


26
27
28
# File 'lib/grape/api.rb', line 26

def instances
  @instances
end

Class Method Details

.call(*args, &block) ⇒ 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. NOTE: This will only be called on an API directly mounted on RACK


80
81
82
# File 'lib/grape/api.rb', line 80

def call(*args, &block)
  instance_for_rack.call(*args, &block)
end

.compile!Object


130
131
132
133
# File 'lib/grape/api.rb', line 130

def compile!
  require 'grape/eager_load'
  instance_for_rack.compile! # See API::Instance.compile!
end

.configureObject

Configure an API from the outside. If a block is given, it'll pass a configuration hash to the block which you can use to configure your API. If no block is given, returns the configuration hash. The configuration set here is accessible from inside an API with `configuration` as normal.


65
66
67
68
69
70
71
72
73
# File 'lib/grape/api.rb', line 65

def configure
  config = @base_instance.configuration
  if block_given?
    yield config
    self
  else
    config
  end
end

.const_missing(*args) ⇒ Object

Alleviates problems with autoloading by tring to search for the constant


85
86
87
88
89
90
91
# File 'lib/grape/api.rb', line 85

def const_missing(*args)
  if base_instance.const_defined?(*args)
    base_instance.const_get(*args)
  else
    super
  end
end

.inherited(api) ⇒ Object

When inherited, will create a list of all instances (times the API was mounted) It will listen to the setup required to mount that endpoint, and replicate it on any new instance


35
36
37
38
39
40
# File 'lib/grape/api.rb', line 35

def inherited(api)
  super

  api.initial_setup(Grape::API == self ? Grape::API::Instance : @base_instance)
  api.override_all_methods!
end

.initial_setup(base_instance_parent) ⇒ Object

Initialize the instance variables on the remountable class, and the base_instance an instance that will be used to create the set up but will not be mounted


44
45
46
47
48
49
# File 'lib/grape/api.rb', line 44

def initial_setup(base_instance_parent)
  @instances = []
  @setup = Set.new
  @base_parent = base_instance_parent
  @base_instance = mount_instance
end

.method_missing(method, *args, &block) ⇒ Object


121
122
123
124
125
126
127
128
# File 'lib/grape/api.rb', line 121

def method_missing(method, *args, &block)
  # If there's a missing method, it may be defined on the base_instance instead.
  if respond_to_missing?(method)
    base_instance.send(method, *args, &block)
  else
    super
  end
end

.mount_instance(**opts) ⇒ Object

The remountable class can have a configuration hash to provide some dynamic class-level variables. For instance, a description could be done using: `desc configuration` if it may vary depending on where the endpoint is mounted. Use with care, if you find yourself using configuration too much, you may actually want to provide a new API rather than remount it.


97
98
99
100
101
102
103
# File 'lib/grape/api.rb', line 97

def mount_instance(**opts)
  instance = Class.new(@base_parent)
  instance.configuration = Grape::Util::EndpointConfiguration.new(opts[:configuration] || {})
  instance.base = self
  replay_setup_on(instance)
  instance
end

.new(*args, &block) ⇒ Object

Rather than initializing an object of type Grape::API, create an object of type Instance


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

def new(*args, &block)
  base_instance.new(*args, &block)
end

.override_all_methods!Object

Redefines all methods so that are forwarded to add_setup and be recorded


52
53
54
55
56
57
58
# File 'lib/grape/api.rb', line 52

def override_all_methods!
  (base_instance.methods - NON_OVERRIDABLE).each do |method_override|
    define_singleton_method(method_override) do |*args, &block|
      add_setup(method_override, *args, &block)
    end
  end
end

.replay_setup_on(instance) ⇒ Object

Replays the set up to produce an API as defined in this class, can be called on classes that inherit from Grape::API


107
108
109
110
111
# File 'lib/grape/api.rb', line 107

def replay_setup_on(instance)
  @setup.each do |setup_step|
    replay_step_on(instance, setup_step)
  end
end

.respond_to?(method, include_private = false) ⇒ Boolean

Returns:


113
114
115
# File 'lib/grape/api.rb', line 113

def respond_to?(method, include_private = false)
  super(method, include_private) || base_instance.respond_to?(method, include_private)
end

.respond_to_missing?(method, include_private = false) ⇒ Boolean

Returns:


117
118
119
# File 'lib/grape/api.rb', line 117

def respond_to_missing?(method, include_private = false)
  base_instance.respond_to?(method, include_private)
end