media_types-serialization 1.3.1 → 1.3.6
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/workflows/ci.yml +11 -12
- data/CHANGELOG.md +23 -0
- data/Gemfile.lock +12 -12
- data/README.md +196 -22
- data/lib/media_types/problem.rb +1 -1
- data/lib/media_types/serialization/base.rb +88 -23
- data/lib/media_types/serialization/fake_validator.rb +1 -0
- data/lib/media_types/serialization/serialization_registration.rb +2 -2
- data/lib/media_types/serialization/version.rb +1 -1
- data/lib/media_types/serialization.rb +4 -1
- data/media_types-serialization.gemspec +1 -1
- metadata +4 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d53689a0c81861b7305fc606a2b73b7866e4b46915284a716951735926b5bb73
|
4
|
+
data.tar.gz: 29add50810aa2bf8b3792d38eebd50eca96570c716a33be6ef58a2f64813be81
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 56db0c8b8f39b108e80d028459b0fc7e788bc9cbfd3b7a1e26dfbab993883d7b19735f2d638e8f17edfbcfb9837f610f30ea46ec61bf84c4c141f45000ae0c36
|
7
|
+
data.tar.gz: 2985c51bc0f5b59df56d11fe665dc5be479fa5cf494dbd8edf5e57961464bb5e413f82af8e9e867557bb15dd715542aa5f6f10cd9cd9fb12028899fa00d11bf8
|
data/.github/workflows/ci.yml
CHANGED
@@ -13,21 +13,20 @@ on:
|
|
13
13
|
|
14
14
|
jobs:
|
15
15
|
build:
|
16
|
-
|
17
16
|
runs-on: ubuntu-latest
|
18
17
|
|
19
18
|
strategy:
|
20
19
|
matrix:
|
21
|
-
ruby-version: [2.7.x, 2.6.x]
|
20
|
+
ruby-version: [2.7.x, 2.6.x, 2.5.x]
|
22
21
|
|
23
22
|
steps:
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
23
|
+
- uses: actions/checkout@v1
|
24
|
+
- name: Set up Ruby ${{ matrix.ruby-version }}
|
25
|
+
uses: actions/setup-ruby@v1
|
26
|
+
with:
|
27
|
+
ruby-version: ${{ matrix.ruby-version }}
|
28
|
+
- name: Build and test with Rake
|
29
|
+
run: |
|
30
|
+
gem install bundler
|
31
|
+
bundle install --jobs 4 --retry 3
|
32
|
+
bundle exec rake
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,28 @@
|
|
1
1
|
# Changelog
|
2
2
|
|
3
|
+
## 1.3.6
|
4
|
+
|
5
|
+
- 🐛 Fix issue with `override_detail` of `Problem`
|
6
|
+
|
7
|
+
## 1.3.5
|
8
|
+
|
9
|
+
- 🐛 Upgrade media-types library so Ruby 2.5 and 2.6 work again
|
10
|
+
|
11
|
+
## 1.3.4
|
12
|
+
|
13
|
+
- Same as `1.3.3`
|
14
|
+
|
15
|
+
## 1.3.3
|
16
|
+
|
17
|
+
- 🐛 Fix override suffix not being picked up correctly
|
18
|
+
- 🐛 Fix inability to override suffix for aliases
|
19
|
+
- 🐛 Fix inability to override suffix for raw
|
20
|
+
- 🐛 Fix default suffix for raw
|
21
|
+
|
22
|
+
## 1.3.2
|
23
|
+
|
24
|
+
- 🐛 Fix override suffix not returning self or new
|
25
|
+
|
3
26
|
## 1.3.1
|
4
27
|
|
5
28
|
- 🐛 Fix api viewer
|
data/Gemfile.lock
CHANGED
@@ -1,10 +1,10 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
media_types-serialization (1.3.
|
4
|
+
media_types-serialization (1.3.6)
|
5
5
|
actionpack (>= 4.0.0)
|
6
6
|
activesupport (>= 4.0.0)
|
7
|
-
media_types (>= 2.
|
7
|
+
media_types (>= 2.1.1, < 3.0.0)
|
8
8
|
|
9
9
|
GEM
|
10
10
|
remote: https://rubygems.org/
|
@@ -56,26 +56,26 @@ GEM
|
|
56
56
|
concurrent-ruby (1.1.9)
|
57
57
|
crass (1.0.6)
|
58
58
|
erubi (1.10.0)
|
59
|
-
globalid (0.
|
60
|
-
activesupport (>=
|
59
|
+
globalid (0.5.2)
|
60
|
+
activesupport (>= 5.0)
|
61
61
|
i18n (1.8.10)
|
62
62
|
concurrent-ruby (~> 1.0)
|
63
|
-
loofah (2.
|
63
|
+
loofah (2.12.0)
|
64
64
|
crass (~> 1.0.2)
|
65
65
|
nokogiri (>= 1.5.9)
|
66
66
|
mail (2.7.1)
|
67
67
|
mini_mime (>= 0.1.1)
|
68
68
|
marcel (1.0.1)
|
69
|
-
media_types (2.
|
69
|
+
media_types (2.1.1)
|
70
70
|
method_source (1.0.0)
|
71
71
|
mini_mime (1.1.0)
|
72
72
|
minitest (5.14.4)
|
73
|
-
nio4r (2.5.
|
74
|
-
nokogiri (1.
|
73
|
+
nio4r (2.5.8)
|
74
|
+
nokogiri (1.12.3-x64-mingw32)
|
75
75
|
racc (~> 1.4)
|
76
|
-
nokogiri (1.
|
76
|
+
nokogiri (1.12.3-x86_64-linux)
|
77
77
|
racc (~> 1.4)
|
78
|
-
oj (3.
|
78
|
+
oj (3.13.4)
|
79
79
|
racc (1.5.2)
|
80
80
|
rack (2.2.3)
|
81
81
|
rack-test (1.1.0)
|
@@ -96,7 +96,7 @@ GEM
|
|
96
96
|
rails-dom-testing (2.0.3)
|
97
97
|
activesupport (>= 4.2.0)
|
98
98
|
nokogiri (>= 1.6)
|
99
|
-
rails-html-sanitizer (1.
|
99
|
+
rails-html-sanitizer (1.4.1)
|
100
100
|
loofah (~> 2.3)
|
101
101
|
railties (5.2.6)
|
102
102
|
actionpack (= 5.2.6)
|
@@ -134,4 +134,4 @@ DEPENDENCIES
|
|
134
134
|
rake (~> 13.0)
|
135
135
|
|
136
136
|
BUNDLED WITH
|
137
|
-
2.2.
|
137
|
+
2.2.17
|
data/README.md
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# MediaTypes::Serialization
|
2
2
|
|
3
|
-
[![Build Status
|
3
|
+
[![Build Status](https://github.com/XPBytes/media_types-serialization/actions/workflows/ci.yml/badge.svg)](https://github.com/XPBytes/media_types-serialization/actions/workflows/ci.yml)
|
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
|
|
@@ -16,11 +16,15 @@ gem 'media_types-serialization'
|
|
16
16
|
|
17
17
|
And then execute:
|
18
18
|
|
19
|
-
|
19
|
+
```shell
|
20
|
+
bundle
|
21
|
+
```
|
20
22
|
|
21
23
|
Or install it yourself as:
|
22
24
|
|
23
|
-
|
25
|
+
```shell
|
26
|
+
gem install media_types-serialization
|
27
|
+
```
|
24
28
|
|
25
29
|
## Usage
|
26
30
|
|
@@ -221,10 +225,10 @@ BookSerializer.serialize(book, BookValidator.version(3), context: controller)
|
|
221
225
|
|
222
226
|
There are convenience methods for serializing arrays of objects based on a template.
|
223
227
|
|
224
|
-
#### Indexes
|
228
|
+
#### Indexes (index based collections)
|
225
229
|
|
226
230
|
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
|
231
|
+
The index method automatically generates it based on the `self` links defined in the default view (`view: nil`) of the given version.
|
228
232
|
|
229
233
|
```ruby
|
230
234
|
class BookSerializer < MediaTypes::Serialization::Base
|
@@ -264,7 +268,90 @@ BookSerializer.serialize([book], BookValidator.view(:index).version(3), context:
|
|
264
268
|
# }
|
265
269
|
```
|
266
270
|
|
267
|
-
|
271
|
+
##### How to validate?
|
272
|
+
|
273
|
+
The `index` dsl does _not_ exist in the validation gem.
|
274
|
+
This is how you validate indices:
|
275
|
+
|
276
|
+
```ruby
|
277
|
+
class BookValidator
|
278
|
+
include MediaTypes::Dsl
|
279
|
+
|
280
|
+
def self.organisation
|
281
|
+
'acme'
|
282
|
+
end
|
283
|
+
|
284
|
+
use_name 'book'
|
285
|
+
|
286
|
+
validations do
|
287
|
+
view :index do
|
288
|
+
version 3 do
|
289
|
+
attribute :books do
|
290
|
+
link :self
|
291
|
+
|
292
|
+
collection :_index, allow_empty: true do
|
293
|
+
attribute :href, String
|
294
|
+
end
|
295
|
+
end
|
296
|
+
end
|
297
|
+
end
|
298
|
+
end
|
299
|
+
end
|
300
|
+
```
|
301
|
+
|
302
|
+
If the `:self` link contains _more attributes_, they will show up here too.
|
303
|
+
|
304
|
+
```ruby
|
305
|
+
class BookSerializer < MediaTypes::Serialization::Base
|
306
|
+
validator BookValidator
|
307
|
+
|
308
|
+
output versions: [1, 2, 3] do |obj, version, context|
|
309
|
+
attribute :book do
|
310
|
+
link :self, href: context.book_url(obj), isbn: obj.isbn if version >= 3
|
311
|
+
|
312
|
+
attribute :title, obj.title
|
313
|
+
attribute :description, obj.description if version >= 2
|
314
|
+
end
|
315
|
+
end
|
316
|
+
|
317
|
+
output view: :index, version: 3 do |arr, version, context|
|
318
|
+
attribute :books do
|
319
|
+
link :self, href: context.book_index_url
|
320
|
+
|
321
|
+
index arr, version: version
|
322
|
+
end
|
323
|
+
end
|
324
|
+
end
|
325
|
+
```
|
326
|
+
|
327
|
+
```ruby
|
328
|
+
class BookValidator
|
329
|
+
include MediaTypes::Dsl
|
330
|
+
|
331
|
+
def self.organisation
|
332
|
+
'acme'
|
333
|
+
end
|
334
|
+
|
335
|
+
use_name 'book'
|
336
|
+
|
337
|
+
validations do
|
338
|
+
view :index do
|
339
|
+
version 3 do
|
340
|
+
attribute :books do
|
341
|
+
link :self
|
342
|
+
|
343
|
+
collection :_index, allow_empty: true do
|
344
|
+
attribute :href, String
|
345
|
+
attribute :isbn, AllowNil(String)
|
346
|
+
end
|
347
|
+
end
|
348
|
+
end
|
349
|
+
end
|
350
|
+
end
|
351
|
+
end
|
352
|
+
```
|
353
|
+
|
354
|
+
#### Collections (embedding collections)
|
268
355
|
|
269
356
|
A collection inlines the member objects.
|
270
357
|
The collection method automatically generates it based on the default view of the same version.
|
@@ -321,6 +408,38 @@ BookSerializer.serialize([book], BookValidator.view(:collection).version(3), con
|
|
321
408
|
# }
|
322
409
|
```
|
323
410
|
|
411
|
+
The `collection` dsl is _not_ the same as the one in the validation gem.
|
412
|
+
This is how you could validate collections:
|
413
|
+
|
414
|
+
```ruby
|
415
|
+
class BookValidator
|
416
|
+
include MediaTypes::Dsl
|
417
|
+
|
418
|
+
def self.organisation
|
419
|
+
'acme'
|
420
|
+
end
|
421
|
+
|
422
|
+
use_name 'book'
|
423
|
+
|
424
|
+
validations do
|
425
|
+
view :collection do
|
426
|
+
version 3 do
|
427
|
+
attribute :books do
|
428
|
+
link :self
|
429
|
+
|
430
|
+
collection :_embedded, allow_empty: true do
|
431
|
+
link :self
|
432
|
+
|
433
|
+
attribute :title, String
|
434
|
+
attribute :description, AllowNil(String)
|
435
|
+
end
|
436
|
+
end
|
437
|
+
end
|
438
|
+
end
|
439
|
+
end
|
440
|
+
end
|
441
|
+
```
|
442
|
+
|
324
443
|
### Input deserialization
|
325
444
|
|
326
445
|
You can mark a media type as something that's allowed to be sent along with a PUT request as follows:
|
@@ -454,12 +573,15 @@ end
|
|
454
573
|
### Remapping media type identifiers
|
455
574
|
|
456
575
|
Sometimes you already have old clients using an `application/json` media type identifier when they do requests.
|
457
|
-
While this is not a good
|
576
|
+
While this is not a good practice as this makes it hard to add new fields or remove old ones, this library has support for migrating away:
|
458
577
|
|
459
578
|
```ruby
|
460
579
|
class BookSerializer < MediaTypes::Serialization::Base
|
461
580
|
validator BookValidator
|
462
581
|
|
582
|
+
# applicaton/vnd.acme.book.v3+json
|
583
|
+
# applicaton/vnd.acme.book.v2+json
|
584
|
+
# applicaton/vnd.acme.book.v1+json
|
463
585
|
output versions: [1, 2, 3] do |obj, version, context|
|
464
586
|
attribute :book do
|
465
587
|
link :self, href: context.book_url(obj) if version >= 3
|
@@ -468,8 +590,18 @@ class BookSerializer < MediaTypes::Serialization::Base
|
|
468
590
|
attribute :description, obj.description if version >= 2
|
469
591
|
end
|
470
592
|
end
|
471
|
-
output_alias 'application/json' # maps application/json to to applicaton/vnd.acme.book.v1+json
|
472
593
|
|
594
|
+
# applicaton/vnd.acme.book+json
|
595
|
+
output version: nil do |obj, version, context|
|
596
|
+
attribute :book do
|
597
|
+
attribute :title, obj.title
|
598
|
+
end
|
599
|
+
end
|
600
|
+
output_alias 'application/json' # maps application/json to to applicaton/vnd.acme.book+json
|
601
|
+
|
602
|
+
# applicaton/vnd.acme.book.v3.create+json
|
603
|
+
# applicaton/vnd.acme.book.v2.create+json
|
604
|
+
# applicaton/vnd.acme.book.v1.create+json
|
473
605
|
input view: :create, versions: [1, 2, 3] do |json, version, context|
|
474
606
|
book = Book.new
|
475
607
|
book.title = json['book']['title']
|
@@ -479,10 +611,21 @@ class BookSerializer < MediaTypes::Serialization::Base
|
|
479
611
|
# Make sure not to save here but only save in the controller
|
480
612
|
book
|
481
613
|
end
|
482
|
-
|
614
|
+
|
615
|
+
# applicaton/vnd.acme.book.create+json
|
616
|
+
input view: :create, version: nil do |json, version, context|
|
617
|
+
book = Book.new
|
618
|
+
book.title = json['book']['title']
|
619
|
+
book.description = 'Not available'
|
620
|
+
|
621
|
+
# Make sure not to save here but only save in the controller
|
622
|
+
book
|
623
|
+
end
|
624
|
+
input_alias 'application/json', view: :create # maps application/json to to applicaton/vnd.acme.book.create+json
|
483
625
|
```
|
484
626
|
|
485
|
-
Validation will be done using the remapped validator. Aliasses map to version `nil
|
627
|
+
Validation will be done using the remapped validator. Aliasses map to version `nil`.
|
628
|
+
It is not possible to configure this version.
|
486
629
|
|
487
630
|
### HTML
|
488
631
|
|
@@ -563,12 +706,13 @@ class BookController < ActionController::API
|
|
563
706
|
end
|
564
707
|
```
|
565
708
|
|
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.
|
709
|
+
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.
|
710
|
+
Feel free to add instructions there on how clients should solve this problem.
|
567
711
|
You can find more information at: [https://docs.delftsolutions.nl/wiki/Error](https://docs.delftsolutions.nl/wiki/Error)
|
568
712
|
If you want to override this url you can use the `problem_output.url(href)` function.
|
569
713
|
|
570
714
|
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.
|
715
|
+
You can override this by using the `problem_output.override_detail(description, lang:)` function.
|
572
716
|
|
573
717
|
Custom attributes can be added using the `problem_output.attribute(name, value)` function.
|
574
718
|
|
@@ -578,7 +722,7 @@ Custom attributes can be added using the `problem_output.attribute(name, value)`
|
|
578
722
|
|
579
723
|
## API
|
580
724
|
|
581
|
-
### Serializer definition
|
725
|
+
### Serializer class definition
|
582
726
|
|
583
727
|
These methods become available during class definition if you inherit from `MediaTypes::Serialization::Base`.
|
584
728
|
|
@@ -597,6 +741,7 @@ Either validator or unvalidated must be used while defining a serializer.
|
|
597
741
|
#### `output( view:, version:, versions: ) do |obj, version, context|`
|
598
742
|
|
599
743
|
Defines a serialization block. Either version or versions can be set.
|
744
|
+
`nil` is allowed for unversioned.
|
600
745
|
View should be a symbol or unset.
|
601
746
|
|
602
747
|
Obj is the object to be serialized, version is the negotiated version and context is the context passed in from the serialize function.
|
@@ -604,26 +749,30 @@ When using the controller integration, context is the current controller.
|
|
604
749
|
|
605
750
|
The block should return an object to convert into JSON.
|
606
751
|
|
607
|
-
#### `output_raw( view:, version:, versions: ) do |obj, version, context|`
|
752
|
+
#### `output_raw( view:, version:, versions:, suffix: ) do |obj, version, context|`
|
608
753
|
|
609
754
|
This has the same behavior as `output` but should return a string instead of an object.
|
610
755
|
Output is not validated.
|
756
|
+
By default, `input_raw` is expected to _not_ be JSON.
|
757
|
+
Override `suffix` with `:json` if it _is_ JSON.
|
611
758
|
|
612
|
-
#### `output_alias( media_type_identifier, view:, hide_variant: false )`
|
759
|
+
#### `output_alias( media_type_identifier, view:, hide_variant: false, suffix: '~' )`
|
613
760
|
|
614
761
|
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
762
|
If `view` is undefined it will use the output serializer without a view defined.
|
763
|
+
By default, suffix is `:json` if `media_type_identifier` is a JSON type.
|
616
764
|
|
617
765
|
Response will have a content type equal to `[media_type_identifier]; variant=[mapped_media_type_identifier]`.
|
618
766
|
If `hide_variant:` is true, the content type emitted will only be `[media_type_identifier]`.
|
619
767
|
|
620
768
|
> You cannot alias a _versioned_ media type, otherwise it would be easy to later break the definition by changing the version it aliases.
|
621
769
|
|
622
|
-
#### `output_alias_optional( media_type_identifier, view:, hide_variant: false )`
|
770
|
+
#### `output_alias_optional( media_type_identifier, view:, hide_variant: false, suffix: '~' )`
|
623
771
|
|
624
772
|
Has the same behavior as `output_alias` but can be used by multiple serializers.
|
625
773
|
The serializer that is loaded last in the controller 'wins' control over this media type identifier.
|
626
774
|
If any of the serializers have an `output_alias` defined with the same media type identifier that one will win instead.
|
775
|
+
By default, suffix is `:json` if `media_type_identifier` is a JSON type.
|
627
776
|
|
628
777
|
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]`.
|
629
778
|
|
@@ -638,29 +787,34 @@ When using the controller integration, context is the current controller.
|
|
638
787
|
The block should return the internal representation of the object.
|
639
788
|
Best practise is to make sure not to change state in this function but to leave that up to the controller.
|
640
789
|
|
641
|
-
#### `input_raw( view:, version:, versions: ) do |bytes, version, context|`
|
790
|
+
#### `input_raw( view:, version:, versions:, suffix: nil ) do |bytes, version, context|`
|
642
791
|
|
643
|
-
This has the same behavior as `input` but takes in raw data.
|
792
|
+
This has the same behavior as `input` but takes in raw data.
|
793
|
+
Input is not validated.
|
794
|
+
By default, `input_raw` is expected to _not_ be JSON.
|
795
|
+
Override `suffix` with `:json` if it _is_ JSON.
|
644
796
|
|
645
|
-
#### `input_alias( media_type_identifier, view: )`
|
797
|
+
#### `input_alias( media_type_identifier, view:, suffix: '~' )`
|
646
798
|
|
647
799
|
Defines a legacy mapping.
|
648
800
|
This will make the serializer parse the media type `media_type_identifier` as if it was version `nil` of the specified view.
|
649
801
|
If view is undefined it will use the input serializer without a view defined.
|
802
|
+
By default, suffix is `:json` if `media_type_identifier` is a JSON type.
|
650
803
|
|
651
804
|
> You cannot alias a _versioned_ media type, otherwise it would be easy to later break the definition by changing the version it aliases.
|
652
805
|
|
653
|
-
#### `input_alias_optional( media_type_identifier, view: )`
|
806
|
+
#### `input_alias_optional( media_type_identifier, view:, suffix: '~' )`
|
654
807
|
|
655
808
|
Has the same behavior as `input_alias` but can be used by multiple serializers.
|
656
809
|
The serializer that is loaded last in the controller 'wins' control over this media type identifier.
|
657
810
|
If any of the serializers have an `input_alias` defined with the same media type identifier that one will win instead.
|
811
|
+
By default, suffix is `:json` if `media_type_identifier` is a JSON type.
|
658
812
|
|
659
813
|
#### `disable_wildcards`
|
660
814
|
|
661
815
|
Disables registering wildcard media types.
|
662
816
|
|
663
|
-
### Serializer definition
|
817
|
+
### Serializer output definition
|
664
818
|
|
665
819
|
The following methods are available within an `output ... do` block.
|
666
820
|
|
@@ -682,12 +836,16 @@ Returns the built up context so far.
|
|
682
836
|
|
683
837
|
#### `index( array, serializer, version:, view: nil )`
|
684
838
|
|
839
|
+
> Not the same as a validator `collection`.
|
840
|
+
|
685
841
|
Adds an `_index` block to the current context. Uses the self links of the specified view to construct an index of urls to the child objects.
|
686
842
|
|
687
843
|
Returns the built up context so far.
|
688
844
|
|
689
845
|
#### `collection( array, serializer, version:, view: nil )`
|
690
846
|
|
847
|
+
> Not the same as a validator `collection`.
|
848
|
+
|
691
849
|
Adds an `_embedded` block to the current context. Uses the specified serializer to embed the child objects.
|
692
850
|
Optionally a block can be used to modify the output from the child serializer.
|
693
851
|
|
@@ -711,9 +869,25 @@ Returns the built up context so far.
|
|
711
869
|
|
712
870
|
Runs a block in a new context and returns the result
|
713
871
|
|
872
|
+
> Most common use-case is emitting from an enumerable.
|
873
|
+
>
|
874
|
+
> ```ruby
|
875
|
+
> results = [item, item, item].map do |current_item|
|
876
|
+
> object do
|
877
|
+
> attribute :foo, current_item.bar
|
878
|
+
> end
|
879
|
+
> end
|
880
|
+
>
|
881
|
+
> attribute :items, results
|
882
|
+
> ```
|
883
|
+
|
714
884
|
#### `render_view( view, context:, **args)`
|
715
885
|
|
716
|
-
Can be used to render a view.
|
886
|
+
Can be used to render a view.
|
887
|
+
You can set local variables in the view by assigning a hash to the `assigns:` parameter.
|
888
|
+
Returns a `string`
|
889
|
+
|
890
|
+
> When possible, prefer `output_raw` with `context.class.render(params)`
|
717
891
|
|
718
892
|
### Controller definition
|
719
893
|
|
data/lib/media_types/problem.rb
CHANGED
@@ -31,7 +31,7 @@ module MediaTypes
|
|
31
31
|
|
32
32
|
def override_detail(detail, lang:)
|
33
33
|
raise 'Unable to override detail message without having a title in the same language.' unless translations[lang]
|
34
|
-
translations[lang][:detail] =
|
34
|
+
translations[lang][:detail] = detail
|
35
35
|
end
|
36
36
|
|
37
37
|
def attribute(name, value)
|
@@ -44,35 +44,76 @@ module MediaTypes
|
|
44
44
|
validator = serializer_validator.view(view).version(v)
|
45
45
|
validator.override_suffix(:json) unless serializer_validated
|
46
46
|
|
47
|
-
serializer_output_registration.register_block(
|
47
|
+
serializer_output_registration.register_block(
|
48
|
+
self,
|
49
|
+
validator,
|
50
|
+
v,
|
51
|
+
block,
|
52
|
+
false,
|
53
|
+
wildcards:
|
54
|
+
!serializer_disable_wildcards
|
55
|
+
)
|
48
56
|
end
|
49
57
|
end
|
50
58
|
|
51
|
-
def output_raw(view: nil, version: nil, versions: nil, &block)
|
59
|
+
def output_raw(view: nil, version: nil, versions: nil, suffix: nil, &block)
|
52
60
|
versions = [version] if versions.nil?
|
53
61
|
raise VersionsNotAnArrayError unless versions.is_a? Array
|
54
62
|
|
55
63
|
raise ValidatorNotSpecifiedError, :output if serializer_validator.nil?
|
56
64
|
|
57
65
|
versions.each do |v|
|
58
|
-
validator = serializer_validator.view(view)
|
59
|
-
|
60
|
-
|
66
|
+
validator = serializer_validator.view(view)
|
67
|
+
.version(v)
|
68
|
+
.override_suffix(suffix)
|
69
|
+
|
70
|
+
serializer_output_registration.register_block(
|
71
|
+
self,
|
72
|
+
validator,
|
73
|
+
v,
|
74
|
+
block,
|
75
|
+
true,
|
76
|
+
wildcards: !serializer_disable_wildcards
|
77
|
+
)
|
61
78
|
end
|
62
79
|
end
|
63
80
|
|
64
|
-
def output_alias(
|
65
|
-
|
81
|
+
def output_alias(
|
82
|
+
media_type_identifier,
|
83
|
+
view: nil,
|
84
|
+
suffix: media_type_identifier == 'application/json' || media_type_identifier.end_with?('+json') ? :json : nil,
|
85
|
+
hide_variant: false
|
86
|
+
)
|
87
|
+
validator = serializer_validator.view(view).override_suffix(suffix)
|
66
88
|
victim_identifier = validator.identifier
|
67
89
|
|
68
|
-
serializer_output_registration.register_alias(
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
90
|
+
serializer_output_registration.register_alias(
|
91
|
+
self,
|
92
|
+
media_type_identifier,
|
93
|
+
victim_identifier,
|
94
|
+
false,
|
95
|
+
hide_variant,
|
96
|
+
wildcards: !serializer_disable_wildcards
|
97
|
+
)
|
98
|
+
end
|
99
|
+
|
100
|
+
def output_alias_optional(
|
101
|
+
media_type_identifier,
|
102
|
+
view: nil,
|
103
|
+
suffix: media_type_identifier == 'application/json' || media_type_identifier.end_with?('+json') ? :json : nil,
|
104
|
+
hide_variant: false
|
105
|
+
)
|
106
|
+
validator = serializer_validator.view(view).override_suffix(suffix)
|
73
107
|
victim_identifier = validator.identifier
|
74
108
|
|
75
|
-
serializer_output_registration.register_alias(
|
109
|
+
serializer_output_registration.register_alias(
|
110
|
+
self,
|
111
|
+
media_type_identifier,
|
112
|
+
victim_identifier,
|
113
|
+
true,
|
114
|
+
hide_variant,
|
115
|
+
wildcards: !serializer_disable_wildcards
|
116
|
+
)
|
76
117
|
end
|
77
118
|
|
78
119
|
def input(view: nil, version: nil, versions: nil, &block)
|
@@ -89,31 +130,53 @@ module MediaTypes
|
|
89
130
|
end
|
90
131
|
end
|
91
132
|
|
92
|
-
def input_raw(view: nil, version: nil, versions: nil, &block)
|
133
|
+
def input_raw(view: nil, version: nil, versions: nil, suffix: nil, &block)
|
93
134
|
versions = [version] if versions.nil?
|
94
135
|
raise VersionsNotAnArrayError unless versions.is_a? Array
|
95
136
|
|
96
137
|
raise ValidatorNotSpecifiedError, :input if serializer_validator.nil?
|
97
138
|
|
98
139
|
versions.each do |v|
|
99
|
-
validator = serializer_validator.view(view).version(v)
|
140
|
+
validator = serializer_validator.view(view).version(v).override_suffix(suffix)
|
100
141
|
|
101
142
|
serializer_input_registration.register_block(self, validator, v, block, true)
|
102
143
|
end
|
103
144
|
end
|
104
145
|
|
105
|
-
def input_alias(
|
106
|
-
|
146
|
+
def input_alias(
|
147
|
+
media_type_identifier,
|
148
|
+
view: nil,
|
149
|
+
suffix: media_type_identifier == 'application/json' || media_type_identifier.end_with?('+json') ? :json : nil
|
150
|
+
)
|
151
|
+
validator = serializer_validator.view(view).override_suffix(suffix)
|
107
152
|
victim_identifier = validator.identifier
|
108
153
|
|
109
|
-
serializer_input_registration.register_alias(
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
154
|
+
serializer_input_registration.register_alias(
|
155
|
+
self,
|
156
|
+
media_type_identifier,
|
157
|
+
victim_identifier,
|
158
|
+
false,
|
159
|
+
true,
|
160
|
+
wildcards: false
|
161
|
+
)
|
162
|
+
end
|
163
|
+
|
164
|
+
def input_alias_optional(
|
165
|
+
media_type_identifier,
|
166
|
+
view: nil,
|
167
|
+
suffix: media_type_identifier == 'application/json' || media_type_identifier.end_with?('+json') ? :json : nil
|
168
|
+
)
|
169
|
+
validator = serializer_validator.view(view).override_suffix(suffix)
|
114
170
|
victim_identifier = validator.identifier
|
115
171
|
|
116
|
-
serializer_input_registration.register_alias(
|
172
|
+
serializer_input_registration.register_alias(
|
173
|
+
self,
|
174
|
+
media_type_identifier,
|
175
|
+
victim_identifier,
|
176
|
+
true,
|
177
|
+
true,
|
178
|
+
wildcards: false
|
179
|
+
)
|
117
180
|
end
|
118
181
|
|
119
182
|
def serialize(victim, media_type_identifier, context:, dsl: nil, raw: nil)
|
@@ -135,6 +198,8 @@ module MediaTypes
|
|
135
198
|
end
|
136
199
|
|
137
200
|
def self.inherited(subclass)
|
201
|
+
super
|
202
|
+
|
138
203
|
subclass.extend(ClassMethods)
|
139
204
|
subclass.instance_eval do
|
140
205
|
class << self
|
@@ -36,7 +36,7 @@ module MediaTypes
|
|
36
36
|
|
37
37
|
unless registrations.key? target_identifier
|
38
38
|
potential_match = registrations.keys.find do |k|
|
39
|
-
k.
|
39
|
+
k.start_with? target_identifier
|
40
40
|
end
|
41
41
|
raise VersionedAliasDefinitionError.new(target_identifier, inout, potential_match) unless potential_match.nil?
|
42
42
|
raise UnbackedAliasDefinitionError.new(target_identifier, inout)
|
@@ -152,7 +152,7 @@ module MediaTypes
|
|
152
152
|
self.raw = raw
|
153
153
|
super(serializer, inout, validator, display_identifier)
|
154
154
|
end
|
155
|
-
|
155
|
+
|
156
156
|
def merge(other)
|
157
157
|
return nil unless other.is_a?(SerializationAliasRegistration)
|
158
158
|
|
@@ -345,7 +345,10 @@ module MediaTypes
|
|
345
345
|
|
346
346
|
MEDIA_TYPES_SERIALIZATION_OBJ_IS_UNDEFINED = ::Object.new
|
347
347
|
|
348
|
-
def render_media(obj = MEDIA_TYPES_SERIALIZATION_OBJ_IS_UNDEFINED,
|
348
|
+
def render_media(obj = MEDIA_TYPES_SERIALIZATION_OBJ_IS_UNDEFINED, **options, &block)
|
349
|
+
serializers = options.delete(:serializers)
|
350
|
+
not_acceptable_serializer = options.delete(:not_acceptable_serializer)
|
351
|
+
|
349
352
|
if obj == MEDIA_TYPES_SERIALIZATION_OBJ_IS_UNDEFINED && options.keys.any? && !block
|
350
353
|
# options is too greedy :(
|
351
354
|
obj = options
|
@@ -37,7 +37,7 @@ Gem::Specification.new do |spec|
|
|
37
37
|
|
38
38
|
spec.add_dependency 'actionpack', '>= 4.0.0'
|
39
39
|
spec.add_dependency 'activesupport', '>= 4.0.0'
|
40
|
-
spec.add_dependency 'media_types', '>= 2.
|
40
|
+
spec.add_dependency 'media_types', '>= 2.1.1', '< 3.0.0'
|
41
41
|
|
42
42
|
spec.add_development_dependency 'awesome_print'
|
43
43
|
spec.add_development_dependency 'bundler'
|
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.3.
|
4
|
+
version: 1.3.6
|
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-
|
12
|
+
date: 2021-11-04 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: actionpack
|
@@ -45,7 +45,7 @@ dependencies:
|
|
45
45
|
requirements:
|
46
46
|
- - ">="
|
47
47
|
- !ruby/object:Gem::Version
|
48
|
-
version: 2.
|
48
|
+
version: 2.1.1
|
49
49
|
- - "<"
|
50
50
|
- !ruby/object:Gem::Version
|
51
51
|
version: 3.0.0
|
@@ -55,7 +55,7 @@ dependencies:
|
|
55
55
|
requirements:
|
56
56
|
- - ">="
|
57
57
|
- !ruby/object:Gem::Version
|
58
|
-
version: 2.
|
58
|
+
version: 2.1.1
|
59
59
|
- - "<"
|
60
60
|
- !ruby/object:Gem::Version
|
61
61
|
version: 3.0.0
|