ivy-serializers 0.2.0 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +1 -3
- data/README.md +15 -49
- data/lib/ivy/serializers/attribute.rb +1 -1
- data/lib/ivy/serializers/documents/document.rb +17 -14
- data/lib/ivy/serializers/documents/individual_resource.rb +2 -2
- data/lib/ivy/serializers/documents/resource_collection.rb +2 -2
- data/lib/ivy/serializers/formats/active_model_serializers.rb +0 -4
- data/lib/ivy/serializers/formats/json.rb +15 -10
- data/lib/ivy/serializers/formats/json_api.rb +14 -11
- data/lib/ivy/serializers/mapping.rb +11 -8
- data/lib/ivy/serializers/registry.rb +6 -2
- data/lib/ivy/serializers/serializer.rb +12 -4
- data/lib/ivy/serializers/version.rb +1 -1
- data/spec/integration/formats/active_model_serializers_spec.rb +24 -0
- data/spec/integration/formats/json_api_spec.rb +104 -50
- data/spec/integration/formats/json_spec.rb +283 -0
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 53cc58ca39399bdcc72ecb47fd0aeecac296be43
|
4
|
+
data.tar.gz: ad5208023b028606b093a3056added2c7574ba82
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 329051d45ee2fbbd118e992ffcd83e69fcac05128e96606ba2fdd64e53ee1b2b74ad75649d1c48c32fddd83fa04c121706b6f0b79b15eb67171f34e368f0cb12
|
7
|
+
data.tar.gz: 6a6540f204ccb754c0c0846924708e4ee0a5caed80827ef1abcea481176c4d7f2a8a3f8c44ed9f45deb93f203d7b450b3098fde5ab003029a75f9445b998880e
|
data/.travis.yml
CHANGED
data/README.md
CHANGED
@@ -1,13 +1,10 @@
|
|
1
|
-
#
|
1
|
+
# ivy-serializers
|
2
2
|
|
3
3
|
[![Build Status](https://travis-ci.org/IvyApp/ivy-serializers.svg?branch=master)](https://travis-ci.org/IvyApp/ivy-serializers)
|
4
4
|
|
5
|
-
JSON serialization for client-side apps, with multiple output formats. Ships
|
6
|
-
with [ActiveModel::Serializers][ams] and [JSON-API][jsonapi] RC3 support
|
7
|
-
out of the box.
|
5
|
+
JSON serialization for client-side apps, with multiple output formats. Ships with [ActiveModel::Serializers](https://github.com/rails-api/active_model_serializers) and [JSON-API](http://jsonapi.org/) 1.0 support out of the box.
|
8
6
|
|
9
|
-
[
|
10
|
-
[jsonapi]: http://jsonapi.org/
|
7
|
+
If you're building a Rails project, take a look at [ivy-serializers-rails](https://github.com/IvyApp/ivy-serializers-rails) instead.
|
11
8
|
|
12
9
|
## Installation
|
13
10
|
|
@@ -45,40 +42,27 @@ class Comment < ActiveRecord::Base
|
|
45
42
|
end
|
46
43
|
```
|
47
44
|
|
48
|
-
Define a serializer in `app/serializers/
|
45
|
+
Define a serializer in `app/serializers/my_serializer.rb`:
|
49
46
|
|
50
47
|
```ruby
|
51
|
-
class
|
48
|
+
class MySerializer < Ivy::Serializers::Serializer
|
52
49
|
map Post do
|
53
|
-
attributes :
|
50
|
+
attributes :title
|
54
51
|
has_many :comments
|
55
52
|
end
|
56
53
|
|
57
54
|
map Comment do
|
58
|
-
attributes :
|
55
|
+
attributes :body
|
59
56
|
belongs_to :post
|
60
57
|
end
|
61
58
|
end
|
62
59
|
```
|
63
60
|
|
64
|
-
|
65
|
-
|
66
|
-
```ruby
|
67
|
-
class ApplicationController < ActionController::Base
|
68
|
-
self.serializer = Serializer
|
69
|
-
end
|
70
|
-
```
|
71
|
-
|
72
|
-
Note that you're not limited to a single serializer. If you have multiple
|
73
|
-
serialization formats, such as one for admin and one for public-facing, you can
|
74
|
-
define alternate serializers in `app/serializers` and use them as well.
|
61
|
+
**NOTE**: An `id` attribute is automatically defined for you. This is a consequence of supporting JSON-API, which requires all resources to have IDs.
|
75
62
|
|
76
63
|
### Sideloading
|
77
64
|
|
78
|
-
The `#belongs_to` and `#has_many` methods support an optional `:embed_in_root`
|
79
|
-
option, which will load the associated record into the root of the payload. For
|
80
|
-
instance, if we wanted the list of comments to be included when fetching
|
81
|
-
a post, we could define the `has_many` relationship like so:
|
65
|
+
The `#belongs_to` and `#has_many` methods support an optional `:embed_in_root` option, which will load the associated record into the root of the payload. For instance, if we wanted the list of comments to be included when fetching a post, we could define the `has_many` relationship like so:
|
82
66
|
|
83
67
|
```ruby
|
84
68
|
map Post do
|
@@ -86,8 +70,7 @@ map Post do
|
|
86
70
|
end
|
87
71
|
```
|
88
72
|
|
89
|
-
The same thing also works with `belongs_to`, so if we wanted to ensure the post
|
90
|
-
was included when fetching a comment:
|
73
|
+
The same thing also works with `belongs_to`, so if we wanted to ensure the post was included when fetching a comment:
|
91
74
|
|
92
75
|
```ruby
|
93
76
|
map Comment do
|
@@ -97,8 +80,7 @@ end
|
|
97
80
|
|
98
81
|
### Polymorphic Associations
|
99
82
|
|
100
|
-
There is also support for polymorphic associations. To use it, pass the
|
101
|
-
`:polymorphic => true` option to the `#belongs_to` or `#has_many` methods:
|
83
|
+
There is also support for polymorphic associations. To use it, pass the `:polymorphic => true` option to the `#belongs_to` or `#has_many` methods:
|
102
84
|
|
103
85
|
```ruby
|
104
86
|
map Post do
|
@@ -112,18 +94,15 @@ end
|
|
112
94
|
|
113
95
|
### Customizing Attributes
|
114
96
|
|
115
|
-
By default, attributes are mapped directly to methods on the record being
|
116
|
-
serialized. So defining:
|
97
|
+
By default, attributes are mapped directly to methods on the record being serialized. So defining:
|
117
98
|
|
118
99
|
```ruby
|
119
100
|
map Post do
|
120
|
-
attributes :
|
101
|
+
attributes :title
|
121
102
|
end
|
122
103
|
```
|
123
104
|
|
124
|
-
will read `
|
125
|
-
`:id` and `:title` keys. If you want to customize the value, you can use the
|
126
|
-
`#attribute` method instead, and pass it a block:
|
105
|
+
will read `title` from the post and write it into the hash under the `:title` key. If you want to customize the value, you can use the `#attribute` method instead, and pass it a block:
|
127
106
|
|
128
107
|
```ruby
|
129
108
|
map Post do
|
@@ -131,20 +110,7 @@ map Post do
|
|
131
110
|
end
|
132
111
|
```
|
133
112
|
|
134
|
-
In the above example, we read the `headline` attribute from the post and write
|
135
|
-
it into the payload under the `:title` key.
|
136
|
-
|
137
|
-
### Alternate Output Formats
|
138
|
-
|
139
|
-
By default the ActiveModel::Serializers output format is used. If you'd rather
|
140
|
-
use JSON-API (or a custom format), you can do so by setting
|
141
|
-
`serialization_format` in your controller. For instance, to use JSON-API:
|
142
|
-
|
143
|
-
```ruby
|
144
|
-
class ApplicationController < ActionController::Base
|
145
|
-
self.serialization_format = Ivy::Serializers::Formats::JSONAPI
|
146
|
-
end
|
147
|
-
```
|
113
|
+
In the above example, we read the `headline` attribute from the post and write it into the payload under the `:title` key.
|
148
114
|
|
149
115
|
## Contributing
|
150
116
|
|
@@ -8,46 +8,49 @@ module Ivy
|
|
8
8
|
@serializer = serializer
|
9
9
|
@primary_resource_name = primary_resource_name
|
10
10
|
@primary_resource = primary_resource
|
11
|
-
@
|
11
|
+
@included_resources = Hash.new { |hash, klass| hash[klass] = Set.new }
|
12
12
|
end
|
13
13
|
|
14
14
|
def belongs_to(name, resource, options={})
|
15
|
-
|
15
|
+
include_resource(resource) if resource && options[:embed_in_root]
|
16
16
|
end
|
17
17
|
|
18
18
|
def generate(generator)
|
19
19
|
generator.document(self)
|
20
20
|
end
|
21
21
|
|
22
|
-
def
|
23
|
-
|
22
|
+
def generate_attributes(generator, resource)
|
23
|
+
@serializer.attributes(generator, resource)
|
24
24
|
end
|
25
25
|
|
26
|
-
def
|
27
|
-
|
26
|
+
def generate_included(generator)
|
27
|
+
generator.included(self) unless @included_resources.empty?
|
28
28
|
end
|
29
29
|
|
30
|
-
def
|
31
|
-
@
|
30
|
+
def generate_included_resources(generator)
|
31
|
+
@included_resources.each_pair { |klass, resources| generator.included_resources(klass, resources) }
|
32
|
+
end
|
33
|
+
|
34
|
+
def generate_relationships(generator, resource)
|
35
|
+
@serializer.relationships(generator, resource)
|
32
36
|
end
|
33
37
|
|
34
38
|
def generate_resource(generator, resource)
|
35
39
|
@serializer.resource(generator, resource)
|
36
|
-
generator.links(resource)
|
37
40
|
end
|
38
41
|
|
39
42
|
def has_many(name, resources, options={})
|
40
|
-
|
43
|
+
include_resources(resources) if options[:embed_in_root]
|
41
44
|
end
|
42
45
|
|
43
46
|
private
|
44
47
|
|
45
|
-
def
|
46
|
-
@serializer.
|
48
|
+
def include_resource(resource)
|
49
|
+
@serializer.relationships(self, resource) if @included_resources[resource.class].add?(resource)
|
47
50
|
end
|
48
51
|
|
49
|
-
def
|
50
|
-
resources.each { |resource|
|
52
|
+
def include_resources(resources)
|
53
|
+
resources.each { |resource| include_resource(resource) }
|
51
54
|
end
|
52
55
|
end
|
53
56
|
end
|
@@ -4,8 +4,8 @@ module Ivy
|
|
4
4
|
module Serializers
|
5
5
|
module Documents
|
6
6
|
class IndividualResource < Document
|
7
|
-
def
|
8
|
-
@serializer.
|
7
|
+
def generate_included(generator)
|
8
|
+
@serializer.relationships(self, @primary_resource)
|
9
9
|
super
|
10
10
|
end
|
11
11
|
|
@@ -4,8 +4,8 @@ module Ivy
|
|
4
4
|
module Serializers
|
5
5
|
module Documents
|
6
6
|
class ResourceCollection < Document
|
7
|
-
def
|
8
|
-
@primary_resource.each { |resource| @serializer.
|
7
|
+
def generate_included(generator)
|
8
|
+
@primary_resource.each { |resource| @serializer.relationships(self, resource) }
|
9
9
|
super
|
10
10
|
end
|
11
11
|
|
@@ -29,10 +29,6 @@ module Ivy
|
|
29
29
|
super(singularize(primary_resource_name).to_sym, primary_resource)
|
30
30
|
end
|
31
31
|
|
32
|
-
def primary_resources(primary_resources_name, primary_resources)
|
33
|
-
super(primary_resources_name, primary_resources)
|
34
|
-
end
|
35
|
-
|
36
32
|
private
|
37
33
|
|
38
34
|
def polymorphic_resource(resource)
|
@@ -19,13 +19,17 @@ module Ivy
|
|
19
19
|
@hash_gen.store(key, value)
|
20
20
|
end
|
21
21
|
|
22
|
+
def attributes(resource)
|
23
|
+
@document.generate_attributes(self, resource)
|
24
|
+
end
|
25
|
+
|
22
26
|
def belongs_to(name, resource, options={})
|
23
27
|
id(name, resource)
|
24
28
|
end
|
25
29
|
|
26
30
|
def document(document)
|
27
31
|
document.generate_primary_resource(self)
|
28
|
-
document.
|
32
|
+
document.generate_included(self)
|
29
33
|
end
|
30
34
|
|
31
35
|
def has_many(name, resources, options={})
|
@@ -40,19 +44,15 @@ module Ivy
|
|
40
44
|
attribute(key, resources.map { |resource| extract_id(resource) })
|
41
45
|
end
|
42
46
|
|
43
|
-
def
|
44
|
-
document.
|
47
|
+
def included(document)
|
48
|
+
document.generate_included_resources(self)
|
45
49
|
end
|
46
50
|
|
47
|
-
def
|
51
|
+
def included_resources(resource_class, resources)
|
48
52
|
key = key_for_collection(resource_class).to_sym
|
49
53
|
@hash_gen.store_array(key) { resources(resources) }
|
50
54
|
end
|
51
55
|
|
52
|
-
def links(resource)
|
53
|
-
@document.generate_links(self, resource)
|
54
|
-
end
|
55
|
-
|
56
56
|
def primary_resource(primary_resource_name, primary_resource)
|
57
57
|
@hash_gen.store_object(primary_resource_name) { resource(primary_resource) }
|
58
58
|
end
|
@@ -61,7 +61,12 @@ module Ivy
|
|
61
61
|
@hash_gen.store_array(primary_resources_name) { resources(primary_resources) }
|
62
62
|
end
|
63
63
|
|
64
|
+
def relationships(resource)
|
65
|
+
@document.generate_relationships(self, resource)
|
66
|
+
end
|
67
|
+
|
64
68
|
def resource(resource)
|
69
|
+
id(:id, resource)
|
65
70
|
@document.generate_resource(self, resource)
|
66
71
|
end
|
67
72
|
|
@@ -76,11 +81,11 @@ module Ivy
|
|
76
81
|
private
|
77
82
|
|
78
83
|
def extract_id(resource)
|
79
|
-
resource.id
|
84
|
+
resource.id if resource
|
80
85
|
end
|
81
86
|
|
82
87
|
def extract_type(resource)
|
83
|
-
ActiveSupport::Inflector.dasherize(
|
88
|
+
ActiveSupport::Inflector.dasherize(key_for_individual(resource.class))
|
84
89
|
end
|
85
90
|
|
86
91
|
def key_for_collection(resource_class)
|
@@ -4,27 +4,26 @@ module Ivy
|
|
4
4
|
module Serializers
|
5
5
|
module Formats
|
6
6
|
class JSONAPI < JSON
|
7
|
-
def
|
8
|
-
|
9
|
-
super
|
7
|
+
def attributes(resource)
|
8
|
+
@hash_gen.store_object(:attributes) { super }
|
10
9
|
end
|
11
10
|
|
12
11
|
def belongs_to(name, resource, options={})
|
13
|
-
|
12
|
+
if resource
|
13
|
+
@hash_gen.store_object(name) { linkage(resource) }
|
14
|
+
else
|
15
|
+
@hash_gen.store(name, nil)
|
16
|
+
end
|
14
17
|
end
|
15
18
|
|
16
19
|
def has_many(name, resources, options={})
|
17
20
|
@hash_gen.store_object(name) { linkages(resources) }
|
18
21
|
end
|
19
22
|
|
20
|
-
def
|
23
|
+
def included(document)
|
21
24
|
@hash_gen.store_object(:included) { super }
|
22
25
|
end
|
23
26
|
|
24
|
-
def links(document)
|
25
|
-
@hash_gen.store_object(:links) { super }
|
26
|
-
end
|
27
|
-
|
28
27
|
def primary_resource(primary_resource_name, primary_resource)
|
29
28
|
super(:data, primary_resource)
|
30
29
|
end
|
@@ -33,6 +32,10 @@ module Ivy
|
|
33
32
|
super(:data, primary_resources)
|
34
33
|
end
|
35
34
|
|
35
|
+
def relationships(document)
|
36
|
+
@hash_gen.store_object(:relationships) { super }
|
37
|
+
end
|
38
|
+
|
36
39
|
def resource(resource)
|
37
40
|
super
|
38
41
|
type(:type, resource)
|
@@ -49,7 +52,7 @@ module Ivy
|
|
49
52
|
end
|
50
53
|
|
51
54
|
def linkage(resource)
|
52
|
-
@hash_gen.store_object(:
|
55
|
+
@hash_gen.store_object(:data) { linkage_object(resource) }
|
53
56
|
end
|
54
57
|
|
55
58
|
def linkage_object(resource)
|
@@ -58,7 +61,7 @@ module Ivy
|
|
58
61
|
end
|
59
62
|
|
60
63
|
def linkages(resources)
|
61
|
-
@hash_gen.store_array(:
|
64
|
+
@hash_gen.store_array(:data) { linkage_objects(resources) }
|
62
65
|
end
|
63
66
|
|
64
67
|
def linkage_objects(resources)
|
@@ -6,10 +6,8 @@ module Ivy
|
|
6
6
|
class Mapping
|
7
7
|
def initialize(klass)
|
8
8
|
@attrs = {}
|
9
|
-
@
|
9
|
+
@relationships = {}
|
10
10
|
@klass = klass
|
11
|
-
|
12
|
-
attribute(:id)
|
13
11
|
end
|
14
12
|
|
15
13
|
def attribute(name, &block)
|
@@ -21,19 +19,24 @@ module Ivy
|
|
21
19
|
end
|
22
20
|
|
23
21
|
def belongs_to(name, options={}, &block)
|
24
|
-
@
|
22
|
+
@relationships[name] = Relationships::BelongsTo.new(name, options, &block)
|
23
|
+
end
|
24
|
+
|
25
|
+
def generate_attributes(generator, resource)
|
26
|
+
@attrs.each_value { |attr| attr.generate(generator, resource) }
|
25
27
|
end
|
26
28
|
|
27
29
|
def has_many(name, options={}, &block)
|
28
|
-
@
|
30
|
+
@relationships[name] = Relationships::HasMany.new(name, options, &block)
|
29
31
|
end
|
30
32
|
|
31
|
-
def
|
32
|
-
@
|
33
|
+
def relationships(generator, resource)
|
34
|
+
@relationships.each_value { |relationship| relationship.generate(generator, resource) }
|
33
35
|
end
|
34
36
|
|
35
37
|
def resource(generator, resource)
|
36
|
-
|
38
|
+
generator.attributes(resource) unless @attrs.empty?
|
39
|
+
generator.relationships(resource) unless @relationships.empty?
|
37
40
|
end
|
38
41
|
end
|
39
42
|
end
|
@@ -7,14 +7,18 @@ module Ivy
|
|
7
7
|
@mappings = Hash.new { |hash, klass| hash[klass] = new_mapping(klass) }
|
8
8
|
end
|
9
9
|
|
10
|
-
def
|
11
|
-
mapping_for(resource.class).
|
10
|
+
def attributes(generator, resource)
|
11
|
+
mapping_for(resource.class).generate_attributes(generator, resource)
|
12
12
|
end
|
13
13
|
|
14
14
|
def map(klass, &block)
|
15
15
|
mapping_for(klass).instance_eval(&block)
|
16
16
|
end
|
17
17
|
|
18
|
+
def relationships(generator, resource)
|
19
|
+
mapping_for(resource.class).relationships(generator, resource)
|
20
|
+
end
|
21
|
+
|
18
22
|
def resource(generator, resource)
|
19
23
|
mapping_for(resource.class).resource(generator, resource)
|
20
24
|
end
|
@@ -6,12 +6,16 @@ module Ivy
|
|
6
6
|
class << self
|
7
7
|
attr_accessor :_registry
|
8
8
|
|
9
|
+
def attributes(generator, resource)
|
10
|
+
_registry.attributes(generator, resource)
|
11
|
+
end
|
12
|
+
|
9
13
|
def inherited(base)
|
10
14
|
base._registry = Registry.new
|
11
15
|
end
|
12
16
|
|
13
|
-
def
|
14
|
-
_registry.
|
17
|
+
def relationships(generator, resource)
|
18
|
+
_registry.relationships(generator, resource)
|
15
19
|
end
|
16
20
|
|
17
21
|
def map(klass, &block)
|
@@ -23,8 +27,12 @@ module Ivy
|
|
23
27
|
end
|
24
28
|
end
|
25
29
|
|
26
|
-
def
|
27
|
-
self.class.
|
30
|
+
def attributes(generator, resource)
|
31
|
+
self.class.attributes(generator, resource)
|
32
|
+
end
|
33
|
+
|
34
|
+
def relationships(generator, resource)
|
35
|
+
self.class.relationships(generator, resource)
|
28
36
|
end
|
29
37
|
|
30
38
|
def resource(generator, resource)
|
@@ -87,6 +87,12 @@ RSpec.describe Ivy::Serializers::Formats::ActiveModelSerializers do
|
|
87
87
|
let(:resource) { post }
|
88
88
|
|
89
89
|
it { should eq(:post => {:author_id => 1, :id => 1}) }
|
90
|
+
|
91
|
+
context 'with no related resource' do
|
92
|
+
let(:author) { nil }
|
93
|
+
|
94
|
+
it { should eq(:post => {:author_id => nil, :id => 1}) }
|
95
|
+
end
|
90
96
|
end
|
91
97
|
|
92
98
|
context 'for a resource collection' do
|
@@ -107,6 +113,12 @@ RSpec.describe Ivy::Serializers::Formats::ActiveModelSerializers do
|
|
107
113
|
let(:resource) { post }
|
108
114
|
|
109
115
|
it { should eq(:post => {:id => 1, :user_id => 1}) }
|
116
|
+
|
117
|
+
context 'with no related resource' do
|
118
|
+
let(:author) { nil }
|
119
|
+
|
120
|
+
it { should eq(:post => {:id => 1, :user_id => nil}) }
|
121
|
+
end
|
110
122
|
end
|
111
123
|
|
112
124
|
context 'for a resource collection' do
|
@@ -130,6 +142,12 @@ RSpec.describe Ivy::Serializers::Formats::ActiveModelSerializers do
|
|
130
142
|
:authors => [{:id => 1}],
|
131
143
|
:post => {:author_id => 1, :id => 1}
|
132
144
|
) }
|
145
|
+
|
146
|
+
context 'with no related resource' do
|
147
|
+
let(:author) { nil }
|
148
|
+
|
149
|
+
it { should eq(:post => {:author_id => nil, :id => 1}) }
|
150
|
+
end
|
133
151
|
end
|
134
152
|
|
135
153
|
context 'for a resource collection' do
|
@@ -153,6 +171,12 @@ RSpec.describe Ivy::Serializers::Formats::ActiveModelSerializers do
|
|
153
171
|
let(:resource) { post }
|
154
172
|
|
155
173
|
it { should eq(:post => {:author => {:id => 1, :type => 'author'}, :id => 1}) }
|
174
|
+
|
175
|
+
context 'with no related resource' do
|
176
|
+
let(:author) { nil }
|
177
|
+
|
178
|
+
it { should eq(:post => {:author => nil, :id => 1}) }
|
179
|
+
end
|
156
180
|
end
|
157
181
|
|
158
182
|
context 'for a resource collection' do
|
@@ -19,8 +19,7 @@ RSpec.describe Ivy::Serializers::Formats::JSONAPI do
|
|
19
19
|
it { should eq({
|
20
20
|
:data => {
|
21
21
|
:type => 'post',
|
22
|
-
:id => '1'
|
23
|
-
:links => {}
|
22
|
+
:id => '1'
|
24
23
|
}
|
25
24
|
}) }
|
26
25
|
end
|
@@ -31,8 +30,7 @@ RSpec.describe Ivy::Serializers::Formats::JSONAPI do
|
|
31
30
|
it { should eq({
|
32
31
|
:data => [{
|
33
32
|
:type => 'post',
|
34
|
-
:id => '1'
|
35
|
-
:links => {}
|
33
|
+
:id => '1'
|
36
34
|
}]
|
37
35
|
}) }
|
38
36
|
end
|
@@ -56,8 +54,9 @@ RSpec.describe Ivy::Serializers::Formats::JSONAPI do
|
|
56
54
|
:data => {
|
57
55
|
:type => 'post',
|
58
56
|
:id => '1',
|
59
|
-
:
|
60
|
-
|
57
|
+
:attributes => {
|
58
|
+
:title => 'title'
|
59
|
+
}
|
61
60
|
}
|
62
61
|
}) }
|
63
62
|
end
|
@@ -69,8 +68,9 @@ RSpec.describe Ivy::Serializers::Formats::JSONAPI do
|
|
69
68
|
:data => [{
|
70
69
|
:type => 'post',
|
71
70
|
:id => '1',
|
72
|
-
:
|
73
|
-
|
71
|
+
:attributes => {
|
72
|
+
:title => 'title'
|
73
|
+
}
|
74
74
|
}]
|
75
75
|
}) }
|
76
76
|
end
|
@@ -90,8 +90,9 @@ RSpec.describe Ivy::Serializers::Formats::JSONAPI do
|
|
90
90
|
:data => {
|
91
91
|
:type => 'post',
|
92
92
|
:id => '1',
|
93
|
-
:
|
94
|
-
|
93
|
+
:attributes => {
|
94
|
+
:headline => 'title'
|
95
|
+
}
|
95
96
|
}
|
96
97
|
}) }
|
97
98
|
end
|
@@ -103,8 +104,9 @@ RSpec.describe Ivy::Serializers::Formats::JSONAPI do
|
|
103
104
|
:data => [{
|
104
105
|
:type => 'post',
|
105
106
|
:id => '1',
|
106
|
-
:
|
107
|
-
|
107
|
+
:attributes => {
|
108
|
+
:headline => 'title'
|
109
|
+
}
|
108
110
|
}]
|
109
111
|
}) }
|
110
112
|
end
|
@@ -131,13 +133,27 @@ RSpec.describe Ivy::Serializers::Formats::JSONAPI do
|
|
131
133
|
:data => {
|
132
134
|
:type => 'post',
|
133
135
|
:id => '1',
|
134
|
-
:
|
136
|
+
:relationships => {
|
135
137
|
:author => {
|
136
|
-
:
|
138
|
+
:data => {:id => '1', :type => 'author'}
|
137
139
|
}
|
138
140
|
}
|
139
141
|
}
|
140
142
|
}) }
|
143
|
+
|
144
|
+
context 'with no related resource' do
|
145
|
+
let(:author) { nil }
|
146
|
+
|
147
|
+
it { should eq({
|
148
|
+
:data => {
|
149
|
+
:type => 'post',
|
150
|
+
:id => '1',
|
151
|
+
:relationships => {
|
152
|
+
:author => nil
|
153
|
+
}
|
154
|
+
}
|
155
|
+
}) }
|
156
|
+
end
|
141
157
|
end
|
142
158
|
|
143
159
|
context 'for a resource collection' do
|
@@ -147,9 +163,9 @@ RSpec.describe Ivy::Serializers::Formats::JSONAPI do
|
|
147
163
|
:data => [{
|
148
164
|
:type => 'post',
|
149
165
|
:id => '1',
|
150
|
-
:
|
166
|
+
:relationships => {
|
151
167
|
:author => {
|
152
|
-
:
|
168
|
+
:data => {:id => '1', :type => 'author'}
|
153
169
|
}
|
154
170
|
}
|
155
171
|
}]
|
@@ -171,13 +187,27 @@ RSpec.describe Ivy::Serializers::Formats::JSONAPI do
|
|
171
187
|
:data => {
|
172
188
|
:type => 'post',
|
173
189
|
:id => '1',
|
174
|
-
:
|
190
|
+
:relationships => {
|
175
191
|
:user => {
|
176
|
-
:
|
192
|
+
:data => {:id => '1', :type => 'author'}
|
177
193
|
}
|
178
194
|
}
|
179
195
|
}
|
180
196
|
}) }
|
197
|
+
|
198
|
+
context 'with no related resource' do
|
199
|
+
let(:author) { nil }
|
200
|
+
|
201
|
+
it { should eq({
|
202
|
+
:data => {
|
203
|
+
:type => 'post',
|
204
|
+
:id => '1',
|
205
|
+
:relationships => {
|
206
|
+
:user => nil
|
207
|
+
}
|
208
|
+
}
|
209
|
+
}) }
|
210
|
+
end
|
181
211
|
end
|
182
212
|
|
183
213
|
context 'for a resource collection' do
|
@@ -187,9 +217,9 @@ RSpec.describe Ivy::Serializers::Formats::JSONAPI do
|
|
187
217
|
:data => [{
|
188
218
|
:type => 'post',
|
189
219
|
:id => '1',
|
190
|
-
:
|
220
|
+
:relationships => {
|
191
221
|
:user => {
|
192
|
-
:
|
222
|
+
:data => {:id => '1', :type => 'author'}
|
193
223
|
}
|
194
224
|
}
|
195
225
|
}]
|
@@ -211,9 +241,9 @@ RSpec.describe Ivy::Serializers::Formats::JSONAPI do
|
|
211
241
|
:data => {
|
212
242
|
:type => 'post',
|
213
243
|
:id => '1',
|
214
|
-
:
|
244
|
+
:relationships => {
|
215
245
|
:author => {
|
216
|
-
:
|
246
|
+
:data => {:id => '1', :type => 'author'}
|
217
247
|
}
|
218
248
|
}
|
219
249
|
},
|
@@ -221,11 +251,24 @@ RSpec.describe Ivy::Serializers::Formats::JSONAPI do
|
|
221
251
|
:included => {
|
222
252
|
:authors => [{
|
223
253
|
:id => '1',
|
224
|
-
:links => {},
|
225
254
|
:type => 'author'
|
226
255
|
}]
|
227
256
|
}
|
228
257
|
}) }
|
258
|
+
|
259
|
+
context 'with no related resource' do
|
260
|
+
let(:author) { nil }
|
261
|
+
|
262
|
+
it { should eq({
|
263
|
+
:data => {
|
264
|
+
:type => 'post',
|
265
|
+
:id => '1',
|
266
|
+
:relationships => {
|
267
|
+
:author => nil
|
268
|
+
}
|
269
|
+
}
|
270
|
+
}) }
|
271
|
+
end
|
229
272
|
end
|
230
273
|
|
231
274
|
context 'for a resource collection' do
|
@@ -235,9 +278,9 @@ RSpec.describe Ivy::Serializers::Formats::JSONAPI do
|
|
235
278
|
:data => [{
|
236
279
|
:type => 'post',
|
237
280
|
:id => '1',
|
238
|
-
:
|
281
|
+
:relationships => {
|
239
282
|
:author => {
|
240
|
-
:
|
283
|
+
:data => {:id => '1', :type => 'author'}
|
241
284
|
}
|
242
285
|
}
|
243
286
|
}],
|
@@ -245,7 +288,6 @@ RSpec.describe Ivy::Serializers::Formats::JSONAPI do
|
|
245
288
|
:included => {
|
246
289
|
:authors => [{
|
247
290
|
:id => '1',
|
248
|
-
:links => {},
|
249
291
|
:type => 'author'
|
250
292
|
}]
|
251
293
|
}
|
@@ -267,13 +309,27 @@ RSpec.describe Ivy::Serializers::Formats::JSONAPI do
|
|
267
309
|
:data => {
|
268
310
|
:type => 'post',
|
269
311
|
:id => '1',
|
270
|
-
:
|
312
|
+
:relationships => {
|
271
313
|
:author => {
|
272
|
-
:
|
314
|
+
:data => {:id => '1', :type => 'author'}
|
273
315
|
}
|
274
316
|
}
|
275
317
|
}
|
276
318
|
}) }
|
319
|
+
|
320
|
+
context 'with no related resource' do
|
321
|
+
let(:author) { nil }
|
322
|
+
|
323
|
+
it { should eq({
|
324
|
+
:data => {
|
325
|
+
:type => 'post',
|
326
|
+
:id => '1',
|
327
|
+
:relationships => {
|
328
|
+
:author => nil
|
329
|
+
}
|
330
|
+
}
|
331
|
+
}) }
|
332
|
+
end
|
277
333
|
end
|
278
334
|
|
279
335
|
context 'for a resource collection' do
|
@@ -283,9 +339,9 @@ RSpec.describe Ivy::Serializers::Formats::JSONAPI do
|
|
283
339
|
:data => [{
|
284
340
|
:type => 'post',
|
285
341
|
:id => '1',
|
286
|
-
:
|
342
|
+
:relationships => {
|
287
343
|
:author => {
|
288
|
-
:
|
344
|
+
:data => {:id => '1', :type => 'author'}
|
289
345
|
}
|
290
346
|
}
|
291
347
|
}]
|
@@ -314,9 +370,9 @@ RSpec.describe Ivy::Serializers::Formats::JSONAPI do
|
|
314
370
|
:data => {
|
315
371
|
:type => 'post',
|
316
372
|
:id => '1',
|
317
|
-
:
|
373
|
+
:relationships => {
|
318
374
|
:comments => {
|
319
|
-
:
|
375
|
+
:data => [{:id => '1', :type => 'comment'}]
|
320
376
|
}
|
321
377
|
}
|
322
378
|
}
|
@@ -330,9 +386,9 @@ RSpec.describe Ivy::Serializers::Formats::JSONAPI do
|
|
330
386
|
:data => [{
|
331
387
|
:type => 'post',
|
332
388
|
:id => '1',
|
333
|
-
:
|
389
|
+
:relationships => {
|
334
390
|
:comments => {
|
335
|
-
:
|
391
|
+
:data => [{:id => '1', :type => 'comment'}]
|
336
392
|
}
|
337
393
|
}
|
338
394
|
}]
|
@@ -354,9 +410,9 @@ RSpec.describe Ivy::Serializers::Formats::JSONAPI do
|
|
354
410
|
:data => {
|
355
411
|
:type => 'post',
|
356
412
|
:id => '1',
|
357
|
-
:
|
413
|
+
:relationships => {
|
358
414
|
:replies => {
|
359
|
-
:
|
415
|
+
:data => [{:id => '1', :type => 'comment'}]
|
360
416
|
}
|
361
417
|
}
|
362
418
|
}
|
@@ -370,9 +426,9 @@ RSpec.describe Ivy::Serializers::Formats::JSONAPI do
|
|
370
426
|
:data => [{
|
371
427
|
:type => 'post',
|
372
428
|
:id => '1',
|
373
|
-
:
|
429
|
+
:relationships => {
|
374
430
|
:replies => {
|
375
|
-
:
|
431
|
+
:data => [{:id => '1', :type => 'comment'}]
|
376
432
|
}
|
377
433
|
}
|
378
434
|
}]
|
@@ -394,9 +450,9 @@ RSpec.describe Ivy::Serializers::Formats::JSONAPI do
|
|
394
450
|
:data => {
|
395
451
|
:type => 'post',
|
396
452
|
:id => '1',
|
397
|
-
:
|
453
|
+
:relationships => {
|
398
454
|
:comments => {
|
399
|
-
:
|
455
|
+
:data => [{:id => '1', :type => 'comment'}]
|
400
456
|
}
|
401
457
|
}
|
402
458
|
},
|
@@ -404,8 +460,7 @@ RSpec.describe Ivy::Serializers::Formats::JSONAPI do
|
|
404
460
|
:included => {
|
405
461
|
:comments => [{
|
406
462
|
:type => 'comment',
|
407
|
-
:id => '1'
|
408
|
-
:links => {}
|
463
|
+
:id => '1'
|
409
464
|
}]
|
410
465
|
}
|
411
466
|
}) }
|
@@ -418,9 +473,9 @@ RSpec.describe Ivy::Serializers::Formats::JSONAPI do
|
|
418
473
|
:data => [{
|
419
474
|
:type => 'post',
|
420
475
|
:id => '1',
|
421
|
-
:
|
476
|
+
:relationships => {
|
422
477
|
:comments => {
|
423
|
-
:
|
478
|
+
:data => [{:id => '1', :type => 'comment'}]
|
424
479
|
}
|
425
480
|
}
|
426
481
|
}],
|
@@ -428,8 +483,7 @@ RSpec.describe Ivy::Serializers::Formats::JSONAPI do
|
|
428
483
|
:included => {
|
429
484
|
:comments => [{
|
430
485
|
:type => 'comment',
|
431
|
-
:id => '1'
|
432
|
-
:links => {}
|
486
|
+
:id => '1'
|
433
487
|
}]
|
434
488
|
}
|
435
489
|
}) }
|
@@ -450,9 +504,9 @@ RSpec.describe Ivy::Serializers::Formats::JSONAPI do
|
|
450
504
|
:data => {
|
451
505
|
:type => 'post',
|
452
506
|
:id => '1',
|
453
|
-
:
|
507
|
+
:relationships => {
|
454
508
|
:comments => {
|
455
|
-
:
|
509
|
+
:data => [{:id => '1', :type => 'comment'}]
|
456
510
|
}
|
457
511
|
}
|
458
512
|
}
|
@@ -466,9 +520,9 @@ RSpec.describe Ivy::Serializers::Formats::JSONAPI do
|
|
466
520
|
:data => [{
|
467
521
|
:type => 'post',
|
468
522
|
:id => '1',
|
469
|
-
:
|
523
|
+
:relationships => {
|
470
524
|
:comments => {
|
471
|
-
:
|
525
|
+
:data => [{:id => '1', :type => 'comment'}]
|
472
526
|
}
|
473
527
|
}
|
474
528
|
}]
|
@@ -0,0 +1,283 @@
|
|
1
|
+
require 'ivy/serializers'
|
2
|
+
|
3
|
+
RSpec.describe Ivy::Serializers::Formats::JSON do
|
4
|
+
let(:format) { described_class.new(document) }
|
5
|
+
|
6
|
+
describe '#as_json' do
|
7
|
+
let(:registry) { Ivy::Serializers::Registry.new }
|
8
|
+
let(:document) { Ivy::Serializers::Documents.create(registry, :posts, resource) }
|
9
|
+
|
10
|
+
subject { format.as_json }
|
11
|
+
|
12
|
+
context 'with default mapping' do
|
13
|
+
let(:post) { double('post', :id => 1) }
|
14
|
+
|
15
|
+
context 'for an individual resource' do
|
16
|
+
let(:resource) { post }
|
17
|
+
|
18
|
+
it { should eq(:posts => {:id => 1}) }
|
19
|
+
end
|
20
|
+
|
21
|
+
context 'for a resource collection' do
|
22
|
+
let(:resource) { [post] }
|
23
|
+
|
24
|
+
it { should eq(:posts => [{:id => 1}]) }
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
context 'with an attribute' do
|
29
|
+
let(:post_class) { double('Post') }
|
30
|
+
let(:post) { double('post', :class => post_class, :id => 1, :title => 'title') }
|
31
|
+
|
32
|
+
context 'with default options' do
|
33
|
+
before do
|
34
|
+
registry.map post_class do
|
35
|
+
attribute :title
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
context 'for an individual resource' do
|
40
|
+
let(:resource) { post }
|
41
|
+
|
42
|
+
it { should eq(:posts => {:id => 1, :title => 'title'}) }
|
43
|
+
end
|
44
|
+
|
45
|
+
context 'for a resource collection' do
|
46
|
+
let(:resource) { [post] }
|
47
|
+
|
48
|
+
it { should eq(:posts => [{:id => 1, :title => 'title'}]) }
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
context 'with a block provided' do
|
53
|
+
before do
|
54
|
+
registry.map post_class do
|
55
|
+
attribute(:headline) { |post| post.title }
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
context 'for an individual resource' do
|
60
|
+
let(:resource) { post }
|
61
|
+
|
62
|
+
it { should eq(:posts => {:id => 1, :headline => 'title'}) }
|
63
|
+
end
|
64
|
+
|
65
|
+
context 'for a resource collection' do
|
66
|
+
let(:resource) { [post] }
|
67
|
+
|
68
|
+
it { should eq(:posts => [{:id => 1, :headline => 'title'}]) }
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
context 'with a belongs_to relationship' do
|
74
|
+
let(:author_class) { double('Author', :name => 'Author') }
|
75
|
+
let(:author) { double('author', :class => author_class, :id => 1) }
|
76
|
+
let(:post_class) { double('Post') }
|
77
|
+
let(:post) { double('post', :author => author, :class => post_class, :id => 1) }
|
78
|
+
|
79
|
+
context 'with default options' do
|
80
|
+
before do
|
81
|
+
registry.map post_class do
|
82
|
+
belongs_to :author
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
context 'for an individual resource' do
|
87
|
+
let(:resource) { post }
|
88
|
+
|
89
|
+
it { should eq(:posts => {:author => 1, :id => 1}) }
|
90
|
+
|
91
|
+
context 'with no related resource' do
|
92
|
+
let(:author) { nil }
|
93
|
+
|
94
|
+
it { should eq(:posts => {:author => nil, :id => 1}) }
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
context 'for a resource collection' do
|
99
|
+
let(:resource) { [post] }
|
100
|
+
|
101
|
+
it { should eq(:posts => [{:author => 1, :id => 1}]) }
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
context 'with a block provided' do
|
106
|
+
before do
|
107
|
+
registry.map post_class do
|
108
|
+
belongs_to(:user) { |post| post.author }
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
context 'for an individual resource' do
|
113
|
+
let(:resource) { post }
|
114
|
+
|
115
|
+
it { should eq(:posts => {:id => 1, :user => 1}) }
|
116
|
+
|
117
|
+
context 'with no related resource' do
|
118
|
+
let(:author) { nil }
|
119
|
+
|
120
|
+
it { should eq(:posts => {:id => 1, :user => nil}) }
|
121
|
+
end
|
122
|
+
end
|
123
|
+
|
124
|
+
context 'for a resource collection' do
|
125
|
+
let(:resource) { [post] }
|
126
|
+
|
127
|
+
it { should eq(:posts => [{:id => 1, :user => 1}]) }
|
128
|
+
end
|
129
|
+
end
|
130
|
+
|
131
|
+
context 'with the :embed_in_root option' do
|
132
|
+
before do
|
133
|
+
registry.map post_class do
|
134
|
+
belongs_to :author, :embed_in_root => true
|
135
|
+
end
|
136
|
+
end
|
137
|
+
|
138
|
+
context 'for an individual resource' do
|
139
|
+
let(:resource) { post }
|
140
|
+
|
141
|
+
it { should eq(
|
142
|
+
:authors => [{:id => 1}],
|
143
|
+
:posts => {:author => 1, :id => 1}
|
144
|
+
) }
|
145
|
+
|
146
|
+
context 'with no related resource' do
|
147
|
+
let(:author) { nil }
|
148
|
+
|
149
|
+
it { should eq(:posts => {:author => nil, :id => 1}) }
|
150
|
+
end
|
151
|
+
end
|
152
|
+
|
153
|
+
context 'for a resource collection' do
|
154
|
+
let(:resource) { [post] }
|
155
|
+
|
156
|
+
it { should eq(
|
157
|
+
:authors => [{:id => 1}],
|
158
|
+
:posts => [{:author => 1, :id => 1}]
|
159
|
+
) }
|
160
|
+
end
|
161
|
+
end
|
162
|
+
|
163
|
+
context 'with the :polymorphic option' do
|
164
|
+
before do
|
165
|
+
registry.map post_class do
|
166
|
+
belongs_to :author, :polymorphic => true
|
167
|
+
end
|
168
|
+
end
|
169
|
+
|
170
|
+
context 'for an individual resource' do
|
171
|
+
let(:resource) { post }
|
172
|
+
|
173
|
+
it { should eq(:posts => {:author => 1, :id => 1}) }
|
174
|
+
|
175
|
+
context 'with no related resource' do
|
176
|
+
let(:author) { nil }
|
177
|
+
|
178
|
+
it { should eq(:posts => {:author => nil, :id => 1}) }
|
179
|
+
end
|
180
|
+
end
|
181
|
+
|
182
|
+
context 'for a resource collection' do
|
183
|
+
let(:resource) { [post] }
|
184
|
+
|
185
|
+
it { should eq(:posts => [{:author => 1, :id => 1}]) }
|
186
|
+
end
|
187
|
+
end
|
188
|
+
end
|
189
|
+
|
190
|
+
context 'with a has_many relationship' do
|
191
|
+
let(:comment_class) { double('Comment', :name => 'Comment') }
|
192
|
+
let(:comment) { double('comment', :class => comment_class, :id => 1) }
|
193
|
+
let(:post_class) { double('Post') }
|
194
|
+
let(:post) { double('post', :class => post_class, :comments => [comment], :id => 1) }
|
195
|
+
|
196
|
+
context 'with default options' do
|
197
|
+
before do
|
198
|
+
registry.map post_class do
|
199
|
+
has_many :comments
|
200
|
+
end
|
201
|
+
end
|
202
|
+
|
203
|
+
context 'for an individual resource' do
|
204
|
+
let(:resource) { post }
|
205
|
+
|
206
|
+
it { should eq(:posts => {:comments => [1], :id => 1}) }
|
207
|
+
end
|
208
|
+
|
209
|
+
context 'for a resource collection' do
|
210
|
+
let(:resource) { [post] }
|
211
|
+
|
212
|
+
it { should eq(:posts => [{:comments => [1], :id => 1}]) }
|
213
|
+
end
|
214
|
+
end
|
215
|
+
|
216
|
+
context 'with a block provided' do
|
217
|
+
before do
|
218
|
+
registry.map post_class do
|
219
|
+
has_many(:replies) { |post| post.comments }
|
220
|
+
end
|
221
|
+
end
|
222
|
+
|
223
|
+
context 'for an individual resource' do
|
224
|
+
let(:resource) { post }
|
225
|
+
|
226
|
+
it { should eq(:posts => {:id => 1, :replies => [1]}) }
|
227
|
+
end
|
228
|
+
|
229
|
+
context 'for a resource collection' do
|
230
|
+
let(:resource) { [post] }
|
231
|
+
|
232
|
+
it { should eq(:posts => [{:id => 1, :replies => [1]}]) }
|
233
|
+
end
|
234
|
+
end
|
235
|
+
|
236
|
+
context 'with the :embed_in_root option' do
|
237
|
+
before do
|
238
|
+
registry.map post_class do
|
239
|
+
has_many :comments, :embed_in_root => true
|
240
|
+
end
|
241
|
+
end
|
242
|
+
|
243
|
+
context 'for an individual resource' do
|
244
|
+
let(:resource) { post }
|
245
|
+
|
246
|
+
it { should eq(
|
247
|
+
:comments => [{:id => 1}],
|
248
|
+
:posts => {:comments => [1], :id => 1}
|
249
|
+
) }
|
250
|
+
end
|
251
|
+
|
252
|
+
context 'for a resource collection' do
|
253
|
+
let(:resource) { [post] }
|
254
|
+
|
255
|
+
it { should eq(
|
256
|
+
:comments => [{:id => 1}],
|
257
|
+
:posts => [{:comments => [1], :id => 1}]
|
258
|
+
) }
|
259
|
+
end
|
260
|
+
end
|
261
|
+
|
262
|
+
context 'with the :polymorphic option' do
|
263
|
+
before do
|
264
|
+
registry.map post_class do
|
265
|
+
has_many :comments, :polymorphic => true
|
266
|
+
end
|
267
|
+
end
|
268
|
+
|
269
|
+
context 'for an individual resource' do
|
270
|
+
let(:resource) { post }
|
271
|
+
|
272
|
+
it { should eq(:posts => {:comments => [1], :id => 1}) }
|
273
|
+
end
|
274
|
+
|
275
|
+
context 'for a resource collection' do
|
276
|
+
let(:resource) { [post] }
|
277
|
+
|
278
|
+
it { should eq(:posts => [{:comments => [1], :id => 1}]) }
|
279
|
+
end
|
280
|
+
end
|
281
|
+
end
|
282
|
+
end
|
283
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ivy-serializers
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Dray Lacy
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-06-05 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -130,6 +130,7 @@ files:
|
|
130
130
|
- lib/ivy/serializers/version.rb
|
131
131
|
- spec/integration/formats/active_model_serializers_spec.rb
|
132
132
|
- spec/integration/formats/json_api_spec.rb
|
133
|
+
- spec/integration/formats/json_spec.rb
|
133
134
|
- spec/integration/serializer_spec.rb
|
134
135
|
- spec/spec_helper.rb
|
135
136
|
homepage: ''
|
@@ -159,5 +160,6 @@ summary: JSON serialization for client-side apps.
|
|
159
160
|
test_files:
|
160
161
|
- spec/integration/formats/active_model_serializers_spec.rb
|
161
162
|
- spec/integration/formats/json_api_spec.rb
|
163
|
+
- spec/integration/formats/json_spec.rb
|
162
164
|
- spec/integration/serializer_spec.rb
|
163
165
|
- spec/spec_helper.rb
|