grape 1.2.3 → 1.2.4

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: cf4747c1023b97c40ff8c8d55922dbcc0c74b7220569115581a292444a59acad
4
- data.tar.gz: 80154efa20b201e72981129afadc8b09f06c4b9ed93798500f4df7355b528113
3
+ metadata.gz: 5943237e37e943a5a4e1d42bc6345f3af0e56509864050c7c12ba20b55d1bfb7
4
+ data.tar.gz: 3221d07199e081a570a99fcfe42706d9a4934e8e34054071992f3a6f84a75844
5
5
  SHA512:
6
- metadata.gz: 71ea1e0d3b268ea8a28a522944a0db399c1301964d8f2543488fd81aa15f131cf78cc6091b0dfebd3ecc438e7674c618a916dd9bb287c591821af6c5ce77b308
7
- data.tar.gz: b9f02ea1cf3e1c5a55ab481d3e1e37684fbc104ab126422f44b12721508198722da96825b7721fe494bb87e533451dc8d9c53e87f758507f0734a97cb937ac6a
6
+ metadata.gz: 907e9a73f79bcd972ffc723215e824586875f6d10f6118ec591834a079def3aba630570c1ec3798e6e98b624b2c00e9523c4ad52821ea536873c837964cb2627
7
+ data.tar.gz: 81af4b1f525ccb23ea9c7c6975099ff37283ffafac37cbd7a43c8cc93e06b344555464554859569b7ad573960e4dca11b428f7d5b96346eba2c7361c6beb526f
@@ -1,4 +1,4 @@
1
- ### 1.2.4 (Next)
1
+ ### 1.2.5 (Next)
2
2
 
3
3
  #### Features
4
4
 
@@ -8,6 +8,19 @@
8
8
 
9
9
  * Your contribution here.
10
10
 
