grape 1.1.0 → 1.2.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +128 -43
- data/LICENSE +1 -1
- data/README.md +394 -47
- data/UPGRADING.md +111 -0
- data/grape.gemspec +3 -1
- data/lib/grape.rb +98 -66
- data/lib/grape/api.rb +136 -175
- data/lib/grape/api/instance.rb +280 -0
- data/lib/grape/config.rb +32 -0
- data/lib/grape/dsl/callbacks.rb +20 -0
- data/lib/grape/dsl/desc.rb +39 -7
- data/lib/grape/dsl/inside_route.rb +12 -6
- data/lib/grape/dsl/middleware.rb +7 -0
- data/lib/grape/dsl/parameters.rb +9 -4
- data/lib/grape/dsl/routing.rb +5 -1
- data/lib/grape/dsl/validations.rb +4 -3
- data/lib/grape/eager_load.rb +18 -0
- data/lib/grape/endpoint.rb +42 -26
- data/lib/grape/error_formatter.rb +1 -1
- data/lib/grape/exceptions/base.rb +9 -1
- data/lib/grape/exceptions/invalid_response.rb +9 -0
- data/lib/grape/exceptions/validation_errors.rb +4 -2
- data/lib/grape/formatter.rb +1 -1
- data/lib/grape/locale/en.yml +2 -0
- data/lib/grape/middleware/auth/base.rb +2 -4
- data/lib/grape/middleware/base.rb +2 -0
- data/lib/grape/middleware/error.rb +9 -4
- data/lib/grape/middleware/helpers.rb +10 -0
- data/lib/grape/middleware/stack.rb +1 -1
- data/lib/grape/middleware/versioner/header.rb +4 -4
- data/lib/grape/parser.rb +1 -1
- data/lib/grape/request.rb +1 -1
- data/lib/grape/router/attribute_translator.rb +2 -0
- data/lib/grape/router/route.rb +2 -2
- data/lib/grape/util/base_inheritable.rb +34 -0
- data/lib/grape/util/endpoint_configuration.rb +6 -0
- data/lib/grape/util/inheritable_values.rb +5 -25
- data/lib/grape/util/lazy_block.rb +25 -0
- data/lib/grape/util/lazy_value.rb +95 -0
- data/lib/grape/util/reverse_stackable_values.rb +7 -36
- data/lib/grape/util/stackable_values.rb +19 -22
- data/lib/grape/validations/attributes_iterator.rb +5 -3
- data/lib/grape/validations/multiple_attributes_iterator.rb +11 -0
- data/lib/grape/validations/params_scope.rb +20 -14
- data/lib/grape/validations/single_attribute_iterator.rb +13 -0
- data/lib/grape/validations/types/custom_type_coercer.rb +1 -1
- data/lib/grape/validations/types/file.rb +1 -1
- data/lib/grape/validations/validator_factory.rb +6 -11
- data/lib/grape/validations/validators/all_or_none.rb +6 -13
- data/lib/grape/validations/validators/as.rb +2 -3
- data/lib/grape/validations/validators/at_least_one_of.rb +5 -13
- data/lib/grape/validations/validators/base.rb +11 -10
- data/lib/grape/validations/validators/coerce.rb +4 -0
- data/lib/grape/validations/validators/default.rb +1 -1
- data/lib/grape/validations/validators/exactly_one_of.rb +6 -23
- data/lib/grape/validations/validators/multiple_params_base.rb +14 -10
- data/lib/grape/validations/validators/mutual_exclusion.rb +6 -18
- data/lib/grape/validations/validators/same_as.rb +23 -0
- data/lib/grape/version.rb +1 -1
- data/spec/grape/api/defines_boolean_in_params_spec.rb +37 -0
- data/spec/grape/api/routes_with_requirements_spec.rb +59 -0
- data/spec/grape/api_remount_spec.rb +466 -0
- data/spec/grape/api_spec.rb +379 -1
- data/spec/grape/config_spec.rb +17 -0
- data/spec/grape/dsl/desc_spec.rb +40 -16
- data/spec/grape/dsl/middleware_spec.rb +8 -0
- data/spec/grape/dsl/routing_spec.rb +10 -0
- data/spec/grape/endpoint_spec.rb +40 -4
- data/spec/grape/exceptions/base_spec.rb +65 -0
- data/spec/grape/exceptions/invalid_response_spec.rb +11 -0
- data/spec/grape/exceptions/validation_errors_spec.rb +6 -4
- data/spec/grape/integration/rack_spec.rb +22 -6
- data/spec/grape/middleware/auth/dsl_spec.rb +3 -3
- data/spec/grape/middleware/base_spec.rb +8 -0
- data/spec/grape/middleware/exception_spec.rb +1 -1
- data/spec/grape/middleware/formatter_spec.rb +15 -5
- data/spec/grape/middleware/versioner/header_spec.rb +6 -0
- data/spec/grape/named_api_spec.rb +19 -0
- data/spec/grape/request_spec.rb +24 -0
- data/spec/grape/validations/multiple_attributes_iterator_spec.rb +29 -0
- data/spec/grape/validations/params_scope_spec.rb +184 -8
- data/spec/grape/validations/single_attribute_iterator_spec.rb +33 -0
- data/spec/grape/validations/validators/all_or_none_spec.rb +138 -30
- data/spec/grape/validations/validators/at_least_one_of_spec.rb +173 -29
- data/spec/grape/validations/validators/coerce_spec.rb +10 -2
- data/spec/grape/validations/validators/exactly_one_of_spec.rb +202 -38
- data/spec/grape/validations/validators/mutual_exclusion_spec.rb +184 -27
- data/spec/grape/validations/validators/same_as_spec.rb +63 -0
- data/spec/grape/validations_spec.rb +33 -21
- data/spec/spec_helper.rb +4 -1
- metadata +35 -23
- data/Appraisals +0 -32
- data/Dangerfile +0 -2
- data/Gemfile +0 -33
- data/Gemfile.lock +0 -231
- data/Guardfile +0 -10
- data/RELEASING.md +0 -111
- data/Rakefile +0 -25
- data/benchmark/simple.rb +0 -27
- data/benchmark/simple_with_type_coercer.rb +0 -22
- data/gemfiles/multi_json.gemfile +0 -35
- data/gemfiles/multi_xml.gemfile +0 -35
- data/gemfiles/rack_1.5.2.gemfile +0 -35
- data/gemfiles/rack_edge.gemfile +0 -35
- data/gemfiles/rails_3.gemfile +0 -36
- data/gemfiles/rails_4.gemfile +0 -35
- data/gemfiles/rails_5.gemfile +0 -35
- data/gemfiles/rails_edge.gemfile +0 -35
- data/pkg/grape-0.17.0.gem +0 -0
- data/pkg/grape-0.19.0.gem +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8934b2070d7c44a7100315712c05ee9e76eff602290b30f475f6e2e324c5392c
|
4
|
+
data.tar.gz: 0d618a852be97bf103c7f783702342b030440834fedd725b4e6a90e03a8b0556
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f11c651eb7dea86dd45065c04cdebcbb2635cf8136536850b245d4ad94eac921a4218f191cc5f523968cdc4708ee7ede49fce17de21b97b96edcd82426c06795
|
7
|
+
data.tar.gz: 8266b0bf359c1ed96b7aacd9bbecacfe6ef5f406b94d54a1a9c6dfdbf18d95967f8c853f13dfab642631e261f81893bcc5323e83c0d27a04226bdc03d7b19381
|
data/CHANGELOG.md
CHANGED
@@ -1,11 +1,96 @@
|
|
1
|
-
### 1.
|
1
|
+
### 1.2.5 (2019/12/01)
|
2
2
|
|
3
3
|
#### Features
|
4
4
|
|
5
|
-
* [#
|
5
|
+
* [#1931](https://github.com/ruby-grape/grape/pull/1931): Introduces LazyBlock to generate expressions that will executed at mount time - [@myxoh](https://github.com/myxoh).
|
6
|
+
* [#1918](https://github.com/ruby-grape/grape/pull/1918): Helper methods to access controller context from middleware - [@NikolayRys](https://github.com/NikolayRys).
|
7
|
+
* [#1915](https://github.com/ruby-grape/grape/pull/1915): Micro optimizations in allocating hashes and arrays - [@dnesteryuk](https://github.com/dnesteryuk).
|
8
|
+
* [#1904](https://github.com/ruby-grape/grape/pull/1904): Allows Grape to load files on startup rather than on the first call - [@myxoh](https://github.com/myxoh).
|
9
|
+
* [#1907](https://github.com/ruby-grape/grape/pull/1907): Adds outside configuration to Grape with `configure` - [@unleashy](https://github.com/unleashy).
|
10
|
+
* [#1914](https://github.com/ruby-grape/grape/pull/1914): Run specs in random order - [@splattael](https://github.com/splattael).
|
11
|
+
|
12
|
+
#### Fixes
|
13
|
+
|
14
|
+
* [#1917](https://github.com/ruby-grape/grape/pull/1917): Update access to rack constant - [@NikolayRys](https://github.com/NikolayRys).
|
15
|
+
* [#1916](https://github.com/ruby-grape/grape/pull/1916): Drop old appraisals - [@NikolayRys](https://github.com/NikolayRys).
|
16
|
+
* [#1911](https://github.com/ruby-grape/grape/pull/1911): Make sure `Grape::Valiations::AtLeastOneOfValidator` properly treats nested params in errors - [@dnesteryuk](https://github.com/dnesteryuk).
|
17
|
+
* [#1893](https://github.com/ruby-grape/grape/pull/1893): Allows `Grape::API` to behave like a Rack::app in some instances where it was misbehaving - [@myxoh](https://github.com/myxoh).
|
18
|
+
* [#1898](https://github.com/ruby-grape/grape/pull/1898): Refactor `ValidatorFactory` to improve memory allocation - [@Bhacaz](https://github.com/Bhacaz).
|
19
|
+
* [#1900](https://github.com/ruby-grape/grape/pull/1900): Define boolean for `Grape::Api::Instance` - [@Bhacaz](https://github.com/Bhacaz).
|
20
|
+
* [#1903](https://github.com/ruby-grape/grape/pull/1903): Allow nested params renaming (Hash/Array) - [@bikolya](https://github.com/bikolya).
|
21
|
+
* [#1913](https://github.com/ruby-grape/grape/pull/1913): Fix multiple params validators to return correct messages for nested params - [@bikolya](https://github.com/bikolya).
|
22
|
+
* [#1926](https://github.com/ruby-grape/grape/pull/1926): Fixes configuration within given or mounted blocks - [@myxoh](https://github.com/myxoh).
|
23
|
+
* [#1937](https://github.com/ruby-grape/grape/pull/1937): Fix bloat in released gem - [@dblock](https://github.com/dblock).
|
24
|
+
|
25
|
+
### 1.2.4 (2019/06/13)
|
26
|
+
|
27
|
+
#### Features
|
28
|
+
|
29
|
+
* [#1888](https://github.com/ruby-grape/grape/pull/1888): Makes the `configuration` hash widely available - [@myxoh](https://github.com/myxoh).
|
30
|
+
* [#1864](https://github.com/ruby-grape/grape/pull/1864): Adds `finally` on the API - [@myxoh](https://github.com/myxoh).
|
31
|
+
* [#1869](https://github.com/ruby-grape/grape/pull/1869): Fix issue with empty headers after `error!` method call - [@anaumov](https://github.com/anaumov).
|
32
|
+
|
33
|
+
#### Fixes
|
34
|
+
|
35
|
+
* [#1868](https://github.com/ruby-grape/grape/pull/1868): Fix NoMethodError with none hash params - [@ksss](https://github.com/ksss).
|
36
|
+
* [#1876](https://github.com/ruby-grape/grape/pull/1876): Fix const errors being hidden by bug in `const_missing` - [@dandehavilland](https://github.com/dandehavilland).
|
37
|
+
|
38
|
+
### 1.2.3 (2019/01/16)
|
39
|
+
|
40
|
+
#### Features
|
41
|
+
|
42
|
+
* [#1850](https://github.com/ruby-grape/grape/pull/1850): Adds `same_as` validator - [@glaucocustodio](https://github.com/glaucocustodio).
|
43
|
+
* [#1833](https://github.com/ruby-grape/grape/pull/1833): Allows to set the `ParamBuilder` globally - [@myxoh](https://github.com/myxoh).
|
44
|
+
|
45
|
+
#### Fixes
|
46
|
+
|
47
|
+
* [#1852](https://github.com/ruby-grape/grape/pull/1852): `allow_blank` called after `as` when the original param is not blank - [@glaucocustodio](https://github.com/glaucocustodio).
|
48
|
+
* [#1844](https://github.com/ruby-grape/grape/pull/1844): Enforce `:tempfile` to be a `Tempfile` object in `File` validator - [@Nyangawa](https://github.com/Nyangawa).
|
49
|
+
|
50
|
+
### 1.2.2 (2018/12/07)
|
51
|
+
|
52
|
+
#### Features
|
53
|
+
|
54
|
+
* [#1832](https://github.com/ruby-grape/grape/pull/1832): Support `body_name` in `desc` block - [@fotos](https://github.com/fotos).
|
55
|
+
* [#1831](https://github.com/ruby-grape/grape/pull/1831): Support `security` in `desc` block - [@fotos](https://github.com/fotos).
|
56
|
+
|
57
|
+
#### Fixes
|
58
|
+
|
59
|
+
* [#1836](https://github.com/ruby-grape/grape/pull/1836): Fix: memory leak not releasing `call` method calls from setup - [@myxoh](https://github.com/myxoh).
|
60
|
+
* [#1830](https://github.com/ruby-grape/grape/pull/1830), [#1829](https://github.com/ruby-grape/grape/issues/1829): Restores `self` sanity - [@myxoh](https://github.com/myxoh).
|
61
|
+
|
62
|
+
### 1.2.1 (2018/11/28)
|
63
|
+
|
64
|
+
#### Fixes
|
65
|
+
|
66
|
+
* [#1825](https://github.com/ruby-grape/grape/pull/1825): `to_s` on a mounted class now responses with the API name - [@myxoh](https://github.com/myxoh).
|
67
|
+
|
68
|
+
### 1.2.0 (2018/11/26)
|
69
|
+
|
70
|
+
#### Features
|
71
|
+
|
72
|
+
* [#1813](https://github.com/ruby-grape/grape/pull/1813): Add ruby 2.5 support, drop 2.2. Update rails version in travis - [@darren987469](https://github.com/darren987469).
|
73
|
+
* [#1803](https://github.com/ruby-grape/grape/pull/1803): Adds the ability to re-mount all endpoints in any location - [@myxoh](https://github.com/myxoh).
|
74
|
+
* [#1795](https://github.com/ruby-grape/grape/pull/1795): Fix vendor/subtype parsing of an invalid Accept header - [@bschmeck](https://github.com/bschmeck).
|
75
|
+
* [#1791](https://github.com/ruby-grape/grape/pull/1791): Support `summary`, `hidden`, `deprecated`, `is_array`, `nickname`, `produces`, `consumes`, `tags` options in `desc` block - [@darren987469](https://github.com/darren987469).
|
6
76
|
|
7
77
|
#### Fixes
|
8
78
|
|
79
|
+
* [#1796](https://github.com/ruby-grape/grape/pull/1796): Fix crash when available locales are enforced but fallback locale unavailable - [@Morred](https://github.com/Morred).
|
80
|
+
* [#1776](https://github.com/ruby-grape/grape/pull/1776): Validate response returned by the exception handler - [@darren987469](https://github.com/darren987469).
|
81
|
+
* [#1787](https://github.com/ruby-grape/grape/pull/1787): Add documented but not implemented ability to `.insert` a middleware in the stack - [@michaellennox](https://github.com/michaellennox).
|
82
|
+
* [#1788](https://github.com/ruby-grape/grape/pull/1788): Fix route requirements bug - [@darren987469](https://github.com/darren987469), [@darrellnash](https://github.com/darrellnash).
|
83
|
+
* [#1810](https://github.com/ruby-grape/grape/pull/1810): Fix support in `given` for aliased params - [@darren987469](https://github.com/darren987469).
|
84
|
+
* [#1811](https://github.com/ruby-grape/grape/pull/1811): Support nested dependent parameters - [@darren987469](https://github.com/darren987469), [@andreacfm](https://github.com/andreacfm).
|
85
|
+
* [#1822](https://github.com/ruby-grape/grape/pull/1822): Raise validation error when optional hash type parameter is received string type value and exactly_one_of be used - [@woshidan](https://github.com/woshidan).
|
86
|
+
|
87
|
+
### 1.1.0 (2018/8/4)
|
88
|
+
|
89
|
+
#### Features
|
90
|
+
|
91
|
+
* [#1759](https://github.com/ruby-grape/grape/pull/1759): Instrument serialization as `'format_response.grape'` - [@zvkemp](https://github.com/zvkemp).
|
92
|
+
|
93
|
+
#### Fixes
|
9
94
|
|
10
95
|
* [#1762](https://github.com/ruby-grape/grape/pull/1763): Fix unsafe HTML rendering on errors - [@ctennis](https://github.com/ctennis).
|
11
96
|
* [#1759](https://github.com/ruby-grape/grape/pull/1759): Update appraisal for rails_edge - [@zvkemp](https://github.com/zvkemp).
|
@@ -13,7 +98,7 @@
|
|
13
98
|
* [#1765](https://github.com/ruby-grape/grape/pull/1765): Use 415 when request body is of an unsupported media type - [@jdmurphy](https://github.com/jdmurphy).
|
14
99
|
* [#1771](https://github.com/ruby-grape/grape/pull/1771): Fix param aliases with 'given' blocks - [@jereynolds](https://github.com/jereynolds).
|
15
100
|
|
16
|
-
### 1.0.3 (4/23
|
101
|
+
### 1.0.3 (2018/4/23)
|
17
102
|
|
18
103
|
#### Fixes
|
19
104
|
|
@@ -26,7 +111,7 @@
|
|
26
111
|
* [#1754](https://github.com/ruby-grape/grape/pull/1754): Allow rescue from non-`StandardError` exceptions to use default error handling - [@jelkster](https://github.com/jelkster).
|
27
112
|
* [#1756](https://github.com/ruby-grape/grape/pull/1756): Allow custom Grape exception handlers when the built-in exception handling is enabled - [@soylent](https://github.com/soylent).
|
28
113
|
|
29
|
-
### 1.0.2 (1/10
|
114
|
+
### 1.0.2 (2018/1/10)
|
30
115
|
|
31
116
|
#### Features
|
32
117
|
|
@@ -44,7 +129,7 @@
|
|
44
129
|
* [#1726](https://github.com/ruby-grape/grape/pull/1726): Improved startup performance during API method generation - [@jkowens](https://github.com/jkowens).
|
45
130
|
* [#1727](https://github.com/ruby-grape/grape/pull/1727): Fix infinite loop when mounting endpoint with same superclass - [@jkowens](https://github.com/jkowens).
|
46
131
|
|
47
|
-
### 1.0.1 (9/8
|
132
|
+
### 1.0.1 (2017/9/8)
|
48
133
|
|
49
134
|
#### Features
|
50
135
|
|
@@ -58,7 +143,7 @@
|
|
58
143
|
* [#1661](https://github.com/ruby-grape/grape/pull/1661): Handle deeply-nested dependencies correctly - [@rnubel](https://github.com/rnubel), [@jnardone](https://github.com/jnardone).
|
59
144
|
* [#1679](https://github.com/ruby-grape/grape/pull/1679): Treat StandardError from explicit values validator proc as false - [@jlfaber](https://github.com/jlfaber).
|
60
145
|
|
61
|
-
### 1.0.0 (7/3
|
146
|
+
### 1.0.0 (2017/7/3)
|
62
147
|
|
63
148
|
#### Features
|
64
149
|
|
@@ -77,7 +162,7 @@
|
|
77
162
|
* [#1625](https://github.com/ruby-grape/grape/pull/1625): Handle `given` correctly when nested in Array params - [@rnubel](https://github.com/rnubel), [@avellable](https://github.com/avellable).
|
78
163
|
* [#1649](https://github.com/ruby-grape/grape/pull/1649): Don't share validator instances between requests - [@anakinj](https://github.com/anakinj).
|
79
164
|
|
80
|
-
### 0.19.2 (4/12
|
165
|
+
### 0.19.2 (2017/4/12)
|
81
166
|
|
82
167
|
#### Features
|
83
168
|
|
@@ -98,7 +183,7 @@
|
|
98
183
|
* [#1569](https://github.com/ruby-grape/grape/pull/1569), [#1511](https://github.com/ruby-grape/grape/issues/1511): Upgrade mustermann-grape to 1.0.0 - [@namusyaka](https://github.com/namusyaka).
|
99
184
|
* [#1589](https://github.com/ruby-grape/grape/pull/1589): [#726](https://github.com/ruby-grape/grape/issues/726): Use default_format when Content-type is missing and respond with 406 when Content-type is invalid - [@inclooder](https://github.com/inclooder).
|
100
185
|
|
101
|
-
### 0.19.1 (1/9
|
186
|
+
### 0.19.1 (2017/1/9)
|
102
187
|
|
103
188
|
#### Features
|
104
189
|
|
@@ -110,7 +195,7 @@
|
|
110
195
|
* [#1548](https://github.com/ruby-grape/grape/pull/1548): Fix: avoid failing even if given path does not match with prefix - [@thomas-peyric](https://github.com/thomas-peyric), [@namusyaka](https://github.com/namusyaka).
|
111
196
|
* [#1550](https://github.com/ruby-grape/grape/pull/1550): Fix: return 200 as default status for DELETE - [@jthornec](https://github.com/jthornec).
|
112
197
|
|
113
|
-
### 0.19.0 (12/18
|
198
|
+
### 0.19.0 (2016/12/18)
|
114
199
|
|
115
200
|
#### Features
|
116
201
|
|
@@ -126,7 +211,7 @@
|
|
126
211
|
* [#1510](https://github.com/ruby-grape/grape/pull/1510): Fix: inconsistent validation for multiple parameters - [@dgasper](https://github.com/dgasper).
|
127
212
|
* [#1526](https://github.com/ruby-grape/grape/pull/1526): Reduced warnings caused by instance variables not initialized - [@cpetschnig](https://github.com/cpetschnig).
|
128
213
|
|
129
|
-
### 0.18.0 (10/7
|
214
|
+
### 0.18.0 (2016/10/7)
|
130
215
|
|
131
216
|
#### Features
|
132
217
|
|
@@ -143,7 +228,7 @@
|
|
143
228
|
* [#1488](https://github.com/ruby-grape/grape/pull/1488): Fix: ensure calling before filters when receiving OPTIONS request - [@namusyaka](https://github.com/namusyaka), [@jlfaber](https://github.com/jlfaber).
|
144
229
|
* [#1493](https://github.com/ruby-grape/grape/pull/1493): Fix: coercion and lambda fails params validation - [@jonmchan](https://github.com/jonmchan).
|
145
230
|
|
146
|
-
### 0.17.0 (7/29
|
231
|
+
### 0.17.0 (2016/7/29)
|
147
232
|
|
148
233
|
#### Features
|
149
234
|
|
@@ -170,7 +255,7 @@
|
|
170
255
|
* [#1421](https://github.com/ruby-grape/grape/pull/1421): Avoid polluting `Grape::Middleware::Error` - [@namusyaka](https://github.com/namusyaka).
|
171
256
|
* [#1422](https://github.com/ruby-grape/grape/pull/1422): Concat parent declared params with current one - [@plukevdh](https://github.com/plukevdh), [@rnubel](https://github.com/rnubel), [@namusyaka](https://github.com/namusyaka).
|
172
257
|
|
173
|
-
### 0.16.2 (4/12
|
258
|
+
### 0.16.2 (2016/4/12)
|
174
259
|
|
175
260
|
#### Features
|
176
261
|
|
@@ -183,7 +268,7 @@
|
|
183
268
|
* [#1359](https://github.com/ruby-grape/grape/pull/1359): Avoid evaluating the same route twice - [@namusyaka](https://github.com/namusyaka), [@dblock](https://github.com/dblock).
|
184
269
|
* [#1361](https://github.com/ruby-grape/grape/pull/1361): Return 405 correctly even if version is using as header and wrong request method - [@namusyaka](https://github.com/namusyaka), [@dblock](https://github.com/dblock).
|
185
270
|
|
186
|
-
### 0.16.1 (4/3
|
271
|
+
### 0.16.1 (2016/4/3)
|
187
272
|
|
188
273
|
#### Features
|
189
274
|
|
@@ -198,7 +283,7 @@
|
|
198
283
|
* [#1330](https://github.com/ruby-grape/grape/pull/1330): Add `register` keyword for adding customized parsers and formatters - [@namusyaka](https://github.com/namusyaka).
|
199
284
|
* [#1336](https://github.com/ruby-grape/grape/pull/1336): Do not modify Hash argument to `error!` - [@tjwp](https://github.com/tjwp).
|
200
285
|
|
201
|
-
### 0.15.0 (3/8
|
286
|
+
### 0.15.0 (2016/3/8)
|
202
287
|
|
203
288
|
#### Features
|
204
289
|
|
@@ -225,7 +310,7 @@
|
|
225
310
|
* [#1283](https://github.com/ruby-grape/grape/pull/1283): Fix 500 error for xml format when method is not allowed - [@304](https://github.com/304).
|
226
311
|
* [#1197](https://github.com/ruby-grape/grape/pull/1290): Fix using JSON and Array[JSON] as groups when parameter is optional - [@lukeivers](https://github.com/lukeivers).
|
227
312
|
|
228
|
-
### 0.14.0 (12/07
|
313
|
+
### 0.14.0 (2015/12/07)
|
229
314
|
|
230
315
|
#### Features
|
231
316
|
|
@@ -252,7 +337,7 @@
|
|
252
337
|
* [#1101](https://github.com/ruby-grape/grape/pull/1101): Fix: Incorrect media-type `Accept` header now correctly returns 406 with `strict: true` - [@elliotlarson](https://github.com/elliotlarson).
|
253
338
|
* [#1108](https://github.com/ruby-grape/grape/pull/1039): Raise a warning when `desc` is called with options hash and block - [@rngtng](https://github.com/rngtng).
|
254
339
|
|
255
|
-
### 0.13.0 (8/10
|
340
|
+
### 0.13.0 (2015/8/10)
|
256
341
|
|
257
342
|
#### Features
|
258
343
|
|
@@ -273,7 +358,7 @@
|
|
273
358
|
* [#1088](https://github.com/ruby-grape/grape/pull/1088): Support ActiveSupport 3.x by explicitly requiring `Hash#except` - [@wagenet](https://github.com/wagenet).
|
274
359
|
* [#1096](https://github.com/ruby-grape/grape/pull/1096): Fix coercion on booleans - [@towanda](https://github.com/towanda).
|
275
360
|
|
276
|
-
### 0.12.0 (6/18
|
361
|
+
### 0.12.0 (2015/6/18)
|
277
362
|
|
278
363
|
#### Features
|
279
364
|
|
@@ -299,7 +384,7 @@
|
|
299
384
|
* [#1023](https://github.com/ruby-grape/grape/issues/1023): Fixes unexpected behavior with `present` and an object that responds to `merge` but isn't a Hash - [@dblock](https://github.com/dblock).
|
300
385
|
* [#1017](https://github.com/ruby-grape/grape/pull/1017): Fixed `undefined method stringify_keys` with nested mutual exclusive params - [@quickpay](https://github.com/quickpay).
|
301
386
|
|
302
|
-
### 0.11.0 (2/23
|
387
|
+
### 0.11.0 (2015/2/23)
|
303
388
|
|
304
389
|
* [#925](https://github.com/ruby-grape/grape/pull/925): Fixed `toplevel constant DateTime referenced by Virtus::Attribute::DateTime` - [@u2](https://github.com/u2).
|
305
390
|
* [#916](https://github.com/ruby-grape/grape/pull/916): Added `DateTime/Date/Numeric/Boolean` type support `allow_blank` - [@u2](https://github.com/u2).
|
@@ -316,12 +401,12 @@
|
|
316
401
|
* [#913](https://github.com/ruby-grape/grape/pull/913): Fix: Invalid accept headers cause internal processing errors (500) when http_codes are defined - [@croeck](https://github.com/croeck).
|
317
402
|
* [#917](https://github.com/ruby-grape/grape/pull/917): Use HTTPS for rubygems.org - [@O-I](https://github.com/O-I).
|
318
403
|
|
319
|
-
### 0.10.1 (12/28
|
404
|
+
### 0.10.1 (2014/12/28)
|
320
405
|
|
321
406
|
* [#868](https://github.com/ruby-grape/grape/pull/868), [#862](https://github.com/ruby-grape/grape/pull/862), [#861](https://github.com/ruby-grape/grape/pull/861): Fixed `version`, `prefix`, and other settings being overridden or changing scope when mounting API - [@yesmeck](https://github.com/yesmeck).
|
322
407
|
* [#864](https://github.com/ruby-grape/grape/pull/864): Fixed `declared(params, include_missing: false)` now returning attributes with `nil` and `false` values - [@ppadron](https://github.com/ppadron).
|
323
408
|
|
324
|
-
### 0.10.0 (12/19
|
409
|
+
### 0.10.0 (2014/12/19)
|
325
410
|
|
326
411
|
* [#803](https://github.com/ruby-grape/grape/pull/803), [#820](https://github.com/ruby-grape/grape/pull/820): Added `all_or_none_of` parameter validator - [@loveltyoic](https://github.com/loveltyoic), [@natecj](https://github.com/natecj).
|
327
412
|
* [#774](https://github.com/ruby-grape/grape/pull/774): Extended `mutually_exclusive`, `exactly_one_of`, `at_least_one_of` to work inside any kind of group: `requires` or `optional`, `Hash` or `Array` - [@ShPakvel](https://github.com/ShPakvel).
|
@@ -344,7 +429,7 @@
|
|
344
429
|
* [#679](https://github.com/ruby-grape/grape/issues/679): Fixed `OPTIONS` method returning 404 when combined with `prefix` - [@dblock](https://github.com/dblock).
|
345
430
|
* [#679](https://github.com/ruby-grape/grape/issues/679): Fixed unsupported methods returning 404 instead of 405 when combined with `prefix` - [@dblock](https://github.com/dblock).
|
346
431
|
|
347
|
-
### 0.9.0 (8/27
|
432
|
+
### 0.9.0 (2014/8/27)
|
348
433
|
|
349
434
|
#### Features
|
350
435
|
|
@@ -362,7 +447,7 @@
|
|
362
447
|
|
363
448
|
* [#687](https://github.com/ruby-grape/grape/pull/687): Fix: `mutually_exclusive` and `exactly_one_of` validation error messages now label parameters as strings, consistently with `requires` and `optional` - [@dblock](https://github.com/dblock).
|
364
449
|
|
365
|
-
### 0.8.0 (7/10
|
450
|
+
### 0.8.0 (2014/7/10)
|
366
451
|
|
367
452
|
#### Features
|
368
453
|
|
@@ -382,7 +467,7 @@
|
|
382
467
|
* [#619](https://github.com/ruby-grape/grape/pull/619): Convert specs to RSpec 3 syntax with Transpec - [@danielspector](https://github.com/danielspector).
|
383
468
|
* [#632](https://github.com/ruby-grape/grape/pull/632): `Grape::Endpoint#present` causes ActiveRecord to make an extra query during entity's detection - [@fixme](https://github.com/fixme).
|
384
469
|
|
385
|
-
### 0.7.0 (4/2
|
470
|
+
### 0.7.0 (2014/4/2)
|
386
471
|
|
387
472
|
#### Features
|
388
473
|
|
@@ -421,7 +506,7 @@
|
|
421
506
|
* [#587](https://github.com/ruby-grape/grape/pull/587): Fix oauth2 middleware compatibility with [draft-ietf-oauth-v2-31](http://tools.ietf.org/html/draft-ietf-oauth-v2-31) spec - [@etehtsea](https://github.com/etehtsea).
|
422
507
|
* [#610](https://github.com/ruby-grape/grape/pull/610): Fixed group keyword was not working with type parameter - [@klausmeyer](https://github.com/klausmeyer).
|
423
508
|
|
424
|
-
### 0.6.1 (10/19
|
509
|
+
### 0.6.1 (2013/10/19)
|
425
510
|
|
426
511
|
#### Features
|
427
512
|
|
@@ -437,7 +522,7 @@
|
|
437
522
|
|
438
523
|
* Implemented Rubocop, a Ruby code static code analyzer - [@dblock](https://github.com/dblock).
|
439
524
|
|
440
|
-
### 0.6.0 (9/16
|
525
|
+
### 0.6.0 (2013/9/16)
|
441
526
|
|
442
527
|
#### Features
|
443
528
|
|
@@ -455,7 +540,7 @@
|
|
455
540
|
|
456
541
|
* [#428](https://github.com/ruby-grape/grape/issues/428): Removes memoization from `Grape::Request` params to prevent middleware from freezing parameter values before `Formatter` can get them - [@mbleigh](https://github.com/mbleigh).
|
457
542
|
|
458
|
-
### 0.5.0 (6/14
|
543
|
+
### 0.5.0 (2013/6/14)
|
459
544
|
|
460
545
|
#### Features
|
461
546
|
|
@@ -481,11 +566,11 @@
|
|
481
566
|
* [#423](https://github.com/ruby-grape/grape/pull/423): Fix: `Grape::Endpoint#declared` now correctly handles nested params (ie. declared with `group`) - [@jbarreneche](https://github.com/jbarreneche).
|
482
567
|
* [#427](https://github.com/ruby-grape/grape/issues/427): Fix: `declared(params)` breaks when `params` contains array - [@timhabermaas](https://github.com/timhabermaas).
|
483
568
|
|
484
|
-
### 0.4.1 (4/1
|
569
|
+
### 0.4.1 (2013/4/1)
|
485
570
|
|
486
571
|
* [#375](https://github.com/ruby-grape/grape/pull/375): Fix: throwing an `:error` inside a middleware doesn't respect the `format` settings - [@dblock](https://github.com/dblock).
|
487
572
|
|
488
|
-
### 0.4.0 (3/17
|
573
|
+
### 0.4.0 (2013/3/17)
|
489
574
|
|
490
575
|
* [#356](https://github.com/ruby-grape/grape/pull/356): Fix: presenting collections other than `Array` (eg. `ActiveRecord::Relation`) - [@zimbatm](https://github.com/zimbatm).
|
491
576
|
* [#352](https://github.com/ruby-grape/grape/pull/352): Fix: using `Rack::JSONP` with `Grape::Entity` responses - [@deckchair](https://github.com/deckchair).
|
@@ -499,15 +584,15 @@
|
|
499
584
|
* [#353](https://github.com/ruby-grape/grape/issues/353): Revert to standard Ruby logger formatter, `require active_support/all` if you want old behavior - [@rhunter](https://github.com/rhunter), [@dblock](https://github.com/dblock).
|
500
585
|
* Fix: `undefined method 'call' for nil:NilClass` for an API method implementation without a block, now returns an empty string - [@dblock](https://github.com/dblock).
|
501
586
|
|
502
|
-
### 0.3.2 (2/28
|
587
|
+
### 0.3.2 (2013/2/28)
|
503
588
|
|
504
589
|
* [#355](https://github.com/ruby-grape/grape/issues/355): Relax dependency constraint on Hashie - [@reset](https://github.com/reset).
|
505
590
|
|
506
|
-
### 0.3.1 (2/25
|
591
|
+
### 0.3.1 (2013/2/25)
|
507
592
|
|
508
593
|
* [#351](https://github.com/ruby-grape/grape/issues/351): Compatibility with Ruby 2.0 - [@mbleigh](https://github.com/mbleigh).
|
509
594
|
|
510
|
-
### 0.3.0 (02/21
|
595
|
+
### 0.3.0 (2013/02/21)
|
511
596
|
|
512
597
|
* [#294](https://github.com/ruby-grape/grape/issues/294): Extracted `Grape::Entity` into a [grape-entity](https://github.com/agileanimal/grape-entity) gem - [@agileanimal](https://github.com/agileanimal).
|
513
598
|
* [#340](https://github.com/ruby-grape/grape/pull/339), [#342](https://github.com/ruby-grape/grape/pull/342): Added `:cascade` option to `version` to allow disabling of rack/mount cascade behavior - [@dieb](https://github.com/dieb).
|
@@ -526,12 +611,12 @@
|
|
526
611
|
* [#60](https://github.com/ruby-grape/grape/issues/60): Fix: mounting of a Grape API onto a path - [@dblock](https://github.com/dblock).
|
527
612
|
* [#335](https://github.com/ruby-grape/grape/pull/335): Fix: request body parameters from a `PATCH` request not available in `params` - [@FreakenK](https://github.com/FreakenK).
|
528
613
|
|
529
|
-
### 0.2.6 (01/11
|
614
|
+
### 0.2.6 (2013/01/11)
|
530
615
|
|
531
616
|
* Fix: support content-type with character set when parsing POST and PUT input - [@dblock](https://github.com/dblock).
|
532
617
|
* Fix: CVE-2013-0175, multi_xml parse vulnerability, require multi_xml 0.5.2 - [@dblock](https://github.com/dblock).
|
533
618
|
|
534
|
-
### 0.2.5 (01/10
|
619
|
+
### 0.2.5 (2013/01/10)
|
535
620
|
|
536
621
|
* Added support for custom parsers via `parser`, in addition to built-in multipart, JSON and XML parsers - [@dblock](https://github.com/dblock).
|
537
622
|
* Removed `body_params`, data sent via a POST or PUT with a supported content-type is merged into `params` - [@dblock](https://github.com/dblock).
|
@@ -540,7 +625,7 @@
|
|
540
625
|
* [#305](https://github.com/ruby-grape/grape/issues/305): Fix: presenting arrays of objects via `represent` or when auto-detecting an `Entity` constant in the objects being presented - [@brandonweiss](https://github.com/brandonweiss).
|
541
626
|
* [#306](https://github.com/ruby-grape/grape/issues/306): Added i18n support for validation error messages - [@niedhui](https://github.com/niedhui).
|
542
627
|
|
543
|
-
### 0.2.4 (01/06
|
628
|
+
### 0.2.4 (2013/01/06)
|
544
629
|
|
545
630
|
* [#297](https://github.com/ruby-grape/grape/issues/297): Added `default_error_formatter` - [@dblock](https://github.com/dblock).
|
546
631
|
* [#297](https://github.com/ruby-grape/grape/issues/297): Setting `format` will automatically set `default_error_formatter` - [@dblock](https://github.com/dblock).
|
@@ -558,7 +643,7 @@
|
|
558
643
|
* [#304](https://github.com/ruby-grape/grape/issues/304): Fix: `present x, :with => Entity` returns class references with `format :json` - [@dblock](https://github.com/dblock).
|
559
644
|
* [#196](https://github.com/ruby-grape/grape/issues/196): Fix: root requests don't work with `prefix` - [@dblock](https://github.com/dblock).
|
560
645
|
|
561
|
-
### 0.2.3 (
|
646
|
+
### 0.2.3 (2012/12/24)
|
562
647
|
|
563
648
|
* [#179](https://github.com/ruby-grape/grape/issues/178): Using `content_type` will remove all default content-types - [@dblock](https://github.com/dblock).
|
564
649
|
* [#265](https://github.com/ruby-grape/grape/issues/264): Fix: Moved `ValidationError` into `Grape::Exceptions` - [@thepumpkin1979](https://github.com/thepumpkin1979).
|
@@ -571,7 +656,7 @@
|
|
571
656
|
* [#290](https://github.com/ruby-grape/grape/pull/290): The default error format for XML is now `error/message` instead of `hash/error` - [@dpsk](https://github.com/dpsk).
|
572
657
|
* [#44](https://github.com/ruby-grape/grape/issues/44): Pass `env` into formatters to enable templating - [@dblock](https://github.com/dblock).
|
573
658
|
|
574
|
-
### 0.2.2 (12/10
|
659
|
+
### 0.2.2 (2012/12/10)
|
575
660
|
|
576
661
|
#### Features
|
577
662
|
|
@@ -593,7 +678,7 @@
|
|
593
678
|
* [#208](https://github.com/ruby-grape/grape/pull/208): `Entity#serializable_hash` must also check if attribute is generated by a user supplied block - [@ppadron](https://github.com/ppadron).
|
594
679
|
* [#252](https://github.com/ruby-grape/grape/pull/252): Resources that don't respond to a requested HTTP method return 405 (Method Not Allowed) instead of 404 (Not Found) - [@simulacre](https://github.com/simulacre).
|
595
680
|
|
596
|
-
### 0.2.1 (7/11
|
681
|
+
### 0.2.1 (2012/7/11)
|
597
682
|
|
598
683
|
* [#186](https://github.com/ruby-grape/grape/issues/186): Fix: helpers allow multiple calls with modules and blocks - [@ppadron](https://github.com/ppadron).
|
599
684
|
* [#188](https://github.com/ruby-grape/grape/pull/188): Fix: multi-method routes append '(.:format)' only once - [@kainosnoema](https://github.com/kainosnoema).
|
@@ -608,7 +693,7 @@
|
|
608
693
|
* [#189](https://github.com/ruby-grape/grape/pull/189): `HEAD` requests no longer return a body - [@stephencelis](https://github.com/stephencelis).
|
609
694
|
* [#97](https://github.com/ruby-grape/grape/issues/97): Allow overriding `Content-Type` - [@dblock](https://github.com/dblock).
|
610
695
|
|
611
|
-
### 0.2.0 (3/28
|
696
|
+
### 0.2.0 (2012/3/28)
|
612
697
|
|
613
698
|
* Added support for inheriting exposures from entities - [@bobbytables](https://github.com/bobbytables).
|
614
699
|
* Extended formatting with `default_format` - [@dblock](https://github.com/dblock).
|
@@ -628,28 +713,28 @@
|
|
628
713
|
* Added support for before and after filters - [@mbleigh](https://github.com/mbleigh).
|
629
714
|
* Extended `rescue_from`, which can now take a block - [@dblock](https://github.com/dblock).
|
630
715
|
|
631
|
-
### 0.1.5 (6/14
|
716
|
+
### 0.1.5 (2011/6/14)
|
632
717
|
|
633
718
|
* Extended exception handling to all exceptions - [@dblock](https://github.com/dblock).
|
634
719
|
* Added support for returning JSON objects from within error blocks - [@dblock](https://github.com/dblock).
|
635
720
|
* Added support for handling incoming JSON in body - [@tedkulp](https://github.com/tedkulp).
|
636
721
|
* Added support for HTTP digest authentication - [@daddz](https://github.com/daddz).
|
637
722
|
|
638
|
-
### 0.1.4 (4/8
|
723
|
+
### 0.1.4 (2011/4/8)
|
639
724
|
|
640
725
|
* Allow multiple definitions of the same endpoint under multiple versions - [@chrisrhoden](https://github.com/chrisrhoden).
|
641
726
|
* Added support for multipart URL parameters - [@mcastilho](https://github.com/mcastilho).
|
642
727
|
* Added support for custom formatters - [@spraints](https://github.com/spraints).
|
643
728
|
|
644
|
-
### 0.1.3 (1/10
|
729
|
+
### 0.1.3 (2011/1/10)
|
645
730
|
|
646
731
|
* Added support for JSON format in route matching - [@aiwilliams](https://github.com/aiwilliams).
|
647
732
|
* Added suport for custom middleware - [@mbleigh](https://github.com/mbleigh).
|
648
733
|
|
649
|
-
### 0.1.1 (11/14
|
734
|
+
### 0.1.1 (2010/11/14)
|
650
735
|
|
651
736
|
* Endpoints properly reset between each request - [@mbleigh](https://github.com/mbleigh).
|
652
737
|
|
653
|
-
### 0.1.0 (11/13
|
738
|
+
### 0.1.0 (2010/11/13)
|
654
739
|
|
655
740
|
* Initial public release - [@mbleigh](https://github.com/mbleigh).
|
data/LICENSE
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
Copyright (c) 2010-
|
1
|
+
Copyright (c) 2010-2019 Michael Bleigh, Intridea Inc. and Contributors.
|
2
2
|
|
3
3
|
Permission is hereby granted, free of charge, to any person obtaining
|
4
4
|
a copy of this software and associated documentation files (the
|
data/README.md
CHANGED
@@ -2,11 +2,9 @@
|
|
2
2
|
|
3
3
|
[](http://badge.fury.io/rb/grape)
|
4
4
|
[](https://travis-ci.org/ruby-grape/grape)
|
5
|
-
[](https://gemnasium.com/ruby-grape/grape)
|
6
5
|
[](https://codeclimate.com/github/ruby-grape/grape)
|
7
6
|
[](https://coveralls.io/github/ruby-grape/grape?branch=master)
|
8
|
-
[](https://git.legal/projects/1364)
|
7
|
+
[](https://inch-ci.org/github/ruby-grape/grape)
|
10
8
|
[](https://gitter.im/ruby-grape/grape?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
|
11
9
|
|
12
10
|
## Table of Contents
|
@@ -17,17 +15,23 @@
|
|
17
15
|
- [Installation](#installation)
|
18
16
|
- [Basic Usage](#basic-usage)
|
19
17
|
- [Mounting](#mounting)
|
18
|
+
- [All](#all)
|
20
19
|
- [Rack](#rack)
|
21
20
|
- [ActiveRecord without Rails](#activerecord-without-rails)
|
22
21
|
- [Alongside Sinatra (or other frameworks)](#alongside-sinatra-or-other-frameworks)
|
23
22
|
- [Rails](#rails)
|
23
|
+
- [Rails < 5.2](#rails--52)
|
24
|
+
- [Rails 6.0](#rails-60)
|
24
25
|
- [Modules](#modules)
|
26
|
+
- [Remounting](#remounting)
|
27
|
+
- [Mount Configuration](#mount-configuration)
|
25
28
|
- [Versioning](#versioning)
|
26
29
|
- [Path](#path)
|
27
30
|
- [Header](#header)
|
28
31
|
- [Accept-Version Header](#accept-version-header)
|
29
32
|
- [Param](#param)
|
30
33
|
- [Describing Methods](#describing-methods)
|
34
|
+
- [Configuration](#configuration)
|
31
35
|
- [Parameters](#parameters)
|
32
36
|
- [Params Class](#params-class)
|
33
37
|
- [Declared](#declared)
|
@@ -38,38 +42,43 @@
|
|
38
42
|
- [Integer/Fixnum and Coercions](#integerfixnum-and-coercions)
|
39
43
|
- [Custom Types and Coercions](#custom-types-and-coercions)
|
40
44
|
- [Multipart File Parameters](#multipart-file-parameters)
|
41
|
-
- [First-Class
|
45
|
+
- [First-Class JSON Types](#first-class-json-types)
|
42
46
|
- [Multiple Allowed Types](#multiple-allowed-types)
|
43
47
|
- [Validation of Nested Parameters](#validation-of-nested-parameters)
|
44
48
|
- [Dependent Parameters](#dependent-parameters)
|
45
49
|
- [Group Options](#group-options)
|
46
|
-
- [
|
50
|
+
- [Renaming](#renaming)
|
47
51
|
- [Built-in Validators](#built-in-validators)
|
48
|
-
- [
|
49
|
-
- [
|
50
|
-
- [
|
51
|
-
- [
|
52
|
-
- [
|
53
|
-
- [
|
54
|
-
- [
|
55
|
-
- [
|
56
|
-
- [
|
52
|
+
- [allow_blank](#allow_blank)
|
53
|
+
- [values](#values)
|
54
|
+
- [except_values](#except_values)
|
55
|
+
- [same_as](#same_as)
|
56
|
+
- [regexp](#regexp)
|
57
|
+
- [mutually_exclusive](#mutually_exclusive)
|
58
|
+
- [exactly_one_of](#exactly_one_of)
|
59
|
+
- [at_least_one_of](#at_least_one_of)
|
60
|
+
- [all_or_none_of](#all_or_none_of)
|
61
|
+
- [Nested mutually_exclusive, exactly_one_of, at_least_one_of, all_or_none_of](#nested-mutually_exclusive-exactly_one_of-at_least_one_of-all_or_none_of)
|
57
62
|
- [Namespace Validation and Coercion](#namespace-validation-and-coercion)
|
58
63
|
- [Custom Validators](#custom-validators)
|
59
64
|
- [Validation Errors](#validation-errors)
|
60
65
|
- [I18n](#i18n)
|
61
66
|
- [Custom Validation messages](#custom-validation-messages)
|
62
|
-
- [
|
63
|
-
- [
|
64
|
-
- [
|
65
|
-
- [
|
66
|
-
- [
|
67
|
-
- [
|
68
|
-
- [
|
69
|
-
- [
|
67
|
+
- [presence, allow_blank, values, regexp](#presence-allow_blank-values-regexp)
|
68
|
+
- [same_as](#same_as-1)
|
69
|
+
- [all_or_none_of](#all_or_none_of-1)
|
70
|
+
- [mutually_exclusive](#mutually_exclusive-1)
|
71
|
+
- [exactly_one_of](#exactly_one_of-1)
|
72
|
+
- [at_least_one_of](#at_least_one_of-1)
|
73
|
+
- [Coerce](#coerce)
|
74
|
+
- [With Lambdas](#with-lambdas)
|
75
|
+
- [Pass symbols for i18n translations](#pass-symbols-for-i18n-translations)
|
70
76
|
- [Overriding Attribute Names](#overriding-attribute-names)
|
71
77
|
- [With Default](#with-default)
|
72
78
|
- [Headers](#headers)
|
79
|
+
- [Request](#request)
|
80
|
+
- [Header Case Handling](#header-case-handling)
|
81
|
+
- [Response](#response)
|
73
82
|
- [Routes](#routes)
|
74
83
|
- [Helpers](#helpers)
|
75
84
|
- [Path Helpers](#path-helpers)
|
@@ -105,7 +114,7 @@
|
|
105
114
|
- [Register custom middleware for authentication](#register-custom-middleware-for-authentication)
|
106
115
|
- [Describing and Inspecting an API](#describing-and-inspecting-an-api)
|
107
116
|
- [Current Route and Endpoint](#current-route-and-endpoint)
|
108
|
-
- [Before and
|
117
|
+
- [Before, After and Finally](#before-after-and-finally)
|
109
118
|
- [Anchoring](#anchoring)
|
110
119
|
- [Using Custom Middleware](#using-custom-middleware)
|
111
120
|
- [Grape Middleware](#grape-middleware)
|
@@ -145,7 +154,7 @@ content negotiation, versioning and much more.
|
|
145
154
|
|
146
155
|
## Stable Release
|
147
156
|
|
148
|
-
You're reading the documentation for the stable release of Grape, **1.
|
157
|
+
You're reading the documentation for the stable release of Grape, **1.2.5**.
|
149
158
|
Please read [UPGRADING](UPGRADING.md) when upgrading from a previous version.
|
150
159
|
|
151
160
|
## Project Resources
|
@@ -204,7 +213,7 @@ module Twitter
|
|
204
213
|
|
205
214
|
desc 'Return a status.'
|
206
215
|
params do
|
207
|
-
requires :id, type: Integer, desc: 'Status
|
216
|
+
requires :id, type: Integer, desc: 'Status ID.'
|
208
217
|
end
|
209
218
|
route_param :id do
|
210
219
|
get do
|
@@ -252,6 +261,17 @@ end
|
|
252
261
|
|
253
262
|
## Mounting
|
254
263
|
|
264
|
+
### All
|
265
|
+
|
266
|
+
|
267
|
+
By default Grape will compile the routes on the first route, it is possible to pre-load routes using the `compile!` method.
|
268
|
+
|
269
|
+
```ruby
|
270
|
+
Twitter::API.compile!
|
271
|
+
```
|
272
|
+
|
273
|
+
This can be added to your `config.ru` (if using rackup), `application.rb` (if using rails), or any file that loads your server.
|
274
|
+
|
255
275
|
### Rack
|
256
276
|
|
257
277
|
The above sample creates a Rack application that can be run from a rackup `config.ru` file
|
@@ -261,6 +281,13 @@ with `rackup`:
|
|
261
281
|
run Twitter::API
|
262
282
|
```
|
263
283
|
|
284
|
+
(With pre-loading you can use)
|
285
|
+
|
286
|
+
```ruby
|
287
|
+
Twitter::API.compile!
|
288
|
+
run Twitter::API
|
289
|
+
```
|
290
|
+
|
264
291
|
And would respond to the following routes:
|
265
292
|
|
266
293
|
GET /api/statuses/public_timeline
|
@@ -317,6 +344,14 @@ run Rack::Cascade.new [API, Web]
|
|
317
344
|
|
318
345
|
Place API files into `app/api`. Rails expects a subdirectory that matches the name of the Ruby module and a file name that matches the name of the class. In our example, the file name location and directory for `Twitter::API` should be `app/api/twitter/api.rb`.
|
319
346
|
|
347
|
+
Modify `config/routes`:
|
348
|
+
|
349
|
+
```ruby
|
350
|
+
mount Twitter::API => '/'
|
351
|
+
```
|
352
|
+
|
353
|
+
#### Rails < 5.2
|
354
|
+
|
320
355
|
Modify `application.rb`:
|
321
356
|
|
322
357
|
```ruby
|
@@ -324,14 +359,18 @@ config.paths.add File.join('app', 'api'), glob: File.join('**', '*.rb')
|
|
324
359
|
config.autoload_paths += Dir[Rails.root.join('app', 'api', '*')]
|
325
360
|
```
|
326
361
|
|
327
|
-
|
362
|
+
See [below](#reloading-api-changes-in-development) for additional code that enables reloading of API changes in development.
|
363
|
+
|
364
|
+
#### Rails 6.0
|
365
|
+
|
366
|
+
For Rails versions greater than 6.0.0.beta2, `Zeitwerk` autoloader is the default for CRuby. By default `Zeitwerk` inflects `api` as `Api` instead of `API`. To make our example work, you need to uncomment the lines at the bottom of `config/initializers/inflections.rb`, and add `API` as an acronym:
|
328
367
|
|
329
368
|
```ruby
|
330
|
-
|
369
|
+
ActiveSupport::Inflector.inflections(:en) do |inflect|
|
370
|
+
inflect.acronym 'API'
|
371
|
+
end
|
331
372
|
```
|
332
373
|
|
333
|
-
See [below](#reloading-api-changes-in-development) for additional code that enables reloading of API changes in development.
|
334
|
-
|
335
374
|
### Modules
|
336
375
|
|
337
376
|
You can mount multiple API implementations inside another one. These don't have to be
|
@@ -365,6 +404,131 @@ class Twitter::API < Grape::API
|
|
365
404
|
end
|
366
405
|
```
|
367
406
|
|
407
|
+
## Remounting
|
408
|
+
|
409
|
+
You can mount the same endpoints in two different locations.
|
410
|
+
|
411
|
+
```ruby
|
412
|
+
class Voting::API < Grape::API
|
413
|
+
namespace 'votes' do
|
414
|
+
get do
|
415
|
+
# Your logic
|
416
|
+
end
|
417
|
+
|
418
|
+
post do
|
419
|
+
# Your logic
|
420
|
+
end
|
421
|
+
end
|
422
|
+
end
|
423
|
+
|
424
|
+
class Post::API < Grape::API
|
425
|
+
mount Voting::API
|
426
|
+
end
|
427
|
+
|
428
|
+
class Comment::API < Grape::API
|
429
|
+
mount Voting::API
|
430
|
+
end
|
431
|
+
```
|
432
|
+
|
433
|
+
Assuming that the post and comment endpoints are mounted in `/posts` and `/comments`, you should now be able to do `get /posts/votes`, `post /posts/votes`, `get /comments/votes` and `post /comments/votes`.
|
434
|
+
|
435
|
+
### Mount Configuration
|
436
|
+
|
437
|
+
You can configure remountable endpoints to change how they behave according to where they are mounted.
|
438
|
+
|
439
|
+
```ruby
|
440
|
+
class Voting::API < Grape::API
|
441
|
+
namespace 'votes' do
|
442
|
+
desc "Vote for your #{configuration[:votable]}"
|
443
|
+
get do
|
444
|
+
# Your logic
|
445
|
+
end
|
446
|
+
end
|
447
|
+
end
|
448
|
+
|
449
|
+
class Post::API < Grape::API
|
450
|
+
mount Voting::API, with: { votable: 'posts' }
|
451
|
+
end
|
452
|
+
|
453
|
+
class Comment::API < Grape::API
|
454
|
+
mount Voting::API, with: { votable: 'comments' }
|
455
|
+
end
|
456
|
+
```
|
457
|
+
|
458
|
+
Note that if you're passing a hash as the first parameter to `mount`, you will need to explicitly put `()` around parameters:
|
459
|
+
```ruby
|
460
|
+
# good
|
461
|
+
mount({ ::Some::Api => '/some/api' }, with: { condition: true })
|
462
|
+
|
463
|
+
# bad
|
464
|
+
mount ::Some::Api => '/some/api', with: { condition: true }
|
465
|
+
```
|
466
|
+
|
467
|
+
You can access `configuration` on the class (to use as dynamic attributes), inside blocks (like namespace)
|
468
|
+
|
469
|
+
If you want logic happening given on an `configuration`, you can use the helper `given`.
|
470
|
+
|
471
|
+
```ruby
|
472
|
+
class ConditionalEndpoint::API < Grape::API
|
473
|
+
given configuration[:some_setting] do
|
474
|
+
get 'mount_this_endpoint_conditionally' do
|
475
|
+
configuration[:configurable_response]
|
476
|
+
end
|
477
|
+
end
|
478
|
+
end
|
479
|
+
```
|
480
|
+
|
481
|
+
If you want a block of logic running every time an endpoint is mounted (within which you can access the `configuration` Hash)
|
482
|
+
|
483
|
+
|
484
|
+
```ruby
|
485
|
+
class ConditionalEndpoint::API < Grape::API
|
486
|
+
mounted do
|
487
|
+
YourLogger.info "This API was mounted at: #{Time.now}"
|
488
|
+
|
489
|
+
get configuration[:endpoint_name] do
|
490
|
+
configuration[:configurable_response]
|
491
|
+
end
|
492
|
+
end
|
493
|
+
end
|
494
|
+
```
|
495
|
+
|
496
|
+
More complex results can be achieved by using `mounted` as an expression within which the `configuration` is already evaluated as a Hash.
|
497
|
+
|
498
|
+
```ruby
|
499
|
+
class ExpressionEndpointAPI < Grape::API
|
500
|
+
get(mounted { configuration[:route_name] || 'default_name' }) do
|
501
|
+
# some logic
|
502
|
+
end
|
503
|
+
end
|
504
|
+
```
|
505
|
+
|
506
|
+
```ruby
|
507
|
+
class BasicAPI < Grape::API
|
508
|
+
desc 'Statuses index' do
|
509
|
+
params: mounted { configuration[:entity] || API::Entities::Status }.documentation
|
510
|
+
end
|
511
|
+
params do
|
512
|
+
requires :all, using: mounted { configuration[:entity] || API::Entities::Status }.documentation
|
513
|
+
end
|
514
|
+
get '/statuses' do
|
515
|
+
statuses = Status.all
|
516
|
+
type = current_user.admin? ? :full : :default
|
517
|
+
present statuses, with: mounted { configuration[:entity] || API::Entities::Status }, type: type
|
518
|
+
end
|
519
|
+
end
|
520
|
+
|
521
|
+
class V1 < Grape::API
|
522
|
+
version 'v1'
|
523
|
+
mount BasicAPI, with: { entity: mounted { configuration[:entity] || API::Enitities::Status } }
|
524
|
+
end
|
525
|
+
|
526
|
+
class V2 < Grape::API
|
527
|
+
version 'v2'
|
528
|
+
mount BasicAPI, with: { entity: mounted { configuration[:entity] || API::Enitities::V2::Status } }
|
529
|
+
end
|
530
|
+
```
|
531
|
+
|
368
532
|
## Versioning
|
369
533
|
|
370
534
|
There are four strategies in which clients can reach your API's endpoints: `:path`,
|
@@ -445,10 +609,13 @@ version 'v1', using: :param, parameter: 'v'
|
|
445
609
|
|
446
610
|
## Describing Methods
|
447
611
|
|
448
|
-
You can add a description to API methods and namespaces.
|
612
|
+
You can add a description to API methods and namespaces. The description would be used by [grape-swagger][grape-swagger] to generate swagger compliant documentation.
|
613
|
+
|
614
|
+
Note: Description block is only for documentation and won't affects API behavior.
|
449
615
|
|
450
616
|
```ruby
|
451
617
|
desc 'Returns your public timeline.' do
|
618
|
+
summary 'summary'
|
452
619
|
detail 'more details'
|
453
620
|
params API::Entities::Status.documentation
|
454
621
|
success API::Entities::Entity
|
@@ -462,7 +629,13 @@ desc 'Returns your public timeline.' do
|
|
462
629
|
description: 'Not really needed',
|
463
630
|
required: false
|
464
631
|
}
|
465
|
-
|
632
|
+
hidden false
|
633
|
+
deprecated false
|
634
|
+
is_array true
|
635
|
+
nickname 'nickname'
|
636
|
+
produces ['application/json']
|
637
|
+
consumes ['application/json']
|
638
|
+
tags ['tag1', 'tag2']
|
466
639
|
end
|
467
640
|
get :public_timeline do
|
468
641
|
Status.limit(20)
|
@@ -475,6 +648,43 @@ end
|
|
475
648
|
* `failure`: (former http_codes) A definition of the used failure HTTP Codes and Entities
|
476
649
|
* `named`: A helper to give a route a name and find it with this name in the documentation Hash
|
477
650
|
* `headers`: A definition of the used Headers
|
651
|
+
* Other options can be found in [grape-swagger][grape-swagger]
|
652
|
+
|
653
|
+
[grape-swagger]: https://github.com/ruby-grape/grape-swagger
|
654
|
+
|
655
|
+
## Configuration
|
656
|
+
|
657
|
+
Use `Grape.configure` to set up global settings at load time.
|
658
|
+
Currently the configurable settings are:
|
659
|
+
|
660
|
+
* `param_builder`: Sets the [Parameter Builder](#parameters), defaults to `Grape::Extensions::ActiveSupport::HashWithIndifferentAccess::ParamBuilder`.
|
661
|
+
|
662
|
+
To change a setting value make sure that at some point during load time the following code runs
|
663
|
+
|
664
|
+
```ruby
|
665
|
+
Grape.configure do |config|
|
666
|
+
config.setting = value
|
667
|
+
end
|
668
|
+
```
|
669
|
+
|
670
|
+
For example, for the `param_builder`, the following code could run in an initializer:
|
671
|
+
|
672
|
+
```ruby
|
673
|
+
Grape.configure do |config|
|
674
|
+
config.param_builder = Grape::Extensions::Hashie::Mash::ParamBuilder
|
675
|
+
end
|
676
|
+
```
|
677
|
+
|
678
|
+
You can also configure a single API:
|
679
|
+
|
680
|
+
```ruby
|
681
|
+
API.configure do |config|
|
682
|
+
config[key] = value
|
683
|
+
end
|
684
|
+
```
|
685
|
+
|
686
|
+
This will be available inside the API with `configuration`, as if it were
|
687
|
+
[mount configuration](#mount-configuration).
|
478
688
|
|
479
689
|
## Parameters
|
480
690
|
|
@@ -553,6 +763,8 @@ params do
|
|
553
763
|
end
|
554
764
|
```
|
555
765
|
|
766
|
+
Or globally with the [Configuration](#configuration) `Grape.configure.param_builder`.
|
767
|
+
|
556
768
|
In the example above, `params["color"]` will return `nil` since `params` is a plain `Hash`.
|
557
769
|
|
558
770
|
Available parameter builders are `Grape::Extensions::Hash::ParamBuilder`, `Grape::Extensions::ActiveSupport::HashWithIndifferentAccess::ParamBuilder` and `Grape::Extensions::Hashie::Mash::ParamBuilder`.
|
@@ -934,7 +1146,7 @@ parameter, and the return value must match the given `type`.
|
|
934
1146
|
|
935
1147
|
```ruby
|
936
1148
|
params do
|
937
|
-
requires :passwd, type: String, coerce_with: Base64.method(:
|
1149
|
+
requires :passwd, type: String, coerce_with: Base64.method(:decode64)
|
938
1150
|
requires :loud_color, type: Color, coerce_with: ->(c) { Color.parse(c.downcase) }
|
939
1151
|
|
940
1152
|
requires :obj, type: Hash, coerce_with: JSON do
|
@@ -1109,6 +1321,18 @@ params do
|
|
1109
1321
|
end
|
1110
1322
|
```
|
1111
1323
|
|
1324
|
+
You can rename parameters:
|
1325
|
+
|
1326
|
+
```ruby
|
1327
|
+
params do
|
1328
|
+
optional :category, as: :type
|
1329
|
+
given type: ->(val) { val == 'foo' } do
|
1330
|
+
requires :description
|
1331
|
+
end
|
1332
|
+
end
|
1333
|
+
```
|
1334
|
+
|
1335
|
+
Note: param in `given` should be the renamed one. In the example, it should be `type`, not `category`.
|
1112
1336
|
|
1113
1337
|
### Group Options
|
1114
1338
|
|
@@ -1137,9 +1361,9 @@ params do
|
|
1137
1361
|
end
|
1138
1362
|
```
|
1139
1363
|
|
1140
|
-
###
|
1364
|
+
### Renaming
|
1141
1365
|
|
1142
|
-
You can
|
1366
|
+
You can rename parameters using `as`, which can be useful when refactoring existing APIs:
|
1143
1367
|
|
1144
1368
|
```ruby
|
1145
1369
|
resource :users do
|
@@ -1248,6 +1472,17 @@ params do
|
|
1248
1472
|
end
|
1249
1473
|
```
|
1250
1474
|
|
1475
|
+
#### `same_as`
|
1476
|
+
|
1477
|
+
A `same_as` option can be given to ensure that values of parameters match.
|
1478
|
+
|
1479
|
+
```ruby
|
1480
|
+
params do
|
1481
|
+
requires :password
|
1482
|
+
requires :password_confirmation, same_as: :password
|
1483
|
+
end
|
1484
|
+
```
|
1485
|
+
|
1251
1486
|
#### `regexp`
|
1252
1487
|
|
1253
1488
|
Parameters can be restricted to match a specific regular expression with the `:regexp` option. If the value
|
@@ -1546,6 +1781,8 @@ end
|
|
1546
1781
|
Grape supports I18n for parameter-related error messages, but will fallback to English if
|
1547
1782
|
translations for the default locale have not been provided. See [en.yml](lib/grape/locale/en.yml) for message keys.
|
1548
1783
|
|
1784
|
+
In case your app enforces available locales only and :en is not included in your available locales, Grape cannot fall back to English and will return the translation key for the error message. To avoid this behaviour, either provide a translation for your default locale or add :en to your available locales.
|
1785
|
+
|
1549
1786
|
### Custom Validation messages
|
1550
1787
|
|
1551
1788
|
Grape supports custom validation messages for parameter-related and coerce-related error messages.
|
@@ -1558,6 +1795,15 @@ params do
|
|
1558
1795
|
end
|
1559
1796
|
```
|
1560
1797
|
|
1798
|
+
#### `same_as`
|
1799
|
+
|
1800
|
+
```ruby
|
1801
|
+
params do
|
1802
|
+
requires :password
|
1803
|
+
requires :password_confirmation, same_as: { value: :password, message: 'not match' }
|
1804
|
+
end
|
1805
|
+
```
|
1806
|
+
|
1561
1807
|
#### `all_or_none_of`
|
1562
1808
|
|
1563
1809
|
```ruby
|
@@ -1587,7 +1833,7 @@ params do
|
|
1587
1833
|
optional :beer
|
1588
1834
|
optional :wine
|
1589
1835
|
optional :juice
|
1590
|
-
exactly_one_of :beer, :wine, :juice, message: {exactly_one: "are missing, exactly one parameter is required", mutual_exclusion: "are mutually exclusive, exactly one parameter is required"}
|
1836
|
+
exactly_one_of :beer, :wine, :juice, message: { exactly_one: "are missing, exactly one parameter is required", mutual_exclusion: "are mutually exclusive, exactly one parameter is required" }
|
1591
1837
|
end
|
1592
1838
|
```
|
1593
1839
|
|
@@ -1606,7 +1852,7 @@ end
|
|
1606
1852
|
|
1607
1853
|
```ruby
|
1608
1854
|
params do
|
1609
|
-
requires :int, type: {value: Integer, message: "type cast is invalid" }
|
1855
|
+
requires :int, type: { value: Integer, message: "type cast is invalid" }
|
1610
1856
|
end
|
1611
1857
|
```
|
1612
1858
|
|
@@ -1668,6 +1914,7 @@ end
|
|
1668
1914
|
|
1669
1915
|
## Headers
|
1670
1916
|
|
1917
|
+
### Request
|
1671
1918
|
Request headers are available through the `headers` helper or from `env` in their original form.
|
1672
1919
|
|
1673
1920
|
```ruby
|
@@ -1682,13 +1929,30 @@ get do
|
|
1682
1929
|
end
|
1683
1930
|
```
|
1684
1931
|
|
1932
|
+
#### Header Case Handling
|
1933
|
+
|
1934
|
+
The above example may have been requested as follows:
|
1935
|
+
|
1936
|
+
``` shell
|
1937
|
+
curl -H "secret_PassWord: swordfish" ...
|
1938
|
+
```
|
1939
|
+
|
1940
|
+
The header name will have been normalized for you.
|
1941
|
+
|
1942
|
+
- In the `header` helper names will be coerced into a capitalized kebab case.
|
1943
|
+
- In the `env` collection they appear in all uppercase, in snake case, and prefixed with 'HTTP_'.
|
1944
|
+
|
1945
|
+
The header name will have been normalized per HTTP standards defined in [RFC2616 Section 4.2](https://www.w3.org/Protocols/rfc2616/rfc2616-sec4.html#sec4.2) regardless of what is being sent by a client.
|
1946
|
+
|
1947
|
+
### Response
|
1948
|
+
|
1685
1949
|
You can set a response header with `header` inside an API.
|
1686
1950
|
|
1687
1951
|
```ruby
|
1688
1952
|
header 'X-Robots-Tag', 'noindex'
|
1689
1953
|
```
|
1690
1954
|
|
1691
|
-
When raising `error!`, pass additional headers as arguments.
|
1955
|
+
When raising `error!`, pass additional headers as arguments. Additional headers will be merged with headers set before `error!` call.
|
1692
1956
|
|
1693
1957
|
```ruby
|
1694
1958
|
error! 'Unauthorized', 401, 'X-Error-Detail' => 'Invalid token.'
|
@@ -1696,6 +1960,56 @@ error! 'Unauthorized', 401, 'X-Error-Detail' => 'Invalid token.'
|
|
1696
1960
|
|
1697
1961
|
## Routes
|
1698
1962
|
|
1963
|
+
To define routes you can use the `route` method or the shorthands for the HTTP verbs. To define a route that accepts any route set to `:any`.
|
1964
|
+
Parts of the path that are denoted with a colon will be interpreted as route parameters.
|
1965
|
+
|
1966
|
+
```ruby
|
1967
|
+
route :get, 'status' do
|
1968
|
+
end
|
1969
|
+
|
1970
|
+
# is the same as
|
1971
|
+
|
1972
|
+
get 'status' do
|
1973
|
+
end
|
1974
|
+
|
1975
|
+
# is the same as
|
1976
|
+
|
1977
|
+
get :status do
|
1978
|
+
end
|
1979
|
+
|
1980
|
+
# is NOT the same as
|
1981
|
+
|
1982
|
+
get ':status' do # this makes param[:status] available
|
1983
|
+
end
|
1984
|
+
|
1985
|
+
# This will make both param[:status_id] and param[:id] available
|
1986
|
+
|
1987
|
+
get 'statuses/:status_id/reviews/:id' do
|
1988
|
+
end
|
1989
|
+
```
|
1990
|
+
|
1991
|
+
To declare a namespace that prefixes all routes within, use the `namespace` method. `group`, `resource`, `resources` and `segment` are aliases to this method. Any endpoints within will share their parent context as well as any configuration done in the namespace context.
|
1992
|
+
|
1993
|
+
The `route_param` method is a convenient method for defining a parameter route segment. If you define a type, it will add a validation for this parameter.
|
1994
|
+
|
1995
|
+
```ruby
|
1996
|
+
route_param :id, type: Integer do
|
1997
|
+
get 'status' do
|
1998
|
+
end
|
1999
|
+
end
|
2000
|
+
|
2001
|
+
# is the same as
|
2002
|
+
|
2003
|
+
namespace ':id' do
|
2004
|
+
params do
|
2005
|
+
requires :id, type: Integer
|
2006
|
+
end
|
2007
|
+
|
2008
|
+
get 'status' do
|
2009
|
+
end
|
2010
|
+
end
|
2011
|
+
```
|
2012
|
+
|
1699
2013
|
Optionally, you can define requirements for your named route parameters using regular
|
1700
2014
|
expressions on namespace or endpoint. The route will match only if all requirements are met.
|
1701
2015
|
|
@@ -2028,6 +2342,12 @@ instead of a message.
|
|
2028
2342
|
error!({ error: 'unexpected error', detail: 'missing widget' }, 500)
|
2029
2343
|
```
|
2030
2344
|
|
2345
|
+
You can set additional headers for the response. They will be merged with headers set before `error!` call.
|
2346
|
+
|
2347
|
+
```ruby
|
2348
|
+
error!('Something went wrong', 500, 'X-Error-Detail' => 'Invalid token.')
|
2349
|
+
```
|
2350
|
+
|
2031
2351
|
You can present documented errors with a Grape entity using the the [grape-entity](https://github.com/ruby-grape/grape-entity) gem.
|
2032
2352
|
|
2033
2353
|
```ruby
|
@@ -2182,7 +2502,7 @@ You can also rescue all exceptions with a code block and handle the Rack respons
|
|
2182
2502
|
```ruby
|
2183
2503
|
class Twitter::API < Grape::API
|
2184
2504
|
rescue_from :all do |e|
|
2185
|
-
Rack::Response.new([ e.message ], 500, { 'Content-type' => 'text/error' })
|
2505
|
+
Rack::Response.new([ e.message ], 500, { 'Content-type' => 'text/error' })
|
2186
2506
|
end
|
2187
2507
|
end
|
2188
2508
|
```
|
@@ -2253,9 +2573,9 @@ class Twitter::API < Grape::API
|
|
2253
2573
|
end
|
2254
2574
|
```
|
2255
2575
|
|
2256
|
-
The `rescue_from`
|
2576
|
+
The `rescue_from` handler must return a `Rack::Response` object, call `error!`, or raise an exception (either the original exception or another custom one). The exception raised in `rescue_from` will be handled outside Grape. For example, if you mount Grape in Rails, the exception will be handle by [Rails Action Controller](https://guides.rubyonrails.org/action_controller_overview.html#rescue).
|
2257
2577
|
|
2258
|
-
|
2578
|
+
Alternately, use the `with` option in `rescue_from` to specify a method or a `proc`.
|
2259
2579
|
|
2260
2580
|
```ruby
|
2261
2581
|
class Twitter::API < Grape::API
|
@@ -2271,6 +2591,17 @@ class Twitter::API < Grape::API
|
|
2271
2591
|
end
|
2272
2592
|
```
|
2273
2593
|
|
2594
|
+
Inside the `rescue_from` block, the environment of the original controller method(`.self` receiver) is accessible through the `#context` method.
|
2595
|
+
|
2596
|
+
```ruby
|
2597
|
+
class Twitter::API < Grape::API
|
2598
|
+
rescue_from :all do |e|
|
2599
|
+
user_id = context.params[:user_id]
|
2600
|
+
error!("error for #{user_id}")
|
2601
|
+
end
|
2602
|
+
end
|
2603
|
+
```
|
2604
|
+
|
2274
2605
|
#### Rescuing exceptions inside namespaces
|
2275
2606
|
|
2276
2607
|
You could put `rescue_from` clauses inside a namespace and they will take precedence over ones
|
@@ -2293,7 +2624,7 @@ class Twitter::API < Grape::API
|
|
2293
2624
|
end
|
2294
2625
|
```
|
2295
2626
|
|
2296
|
-
Here `'inner'` will be result of handling
|
2627
|
+
Here `'inner'` will be result of handling occurred `ArgumentError`.
|
2297
2628
|
|
2298
2629
|
#### Unrescuable Exceptions
|
2299
2630
|
|
@@ -2893,7 +3224,9 @@ end
|
|
2893
3224
|
|
2894
3225
|
```
|
2895
3226
|
|
2896
|
-
Use [warden-oauth2](https://github.com/opperator/warden-oauth2) or [rack-oauth2](https://github.com/nov/rack-oauth2) for OAuth2 support.
|
3227
|
+
Use [Doorkeeper](https://github.com/doorkeeper-gem/doorkeeper), [warden-oauth2](https://github.com/opperator/warden-oauth2) or [rack-oauth2](https://github.com/nov/rack-oauth2) for OAuth2 support.
|
3228
|
+
|
3229
|
+
You can access the controller params, headers, and helpers through the context with the `#context` method inside any auth middleware inherited from `Grape::Middlware::Auth::Base`.
|
2897
3230
|
|
2898
3231
|
## Describing and Inspecting an API
|
2899
3232
|
|
@@ -2962,19 +3295,22 @@ class ApiLogger < Grape::Middleware::Base
|
|
2962
3295
|
end
|
2963
3296
|
```
|
2964
3297
|
|
2965
|
-
## Before and
|
3298
|
+
## Before, After and Finally
|
2966
3299
|
|
2967
3300
|
Blocks can be executed before or after every API call, using `before`, `after`,
|
2968
3301
|
`before_validation` and `after_validation`.
|
3302
|
+
If the API fails the `after` call will not be trigered, if you need code to execute for sure
|
3303
|
+
use the `finally`.
|
2969
3304
|
|
2970
3305
|
Before and after callbacks execute in the following order:
|
2971
3306
|
|
2972
3307
|
1. `before`
|
2973
3308
|
2. `before_validation`
|
2974
3309
|
3. _validations_
|
2975
|
-
4. `after_validation`
|
2976
|
-
5. _the API call_
|
2977
|
-
6. `after`
|
3310
|
+
4. `after_validation` (upon successful validation)
|
3311
|
+
5. _the API call_ (upon successful validation)
|
3312
|
+
6. `after` (upon successful validation and API call)
|
3313
|
+
7. `finally` (always)
|
2978
3314
|
|
2979
3315
|
Steps 4, 5 and 6 only happen if validation succeeds.
|
2980
3316
|
|
@@ -2994,6 +3330,14 @@ before do
|
|
2994
3330
|
end
|
2995
3331
|
```
|
2996
3332
|
|
3333
|
+
You can ensure a block of code runs after every request (including failures) with `finally`:
|
3334
|
+
|
3335
|
+
```ruby
|
3336
|
+
finally do
|
3337
|
+
# this code will run after every request (successful or failed)
|
3338
|
+
end
|
3339
|
+
```
|
3340
|
+
|
2997
3341
|
**Namespaces**
|
2998
3342
|
|
2999
3343
|
Callbacks apply to each API call within and below the current namespace:
|
@@ -3196,6 +3540,8 @@ class API < Grape::API
|
|
3196
3540
|
end
|
3197
3541
|
```
|
3198
3542
|
|
3543
|
+
You can access the controller params, headers, and helpers through the context with the `#context` method inside any middleware inherited from `Grape::Middlware::Base`.
|
3544
|
+
|
3199
3545
|
### Rails Middleware
|
3200
3546
|
|
3201
3547
|
Note that when you're using Grape mounted on Rails you don't have to use Rails middleware because it's already included into your middleware stack.
|
@@ -3504,6 +3850,7 @@ Grape integrates with following third-party tools:
|
|
3504
3850
|
* **Librato Metrics** - [grape-librato](https://github.com/seanmoon/grape-librato) gem
|
3505
3851
|
* **[Skylight](https://www.skylight.io/)** - [skylight](https://github.com/skylightio/skylight-ruby) gem, [documentation](https://docs.skylight.io/grape/)
|
3506
3852
|
* **[AppSignal](https://www.appsignal.com)** - [appsignal-ruby](https://github.com/appsignal/appsignal-ruby) gem, [documentation](http://docs.appsignal.com/getting-started/supported-frameworks.html#grape)
|
3853
|
+
* **[ElasticAPM](https://www.elastic.co/products/apm) - [elastic-apm](https://github.com/elastic/apm-agent-ruby) gem, [documentation](https://www.elastic.co/guide/en/apm/agent/ruby/3.x/getting-started-rack.html#getting-started-grape)
|
3507
3854
|
|
3508
3855
|
## Contributing to Grape
|
3509
3856
|
|
@@ -3518,4 +3865,4 @@ MIT License. See LICENSE for details.
|
|
3518
3865
|
|
3519
3866
|
## Copyright
|
3520
3867
|
|
3521
|
-
Copyright (c) 2010-
|
3868
|
+
Copyright (c) 2010-2019 Michael Bleigh, Intridea Inc. and Contributors.
|