media_types-serialization 1.0.1 → 1.2.0

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 262dba633b56ee02980cb04a7e768198451963a71885c50bc35fafb4744c7ecd
4
- data.tar.gz: 29f99b4a875081f23e4fd583e9adf0a99cf9250c597c5c5d553d4da224540416
3
+ metadata.gz: 7c72aa611b03ba3537f1c12eb44b31596f58d21ba3fe0dd5596b8d37d613d132
4
+ data.tar.gz: '084a4733e9d015fe1816399772d3fcfaed898368507d9785df89bdb296b34171'
5
5
  SHA512:
6
- metadata.gz: 61f10719fe7b7741323b119ede580f0ac2c003c77f28201d62c9c43a0149b415193974df028539cb2f47286dcfdeace81749740c9a9a228037d888fd47d0a2e9
7
- data.tar.gz: 85578dcb19c073cacdd78714c4976dd3ebb1b87438e5e5036b82a3623dc8477a1a3e8c8ab6ea55aa79d50e71ec659e8c69029f7e037519610f97126f2f5949c7
6
+ metadata.gz: 67d43c2377d4ac849997886fa547d9b6c22ee7880eca6e1acfebd73db3cbe18a189823ca79bec0a009ab2feb83aa6b7d2d4a7e50ac44e9e0f37207fe4c07bb87
7
+ data.tar.gz: 2d9825fca6e6d77f84609b691d5dcd113424b41adf971efe87fe7bcd56220dd34a6aaec6a7ce905474131ed398e5fed8decf11f4e2209752b3a9cfbfbd80933f
@@ -5,7 +5,7 @@ on:
5
5
  branches:
6
6
  - master
7
7
  push:
8
- branches:
8
+ branches:
9
9
  - master
