oat 0.2.3 → 0.2.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 557a927aa61099a4c1e3eb84c7cb4520247cb8ff
4
- data.tar.gz: ba7fd708868211a749732afd0d8e48b2f3fde252
3
+ metadata.gz: 4fc6d823ab477ce6ea91958585093f23afb9d0d2
4
+ data.tar.gz: 84bf255fd575dd07ad62d6e942c8948ec44b20f0
5
5
  SHA512:
6
- metadata.gz: e6ada6ca09572536681a11853b3958e676893cce4508f35006c33ad56e11ea4eb5f35e4bf3f436156be98b800af92efd935dae252cd4b89fcb9e5a4333a48134
7
- data.tar.gz: 7bb01a60f853efd5fe8b7a7457565fe7bd41e8716ba6c80841abc9195442034d5ed1b6610a34d295da73b37391beaff0072fc7fc295eaaea81e595057de797b9
6
+ metadata.gz: 4ac3ea124a6cc06fcd3e21130e0ad99af95a59e92c113f8596298a093cc3bc34c879efb36a815ac0b388a77e231beecc8de8306bb2f12722d64c5bd7d17e7286
7
+ data.tar.gz: cf27b4fd9ca4dcb4d6b7e6d335d5d1055ee643b4f1a6e94d808724cbfa15d50d0120cba18b34e23cc1332df1bd259957920bdda06290ac1dcb70e3e5fb383c58
data/lib/oat/adapter.rb CHANGED
@@ -28,7 +28,7 @@ module Oat
28
28
  serializer_class = Class.new(serializer.class)
29
29
  serializer_class.adapter self.class
30
30
  s = serializer_class.new(obj, serializer.context.merge(context_options), serializer.adapter_class, serializer.top)
31
- serializer.top.instance_exec(obj, s, &block)
31
+ serializer.instance_exec(obj, s, &block)
32
32
  s.to_hash
33
33
  else
34
34
  serializer_class.new(obj, serializer.context.merge(context_options), serializer.adapter_class, serializer.top).to_hash
@@ -23,6 +23,7 @@ module Oat
23
23
  serializer_from_block_or_class(obj, serializer_class, context_options, &block)
24
24
  end
25
25
  end
26
+ alias_method :collection, :entities
26
27
 
27
28
  end
28
29
  end
@@ -17,7 +17,7 @@ module Oat
17
17
  end
18
18
 
19
19
  def type(*types)
20
- @root_name = types.first.to_s
20
+ @root_name = types.first.to_s.pluralize.to_sym
21
21
  end
22
22
 
23
23
  def link(rel, opts = {})
@@ -33,11 +33,11 @@ module Oat
33
33
  end
34
34
 
35
35
  def entity(name, obj, serializer_class = nil, context_options = {}, &block)
36
- @entities[name.to_s.pluralize.to_sym] ||= []
37
36
  ent = serializer_from_block_or_class(obj, serializer_class, context_options, &block)
37
+ entity_hash[name.to_s.pluralize.to_sym] ||= []
38
38
  if ent
39
39
  link name, :href => ent[:id]
40
- @entities[name.to_s.pluralize.to_sym] << ent
40
+ entity_hash[name.to_s.pluralize.to_sym] << ent
41
41
  end
42
42
  end
43
43
 
@@ -46,21 +46,36 @@ module Oat
46
46
  data[:links][link_name] = []
47
47
 
48
48
  collection.each do |obj|
49
- @entities[link_name] ||= []
49
+ entity_hash[link_name] ||= []
50
50
  ent = serializer_from_block_or_class(obj, serializer_class, context_options, &block)
51
51
  if ent
52
52
  data[:links][link_name] << ent[:id]
53
- @entities[link_name] << ent
53
+ entity_hash[link_name] << ent
54
54
  end
55
55
  end
56
56
  end
57
57
 
58
+ def collection(name, collection, serializer_class = nil, context_options = {}, &block)
59
+ @treat_as_resource_collection = true
60
+ data[:resource_collection] = [] unless data[:resource_collection].is_a?(Array)
61
+
62
+ collection.each do |obj|
63
+ ent = serializer_from_block_or_class(obj, serializer_class, context_options, &block)
64
+ data[:resource_collection] << ent if ent
65
+ end
66
+ end
67
+
58
68
  def to_hash
59
69
  raise "JSON API entities MUST define a type. Use type 'user' in your serializers" unless root_name
60
70
  if serializer.top != serializer
61
71
  return data
62
72
  else
63
- h = {root_name.pluralize.to_sym => [data]}
73
+ h = {}
74
+ if @treat_as_resource_collection
75
+ h[root_name] = data[:resource_collection]
76
+ else
77
+ h[root_name] = [data]
78
+ end
64
79
  h[:linked] = @entities if @entities.keys.any?
65
80
  return h
