Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feature(#2290): Use a param value as the default value of other param #2371

Merged
merged 4 commits into from
Nov 19, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
### 2.0.1 (Next)
### 2.1.0 (Next)

#### Features

* [#2371](https://github.com/ruby-grape/grape/pull/2371): Use a param value as the `default` value of other param - [@jcagarcia](https://github.com/jcagarcia).
* Your contribution here.

#### Fixes
Expand Down
11 changes: 10 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -160,7 +160,7 @@ content negotiation, versioning and much more.

## Stable Release

You're reading the documentation for the next release of Grape, which should be **2.0.1**.
You're reading the documentation for the next release of Grape, which should be **2.1.0**.
Please read [UPGRADING](UPGRADING.md) when upgrading from a previous version.
The current stable release is [2.0.0](https://github.com/ruby-grape/grape/blob/v2.0.0/README.md).

Expand Down Expand Up @@ -1242,6 +1242,15 @@ params do
end
```

You can use the value of one parameter as the default value of some other parameter. In this case, if the `primary_color` parameter is not provided, it will have the same value as the `color` one. If both of them not provided, both of them will have `blue` value.

```ruby
params do
optional :color, type: String, default: 'blue'
optional :primary_color, type: String, default: -> (params) { params[:color] }
end
```

### Supported Parameter Types

The following are all valid types, supported out of the box by Grape:
Expand Down
6 changes: 5 additions & 1 deletion lib/grape/validations/validators/default_validator.rb
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,11 @@ def initialize(attrs, options, required, scope, **opts)

def validate_param!(attr_name, params)
params[attr_name] = if @default.is_a? Proc
@default.call
if @default.parameters.empty?
@default.call
else
@default.call(params)
end
elsif @default.frozen? || [email protected]?
@default
else
Expand Down
2 changes: 1 addition & 1 deletion lib/grape/version.rb
Original file line number Diff line number Diff line change
Expand Up @@ -2,5 +2,5 @@

module Grape
# The current version of Grape.
VERSION = '2.0.1'
VERSION = '2.1.0'
end
26 changes: 26 additions & 0 deletions spec/grape/validations/validators/default_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,19 @@
get '/another_nested_optional_array' do
{ root: params[:root] }
end

params do
requires :foo
optional :bar, default: ->(params) { params[:foo] }
optional :qux, default: ->(params) { params[:bar] }
end
get '/default_values_from_other_params' do
{
foo: params[:foo],
bar: params[:bar],
qux: params[:qux]
}
end
end
end

Expand Down Expand Up @@ -460,4 +473,17 @@ def app
expect(JSON.parse(last_response.body)).to eq(expected)
end
end

it 'sets default value for optional params using other params values' do
expected_foo_value = 'foo-value'

get("/default_values_from_other_params?foo=#{expected_foo_value}")

expect(last_response.status).to eq(200)
expect(last_response.body).to eq({
foo: expected_foo_value,
bar: expected_foo_value,
qux: expected_foo_value
}.to_json)
end
end