11
+ ### 1.2.4 (2019/06/13)
12
+
13
+ #### Features
14
+
15
+ * [#1888](https://github.com/ruby-grape/grape/pull/1888): Makes the `configuration` hash widly available - [@myxoh](https://github.com/myxoh).
16
+ * [#1864](https://github.com/ruby-grape/grape/pull/1864): Adds `finally` on the API - [@myxoh](https://github.com/myxoh).
17
+ * [#1869](https://github.com/ruby-grape/grape/pull/1869): Fix issue with empty headers after `error!` method call - [@anaumov](https://github.com/anaumov).
18
+
19
+ #### Fixes
20
+
21
+ * [#1868](https://github.com/ruby-grape/grape/pull/1868): Fix NoMethodError with none hash params - [@ksss](https://github.com/ksss).
22
+ * [#1876](https://github.com/ruby-grape/grape/pull/1876): Fix const errors being hidden by bug in `const_missing` - [@dandehavilland](https://github.com/dandehavilland).
23
+
11
24
  ### 1.2.3 (2019/01/16)
12
25
 
13
26
  #### Features
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- grape (1.2.3)
4
+ grape (1.2.4)
5
5
  activesupport
6
6
  builder
7
7
  mustermann-grape (~> 1.0.0)
@@ -12,7 +12,7 @@ PATH
12
12
  GEM
13
13
  remote: https://rubygems.org/
14
14
  specs:
15
- activesupport (5.2.2)
15
+ activesupport (5.2.1)
16
16
  concurrent-ruby (~> 1.0, >= 1.0.2)
17
17
  i18n (>= 0.7, < 2)
18
18
  minitest (~> 5.1)
@@ -40,7 +40,7 @@ GEM
40
40
  descendants_tracker (~> 0.0.1)
41
41
  colored (1.2)
42
42
  colored2 (3.1.2)
43
- concurrent-ruby (1.1.4)
43
+ concurrent-ruby (1.1.5)
44
44
  cookiejar (0.3.3)
45
45
  cork (0.3.0)
46
46
  colored2 (~> 3.1)
@@ -78,7 +78,7 @@ GEM
78
78
  multipart-post (>= 1.2, < 3)
79
79
  faraday-http-cache (1.3.1)
80
80
  faraday (~> 0.8)
81
- ffi (1.10.0)
81
+ ffi (1.9.25)
82
82
  formatador (0.2.5)
83
83
  git (1.5.0)
84
84
  grape-entity (0.7.1)
@@ -102,10 +102,10 @@ GEM
102
102
  guard (~> 2.0)
103
103
  rubocop (~> 0.20)
104
104
  hashie (3.6.0)
105
- i18n (1.5.2)
105
+ i18n (1.6.0)
106
106
  concurrent-ruby (~> 1.0)
107
107
  ice_nine (0.11.2)
108
- json (2.1.0)
108
+ json (2.2.0)
109
109
  kramdown (1.17.0)
110
110
  listen (3.1.5)
111
111
  rb-fsevent (~> 0.9, >= 0.9.4)
@@ -132,7 +132,7 @@ GEM
132
132
  sawyer (~> 0.8.0, >= 0.5.3)
133
133
  open4 (1.3.4)
134
134
  parallel (1.12.1)
135
- parser (2.6.0.0)
135
+ parser (2.5.3.0)
136
136
  ast (~> 2.4.0)
137
137
  powerpack (0.1.2)
138
138
  pry (0.12.2)
@@ -150,8 +150,8 @@ GEM
150
150
  rake
151
151
  rake (12.3.2)
152
152
  rb-fsevent (0.10.3)
153
- rb-inotify (0.10.0)
154
- ffi (~> 1.0)
153
+ rb-inotify (0.9.10)
154
+ ffi (>= 0.5.0, < 2)
155
155
  rspec (3.8.0)
156
156
  rspec-core (~> 3.8.0)
157
157
  rspec-expectations (~> 3.8.0)
@@ -186,7 +186,7 @@ GEM
186
186
  json (>= 1.8, < 3)
187
187
  simplecov-html (~> 0.10.0)
188
188
  simplecov-html (0.10.2)
189
- term-ansicolor (1.7.0)
189
+ term-ansicolor (1.7.1)
190
190
  tins (~> 1.0)
191
191
  terminal-table (1.8.0)
192
192
  unicode-display_width (~> 1.1, >= 1.1.1)
@@ -195,7 +195,7 @@ GEM
195
195
  tins (1.20.2)
196
196
  tzinfo (1.2.5)
197
197
  thread_safe (~> 0.1)
198
- unicode-display_width (1.4.1)
198
+ unicode-display_width (1.4.0)
199
199
  virtus (1.0.5)
200
200
  axiom-types (~> 0.1)
201
201
  coercible (~> 1.0)
@@ -228,4 +228,4 @@ DEPENDENCIES
228
228
  ruby-grape-danger (~> 0.1.0)
229
229
 
230
230
  BUNDLED WITH
231
- 1.16.2
231
+ 1.17.1
data/LICENSE CHANGED
@@ -1,4 +1,4 @@
1
- Copyright (c) 2010-2018 Michael Bleigh, Intridea Inc. and Contributors.
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
@@ -5,7 +5,6 @@
5
5
  [![Code Climate](https://codeclimate.com/github/ruby-grape/grape.svg)](https://codeclimate.com/github/ruby-grape/grape)
6
6
  [![Coverage Status](https://coveralls.io/repos/github/ruby-grape/grape/badge.svg?branch=master)](https://coveralls.io/github/ruby-grape/grape?branch=master)
7
7
  [![Inline docs](https://inch-ci.org/github/ruby-grape/grape.svg)](https://inch-ci.org/github/ruby-grape/grape)
8
- [![git.legal](https://git.legal/projects/1364/badge.svg "Number of libraries approved")](https://git.legal/projects/1364)
9
8
  [![Join the chat at https://gitter.im/ruby-grape/grape](https://badges.gitter.im/ruby-grape/grape.svg)](https://gitter.im/ruby-grape/grape?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
10
9
 
11
10
  ## Table of Contents
@@ -20,6 +19,8 @@
20
19
  - [ActiveRecord without Rails](#activerecord-without-rails)
21
20
  - [Alongside Sinatra (or other frameworks)](#alongside-sinatra-or-other-frameworks)
22
21
  - [Rails](#rails)
22
+ - [Rails < 5.2](#rails--52)
23
+ - [Rails 6.0](#rails-60)
23
24
  - [Modules](#modules)
24
25
  - [Remounting](#remounting)
25
26
  - [Mount Configuration](#mount-configuration)
@@ -45,7 +46,7 @@
45
46
  - [Validation of Nested Parameters](#validation-of-nested-parameters)
46
47
  - [Dependent Parameters](#dependent-parameters)
47
48
  - [Group Options](#group-options)
48
- - [Alias](#alias)
49
+ - [Renaming](#renaming)
49
50
  - [Built-in Validators](#built-in-validators)
50
51
  - [allow_blank](#allow_blank)
51
52
  - [values](#values)
@@ -74,6 +75,9 @@
74
75
  - [Overriding Attribute Names](#overriding-attribute-names)
75
76
  - [With Default](#with-default)
76
77
  - [Headers](#headers)
78
+ - [Request](#request)
79
+ - [Header Case Handling](#header-case-handling)
80
+ - [Response](#response)
77
81
  - [Routes](#routes)
78
82
  - [Helpers](#helpers)
79
83
  - [Path Helpers](#path-helpers)
@@ -109,7 +113,7 @@
109
113
  - [Register custom middleware for authentication](#register-custom-middleware-for-authentication)
110
114
  - [Describing and Inspecting an API](#describing-and-inspecting-an-api)
111
115
  - [Current Route and Endpoint](#current-route-and-endpoint)
112
- - [Before and After](#before-and-after)
116
+ - [Before, After and Finally](#before-after-and-finally)
113
117
  - [Anchoring](#anchoring)
114
118
  - [Using Custom Middleware](#using-custom-middleware)
115
119
  - [Grape Middleware](#grape-middleware)
@@ -149,9 +153,9 @@ content negotiation, versioning and much more.
149
153
 
150
154
  ## Stable Release
151
155
 
152
- You're reading the documentation for the next release of Grape, which should be **1.2.4**.
156
+ You're reading the documentation for the next release of Grape, which should be **1.2.5**.
153
157
  Please read [UPGRADING](UPGRADING.md) when upgrading from a previous version.
154
- The current stable release is [1.2.3](https://github.com/ruby-grape/grape/blob/v1.2.3/README.md).
158
+ The current stable release is [1.2.4](https://github.com/ruby-grape/grape/blob/v1.2.4/README.md).
155
159
 
156
160
  ## Project Resources
157
161
 
@@ -322,6 +326,14 @@ run Rack::Cascade.new [API, Web]
322
326
 
323
327
  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`.
324
328
 
329
+ Modify `config/routes`:
330
+
331
+ ```ruby
332
+ mount Twitter::API => '/'
333
+ ```
334
+
335
+ #### Rails < 5.2
336
+
325
337
  Modify `application.rb`:
326
338
 
327
339
  ```ruby
@@ -329,14 +341,18 @@ config.paths.add File.join('app', 'api'), glob: File.join('**', '*.rb')
329
341
  config.autoload_paths += Dir[Rails.root.join('app', 'api', '*')]
330
342
  ```
331
343
 
332
- Modify `config/routes`:
344
+ See [below](#reloading-api-changes-in-development) for additional code that enables reloading of API changes in development.
345
+
346
+ #### Rails 6.0
347
+
348
+ 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:
333
349
 
334
350
  ```ruby
335
- mount Twitter::API => '/'
351
+ ActiveSupport::Inflector.inflections(:en) do |inflect|
352
+ inflect.acronym 'API'
353
+ end
336
354
  ```
337
355
 
338
- See [below](#reloading-api-changes-in-development) for additional code that enables reloading of API changes in development.
339
-
340
356
  ### Modules
341
357
 
342
358
  You can mount multiple API implementations inside another one. These don't have to be
@@ -396,11 +412,11 @@ class Comment::API < Grape::API
396
412
  end
397
413
  ```
398
414
 
399
- 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`.
415
+ 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`.
400
416
 
401
417
  ### Mount Configuration
402
418
 
403
- You can configure remountable endpoints for small details changing according to where they are mounted.
419
+ You can configure remountable endpoints to change how they behave according to where they are mounted.
404
420
 
405
421
  ```ruby
406
422
  class Voting::API < Grape::API
@@ -421,6 +437,35 @@ class Comment::API < Grape::API
421
437
  end
422
438
  ```
423
439
 
440
+ You can access `configuration` on the class (to use as dynamic attributes), inside blocks (like namespace)
441
+
442
+ If you want logic happening given on an `configuration`, you can use the helper `given`.
443
+
444
+ ```ruby
445
+ class ConditionalEndpoint::API < Grape::API
446
+ given configuration[:some_setting] do
447
+ get 'mount_this_endpoint_conditionally' do
448
+ configuration[:configurable_response]
449
+ end
450
+ end
451
+ end
452
+ ```
453
+
454
+ If you want a block of logic running every time an endpoint is mounted (within which you can access the `configuration` Hash)
455
+
456
+
457
+ ```ruby
458
+ class ConditionalEndpoint::API < Grape::API
459
+ mounted do
460
+ YourLogger.info "This API was mounted at: #{Time.now}"
461
+
462
+ get configuration[:endpoint_name] do
463
+ configuration[:configurable_response]
464
+ end
465
+ end
466
+ end
467
+ ```
468
+
424
469
  ## Versioning
425
470
 
426
471
  There are four strategies in which clients can reach your API's endpoints: `:path`,
@@ -551,7 +596,7 @@ Currently the configurable settings are:
551
596
 
552
597
  * `param_builder`: Sets the [Parameter Builder](#parameters), defaults to `Grape::Extensions::ActiveSupport::HashWithIndifferentAccess::ParamBuilder`.
553
598
 
554
- To change a setting value make sure that at some point on load time the code the following code runs
599
+ To change a setting value make sure that at some point during load time the following code runs
555
600
 
556
601
  ```ruby
557
602
  Grape.configure do |config|
@@ -559,7 +604,7 @@ Grape.configure do |config|
559
604
  end
560
605
  ```
561
606
 
562
- For example, for the `param_builder`, the following code could run in an initializers:
607
+ For example, for the `param_builder`, the following code could run in an initializer:
563
608
 
564
609
  ```ruby
565
610
  Grape.configure do |config|
@@ -1202,7 +1247,7 @@ params do
1202
1247
  end
1203
1248
  ```
1204
1249
 
1205
- You can set alias for parameter:
1250
+ You can rename parameters:
1206
1251
 
1207
1252
  ```ruby
1208
1253
  params do
@@ -1213,7 +1258,7 @@ params do
1213
1258
  end
1214
1259
  ```
1215
1260
 
1216
- Note: param in `given` should be the aliased one. In the example, it should be `type`, not `category`.
1261
+ Note: param in `given` should be the renamed one. In the example, it should be `type`, not `category`.
1217
1262
 
1218
1263
  ### Group Options
1219
1264
 
@@ -1242,9 +1287,9 @@ params do
1242
1287
  end
1243
1288
  ```
1244
1289
 
1245
- ### Alias
1290
+ ### Renaming
1246
1291
 
1247
- You can set an alias for parameters using `as`, which can be useful when refactoring existing APIs:
1292
+ You can rename parameters using `as`, which can be useful when refactoring existing APIs:
1248
1293
 
1249
1294
  ```ruby
1250
1295
  resource :users do
@@ -1795,6 +1840,7 @@ end
1795
1840
 
1796
1841
  ## Headers
1797
1842
 
1843
+ ### Request
1798
1844
  Request headers are available through the `headers` helper or from `env` in their original form.
1799
1845
 
1800
1846
  ```ruby
@@ -1809,13 +1855,30 @@ get do
1809
1855
  end
1810
1856
  ```
1811
1857
 
1858
+ #### Header Case Handling
1859
+
1860
+ The above example may have been requested as follows:
1861
+
1862
+ ``` shell
1863
+ curl -H "secret_PassWord: swordfish" ...
1864
+ ```
1865
+
1866
+ The header name will have been normalized for you.
1867
+
1868
+ - In the `header` helper names will be coerced into a capitalized kebab case.
1869
+ - In the `env` collection they appear in all uppercase, in snake case, and prefixed with 'HTTP_'.
1870
+
1871
+ 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.
1872
+
1873
+ ### Response
1874
+
1812
1875
  You can set a response header with `header` inside an API.
1813
1876
 
1814
1877
  ```ruby
1815
1878
  header 'X-Robots-Tag', 'noindex'
1816
1879
  ```
1817
1880
 
1818
- When raising `error!`, pass additional headers as arguments.
1881
+ When raising `error!`, pass additional headers as arguments. Additional headers will be merged with headers set before `error!` call.
1819
1882
 
1820
1883
  ```ruby
1821
1884
  error! 'Unauthorized', 401, 'X-Error-Detail' => 'Invalid token.'
@@ -2155,6 +2218,12 @@ instead of a message.
2155
2218
  error!({ error: 'unexpected error', detail: 'missing widget' }, 500)
2156
2219
  ```
2157
2220
 
2221
+ You can set additional headers for the response. They will be merged with headers set before `error!` call.
2222
+
2223
+ ```ruby
2224
+ error!('Something went wrong', 500, 'X-Error-Detail' => 'Invalid token.')
2225
+ ```
2226
+
2158
2227
  You can present documented errors with a Grape entity using the the [grape-entity](https://github.com/ruby-grape/grape-entity) gem.
2159
2228
 
2160
2229
  ```ruby
@@ -3089,19 +3158,22 @@ class ApiLogger < Grape::Middleware::Base
3089
3158
  end
3090
3159
  ```
3091
3160
 
3092
- ## Before and After
3161
+ ## Before, After and Finally
3093
3162
 
3094
3163
  Blocks can be executed before or after every API call, using `before`, `after`,
3095
3164
  `before_validation` and `after_validation`.
3165
+ If the API fails the `after` call will not be trigered, if you need code to execute for sure
3166
+ use the `finally`.
3096
3167
 
3097
3168
  Before and after callbacks execute in the following order:
3098
3169
 
3099
3170
  1. `before`
3100
3171
  2. `before_validation`
3101
3172
  3. _validations_
3102
- 4. `after_validation`
3103
- 5. _the API call_
3104
- 6. `after`
3173
+ 4. `after_validation` (upon successful validation)
3174
+ 5. _the API call_ (upon successful validation)
3175
+ 6. `after` (upon successful validation and API call)
3176
+ 7. `finally` (always)
3105
3177
 
3106
3178
  Steps 4, 5 and 6 only happen if validation succeeds.
3107
3179
 
@@ -3121,6 +3193,14 @@ before do
3121
3193
  end
3122
3194
  ```
3123
3195
 
3196
+ You can ensure a block of code runs after every request (including failures) with `finally`:
3197
+
3198
+ ```ruby
3199
+ finally do
3200
+ # this code will run after every request (successful or failed)
3201
+ end
3202
+ ```
3203
+
3124
3204
  **Namespaces**
3125
3205
 
3126
3206
  Callbacks apply to each API call within and below the current namespace:
@@ -3645,4 +3725,4 @@ MIT License. See LICENSE for details.
3645
3725
 
3646
3726
  ## Copyright
3647
3727
 
3648
- Copyright (c) 2010-2018 Michael Bleigh, Intridea Inc. and Contributors.
3728
+ Copyright (c) 2010-2019 Michael Bleigh, Intridea Inc. and Contributors.
@@ -1,6 +1,38 @@
1
1
  Upgrading Grape
2
2
  ===============
3
3
 
4
+ ### Upgrading to >= 1.2.4
5
+
6
+ #### Headers in `error!` call
7
+
8
+ Headers in `error!` will be merged with `headers` hash. If any header need to be cleared on `error!` call, make sure to move it to the `after` block.
9
+
10
+ ```ruby
11
+ class SampleApi < Grape::API
12
+ before do
13
+ header 'X-Before-Header', 'before_call'
14
+ end
15
+
16
+ get 'ping' do
17
+ header 'X-App-Header', 'on_call'
18
+ error! :pong, 400, 'X-Error-Details' => 'Invalid token'
19
+ end
20
+ end
21
+ ```
22
+ **Former behaviour**
23
+ ```ruby
24
+ response.headers['X-Before-Header'] # => nil
25
+ response.headers['X-App-Header'] # => nil
26
+ response.headers['X-Error-Details'] # => Invalid token
27
+ ```
28
+
29
+ **Current behaviour**
30
+ ```ruby
31
+ response.headers['X-Before-Header'] # => 'before_call'
32
+ response.headers['X-App-Header'] # => 'on_call'
33
+ response.headers['X-Error-Details'] # => Invalid token
34
+ ```
35
+
4
36
  ### Upgrading to >= 1.2.1
5
37
 
6
38
  #### Obtaining the name of a mounted class