media_types-serialization 1.2.0 → 1.3.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: 7c72aa611b03ba3537f1c12eb44b31596f58d21ba3fe0dd5596b8d37d613d132
4
- data.tar.gz: '084a4733e9d015fe1816399772d3fcfaed898368507d9785df89bdb296b34171'
3
+ metadata.gz: 2101630b0e9219ac970e8ce97c057f7f5281955219f6c3a4915979399190a0b5
4
+ data.tar.gz: 692a15e3dfaff3e9d8d306825dc9ab7d3cd8f5fa051b1918b0110215beaf7d5c
5
5
  SHA512:
6
- metadata.gz: 67d43c2377d4ac849997886fa547d9b6c22ee7880eca6e1acfebd73db3cbe18a189823ca79bec0a009ab2feb83aa6b7d2d4a7e50ac44e9e0f37207fe4c07bb87
7
- data.tar.gz: 2d9825fca6e6d77f84609b691d5dcd113424b41adf971efe87fe7bcd56220dd34a6aaec6a7ce905474131ed398e5fed8decf11f4e2209752b3a9cfbfbd80933f
6
+ metadata.gz: 77ea1c954ad749250eb9ee393fef00730de767cec2b8cd0c9a9c05e3edd38bf7ba9491260f7d4998751aee55fb005636cd3dcdb8aa2f146e7140fc5279519871
7
+ data.tar.gz: 1508f06953ce8611f7e6dd11983f0900a22ab7ee0a1e074250c58693210f6844822de7f34af564cd2b52c0dc383649e112f8737c6c411deca49764819ca28bca
data/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # Changelog
2
2
 
3
+ ## 1.3.0
4
+
5
+ - ✨ Add `formats:` to `output_html` and default it to `[:html]`, so rails behaves
6
+ - 🐛 Fix stale references to `render media:`
7
+ - 🐛 Fix inconsistent `context:` passing for `Serializer.serialize`
8
+
3
9
  ## 1.2.0
4
10
 
5
11
  - ✨ Add `view:` to `output_html` which renders a specific rails view.
