collection_json_serializer 0.3.0 → 0.3.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +8 -2
- data/lib/collection_json_serializer.rb +1 -1
- data/lib/collection_json_serializer/core_ext/hash.rb +7 -0
- data/lib/collection_json_serializer/objects/query.rb +8 -1
- data/lib/collection_json_serializer/serializer.rb +14 -0
- data/lib/collection_json_serializer/spec.rb +50 -0
- data/lib/collection_json_serializer/validator.rb +95 -16
- data/lib/collection_json_serializer/version.rb +1 -1
- data/test/builder/builder_test.rb +0 -19
- data/test/extensions/open_attrs_test.rb +118 -0
- data/test/minitest_helper.rb +1 -0
- data/test/objects/item_test.rb +0 -32
- data/test/serializer/dsl_test.rb +28 -0
- data/test/serializer/items/attributes_test.rb +0 -13
- data/test/serializer/links_test.rb +0 -12
- data/test/serializer/serializer_test.rb +24 -0
- data/test/serializer/spec_test.rb +70 -0
- data/test/serializer/template_test.rb +0 -14
- data/test/validator/invalid_test.rb +1 -4
- metadata +11 -4
- data/test/serializer/items_test.rb +0 -24
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 120a86d520ebce948248bd32a6c3e894ff46661c
|
4
|
+
data.tar.gz: 7cd6a7fadbc9b783e3da6c95e95e1bedcb079e50
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 15949ebd3af294d4f58fda0b7779f77ef70b88ef269c2bdabc035c5c5f0c88c9ffa01282765cd1dfcb7d0f5152605c9c3d4f115afa7ce8ac42a92403dd7ae690
|
7
|
+
data.tar.gz: 2295bf1900c61c5b1f5691bb0d18b4e689c80db69e2dbd5e461971299edb2af7a88c0006e74fe2f8f3d0a7412862b5b8b0c804d19a3e47a0f9ca90e07358cac1
|
data/README.md
CHANGED
@@ -149,17 +149,23 @@ Please, notice that placeholders can _only_ be used within the `items` block.
|
|
149
149
|
|
150
150
|
#### Open Attributes Policy
|
151
151
|
|
152
|
-
Collection+JSON
|
152
|
+
Collection+JSON Serializer introduces an __open attributes policy__, which means that objects' attributes can be extended at will. This makes it easy to add custom extensions to suit your particular needs. Be aware that, [as the specs say](https://github.com/collection-json/spec#7-extensibility), you must only extend attributes in a way that won't break clients that are not aware of them.
|
153
|
+
|
154
|
+
In order to use the Open Attributes policy, it must be declared as an extension.
|
153
155
|
|
154
156
|
```ruby
|
155
157
|
class UserSerializer < CollectionJson::Serializer
|
158
|
+
# Add Open Attrs as an extension
|
159
|
+
extensions :open_attrs
|
160
|
+
|
161
|
+
# Now you can use your crazy properties everywhere
|
156
162
|
items do
|
157
163
|
attributes :id, name: { css_class: "people" }
|
158
164
|
end
|
159
165
|
|
160
166
|
template name: { regex: "/\A[a-zA-Z0-9_]*\z/" }
|
161
167
|
|
162
|
-
links profile: {
|
168
|
+
links profile: { on_click: "reboot_universe" }
|
163
169
|
end
|
164
170
|
```
|
165
171
|
|
@@ -7,7 +7,7 @@ require "collection_json_serializer/support"
|
|
7
7
|
|
8
8
|
require "collection_json_serializer/serializer"
|
9
9
|
require "collection_json_serializer/items"
|
10
|
-
|
10
|
+
require "collection_json_serializer/spec"
|
11
11
|
require "collection_json_serializer/builder"
|
12
12
|
|
13
13
|
require "collection_json_serializer/validator"
|
@@ -1,4 +1,11 @@
|
|
1
1
|
class Hash
|
2
|
+
# Extract params
|
3
|
+
# Returns a two-key hash where the first key is :name and the second is
|
4
|
+
# :properties, being the latter a hash itself.
|
5
|
+
#
|
6
|
+
# hash = { hi: { prompt: "My prompt", value: "Hello!" } }
|
7
|
+
# hash.extract_params
|
8
|
+
# => { name: "hi", properties: { prompt: "My prompt", value: "Hello!" } }
|
2
9
|
def extract_params
|
3
10
|
params = {}
|
4
11
|
params[:name] = keys.first
|
@@ -19,6 +19,10 @@ module CollectionJson
|
|
19
19
|
@query[:prompt] = @resource[:prompt] if @resource[:prompt]
|
20
20
|
@query[:data] = add_data if @resource[:data]
|
21
21
|
|
22
|
+
if @serializer.uses?(:open_attrs)
|
23
|
+
@resource.each { |k, v| @query[k] = v unless @query.key?(k) }
|
24
|
+
end
|
25
|
+
|
22
26
|
@query
|
23
27
|
end
|
24
28
|
|
@@ -30,7 +34,10 @@ module CollectionJson
|
|
30
34
|
|
31
35
|
def add_data
|
32
36
|
@resource[:data].each_with_object([]) do |attr, data|
|
33
|
-
|
37
|
+
h = Hash.new
|
38
|
+
attr.keys.each { |k| h[k] = attr[k] }
|
39
|
+
h[:value] = nil.to_s unless h[:value]
|
40
|
+
data << h
|
34
41
|
end
|
35
42
|
end
|
36
43
|
|
@@ -1,6 +1,7 @@
|
|
1
1
|
module CollectionJson
|
2
2
|
class Serializer
|
3
3
|
class << self
|
4
|
+
attr_accessor :extensions
|
4
5
|
attr_accessor :href
|
5
6
|
attr_accessor :template
|
6
7
|
attr_accessor :links
|
@@ -9,12 +10,17 @@ module CollectionJson
|
|
9
10
|
end
|
10
11
|
|
11
12
|
def self.inherited(base)
|
13
|
+
base.extensions = []
|
12
14
|
base.href = []
|
13
15
|
base.template = []
|
14
16
|
base.links = []
|
15
17
|
base.queries = []
|
16
18
|
end
|
17
19
|
|
20
|
+
def self.extensions(*attrs)
|
21
|
+
@extensions.concat attrs
|
22
|
+
end
|
23
|
+
|
18
24
|
def self.href(*attrs)
|
19
25
|
@href.concat attrs
|
20
26
|
end
|
@@ -46,6 +52,10 @@ module CollectionJson
|
|
46
52
|
end
|
47
53
|
end
|
48
54
|
|
55
|
+
def extensions
|
56
|
+
self.class.extensions
|
57
|
+
end
|
58
|
+
|
49
59
|
def href
|
50
60
|
self.class.href.first
|
51
61
|
end
|
@@ -82,6 +92,10 @@ module CollectionJson
|
|
82
92
|
self.class._items.present?
|
83
93
|
end
|
84
94
|
|
95
|
+
def uses?(extension)
|
96
|
+
extensions.include?(extension)
|
97
|
+
end
|
98
|
+
|
85
99
|
def invalid?
|
86
100
|
Validator.new(self).invalid?
|
87
101
|
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
module CollectionJson
|
2
|
+
module Spec
|
3
|
+
DEFINITION = {
|
4
|
+
href: {},
|
5
|
+
links: {
|
6
|
+
href: {},
|
7
|
+
rel: {},
|
8
|
+
name: {},
|
9
|
+
prompt: {},
|
10
|
+
render: {}
|
11
|
+
},
|
12
|
+
items: {
|
13
|
+
href: {},
|
14
|
+
data: {
|
15
|
+
name: {},
|
16
|
+
value: {},
|
17
|
+
prompt: {}
|
18
|
+
},
|
19
|
+
links: {
|
20
|
+
href: {},
|
21
|
+
rel: {},
|
22
|
+
name: {},
|
23
|
+
prompt: {},
|
24
|
+
remder: {}
|
25
|
+
}
|
26
|
+
},
|
27
|
+
template: {
|
28
|
+
name: {},
|
29
|
+
value: {},
|
30
|
+
prompt: {}
|
31
|
+
},
|
32
|
+
queries: {
|
33
|
+
href: {},
|
34
|
+
rel: {},
|
35
|
+
name: {},
|
36
|
+
prompt: {},
|
37
|
+
data: {
|
38
|
+
name: {},
|
39
|
+
value: {}
|
40
|
+
}
|
41
|
+
},
|
42
|
+
error: {
|
43
|
+
title: {},
|
44
|
+
code: {},
|
45
|
+
message: {}
|
46
|
+
}
|
47
|
+
}
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
@@ -23,7 +23,7 @@ module CollectionJson
|
|
23
23
|
|
24
24
|
def validate
|
25
25
|
[
|
26
|
-
:
|
26
|
+
:items,
|
27
27
|
:href,
|
28
28
|
:links,
|
29
29
|
:template,
|
@@ -31,24 +31,58 @@ module CollectionJson
|
|
31
31
|
].each { |m| send("validate_#{m}") }
|
32
32
|
end
|
33
33
|
|
34
|
-
def
|
34
|
+
def validate_items
|
35
|
+
validate_items_attributes if attributes?
|
36
|
+
validate_items_links if links?
|
37
|
+
end
|
38
|
+
|
39
|
+
def validate_items_attributes
|
35
40
|
@serializer.items.attributes.each do |attr|
|
36
41
|
params = attr.extract_params
|
42
|
+
validate_attributes_values(@serializer.resources, params)
|
43
|
+
validate_attributes_properties(params) if params[:properties]
|
44
|
+
end if @serializer.items? && @serializer.items.attributes?
|
45
|
+
end
|
37
46
|
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
47
|
+
def validate_attributes_values(resources, params)
|
48
|
+
resources.each do |resource|
|
49
|
+
val = extract_value_from(resource, params[:name])
|
50
|
+
if value_is_invalid?(val)
|
51
|
+
error_for :value, root: :attributes, path: [params[:name]]
|
43
52
|
end
|
53
|
+
end
|
54
|
+
end
|
44
55
|
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
56
|
+
def validate_attributes_properties(params)
|
57
|
+
params[:properties].each do |key, value|
|
58
|
+
unless definition[:items][:data].keys.include?(key.to_sym)
|
59
|
+
error_for(
|
60
|
+
:unknown_attribute,
|
61
|
+
root: :attributes,
|
62
|
+
path: [params[:name], key]
|
63
|
+
)
|
64
|
+
next
|
65
|
+
end unless @serializer.uses?(:open_attrs)
|
66
|
+
|
67
|
+
if value_is_invalid?(value)
|
68
|
+
error_for :value, root: :attributes, path: [params[:name], key]
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
50
72
|
|
51
|
-
|
73
|
+
def validate_items_links
|
74
|
+
@serializer.items.links.each do |attr|
|
75
|
+
params = attr.extract_params
|
76
|
+
params[:properties].keys.each do |key|
|
77
|
+
unless definition[:items][:links].keys.include?(key.to_sym)
|
78
|
+
error_for(
|
79
|
+
:unknown_attribute,
|
80
|
+
root: :items,
|
81
|
+
path: [:links, params[:name], key]
|
82
|
+
)
|
83
|
+
end unless @serializer.uses?(:open_attrs)
|
84
|
+
end
|
85
|
+
end
|
52
86
|
end
|
53
87
|
|
54
88
|
def validate_href
|
@@ -72,6 +106,11 @@ module CollectionJson
|
|
72
106
|
end
|
73
107
|
|
74
108
|
link.each do |key, value|
|
109
|
+
unless definition[:links].keys.include?(key.to_sym)
|
110
|
+
error_for :unknown_attribute, root: :links, path: [key]
|
111
|
+
next
|
112
|
+
end unless @serializer.uses?(:open_attrs)
|
113
|
+
|
75
114
|
case key
|
76
115
|
when :href
|
77
116
|
if url_is_invalid? link[:href]
|
@@ -91,7 +130,16 @@ module CollectionJson
|
|
91
130
|
params = attr.extract_params
|
92
131
|
|
93
132
|
params[:properties].each do |key, value|
|
94
|
-
|
133
|
+
unless definition[:template].keys.include?(key.to_sym)
|
134
|
+
error_for(
|
135
|
+
:unknown_attribute,
|
136
|
+
root: :template,
|
137
|
+
path: [params[:name], key]
|
138
|
+
)
|
139
|
+
next
|
140
|
+
end unless @serializer.uses?(:open_attrs)
|
141
|
+
|
142
|
+
if value_is_invalid?(value)
|
95
143
|
error_for :value, root: :template, path: [params[:name], key]
|
96
144
|
end
|
97
145
|
end if params[:properties]
|
@@ -103,7 +151,7 @@ module CollectionJson
|
|
103
151
|
@serializer.queries.each do |query|
|
104
152
|
params = query.extract_params
|
105
153
|
|
106
|
-
unless params[:properties].key?
|
154
|
+
unless params[:properties].key?(:href)
|
107
155
|
error_for :missing_attribute,
|
108
156
|
root: :queries,
|
109
157
|
path: [params[:name], "href"]
|
@@ -111,12 +159,19 @@ module CollectionJson
|
|
111
159
|
next
|
112
160
|
end
|
113
161
|
|
114
|
-
if url_is_invalid?
|
162
|
+
if url_is_invalid?(params[:properties][:href])
|
115
163
|
error_for :url, root: :queries, path: [params[:name], "href"]
|
116
164
|
end
|
117
165
|
|
118
166
|
params[:properties].each do |key, value|
|
119
167
|
next if key == :data || key == :href
|
168
|
+
unless definition[:queries].keys.include?(key.to_sym)
|
169
|
+
error_for(
|
170
|
+
:unknown_attribute,
|
171
|
+
root: :queries,
|
172
|
+
path: [params[:name], key]
|
173
|
+
)
|
174
|
+
end unless @serializer.uses?(:open_attrs)
|
120
175
|
|
121
176
|
if value_is_invalid?(value)
|
122
177
|
error_for :value, root: :queries, path: [params[:name], key]
|
@@ -125,6 +180,16 @@ module CollectionJson
|
|
125
180
|
|
126
181
|
if params[:properties].key?(:data)
|
127
182
|
params[:properties][:data].each do |hash|
|
183
|
+
hash.keys.each do |key|
|
184
|
+
unless definition[:queries][:data].keys.include?(key)
|
185
|
+
error_for(
|
186
|
+
:unknown_attribute,
|
187
|
+
root: :queries,
|
188
|
+
path: [params[:name], :data, key]
|
189
|
+
)
|
190
|
+
end unless @serializer.uses?(:open_attrs)
|
191
|
+
end
|
192
|
+
|
128
193
|
if value_is_invalid?(hash[:name])
|
129
194
|
error_for :value,
|
130
195
|
root: :queries,
|
@@ -153,6 +218,8 @@ module CollectionJson
|
|
153
218
|
ending = " is an invalid value"
|
154
219
|
when :missing_attribute
|
155
220
|
ending = " is missing"
|
221
|
+
when :unknown_attribute
|
222
|
+
ending = " is an unknown attribute"
|
156
223
|
else
|
157
224
|
ending = " is an invalid value"
|
158
225
|
end
|
@@ -163,6 +230,18 @@ module CollectionJson
|
|
163
230
|
e << ending
|
164
231
|
@errors[root] << e
|
165
232
|
end
|
233
|
+
|
234
|
+
def definition
|
235
|
+
CollectionJson::Spec::DEFINITION
|
236
|
+
end
|
237
|
+
|
238
|
+
def attributes?
|
239
|
+
@serializer.items? && @serializer.items.attributes?
|
240
|
+
end
|
241
|
+
|
242
|
+
def links?
|
243
|
+
@serializer.items? && @serializer.items.links?
|
244
|
+
end
|
166
245
|
end
|
167
246
|
end
|
168
247
|
end
|
@@ -153,25 +153,6 @@ module CollectionJson
|
|
153
153
|
assert_equal expected.to_json, builder.to_json
|
154
154
|
end
|
155
155
|
|
156
|
-
def test_that_any_attributes_can_be_passed_to_template
|
157
|
-
custom_serializer = CustomTemplateSerializer.new(@user1)
|
158
|
-
builder = Builder.new(custom_serializer)
|
159
|
-
|
160
|
-
expected = {
|
161
|
-
collection: {
|
162
|
-
version: "1.0",
|
163
|
-
template: {
|
164
|
-
data: [
|
165
|
-
{ name: "name", value: "" },
|
166
|
-
{ name: "email", value: "", prompt: "My email", anything: "at all", whatever: "really" }
|
167
|
-
]
|
168
|
-
}
|
169
|
-
}
|
170
|
-
}
|
171
|
-
|
172
|
-
assert_equal expected.to_json, builder.to_json
|
173
|
-
end
|
174
|
-
|
175
156
|
def test_that_an_invalid_serializer_raises_an_error
|
176
157
|
invalid_serializer = InvalidSerializer.new(@user1)
|
177
158
|
builder = Builder.new(invalid_serializer)
|
@@ -0,0 +1,118 @@
|
|
1
|
+
require "minitest_helper"
|
2
|
+
|
3
|
+
module CollectionJson
|
4
|
+
class Serializer
|
5
|
+
class TestOpenAttrs < Minitest::Test
|
6
|
+
include TestHelper
|
7
|
+
|
8
|
+
def setup
|
9
|
+
@user = User.new(name: "Carles Jove", email: "hola@carlus.cat")
|
10
|
+
@serializer = empty_serializer_for(@user)
|
11
|
+
@serializer.class.extensions = [:open_attrs]
|
12
|
+
@serializer.class.template = [
|
13
|
+
email: {
|
14
|
+
prompt: "My email",
|
15
|
+
anything: "at all"
|
16
|
+
}
|
17
|
+
]
|
18
|
+
@serializer.items.attributes = [
|
19
|
+
name:
|
20
|
+
{
|
21
|
+
anything: "at all"
|
22
|
+
}
|
23
|
+
]
|
24
|
+
@serializer.items.links = [
|
25
|
+
dashboard: {
|
26
|
+
# TODO
|
27
|
+
# This URL shouldn't validate!
|
28
|
+
href: "/my-dashboard",
|
29
|
+
anything: "at all"
|
30
|
+
}
|
31
|
+
]
|
32
|
+
@serializer.class.links = [
|
33
|
+
dashboard: {
|
34
|
+
href: "http://example.com/my-dashboard",
|
35
|
+
anything: "at all"
|
36
|
+
}
|
37
|
+
]
|
38
|
+
@serializer.class.queries = [
|
39
|
+
search: {
|
40
|
+
href: "http://example.com/search",
|
41
|
+
rel: "search",
|
42
|
+
whatever: "doesn't matter",
|
43
|
+
data: [
|
44
|
+
name: "required",
|
45
|
+
anything: "at all"
|
46
|
+
]
|
47
|
+
}
|
48
|
+
]
|
49
|
+
end
|
50
|
+
|
51
|
+
def test_that_serializer_is_valid_using_open_attrs
|
52
|
+
assert @serializer.valid?, "#{@serializer} should be valid"
|
53
|
+
end
|
54
|
+
|
55
|
+
def test_that_a_collection_can_be_built_using_open_attrs
|
56
|
+
builder = Builder.new(@serializer)
|
57
|
+
expected = {
|
58
|
+
collection: {
|
59
|
+
version: "1.0",
|
60
|
+
items: [
|
61
|
+
{
|
62
|
+
data: [
|
63
|
+
{
|
64
|
+
name: "name",
|
65
|
+
value: "Carles Jove",
|
66
|
+
anything: "at all"
|
67
|
+
}
|
68
|
+
],
|
69
|
+
links: [
|
70
|
+
{
|
71
|
+
rel: "dashboard",
|
72
|
+
href: "/my-dashboard",
|
73
|
+
name: "dashboard",
|
74
|
+
anything: "at all",
|
75
|
+
}
|
76
|
+
]
|
77
|
+
}
|
78
|
+
],
|
79
|
+
links: [
|
80
|
+
{
|
81
|
+
rel: "dashboard",
|
82
|
+
href: "http://example.com/my-dashboard",
|
83
|
+
name: "dashboard",
|
84
|
+
anything: "at all",
|
85
|
+
}
|
86
|
+
],
|
87
|
+
template: {
|
88
|
+
data: [
|
89
|
+
{
|
90
|
+
name: "email",
|
91
|
+
value: "",
|
92
|
+
prompt: "My email",
|
93
|
+
anything: "at all"
|
94
|
+
}
|
95
|
+
]
|
96
|
+
},
|
97
|
+
queries: [
|
98
|
+
{
|
99
|
+
href: "http://example.com/search",
|
100
|
+
name: "search",
|
101
|
+
whatever: "doesn't matter",
|
102
|
+
rel: "search",
|
103
|
+
data: [
|
104
|
+
name: "required",
|
105
|
+
anything: "at all",
|
106
|
+
value: ""
|
107
|
+
]
|
108
|
+
}
|
109
|
+
]
|
110
|
+
}
|
111
|
+
}
|
112
|
+
|
113
|
+
assert_equal JSON(expected.to_json), JSON(builder.to_json)
|
114
|
+
end
|
115
|
+
end
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
data/test/minitest_helper.rb
CHANGED
@@ -13,6 +13,7 @@ require "active_support/inflector"
|
|
13
13
|
module TestHelper
|
14
14
|
def empty_serializer_for(object)
|
15
15
|
serializer = CollectionJson::Serializer.new(object)
|
16
|
+
serializer.class.extensions = []
|
16
17
|
serializer.class.href = []
|
17
18
|
serializer.class.links = []
|
18
19
|
serializer.class.template = []
|
data/test/objects/item_test.rb
CHANGED
@@ -68,38 +68,6 @@ module CollectionJson
|
|
68
68
|
assert_equal expected.to_json, item.create.to_json
|
69
69
|
end
|
70
70
|
|
71
|
-
def test_that_an_item_can_be_build_with_random_attributes
|
72
|
-
custom_serializer = CustomItemSerializer.new(@user1)
|
73
|
-
item = Item.new(custom_serializer)
|
74
|
-
|
75
|
-
expected = {
|
76
|
-
data: [{
|
77
|
-
name: "name",
|
78
|
-
value: "Carles Jove",
|
79
|
-
anything: "at all",
|
80
|
-
whatever: "really"
|
81
|
-
}]
|
82
|
-
}
|
83
|
-
assert_equal expected.to_json, item.create.to_json
|
84
|
-
end
|
85
|
-
|
86
|
-
def test_that_an_item_link_can_be_build_with_unlimited_attributes
|
87
|
-
custom_serializer = CustomItemLinksSerializer.new(@user1)
|
88
|
-
item = Item.new(custom_serializer)
|
89
|
-
|
90
|
-
expected = {
|
91
|
-
links: [{
|
92
|
-
rel: "dashboard",
|
93
|
-
name: "dashboard",
|
94
|
-
href: "/my-dashboard",
|
95
|
-
anything: "at all",
|
96
|
-
whatever: "really"
|
97
|
-
}]
|
98
|
-
}
|
99
|
-
|
100
|
-
assert_equal expected[:links], item.create[:links]
|
101
|
-
end
|
102
|
-
|
103
71
|
def test_that_unknown_attributes_are_silently_ignored
|
104
72
|
serializer = empty_serializer_for(@user1)
|
105
73
|
serializer.items.attributes(:unknown)
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require "minitest_helper"
|
2
|
+
|
3
|
+
module CollectionJson
|
4
|
+
class Serializer
|
5
|
+
class TestDSL < Minitest::Test
|
6
|
+
def setup
|
7
|
+
@user = User.new(name: "Carles Jove", email: "hola@carlus.cat")
|
8
|
+
@serializer = Serializer.new(@user)
|
9
|
+
end
|
10
|
+
|
11
|
+
def test_top_level_dsl
|
12
|
+
assert @serializer.respond_to?(:href)
|
13
|
+
assert @serializer.respond_to?(:links)
|
14
|
+
assert @serializer.respond_to?(:template)
|
15
|
+
assert @serializer.respond_to?(:queries)
|
16
|
+
assert @serializer.respond_to?(:items)
|
17
|
+
assert @serializer.respond_to?(:extensions)
|
18
|
+
end
|
19
|
+
|
20
|
+
def test_items_dsl
|
21
|
+
assert_equal Items, @serializer.items.class
|
22
|
+
assert @serializer.items.respond_to?(:attributes)
|
23
|
+
assert @serializer.items.respond_to?(:links)
|
24
|
+
assert @serializer.items.respond_to?(:href)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -11,19 +11,6 @@ module CollectionJson
|
|
11
11
|
def test_attributes_properties
|
12
12
|
assert_equal [:name, :email], @user_serializer.items.attributes
|
13
13
|
end
|
14
|
-
|
15
|
-
def test_that_any_attributes_can_be_passed
|
16
|
-
custom_serializer = CustomItemSerializer.new(@user)
|
17
|
-
expected = [
|
18
|
-
name:
|
19
|
-
{
|
20
|
-
anything: "at all",
|
21
|
-
whatever: "really"
|
22
|
-
}
|
23
|
-
]
|
24
|
-
|
25
|
-
assert_equal expected, custom_serializer.items.attributes
|
26
|
-
end
|
27
14
|
end
|
28
15
|
end
|
29
16
|
end
|
@@ -14,18 +14,6 @@ module CollectionJson
|
|
14
14
|
expected = [dashboard: { href: "http://example.com/my-dashboard" }]
|
15
15
|
assert_equal expected, @user_serializer.class.links
|
16
16
|
end
|
17
|
-
|
18
|
-
def test_item_links_attributes_can_take_unlimited_properties
|
19
|
-
custom_serializer = empty_serializer_for(@user)
|
20
|
-
links = { dashboard: {
|
21
|
-
href: "/my-dashboard",
|
22
|
-
anything: "at all",
|
23
|
-
whatever: "really"
|
24
|
-
} }
|
25
|
-
custom_serializer.class.links links
|
26
|
-
|
27
|
-
assert_equal [links], custom_serializer.class.links
|
28
|
-
end
|
29
17
|
end
|
30
18
|
end
|
31
19
|
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require "minitest_helper"
|
2
|
+
|
3
|
+
# Here we test Serializer's stuff _other_ than the DSL and Validations
|
4
|
+
# - For the DSL tests, check serializer/dsl_test.rb
|
5
|
+
# - For validation tests, check validator/validator_test.rb
|
6
|
+
module CollectionJson
|
7
|
+
class Serializer
|
8
|
+
class TestSerializer < Minitest::Test
|
9
|
+
include TestHelper
|
10
|
+
|
11
|
+
def setup
|
12
|
+
@user = User.new(name: "Carles Jove", email: "hola@carlus.cat")
|
13
|
+
@serializer = empty_serializer_for(@user)
|
14
|
+
end
|
15
|
+
|
16
|
+
def test_uses_method
|
17
|
+
@serializer.class.extensions(:open_attrs, :another_ext)
|
18
|
+
assert @serializer.uses?(:open_attrs)
|
19
|
+
assert @serializer.uses?(:another_ext)
|
20
|
+
refute @serializer.uses?(:unexistent_ext)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,70 @@
|
|
1
|
+
require "minitest_helper"
|
2
|
+
|
3
|
+
module CollectionJson
|
4
|
+
module Spec
|
5
|
+
class TestSpec < Minitest::Test
|
6
|
+
include TestHelper
|
7
|
+
|
8
|
+
def test_that_random_attributes_cannot_be_passed
|
9
|
+
serializer = empty_serializer_for(@user)
|
10
|
+
serializer.items.attributes = [
|
11
|
+
name: { unknown: "this should not be valid" }
|
12
|
+
]
|
13
|
+
serializer.items.links = serializer.class.links = [
|
14
|
+
dashboard: {
|
15
|
+
href: "http://example.com",
|
16
|
+
unknown: "this should not be valid"
|
17
|
+
}
|
18
|
+
]
|
19
|
+
serializer.class.template = [
|
20
|
+
name: { whatever: "this should not be valid" }
|
21
|
+
]
|
22
|
+
serializer.class.queries = [
|
23
|
+
name: {
|
24
|
+
href: "http://example.com",
|
25
|
+
whatever: "this should be invalid",
|
26
|
+
data: [
|
27
|
+
unknown: "this should be invalid"
|
28
|
+
]
|
29
|
+
}
|
30
|
+
]
|
31
|
+
|
32
|
+
assert serializer.invalid?,
|
33
|
+
"#{serializer.inspect} should be invalid"
|
34
|
+
|
35
|
+
# Items attributes
|
36
|
+
assert serializer.errors.key?(:attributes),
|
37
|
+
"#{serializer.errors.inspect} should have key attributes"
|
38
|
+
assert serializer.errors[:attributes][0].
|
39
|
+
include?("attributes:name:unknown is an unknown attribute"),
|
40
|
+
"#{serializer.errors[:attributes]} should include 'unknown attribute'"
|
41
|
+
|
42
|
+
# Items links
|
43
|
+
assert serializer.errors.key?(:items),
|
44
|
+
"#{serializer.errors.inspect} should have key attributes"
|
45
|
+
assert serializer.errors[:items][0].
|
46
|
+
include?("items:links:dashboard:unknown is an unknown attribute")
|
47
|
+
|
48
|
+
# Links
|
49
|
+
assert serializer.errors.key?(:links), "should have error for 'links'"
|
50
|
+
assert serializer.errors[:links][0].
|
51
|
+
include?("links:unknown is an unknown attribute")
|
52
|
+
|
53
|
+
# Template
|
54
|
+
assert serializer.errors.key?(:template),
|
55
|
+
"should have error for 'template'"
|
56
|
+
assert serializer.errors[:template][0].
|
57
|
+
include?("template:name:whatever is an unknown attribute")
|
58
|
+
|
59
|
+
# Queries
|
60
|
+
assert serializer.errors.key?(:queries),
|
61
|
+
"should have error for 'queries'"
|
62
|
+
assert serializer.errors[:queries][0].
|
63
|
+
include?("queries:name:whatever is an unknown attribute")
|
64
|
+
assert serializer.errors[:queries][1].
|
65
|
+
include?("queries:name:data:unknown is an unknown attribute")
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
@@ -11,20 +11,6 @@ module CollectionJson
|
|
11
11
|
def test_template_attributes
|
12
12
|
assert_equal [:name, email: { prompt: "My email" }], @user_serializer.class.template
|
13
13
|
end
|
14
|
-
|
15
|
-
def test_that_any_attributes_can_be_passed
|
16
|
-
custom_serializer = CustomTemplateSerializer.new(@user)
|
17
|
-
expected = [
|
18
|
-
:name,
|
19
|
-
email: {
|
20
|
-
prompt: "My email",
|
21
|
-
anything: "at all",
|
22
|
-
whatever: "really"
|
23
|
-
}
|
24
|
-
]
|
25
|
-
|
26
|
-
assert_equal expected, custom_serializer.class.template
|
27
|
-
end
|
28
14
|
end
|
29
15
|
end
|
30
16
|
end
|
@@ -94,8 +94,7 @@ module CollectionJson
|
|
94
94
|
@invalid_value_types.each do |invalidate|
|
95
95
|
@invalid.items.attributes = [
|
96
96
|
name: {
|
97
|
-
prompt: invalidate
|
98
|
-
test: invalidate
|
97
|
+
prompt: invalidate
|
99
98
|
}
|
100
99
|
]
|
101
100
|
|
@@ -105,8 +104,6 @@ module CollectionJson
|
|
105
104
|
"#{invalidate} should be invalid"
|
106
105
|
assert @invalid.errors[:attributes][0].
|
107
106
|
include? "attributes:name:prompt is an invalid value"
|
108
|
-
assert @invalid.errors[:attributes][1].
|
109
|
-
include? "attributes:name:test is an invalid value"
|
110
107
|
end
|
111
108
|
end
|
112
109
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: collection_json_serializer
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Carles Jove i Buxeda
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-01-
|
11
|
+
date: 2015-01-14 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -90,12 +90,14 @@ files:
|
|
90
90
|
- lib/collection_json_serializer/objects/query.rb
|
91
91
|
- lib/collection_json_serializer/objects/template.rb
|
92
92
|
- lib/collection_json_serializer/serializer.rb
|
93
|
+
- lib/collection_json_serializer/spec.rb
|
93
94
|
- lib/collection_json_serializer/support.rb
|
94
95
|
- lib/collection_json_serializer/validator.rb
|
95
96
|
- lib/collection_json_serializer/validator/url.rb
|
96
97
|
- lib/collection_json_serializer/validator/value.rb
|
97
98
|
- lib/collection_json_serializer/version.rb
|
98
99
|
- test/builder/builder_test.rb
|
100
|
+
- test/extensions/open_attrs_test.rb
|
99
101
|
- test/fixtures/models.rb
|
100
102
|
- test/fixtures/poro.rb
|
101
103
|
- test/fixtures/serializers/custom_item_links_serializer.rb
|
@@ -108,13 +110,15 @@ files:
|
|
108
110
|
- test/objects/item_test.rb
|
109
111
|
- test/objects/queries_test.rb
|
110
112
|
- test/objects/template_test.rb
|
113
|
+
- test/serializer/dsl_test.rb
|
111
114
|
- test/serializer/href_test.rb
|
112
115
|
- test/serializer/items/attributes_test.rb
|
113
116
|
- test/serializer/items/href_test.rb
|
114
117
|
- test/serializer/items/links_test.rb
|
115
|
-
- test/serializer/items_test.rb
|
116
118
|
- test/serializer/links_test.rb
|
117
119
|
- test/serializer/queries_test.rb
|
120
|
+
- test/serializer/serializer_test.rb
|
121
|
+
- test/serializer/spec_test.rb
|
118
122
|
- test/serializer/template_test.rb
|
119
123
|
- test/support/ext_test.rb
|
120
124
|
- test/support/support_test.rb
|
@@ -148,6 +152,7 @@ specification_version: 4
|
|
148
152
|
summary: Serialize objects as Collection+JSON.
|
149
153
|
test_files:
|
150
154
|
- test/builder/builder_test.rb
|
155
|
+
- test/extensions/open_attrs_test.rb
|
151
156
|
- test/fixtures/models.rb
|
152
157
|
- test/fixtures/poro.rb
|
153
158
|
- test/fixtures/serializers/custom_item_links_serializer.rb
|
@@ -160,13 +165,15 @@ test_files:
|
|
160
165
|
- test/objects/item_test.rb
|
161
166
|
- test/objects/queries_test.rb
|
162
167
|
- test/objects/template_test.rb
|
168
|
+
- test/serializer/dsl_test.rb
|
163
169
|
- test/serializer/href_test.rb
|
164
170
|
- test/serializer/items/attributes_test.rb
|
165
171
|
- test/serializer/items/href_test.rb
|
166
172
|
- test/serializer/items/links_test.rb
|
167
|
-
- test/serializer/items_test.rb
|
168
173
|
- test/serializer/links_test.rb
|
169
174
|
- test/serializer/queries_test.rb
|
175
|
+
- test/serializer/serializer_test.rb
|
176
|
+
- test/serializer/spec_test.rb
|
170
177
|
- test/serializer/template_test.rb
|
171
178
|
- test/support/ext_test.rb
|
172
179
|
- test/support/support_test.rb
|
@@ -1,24 +0,0 @@
|
|
1
|
-
require "minitest_helper"
|
2
|
-
|
3
|
-
module CollectionJson
|
4
|
-
class Serializer
|
5
|
-
class TestItems < Minitest::Test
|
6
|
-
def setup
|
7
|
-
@user = User.new(name: "Carles Jove", email: "hola@carlus.cat")
|
8
|
-
@user_serializer = UserSerializer.new(@user)
|
9
|
-
end
|
10
|
-
|
11
|
-
def test_an_items_instance_is_created
|
12
|
-
assert_equal Items, @user_serializer.items.class
|
13
|
-
end
|
14
|
-
|
15
|
-
def test_that_items_has_an_attributes_dsl
|
16
|
-
assert @user_serializer.items.respond_to?(:attributes)
|
17
|
-
end
|
18
|
-
|
19
|
-
def test_that_items_has_a_links_dsl
|
20
|
-
assert @user_serializer.items.respond_to?(:links)
|
21
|
-
end
|
22
|
-
end
|
23
|
-
end
|
24
|
-
end
|