module Grape::DSL::Helpers
def define_boolean_in_mod(mod)
def define_boolean_in_mod(mod) return if defined? mod::Boolean mod.const_set(:Boolean, Grape::API::Boolean) end
def helpers(*new_modules, &block)
- Example: Include many modules -
Example: Define some helpers. -
Parameters:
-
block(Block) -- optional block of methods to include -
new_modules(Array) -- optional array of modules to include
def helpers(*new_modules, &block) include_new_modules(new_modules) include_block(block) include_all_in_scope if !block && new_modules.empty? end
def include_all_in_scope
def include_all_in_scope mod = Module.new namespace_stackable(:helpers).each { |mod_to_include| mod.include mod_to_include } change! mod end
def include_block(block)
def include_block(block) return unless block mod = Module.new make_inclusion(mod) { mod.class_eval(&block) } end
def include_new_modules(modules)
def include_new_modules(modules) return if modules.empty? modules.each { |mod| make_inclusion(mod) } end
def inject_api_helpers_to_mod(mod, &block)
def inject_api_helpers_to_mod(mod, &block) mod.extend(BaseHelper) unless mod.is_a?(BaseHelper) yield if block warn_on_endpoint_overrides(mod) if Grape.config.warn_on_helper_overrides mod.api_changed(self) end
def make_inclusion(mod, &)
def make_inclusion(mod, &) define_boolean_in_mod(mod) inject_api_helpers_to_mod(mod, &) inheritable_setting.namespace_stackable[:helpers] = mod end
def warn_on_endpoint_overrides(mod)
surprise when the framework gains a method that already collides
instance methods — usually intentional, but a common source of
singleton class and therefore take precedence over +Endpoint+
method on +Grape::Endpoint+. Helpers are mixed into the endpoint's
warning to +$stderr+ for any helper method that masks an instance
When +Grape.config.warn_on_helper_overrides+ is enabled, emit a
def warn_on_endpoint_overrides(mod) overridden = mod.instance_methods(false).select { |m| Grape::Endpoint.method_defined?(m) } return if overridden.empty? overridden.each do |name| warn( "Grape: helper method `#{name}` overrides Grape::Endpoint##{name}. " \ 'The helper takes precedence. To use the framework implementation, remove the helper. ' \ 'Silence this warning by setting Grape.config.warn_on_helper_overrides = false.' ) end end