data/Gemfile.lock CHANGED
@@ -1,137 +1,137 @@
1
- PATH
2
- remote: .
3
- specs:
4
- media_types-serialization (1.1.0)
5
- actionpack (>= 4.0.0)
6
- activesupport (>= 4.0.0)
7
- media_types (>= 2.0.0, < 3.0.0)
8
-
9
- GEM
10
- remote: https://rubygems.org/
11
- specs:
12
- actioncable (5.2.6)
13
- actionpack (= 5.2.6)
14
- nio4r (~> 2.0)
15
- websocket-driver (>= 0.6.1)
16
- actionmailer (5.2.6)
17
- actionpack (= 5.2.6)
18
- actionview (= 5.2.6)
19
- activejob (= 5.2.6)
20
- mail (~> 2.5, >= 2.5.4)
21
- rails-dom-testing (~> 2.0)
22
- actionpack (5.2.6)
23
- actionview (= 5.2.6)
24
- activesupport (= 5.2.6)
25
- rack (~> 2.0, >= 2.0.8)
26
- rack-test (>= 0.6.3)
27
- rails-dom-testing (~> 2.0)
28
- rails-html-sanitizer (~> 1.0, >= 1.0.2)
29
- actionview (5.2.6)
30
- activesupport (= 5.2.6)
31
- builder (~> 3.1)
32
- erubi (~> 1.4)
33
- rails-dom-testing (~> 2.0)
34
- rails-html-sanitizer (~> 1.0, >= 1.0.3)
35
- activejob (5.2.6)
36
- activesupport (= 5.2.6)
37
- globalid (>= 0.3.6)
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)
43
- arel (>= 9.0)
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)
49
- concurrent-ruby (~> 1.0, >= 1.0.2)
50
- i18n (>= 0.7, < 2)
51
- minitest (~> 5.1)
52
- tzinfo (~> 1.1)
53
- arel (9.0.0)
54
- awesome_print (1.9.2)
55
- builder (3.2.4)
56
- concurrent-ruby (1.1.9)
57
- crass (1.0.6)
58
- erubi (1.10.0)
59
- globalid (0.4.2)
60
- activesupport (>= 4.2.0)
61
- i18n (1.8.10)
62
- concurrent-ruby (~> 1.0)
63
- loofah (2.10.0)
64
- crass (~> 1.0.2)
65
- nokogiri (>= 1.5.9)
66
- mail (2.7.1)
67
- mini_mime (>= 0.1.1)
68
- marcel (1.0.1)
69
- media_types (2.0.1)
70
- method_source (1.0.0)
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)
81
- rack-test (1.1.0)
82
- rack (>= 1.0, < 3)
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)
93
- bundler (>= 1.3.0)
94
- railties (= 5.2.6)
95
- sprockets-rails (>= 2.0.0)
96
- rails-dom-testing (2.0.3)
97
- activesupport (>= 4.2.0)
98
- nokogiri (>= 1.6)
99
- rails-html-sanitizer (1.3.0)
100
- loofah (~> 2.3)
101
- railties (5.2.6)
102
- actionpack (= 5.2.6)
103
- activesupport (= 5.2.6)
104
- method_source
105
- rake (>= 0.8.7)
106
- thor (>= 0.19.0, < 2.0)
107
- rake (13.0.6)
108
- sprockets (4.0.2)
109
- concurrent-ruby (~> 1.0)
110
- rack (> 1, < 3)
111
- sprockets-rails (3.2.2)
112
- actionpack (>= 4.0)
113
- activesupport (>= 4.0)
114
- sprockets (>= 3.0.0)
115
- thor (1.1.0)
116
- thread_safe (0.3.6)
117
- tzinfo (1.2.9)
118
- thread_safe (~> 0.1)
119
- websocket-driver (0.7.5)
120
- websocket-extensions (>= 0.1.0)
121
- websocket-extensions (0.1.5)
122
-
123
- PLATFORMS
124
- x64-mingw32
125
- x86_64-linux
126
-
127
- DEPENDENCIES
128
- awesome_print
129
- bundler
130
- media_types-serialization!
131
- minitest (~> 5.0)
132
- oj
133
- rails (~> 5.2)
134
- rake (~> 13.0)
135
-
136
- BUNDLED WITH
137
- 2.2.7
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ media_types-serialization (1.3.0)
5
+ actionpack (>= 4.0.0)
6
+ activesupport (>= 4.0.0)
7
+ media_types (>= 2.0.0, < 3.0.0)
8
+
9
+ GEM
10
+ remote: https://rubygems.org/
11
+ specs:
12
+ actioncable (5.2.6)
13
+ actionpack (= 5.2.6)
14
+ nio4r (~> 2.0)
15
+ websocket-driver (>= 0.6.1)
16
+ actionmailer (5.2.6)
17
+ actionpack (= 5.2.6)
18
+ actionview (= 5.2.6)
19
+ activejob (= 5.2.6)
20
+ mail (~> 2.5, >= 2.5.4)
21
+ rails-dom-testing (~> 2.0)
22
+ actionpack (5.2.6)
23
+ actionview (= 5.2.6)
24
+ activesupport (= 5.2.6)
25
+ rack (~> 2.0, >= 2.0.8)
26
+ rack-test (>= 0.6.3)
27
+ rails-dom-testing (~> 2.0)
28
+ rails-html-sanitizer (~> 1.0, >= 1.0.2)
29
+ actionview (5.2.6)
30
+ activesupport (= 5.2.6)
31
+ builder (~> 3.1)
32
+ erubi (~> 1.4)
33
+ rails-dom-testing (~> 2.0)
34
+ rails-html-sanitizer (~> 1.0, >= 1.0.3)
35
+ activejob (5.2.6)
36
+ activesupport (= 5.2.6)
37
+ globalid (>= 0.3.6)
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)
43
+ arel (>= 9.0)
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)
49
+ concurrent-ruby (~> 1.0, >= 1.0.2)
50
+ i18n (>= 0.7, < 2)
51
+ minitest (~> 5.1)
52
+ tzinfo (~> 1.1)
53
+ arel (9.0.0)
54
+ awesome_print (1.9.2)
55
+ builder (3.2.4)
56
+ concurrent-ruby (1.1.9)
57
+ crass (1.0.6)
58
+ erubi (1.10.0)
59
+ globalid (0.4.2)
60
+ activesupport (>= 4.2.0)
61
+ i18n (1.8.10)
62
+ concurrent-ruby (~> 1.0)
63
+ loofah (2.10.0)
64
+ crass (~> 1.0.2)
65
+ nokogiri (>= 1.5.9)
66
+ mail (2.7.1)
67
+ mini_mime (>= 0.1.1)
68
+ marcel (1.0.1)
69
+ media_types (2.0.1)
70
+ method_source (1.0.0)
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.3)
79
+ racc (1.5.2)
80
+ rack (2.2.3)
81
+ rack-test (1.1.0)
82
+ rack (>= 1.0, < 3)
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)
93
+ bundler (>= 1.3.0)
94
+ railties (= 5.2.6)
95
+ sprockets-rails (>= 2.0.0)
96
+ rails-dom-testing (2.0.3)
97
+ activesupport (>= 4.2.0)
98
+ nokogiri (>= 1.6)
99
+ rails-html-sanitizer (1.3.0)
100
+ loofah (~> 2.3)
101
+ railties (5.2.6)
102
+ actionpack (= 5.2.6)
103
+ activesupport (= 5.2.6)
104
+ method_source
105
+ rake (>= 0.8.7)
106
+ thor (>= 0.19.0, < 2.0)
107
+ rake (13.0.6)
108
+ sprockets (4.0.2)
109
+ concurrent-ruby (~> 1.0)
110
+ rack (> 1, < 3)
111
+ sprockets-rails (3.2.2)
112
+ actionpack (>= 4.0)
113
+ activesupport (>= 4.0)
114
+ sprockets (>= 3.0.0)
115
+ thor (1.1.0)
116
+ thread_safe (0.3.6)
117
+ tzinfo (1.2.9)
118
+ thread_safe (~> 0.1)
119
+ websocket-driver (0.7.5)
120
+ websocket-extensions (>= 0.1.0)
121
+ websocket-extensions (0.1.5)
122
+
123
+ PLATFORMS
124
+ x64-mingw32
125
+ x86_64-linux
126
+
127
+ DEPENDENCIES
128
+ awesome_print
129
+ bundler
130
+ media_types-serialization!
131
+ minitest (~> 5.0)
132
+ oj
133
+ rails (~> 5.2)
134
+ rake (~> 13.0)
135
+
136
+ BUNDLED WITH
137
+ 2.2.7
data/README.md CHANGED
@@ -79,11 +79,13 @@ class BookController < ActionController::API
79
79
  end
