collection_json_serializer 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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 2ec98d08e1b7a1d83f75d774fdee42b77895dfdd
4
- data.tar.gz: 3e79907d1643600fe2ba316efdb65ab532bee250
3
+ metadata.gz: a38b7d4dc38ed5c1bed4033818d2e69968be6720
4
+ data.tar.gz: b52f5ce2efdc98b2ed6c18a75d634c61592ffff4
5
5
  SHA512:
6
- metadata.gz: 7ed704824347ead480a3081c0be6ed6045880f348dc25dd19517aa4fc72ed86c9b58c12153363b49e5797bd9391ecb2f7d148167b6bc89114f325d507bf54968
7
- data.tar.gz: d065ea2525e44d26844b4d864cd381a345904077e0e2562904a98b1bfba363f873798af779e23ff5d06137f52e5248daf14f38a24b0a782e887875fe3ed041d1
6
+ metadata.gz: 56aa051a9b31a5b8da6e218c62a75dde366d1a92fdffe55ba55340fe480954a74c212aea2715f3379a308e549f60cec1ecfad4736cb7671b2132d6954adf9d7f
7
+ data.tar.gz: 4946c642a0ed91dca00879ef01bf5d73c998912747434be345d7bc5c1dc7137e1673f8b4700e3b5966713964b196dd7305e94f8897ac2e5ff6880c84d499b9cd
data/README.md CHANGED
@@ -5,11 +5,9 @@
5
5
  | :warning: This is _not finished_ yet, so use it at your own risk. |
6
6
  --------------------------------------------------------------------
7
7
 
8
- A Ruby gem to respond with Collection+JSON.
8
+ CollectionJson::Serializer serializes Ruby objects to Collection+JSON, the hypermedia type by Mike Amudsen.
9
9
 
10
- CollectionJson::Serializer formats JSON responses following the Collection+JSON media type by Mike Amudsen.
11
-
12
- Please note that CollectionJson::Serializer only serializes data. You still need to set the proper Headers or media-types in your app.
10
+ Please note that CollectionJson::Serializer _only serializes data_. You still need to set the proper Headers or media-types in your app.
13
11
 
14
12
  ## Installation
15
13
 
@@ -23,9 +21,6 @@ And then execute:
23
21
 
24
22
  $ bundle
25
23
 
26
- Or install it yourself as:
27
-
28
- $ gem install collection_json_serializer
29
24
 
30
25
  ## Usage
31
26
 
@@ -33,10 +28,7 @@ As this gem user, you will be mainly writing/generating and mantaining serialize
33
28
 
34
29
  ```ruby
35
30
  class UserSerializer < CollectionJson::Serializer
36
- href self: "http://example.com/users/1",
37
- collection: "http://example.com/users"
38
-
39
- attributes :id, name: { prompt: "Your full name" }, :email
31
+ href "http://example.com/users",
40
32
 
41
33
  template :name, email: { prompt: "My email" }
42
34
 
@@ -54,6 +46,12 @@ class UserSerializer < CollectionJson::Serializer
54
46
  { name: "page" }
55
47
  ]
56
48
  }
49
+
50
+ item do
51
+ attributes :id, name: { prompt: "Your full name" }, :email
52
+ href "http://example.com/users/{id}"
53
+ links avatar: { href: "http://assets.example.com/avatar.jpg", render: "image" }
54
+ end
57
55
  end
58
56
  ```
59
57
 