10
10
  - depfu/*
11
11
  - release/*
@@ -16,12 +16,16 @@ jobs:
16
16
 
17
17
  runs-on: ubuntu-latest
18
18
 
19
+ strategy:
20
+ matrix:
21
+ ruby-version: [2.7.x, 2.6.x]
22
+
19
23
  steps:
20
24
  - uses: actions/checkout@v1
21
- - name: Set up Ruby 2.6
25
+ - name: Set up Ruby ${{ matrix.ruby-version }}
22
26
  uses: actions/setup-ruby@v1
23
27
  with:
24
- ruby-version: 2.6.x
28
+ ruby-version: ${{ matrix.ruby-version }}
25
29
  - name: Build and test with Rake
26
30
  run: |
27
31
  gem install bundler
data/.prettierrc ADDED
@@ -0,0 +1 @@
1
+ {}
data/CHANGELOG.md CHANGED
@@ -1,19 +1,43 @@
1
1
  # Changelog
2
2
 
3
+ ## 1.2.0
4
+
5
+ - ✨ Add `view:` to `output_html` which renders a specific rails view.
6
+
7
+ ## 1.1.0
8
+
9
+ - ✨ Add _allow_output_html_: Fallback to rails rendering.
10
+ - ✨ Add _allow_output_docs_: Useful to add a documentation description to endpoints that you can normally only POST to.
11
+ - ✨ Add _output_error_: Implements missing content-language support.
12
+ - ✨ Add _scoped freeze_io! support_: Useful for gradual adoption of mediatypes on existing routes.
13
+ - ✨ Add _alias variant reporting_: Allows reporting what the original matched media type was even when impersonating a different media type.
14
+ - ✨ Improve README: small improvements to make it easier to adopt and upgrade existing codebase.
15
+ - ✨ Reduce number of (external) dependencies
16
+ - 🐛 Fix incorrect output on encoding errors.
17
+ - 🐛 Fix message in various alias error messages.
18
+
19
+ ## 1.0.3
20
+
21
+ - 🐛 Unvalidated serializers would put the view part of the identifier before the version. This was not in line with validated serializers.
22
+
23
+ ## 1.0.2
24
+
25
+ - 🐛 Explicitly set all oj parameters when decoding as well.
26
+
3
27
  ## 1.0.1
4
28
 
5
- - 🐛 Explicitly set all oj and json parameters to ensure correct behavior with changed defaults.
6
- - 🐛 Fix serializer not deserializing as symbols.
29
+ - 🐛 Explicitly set all oj and json parameters to ensure correct behavior with changed defaults.
30
+ - 🐛 Fix serializer not deserializing as symbols.
7
31
 
8
32
  ## 1.0.0
9
33
 
10
34
  - ✨ Add support for input deserialization.
11
- - ✨ Added serializer DSL to be more in line with validation gem.
12
- - ✨ Added ability to make a serializer without a validator.
13
- - ✨ Added error serializer that emits [`application/problem+json`](https://tools.ietf.org/html/rfc7231).
14
- - ✨ Reduced number of dependencies.
35
+ - ✨ Add serializer DSL to be more in line with validation gem.
36
+ - ✨ Add ability to make a serializer without a validator.
37
+ - ✨ Add error serializer that emits [`application/problem+json`](https://tools.ietf.org/html/rfc7231).
38
+ - ✨ Reduce number of dependencies.
15
39
  - ✨ Validators no longer need to be registered to be used.
16
- - ✨ Added a [wiki where errors can be documented](https://docs.delftsolutions.nl). Feel free to make pages for your own namespaced errors.
40
+ - ✨ Add a [wiki where errors can be documented](https://docs.delftsolutions.nl). Feel free to make pages for your own namespaced errors.
17
41
  - 💔 Serializer definition API has backwards incompatible changes.
18
42
  - 💔 API viewer is now no longer registered as html but accessible with the `?api_viewer=last` query parameter.
19
43
  - 💔 Validators can no longer be registered for use in `format do`.
data/CODE_OF_CONDUCT.md CHANGED
@@ -14,21 +14,21 @@ orientation.
14
14
  Examples of behavior that contributes to creating a positive environment
15
15
  include:
16
16
 
17
- * Using welcoming and inclusive language
18
- * Being respectful of differing viewpoints and experiences
19
- * Gracefully accepting constructive criticism
20
- * Focusing on what is best for the community
21
- * Showing empathy towards other community members
17
+ - Using welcoming and inclusive language
18
+ - Being respectful of differing viewpoints and experiences
19
+ - Gracefully accepting constructive criticism
20
+ - Focusing on what is best for the community
21
+ - Showing empathy towards other community members
22
22
 
23
23
  Examples of unacceptable behavior by participants include:
24
24
 
25
- * The use of sexualized language or imagery and unwelcome sexual attention or
26
- advances
27
- * Trolling, insulting/derogatory comments, and personal or political attacks
28
- * Public or private harassment
29
- * Publishing others' private information, such as a physical or electronic
25
+ - The use of sexualized language or imagery and unwelcome sexual attention or
26
+ advances
27
+ - Trolling, insulting/derogatory comments, and personal or political attacks
28
+ - Public or private harassment
29
+ - Publishing others' private information, such as a physical or electronic
30
30
  address, without explicit permission
31
- * Other conduct which could reasonably be considered inappropriate in a
31
+ - Other conduct which could reasonably be considered inappropriate in a
32
32
  professional setting
33
33
 
34
34
  ## Our Responsibilities
data/Gemfile.lock CHANGED
@@ -1,134 +1,128 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- media_types-serialization (1.0.1)
4
+ media_types-serialization (1.1.0)
5
5
  actionpack (>= 4.0.0)
6
6
  activesupport (>= 4.0.0)
7
- http_headers-accept (>= 0.2.2, < 1.0.0)
8
- http_headers-link (< 1.0.0)
9
7
  media_types (>= 2.0.0, < 3.0.0)
10
8
 
11
9
  GEM
12
10
  remote: https://rubygems.org/
13
11
  specs:
14
- actioncable (5.2.4.2)
15
- actionpack (= 5.2.4.2)
12
+ actioncable (5.2.6)
13
+ actionpack (= 5.2.6)
16
14
  nio4r (~> 2.0)
17
15
  websocket-driver (>= 0.6.1)
18
- actionmailer (5.2.4.2)
19
- actionpack (= 5.2.4.2)
20
- actionview (= 5.2.4.2)
21
- activejob (= 5.2.4.2)
16
+ actionmailer (5.2.6)
17
+ actionpack (= 5.2.6)
18
+ actionview (= 5.2.6)
19
+ activejob (= 5.2.6)
22
20
  mail (~> 2.5, >= 2.5.4)
23
21
  rails-dom-testing (~> 2.0)
24
- actionpack (5.2.4.2)
25
- actionview (= 5.2.4.2)
26
- activesupport (= 5.2.4.2)
22
+ actionpack (5.2.6)
23
+ actionview (= 5.2.6)
24
+ activesupport (= 5.2.6)
27
25
  rack (~> 2.0, >= 2.0.8)
28
26
  rack-test (>= 0.6.3)
29
27
  rails-dom-testing (~> 2.0)
30
28
  rails-html-sanitizer (~> 1.0, >= 1.0.2)
31
- actionview (5.2.4.2)
32
- activesupport (= 5.2.4.2)
29
+ actionview (5.2.6)
30
+ activesupport (= 5.2.6)
33
31
  builder (~> 3.1)
34
32
  erubi (~> 1.4)
35
33
  rails-dom-testing (~> 2.0)
36
34
  rails-html-sanitizer (~> 1.0, >= 1.0.3)
37
- activejob (5.2.4.2)
38
- activesupport (= 5.2.4.2)
35
+ activejob (5.2.6)
36
+ activesupport (= 5.2.6)
39
37
  globalid (>= 0.3.6)
40
- activemodel (5.2.4.2)
41
- activesupport (= 5.2.4.2)
42
- activerecord (5.2.4.2)
43
- activemodel (= 5.2.4.2)
44
- activesupport (= 5.2.4.2)
38
+ activemodel (5.2.6)
39
+ activesupport (= 5.2.6)
40
+ activerecord (5.2.6)
41
+ activemodel (= 5.2.6)
42
+ activesupport (= 5.2.6)
45
43
  arel (>= 9.0)
46
- activestorage (5.2.4.2)
47
- actionpack (= 5.2.4.2)
48
- activerecord (= 5.2.4.2)
49
- marcel (~> 0.3.1)
50
- activesupport (5.2.4.2)
44
+ activestorage (5.2.6)
45
+ actionpack (= 5.2.6)
46
+ activerecord (= 5.2.6)
47
+ marcel (~> 1.0.0)
48
+ activesupport (5.2.6)
51
49
  concurrent-ruby (~> 1.0, >= 1.0.2)
52
50
  i18n (>= 0.7, < 2)
53
51
  minitest (~> 5.1)
54
52
  tzinfo (~> 1.1)
55
53
  arel (9.0.0)
56
- awesome_print (1.8.0)
54
+ awesome_print (1.9.2)
57
55
  builder (3.2.4)
58
- concurrent-ruby (1.1.6)
56
+ concurrent-ruby (1.1.9)
59
57
  crass (1.0.6)
60
- erubi (1.9.0)
58
+ erubi (1.10.0)
61
59
  globalid (0.4.2)
62
60
  activesupport (>= 4.2.0)
63
- http_headers-accept (0.2.2)
64
- http_headers-utils (>= 0.2.0, < 1.0.0)
65
- http_headers-link (0.2.1)
66
- http_headers-utils (>= 0.2.0, < 1.0.0)
67
- http_headers-utils (0.2.0)
68
- i18n (1.8.2)
61
+ i18n (1.8.10)
69
62
  concurrent-ruby (~> 1.0)
70
- loofah (2.5.0)
63
+ loofah (2.10.0)
71
64
  crass (~> 1.0.2)
72
65
  nokogiri (>= 1.5.9)
73
66
  mail (2.7.1)
74
67
  mini_mime (>= 0.1.1)
75
- marcel (0.3.3)
76
- mimemagic (~> 0.3.2)
68
+ marcel (1.0.1)
77
69
  media_types (2.0.1)
78
70
  method_source (1.0.0)
79
- mimemagic (0.3.4)
80
- mini_mime (1.0.2)
81
- mini_portile2 (2.4.0)
82
- minitest (5.14.0)
83
- nio4r (2.5.2)
84
- nokogiri (1.10.9)
85
- mini_portile2 (~> 2.4.0)
86
- oj (3.10.6)
87
- rack (2.2.2)
71
+ mini_mime (1.1.0)
72
+ minitest (5.14.4)
73
+ nio4r (2.5.7)
74
+ nokogiri (1.11.7-x64-mingw32)
75
+ racc (~> 1.4)
76
+ nokogiri (1.11.7-x86_64-linux)
77
+ racc (~> 1.4)
78
+ oj (3.12.1)
79
+ racc (1.5.2)
80
+ rack (2.2.3)
88
81
  rack-test (1.1.0)
89
82
  rack (>= 1.0, < 3)
90
- rails (5.2.4.2)
91
- actioncable (= 5.2.4.2)
92
- actionmailer (= 5.2.4.2)
93
- actionpack (= 5.2.4.2)
94
- actionview (= 5.2.4.2)
95
- activejob (= 5.2.4.2)
96
- activemodel (= 5.2.4.2)
97
- activerecord (= 5.2.4.2)
98
- activestorage (= 5.2.4.2)
99
- activesupport (= 5.2.4.2)
83
+ rails (5.2.6)
84
+ actioncable (= 5.2.6)
85
+ actionmailer (= 5.2.6)
86
+ actionpack (= 5.2.6)
87
+ actionview (= 5.2.6)
88
+ activejob (= 5.2.6)
89
+ activemodel (= 5.2.6)
90
+ activerecord (= 5.2.6)
91
+ activestorage (= 5.2.6)
92
+ activesupport (= 5.2.6)
100
93
  bundler (>= 1.3.0)
101
- railties (= 5.2.4.2)
94
+ railties (= 5.2.6)
102
95
  sprockets-rails (>= 2.0.0)
103
96
  rails-dom-testing (2.0.3)
104
97
  activesupport (>= 4.2.0)
105
98
  nokogiri (>= 1.6)
106
99
  rails-html-sanitizer (1.3.0)
107
100
  loofah (~> 2.3)
108
- railties (5.2.4.2)
109
- actionpack (= 5.2.4.2)
110
- activesupport (= 5.2.4.2)
101
+ railties (5.2.6)
102
+ actionpack (= 5.2.6)
103
+ activesupport (= 5.2.6)
111
104
  method_source
112
105
  rake (>= 0.8.7)
113
106
  thor (>= 0.19.0, < 2.0)
114
- rake (13.0.1)
115
- sprockets (4.0.0)
107
+ rake (13.0.6)
108
+ sprockets (4.0.2)
116
109
  concurrent-ruby (~> 1.0)
117
110
  rack (> 1, < 3)
118
- sprockets-rails (3.2.1)
111
+ sprockets-rails (3.2.2)
119
112
  actionpack (>= 4.0)
120
113
  activesupport (>= 4.0)
121
114
  sprockets (>= 3.0.0)
122
- thor (1.0.1)
115
+ thor (1.1.0)
123
116
  thread_safe (0.3.6)
124
- tzinfo (1.2.7)
117
+ tzinfo (1.2.9)
125
118
  thread_safe (~> 0.1)
126
- websocket-driver (0.7.1)
119
+ websocket-driver (0.7.5)
127
120
  websocket-extensions (>= 0.1.0)
128
- websocket-extensions (0.1.4)
121
+ websocket-extensions (0.1.5)
129
122
 
130
123
  PLATFORMS
131
- ruby
124
+ x64-mingw32
125
+ x86_64-linux
132
126
 
133
127
  DEPENDENCIES
134
128
  awesome_print
@@ -140,4 +134,4 @@ DEPENDENCIES
140
134
  rake (~> 13.0)
141
135
 
142
136
  BUNDLED WITH
143
- 1.17.3
137
+ 2.2.7
data/README.md CHANGED
@@ -4,7 +4,7 @@
4
4
  [![Gem Version](https://badge.fury.io/rb/media_types-serialization.svg)](https://badge.fury.io/rb/media_types-serialization)
5
5
  [![MIT license](http://img.shields.io/badge/license-MIT-brightgreen.svg)](http://opensource.org/licenses/MIT)
6
6
 
7
- `respond_to` on steroids. Add versioned serialization and deserialization to your rails projects.
7
+ `respond_to` on steroids. Add [HATEOAS](https://docs.delftsolutions.nl/wiki/HATEOAS_API) compatible serialization and deserialization to your Rails projects.
8
8
 
9
9
  ## Installation
10
10
 
@@ -57,6 +57,60 @@ BookSerializer.serialize(book, 'vnd.acme.book.v1+json', context: nil)
57
57
  # => { "book": { "title": "Everything, abridged" } }
58
58
  ```
59
59
 
60
+ ### Controller integration
61
+
62
+ You can integrate the serialization system in rails, giving you automatic [Content-Type negotiation](https://en.wikipedia.org/wiki/Content_negotiation) using the `Accept` header:
63
+
64
+ ```ruby
65
+ require 'media_types/serialization'
66
+
67
+ class BookController < ActionController::API
68
+ include MediaTypes::Serialization
69
+
70
+ allow_output_serializer(BookSerializer, only: %i[show])
71
+ freeze_io!
72
+
73
+ def show
74
+ book = Book.new
75
+ book.title = 'Everything, abridged'
76
+
77
+ render_media book
78
+ end
79
+ end
80
+ ```
81
+
82
+ While using the controller integration the context will always be set to the current controller. This allows you to construct urls.
83
+
84
+ ### Adding HATEOAS responses to existing routes
85
+
86
+ When creating a mobile application it's often useful to allow the app to request a non-html representation of a specific url. If you have an existing route:
87
+
88
+ ```ruby
89
+ class BookController < ApplicationController
90
+ def show
91
+ @book = Book.new
92
+
93
+ # Use view corresponding to the controller
94
+ end
95
+ end
96
+ ```
97
+
98
+ You can add a json representation as follows:
99
+
100
+ ```ruby
101
+ class BookController < ApplicationController
102
+ allow_output_serializer(BookSerializer, only: %i[show])
103
+ allow_output_html
104
+ freeze_io!
105
+
106
+ def show
107
+ @book = Book.new
108
+
109
+ render_media @book
110
+ end
111
+ end
112
+ ```
113
+
60
114
  ### Validations
61
115
 
62
116
  Right now the serializer does not validate incoming or outgoing information. This can cause issues when you accidentally emit non-conforming data that people start to depend on. To make sure you don't do that you can specify a [Media Type validator](https://github.com/SleeplessByte/media-types-ruby):
@@ -98,30 +152,6 @@ end
98
152
 
99
153
  For more information, see the [Media Types docs](https://github.com/SleeplessByte/media-types-ruby).
100
154
 
101
- ### Controller integration
102
-
103
- You can integrate the serialization system in rails, giving you automatic [Content-Type negotiation](https://en.wikipedia.org/wiki/Content_negotiation) using the `Accept` header:
104
-
105
- ```ruby
106
- require 'media_types/serialization'
107
-
108
- class BookController < ActionController::API
109
- include MediaTypes::Serialization
110
-
111
- allow_output_serializer(BookSerializer, only: %i[show])
112
- freeze_io!
113
-
114
- def show
115
- book = Book.new
116
- book.title = 'Everything, abridged'
117
-
118
- render_media book
119
- end
120
- end
121
- ```
122
-
123
- While using the controller integration the context will always be set to the current controller. This allows you to construct urls.
124
-
125
155
  ### Versioning
126
156
 
127
157
  To help with supporting older versions, serializers have a [DSL](https://en.wikipedia.org/wiki/Domain-specific_language) to construct json objects:
@@ -149,7 +179,7 @@ BookSerializer.serialize(book, BookValidator.version(2), context: nil)
149
179
 
150
180
  ### Links
151
181
 
152
- When making [HATEOAS](https://en.wikipedia.org/wiki/HATEOAS) compliant applications it's very useful to include `Link` headers in your response so clients can use a `HEAD` request instead of having to fetch the entire resource. Serializers have convenience methods to help with this:
182
+ When making [HATEOAS](https://docs.delftsolutions.nl/wiki/HATEOAS_API) compliant applications it's very useful to include `Link` headers in your response so clients can use a `HEAD` request instead of having to fetch the entire resource. Serializers have convenience methods to help with this:
153
183
 
154
184
  ```ruby
155
185
  class BookSerializer < MediaTypes::Serialization::Base
@@ -206,7 +236,7 @@ class BookSerializer < MediaTypes::Serialization::Base
206
236
  output view: :index, version: 3 do |arr, version, context|
207
237
  attribute :books do
208
238
  link :self, href: context.book_index_url
209
-
239
+
210
240
  index arr, version: version
211
241
  end
212
242
  end
@@ -248,15 +278,15 @@ class BookSerializer < MediaTypes::Serialization::Base
248
278
  output view: :index, version: 3 do |arr, version, context|
249
279
  attribute :books do
250
280
  link :self, href: context.book_index_url
251
-
281
+
252
282
  index arr, version: version
253
283
  end
254
284
  end
255
-
285
+
256
286
  output view: :collection, version: 3 do |arr, version, context|
257
287
  attribute :books do
258
288
  link :self, href: context.book_collection_url
259
-
289
+
260
290
  collection arr, version: version
261
291
  end
262
292
  end
@@ -309,8 +339,8 @@ class BookController < ActionController::API
309
339
  allow_output_serializer(BookSerializer, only: %i[show])
310
340
  allow_input_serializer(BookSerializer, only: %i[create])
311
341
  freeze_io!
312
-
313
- def show
342
+
343
+ def show
314
344
  book = Book.new
315
345
  book.title = 'Everything, abridged'
316
346
 
@@ -318,7 +348,7 @@ class BookController < ActionController::API
318
348
  end
319
349
 
320
350
  def create
321
- json = deserialize(request, context: self) # does validation for us
351
+ json = deserialize(request) # does validation for us
322
352
  puts json
323
353
  end
324
354
  end
@@ -355,8 +385,8 @@ class BookController < ActionController::API
355
385
  allow_output_serializer(BookSerializer, only: %i[show])
356
386
  allow_input_serializer(BookSerializer, only: %i[create])
357
387
  freeze_io!
358
-
359
- def show
388
+
389
+ def show
360
390
  book = Book.new
361
391
  book.title = 'Everything, abridged'
362
392
 
@@ -364,7 +394,7 @@ class BookController < ActionController::API
364
394
  end
365
395
 
366
396
  def create
367
- book = deserialize(request, context: self)
397
+ book = deserialize(request)
368
398
  book.save!
369
399
 
370
400
  render media: serialize_media(book), content_type request.format.to_s
@@ -385,7 +415,7 @@ class BookSerializer < MediaTypes::Serialization::Base
385
415
  output_raw view: :raw, version: 3 do |obj, version, context|
386
416
  hidden do
387
417
  # Make sure links are only set in the headers, not in the body.
388
-
418
+
389
419
  link :self, href: context.book_url(obj)
390
420
  end
391
421
 
@@ -454,14 +484,12 @@ class BookController < ActionController::API
454
484
  include MediaTypes::Serialization
455
485
 
456
486
  allow_api_viewer
457
-
458
- allow_output_serializer(MediaTypes::ApiViewer)
459
487
 
460
488
  allow_output_serializer(BookSerializer, only: %i[show])
461
489
  allow_input_serializer(BookSerializer, only: %i[create])
462
490
  freeze_io!
463
-
464
- def show
491
+
492
+ def show
465
493
  book = Book.new
466
494
  book.title = 'Everything, abridged'
467
495
 
@@ -469,7 +497,7 @@ class BookController < ActionController::API
469
497
  end
470
498
 
471
499
  def create
472
- json = deserialize(request, context: self) # does validation for us
500
+ json = deserialize(request) # does validation for us
473
501
  puts json
474
502
  end
475
503
  end
@@ -489,14 +517,14 @@ class BookSerializer < MediaTypes::Serialization::Base
489
517
  attribute :description, obj.description if version >= 2
490
518
  end
491
519
  end
492
-
520
+
493
521
  output_raw view: :html do |obj, context|
494
522
  render_view 'book/show', context: context, assigns: {
495
523
  title: obj.title,
496
524
  description: obj.description
497
525
  }
498
526
  end
499
-
527
+
500
528
  output_alias 'text/html', view: :html
501
529
  end
502
530
  ```
@@ -518,11 +546,11 @@ class BookController < ActionController::API
518
546
 
519
547
  freeze_io!
520
548
 
521
- # ...
549
+ # ...
522
550
  end
523
551
  ```
524
552
 
525
- The exception you specified will be rescued by the controller and will be displayed to the user along with a link to the shared wiki page for that error type. Feel free to add instructions there on how clients should solve this problem. You can find more information at: http://docs.delftsolutions.nl/wiki/Error
553
+ The exception you specified will be rescued by the controller and will be displayed to the user along with a link to the shared wiki page for that error type. Feel free to add instructions there on how clients should solve this problem. You can find more information at: [https://docs.delftsolutions.nl/wiki/Error](https://docs.delftsolutions.nl/wiki/Error)
526
554
  If you want to override this url you can use the `p.url(href)` function.
527
555
 
528
556
  By default the `message` property of the error is used to fill the `details` field. You can override this by using the `p.override_details(description, lang:)` function.
@@ -531,9 +559,7 @@ Custom attributes can be added using the `p.attribute(name, value)` function.
531
559
 
532
560
  ### Related
533
561
 
534
- - [`MediaTypes`](https://github.com/SleeplessByte/media-types-ruby): :gem: Library to create media type definitions, schemes and validations
535
- - [`MediaTypes::Deserialization`](https://github.com/XPBytes/media_types-deserialization): :cyclone: Add media types supported deserialization using your favourite parser, and media type validation.
536
- - [`MediaTypes::Validation`](https://github.com/XPBytes/media_types-validation): :heavy_exclamation_mark: Response validations according to a media-type
562
+ - [`MediaTypes`](https://github.com/SleeplessByte/media-types-ruby): :gem: Library to create media type validators.
537
563
 
538
564
  ## API
539
565
 
@@ -565,14 +591,18 @@ The block should return an object to convert into JSON.
565
591
 
566
592
  This has the same behavior as `output` but should return a string instead of an object. Output is not validated.
567
593
 
568
- #### `output_alias( media_type_identifier, view: )`
594
+ #### `output_alias( media_type_identifier, view:, hide_variant: false )`
595
+
596
+ Defines a legacy mapping. This will make the deserializer parse the media type `media_type_identifier` as if it was version `nil` of the specified view. If view is undefined it will use the output serializer without a view defined.
569
597
 
570
- Defines a legacy mapping. This will make the deserializer parse the media type `media_type_identifier` as if it was version 1 of the specified view. If view is undefined it will use the output serializer without a view defined.
598
+ Response will have a content type equal to `[media_type_identifier]; variant=[mapped_media_type_identifier]`. If `hide_variant:` is true, the content type emitted will only be `[media_type_identifier]`.
571
599
 
572
- #### `output_alias_optional( media_type_identifier, view: )`
600
+ #### `output_alias_optional( media_type_identifier, view:, hide_variant: false )`
573
601
 
574
602
  Has the same behavior as `output_alias` but can be used by multiple serializers. The serializer that is loaded last in the controller 'wins' control over this media type identifier. If any of the serializers have an `output_alias` defined with the same media type identifier that one will win instead.
575
603
 
604
+ Response will have a content type equal to `[media_type_identifier]; variant=[mapped_media_type_identifier]`. If `hide_variant:` is true, the content type emitted will only be `[media_type_identifier]`.
605
+
576
606
  #### `input( view:, version:, versions: ) do |obj, version, context|`
577
607
 
578
608
  Defines a deserialization block. Either version or versions can be set. View should be a symbol or unset.
@@ -658,6 +688,20 @@ Configure the controller to allow the client to request responses emitted by the
658
688
 
659
689
  Accepts the same filters as `before_action`.
660
690
 
691
+ #### `allow_output_html( as: nil, view: nil, layout: nil, **filters )`
692
+
693
+ Allows falling back to the default Rails view rendering when the client asks for the media type in the `as:` parameter or `text/html` if `as:` is unset.
694
+
695
+ The `Content-Type` of the response will be `text/html` if the `as:` parameter is unset. If the `as:` parameter is set, it will include it in the variant parameter: `text/html; variant=application/vnd.xpbytes.borderless`.
696
+
697
+ Accepts the same filters as `before_action`. You can set the template to use using the `view:` parameter.
698
+
699
+ #### `allow_output_docs( description, **filters )`
700
+
701
+ Outputs the specified description as help information.
702
+
703
+ Accepts the same filters as `before_action`.
704
+
661
705
  #### `allow_input_serializer( serializer, views: nil, **filters )`
662
706
 
663
707
  Configure the controller to allow the client to send bodies with a `Content-Type` that can be deserialized using the specified serializer. Optionally allows you to specify which views to allow by passing an array in the views parameter.
@@ -692,7 +736,7 @@ Clears the list of serializers used to render the error when the client supplies
692
736
 
693
737
  Enables rendering the api viewer when adding the `api_viewer=last` query parameter to the url.
694
738
 
695
- #### `freeze_io!`
739
+ #### `freeze_io!(**filter_opts)`
696
740
 
697
741
  Registers serialization and deserialization in the controller. This function must be called before using the controller.
698
742
 
@@ -742,6 +786,7 @@ Does the same as `deserialize( request )` but gives the client an error page if
742
786
  Returns the serializer class that will handle the given request.
743
787
 
744
788
  ## Customization
789
+
745
790
  The easiest way to customize the look and feel of the built in pages is to provide your own logo and background in an initializer:
746
791
 
747
792
  ```ruby