80
80
  ```
81
81
 
82
- While using the controller integration the context will always be set to the current controller. This allows you to construct urls.
82
+ While using the controller integration the context will always be set to the current controller.
83
+ This allows you to construct urls.
83
84
 
84
85
  ### Adding HATEOAS responses to existing routes
85
86
 
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
+ When creating a mobile application it's often useful to allow the app to request a non-html representation of a specific url.
88
+ If you have an existing route:
87
89
 
88
90
  ```ruby
89
91
  class BookController < ApplicationController
@@ -113,7 +115,9 @@ end
113
115
 
114
116
  ### Validations
115
117
 
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):
118
+ Right now the serializer does not validate incoming or outgoing information.
119
+ This can cause issues when you accidentally emit non-conforming data that people start to depend on.
120
+ To make sure you don't do that you can specify a [Media Type validator](https://github.com/SleeplessByte/media-types-ruby):
117
121
 
118
122
  ```ruby
119
123
  require 'media_types'
@@ -179,7 +183,8 @@ BookSerializer.serialize(book, BookValidator.version(2), context: nil)
179
183
 
180
184
  ### Links
181
185
 
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:
186
+ 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.
187
+ Serializers have convenience methods to help with this:
183
188
 
184
189
  ```ruby
185
190
  class BookSerializer < MediaTypes::Serialization::Base
@@ -218,7 +223,8 @@ There are convenience methods for serializing arrays of objects based on a templ
218
223
 
219
224
  #### Indexes
220
225
 
221
- An index is a collection of urls that point to members of the array. The index method automatically generates it based on the self links defined in the default view of the same version.
226
+ An index is a collection of urls that point to members of the array.
227
+ The index method automatically generates it based on the self links defined in the default view of the same version.
222
228
 
223
229
  ```ruby
224
230
  class BookSerializer < MediaTypes::Serialization::Base
@@ -260,7 +266,8 @@ BookSerializer.serialize([book], BookValidator.view(:index).version(3), context:
260
266
 
261
267
  #### Collections
262
268
 
263
- A collection inlines the member objects. The collection method automatically generates it based on the default view of the same version.
269
+ A collection inlines the member objects.
270
+ The collection method automatically generates it based on the default view of the same version.
264
271
 
265
272
  ```ruby
266
273
  class BookSerializer < MediaTypes::Serialization::Base
@@ -329,6 +336,7 @@ class BookSerializer < MediaTypes::Serialization::Base
329
336
  attribute :title, obj.title
330
337
  attribute :description, obj.description if version >= 2
331
338
  end
339
+ end
332
340
 
333
341
  input version: 3
334
342
  end
@@ -344,7 +352,7 @@ class BookController < ActionController::API
344
352
  book = Book.new
345
353
  book.title = 'Everything, abridged'
346
354
 
347
- render media: serialize_media(book), content_type: request.format.to_s
355
+ render_media serialize_media(book)
348
356
  end
349
357
 
350
358
  def create
@@ -390,14 +398,14 @@ class BookController < ActionController::API
390
398
  book = Book.new
391
399
  book.title = 'Everything, abridged'
392
400
 
393
- render media: serialize_media(book), content_type: request.format.to_s
401
+ render_media serialize_media(book)
394
402
  end
395
403
 
396
404
  def create
397
405
  book = deserialize(request)
398
406
  book.save!
399
407
 
400
- render media: serialize_media(book), content_type request.format.to_s
408
+ render_media serialize_media(book)
401
409
  end
402
410
  end