@@ -84,6 +82,9 @@ This will generate this Collection+JSON response:
84
82
  {
85
83
  "version" : "1.0",
86
84
  "href" : "http://example.com/users",
85
+ "links": [
86
+ { "name": "dashboard", "href": "http://example.com/my-dashboard" }
87
+ ],
87
88
  "items" : [{
88
89
  "href": "http://example.com/users/1",
89
90
  "data": [
@@ -92,7 +93,8 @@ This will generate this Collection+JSON response:
92
93
  { "name": "email", "value": "email@example.com" },
93
94
  ],
94
95
  "links": [
95
- { "name": "dashboard", "href": "http://example.com/my-dashboard" }
96
+ { "name": "avatar", "href": "http://assets.example.com/avatar.jpg",
97
+ "render": "image" }
96
98
  ]
97
99
  }],
98
100
  "template" : {
@@ -119,11 +121,13 @@ This will generate this Collection+JSON response:
119
121
 
120
122
  #### URL placeholders
121
123
 
122
- URLs can be generated dinamically with placeholder. A placeholder is a URL segment wrapped in curly braces. A placeholder can be any method that can be called on the object that the serializer takes (i.e. `id`, `username`, etc.).
124
+ Items' URLs can be generated dinamically with a placeholder. A placeholder is a URL segment wrapped in curly braces. A placeholder can be any method that can be called on the object that the serializer takes (i.e. `id`, `username`, etc.).
123
125
 
124
126
  ```ruby
125
127
  class UserSerializer < CollectionJson::Serializer
126
- href self: "http://example.com/users/{id}"
128
+ items do
129
+ href "http://example.com/users/{id}"
130
+ end
127
131
  end
128
132
  ```
129
133
 
@@ -131,21 +135,27 @@ All placeholders will be called, so you can use more than one if necessary, but
131
135
 
132
136
  ```ruby
133
137
  class UserSerializer < CollectionJson::Serializer
134
- # This is ok
135
- href self: "http://example.com/users/{id}/{username}"
138
+ items do
139
+ # This is ok
140
+ href "http://example.com/users/{id}/{username}"
136
141
 
137
- # This is not ok
138
- href self: "http://example.com/users/{id}-{username}"
142
+ # This is wrong
143
+ href "http://example.com/users/{id}-{username}"
144
+ end
139
145
  end
140
146
  ```
141
147
 
148
+ Please, notice that placeholders can _only_ be used within the `items` block.
149
+
142
150
  #### Open Attributes Policy
143
151
 
144
152
  Collection+JSON serializer has an __open attributes policy__, which means that objects' attributes can be extended at will. That is good if you want to use many of the [extensions available](https://github.com/collection-json/extensions), and also if you need 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.
145
153
 
146
154
  ```ruby
147
155
  class UserSerializer < CollectionJson::Serializer
148
- attributes :id, name: { css_class: "people" }
156
+ items do
157
+ attributes :id, name: { css_class: "people" }
158
+ end
149
159
 
150
160
  template name: { regex: "/\A[a-zA-Z0-9_]*\z/" }
151
161
 
@@ -6,6 +6,7 @@ require "collection_json_serializer/core_ext/symbol"
6
6
  require "collection_json_serializer/support"
7
7
 
8
8
  require "collection_json_serializer/serializer"
9
+ require "collection_json_serializer/items"
9
10
 
10
11
  require "collection_json_serializer/builder"
11
12
 
@@ -1,6 +1,8 @@
1
1
  module CollectionJson
2
2
  class Serializer
3
3
  class Builder
4
+ include Support
5
+
4
6
  def initialize(serializer)
5
7
  @serializer = serializer
6
8
  @collection = { version: "1.0" }
@@ -25,16 +27,15 @@ module CollectionJson
25
27
 
26
28
  def build
27
29
  # There might be a more elegant way to do it, yes
28
- add_href if @serializer.href.respond_to? :key
29
- add_items if @serializer.attributes.present?
30
- add_template if @serializer.template.present?
31
- add_queries if @serializer.queries.present?
30
+ add_href if @serializer.href.present?
31
+ add_items if @serializer.items? && @serializer.items.attributes?
32
+ add_links if @serializer.links?
33
+ add_template if @serializer.template?
34
+ add_queries if @serializer.queries?
32
35
  end
33
36
 
34
37
  def add_href
35
- if @serializer.href.key? :collection
36
- @collection.store :href, @serializer.href[:collection]
37
- end
38
+ @collection.store(:href, @serializer.href) if @serializer.href.present?
38
39
  end
39
40
 
40
41
  def add_items
@@ -61,6 +62,22 @@ module CollectionJson
61
62
  @collection[:queries] << query.create
62
63
  end
63
64
  end
65
+
66
+ def add_links
67
+ @collection.store :links, Array.new
68
+
69
+ @serializer.links.each do |attr|
70
+ params = attr.extract_params
71
+
72
+ next unless params.key? :properties
73
+
74
+ @collection[:links] << {
75
+ rel: set_rel(params),
76
+ href: params[:properties][:href],
77
+ name: params[:name].to_s
78
+ }.merge!(params[:properties])
79
+ end
80
+ end
64
81
  end
65
82
  end
66
83
  end
@@ -0,0 +1,39 @@
1
+ module CollectionJson
2
+ class Serializer
3
+ class Items
4
+ attr_accessor :href
5
+ attr_accessor :attributes
6
+ attr_accessor :links
7
+
8
+ def href(*args)
9
+ url = if args.first.is_a?(Array)
10
+ args.first.first
11
+ else
12
+ args.first
13
+ end
14
+ @href ||= url
15
+ end
16
+
17
+ def attributes(*args)
18
+ @attributes ||= args
19
+ end
20
+
21
+ def links(*args)
22
+ @links ||= args
23
+ end
24
+
25
+ def href?
26
+ @href.present?
27
+ end
28
+
29
+ def attributes?
30
+ @attributes.present?
31
+ end
32
+
33
+ def links?
34
+ @links.present?
35
+ end
36
+ end
37
+ end
38
+ end
39
+
@@ -2,7 +2,7 @@ module CollectionJson
2
2
  class Serializer
3
3
  class Objects
4
4
  class Item
5
- include CollectionJson::Serializer::Support
5
+ include Support
6
6
 
7
7
  def initialize(serializer, item: 0)
8
8
  @serializer = serializer
@@ -12,9 +12,9 @@ module CollectionJson
12
12
  end
13
13
 
14
14
  def create
15
- add_href if @serializer.href.present?
16
- add_data if @serializer.attributes.present?
17
- add_links if @serializer.links.present?
15
+ add_href if @serializer.items.href?
16
+ add_data if @serializer.items? && @serializer.items.attributes?
17
+ add_links if @serializer.items.links?
18
18
 
19
19
  @item
20
20
  end
@@ -22,13 +22,11 @@ module CollectionJson
22
22
  private
23
23
 
24
24
  def add_href
25
- if @serializer.href.present?
26
- @item.store :href, set_href
27
- end
25
+ @item.store(:href, set_href) if @serializer.items.href?
28
26
  end
29
27
 
30
28
  def add_data
31
- @serializer.attributes.each do |attr|
29
+ attributes.each do |attr|
32
30
  params = attr.extract_params
33
31
  value = extract_value_from(@resource, params[:name])
34
32
 
@@ -39,11 +37,11 @@ module CollectionJson
39
37
 
40
38
  start_object :data, Array.new
41
39
  @item[:data] << c
42
- end if @serializer.attributes.present?
40
+ end if @serializer.items.attributes?
43
41
  end
44
42
 
45
43
  def add_links
46
- @serializer.links.each do |attr|
44
+ @serializer.items.links.each do |attr|
47
45
  params = attr.extract_params
48
46
 
49
47
  next unless params.key? :properties
@@ -54,7 +52,7 @@ module CollectionJson
54
52
  href: params[:properties][:href],
55
53
  name: params[:name].to_s
56
54
  }.merge!(params[:properties])
57
- end if @serializer.links.present?
55
+ end if @serializer.items.links.present?
58
56
  end
59
57
 
60
58
  def start_object(name, type)
@@ -62,16 +60,20 @@ module CollectionJson
62
60
  end
63
61
 
64
62
  def set_href
65
- url = @serializer.href[:self] || @serializer.href
63
+ url = @serializer.items.href || @serializer.href
66
64
  parse_url(url, @resource)
67
65
  end
68
66
 
69
- def set_rel(params)
70
- if params[:properties].key? :rel
71
- params[:properties][:rel].to_s
72
- else
73
- params[:name].to_s
74
- end
67
+ def href?
68
+ @serializer.href.present?
69
+ end
70
+
71
+ def items?
72
+ !@serializer.items.nil?
73
+ end
74
+
75
+ def attributes
76
+ @serializer.items.attributes if @serializer.items.attributes?
75
77
  end
76
78
  end
77
79
  end
@@ -2,15 +2,14 @@ module CollectionJson
2
2
  class Serializer
3
3
  class << self
4
4
  attr_accessor :href
5
- attr_accessor :attributes
6
5
  attr_accessor :template
7
6
  attr_accessor :links
8
7
  attr_accessor :queries
8
+ attr_accessor :_items
9
9
  end
10
10
 
11
11
  def self.inherited(base)
12
12
  base.href = []
13
- base.attributes = []
14
13
  base.template = []
15
14
  base.links = []
16
15
  base.queries = []
@@ -20,10 +19,6 @@ module CollectionJson
20
19
  @href.concat attrs
21
20
  end
22
21
 
23
- def self.attributes(*attrs)
24
- @attributes.concat attrs
25
- end
26
-
27
22
  def self.template(*attrs)
28
23
  @template.concat attrs
29
24
  end
@@ -36,6 +31,11 @@ module CollectionJson
36
31
  @queries.concat attrs
37
32
  end
38
33
 
34
+ def self.items(&block)
35
+ @_items = Items.new
36
+ @_items.instance_eval(&block)
37
+ end
38
+
39
39
  attr_accessor :resources
40
40
 
41
41
  def initialize(resource)
@@ -50,22 +50,38 @@ module CollectionJson
50
50
  self.class.href.first
51
51
  end
52
52
 
53
- def attributes
54
- self.class.attributes
55
- end
56
-
57
53
  def template
58
54
  self.class.template
59
55
  end
60
56
 
57
+ def template?
58
+ self.class.template.present?
59
+ end
60
+
61
61
  def links
62
62
  self.class.links
63
63
  end
64
64
 
65
+ def links?
66
+ self.class.links.present?
67
+ end
68
+
65
69
  def queries
66
70
  self.class.queries
67
71
  end
68
72
 
73
+ def queries?
74
+ self.class.queries.present?
75
+ end
76
+
77
+ def items
78
+ self.class._items
79
+ end
80
+
81
+ def items?
82
+ self.class._items.present?
83
+ end
84
+
69
85
  def invalid?
70
86
  Validator.new(self).invalid?
71
87
  end
@@ -31,6 +31,14 @@ module CollectionJson
31
31
  def has_placeholder?(string)
32
32
  string.chars.first.eql?("{") && string.chars.last.eql?("}")
33
33
  end
34
+
35
+ def set_rel(params)
36
+ if params[:properties].key?(:rel)
37
+ params[:properties][:rel].to_s
38
+ else
39
+ params[:name].to_s
40
+ end
41
+ end
34
42
  end
35
43
  end
36
44
  end
@@ -32,7 +32,7 @@ module CollectionJson
32
32
  end
33
33
 
34
34
  def validate_attributes
35
- @serializer.attributes.each do |attr|
35
+ @serializer.items.attributes.each do |attr|
36
36
  params = attr.extract_params
37
37
 
38
38
  @serializer.resources.each do |resource|
@@ -48,7 +48,7 @@ module CollectionJson
48
48
  end
49
49
  end if params[:properties]
50
50
 
51
- end if @serializer.attributes.any?
51
+ end if @serializer.items && @serializer.items.attributes.any?
52
52
  end
53
53
 
54
54
  def validate_href
@@ -1,5 +1,5 @@
1
1
  module CollectionJson
2
2
  class Serializer
3
- VERSION = "0.2.0"
3
+ VERSION = "0.3.0"
4
4
  end
5
5
  end
@@ -33,13 +33,20 @@ module CollectionJson
33
33
  ],
34
34
  links: [
35
35
  {
36
- rel: "dashboard",
37
- href: "http://example.com/my-dashboard",
38
- name: "dashboard"
36
+ rel: "avatar",
37
+ href: "http://assets.example.com/avatar.jpg",
38
+ name: "avatar"
39
39
  }
40
40
  ]
41
41
  }
42
42
  ],
43
+ links: [
44
+ {
45
+ rel: "dashboard",
46
+ href: "http://example.com/my-dashboard",
47
+ name: "dashboard"
48
+ }
49
+ ],
43
50
  template: {
44
51
  data: [
45
52
  {
@@ -87,9 +94,9 @@ module CollectionJson
87
94
  ],
88
95
  links: [
89
96
  {
90
- rel: "dashboard",
91
- href: "http://example.com/my-dashboard",
92
- name: "dashboard"
97
+ rel: "avatar",
98
+ href: "http://assets.example.com/avatar.jpg",
99
+ name: "avatar"
93
100
  }
94
101
  ]
95
102
  },
@@ -107,13 +114,20 @@ module CollectionJson
107
114
  ],
108
115
  links: [
109
116
  {
110
- rel: "dashboard",
111
- href: "http://example.com/my-dashboard",
112
- name: "dashboard"
117
+ rel: "avatar",
118
+ href: "http://assets.example.com/avatar.jpg",
119
+ name: "avatar"
113
120
  }
114
121
  ]
115
122
  }
116
123
  ],
124
+ links: [
125
+ {
126
+ rel: "dashboard",
127
+ href: "http://example.com/my-dashboard",
128
+ name: "dashboard"
129
+ }
130
+ ],
117
131
  template: {
118
132
  data: [
119
133
  {
@@ -1,7 +1,9 @@
1
1
  class CustomItemLinksSerializer < CollectionJson::Serializer
2
- links dashboard: {
3
- href: "/my-dashboard",
4
- anything: "at all",
5
- whatever: "really"
2
+ items do
3
+ links dashboard: {
4
+ href: "/my-dashboard",
5
+ anything: "at all",
6
+ whatever: "really"
6
7
  }
8
+ end
7
9
  end
@@ -1,3 +1,5 @@
1
1
  class CustomItemSerializer < CollectionJson::Serializer
2
- attributes name: { anything: "at all", whatever: "really" }
2
+ items do
3
+ attributes name: { anything: "at all", whatever: "really" }
4
+ end
3
5
  end
@@ -1,7 +1,5 @@
1
1
  class UserSerializer < CollectionJson::Serializer
2
- href self: "http://example.com/users/{id}",
3
- collection: "http://example.com/users"
4
- attributes :name, :email
2
+ href "http://example.com/users"
5
3
  template :name, email: { prompt: "My email" }
6
4
  links dashboard: { href: "http://example.com/my-dashboard" }
7
5
  queries search: {
@@ -15,4 +13,10 @@ class UserSerializer < CollectionJson::Serializer
15
13
  { name: "page" }
16
14
  ]
17
15
  }
16
+
17
+ items do
18
+ href "http://example.com/users/{id}"
19
+ attributes :name, :email
20
+ links avatar: { href: "http://assets.example.com/avatar.jpg" }
21
+ end
18
22
  end
@@ -13,12 +13,12 @@ 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.attributes = []
17
16
  serializer.class.href = []
18
17
  serializer.class.links = []
19
18
  serializer.class.template = []
20
19
  serializer.class.queries = []
21
-
20
+ serializer.class.items {}
21
+ serializer.items.attributes = []
22
22
  serializer
23
23
  end
24
24
  end
@@ -14,15 +14,17 @@ module CollectionJson
14
14
  @item = Item.new(@user_serializer)
15
15
  end
16
16
 
17
- def test_that_rel_will_beadded_from_the_name_when_missing
17
+ def test_that_rel_will_be_added_from_the_name_when_missing
18
18
  serializer = empty_serializer_for(@user1)
19
- serializer.class.attributes = [:name]
20
- serializer.class.links = [dashboard: { href: "http://example.com" }]
19
+ serializer.items.attributes = [:name]
20
+ serializer.items.links = [avatar: {
21
+ href: "http://assets.example.com/avatar.jpg"
22
+ }]
21
23
  item = Item.new(serializer)
22
24
  actual = item.create[:links].first
23
25
 
24
26
  assert actual.include? :rel
25
- assert_equal "dashboard", actual[:rel]
27
+ assert_equal "avatar", actual[:rel]
26
28
  end
27
29
 
28
30
  def test_that_an_item_can_be_build
@@ -34,9 +36,9 @@ module CollectionJson
34
36
  ],
35
37
  links: [
36
38
  {
37
- rel: "dashboard",
38
- href: "http://example.com/my-dashboard",
39
- name: "dashboard"
39
+ rel: "avatar",
40
+ href: "http://assets.example.com/avatar.jpg",
41
+ name: "avatar"
40
42
  }
41
43
  ]
42
44
  }
@@ -56,9 +58,9 @@ module CollectionJson
56
58
  ],
57
59
  links: [
58
60
  {
59
- rel: "dashboard",
60
- href: "http://example.com/my-dashboard",
61
- name: "dashboard"
61
+ rel: "avatar",
62
+ href: "http://assets.example.com/avatar.jpg",
63
+ name: "avatar"
62
64
  }
63
65
  ]
64
66
  }
@@ -99,8 +101,10 @@ module CollectionJson
99
101
  end
100
102
 
101
103
  def test_that_unknown_attributes_are_silently_ignored
102
- serializer_with_unknown_attr = UnknownAttributeSerializer.new(@user1)
103
- item = Item.new(serializer_with_unknown_attr)
104
+ serializer = empty_serializer_for(@user1)
105
+ serializer.items.attributes(:unknown)
106
+ item = Item.new(serializer)
107
+
104
108
  refute item.create.include?(:unknown)
105
109
  end
106
110
  end
@@ -11,28 +11,15 @@ module CollectionJson
11
11
  end
12
12
 
13
13
  def test_href_object
14
- expected = [{
15
- self: "http://example.com/users/{id}",
16
- collection: "http://example.com/users"
17
- }]
18
- assert_equal expected, @user_serializer.class.href
14
+ assert_equal ["http://example.com/users"], @user_serializer.class.href
19
15
  end
20
16
 
21
17
  def test_that_only_one_href_value_is_passed_to_builder
22
- multiple_href_serializer = MultipleHrefSerializer.new(@user)
23
- assert_equal %w(/a /b /c), multiple_href_serializer.class.href
24
- assert_equal "/a", multiple_href_serializer.href
25
- end
26
-
27
- def test_that_a_placeholder_can_be_used_for_urls
28
- user_serializer = empty_serializer_for(@user)
29
- user_serializer.class.attributes = [:name]
30
- user_serializer.class.href = [self: "http://example.com/users/{id}"]
31
- builder = Builder.new(user_serializer)
18
+ serializer = empty_serializer_for(@user)
19
+ serializer.class.href = %w(/a /b /c)
32
20
 
33
- expected = "http://example.com/users/#{@user.id}"
34
- actual = builder.pack[:collection][:items].first[:href]
35
- assert_equal expected, actual
21
+ assert_equal %w(/a /b /c), serializer.class.href
22
+ assert_equal "/a", serializer.href
36
23
  end
37
24
  end
38
25
  end
@@ -2,14 +2,14 @@ require "minitest_helper"
2
2
 
3
3
  module CollectionJson
4
4
  class Serializer
5
- class TestData < Minitest::Test
5
+ class TestAttributes < Minitest::Test
6
6
  def setup
7
7
  @user = User.new(name: "Carles Jove", email: "hola@carlus.cat")
8
8
  @user_serializer = UserSerializer.new(@user)
9
9
  end
10
10
 
11
11
  def test_attributes_properties
12
- assert_equal [:name, :email], @user_serializer.class.attributes
12
+ assert_equal [:name, :email], @user_serializer.items.attributes
13
13
  end
14
14
 
15
15
  def test_that_any_attributes_can_be_passed
@@ -22,7 +22,7 @@ module CollectionJson
22
22
  }
23
23
  ]
24
24
 
25
- assert_equal expected, custom_serializer.class.attributes
25
+ assert_equal expected, custom_serializer.items.attributes
26
26
  end
27
27
  end
28
28
  end
@@ -0,0 +1,45 @@
1
+ require "minitest_helper"
2
+
3
+ module CollectionJson
4
+ class Serializer
5
+ class TestItemsHref < Minitest::Test
6
+ include TestHelper
7
+
8
+ def setup
9
+ @user = User.new(name: "Carles Jove", email: "hola@carlus.cat")
10
+ @user_serializer = UserSerializer.new(@user)
11
+ end
12
+
13
+ def test_href_object
14
+ expected = "http://example.com/users/{id}"
15
+ assert_equal expected, @user_serializer.items.href
16
+ end
17
+
18
+ def test_that_only_one_href_is_passed_if_multiple_strings
19
+ multiple_href_serializer = empty_serializer_for(@user)
20
+ multiple_href_serializer.items.href("/a", "/b", "/c")
21
+
22
+ assert_equal "/a", multiple_href_serializer.items.href
23
+ end
24
+
25
+ def test_that_only_one_href_is_passed_if_an_array
26
+ multiple_href_serializer = empty_serializer_for(@user)
27
+ multiple_href_serializer.items.href(%w(/a /b /c))
28
+
29
+ assert_equal "/a", multiple_href_serializer.items.href
30
+ end
31
+
32
+ def test_that_a_placeholder_can_be_used_for_urls
33
+ user_serializer = empty_serializer_for(@user)
34
+ user_serializer.items.attributes = [:name]
35
+ user_serializer.items.href("http://example.com/users/{id}")
36
+ builder = Builder.new(user_serializer)
37
+
38
+ expected = "http://example.com/users/#{@user.id}"
39
+ actual = builder.pack[:collection][:items].first[:href]
40
+
41
+ assert_equal expected, actual
42
+ end
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,20 @@
1
+ require "minitest_helper"
2
+
3
+ module CollectionJson
4
+ class Serializer
5
+ class TestLinks < 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_links_properties
12
+ expected = { avatar: {
13
+ href: "http://assets.example.com/avatar.jpg"
14
+ } }
15
+
16
+ assert_equal [expected], @user_serializer.items.links
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,24 @@
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
@@ -3,6 +3,8 @@ require "minitest_helper"
3
3
  module CollectionJson
4
4
  class Serializer
5
5
  class TestLinks < Minitest::Test
6
+ include TestHelper
7
+
6
8
  def setup
7
9
  @user = User.new(name: "Carles Jove", email: "hola@carlus.cat")
8
10
  @user_serializer = UserSerializer.new(@user)
@@ -14,9 +16,15 @@ module CollectionJson
14
16
  end
15
17
 
16
18
  def test_item_links_attributes_can_take_unlimited_properties
17
- custom_serializer = CustomItemLinksSerializer.new(@user)
18
- expected = [dashboard: { href: "/my-dashboard", anything: "at all", whatever: "really" }]
19
- assert_equal expected, custom_serializer.class.links
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
20
28
  end
21
29
  end
22
30
  end
@@ -77,7 +77,7 @@ module CollectionJson
77
77
 
78
78
  # Attributes
79
79
  def test_that_invalid_attributes_return_values_generate_errors
80
- @invalid.class.attributes = [:name]
80
+ @invalid.items.attributes = [:name]
81
81
 
82
82
  @invalid_value_types.each do |invalidate|
83
83
  @user.name = invalidate
@@ -92,7 +92,7 @@ module CollectionJson
92
92
 
93
93
  def test_that_invalid_attributes_properties_values_generate_errors
94
94
  @invalid_value_types.each do |invalidate|
95
- @invalid.class.attributes = [
95
+ @invalid.items.attributes = [
96
96
  name: {
97
97
  prompt: invalidate,
98
98
  test: invalidate
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.2.0
4
+ version: 0.3.0
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: 2014-12-19 00:00:00.000000000 Z
11
+ date: 2015-01-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -85,6 +85,7 @@ files:
85
85
  - lib/collection_json_serializer/builder.rb
86
86
  - lib/collection_json_serializer/core_ext/hash.rb
87
87
  - lib/collection_json_serializer/core_ext/symbol.rb
88
+ - lib/collection_json_serializer/items.rb
88
89
  - lib/collection_json_serializer/objects/item.rb
89
90
  - lib/collection_json_serializer/objects/query.rb
90
91
  - lib/collection_json_serializer/objects/template.rb
@@ -101,16 +102,17 @@ files:
101
102
  - test/fixtures/serializers/custom_item_serializer.rb
102
103
  - test/fixtures/serializers/custom_template_serializer.rb
103
104
  - test/fixtures/serializers/invalid_serializer.rb
104
- - test/fixtures/serializers/multiple_href_serializer.rb
105
- - test/fixtures/serializers/unknown_attribute_serializer.rb
106
105
  - test/fixtures/serializers/user_serializer.rb
107
106
  - test/fixtures/serializers/valid_serializer.rb
108
107
  - test/minitest_helper.rb
109
108
  - test/objects/item_test.rb
110
109
  - test/objects/queries_test.rb
111
110
  - test/objects/template_test.rb
112
- - test/serializer/data_test.rb
113
111
  - test/serializer/href_test.rb
112
+ - test/serializer/items/attributes_test.rb
113
+ - test/serializer/items/href_test.rb
114
+ - test/serializer/items/links_test.rb
115
+ - test/serializer/items_test.rb
114
116
  - test/serializer/links_test.rb
115
117
  - test/serializer/queries_test.rb
116
118
  - test/serializer/template_test.rb
@@ -152,16 +154,17 @@ test_files:
152
154
  - test/fixtures/serializers/custom_item_serializer.rb
153
155
  - test/fixtures/serializers/custom_template_serializer.rb
154
156
  - test/fixtures/serializers/invalid_serializer.rb
155
- - test/fixtures/serializers/multiple_href_serializer.rb
156
- - test/fixtures/serializers/unknown_attribute_serializer.rb
157
157
  - test/fixtures/serializers/user_serializer.rb
158
158
  - test/fixtures/serializers/valid_serializer.rb
159
159
  - test/minitest_helper.rb
160
160
  - test/objects/item_test.rb
161
161
  - test/objects/queries_test.rb
162
162
  - test/objects/template_test.rb
163
- - test/serializer/data_test.rb
164
163
  - test/serializer/href_test.rb
164
+ - test/serializer/items/attributes_test.rb
165
+ - test/serializer/items/href_test.rb
166
+ - test/serializer/items/links_test.rb
167
+ - test/serializer/items_test.rb
165
168
  - test/serializer/links_test.rb
166
169
  - test/serializer/queries_test.rb
167
170
  - test/serializer/template_test.rb
@@ -1,3 +0,0 @@
1
- class MultipleHrefSerializer < CollectionJson::Serializer
2
- href "/a", "/b", "/c"
3
- end
@@ -1,3 +0,0 @@
1
- class UnknownAttributeSerializer < CollectionJson::Serializer
2
- attributes :unknown
3
- end