Skip to content

Commit 69f2337

Browse files
committed
Adds configuration to describe param
1 parent 0c5ce7e commit 69f2337

File tree

3 files changed

+57
-4
lines changed

3 files changed

+57
-4
lines changed

lib/grape/api.rb

+6-2
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,7 @@ def add_setup(method, *args, &block)
121121

122122
def replay_step_on(instance, setup_step)
123123
return if skip_immediate_run?(instance, setup_step[:args])
124-
instance.send(setup_step[:method], *evaluate_arguments(setup_step[:args], instance.configuration), &setup_step[:block])
124+
instance.send(setup_step[:method], *evaluate_arguments(instance.configuration, *setup_step[:args]), &setup_step[:block])
125125
end
126126

127127
# Skips steps that contain arguments to be lazily executed (on re-mount time)
@@ -130,10 +130,14 @@ def skip_immediate_run?(instance, args)
130130
args.any? { |argument| argument.respond_to?(:lazy?) && argument.lazy? }
131131
end
132132

133-
def evaluate_arguments(args, configuration)
133+
def evaluate_arguments(configuration, *args)
134134
args.map do |argument|
135135
if argument.respond_to?(:lazy?) && argument.lazy?
136136
configuration.fetch(argument.access_keys).evaluate
137+
elsif argument.is_a?(Hash)
138+
argument.map { |key, value| [key, evaluate_arguments(configuration, value).first] }.to_h
139+
elsif argument.is_a?(Array)
140+
evaluate_arguments(configuration, *argument)
137141
else
138142
argument
139143
end

lib/grape/dsl/desc.rb

+5-2
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ module Desc
4949
#
5050
def desc(description, options = {}, &config_block)
5151
if block_given?
52-
config_class = desc_container
52+
config_class = desc_container(configuration.evaluate)
5353

5454
config_class.configure do
5555
description description
@@ -84,7 +84,7 @@ def unset_description_field(field)
8484
end
8585

8686
# Returns an object which configures itself via an instance-context DSL.
87-
def desc_container
87+
def desc_container(endpoint_configuration)
8888
Module.new do
8989
include Grape::Util::StrictHashConfiguration.module(
9090
:summary,
@@ -105,6 +105,9 @@ def desc_container
105105
:security,
106106
:tags
107107
)
108+
config_context.define_singleton_method(:configuration) do
109+
endpoint_configuration
110+
end
108111

109112
def config_context.success(*args)
110113
entity(*args)

spec/grape/api_remount_spec.rb

+46
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,52 @@ def app
8585
get '/new_location'
8686
expect(last_response.body).to eq 'success'
8787
end
88+
89+
context 'when the configuration is the value in a key-arg pair' do
90+
subject(:a_remounted_api) do
91+
Class.new(Grape::API) do
92+
version 'v1', using: :param, parameter: configuration[:version_param]
93+
get 'endpoint' do
94+
'version 1'
95+
end
96+
97+
version 'v2', using: :param, parameter: configuration[:version_param]
98+
get 'endpoint' do
99+
'version 2'
100+
end
101+
end
102+
end
103+
104+
it 'takes the param from the configuration' do
105+
root_api.mount a_remounted_api, with: { version_param: 'param_name' }
106+
107+
get '/endpoint?param_name=v1'
108+
expect(last_response.body).to eq 'version 1'
109+
110+
get '/endpoint?param_name=v2'
111+
expect(last_response.body).to eq 'version 2'
112+
113+
get '/endpoint?wrong_param_name=v2'
114+
expect(last_response.body).to eq 'version 1'
115+
end
116+
end
117+
end
118+
119+
context 'on the DescSCope' do
120+
subject(:a_remounted_api) do
121+
Class.new(Grape::API) do
122+
desc 'The description of this' do
123+
tags ['not_configurable_tag', configuration[:a_configurable_tag]]
124+
end
125+
get 'location' do
126+
'success'
127+
end
128+
end
129+
end
130+
131+
it 'mounts the endpoint with the appropiate tags' do
132+
root_api.mount({ a_remounted_api => 'integer' }, with: { a_configurable_tag: 'a configured tag' })
133+
end
88134
end
89135

90136
context 'on the ParamScope' do

0 commit comments

Comments
 (0)