403
411
  ```
@@ -406,7 +414,9 @@ If you don't want to apply any input validation or deserialization you can use t
406
414
 
407
415
  ### Raw output
408
416
 
409
- Sometimes you need to output raw data. This cannot be validated. You do this as follows:
417
+ Sometimes you need to output raw data.
418
+ This cannot be validated.
419
+ You do this as follows:
410
420
 
411
421
  ```ruby
412
422
  class BookSerializer < MediaTypes::Serialization::Base
@@ -443,7 +453,8 @@ end
443
453
 
444
454
  ### Remapping media type identifiers
445
455
 
446
- Sometimes you already have old clients using an `application/json` media type identifier when they do requests. While this is not a good practise as this makes it hard to add new fields or remove old ones, this library has support for migrating away:
456
+ Sometimes you already have old clients using an `application/json` media type identifier when they do requests.
457
+ While this is not a good practise as this makes it hard to add new fields or remove old ones, this library has support for migrating away:
447
458
 
448
459
  ```ruby
449
460
  class BookSerializer < MediaTypes::Serialization::Base
@@ -475,7 +486,8 @@ Validation will be done using the remapped validator. Aliasses map to version `n
475
486
 
476
487
  ### HTML
477
488
 
478
- This library has a built in API viewer. The viewer can be accessed by by appending a `?api_viewer=last` query parameter to the URL.
489
+ This library has a built in API viewer.
490
+ The viewer can be accessed by by appending a `?api_viewer=last` query parameter to the URL.
479
491
 
480
492
  To enable the API viewer, use: `allow_api_viewer` in the controller.
481
493
 
@@ -493,7 +505,7 @@ class BookController < ActionController::API
493
505
  book = Book.new
494
506
  book.title = 'Everything, abridged'
495
507
 
496
- render media: serialize_media(book), content_type: request.format.to_s
508
+ render_media serialize_media(book)
497
509
  end
498
510
 
499
511
  def create
@@ -531,17 +543,18 @@ end
531
543
 
532
544
  #### Errors
533
545
 
