Class: Grape::API
- Inherits:
-
Object
- Object
- Grape::API
- 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
%i[call call! configuration compile! inherited].freeze
Class Attribute Summary collapse
-
.base_instance ⇒ Object
Returns the value of attribute base_instance.
-
.instances ⇒ Object
Returns the value of attribute instances.
Class Method Summary collapse
-
.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.
- .compile! ⇒ Object
-
.configure ⇒ Object
Configure an API from the outside.
-
.const_missing(*args) ⇒ Object
Alleviates problems with autoloading by tring to search for the constant.
-
.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.
-
.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.
- .method_missing(method, *args, &block) ⇒ Object
-
.mount_instance(**opts) ⇒ Object
The remountable class can have a configuration hash to provide some dynamic class-level variables.
-
.new(*args, &block) ⇒ Object
Rather than initializing an object of type Grape::API, create an object of type Instance.
-
.override_all_methods! ⇒ Object
Redefines all methods so that are forwarded to add_setup and be recorded.
-
.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.
- .respond_to?(method, include_private = false) ⇒ Boolean
- .respond_to_missing?(method, include_private = false) ⇒ Boolean
Class Attribute Details
.base_instance ⇒ Object
Returns the value of attribute base_instance.
26 27 28 |
# File 'lib/grape/api.rb', line 26 def base_instance @base_instance end |
.instances ⇒ Object
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 |
.configure ⇒ Object
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 - Class.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
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
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 |