grape 1.3.0 → 1.5.2
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 +119 -1
- data/LICENSE +1 -1
- data/README.md +123 -29
- data/UPGRADING.md +265 -39
- data/lib/grape/api/instance.rb +32 -31
- data/lib/grape/api.rb +5 -5
- data/lib/grape/content_types.rb +34 -0
- data/lib/grape/dsl/callbacks.rb +1 -1
- data/lib/grape/dsl/helpers.rb +2 -1
- data/lib/grape/dsl/inside_route.rb +77 -43
- data/lib/grape/dsl/parameters.rb +12 -8
- data/lib/grape/dsl/routing.rb +12 -11
- data/lib/grape/dsl/validations.rb +18 -1
- data/lib/grape/eager_load.rb +1 -1
- data/lib/grape/endpoint.rb +8 -6
- data/lib/grape/exceptions/base.rb +0 -4
- data/lib/grape/exceptions/validation.rb +1 -1
- data/lib/grape/exceptions/validation_errors.rb +12 -13
- data/lib/grape/http/headers.rb +26 -0
- data/lib/grape/middleware/auth/base.rb +3 -3
- data/lib/grape/middleware/base.rb +4 -5
- data/lib/grape/middleware/error.rb +11 -13
- data/lib/grape/middleware/formatter.rb +3 -3
- data/lib/grape/middleware/stack.rb +10 -2
- data/lib/grape/middleware/versioner/header.rb +4 -4
- data/lib/grape/middleware/versioner/parse_media_type_patch.rb +2 -1
- data/lib/grape/middleware/versioner/path.rb +1 -1
- data/lib/grape/namespace.rb +12 -2
- data/lib/grape/path.rb +13 -3
- data/lib/grape/request.rb +13 -8
- data/lib/grape/router/attribute_translator.rb +26 -5
- data/lib/grape/router/pattern.rb +17 -16
- data/lib/grape/router/route.rb +5 -24
- data/lib/grape/router.rb +26 -30
- data/lib/grape/{serve_file → serve_stream}/file_body.rb +1 -1
- data/lib/grape/{serve_file → serve_stream}/sendfile_response.rb +1 -1
- data/lib/grape/{serve_file/file_response.rb → serve_stream/stream_response.rb} +8 -8
- data/lib/grape/util/base_inheritable.rb +15 -8
- data/lib/grape/util/cache.rb +20 -0
- data/lib/grape/util/lazy_object.rb +43 -0
- data/lib/grape/util/lazy_value.rb +1 -0
- data/lib/grape/util/reverse_stackable_values.rb +2 -0
- data/lib/grape/util/stackable_values.rb +7 -20
- data/lib/grape/validations/attributes_iterator.rb +8 -0
- data/lib/grape/validations/multiple_attributes_iterator.rb +1 -1
- data/lib/grape/validations/params_scope.rb +10 -8
- data/lib/grape/validations/single_attribute_iterator.rb +1 -1
- data/lib/grape/validations/types/array_coercer.rb +14 -5
- data/lib/grape/validations/types/build_coercer.rb +5 -8
- data/lib/grape/validations/types/custom_type_coercer.rb +16 -2
- data/lib/grape/validations/types/dry_type_coercer.rb +36 -1
- data/lib/grape/validations/types/file.rb +15 -12
- data/lib/grape/validations/types/invalid_value.rb +24 -0
- data/lib/grape/validations/types/json.rb +40 -36
- data/lib/grape/validations/types/primitive_coercer.rb +15 -6
- data/lib/grape/validations/types/set_coercer.rb +6 -4
- data/lib/grape/validations/types/variant_collection_coercer.rb +1 -1
- data/lib/grape/validations/types.rb +7 -9
- data/lib/grape/validations/validator_factory.rb +1 -1
- data/lib/grape/validations/validators/as.rb +1 -1
- data/lib/grape/validations/validators/base.rb +8 -8
- data/lib/grape/validations/validators/coerce.rb +11 -15
- data/lib/grape/validations/validators/default.rb +3 -5
- data/lib/grape/validations/validators/exactly_one_of.rb +4 -2
- data/lib/grape/validations/validators/except_values.rb +1 -1
- data/lib/grape/validations/validators/multiple_params_base.rb +2 -1
- data/lib/grape/validations/validators/regexp.rb +1 -1
- data/lib/grape/validations/validators/values.rb +1 -1
- data/lib/grape/version.rb +1 -1
- data/lib/grape.rb +5 -5
- data/spec/grape/api/instance_spec.rb +50 -0
- data/spec/grape/api_remount_spec.rb +9 -4
- data/spec/grape/api_spec.rb +82 -6
- data/spec/grape/dsl/inside_route_spec.rb +182 -33
- data/spec/grape/endpoint/declared_spec.rb +601 -0
- data/spec/grape/endpoint_spec.rb +0 -521
- data/spec/grape/entity_spec.rb +7 -1
- data/spec/grape/exceptions/validation_errors_spec.rb +2 -2
- data/spec/grape/integration/rack_sendfile_spec.rb +12 -8
- data/spec/grape/middleware/auth/strategies_spec.rb +1 -1
- data/spec/grape/middleware/error_spec.rb +1 -1
- data/spec/grape/middleware/formatter_spec.rb +3 -3
- data/spec/grape/middleware/stack_spec.rb +10 -0
- data/spec/grape/path_spec.rb +4 -4
- data/spec/grape/request_spec.rb +1 -1
- data/spec/grape/validations/instance_behaivour_spec.rb +1 -1
- data/spec/grape/validations/multiple_attributes_iterator_spec.rb +13 -3
- data/spec/grape/validations/params_scope_spec.rb +26 -0
- data/spec/grape/validations/single_attribute_iterator_spec.rb +17 -6
- data/spec/grape/validations/types/array_coercer_spec.rb +35 -0
- data/spec/grape/validations/types/primitive_coercer_spec.rb +135 -0
- data/spec/grape/validations/types/set_coercer_spec.rb +34 -0
- data/spec/grape/validations/types_spec.rb +1 -1
- data/spec/grape/validations/validators/coerce_spec.rb +366 -86
- data/spec/grape/validations/validators/default_spec.rb +170 -0
- data/spec/grape/validations/validators/exactly_one_of_spec.rb +12 -12
- data/spec/grape/validations/validators/except_values_spec.rb +1 -0
- data/spec/grape/validations/validators/values_spec.rb +1 -1
- data/spec/grape/validations_spec.rb +298 -30
- data/spec/integration/eager_load/eager_load_spec.rb +15 -0
- data/spec/shared/versioning_examples.rb +20 -20
- data/spec/spec_helper.rb +3 -10
- data/spec/support/chunks.rb +14 -0
- data/spec/support/eager_load.rb +19 -0
- data/spec/support/versioned_helpers.rb +4 -6
- metadata +27 -10
- data/lib/grape/util/content_types.rb +0 -28
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: ac9fdc749f4dcad72fa8baacf0b07fa0fa499552521c789dd8e84439554ce275
|
|
4
|
+
data.tar.gz: 075b2bc7e75e7b0240973086cdae37cd2adf10ef4a4c419dc2cccd7a2741a3cd
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: b845801e8c95ceee643853fd306c1513ce0611ebd535f3e2f058e95b4c491da08f58bcbd33b8d42d2cd8f1432d619dda203f8243fcc72e2b808ec4d0e15bc81c
|
|
7
|
+
data.tar.gz: ccdf098f65e4331fc35eaab564fbaf8d7411d1ae6f394f4cf4e0fdfa4f4871092e60b23a8a3a60ffc95680e3287446cac343932b0ef2af6b0745b91422d1d0a4
|
data/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,121 @@
|
|
|
1
|
+
### 1.5.2 (2021/02/06)
|
|
2
|
+
|
|
3
|
+
#### Features
|
|
4
|
+
|
|
5
|
+
* [#2157](https://github.com/ruby-grape/grape/pull/2157): Custom types can set a message to be used in the response when invalid - [@dnesteryuk](https://github.com/dnesteryuk).
|
|
6
|
+
* [#2145](https://github.com/ruby-grape/grape/pull/2145): Ruby 3.0 compatibility - [@ericproulx](https://github.com/ericproulx).
|
|
7
|
+
* [#2143](https://github.com/ruby-grape/grape/pull/2143): Enable GitHub Actions with updated RuboCop and Danger - [@anakinj](https://github.com/anakinj).
|
|
8
|
+
|
|
9
|
+
#### Fixes
|
|
10
|
+
|
|
11
|
+
* [#2144](https://github.com/ruby-grape/grape/pull/2144): Fix compatibility issue with activesupport 6.1 and XML serialization of arrays - [@anakinj](https://github.com/anakinj).
|
|
12
|
+
* [#2137](https://github.com/ruby-grape/grape/pull/2137): Fix typos - [@johnny-miyake](https://github.com/johnny-miyake).
|
|
13
|
+
* [#2131](https://github.com/ruby-grape/grape/pull/2131): Fix Ruby 2.7 keyword deprecation warning in validators/coerce - [@K0H205](https://github.com/K0H205).
|
|
14
|
+
* [#2132](https://github.com/ruby-grape/grape/pull/2132): Use #ruby2_keywords for correct delegation on Ruby <= 2.6, 2.7 and 3 - [@eregon](https://github.com/eregon).
|
|
15
|
+
* [#2152](https://github.com/ruby-grape/grape/pull/2152): Fix configuration method inside namespaced params - [@fsainz](https://github.com/fsainz).
|
|
16
|
+
|
|
17
|
+
### 1.5.1 (2020/11/15)
|
|
18
|
+
|
|
19
|
+
#### Fixes
|
|
20
|
+
|
|
21
|
+
* [#2129](https://github.com/ruby-grape/grape/pull/2129): Fix validation error when Required Array nested inside an optional array, for Multiparam validators - [@dwhenry](https://github.com/dwhenry).
|
|
22
|
+
* [#2128](https://github.com/ruby-grape/grape/pull/2128): Fix validation error when Required Array nested inside an optional array - [@dwhenry](https://github.com/dwhenry).
|
|
23
|
+
* [#2127](https://github.com/ruby-grape/grape/pull/2127): Fix a performance issue with dependent params - [@dnesteryuk](https://github.com/dnesteryuk).
|
|
24
|
+
* [#2126](https://github.com/ruby-grape/grape/pull/2126): Fix warnings about redefined attribute accessors in `AttributeTranslator` - [@samsonjs](https://github.com/samsonjs).
|
|
25
|
+
* [#2121](https://github.com/ruby-grape/grape/pull/2121): Fix 2.7 deprecation warning in validator_factory - [@Legogris](https://github.com/Legogris).
|
|
26
|
+
* [#2115](https://github.com/ruby-grape/grape/pull/2115): Fix declared_params regression with multiple allowed types - [@stanhu](https://github.com/stanhu).
|
|
27
|
+
* [#2123](https://github.com/ruby-grape/grape/pull/2123): Fix 2.7 deprecation warning in middleware/stack - [@Legogris](https://github.com/Legogris).
|
|
28
|
+
|
|
29
|
+
### 1.5.0 (2020/10/05)
|
|
30
|
+
|
|
31
|
+
#### Fixes
|
|
32
|
+
|
|
33
|
+
* [#2104](https://github.com/ruby-grape/grape/pull/2104): Fix Ruby 2.7 keyword deprecation warning - [@stanhu](https://github.com/stanhu).
|
|
34
|
+
* [#2103](https://github.com/ruby-grape/grape/pull/2103): Ensure complete declared params structure is present - [@tlconnor](https://github.com/tlconnor).
|
|
35
|
+
* [#2099](https://github.com/ruby-grape/grape/pull/2099): Added truffleruby to Travis-CI - [@gogainda](https://github.com/gogainda).
|
|
36
|
+
* [#2089](https://github.com/ruby-grape/grape/pull/2089): Specify order of mounting Grape with Rack::Cascade in README - [@jonmchan](https://github.com/jonmchan).
|
|
37
|
+
* [#2088](https://github.com/ruby-grape/grape/pull/2088): Set `Cache-Control` header only for streamed responses - [@stanhu](https://github.com/stanhu).
|
|
38
|
+
* [#2092](https://github.com/ruby-grape/grape/pull/2092): Correct an example params in Include Missing doc - [@huyvohcmc](https://github.com/huyvohcmc).
|
|
39
|
+
* [#2091](https://github.com/ruby-grape/grape/pull/2091): Fix ruby 2.7 keyword deprecations - [@dim](https://github.com/dim).
|
|
40
|
+
* [#2097](https://github.com/ruby-grape/grape/pull/2097): Skip to set default value unless `meets_dependency?` - [@wanabe](https://github.com/wanabe).
|
|
41
|
+
* [#2096](https://github.com/ruby-grape/grape/pull/2096): Fix redundant dependency check - [@braktar](https://github.com/braktar).
|
|
42
|
+
* [#2096](https://github.com/ruby-grape/grape/pull/2098): Fix nested coercion - [@braktar](https://github.com/braktar).
|
|
43
|
+
* [#2102](https://github.com/ruby-grape/grape/pull/2102): Fix retaining setup blocks when remounting APIs - [@jylamont](https://github.com/jylamont).
|
|
44
|
+
|
|
45
|
+
### 1.4.0 (2020/07/10)
|
|
46
|
+
|
|
47
|
+
#### Features
|
|
48
|
+
|
|
49
|
+
* [#1520](https://github.com/ruby-grape/grape/pull/1520): Un-deprecate stream-like objects - [@urkle](https://github.com/urkle).
|
|
50
|
+
* [#2060](https://github.com/ruby-grape/grape/pull/2060): Drop support for Ruby 2.4 - [@dblock](https://github.com/dblock).
|
|
51
|
+
* [#2060](https://github.com/ruby-grape/grape/pull/2060): Upgraded Rubocop to 0.84.0 - [@dblock](https://github.com/dblock).
|
|
52
|
+
* [#2077](https://github.com/ruby-grape/grape/pull/2077): Simplify logic for defining declared params - [@dnesteryuk](https://github.com/dnesteryuk).
|
|
53
|
+
* [#2076](https://github.com/ruby-grape/grape/pull/2076): Make route information available for hooks when the automatically generated endpoints are invoked - [@anakinj](https://github.com/anakinj).
|
|
54
|
+
|
|
55
|
+
#### Fixes
|
|
56
|
+
|
|
57
|
+
* [#2067](https://github.com/ruby-grape/grape/pull/2067): Coerce empty String to `nil` for all primitive types except `String` - [@petekinnecom](https://github.com/petekinnecom).
|
|
58
|
+
* [#2064](https://github.com/ruby-grape/grape/pull/2064): Fix Ruby 2.7 deprecation warning in `Grape::Middleware::Base#initialize` - [@skarger](https://github.com/skarger).
|
|
59
|
+
* [#2072](https://github.com/ruby-grape/grape/pull/2072): Fix `Grape.eager_load!` and `compile!` - [@stanhu](https://github.com/stanhu).
|
|
60
|
+
* [#2084](https://github.com/ruby-grape/grape/pull/2084): Fix memory leak in path normalization - [@fcheung](https://github.com/fcheung).
|
|
61
|
+
|
|
62
|
+
### 1.3.3 (2020/05/23)
|
|
63
|
+
|
|
64
|
+
#### Features
|
|
65
|
+
|
|
66
|
+
* [#2048](https://github.com/ruby-grape/grape/issues/2034): Grape Enterprise support is now available [via TideLift](https://tidelift.com/subscription/request-a-demo?utm_source=rubygems-grape&utm_medium=referral&utm_campaign=enterprise) - [@dblock](https://github.com/dblock).
|
|
67
|
+
* [#2039](https://github.com/ruby-grape/grape/pull/2039): Travis - update rails versions - [@ericproulx](https://github.com/ericproulx).
|
|
68
|
+
* [#2038](https://github.com/ruby-grape/grape/pull/2038): Travis - update ruby versions - [@ericproulx](https://github.com/ericproulx).
|
|
69
|
+
* [#2050](https://github.com/ruby-grape/grape/pull/2050): Refactor route public_send to AttributeTranslator - [@ericproulx](https://github.com/ericproulx).
|
|
70
|
+
|
|
71
|
+
#### Fixes
|
|
72
|
+
|
|
73
|
+
* [#2049](https://github.com/ruby-grape/grape/pull/2049): Coerce an empty string to nil in case of the bool type - [@dnesteryuk](https://github.com/dnesteryuk).
|
|
74
|
+
* [#2043](https://github.com/ruby-grape/grape/pull/2043): Modify declared for nested array and hash - [@kadotami](https://github.com/kadotami).
|
|
75
|
+
* [#2040](https://github.com/ruby-grape/grape/pull/2040): Fix a regression with Array of type nil - [@ericproulx](https://github.com/ericproulx).
|
|
76
|
+
* [#2054](https://github.com/ruby-grape/grape/pull/2054): Coercing of nested arrays - [@dnesteryuk](https://github.com/dnesteryuk).
|
|
77
|
+
* [#2050](https://github.com/ruby-grape/grape/pull/2053): Fix broken multiple mounts - [@Jack12816](https://github.com/Jack12816).
|
|
78
|
+
|
|
79
|
+
### 1.3.2 (2020/04/12)
|
|
80
|
+
|
|
81
|
+
#### Features
|
|
82
|
+
|
|
83
|
+
* [#2020](https://github.com/ruby-grape/grape/pull/2020): Reduce array allocation - [@ericproulx](https://github.com/ericproulx).
|
|
84
|
+
* [#2015](https://github.com/ruby-grape/grape/pull/2014): Reduce MatchData allocation - [@ericproulx](https://github.com/ericproulx).
|
|
85
|
+
* [#2014](https://github.com/ruby-grape/grape/pull/2014): Reduce total allocated arrays - [@ericproulx](https://github.com/ericproulx).
|
|
86
|
+
* [#2011](https://github.com/ruby-grape/grape/pull/2011): Reduce total retained regexes - [@ericproulx](https://github.com/ericproulx).
|
|
87
|
+
|
|
88
|
+
#### Fixes
|
|
89
|
+
|
|
90
|
+
* [#2033](https://github.com/ruby-grape/grape/pull/2033): Ensure `Float` params are correctly coerced to `BigDecimal` - [@tlconnor](https://github.com/tlconnor).
|
|
91
|
+
* [#2031](https://github.com/ruby-grape/grape/pull/2031): Fix a regression with an array of a custom type - [@dnesteryuk](https://github.com/dnesteryuk).
|
|
92
|
+
* [#2026](https://github.com/ruby-grape/grape/pull/2026): Fix a regression in `coerce_with` when coercion returns `nil` - [@misdoro](https://github.com/misdoro).
|
|
93
|
+
* [#2025](https://github.com/ruby-grape/grape/pull/2025): Fix Decimal type category - [@kdoya](https://github.com/kdoya).
|
|
94
|
+
* [#2019](https://github.com/ruby-grape/grape/pull/2019): Avoid coercing parameter with multiple types to an empty Array - [@stanhu](https://github.com/stanhu).
|
|
95
|
+
|
|
96
|
+
### 1.3.1 (2020/03/11)
|
|
97
|
+
|
|
98
|
+
#### Features
|
|
99
|
+
|
|
100
|
+
* [#2005](https://github.com/ruby-grape/grape/pull/2005): Content types registrable - [@ericproulx](https://github.com/ericproulx).
|
|
101
|
+
* [#2003](https://github.com/ruby-grape/grape/pull/2003): Upgraded Rubocop to 0.80.1 - [@ericproulx](https://github.com/ericproulx).
|
|
102
|
+
* [#2002](https://github.com/ruby-grape/grape/pull/2002): Objects allocation optimization (lazy_lookup) - [@ericproulx](https://github.com/ericproulx).
|
|
103
|
+
|
|
104
|
+
#### Fixes
|
|
105
|
+
|
|
106
|
+
* [#2006](https://github.com/ruby-grape/grape/pull/2006): Fix explicit rescue StandardError - [@ericproulx](https://github.com/ericproulx).
|
|
107
|
+
* [#2004](https://github.com/ruby-grape/grape/pull/2004): Rubocop fixes - [@ericproulx](https://github.com/ericproulx).
|
|
108
|
+
* [#1995](https://github.com/ruby-grape/grape/pull/1995): Fix: "undefined instance variables" and "method redefined" warnings - [@nbeyer](https://github.com/nbeyer).
|
|
109
|
+
* [#1994](https://github.com/ruby-grape/grape/pull/1993): Fix typos in README - [@bellmyer](https://github.com/bellmyer).
|
|
110
|
+
* [#1993](https://github.com/ruby-grape/grape/pull/1993): Lazy join allow header - [@ericproulx](https://github.com/ericproulx).
|
|
111
|
+
* [#1987](https://github.com/ruby-grape/grape/pull/1987): Re-add exactly_one_of mutually exclusive error message - [@ZeroInputCtrl](https://github.com/ZeroInputCtrl).
|
|
112
|
+
* [#1977](https://github.com/ruby-grape/grape/pull/1977): Skip validation for a file if it is optional and nil - [@dnesteryuk](https://github.com/dnesteryuk).
|
|
113
|
+
* [#1976](https://github.com/ruby-grape/grape/pull/1976): Ensure classes/modules listed for autoload really exist - [@dnesteryuk](https://github.com/dnesteryuk).
|
|
114
|
+
* [#1971](https://github.com/ruby-grape/grape/pull/1971): Fix BigDecimal coercion - [@FlickStuart](https://github.com/FlickStuart).
|
|
115
|
+
* [#1968](https://github.com/ruby-grape/grape/pull/1968): Fix args forwarding in Grape::Middleware::Stack#merge_with for ruby 2.7.0 - [@dm1try](https://github.com/dm1try).
|
|
116
|
+
* [#1988](https://github.com/ruby-grape/grape/pull/1988): Refactor the full_messages method and stop overriding full_message - [@hosseintoussi](https://github.com/hosseintoussi).
|
|
117
|
+
* [#1956](https://github.com/ruby-grape/grape/pull/1956): Comply with Rack spec, fix `undefined method [] for nil:NilClass` error when upgrading Rack - [@ioquatix](https://github.com/ioquatix).
|
|
118
|
+
|
|
1
119
|
### 1.3.0 (2020/01/11)
|
|
2
120
|
|
|
3
121
|
#### Features
|
|
@@ -519,7 +637,7 @@
|
|
|
519
637
|
* [#492](https://github.com/ruby-grape/grape/pull/492): Don't allow to have nil value when a param is required and has a list of allowed values - [@Antti](https://github.com/Antti).
|
|
520
638
|
* [#495](https://github.com/ruby-grape/grape/pull/495): Fixed `ParamsScope#params` for parameters nested inside arrays - [@asross](https://github.com/asross).
|
|
521
639
|
* [#498](https://github.com/ruby-grape/grape/pull/498): Dry'ed up options and headers logic, allow headers to be passed to OPTIONS requests - [@karlfreeman](https://github.com/karlfreeman).
|
|
522
|
-
* [#500](https://github.com/ruby-grape/grape/pull/500): Skip entity auto-detection when
|
|
640
|
+
* [#500](https://github.com/ruby-grape/grape/pull/500): Skip entity auto-detection when explicitly passed - [@yaneq](https://github.com/yaneq).
|
|
523
641
|
* [#503](https://github.com/ruby-grape/grape/pull/503): Calling declared(params) from child namespace fails to include parent namespace defined params - [@myitcv](https://github.com/myitcv).
|
|
524
642
|
* [#512](https://github.com/ruby-grape/grape/pull/512): Don't create `Grape::Request` multiple times - [@dblock](https://github.com/dblock).
|
|
525
643
|
* [#538](https://github.com/ruby-grape/grape/pull/538): Fixed default values for grouped params - [@dm1try](https://github.com/dm1try).
|
data/LICENSE
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
Copyright (c) 2010-
|
|
1
|
+
Copyright (c) 2010-2020 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
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|

|
|
2
2
|
|
|
3
3
|
[](http://badge.fury.io/rb/grape)
|
|
4
|
-
[](https://github.com/ruby-grape/grape/actions)
|
|
5
5
|
[](https://codeclimate.com/github/ruby-grape/grape)
|
|
6
6
|
[](https://coveralls.io/github/ruby-grape/grape?branch=master)
|
|
7
7
|
[](https://inch-ci.org/github/ruby-grape/grape)
|
|
@@ -12,12 +12,15 @@
|
|
|
12
12
|
- [What is Grape?](#what-is-grape)
|
|
13
13
|
- [Stable Release](#stable-release)
|
|
14
14
|
- [Project Resources](#project-resources)
|
|
15
|
+
- [Grape for Enterprise](#grape-for-enterprise)
|
|
15
16
|
- [Installation](#installation)
|
|
16
17
|
- [Basic Usage](#basic-usage)
|
|
17
18
|
- [Mounting](#mounting)
|
|
18
19
|
- [All](#all)
|
|
19
20
|
- [Rack](#rack)
|
|
20
21
|
- [ActiveRecord without Rails](#activerecord-without-rails)
|
|
22
|
+
- [Rails 4](#rails-4)
|
|
23
|
+
- [Rails 5+](#rails-5)
|
|
21
24
|
- [Alongside Sinatra (or other frameworks)](#alongside-sinatra-or-other-frameworks)
|
|
22
25
|
- [Rails](#rails)
|
|
23
26
|
- [Rails < 5.2](#rails--52)
|
|
@@ -141,6 +144,7 @@
|
|
|
141
144
|
- [format_response.grape](#format_responsegrape)
|
|
142
145
|
- [Monitoring Products](#monitoring-products)
|
|
143
146
|
- [Contributing to Grape](#contributing-to-grape)
|
|
147
|
+
- [Security](#security)
|
|
144
148
|
- [License](#license)
|
|
145
149
|
- [Copyright](#copyright)
|
|
146
150
|
|
|
@@ -154,8 +158,7 @@ content negotiation, versioning and much more.
|
|
|
154
158
|
|
|
155
159
|
## Stable Release
|
|
156
160
|
|
|
157
|
-
You're reading the documentation for the stable release of Grape,
|
|
158
|
-
Please read [UPGRADING](UPGRADING.md) when upgrading from a previous version.
|
|
161
|
+
You're reading the documentation for the stable release of Grape, 1.5.2.
|
|
159
162
|
|
|
160
163
|
## Project Resources
|
|
161
164
|
|
|
@@ -164,6 +167,14 @@ Please read [UPGRADING](UPGRADING.md) when upgrading from a previous version.
|
|
|
164
167
|
* Need help? Try [Grape Google Group](http://groups.google.com/group/ruby-grape) or [Gitter](https://gitter.im/ruby-grape/grape)
|
|
165
168
|
* [Follow us on Twitter](https://twitter.com/grapeframework)
|
|
166
169
|
|
|
170
|
+
## Grape for Enterprise
|
|
171
|
+
|
|
172
|
+
Available as part of the Tidelift Subscription.
|
|
173
|
+
|
|
174
|
+
The maintainers of Grape are working with Tidelift to deliver commercial support and maintenance. Save time, reduce risk, and improve code health, while paying the maintainers of Grape. Click [here](https://tidelift.com/subscription/request-a-demo?utm_source=rubygems-grape&utm_medium=referral&utm_campaign=enterprise) for more details.
|
|
175
|
+
|
|
176
|
+
In 2020, we plan to use the money towards gathering Grape contributors for dinner in New York City.
|
|
177
|
+
|
|
167
178
|
## Installation
|
|
168
179
|
|
|
169
180
|
Ruby 2.4 or newer is required.
|
|
@@ -306,13 +317,21 @@ Grape will also automatically respond to HEAD and OPTIONS for all GET, and just
|
|
|
306
317
|
If you want to use ActiveRecord within Grape, you will need to make sure that ActiveRecord's connection pool
|
|
307
318
|
is handled correctly.
|
|
308
319
|
|
|
320
|
+
#### Rails 4
|
|
321
|
+
|
|
309
322
|
The easiest way to achieve that is by using ActiveRecord's `ConnectionManagement` middleware in your
|
|
310
323
|
`config.ru` before mounting Grape, e.g.:
|
|
311
324
|
|
|
312
325
|
```ruby
|
|
313
326
|
use ActiveRecord::ConnectionAdapters::ConnectionManagement
|
|
327
|
+
```
|
|
314
328
|
|
|
315
|
-
|
|
329
|
+
#### Rails 5+
|
|
330
|
+
|
|
331
|
+
Use [otr-activerecord](https://github.com/jhollinger/otr-activerecord) as follows:
|
|
332
|
+
|
|
333
|
+
```ruby
|
|
334
|
+
use OTR::ActiveRecord::ConnectionManagement
|
|
316
335
|
```
|
|
317
336
|
|
|
318
337
|
### Alongside Sinatra (or other frameworks)
|
|
@@ -339,9 +358,12 @@ class Web < Sinatra::Base
|
|
|
339
358
|
end
|
|
340
359
|
|
|
341
360
|
use Rack::Session::Cookie
|
|
342
|
-
run Rack::Cascade.new [
|
|
361
|
+
run Rack::Cascade.new [Web, API]
|
|
343
362
|
```
|
|
344
363
|
|
|
364
|
+
Note that order of loading apps using `Rack::Cascade` matters. The grape application must be last if you want to raise custom 404 errors from grape (such as `error!('Not Found',404)`). If the grape application is not last and returns 404 or 405 response, [cascade utilizes that as a signal to try the next app](https://www.rubydoc.info/gems/rack/Rack/Cascade). This may lead to undesirable behavior showing the [wrong 404 page from the wrong app](https://github.com/ruby-grape/grape/issues/1515).
|
|
365
|
+
|
|
366
|
+
|
|
345
367
|
### Rails
|
|
346
368
|
|
|
347
369
|
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`.
|
|
@@ -773,7 +795,12 @@ Available parameter builders are `Grape::Extensions::Hash::ParamBuilder`, `Grape
|
|
|
773
795
|
|
|
774
796
|
### Declared
|
|
775
797
|
|
|
776
|
-
Grape allows you to access only the parameters that have been declared by your `params` block. It
|
|
798
|
+
Grape allows you to access only the parameters that have been declared by your `params` block. It will:
|
|
799
|
+
|
|
800
|
+
* Filter out the params that have been passed, but are not allowed.
|
|
801
|
+
* Include any optional params that are declared but not passed.
|
|
802
|
+
|
|
803
|
+
Consider the following API endpoint:
|
|
777
804
|
|
|
778
805
|
````ruby
|
|
779
806
|
format :json
|
|
@@ -806,9 +833,9 @@ Once we add parameters requirements, grape will start returning only the declare
|
|
|
806
833
|
format :json
|
|
807
834
|
|
|
808
835
|
params do
|
|
809
|
-
|
|
810
|
-
|
|
811
|
-
|
|
836
|
+
optional :user, type: Hash do
|
|
837
|
+
optional :first_name, type: String
|
|
838
|
+
optional :last_name, type: String
|
|
812
839
|
end
|
|
813
840
|
end
|
|
814
841
|
|
|
@@ -836,6 +863,44 @@ curl -X POST -H "Content-Type: application/json" localhost:9292/users/signup -d
|
|
|
836
863
|
}
|
|
837
864
|
````
|
|
838
865
|
|
|
866
|
+
Missing params that are declared as type `Hash` or `Array` will be included.
|
|
867
|
+
|
|
868
|
+
````ruby
|
|
869
|
+
format :json
|
|
870
|
+
|
|
871
|
+
params do
|
|
872
|
+
optional :user, type: Hash do
|
|
873
|
+
optional :first_name, type: String
|
|
874
|
+
optional :last_name, type: String
|
|
875
|
+
end
|
|
876
|
+
optional :widgets, type: Array
|
|
877
|
+
end
|
|
878
|
+
|
|
879
|
+
post 'users/signup' do
|
|
880
|
+
{ 'declared_params' => declared(params) }
|
|
881
|
+
end
|
|
882
|
+
````
|
|
883
|
+
|
|
884
|
+
**Request**
|
|
885
|
+
|
|
886
|
+
````bash
|
|
887
|
+
curl -X POST -H "Content-Type: application/json" localhost:9292/users/signup -d '{}'
|
|
888
|
+
````
|
|
889
|
+
|
|
890
|
+
**Response**
|
|
891
|
+
|
|
892
|
+
````json
|
|
893
|
+
{
|
|
894
|
+
"declared_params": {
|
|
895
|
+
"user": {
|
|
896
|
+
"first_name": null,
|
|
897
|
+
"last_name": null
|
|
898
|
+
},
|
|
899
|
+
"widgets": []
|
|
900
|
+
}
|
|
901
|
+
}
|
|
902
|
+
````
|
|
903
|
+
|
|
839
904
|
The returned hash is an `ActiveSupport::HashWithIndifferentAccess`.
|
|
840
905
|
|
|
841
906
|
The `#declared` method is not available to `before` filters, as those are evaluated prior to parameter coercion.
|
|
@@ -894,8 +959,10 @@ By default `declared(params)` includes parameters that have `nil` values. If you
|
|
|
894
959
|
format :json
|
|
895
960
|
|
|
896
961
|
params do
|
|
897
|
-
requires :
|
|
898
|
-
|
|
962
|
+
requires :user, type: Hash do
|
|
963
|
+
requires :first_name, type: String
|
|
964
|
+
optional :last_name, type: String
|
|
965
|
+
end
|
|
899
966
|
end
|
|
900
967
|
|
|
901
968
|
post 'users/signup' do
|
|
@@ -1048,13 +1115,13 @@ params do
|
|
|
1048
1115
|
end
|
|
1049
1116
|
```
|
|
1050
1117
|
|
|
1051
|
-
Note that default values will be passed through to any validation options specified.
|
|
1052
|
-
The following example will always fail if `:color` is not explicitly provided.
|
|
1053
|
-
|
|
1054
1118
|
Default values are eagerly evaluated. Above `:non_random_number` will evaluate to the same
|
|
1055
1119
|
number for each call to the endpoint of this `params` block. To have the default evaluate
|
|
1056
1120
|
lazily with each request use a lambda, like `:random_number` above.
|
|
1057
1121
|
|
|
1122
|
+
Note that default values will be passed through to any validation options specified.
|
|
1123
|
+
The following example will always fail if `:color` is not explicitly provided.
|
|
1124
|
+
|
|
1058
1125
|
```ruby
|
|
1059
1126
|
params do
|
|
1060
1127
|
optional :color, type: String, default: 'blue', values: ['red', 'green']
|
|
@@ -1114,7 +1181,8 @@ Aside from the default set of supported types listed above, any class can be
|
|
|
1114
1181
|
used as a type as long as an explicit coercion method is supplied. If the type
|
|
1115
1182
|
implements a class-level `parse` method, Grape will use it automatically.
|
|
1116
1183
|
This method must take one string argument and return an instance of the correct
|
|
1117
|
-
type, or
|
|
1184
|
+
type, or return an instance of `Grape::Types::InvalidValue` which optionally
|
|
1185
|
+
accepts a message to be returned in the response.
|
|
1118
1186
|
|
|
1119
1187
|
```ruby
|
|
1120
1188
|
class Color
|
|
@@ -1124,8 +1192,9 @@ class Color
|
|
|
1124
1192
|
end
|
|
1125
1193
|
|
|
1126
1194
|
def self.parse(value)
|
|
1127
|
-
|
|
1128
|
-
|
|
1195
|
+
return new(value) if %w[blue red green]).include?(value)
|
|
1196
|
+
|
|
1197
|
+
Grape::Types::InvalidValue.new('Unsupported color')
|
|
1129
1198
|
end
|
|
1130
1199
|
end
|
|
1131
1200
|
|
|
@@ -1722,7 +1791,7 @@ params do
|
|
|
1722
1791
|
end
|
|
1723
1792
|
```
|
|
1724
1793
|
|
|
1725
|
-
Every validation will have
|
|
1794
|
+
Every validation will have its own instance of the validator, which means that the validator can have a state.
|
|
1726
1795
|
|
|
1727
1796
|
### Validation Errors
|
|
1728
1797
|
|
|
@@ -1981,10 +2050,10 @@ end
|
|
|
1981
2050
|
|
|
1982
2051
|
# is NOT the same as
|
|
1983
2052
|
|
|
1984
|
-
get ':status' do # this makes
|
|
2053
|
+
get ':status' do # this makes params[:status] available
|
|
1985
2054
|
end
|
|
1986
2055
|
|
|
1987
|
-
# This will make both
|
|
2056
|
+
# This will make both params[:status_id] and params[:id] available
|
|
1988
2057
|
|
|
1989
2058
|
get 'statuses/:status_id/reviews/:id' do
|
|
1990
2059
|
end
|
|
@@ -3157,17 +3226,19 @@ end
|
|
|
3157
3226
|
|
|
3158
3227
|
Use `body false` to return `204 No Content` without any data or content-type.
|
|
3159
3228
|
|
|
3160
|
-
You can also set the response to a file with `
|
|
3229
|
+
You can also set the response to a file with `sendfile`. This works with the
|
|
3230
|
+
[Rack::Sendfile](https://www.rubydoc.info/gems/rack/Rack/Sendfile) middleware to optimally send
|
|
3231
|
+
the file through your web server software.
|
|
3161
3232
|
|
|
3162
3233
|
```ruby
|
|
3163
3234
|
class API < Grape::API
|
|
3164
3235
|
get '/' do
|
|
3165
|
-
|
|
3236
|
+
sendfile '/path/to/file'
|
|
3166
3237
|
end
|
|
3167
3238
|
end
|
|
3168
3239
|
```
|
|
3169
3240
|
|
|
3170
|
-
|
|
3241
|
+
To stream a file in chunks use `stream`
|
|
3171
3242
|
|
|
3172
3243
|
```ruby
|
|
3173
3244
|
class API < Grape::API
|
|
@@ -3177,6 +3248,26 @@ class API < Grape::API
|
|
|
3177
3248
|
end
|
|
3178
3249
|
```
|
|
3179
3250
|
|
|
3251
|
+
If you want to stream non-file data use the `stream` method and a `Stream` object.
|
|
3252
|
+
This is an object that responds to `each` and yields for each chunk to send to the client.
|
|
3253
|
+
Each chunk will be sent as it is yielded instead of waiting for all of the content to be available.
|
|
3254
|
+
|
|
3255
|
+
```ruby
|
|
3256
|
+
class MyStream
|
|
3257
|
+
def each
|
|
3258
|
+
yield 'part 1'
|
|
3259
|
+
yield 'part 2'
|
|
3260
|
+
yield 'part 3'
|
|
3261
|
+
end
|
|
3262
|
+
end
|
|
3263
|
+
|
|
3264
|
+
class API < Grape::API
|
|
3265
|
+
get '/' do
|
|
3266
|
+
stream MyStream.new
|
|
3267
|
+
end
|
|
3268
|
+
end
|
|
3269
|
+
```
|
|
3270
|
+
|
|
3180
3271
|
## Authentication
|
|
3181
3272
|
|
|
3182
3273
|
### Basic and Digest Auth
|
|
@@ -3188,14 +3279,13 @@ applies to the current namespace and any children, but not parents.
|
|
|
3188
3279
|
```ruby
|
|
3189
3280
|
http_basic do |username, password|
|
|
3190
3281
|
# verify user's password here
|
|
3191
|
-
|
|
3282
|
+
# IMPORTANT: make sure you use a comparison method which isn't prone to a timing attack
|
|
3192
3283
|
end
|
|
3193
3284
|
```
|
|
3194
3285
|
|
|
3195
3286
|
```ruby
|
|
3196
3287
|
http_digest({ realm: 'Test Api', opaque: 'app secret' }) do |username|
|
|
3197
3288
|
# lookup the user's password here
|
|
3198
|
-
{ 'user1' => 'password1' }[username]
|
|
3199
3289
|
end
|
|
3200
3290
|
```
|
|
3201
3291
|
|
|
@@ -3301,7 +3391,7 @@ end
|
|
|
3301
3391
|
|
|
3302
3392
|
Blocks can be executed before or after every API call, using `before`, `after`,
|
|
3303
3393
|
`before_validation` and `after_validation`.
|
|
3304
|
-
If the API fails the `after` call will not be
|
|
3394
|
+
If the API fails the `after` call will not be triggered, if you need code to execute for sure
|
|
3305
3395
|
use the `finally`.
|
|
3306
3396
|
|
|
3307
3397
|
Before and after callbacks execute in the following order:
|
|
@@ -3852,7 +3942,7 @@ Grape integrates with following third-party tools:
|
|
|
3852
3942
|
* **Librato Metrics** - [grape-librato](https://github.com/seanmoon/grape-librato) gem
|
|
3853
3943
|
* **[Skylight](https://www.skylight.io/)** - [skylight](https://github.com/skylightio/skylight-ruby) gem, [documentation](https://docs.skylight.io/grape/)
|
|
3854
3944
|
* **[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)
|
|
3855
|
-
* **[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)
|
|
3945
|
+
* **[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)
|
|
3856
3946
|
|
|
3857
3947
|
## Contributing to Grape
|
|
3858
3948
|
|
|
@@ -3861,10 +3951,14 @@ features and discuss issues.
|
|
|
3861
3951
|
|
|
3862
3952
|
See [CONTRIBUTING](CONTRIBUTING.md).
|
|
3863
3953
|
|
|
3954
|
+
## Security
|
|
3955
|
+
|
|
3956
|
+
See [SECURITY](SECURITY.md) for details.
|
|
3957
|
+
|
|
3864
3958
|
## License
|
|
3865
3959
|
|
|
3866
|
-
MIT License. See LICENSE for details.
|
|
3960
|
+
MIT License. See [LICENSE](LICENSE) for details.
|
|
3867
3961
|
|
|
3868
3962
|
## Copyright
|
|
3869
3963
|
|
|
3870
|
-
Copyright (c) 2010-
|
|
3964
|
+
Copyright (c) 2010-2020 Michael Bleigh, Intridea Inc. and Contributors.
|