534
- This library adds support for returning errors to clients using the [`application/problem+json`](https://tools.ietf.org/html/rfc7231) media type. You can catch and transform application errors by adding an `output_error` call before `freeze_io!`:
546
+ This library adds support for returning errors to clients using the [`application/problem+json`](https://tools.ietf.org/html/rfc7231) media type.
547
+ You can catch and transform application errors by adding an `output_error` call before `freeze_io!`:
535
548
 
536
549
  ```ruby
537
550
  class BookController < ActionController::API
538
551
  include MediaTypes::Serialization
539
552
 
540
- output_error CanCan::AccessDenied do |p, error|
541
- p.title 'You do not have enough permissions to perform this action.', lang: 'en'
542
- p.title 'Je hebt geen toestemming om deze actie uit te voeren.', lang: 'nl-NL'
553
+ output_error CanCan::AccessDenied do |problem_output, error|
554
+ problem_output.title 'You do not have enough permissions to perform this action.', lang: 'en'
555
+ problem_output.title 'Je hebt geen toestemming om deze actie uit te voeren.', lang: 'nl-NL'
543
556
 
544
- p.status_code :forbidden
557
+ problem_output.status_code :forbidden
545
558
  end
546
559
 
547
560
  freeze_io!
@@ -550,12 +563,14 @@ class BookController < ActionController::API
550
563
  end
551
564
  ```
552
565
 
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)
554
- If you want to override this url you can use the `p.url(href)` function.
566
+ 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.
567
+ You can find more information at: [https://docs.delftsolutions.nl/wiki/Error](https://docs.delftsolutions.nl/wiki/Error)
568
+ If you want to override this url you can use the `problem_output.url(href)` function.
555
569
 
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.
570
+ By default the `message` property of the error is used to fill the `details` field.
571
+ You can override this by using the `problem_output.override_details(description, lang:)` function.
557
572
 
558
- Custom attributes can be added using the `p.attribute(name, value)` function.
573
+ Custom attributes can be added using the `problem_output.attribute(name, value)` function.
559
574
 
560
575
  ### Related
561
576
 
@@ -581,35 +596,47 @@ Either validator or unvalidated must be used while defining a serializer.
581
596
 
582
597
  #### `output( view:, version:, versions: ) do |obj, version, context|`
583
598
 
584
- Defines a serialization block. Either version or versions can be set. View should be a symbol or unset.
599
+ Defines a serialization block. Either version or versions can be set.
600
+ View should be a symbol or unset.
585
601
 
586
- Obj is the object to be serialized, version is the negotiated version and context is the context passed in from the serialize function. When using the controller integration, context is the current controller.
602
+ Obj is the object to be serialized, version is the negotiated version and context is the context passed in from the serialize function.
603
+ When using the controller integration, context is the current controller.
587
604
 
588
605
  The block should return an object to convert into JSON.
589
606
 
590
607
  #### `output_raw( view:, version:, versions: ) do |obj, version, context|`
591
608
 
592
- This has the same behavior as `output` but should return a string instead of an object. Output is not validated.
609
+ This has the same behavior as `output` but should return a string instead of an object.
610
+ Output is not validated.
593
611
 
594
612
  #### `output_alias( media_type_identifier, view:, hide_variant: false )`
595
613
 
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.
614
+ 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.
615
+ If `view` is undefined it will use the output serializer without a view defined.
597
616
 
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]`.
617
+ Response will have a content type equal to `[media_type_identifier]; variant=[mapped_media_type_identifier]`.
618
+ If `hide_variant:` is true, the content type emitted will only be `[media_type_identifier]`.
619
+
620
+ > You cannot alias a _versioned_ media type, otherwise it would be easy to later break the definition by changing the version it aliases.
599
621
 
600
622
  #### `output_alias_optional( media_type_identifier, view:, hide_variant: false )`
601
623
 
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.
624
+ Has the same behavior as `output_alias` but can be used by multiple serializers.
625
+ The serializer that is loaded last in the controller 'wins' control over this media type identifier.
626
+ If any of the serializers have an `output_alias` defined with the same media type identifier that one will win instead.
603
627
 
604
628
  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
629
 
606
630
  #### `input( view:, version:, versions: ) do |obj, version, context|`
607
631
 
608
- Defines a deserialization block. Either version or versions can be set. View should be a symbol or unset.
632
+ Defines a deserialization block. Either version or versions can be set.
633
+ View should be a symbol or unset.
609
634
 
610
- Obj is the object to be serialized, version is the negotiated version and context is the context passed in from the serialize function. When using the controller integration, context is the current controller.
635
+ Obj is the object to be serialized, version is the negotiated version and context is the context passed in from the serialize function.
636
+ When using the controller integration, context is the current controller.
611
637
 
612
- The block should return the internal representation of the object. Best practise is to make sure not to change state in this function but to leave that up to the controller.
638
+ The block should return the internal representation of the object.
639
+ Best practise is to make sure not to change state in this function but to leave that up to the controller.
613
640
 
614
641
  #### `input_raw( view:, version:, versions: ) do |bytes, version, context|`
615
642
 
@@ -617,11 +644,17 @@ This has the same behavior as `input` but takes in raw data. Input is not valida
617
644
 
618
645
  #### `input_alias( media_type_identifier, view: )`
619
646
 
620
- Defines a legacy mapping. This will make the serializer 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 input serializer without a view defined.
647
+ Defines a legacy mapping.
648
+ This will make the serializer parse the media type `media_type_identifier` as if it was version `nil` of the specified view.
649
+ If view is undefined it will use the input serializer without a view defined.
650
+
651
+ > You cannot alias a _versioned_ media type, otherwise it would be easy to later break the definition by changing the version it aliases.
621
652
 
622
653
  #### `input_alias_optional( media_type_identifier, view: )`
623
654
 
624
- Has the same behavior as `input_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 `input_alias` defined with the same media type identifier that one will win instead.
655
+ Has the same behavior as `input_alias` but can be used by multiple serializers.
656
+ The serializer that is loaded last in the controller 'wins' control over this media type identifier.
657
+ If any of the serializers have an `input_alias` defined with the same media type identifier that one will win instead.
625
658
 
626
659
  #### `disable_wildcards`
627
660
 
@@ -633,13 +666,15 @@ The following methods are available within an `output ... do` block.
633
666
 
634
667
  #### `attribute( key, value = {} ) do`
635
668
 
636
- Sets a value for the given key. If a block is given, any `attribute`, `link`, `collection` and `index` statements are run in context of `value`.
669
+ Sets a value for the given key.
670
+ If a block is given, any `attribute`, `link`, `collection` and `index` statements are run in context of `value`.
637
671
 
638
672
  Returns the built up context so far.
639
673
 
640
674
  #### `link( rel, href:, emit_header: true, **attributes )`
641
675
 
642
- Adds a `_link` block to the current context. Also adds the specified link to the HTTP Link header. `attributes` allows passing in custom attributes.
676
+ Adds a `_link` block to the current context. Also adds the specified link to the HTTP Link header.
677
+ `attributes` allows passing in custom attributes.
643
678
 
644
679
  If `emit_header` is `true` the link will also be emitted as a http header.
645
680
 
@@ -660,7 +695,9 @@ Returns the built up context so far.
660
695
 
661
696
  #### `hidden do`
662
697
 
663
- Sometimes you want to add links without actually modifying the object. Calls to `attribute`, `link`, `index`, `collection` made inside this block won't modify the context. Any calls to link will only set the HTTP Link header.
698
+ Sometimes you want to add links without actually modifying the object.
699
+ Calls to `attribute`, `link`, `index`, `collection` made inside this block won't modify the context.
700
+ Any calls to link will only set the HTTP Link header.
664
701
 
665
702
  Returns the unmodified context.
666
703
 
@@ -684,7 +721,8 @@ These functions are available during the controller definition if you add `inclu
684
721
 
685
722
  #### `allow_output_serializer( serializer, views: nil, **filters )`
686
723
 
687
- Configure the controller to allow the client to request responses emitted by the specified serializer. Optionally allows you to specify which views to allow by passing an array in the views parameter.
724
+ Configure the controller to allow the client to request responses emitted by the specified serializer.
725
+ Optionally allows you to specify which views to allow by passing an array in the views parameter.
688
726
 
689
727
  Accepts the same filters as `before_action`.
690
728
 
@@ -692,9 +730,11 @@ Accepts the same filters as `before_action`.
692
730
 
693
731
  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
732
 
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`.
733
+ The `Content-Type` of the response will be `text/html` if the `as:` parameter is unset.
734
+ If the `as:` parameter is set, it will include it in the variant parameter: `text/html; variant=application/vnd.xpbytes.borderless`.
696
735
 
697
- Accepts the same filters as `before_action`. You can set the template to use using the `view:` parameter.
736
+ Accepts the same filters as `before_action`.
737
+ You can set the template to use using the `view:` parameter.
698
738
 
699
739
  #### `allow_output_docs( description, **filters )`
700
740
 
@@ -704,7 +744,8 @@ Accepts the same filters as `before_action`.
704
744
 
705
745
  #### `allow_input_serializer( serializer, views: nil, **filters )`
706
746
 
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.
747
+ Configure the controller to allow the client to send bodies with a `Content-Type` that can be deserialized using the specified serializer.
748
+ Optionally allows you to specify which views to allow by passing an array in the views parameter.
708
749
 
709
750
  Accepts the same filters as `before_action`.
710
751
 
@@ -738,7 +779,8 @@ Enables rendering the api viewer when adding the `api_viewer=last` query paramet
738
779
 
739
780
  #### `freeze_io!(**filter_opts)`
740
781
 
741
- Registers serialization and deserialization in the controller. This function must be called before using the controller.
782
+ Registers serialization and deserialization in the controller.
783
+ This function must be called before using the controller.
742
784
 
743
785
  ### Controller usage
744
786
 
@@ -746,7 +788,8 @@ These functions are available during method execution in the controller.
746
788
 
747
789
  #### `render_media( obj, serializers: nil, not_acceptable_serializer: nil, **options ) do`
748
790
 
749
- Serializes an object and renders it using the appropriate content type. Options are passed through to the controller `render` function. Allows you to specify different objects to different serializers using a block:
791
+ Serializes an object and renders it using the appropriate content type.
792
+ Options are passed through to the controller `render` function. Allows you to specify different objects to different serializers using a block:
750
793
 
751
794
  ```ruby
752
795
  render_media do
@@ -757,13 +800,15 @@ render_media do
757
800
  end
758
801
  ```
759
802
 
760
- Warning: this block can be called multiple times when used together with recursive serializers like the API viewer. Try to avoid changing state in this block.
803
+ **Warning**: this block can be called multiple times when used together with recursive serializers like the API viewer.
804
+ Try to _avoid changing state_ in this block.
761
805
 
762
806
  If you want to render with different serializers than defined in the controller you can pass an array of serializers in the `serializers` property.
763
807
 
764
808
  If you want to override the serializer that is used to render the response when no acceptable Content-Type could be negotiated you can pass the desired serializer in the `not_acceptable_serializer` property.
765
809
 
766
- This method throws a `MediaTypes::Serialization::OutputValidationFailedError` error if the output does not conform to the format defined by the configured validator. Best practise is to return a 500 error to the client.
810
+ This method throws a `MediaTypes::Serialization::OutputValidationFailedError` error if the output does not conform to the format defined by the configured validator.
811
+ Best practise is to return a 500 error to the client.
767
812
 
768
813
  If no acceptable Content-Type could be negotiated the response will be rendered using the serialized defined by the class `not_acceptable_serializer` function or by the `not_acceptable_serializer` property.
769
814
 
@@ -805,12 +850,11 @@ HERE
805
850
 
806
851
  ## Development
807
852
 
808
- After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake test` to run the tests. You can
809
- also run `bin/console` for an interactive prompt that will allow you to experiment.
853
+ After checking out the repo, run `bin/setup` to install dependencies.
854
+ Then, run `rake test` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
810
855
 
811
- To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the
812
- version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version,
813
- push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
856
+ To install this gem onto your local machine, run `bundle exec rake install`.
857
+ To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
814
858
 
815
859
  ## Contributing
816
860
 
@@ -184,7 +184,7 @@ module MediaTypes
184
184
  end
185
185
  end
186
186
 
187
- def allow_output_html(as: nil, view: nil, layout: nil, **filter_opts)
187
+ def allow_output_html(as: nil, view: nil, layout: nil, formats: [:html], variants: nil, **filter_opts)
188
188
  before_action(**filter_opts) do
189
189
  raise SerializersAlreadyFrozenError if defined? @serialization_frozen
190
190
 
@@ -197,19 +197,13 @@ module MediaTypes
197
197
  validator = FakeValidator.new(as.nil? ? 'text/html' : as)
198
198
 
199
199
  block = lambda { |_, _, controller|
200
- if layout.nil?
201
- if view.nil?
202
- controller.render_to_string
203
- else
204
- controller.render_to_string(template: view)
205
- end
206
- else
207
- if view.nil?
208
- controller.render_to_string(layout: layout)
209
- else
210
- controller.render_to_string(template: view, layout: layout)
211
- end
212
- end
200
+ options = {}
201
+ options[:layout] = layout unless layout.nil?
202
+ options[:template] = view unless view.nil?
203
+ options[:formats] = formats unless formats.nil?
204
+ options[:variants] = variants unless variants.nil?
205
+
206
+ controller.render_to_string(**options)
213
207
  }
214
208
 
215
209
  html_registration.register_block(nil, validator, nil, block, true, wildcards: true)
@@ -342,11 +336,6 @@ module MediaTypes
342
336
  end
343
337
  # rubocop:enable Metrics/BlockLength
344
338
 
345
- included do
346
- protected
347
-
348
- end
349
-
350
339
  protected
351
340
 
352
341
  def serialize(victim, media_type, serializer: Object.new, links: [], vary: ['Accept'])
@@ -366,6 +355,7 @@ module MediaTypes
366
355
  if obj == MEDIA_TYPES_SERIALIZATION_OBJ_IS_UNDEFINED && block.nil?
367
356
  raise 'render_media was called without an object. Please provide one or supply a block to match the serializer.'
368
357
  end
358
+
369
359
  obj = nil if obj == MEDIA_TYPES_SERIALIZATION_OBJ_IS_UNDEFINED
370
360
 
371
361
  raise SerializersNotFrozenError unless defined? @serialization_frozen
@@ -395,10 +385,17 @@ module MediaTypes
395
385
  selector.instance_exec(&block)
396
386
 
397
387
  raise UnmatchedSerializerError, serializer unless selector.matched
388
+
398
389
  obj = selector.value
399
390
  end
400
391
 
401
- serialization_render_resolved(obj: obj, serializer: serializer, identifier: identifier, registrations: registration, options: options)
392
+ serialization_render_resolved(
393
+ obj: obj,
394
+ serializer: serializer,
395
+ identifier: identifier,
396
+ registrations: registration,
397
+ options: options
398
+ )
402
399
  end
403
400
 
404
401
  def deserialize(request)
@@ -417,6 +414,7 @@ module MediaTypes
417
414
  raise SerializersNotFrozenError unless defined?(@serialization_frozen)
418
415
  raise NoInputReceivedError if request.content_type.blank?
419
416
  raise InputNotAcceptableError unless @serialization_input_registrations.has? request.content_type
417
+
420
418
  @serialization_input_registrations.call(@serialization_decoded_input, request.content_type, self)
421
419
  end
422
420
 
@@ -427,6 +425,7 @@ module MediaTypes
427
425
  registration = registration.registrations[identifier]
428
426
 
429
427
  raise 'Assertion failed, inconsistent answer from resolve_media_type' if registration.nil?
428
+
430
429
  registration.serializer
431
430
  end
432
431
 
@@ -434,8 +433,12 @@ module MediaTypes
434
433
 
435
434
  def resolve_media_type(request, registration, allow_last: true)
436
435
  if defined? @serialization_override_accept
437
- @serialization_override_accept = registration.registrations.keys.last if allow_last && @serialization_override_accept == 'last'
436
+ if allow_last && @serialization_override_accept == 'last'
437
+ @serialization_override_accept = registration.registrations.keys.last
438
+ end
439
+
438
440
  return nil unless registration.has? @serialization_override_accept
441
+
439
442
  return @serialization_override_accept
440
443
  end
441
444
 
@@ -483,7 +486,10 @@ module MediaTypes
483
486
  input_is_allowed = @serialization_input_registrations.has? request.content_type unless request.content_type.blank?
484
487
 
485
488
  unless input_is_allowed || all_allowed
486
- serializers = @serialization_unsupported_media_type_serializer || [MediaTypes::Serialization::Serializers::ProblemSerializer, MediaTypes::Serialization::Serializers::FallbackUnsupportedMediaTypeSerializer]
489
+ serializers = @serialization_unsupported_media_type_serializer || [
490
+ MediaTypes::Serialization::Serializers::ProblemSerializer,
491
+ MediaTypes::Serialization::Serializers::FallbackUnsupportedMediaTypeSerializer
492
+ ]
487
493
  registrations = SerializationRegistration.new(:output)
488
494
  serializers.each do |s|
489
495
  registrations = registrations.merge(s.outputs_for(views: [nil, :html]))
@@ -511,7 +517,10 @@ module MediaTypes
511
517
  input_data = request.body.read
512
518
  @serialization_decoded_input = @serialization_input_registrations.decode(input_data, request.content_type, self)
513
519
  rescue InputValidationFailedError => e
514
- serializers = @serialization_input_validation_failed_serializer || [MediaTypes::Serialization::Serializers::ProblemSerializer, MediaTypes::Serialization::Serializers::InputValidationErrorSerializer]
520
+ serializers = @serialization_input_validation_failed_serializer || [
521
+ MediaTypes::Serialization::Serializers::ProblemSerializer,
522
+ MediaTypes::Serialization::Serializers::InputValidationErrorSerializer
523
+ ]
515
524
  registrations = SerializationRegistration.new(:output)
516
525
  serializers.each do |s|
517
526
  registrations = registrations.merge(s.outputs_for(views: [nil, :html]))
@@ -557,7 +566,13 @@ module MediaTypes
557
566
  actions: @serialization_available_serializers,
558
567
  }
559
568
 
560
- serialization_render_resolved obj: input, serializer: description_serializer, identifier: endpoint_matched_identifier, registrations: @serialization_output_registrations, options: {}
569
+ serialization_render_resolved(
570
+ obj: input,
571
+ serializer: description_serializer,
572
+ identifier: endpoint_matched_identifier,
573
+ registrations: @serialization_output_registrations,
574
+ options: {}
575
+ )
561
576
  return
562
577
  end
563
578
 
@@ -106,22 +106,22 @@ module MediaTypes
106
106
  validator = serializer_validator.view(view)
107
107
  victim_identifier = validator.identifier
108
108
 
109
- serializer_input_registration.register_alias(self, media_type_identifier, victim_identifier, false)
109
+ serializer_input_registration.register_alias(self, media_type_identifier, victim_identifier, false, true, wildcards: false)
110
110
  end
111
111
 
112
112
  def input_alias_optional(media_type_identifier, view: nil)
113
113
  validator = serializer_validator.view(view)
114
114
  victim_identifier = validator.identifier
115
115
 
116
- serializer_input_registration.register_alias(self, media_type_identifier, victim_identifier, true)
116
+ serializer_input_registration.register_alias(self, media_type_identifier, victim_identifier, true, true, wildcards: false)
117
117
  end
118
118
 
119
- def serialize(victim, media_type_identifier, context, dsl: nil, raw: nil)
119
+ def serialize(victim, media_type_identifier, context:, dsl: nil, raw: nil)
120
120
  dsl ||= SerializationDSL.new(self, context: context)
121
121
  serializer_output_registration.call(victim, media_type_identifier.to_s, context, dsl: dsl, raw: raw)
122
122
  end
123
123
 
124
- def deserialize(victim, media_type_identifier, context)
124
+ def deserialize(victim, media_type_identifier, context:)
125
125
  serializer_input_registration.call(victim, media_type_identifier, context)
126
126
  end
127
127
 
@@ -56,7 +56,7 @@ module MediaTypes
56
56
  array.each do |e|
57
57
  child_links = []
58
58
  context = SerializationDSL.new(__getobj__, child_links, context: @serialization_context)
59
- serializer.serialize(e, identifier, @serialization_context, dsl: context)
59
+ serializer.serialize(e, identifier, context: @serialization_context, dsl: context)
60
60
 
61
61
  self_links = child_links.select { |l| l[:rel] == :self }
62
62
  raise NoSelfLinkProvidedError, identifier unless self_links.any?
@@ -79,7 +79,7 @@ module MediaTypes
79
79
 
80
80
  array.each do |e|
81
81
  context = SerializationDSL.new(__getobj__, [], @serialization_vary, context: @serialization_context)
82
- result = serializer.serialize(e, identifier, @serialization_context, dsl: context, raw: true)
82
+ result = serializer.serialize(e, identifier, context: @serialization_context, dsl: context, raw: true)
83
83
 
84
84
  result = block.call(result) unless block.nil?
85
85
 
@@ -105,7 +105,7 @@ module MediaTypes
105
105
  def emit
106
106
  serialization_dsl_result
107
107
  end
108
-
108
+
109
109
  def object(&block)
110
110
  context = SerializationDSL.new(__getobj__, @serialization_links, @serialization_vary, context: @serialization_context)
111
111
  context.instance_exec(&block)
@@ -1,5 +1,5 @@
1
1
  module MediaTypes
2
2
  module Serialization
3
- VERSION = '1.2.0'.freeze
3
+ VERSION = '1.3.0'.freeze
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: media_types-serialization
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.0
4
+ version: 1.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Derk-Jan Karrenbeld
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: exe
11
11
  cert_chain: []
12
- date: 2021-07-13 00:00:00.000000000 Z
12
+ date: 2021-08-05 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: actionpack