66
81
  end
@@ -70,6 +85,14 @@ module Oat
70
85
 
71
86
  attr_reader :root_name
72
87
 
88
+ def entity_hash
89
+ if serializer.top == serializer
90
+ @entities
91
+ else
92
+ serializer.top.adapter.entity_hash
93
+ end
94
+ end
95
+
73
96
  end
74
97
  end
75
98
  end
@@ -36,6 +36,7 @@ module Oat
36
36
  entity name, obj, serializer_class, context_options, &block
37
37
  end
38
38
  end
39
+ alias_method :collection, :entities
39
40
 
40
41
  def action(name, &block)
41
42
  action = Action.new(name)
@@ -15,7 +15,7 @@ module Oat
15
15
  end
16
16
 
17
17
  def self.warn(msg)
18
- logger ? logger.warning(msg) : puts(msg)
18
+ logger ? logger.warning(msg) : Kernel.warn(msg)
19
19
  end
20
20
 
21
21
  attr_reader :item, :context, :adapter_class, :adapter
data/lib/oat/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Oat
2
- VERSION = "0.2.3"
2
+ VERSION = "0.2.4"
3
3
  end
@@ -9,60 +9,11 @@ describe Oat::Adapters::JsonAPI do
9
9
  let(:hash) { serializer.to_hash }
10
10
 
11
11
  describe '#to_hash' do
12
- it 'produces a JSON-API compliant hash' do
13
- # the user being serialized
14
- users = hash.fetch(:users)
15
- expect(users.size).to be 1
16
- expect(users.first).to include(
17
- :id => user.id,
18
- :name => user.name,
19
- :age => user.age,
20
- :controller_name => 'some_controller',
21
- :message_from_above => nil
22
- )
23
-
24
- expect(users.first.fetch(:links)).to include(
25
- :self => "http://foo.bar.com/#{user.id}",
26
- # these links are added by embedding entities
27
- :manager => manager.id,
28
- :friends => [friend.id]
29
- )
30
-
31
- # embedded friends
32
- linked_friends = hash.fetch(:linked).fetch(:friends)
33
- expect(linked_friends.size).to be 1
34
- expect(linked_friends.first).to include(
35
- :id => friend.id,
36
- :name => friend.name,
37
- :age => friend.age,
38
- :controller_name => 'some_controller',
39
- :message_from_above => "Merged into parent's context"
40
- )
41
-
42
- expect(linked_friends.first.fetch(:links)).to include(
43
- :self => "http://foo.bar.com/#{friend.id}",
44
- :empty => nil,
45
- :friends => []
46
- )
47
-
48
- # embedded manager
49
- linked_managers = hash.fetch(:linked).fetch(:managers)
50
- expect(linked_managers.size).to be 1
51
- expect(linked_managers.first).to include(
52
- :id => manager.id,
53
- :name => manager.name,
54
- :age => manager.age,
55
- :links => { :self => "http://foo.bar.com/#{manager.id}" }
56
- )
57
- end
58
-
59
- context 'with a nil entity relationship' do
60
- let(:manager) { nil }
12
+ context 'top level' do
13
+ subject(:users){ hash.fetch(:users) }
14
+ its(:size) { should eq(1) }
61
15
 
62
- it 'produces a JSON-API compliant hash' do
63
- # the user being serialized
64
- users = hash.fetch(:users)
65
- expect(users.size).to be 1
16
+ it 'contains the correct user properties' do
66
17
  expect(users.first).to include(
67
18
  :id => user.id,
68
19
  :name => user.name,
@@ -70,33 +21,151 @@ describe Oat::Adapters::JsonAPI do
70
21
  :controller_name => 'some_controller',
71
22
  :message_from_above => nil
72
23
  )
24
+ end
73
25
 
74
- expect(users.first.fetch(:links)).not_to include(:manager)
26
+ it 'contains the correct user links' do
75
27
  expect(users.first.fetch(:links)).to include(
76
28
  :self => "http://foo.bar.com/#{user.id}",
77
29
  # these links are added by embedding entities
30
+ :manager => manager.id,
78
31
  :friends => [friend.id]
79
32
  )
80
- # embedded friends
81
- linked_friends = hash.fetch(:linked).fetch(:friends)
82
- expect(linked_friends.size).to be 1
83
- expect(linked_friends.first).to include(
84
- :id => friend.id,
85
- :name => friend.name,
86
- :age => friend.age,
87
- :controller_name => 'some_controller',
88
- :message_from_above => "Merged into parent's context"
89
- )
33
+ end
34
+ end
90
35
 
