grape 1.2.5 → 1.3.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +45 -0
- data/README.md +7 -6
- data/UPGRADING.md +43 -0
- data/grape.gemspec +10 -1
- data/lib/grape/api/helpers.rb +2 -0
- data/lib/grape/api/instance.rb +8 -6
- data/lib/grape/api.rb +4 -2
- data/lib/grape/config.rb +2 -0
- data/lib/grape/content_types.rb +34 -0
- data/lib/grape/cookies.rb +2 -0
- data/lib/grape/dsl/api.rb +2 -0
- data/lib/grape/dsl/callbacks.rb +2 -0
- data/lib/grape/dsl/configuration.rb +2 -0
- data/lib/grape/dsl/desc.rb +2 -0
- data/lib/grape/dsl/headers.rb +2 -0
- data/lib/grape/dsl/helpers.rb +4 -2
- data/lib/grape/dsl/inside_route.rb +15 -11
- data/lib/grape/dsl/logger.rb +2 -0
- data/lib/grape/dsl/middleware.rb +2 -0
- data/lib/grape/dsl/parameters.rb +8 -6
- data/lib/grape/dsl/request_response.rb +4 -2
- data/lib/grape/dsl/routing.rb +9 -5
- data/lib/grape/dsl/settings.rb +7 -1
- data/lib/grape/dsl/validations.rb +2 -0
- data/lib/grape/eager_load.rb +2 -0
- data/lib/grape/endpoint.rb +13 -7
- data/lib/grape/error_formatter/base.rb +2 -0
- data/lib/grape/error_formatter/json.rb +2 -0
- data/lib/grape/error_formatter/txt.rb +2 -0
- data/lib/grape/error_formatter/xml.rb +2 -0
- data/lib/grape/error_formatter.rb +3 -1
- data/lib/grape/exceptions/base.rb +11 -13
- data/lib/grape/exceptions/incompatible_option_values.rb +2 -0
- data/lib/grape/exceptions/invalid_accept_header.rb +2 -0
- data/lib/grape/exceptions/invalid_formatter.rb +2 -0
- data/lib/grape/exceptions/invalid_message_body.rb +2 -0
- data/lib/grape/exceptions/invalid_response.rb +2 -0
- data/lib/grape/exceptions/invalid_version_header.rb +2 -0
- data/lib/grape/exceptions/invalid_versioner_option.rb +2 -0
- data/lib/grape/exceptions/invalid_with_option_for_represent.rb +2 -0
- data/lib/grape/exceptions/method_not_allowed.rb +2 -0
- data/lib/grape/exceptions/missing_group_type.rb +2 -0
- data/lib/grape/exceptions/missing_mime_type.rb +2 -0
- data/lib/grape/exceptions/missing_option.rb +2 -0
- data/lib/grape/exceptions/missing_vendor_option.rb +2 -0
- data/lib/grape/exceptions/unknown_options.rb +2 -0
- data/lib/grape/exceptions/unknown_parameter.rb +2 -0
- data/lib/grape/exceptions/unknown_validator.rb +2 -0
- data/lib/grape/exceptions/unsupported_group_type.rb +2 -0
- data/lib/grape/exceptions/validation.rb +3 -1
- data/lib/grape/exceptions/validation_array_errors.rb +2 -0
- data/lib/grape/exceptions/validation_errors.rb +13 -12
- data/lib/grape/extensions/active_support/hash_with_indifferent_access.rb +4 -3
- data/lib/grape/extensions/deep_mergeable_hash.rb +2 -0
- data/lib/grape/extensions/deep_symbolize_hash.rb +2 -0
- data/lib/grape/extensions/hash.rb +2 -0
- data/lib/grape/extensions/hashie/mash.rb +2 -0
- data/lib/grape/formatter/json.rb +2 -0
- data/lib/grape/formatter/serializable_hash.rb +2 -0
- data/lib/grape/formatter/txt.rb +2 -0
- data/lib/grape/formatter/xml.rb +2 -0
- data/lib/grape/formatter.rb +5 -3
- data/lib/grape/http/headers.rb +49 -18
- data/lib/grape/middleware/auth/base.rb +2 -0
- data/lib/grape/middleware/auth/dsl.rb +2 -0
- data/lib/grape/middleware/auth/strategies.rb +2 -0
- data/lib/grape/middleware/auth/strategy_info.rb +2 -0
- data/lib/grape/middleware/base.rb +5 -5
- data/lib/grape/middleware/error.rb +3 -1
- data/lib/grape/middleware/filter.rb +2 -0
- data/lib/grape/middleware/formatter.rb +5 -3
- data/lib/grape/middleware/globals.rb +2 -0
- data/lib/grape/middleware/helpers.rb +2 -0
- data/lib/grape/middleware/stack.rb +4 -1
- data/lib/grape/middleware/versioner/accept_version_header.rb +2 -0
- data/lib/grape/middleware/versioner/header.rb +5 -3
- data/lib/grape/middleware/versioner/param.rb +3 -1
- data/lib/grape/middleware/versioner/parse_media_type_patch.rb +2 -0
- data/lib/grape/middleware/versioner/path.rb +3 -1
- data/lib/grape/middleware/versioner.rb +2 -0
- data/lib/grape/namespace.rb +14 -2
- data/lib/grape/parser/json.rb +2 -0
- data/lib/grape/parser/xml.rb +2 -0
- data/lib/grape/parser.rb +3 -1
- data/lib/grape/path.rb +13 -1
- data/lib/grape/presenters/presenter.rb +2 -0
- data/lib/grape/request.rb +15 -8
- data/lib/grape/router/attribute_translator.rb +18 -8
- data/lib/grape/router/pattern.rb +20 -16
- data/lib/grape/router/route.rb +9 -4
- data/lib/grape/router.rb +26 -12
- data/lib/grape/serve_file/file_body.rb +2 -0
- data/lib/grape/serve_file/file_response.rb +2 -0
- data/lib/grape/serve_file/sendfile_response.rb +2 -0
- data/lib/grape/util/base_inheritable.rb +6 -0
- data/lib/grape/util/cache.rb +20 -0
- data/lib/grape/util/endpoint_configuration.rb +2 -0
- data/lib/grape/util/env.rb +19 -17
- data/lib/grape/util/inheritable_setting.rb +2 -0
- data/lib/grape/util/inheritable_values.rb +2 -0
- data/lib/grape/util/json.rb +2 -0
- data/lib/grape/util/lazy_block.rb +2 -0
- data/lib/grape/util/lazy_object.rb +43 -0
- data/lib/grape/util/lazy_value.rb +2 -0
- data/lib/grape/util/registrable.rb +2 -0
- data/lib/grape/util/reverse_stackable_values.rb +3 -1
- data/lib/grape/util/stackable_values.rb +9 -21
- data/lib/grape/util/strict_hash_configuration.rb +2 -0
- data/lib/grape/util/xml.rb +2 -0
- data/lib/grape/validations/attributes_iterator.rb +3 -3
- data/lib/grape/validations/multiple_attributes_iterator.rb +2 -0
- data/lib/grape/validations/params_scope.rb +24 -11
- data/lib/grape/validations/single_attribute_iterator.rb +13 -2
- data/lib/grape/validations/types/array_coercer.rb +56 -0
- data/lib/grape/validations/types/build_coercer.rb +49 -48
- data/lib/grape/validations/types/custom_type_coercer.rb +15 -49
- data/lib/grape/validations/types/custom_type_collection_coercer.rb +10 -25
- data/lib/grape/validations/types/dry_type_coercer.rb +41 -0
- data/lib/grape/validations/types/file.rb +11 -9
- data/lib/grape/validations/types/json.rb +11 -8
- data/lib/grape/validations/types/multiple_type_coercer.rb +14 -33
- data/lib/grape/validations/types/primitive_coercer.rb +61 -0
- data/lib/grape/validations/types/set_coercer.rb +38 -0
- data/lib/grape/validations/types/variant_collection_coercer.rb +4 -12
- data/lib/grape/validations/types.rb +7 -30
- data/lib/grape/validations/validator_factory.rb +2 -0
- data/lib/grape/validations/validators/all_or_none.rb +3 -1
- data/lib/grape/validations/validators/allow_blank.rb +3 -1
- data/lib/grape/validations/validators/as.rb +2 -0
- data/lib/grape/validations/validators/at_least_one_of.rb +3 -1
- data/lib/grape/validations/validators/base.rb +8 -5
- data/lib/grape/validations/validators/coerce.rb +44 -27
- data/lib/grape/validations/validators/default.rb +2 -0
- data/lib/grape/validations/validators/exactly_one_of.rb +6 -2
- data/lib/grape/validations/validators/except_values.rb +3 -1
- data/lib/grape/validations/validators/multiple_params_base.rb +2 -0
- data/lib/grape/validations/validators/mutual_exclusion.rb +3 -1
- data/lib/grape/validations/validators/presence.rb +3 -1
- data/lib/grape/validations/validators/regexp.rb +3 -1
- data/lib/grape/validations/validators/same_as.rb +6 -3
- data/lib/grape/validations/validators/values.rb +17 -5
- data/lib/grape/validations.rb +2 -0
- data/lib/grape/version.rb +3 -1
- data/lib/grape.rb +4 -5
- data/spec/grape/api/custom_validations_spec.rb +5 -3
- data/spec/grape/api/deeply_included_options_spec.rb +2 -0
- data/spec/grape/api/defines_boolean_in_params_spec.rb +5 -3
- data/spec/grape/api/inherited_helpers_spec.rb +2 -0
- data/spec/grape/api/instance_spec.rb +54 -0
- data/spec/grape/api/invalid_format_spec.rb +2 -0
- data/spec/grape/api/namespace_parameters_in_route_spec.rb +2 -0
- data/spec/grape/api/nested_helpers_spec.rb +2 -0
- data/spec/grape/api/optional_parameters_in_route_spec.rb +2 -0
- data/spec/grape/api/parameters_modification_spec.rb +3 -1
- data/spec/grape/api/patch_method_helpers_spec.rb +2 -0
- data/spec/grape/api/recognize_path_spec.rb +2 -0
- data/spec/grape/api/required_parameters_in_route_spec.rb +2 -0
- data/spec/grape/api/required_parameters_with_invalid_method_spec.rb +2 -0
- data/spec/grape/api/routes_with_requirements_spec.rb +2 -0
- data/spec/grape/api/shared_helpers_exactly_one_of_spec.rb +2 -0
- data/spec/grape/api/shared_helpers_spec.rb +2 -0
- data/spec/grape/api_remount_spec.rb +2 -0
- data/spec/grape/api_spec.rb +34 -11
- data/spec/grape/config_spec.rb +2 -0
- data/spec/grape/dsl/callbacks_spec.rb +2 -0
- data/spec/grape/dsl/configuration_spec.rb +2 -0
- data/spec/grape/dsl/desc_spec.rb +2 -0
- data/spec/grape/dsl/headers_spec.rb +2 -0
- data/spec/grape/dsl/helpers_spec.rb +4 -2
- data/spec/grape/dsl/inside_route_spec.rb +2 -0
- data/spec/grape/dsl/logger_spec.rb +2 -0
- data/spec/grape/dsl/middleware_spec.rb +2 -0
- data/spec/grape/dsl/parameters_spec.rb +2 -0
- data/spec/grape/dsl/request_response_spec.rb +2 -0
- data/spec/grape/dsl/routing_spec.rb +2 -0
- data/spec/grape/dsl/settings_spec.rb +2 -0
- data/spec/grape/dsl/validations_spec.rb +2 -0
- data/spec/grape/endpoint_spec.rb +3 -1
- data/spec/grape/entity_spec.rb +2 -0
- data/spec/grape/exceptions/base_spec.rb +3 -1
- data/spec/grape/exceptions/body_parse_errors_spec.rb +2 -0
- data/spec/grape/exceptions/invalid_accept_header_spec.rb +2 -0
- data/spec/grape/exceptions/invalid_formatter_spec.rb +2 -0
- data/spec/grape/exceptions/invalid_response_spec.rb +2 -0
- data/spec/grape/exceptions/invalid_versioner_option_spec.rb +2 -0
- data/spec/grape/exceptions/missing_mime_type_spec.rb +2 -0
- data/spec/grape/exceptions/missing_option_spec.rb +2 -0
- data/spec/grape/exceptions/unknown_options_spec.rb +2 -0
- data/spec/grape/exceptions/unknown_validator_spec.rb +2 -0
- data/spec/grape/exceptions/validation_errors_spec.rb +4 -2
- data/spec/grape/exceptions/validation_spec.rb +3 -1
- data/spec/grape/extensions/param_builders/hash_spec.rb +2 -0
- data/spec/grape/extensions/param_builders/hash_with_indifferent_access_spec.rb +2 -0
- data/spec/grape/extensions/param_builders/hashie/mash_spec.rb +2 -0
- data/spec/grape/integration/global_namespace_function_spec.rb +2 -0
- data/spec/grape/integration/rack_sendfile_spec.rb +2 -0
- data/spec/grape/integration/rack_spec.rb +3 -1
- data/spec/grape/loading_spec.rb +2 -0
- data/spec/grape/middleware/auth/base_spec.rb +2 -0
- data/spec/grape/middleware/auth/dsl_spec.rb +2 -0
- data/spec/grape/middleware/auth/strategies_spec.rb +2 -0
- data/spec/grape/middleware/base_spec.rb +2 -0
- data/spec/grape/middleware/error_spec.rb +2 -0
- data/spec/grape/middleware/exception_spec.rb +3 -1
- data/spec/grape/middleware/formatter_spec.rb +19 -12
- data/spec/grape/middleware/globals_spec.rb +2 -0
- data/spec/grape/middleware/stack_spec.rb +11 -0
- data/spec/grape/middleware/versioner/accept_version_header_spec.rb +3 -1
- data/spec/grape/middleware/versioner/header_spec.rb +3 -1
- data/spec/grape/middleware/versioner/param_spec.rb +3 -1
- data/spec/grape/middleware/versioner/path_spec.rb +3 -1
- data/spec/grape/middleware/versioner_spec.rb +2 -0
- data/spec/grape/named_api_spec.rb +2 -0
- data/spec/grape/parser_spec.rb +7 -5
- data/spec/grape/path_spec.rb +2 -0
- data/spec/grape/presenters/presenter_spec.rb +2 -0
- data/spec/grape/request_spec.rb +2 -0
- data/spec/grape/util/inheritable_setting_spec.rb +2 -0
- data/spec/grape/util/inheritable_values_spec.rb +2 -0
- data/spec/grape/util/reverse_stackable_values_spec.rb +2 -0
- data/spec/grape/util/stackable_values_spec.rb +3 -1
- data/spec/grape/util/strict_hash_configuration_spec.rb +2 -0
- data/spec/grape/validations/attributes_iterator_spec.rb +2 -0
- data/spec/grape/validations/instance_behaivour_spec.rb +5 -3
- data/spec/grape/validations/multiple_attributes_iterator_spec.rb +2 -0
- data/spec/grape/validations/params_scope_spec.rb +3 -1
- data/spec/grape/validations/single_attribute_iterator_spec.rb +18 -4
- data/spec/grape/validations/types/primitive_coercer_spec.rb +75 -0
- data/spec/grape/validations/types_spec.rb +8 -35
- data/spec/grape/validations/validators/all_or_none_spec.rb +2 -0
- data/spec/grape/validations/validators/allow_blank_spec.rb +2 -0
- data/spec/grape/validations/validators/at_least_one_of_spec.rb +2 -0
- data/spec/grape/validations/validators/coerce_spec.rb +51 -110
- data/spec/grape/validations/validators/default_spec.rb +2 -0
- data/spec/grape/validations/validators/exactly_one_of_spec.rb +14 -12
- data/spec/grape/validations/validators/except_values_spec.rb +3 -1
- data/spec/grape/validations/validators/mutual_exclusion_spec.rb +2 -0
- data/spec/grape/validations/validators/presence_spec.rb +30 -0
- data/spec/grape/validations/validators/regexp_spec.rb +2 -0
- data/spec/grape/validations/validators/same_as_spec.rb +2 -0
- data/spec/grape/validations/validators/values_spec.rb +29 -4
- data/spec/grape/validations_spec.rb +69 -15
- data/spec/integration/multi_json/json_spec.rb +2 -0
- data/spec/integration/multi_xml/xml_spec.rb +2 -0
- data/spec/shared/versioning_examples.rb +2 -0
- data/spec/spec_helper.rb +18 -0
- data/spec/support/basic_auth_encode_helpers.rb +2 -0
- data/spec/support/content_type_helpers.rb +2 -0
- data/spec/support/eager_load.rb +19 -0
- data/spec/support/endpoint_faker.rb +2 -0
- data/spec/support/file_streamer.rb +2 -0
- data/spec/support/integer_helpers.rb +2 -0
- data/spec/support/versioned_helpers.rb +4 -2
- metadata +126 -112
- data/lib/grape/extensions/deep_hash_with_indifferent_access.rb +0 -18
- data/lib/grape/util/content_types.rb +0 -26
- data/lib/grape/validations/types/virtus_collection_patch.rb +0 -16
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1711dd2fb0f0c86757c7e73d780907efa87e3da54e0a999a4b45c276b5eec92c
|
4
|
+
data.tar.gz: f5ba49001d1816d92130f70fb1b63ae061d7d9250142605f706d75c207880ad9
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8b2dcf4d4903e3923dd10086a3371258404756cf294cd42c6fb64f3d2520fe7243c0accfe1b68f2e02fbaa85f29396c161d830cde4c5fdedd660b31e8d223a7f
|
7
|
+
data.tar.gz: 88a4d5e9740495430cd28ed1e213d6aafd92895c1b7966bd6358dd6aeb5b2e1f16eac2e14834d63e7791a6d66e16475ef30cdef5e37d10bca0f38f1d1a22c1e4
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,48 @@
|
|
1
|
+
### 1.3.1 (2020/03/11)
|
2
|
+
|
3
|
+
#### Features
|
4
|
+
|
5
|
+
* [#2005](https://github.com/ruby-grape/grape/pull/2005): Content types registrable - [@ericproulx](https://github.com/ericproulx).
|
6
|
+
* [#2003](https://github.com/ruby-grape/grape/pull/2003): Upgraded Rubocop to 0.80.1 - [@ericproulx](https://github.com/ericproulx).
|
7
|
+
* [#2002](https://github.com/ruby-grape/grape/pull/2002): Objects allocation optimization (lazy_lookup) - [@ericproulx](https://github.com/ericproulx).
|
8
|
+
|
9
|
+
#### Fixes
|
10
|
+
|
11
|
+
* [#2006](https://github.com/ruby-grape/grape/pull/2006): Fix explicit rescue StandardError - [@ericproulx](https://github.com/ericproulx).
|
12
|
+
* [#2004](https://github.com/ruby-grape/grape/pull/2004): Rubocop fixes - [@ericproulx](https://github.com/ericproulx).
|
13
|
+
* [#1995](https://github.com/ruby-grape/grape/pull/1995): Fix: "undefined instance variables" and "method redefined" warnings - [@nbeyer](https://github.com/nbeyer).
|
14
|
+
* [#1994](https://github.com/ruby-grape/grape/pull/1993): Fix typos in README - [@bellmyer](https://github.com/bellmyer).
|
15
|
+
* [#1993](https://github.com/ruby-grape/grape/pull/1993): Lazy join allow header - [@ericproulx](https://github.com/ericproulx).
|
16
|
+
* [#1987](https://github.com/ruby-grape/grape/pull/1987): Re-add exactly_one_of mutually exclusive error message - [@ZeroInputCtrl](https://github.com/ZeroInputCtrl).
|
17
|
+
* [#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).
|
18
|
+
* [#1976](https://github.com/ruby-grape/grape/pull/1976): Ensure classes/modules listed for autoload really exist - [@dnesteryuk](https://github.com/dnesteryuk).
|
19
|
+
* [#1971](https://github.com/ruby-grape/grape/pull/1971): Fix BigDecimal coercion - [@FlickStuart](https://github.com/FlickStuart).
|
20
|
+
* [#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).
|
21
|
+
* [#1988](https://github.com/ruby-grape/grape/pull/1988): Refactored the full_messages method and stop overriding full_message - [@hosseintoussi](https://github.com/hosseintoussi).
|
22
|
+
|
23
|
+
### 1.3.0 (2020/01/11)
|
24
|
+
|
25
|
+
#### Features
|
26
|
+
|
27
|
+
* [#1949](https://github.com/ruby-grape/grape/pull/1949): Add support for Ruby 2.7 - [@nbulaj](https://github.com/nbulaj).
|
28
|
+
* [#1948](https://github.com/ruby-grape/grape/pull/1948): Relax `dry-types` dependency version - [@nbulaj](https://github.com/nbulaj).
|
29
|
+
* [#1944](https://github.com/ruby-grape/grape/pull/1944): Reduces `attribute_translator` string allocations - [@ericproulx](https://github.com/ericproulx).
|
30
|
+
* [#1943](https://github.com/ruby-grape/grape/pull/1943): Reduces number of regex string allocations - [@ericproulx](https://github.com/ericproulx).
|
31
|
+
* [#1942](https://github.com/ruby-grape/grape/pull/1942): Optimizes retained memory methods - [@ericproulx](https://github.com/ericproulx).
|
32
|
+
* [#1941](https://github.com/ruby-grape/grape/pull/1941): Adds frozen string literal - [@ericproulx](https://github.com/ericproulx).
|
33
|
+
* [#1940](https://github.com/ruby-grape/grape/pull/1940): Gets rid of a needless step in `HashWithIndifferentAccess` - [@dnesteryuk](https://github.com/dnesteryuk).
|
34
|
+
* [#1938](https://github.com/ruby-grape/grape/pull/1938): Adds project metadata to the gemspec - [@orien](https://github.com/orien).
|
35
|
+
* [#1920](https://github.com/ruby-grape/grape/pull/1920): Replaces Virtus with dry-types - [@dnesteryuk](https://github.com/dnesteryuk).
|
36
|
+
* [#1930](https://github.com/ruby-grape/grape/pull/1930): Moves block call to separate method so it can be spied on - [@estolfo](https://github.com/estolfo).
|
37
|
+
|
38
|
+
#### Fixes
|
39
|
+
|
40
|
+
* [#1965](https://github.com/ruby-grape/grape/pull/1965): Fix typos in README - [@davidalee](https://github.com/davidalee).
|
41
|
+
* [#1963](https://github.com/ruby-grape/grape/pull/1963): The values validator must properly work with booleans - [@dnesteryuk](https://github.com/dnesteryuk).
|
42
|
+
* [#1950](https://github.com/ruby-grape/grape/pull/1950): Consider the allow_blank option in the values validator - [@dnesteryuk](https://github.com/dnesteryuk).
|
43
|
+
* [#1947](https://github.com/ruby-grape/grape/pull/1947): Careful check for empty params - [@dnesteryuk](https://github.com/dnesteryuk).
|
44
|
+
* [#1931](https://github.com/ruby-grape/grape/pull/1946): Fixes issue when using namespaces in `Grape::API::Instance` mounted directly - [@myxoh](https://github.com/myxoh).
|
45
|
+
|
1
46
|
### 1.2.5 (2019/12/01)
|
2
47
|
|
3
48
|
#### Features
|
data/README.md
CHANGED
@@ -154,8 +154,7 @@ content negotiation, versioning and much more.
|
|
154
154
|
|
155
155
|
## Stable Release
|
156
156
|
|
157
|
-
You're reading the documentation for the stable release of Grape, **1.
|
158
|
-
Please read [UPGRADING](UPGRADING.md) when upgrading from a previous version.
|
157
|
+
You're reading the documentation for the stable release of Grape, **1.3.1**.
|
159
158
|
|
160
159
|
## Project Resources
|
161
160
|
|
@@ -166,6 +165,8 @@ Please read [UPGRADING](UPGRADING.md) when upgrading from a previous version.
|
|
166
165
|
|
167
166
|
## Installation
|
168
167
|
|
168
|
+
Ruby 2.4 or newer is required.
|
169
|
+
|
169
170
|
Grape is available as a gem, to install it just install the gem:
|
170
171
|
|
171
172
|
gem install grape
|
@@ -1720,7 +1721,7 @@ params do
|
|
1720
1721
|
end
|
1721
1722
|
```
|
1722
1723
|
|
1723
|
-
Every validation will have
|
1724
|
+
Every validation will have its own instance of the validator, which means that the validator can have a state.
|
1724
1725
|
|
1725
1726
|
### Validation Errors
|
1726
1727
|
|
@@ -3226,7 +3227,7 @@ end
|
|
3226
3227
|
|
3227
3228
|
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
|
|
3229
|
-
You can access the controller params, headers, and helpers through the context with the `#context` method inside any auth middleware inherited from `Grape::
|
3230
|
+
You can access the controller params, headers, and helpers through the context with the `#context` method inside any auth middleware inherited from `Grape::Middleware::Auth::Base`.
|
3230
3231
|
|
3231
3232
|
## Describing and Inspecting an API
|
3232
3233
|
|
@@ -3299,7 +3300,7 @@ end
|
|
3299
3300
|
|
3300
3301
|
Blocks can be executed before or after every API call, using `before`, `after`,
|
3301
3302
|
`before_validation` and `after_validation`.
|
3302
|
-
If the API fails the `after` call will not be
|
3303
|
+
If the API fails the `after` call will not be triggered, if you need code to execute for sure
|
3303
3304
|
use the `finally`.
|
3304
3305
|
|
3305
3306
|
Before and after callbacks execute in the following order:
|
@@ -3540,7 +3541,7 @@ class API < Grape::API
|
|
3540
3541
|
end
|
3541
3542
|
```
|
3542
3543
|
|
3543
|
-
You can access the controller params, headers, and helpers through the context with the `#context` method inside any middleware inherited from `Grape::
|
3544
|
+
You can access the controller params, headers, and helpers through the context with the `#context` method inside any middleware inherited from `Grape::Middleware::Base`.
|
3544
3545
|
|
3545
3546
|
### Rails Middleware
|
3546
3547
|
|
data/UPGRADING.md
CHANGED
@@ -1,6 +1,49 @@
|
|
1
1
|
Upgrading Grape
|
2
2
|
===============
|
3
3
|
|
4
|
+
### Upgrading to >= 1.3.0
|
5
|
+
|
6
|
+
#### Ruby
|
7
|
+
|
8
|
+
After adding dry-types, Ruby 2.4 or newer is required.
|
9
|
+
|
10
|
+
#### Coercion
|
11
|
+
|
12
|
+
[Virtus](https://github.com/solnic/virtus) has been replaced by [dry-types](https://dry-rb.org/gems/dry-types/1.2/) for parameter coercion. If your project depends on Virtus, explicitly add it to your `Gemfile`. Also, if Virtus is used for defining custom types
|
13
|
+
|
14
|
+
```ruby
|
15
|
+
class User
|
16
|
+
include Virtus.model
|
17
|
+
|
18
|
+
attribute :id, Integer
|
19
|
+
attribute :name, String
|
20
|
+
end
|
21
|
+
|
22
|
+
# somewhere in your API
|
23
|
+
params do
|
24
|
+
requires :user, type: User
|
25
|
+
end
|
26
|
+
```
|
27
|
+
|
28
|
+
Add a class-level `parse` method to the model:
|
29
|
+
|
30
|
+
```ruby
|
31
|
+
class User
|
32
|
+
include Virtus.model
|
33
|
+
|
34
|
+
attribute :id, Integer
|
35
|
+
attribute :name, String
|
36
|
+
|
37
|
+
def self.parse(attrs)
|
38
|
+
new(attrs)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
```
|
42
|
+
|
43
|
+
Custom types which don't depend on Virtus don't require any changes.
|
44
|
+
|
45
|
+
For more information see [#1920](https://github.com/ruby-grape/grape/pull/1920).
|
46
|
+
|
4
47
|
### Upgrading to >= 1.2.4
|
5
48
|
|
6
49
|
#### Headers in `error!` call
|
data/grape.gemspec
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
$LOAD_PATH.unshift File.expand_path('../lib', __FILE__)
|
2
4
|
require 'grape/version'
|
3
5
|
|
@@ -11,17 +13,24 @@ Gem::Specification.new do |s|
|
|
11
13
|
s.summary = 'A simple Ruby framework for building REST-like APIs.'
|
12
14
|
s.description = 'A Ruby framework for rapid API development with great conventions.'
|
13
15
|
s.license = 'MIT'
|
16
|
+
s.metadata = {
|
17
|
+
'bug_tracker_uri' => 'https://github.com/ruby-grape/grape/issues',
|
18
|
+
'changelog_uri' => "https://github.com/ruby-grape/grape/blob/v#{s.version}/CHANGELOG.md",
|
19
|
+
'documentation_uri' => "https://www.rubydoc.info/gems/grape/#{s.version}",
|
20
|
+
'source_code_uri' => "https://github.com/ruby-grape/grape/tree/v#{s.version}"
|
21
|
+
}
|
14
22
|
|
15
23
|
s.add_runtime_dependency 'activesupport'
|
16
24
|
s.add_runtime_dependency 'builder'
|
25
|
+
s.add_runtime_dependency 'dry-types', '>= 1.1'
|
17
26
|
s.add_runtime_dependency 'mustermann-grape', '~> 1.0.0'
|
18
27
|
s.add_runtime_dependency 'rack', '>= 1.3.0'
|
19
28
|
s.add_runtime_dependency 'rack-accept'
|
20
|
-
s.add_runtime_dependency 'virtus', '>= 1.0.0'
|
21
29
|
|
22
30
|
s.files = %w[CHANGELOG.md CONTRIBUTING.md README.md grape.png UPGRADING.md LICENSE]
|
23
31
|
s.files += %w[grape.gemspec]
|
24
32
|
s.files += Dir['lib/**/*']
|
25
33
|
s.test_files = Dir['spec/**/*']
|
26
34
|
s.require_paths = ['lib']
|
35
|
+
s.required_ruby_version = '>= 2.4.0'
|
27
36
|
end
|
data/lib/grape/api/helpers.rb
CHANGED
data/lib/grape/api/instance.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'grape/router'
|
2
4
|
|
3
5
|
module Grape
|
@@ -72,7 +74,7 @@ module Grape
|
|
72
74
|
# (see #cascade?)
|
73
75
|
def cascade(value = nil)
|
74
76
|
if value.nil?
|
75
|
-
inheritable_setting.namespace_inheritable.
|
77
|
+
inheritable_setting.namespace_inheritable.key?(:cascade) ? !namespace_inheritable(:cascade).nil? : true
|
76
78
|
else
|
77
79
|
namespace_inheritable(:cascade, value)
|
78
80
|
end
|
@@ -119,7 +121,7 @@ module Grape
|
|
119
121
|
self.configuration = value_for_configuration
|
120
122
|
response
|
121
123
|
end
|
122
|
-
if base_instance? && lazy
|
124
|
+
if base && base_instance? && lazy
|
123
125
|
lazy_block
|
124
126
|
else
|
125
127
|
lazy_block.evaluate_from(configuration)
|
@@ -176,7 +178,7 @@ module Grape
|
|
176
178
|
# errors from reaching upstream. This is effectivelly done by unsetting
|
177
179
|
# X-Cascade. Default :cascade is true.
|
178
180
|
def cascade?
|
179
|
-
return self.class.namespace_inheritable(:cascade) if self.class.inheritable_setting.namespace_inheritable.
|
181
|
+
return self.class.namespace_inheritable(:cascade) if self.class.inheritable_setting.namespace_inheritable.key?(:cascade)
|
180
182
|
return self.class.namespace_inheritable(:version_options)[:cascade] if self.class.namespace_inheritable(:version_options) && self.class.namespace_inheritable(:version_options).key?(:cascade)
|
181
183
|
true
|
182
184
|
end
|
@@ -207,7 +209,7 @@ module Grape
|
|
207
209
|
route_settings[:endpoint] = route.app
|
208
210
|
|
209
211
|
# using the :any shorthand produces [nil] for route methods, substitute all manually
|
210
|
-
route_settings[:methods] =
|
212
|
+
route_settings[:methods] = Grape::Http::Headers::SUPPORTED_METHODS if route_settings[:methods].include?('*')
|
211
213
|
end
|
212
214
|
end
|
213
215
|
|
@@ -225,14 +227,14 @@ module Grape
|
|
225
227
|
allowed_methods |= [Grape::Http::Headers::HEAD] if allowed_methods.include?(Grape::Http::Headers::GET)
|
226
228
|
end
|
227
229
|
|
228
|
-
allow_header = (self.class.namespace_inheritable(:do_not_route_options) ? allowed_methods : [Grape::Http::Headers::OPTIONS] | allowed_methods)
|
230
|
+
allow_header = (self.class.namespace_inheritable(:do_not_route_options) ? allowed_methods : [Grape::Http::Headers::OPTIONS] | allowed_methods)
|
229
231
|
|
230
232
|
unless self.class.namespace_inheritable(:do_not_route_options) || allowed_methods.include?(Grape::Http::Headers::OPTIONS)
|
231
233
|
config[:endpoint].options[:options_route_enabled] = true
|
232
234
|
end
|
233
235
|
|
234
236
|
attributes = config.merge(allowed_methods: allowed_methods, allow_header: allow_header)
|
235
|
-
generate_not_allowed_method(config[:pattern], attributes)
|
237
|
+
generate_not_allowed_method(config[:pattern], **attributes)
|
236
238
|
end
|
237
239
|
end
|
238
240
|
end
|
data/lib/grape/api.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'grape/router'
|
2
4
|
require 'grape/api/instance'
|
3
5
|
|
@@ -6,7 +8,7 @@ module Grape
|
|
6
8
|
# should subclass this class in order to build an API.
|
7
9
|
class API
|
8
10
|
# Class methods that we want to call on the API rather than on the API object
|
9
|
-
NON_OVERRIDABLE = (Class.new.methods + %i[call call! configuration compile!]).freeze
|
11
|
+
NON_OVERRIDABLE = (Class.new.methods + %i[call call! configuration compile! inherited]).freeze
|
10
12
|
|
11
13
|
class << self
|
12
14
|
attr_accessor :base_instance, :instances
|
@@ -173,7 +175,7 @@ module Grape
|
|
173
175
|
if argument.respond_to?(:lazy?) && argument.lazy?
|
174
176
|
argument.evaluate_from(configuration)
|
175
177
|
elsif argument.is_a?(Hash)
|
176
|
-
argument.
|
178
|
+
argument.transform_values { |value| evaluate_arguments(configuration, value).first }
|
177
179
|
elsif argument.is_a?(Array)
|
178
180
|
evaluate_arguments(configuration, *argument)
|
179
181
|
else
|
data/lib/grape/config.rb
CHANGED
@@ -0,0 +1,34 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'grape/util/registrable'
|
4
|
+
|
5
|
+
module Grape
|
6
|
+
module ContentTypes
|
7
|
+
extend Util::Registrable
|
8
|
+
|
9
|
+
# Content types are listed in order of preference.
|
10
|
+
CONTENT_TYPES = {
|
11
|
+
xml: 'application/xml',
|
12
|
+
serializable_hash: 'application/json',
|
13
|
+
json: 'application/json',
|
14
|
+
binary: 'application/octet-stream',
|
15
|
+
txt: 'text/plain'
|
16
|
+
}.freeze
|
17
|
+
|
18
|
+
class << self
|
19
|
+
def content_types_for_settings(settings)
|
20
|
+
return if settings.blank?
|
21
|
+
|
22
|
+
settings.each_with_object({}) { |value, result| result.merge!(value) }
|
23
|
+
end
|
24
|
+
|
25
|
+
def content_types_for(from_settings)
|
26
|
+
if from_settings.present?
|
27
|
+
from_settings
|
28
|
+
else
|
29
|
+
Grape::ContentTypes::CONTENT_TYPES.merge(default_elements)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
data/lib/grape/cookies.rb
CHANGED
data/lib/grape/dsl/api.rb
CHANGED
data/lib/grape/dsl/callbacks.rb
CHANGED
data/lib/grape/dsl/desc.rb
CHANGED
data/lib/grape/dsl/headers.rb
CHANGED
data/lib/grape/dsl/helpers.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'active_support/concern'
|
2
4
|
|
3
5
|
module Grape
|
@@ -65,7 +67,7 @@ module Grape
|
|
65
67
|
|
66
68
|
def define_boolean_in_mod(mod)
|
67
69
|
return if defined? mod::Boolean
|
68
|
-
mod.const_set('Boolean',
|
70
|
+
mod.const_set('Boolean', Grape::API::Boolean)
|
69
71
|
end
|
70
72
|
|
71
73
|
def inject_api_helpers_to_mod(mod, &_block)
|
@@ -92,7 +94,7 @@ module Grape
|
|
92
94
|
protected
|
93
95
|
|
94
96
|
def process_named_params
|
95
|
-
return unless @named_params && @named_params.any?
|
97
|
+
return unless instance_variable_defined?(:@named_params) && @named_params && @named_params.any?
|
96
98
|
api.namespace_stackable(:named_params, @named_params)
|
97
99
|
end
|
98
100
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'active_support/concern'
|
2
4
|
require 'grape/dsl/headers'
|
3
5
|
|
@@ -28,7 +30,7 @@ module Grape
|
|
28
30
|
module PostBeforeFilter
|
29
31
|
def declared(passed_params, options = {}, declared_params = nil)
|
30
32
|
options = options.reverse_merge(include_missing: true, include_parent_namespaces: true)
|
31
|
-
declared_params ||= optioned_declared_params(options)
|
33
|
+
declared_params ||= optioned_declared_params(**options)
|
32
34
|
|
33
35
|
if passed_params.is_a?(Array)
|
34
36
|
declared_array(passed_params, options, declared_params)
|
@@ -84,7 +86,8 @@ module Grape
|
|
84
86
|
end
|
85
87
|
|
86
88
|
def declared_param_is_array?(declared_param)
|
87
|
-
|
89
|
+
key = declared_param.to_s
|
90
|
+
route_options_params[key] && route_options_params[key][:type] == 'Array'
|
88
91
|
end
|
89
92
|
|
90
93
|
def route_options_params
|
@@ -95,7 +98,7 @@ module Grape
|
|
95
98
|
options[:stringify] ? declared_param.to_s : declared_param.to_sym
|
96
99
|
end
|
97
100
|
|
98
|
-
def optioned_declared_params(options)
|
101
|
+
def optioned_declared_params(**options)
|
99
102
|
declared_params = if options[:include_parent_namespaces]
|
100
103
|
# Declared params including parent namespaces
|
101
104
|
route_setting(:saved_declared_params).flatten | Array(route_setting(:declared_params))
|
@@ -174,17 +177,17 @@ module Grape
|
|
174
177
|
def status(status = nil)
|
175
178
|
case status
|
176
179
|
when Symbol
|
177
|
-
raise ArgumentError, "Status code :#{status} is invalid." unless Rack::Utils::SYMBOL_TO_STATUS_CODE.
|
180
|
+
raise ArgumentError, "Status code :#{status} is invalid." unless Rack::Utils::SYMBOL_TO_STATUS_CODE.key?(status)
|
178
181
|
@status = Rack::Utils.status_code(status)
|
179
182
|
when Integer
|
180
183
|
@status = status
|
181
184
|
when nil
|
182
|
-
return @status if @status
|
185
|
+
return @status if instance_variable_defined?(:@status) && @status
|
183
186
|
case request.request_method.to_s.upcase
|
184
187
|
when Grape::Http::Headers::POST
|
185
188
|
201
|
186
189
|
when Grape::Http::Headers::DELETE
|
187
|
-
if @body.present?
|
190
|
+
if instance_variable_defined?(:@body) && @body.present?
|
188
191
|
200
|
189
192
|
else
|
190
193
|
204
|
@@ -235,7 +238,7 @@ module Grape
|
|
235
238
|
@body = ''
|
236
239
|
status 204
|
237
240
|
else
|
238
|
-
@body
|
241
|
+
instance_variable_defined?(:@body) ? @body : nil
|
239
242
|
end
|
240
243
|
end
|
241
244
|
|
@@ -269,7 +272,7 @@ module Grape
|
|
269
272
|
warn '[DEPRECATION] Argument as FileStreamer-like object is deprecated. Use path to file instead.'
|
270
273
|
@file = Grape::ServeFile::FileResponse.new(value)
|
271
274
|
else
|
272
|
-
@file
|
275
|
+
instance_variable_defined?(:@file) ? @file : nil
|
273
276
|
end
|
274
277
|
end
|
275
278
|
|
@@ -328,11 +331,12 @@ module Grape
|
|
328
331
|
end
|
329
332
|
|
330
333
|
representation = { root => representation } if root
|
334
|
+
|
331
335
|
if key
|
332
|
-
representation = (
|
333
|
-
elsif entity_class.present? &&
|
336
|
+
representation = (body || {}).merge(key => representation)
|
337
|
+
elsif entity_class.present? && body
|
334
338
|
raise ArgumentError, "Representation of type #{representation.class} cannot be merged." unless representation.respond_to?(:merge)
|
335
|
-
representation =
|
339
|
+
representation = body.merge(representation)
|
336
340
|
end
|
337
341
|
|
338
342
|
body representation
|
data/lib/grape/dsl/logger.rb
CHANGED
data/lib/grape/dsl/middleware.rb
CHANGED
data/lib/grape/dsl/parameters.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'active_support/concern'
|
2
4
|
|
3
5
|
module Grape
|
@@ -125,13 +127,13 @@ module Grape
|
|
125
127
|
|
126
128
|
opts = attrs.extract_options!.clone
|
127
129
|
opts[:presence] = { value: true, message: opts[:message] }
|
128
|
-
opts = @group.merge(opts) if @group
|
130
|
+
opts = @group.merge(opts) if instance_variable_defined?(:@group) && @group
|
129
131
|
|
130
132
|
if opts[:using]
|
131
133
|
require_required_and_optional_fields(attrs.first, opts)
|
132
134
|
else
|
133
135
|
validate_attributes(attrs, opts, &block)
|
134
|
-
block_given? ? new_scope(orig_attrs, &block) : push_declared_params(attrs, opts.slice(:as))
|
136
|
+
block_given? ? new_scope(orig_attrs, &block) : push_declared_params(attrs, **opts.slice(:as))
|
135
137
|
end
|
136
138
|
end
|
137
139
|
|
@@ -144,7 +146,7 @@ module Grape
|
|
144
146
|
|
145
147
|
opts = attrs.extract_options!.clone
|
146
148
|
type = opts[:type]
|
147
|
-
opts = @group.merge(opts) if @group
|
149
|
+
opts = @group.merge(opts) if instance_variable_defined?(:@group) && @group
|
148
150
|
|
149
151
|
# check type for optional parameter group
|
150
152
|
if attrs && block_given?
|
@@ -157,7 +159,7 @@ module Grape
|
|
157
159
|
else
|
158
160
|
validate_attributes(attrs, opts, &block)
|
159
161
|
|
160
|
-
block_given? ? new_scope(orig_attrs, true, &block) : push_declared_params(attrs, opts.slice(:as))
|
162
|
+
block_given? ? new_scope(orig_attrs, true, &block) : push_declared_params(attrs, **opts.slice(:as))
|
161
163
|
end
|
162
164
|
end
|
163
165
|
|
@@ -241,8 +243,8 @@ module Grape
|
|
241
243
|
# @return hash of parameters relevant for the current scope
|
242
244
|
# @api private
|
243
245
|
def params(params)
|
244
|
-
params = @parent.params(params) if @parent
|
245
|
-
params = map_params(params, @element) if @element
|
246
|
+
params = @parent.params(params) if instance_variable_defined?(:@parent) && @parent
|
247
|
+
params = map_params(params, @element) if instance_variable_defined?(:@element) && @element
|
246
248
|
params
|
247
249
|
end
|
248
250
|
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'active_support/concern'
|
2
4
|
|
3
5
|
module Grape
|
@@ -20,7 +22,7 @@ module Grape
|
|
20
22
|
if new_format
|
21
23
|
namespace_inheritable(:format, new_format.to_sym)
|
22
24
|
# define the default error formatters
|
23
|
-
namespace_inheritable(:default_error_formatter, Grape::ErrorFormatter.formatter_for(new_format, {}))
|
25
|
+
namespace_inheritable(:default_error_formatter, Grape::ErrorFormatter.formatter_for(new_format, **{}))
|
24
26
|
# define a single mime type
|
25
27
|
mime_type = content_types[new_format.to_sym]
|
26
28
|
raise Grape::Exceptions::MissingMimeType.new(new_format) unless mime_type
|
@@ -43,7 +45,7 @@ module Grape
|
|
43
45
|
# Specify a default error formatter.
|
44
46
|
def default_error_formatter(new_formatter_name = nil)
|
45
47
|
if new_formatter_name
|
46
|
-
new_formatter = Grape::ErrorFormatter.formatter_for(new_formatter_name, {})
|
48
|
+
new_formatter = Grape::ErrorFormatter.formatter_for(new_formatter_name, **{})
|
47
49
|
namespace_inheritable(:default_error_formatter, new_formatter)
|
48
50
|
else
|
49
51
|
namespace_inheritable(:default_error_formatter)
|
data/lib/grape/dsl/routing.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'active_support/concern'
|
2
4
|
|
3
5
|
module Grape
|
@@ -49,7 +51,7 @@ module Grape
|
|
49
51
|
end
|
50
52
|
end
|
51
53
|
|
52
|
-
@versions.last
|
54
|
+
@versions.last if instance_variable_defined?(:@versions) && @versions
|
53
55
|
end
|
54
56
|
|
55
57
|
# Define a root URL prefix for your entire API.
|
@@ -140,11 +142,11 @@ module Grape
|
|
140
142
|
reset_validations!
|
141
143
|
end
|
142
144
|
|
143
|
-
|
144
|
-
define_method
|
145
|
+
Grape::Http::Headers::SUPPORTED_METHODS.each do |supported_method|
|
146
|
+
define_method supported_method.downcase do |*args, &block|
|
145
147
|
options = args.extract_options!
|
146
148
|
paths = args.first || ['/']
|
147
|
-
route(
|
149
|
+
route(supported_method, paths, options, &block)
|
148
150
|
end
|
149
151
|
end
|
150
152
|
|
@@ -161,13 +163,15 @@ module Grape
|
|
161
163
|
# end
|
162
164
|
# end
|
163
165
|
def namespace(space = nil, options = {}, &block)
|
166
|
+
@namespace_description = nil unless instance_variable_defined?(:@namespace_description) && @namespace_description
|
167
|
+
|
164
168
|
if space || block_given?
|
165
169
|
within_namespace do
|
166
170
|
previous_namespace_description = @namespace_description
|
167
171
|
@namespace_description = (@namespace_description || {}).deep_merge(namespace_setting(:description) || {})
|
168
172
|
nest(block) do
|
169
173
|
if space
|
170
|
-
namespace_stackable(:namespace, Namespace.new(space, options))
|
174
|
+
namespace_stackable(:namespace, Namespace.new(space, **options))
|
171
175
|
end
|
172
176
|
end
|
173
177
|
@namespace_description = previous_namespace_description
|
data/lib/grape/dsl/settings.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'active_support/concern'
|
2
4
|
|
3
5
|
module Grape
|
@@ -169,7 +171,11 @@ module Grape
|
|
169
171
|
# the superclass's :inheritable_setting.
|
170
172
|
def build_top_level_setting
|
171
173
|
Grape::Util::InheritableSetting.new.tap do |setting|
|
172
|
-
|
174
|
+
# Doesn't try to inherit settings from +Grape::API::Instance+ which also responds to
|
175
|
+
# +inheritable_setting+, however, it doesn't contain any user-defined settings.
|
176
|
+
# Otherwise, it would lead to an extra instance of +Grape::Util::InheritableSetting+
|
177
|
+
# in the chain for every endpoint.
|
178
|
+
if defined?(superclass) && superclass.respond_to?(:inheritable_setting) && superclass != Grape::API::Instance
|
173
179
|
setting.inherit_from superclass.inheritable_setting
|
174
180
|
end
|
175
181
|
end
|