media_types-serialization 1.0.1 → 1.2.0

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: 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