91
- expect(linked_friends.first.fetch(:links)).to include(
92
- :self => "http://foo.bar.com/#{friend.id}",
93
- :empty => nil,
94
- :friends => []
95
- )
36
+ context 'linked' do
37
+ context 'using #entities' do
38
+ subject(:linked_friends){ hash.fetch(:linked).fetch(:friends) }
39
+
40
+ its(:size) { should eq(1) }
41
+
42
+ it 'contains the correct properties' do
43
+ expect(linked_friends.first).to include(
44
+ :id => friend.id,
45
+ :name => friend.name,
46
+ :age => friend.age,
47
+ :controller_name => 'some_controller',
48
+ :message_from_above => "Merged into parent's context"
49
+ )
50
+ end
51
+
52
+ it 'contains the correct links' do
53
+ expect(linked_friends.first.fetch(:links)).to include(
54
+ :self => "http://foo.bar.com/#{friend.id}",
55
+ :empty => nil,
56
+ :friends => []
57
+ )
58
+ end
59
+ end
60
+
61
+ context 'using #entity' do
62
+ subject(:linked_managers){ hash.fetch(:linked).fetch(:managers) }
63
+ its(:size) { should eq(1) }
64
+
65
+ it "contains the correct properties and links" do
66
+ expect(linked_managers.first).to include(
67
+ :id => manager.id,
68
+ :name => manager.name,
69
+ :age => manager.age,
70
+ :links => { :self => "http://foo.bar.com/#{manager.id}" }
71
+ )
72
+ end
73
+ end
74
+
75
+ context 'with nested entities' do
76
+ let(:friend) { user_class.new('Joe', 33, 2, [other_friend]) }
77
+ let(:other_friend) { user_class.new('Jack', 28, 4, []) }
78
+
79
+ subject(:linked_friends){ hash.fetch(:linked).fetch(:friends) }
80
+ its(:size) { should eq(2) }
81
+
82
+ it 'has the correct entities' do
83
+ linked_friends.map{ |friend| friend.fetch(:id) }.should include(2, 4)
84
+ end
85
+ end
86
+ end
87
+
88
+ context 'with a nil entity relationship' do
89
+ let(:manager) { nil }
90
+ let(:users) { hash.fetch(:users) }
96
91
 
97
- # embedded manager
92
+ it 'excludes the entity from user links' do
93
+ expect(users.first.fetch(:links)).not_to include(:manager)
94
+ end
95
+
96
+ it 'excludes the entity from the linked hash' do
98
97
  hash.fetch(:linked).fetch(:managers).should be_empty
99
98
  end
100
99
  end
100
+
101
+ context 'with an entity collection' do
102
+ let(:serializer_collection_class) do
103
+ USER_SERIALIZER = serializer_class unless defined?(USER_SERIALIZER)
104
+ Class.new(Oat::Serializer) do
105
+ schema do
106
+ type 'users'
107
+ collection :users, item, USER_SERIALIZER
108
+ end
109
+ end
110
+ end
111
+
112
+ let(:collection_serializer){
113
+ serializer_collection_class.new(
114
+ [user,friend],
115
+ {:name => "some_controller"},
116
+ Oat::Adapters::JsonAPI
117
+ )
118
+ }
119
+ let(:collection_hash) { collection_serializer.to_hash }
120
+
121
+ context 'top level' do
122
+ subject(:users){ collection_hash.fetch(:users) }
123
+ its(:size) { should eq(2) }
124
+
125
+ it 'contains the correct first user properties' do
126
+ expect(users[0]).to include(
127
+ :id => user.id,
128
+ :name => user.name,
129
+ :age => user.age,
130
+ :controller_name => 'some_controller',
131
+ :message_from_above => nil
132
+ )
133
+ end
134
+
135
+ it 'contains the correct second user properties' do
136
+ expect(users[1]).to include(
137
+ :id => friend.id,
138
+ :name => friend.name,
139
+ :age => friend.age,
140
+ :controller_name => 'some_controller',
141
+ :message_from_above => nil
142
+ )
143
+ end
144
+
145
+ it 'contains the correct user links' do
146
+ expect(users.first.fetch(:links)).to include(
147
+ :self => "http://foo.bar.com/#{user.id}",
148
+ # these links are added by embedding entities
149
+ :manager => manager.id,
150
+ :friends => [friend.id]
151
+ )
152
+ end
153
+
154
+ context 'sub entity' do
155
+ subject(:linked_managers){ collection_hash.fetch(:linked).fetch(:managers) }
156
+ its(:size) { should eq(1) }
157
+
158
+ it "contains the correct properties and links" do
159
+ expect(linked_managers.first).to include(
160
+ :id => manager.id,
161
+ :name => manager.name,
162
+ :age => manager.age,
163
+ :links => { :self => "http://foo.bar.com/#{manager.id}" }
164
+ )
165
+ end
166
+ end
167
+ end
168
+
169
+ end
101
170
  end
102
171
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: oat
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.3
4
+ version: 0.2.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ismael Celis
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-02-17 00:00:00.000000000 Z
11
+ date: 2014-02-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport