oat 0.4.5 → 0.4.6

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: b99c27fce884d038d2dcb994993171a221fe9207
4
- data.tar.gz: 6c1d130acce638a3387a99f029925e38a5483c51
3
+ metadata.gz: a56613cc3b7d20d015369d97b0690153f7dcadf9
4
+ data.tar.gz: 2f786daef5e0b151100f7da50facb9654b31110d
5
5
  SHA512:
6
- metadata.gz: b1f2ee9f1645746fda92ebe645083071c0cb2867766fa35ff8cc2b63a14aa297975035e02dbdf6bd5dfd2707d6acd4c15a2ab9b187cc23ea5f1ba30a48fcea81
7
- data.tar.gz: cba99539507beaaa10e87339ccdf2b1dcd3ce13431b0651e1ff18ac2b13f788a8a812b09921efa7f01b478d3beff91e53c75ce170539550b396e04ad4ae9e38f
6
+ metadata.gz: fcedb948f276b849b4252a3955e8deac185062d5130154f188a252bb653a390cbd37b9a19fe11609b7eaa6fb4ef6f1e09dd7a9d37bc71870bdc90a519be69ed6
7
+ data.tar.gz: 70e5907449c358f1ebaa2b386b886abc37623b46200c785fc32202997d16bac2201a3323ebec0c9bdeb99ca20670c916448fe3c41c68fcc976737f0983782c16
data/.travis.yml CHANGED
@@ -6,7 +6,6 @@ rvm:
6
6
  - 1.9.2
7
7
  - 1.8.7
8
8
  - jruby-1.7.11
9
- - rbx-2.2.9
10
9
 
11
10
  gemfile:
12
11
  - gemfiles/Gemfile.as-3.0.x
data/CHANGELOG.md ADDED
@@ -0,0 +1,121 @@
1
+ # Changelog
2
+
3
+ ## [v0.4.5](https://github.com/ismasan/oat/tree/v0.4.5)
4
+ [Full Changelog](https://github.com/ismasan/oat/compare/v0.4.4...v0.4.5)
5
+ #### 09/07/14
6
+ - *Merged pull-request:* Fix serializer ampersand warning [\#43](https://github.com/ismasan/oat/pull/43) ([iainbeeston](https://github.com/iainbeeston))
7
+
8
+ - *Merged pull-request:* Update build matrix [\#42](https://github.com/ismasan/oat/pull/42) ([iainbeeston](https://github.com/iainbeeston))
9
+
10
+ - *Merged pull-request:* Update to rspec3 [\#41](https://github.com/ismasan/oat/pull/41) ([iainbeeston](https://github.com/iainbeeston))
11
+
12
+ - *Closed issue:* Thread Safety [\#39](https://github.com/ismasan/oat/issues/39)
13
+
14
+ ## [v0.4.4](https://github.com/ismasan/oat/tree/v0.4.4)
15
+ [Full Changelog](https://github.com/ismasan/oat/compare/v0.4.3...v0.4.4)
16
+ #### 26/05/14
17
+ - *Merged pull-request:* Add title addribute to siren action's fields [\#38](https://github.com/ismasan/oat/pull/38) ([erezesk](https://github.com/erezesk))
18
+
19
+ - *Closed issue:* Top level json api meta [\#28](https://github.com/ismasan/oat/issues/28)
20
+
21
+ ## [v0.4.3](https://github.com/ismasan/oat/tree/v0.4.3)
22
+ [Full Changelog](https://github.com/ismasan/oat/compare/v0.4.2...v0.4.3)
23
+ #### 01/05/14
24
+ - *Merged pull-request:* json-api: Don't add templated links to the resource [\#37](https://github.com/ismasan/oat/pull/37) ([kjg](https://github.com/kjg))
25
+
26
+ ## [v0.4.2](https://github.com/ismasan/oat/tree/v0.4.2)
27
+ [Full Changelog](https://github.com/ismasan/oat/compare/v0.4.1...v0.4.2)
28
+ #### 29/04/14
29
+ - *Merged pull-request:* Add type attribute for siren actions [\#36](https://github.com/ismasan/oat/pull/36) ([erezesk](https://github.com/erezesk))
30
+
31
+ - *Closed issue:* Errors management [\#35](https://github.com/ismasan/oat/issues/35)
32
+
33
+ ## [v0.4.1](https://github.com/ismasan/oat/tree/v0.4.1)
34
+ [Full Changelog](https://github.com/ismasan/oat/compare/v0.4.0...v0.4.1)
35
+ #### 25/04/14
36
+ - *Merged pull-request:* Add meta property [\#32](https://github.com/ismasan/oat/pull/32) ([ahx](https://github.com/ahx))
37
+
38
+ ## [v0.4.0](https://github.com/ismasan/oat/tree/v0.4.0)
39
+ [Full Changelog](https://github.com/ismasan/oat/compare/v0.3.0...v0.4.0)
40
+ #### 07/04/14
41
+ - *Merged pull-request:* Don't block NoMethodErrors from raising [\#31](https://github.com/ismasan/oat/pull/31) ([shekibobo](https://github.com/shekibobo))
42
+
43
+ - *Closed issue:* Does this support any type of caching? [\#30](https://github.com/ismasan/oat/issues/30)
44
+
45
+ ## [v0.3.0](https://github.com/ismasan/oat/tree/v0.3.0)
46
+ [Full Changelog](https://github.com/ismasan/oat/compare/v0.2.5...v0.3.0)
47
+ #### 25/03/14
48
+ - *Merged pull-request:* Don't allow rake 10.2 on ruby 1.8.7 [\#29](https://github.com/ismasan/oat/pull/29) ([kjg](https://github.com/kjg))
49
+
50
+ - *Merged pull-request:* Json api link templates [\#27](https://github.com/ismasan/oat/pull/27) ([kjg](https://github.com/kjg))
51
+
52
+ - *Merged pull-request:* Json api attribute links [\#26](https://github.com/ismasan/oat/pull/26) ([kjg](https://github.com/kjg))
53
+
54
+ - *Merged pull-request:* Serializer from block or class update [\#16](https://github.com/ismasan/oat/pull/16) ([kjg](https://github.com/kjg))
55
+
56
+ - *Closed issue:* How to serialize many records? [\#24](https://github.com/ismasan/oat/issues/24)
57
+
58
+ ## [v0.2.5](https://github.com/ismasan/oat/tree/v0.2.5)
59
+ [Full Changelog](https://github.com/ismasan/oat/compare/v0.2.4...v0.2.5)
60
+ #### 20/03/14
61
+ - *Merged pull-request:* Json api nil entities [\#25](https://github.com/ismasan/oat/pull/25) ([kjg](https://github.com/kjg))
62
+
63
+ ## [v0.2.4](https://github.com/ismasan/oat/tree/v0.2.4)
64
+ [Full Changelog](https://github.com/ismasan/oat/compare/v0.2.3...v0.2.4)
65
+ #### 24/02/14
66
+ - *Merged pull-request:* Allow for serializing json api resource collections into root key [\#23](https://github.com/ismasan/oat/pull/23) ([kjg](https://github.com/kjg))
67
+
68
+ - *Merged pull-request:* Json api subent top linked [\#22](https://github.com/ismasan/oat/pull/22) ([kjg](https://github.com/kjg))
69
+
70
+ ## [v0.2.3](https://github.com/ismasan/oat/tree/v0.2.3)
71
+ [Full Changelog](https://github.com/ismasan/oat/compare/v0.2.2...v0.2.3)
72
+ #### 17/02/14
73
+ - *Merged pull-request:* Json api sub behaviour [\#20](https://github.com/ismasan/oat/pull/20) ([kjg](https://github.com/kjg))
74
+
75
+ - *Merged pull-request:* Add version badge to README [\#18](https://github.com/ismasan/oat/pull/18) ([shekibobo](https://github.com/shekibobo))
76
+
77
+ ## [v0.2.2](https://github.com/ismasan/oat/tree/v0.2.2)
78
+ [Full Changelog](https://github.com/ismasan/oat/compare/v0.1.2...v0.2.2)
79
+ #### 17/02/14
80
+ - *Merged pull-request:* Test more combinations in travis [\#17](https://github.com/ismasan/oat/pull/17) ([kjg](https://github.com/kjg))
81
+
82
+ - *Merged pull-request:* Make specs more accurate and using updated syntax [\#15](https://github.com/ismasan/oat/pull/15) ([shekibobo](https://github.com/shekibobo))
83
+
84
+ - *Merged pull-request:* Better Context [\#14](https://github.com/ismasan/oat/pull/14) ([shekibobo](https://github.com/shekibobo))
85
+
86
+ - *Merged pull-request:* Less active support [\#11](https://github.com/ismasan/oat/pull/11) ([kjg](https://github.com/kjg))
87
+
88
+ - *Closed issue:* Remove activesupport dependency [\#10](https://github.com/ismasan/oat/issues/10)
89
+
90
+ ## [v0.1.2](https://github.com/ismasan/oat/tree/v0.1.2)
91
+ [Full Changelog](https://github.com/ismasan/oat/compare/v0.1.1...v0.1.2)
92
+ #### 13/02/14
93
+ - *Merged pull-request:* Support ruby 1.8.7 [\#12](https://github.com/ismasan/oat/pull/12) ([kjg](https://github.com/kjg))
94
+
95
+ - *Closed issue:* Serializing collections [\#9](https://github.com/ismasan/oat/issues/9)
96
+
97
+ ## [v0.1.1](https://github.com/ismasan/oat/tree/v0.1.1)
98
+ [Full Changelog](https://github.com/ismasan/oat/compare/v0.1.0...v0.1.1)
99
+ #### 26/01/14
100
+ - *Merged pull-request:* Don't add invalid link relations to HAL output [\#8](https://github.com/ismasan/oat/pull/8) ([shekibobo](https://github.com/shekibobo))
101
+
102
+ ## [v0.1.0](https://github.com/ismasan/oat/tree/v0.1.0)
103
+ [Full Changelog](https://github.com/ismasan/oat/compare/v0.0.1...v0.1.0)
104
+ #### 14/01/14
105
+ - *Merged pull-request:* Add Serializer#map\_properties to DRY property definitions [\#6](https://github.com/ismasan/oat/pull/6) ([shekibobo](https://github.com/shekibobo))
106
+
107
+ - *Merged pull-request:* Add action support for Siren. [\#4](https://github.com/ismasan/oat/pull/4) ([SebastianEdwards](https://github.com/SebastianEdwards))
108
+
109
+ - *Merged pull-request:* Don't try to serialize nil with an entity serializer [\#3](https://github.com/ismasan/oat/pull/3) ([shekibobo](https://github.com/shekibobo))
110
+
111
+ - *Merged pull-request:* Fix a small typo in the README [\#2](https://github.com/ismasan/oat/pull/2) ([stevenharman](https://github.com/stevenharman))
112
+
113
+ - *Closed issue:* DRY property declaration [\#5](https://github.com/ismasan/oat/issues/5)
114
+
115
+ ## [v0.0.1](https://github.com/ismasan/oat/tree/v0.0.1)
116
+ #### 18/11/13
117
+ - *Merged pull-request:* Fix a few spelling and grammar errors [\#1](https://github.com/ismasan/oat/pull/1) ([leemachin](https://github.com/leemachin))
118
+
119
+
120
+
121
+ \* *This changelog was generated by [github_changelog_generator](https://github.com/skywinder/Github-Changelog-Generator)*
data/README.md CHANGED
@@ -162,7 +162,7 @@ adapter Oat::Adapters::Siren
162
162
  ```
163
163
  At the moment Oat ships with adapters for [HAL](http://stateless.co/hal_specification.html), [Siren](https://github.com/kevinswiber/siren) and [JsonAPI](http://jsonapi.org/), but it's easy to write your own.
164
164
 
165
- Note: Oat adapters are not *required* by default. Your code should explicitely require the ones it needs:
165
+ Note: Oat adapters are not *required* by default. Your code should explicitly require the ones it needs:
166
166
 
167
167
  ```ruby
168
168
  # HAL
@@ -183,7 +183,7 @@ ProductSerializer.new(product, nil, Oat::Adapters::HAL)
183
183
 
184
184
  That means that your app could switch adapters on run time depending, for example, on the request's `Accept` header or anything you need.
185
185
 
186
- Note: a different library could be written to make adapter-switching auto-magical for different frameworks, for example using [Responders](http://api.rubyonrails.org/classes/ActionController/Responder.html) in Rails.
186
+ Note: a different library could be written to make adapter-switching auto-magical for different frameworks, for example using [Responders](http://api.rubyonrails.org/classes/ActionController/Responder.html) in Rails. Also see [Rails Integration](#rails-integration).
187
187
 
188
188
  ## Nested serializers
189
189
 
@@ -198,8 +198,10 @@ class AccountSerializer < Oat::Serializer
198
198
  property :status, item.status
199
199
  # user entities
200
200
  entities :users, item.users do |user, user_serializer|
201
- user_serializer.name user.name
202
- user_serializer.email user.email
201
+ user_serializer.properties do |props|
202
+ props.name user.name
203
+ props.email user.email
204
+ end
203
205
  end
204
206
  end
205
207
  end
@@ -277,6 +279,12 @@ The way sub-entities are rendered in the final payload is up to the adapter. In
277
279
  }
278
280
  ```
279
281
 
282
+ ## Nested serializers when using the `JsonAPI` adapter
283
+
284
+ Collections are easy to express in HAL and Siren because they're no different from any other "entity". JsonAPI, however, doesn't work that way. In JsonAPI there's a distinction between "side-loaded" entities and the collection that is the subject of the resource. For this reason a `collection` method was added to the Oat DSL specifically for use with the `JsonAPI` adapter.
285
+
286
+ In the `HAL` and `Siren` adapters, `collection` is aliased to `entities`, but in the `JsonAPI` adapter, it sets the resource's main collection array as per the spec. `entities` keep the current behaviour of side-loading entities in the resource.
287
+
280
288
  ## Subclassing
281
289
 
282
290
  Serializers can be subclassed, for example if you want all your serializers to share the same adapter or add shared helper methods.
@@ -577,6 +585,68 @@ The result for the SocialHalAdapter is:
577
585
 
578
586
  You can take a look at [the built-in Hypermedia adapters](https://github.com/ismasan/oat/tree/master/lib/oat/adapters) for guidance.
579
587
 
588
+ ## Rails Integration
589
+ The Rails responder functionality works out of the box with Oat when the
590
+ requests specify JSON as their response format via a header
591
+ `Accept: application/json` or query parameter `format=json`.
592
+
593
+ However, if you want to also support the mime type of your Hypermedia
594
+ format of choice, it will require a little bit of code.
595
+
596
+ The example below uses Siren, but the same pattern can be used for HAL and
597
+ JsonAPI.
598
+
599
+ Register the Siren mime-type and a responder:
600
+
601
+ ```ruby
602
+ # config/initializers/oat.rb
603
+ Mime::Type.register 'application/vnd.siren+json', :siren
604
+
605
+ ActionController::Renderers.add :siren do |resource, options|
606
+ self.content_type ||= Mime[:siren]
607
+ resource.to_siren
608
+ end
609
+ ```
610
+
611
+ In your controller, add `:siren` to the `respond_to`:
612
+
613
+ ```ruby
614
+ class UsersController < ApplicationController
615
+ respond_to :siren, :json
616
+
617
+ def show
618
+ user = User.find(params[:id])
619
+ respond_with UserSerializer.new(user)
620
+ end
621
+ end
622
+ ```
623
+
624
+ Finally, add a `to_siren` method to your serializer:
625
+
626
+ ```ruby
627
+ class UserSerializer < Oat::Serializer
628
+ adapter Oat::Adapters::Siren
629
+
630
+ schema do
631
+ property :name, item.name
632
+ property :email, item.name
633
+ end
634
+
635
+ def to_siren
636
+ to_json
637
+ end
638
+ end
639
+ ```
640
+
641
+ Now http requests that specify the Siren mime type will work as
642
+ expected.
643
+
644
+ **NOTE**
645
+ The key thing that makes this all hang together is that the
646
+ object passed to `respond_with` implements a `to_FORMAT` method, where
647
+ `FORMAT` is the symbol used to register the mime type and responder
648
+ (`:siren`). Without it, Rails will not invoke your responder block.
649
+
580
650
  ## Installation
581
651
 
582
652
  Add this line to your application's Gemfile:
@@ -3,7 +3,11 @@ module Oat
3
3
  module Adapters
4
4
  class HAL < Oat::Adapter
5
5
  def link(rel, opts = {})
6
- data[:_links][rel] = opts if opts[:href]
6
+ if opts.is_a?(Array)
7
+ data[:_links][rel] = opts.select { |link_obj| link_obj.include?(:href) }
8
+ else
9
+ data[:_links][rel] = opts if opts[:href]
10
+ end
7
11
  end
8
12
 
9
13
  def properties(&block)
@@ -16,19 +20,30 @@ module Oat
16
20
 
17
21
  alias_method :meta, :property
18
22
 
23
+ def rel(rels)
24
+ # no-op to maintain interface compatibility with the Siren adapter
25
+ end
26
+
19
27
  def entity(name, obj, serializer_class = nil, context_options = {}, &block)
20
28
  entity_serializer = serializer_from_block_or_class(obj, serializer_class, context_options, &block)
21
- data[:_embedded][name] = entity_serializer ? entity_serializer.to_hash : nil
29
+ data[:_embedded][entity_name(name)] = entity_serializer ? entity_serializer.to_hash : nil
22
30
  end
23
31
 
24
32
  def entities(name, collection, serializer_class = nil, context_options = {}, &block)
25
- data[:_embedded][name] = collection.map do |obj|
33
+ data[:_embedded][entity_name(name)] = collection.map do |obj|
26
34
  entity_serializer = serializer_from_block_or_class(obj, serializer_class, context_options, &block)
27
35
  entity_serializer ? entity_serializer.to_hash : nil
28
36
  end
29
37
  end
30
38
  alias_method :collection, :entities
31
39
 
40
+ def entity_name(name)
41
+ # entity name may be an array, but HAL only uses the first
42
+ name.respond_to?(:first) ? name.first : name
43
+ end
44
+
45
+ private :entity_name
46
+
32
47
  end
33
48
  end
34
49
  end
@@ -19,6 +19,10 @@ module Oat
19
19
  @meta = {}
20
20
  end
21
21
 
22
+ def rel(rels)
23
+ # no-op to maintain interface compatibility with the Siren adapter
24
+ end
25
+
22
26
  def type(*types)
23
27
  @root_name = types.first.to_s.pluralize.to_sym
24
28
  end
@@ -69,15 +73,21 @@ module Oat
69
73
  ent = serializer_from_block_or_class(obj, serializer_class, context_options, &block)
70
74
  if ent
71
75
  ent_hash = ent.to_hash
72
- entity_hash[name.to_s.pluralize.to_sym] ||= []
73
- data[:links][name] = ent_hash[:id]
74
- entity_hash[name.to_s.pluralize.to_sym] << ent_hash
76
+ _name = entity_name(name)
77
+ link_name = _name.to_s.pluralize.to_sym
78
+ data[:links][_name] = ent_hash[:id]
79
+
80
+ entity_hash[link_name] ||= []
81
+ unless entity_hash[link_name].include? ent_hash
82
+ entity_hash[link_name] << ent_hash
83
+ end
75
84
  end
76
85
  end
77
86
 
78
87
  def entities(name, collection, serializer_class = nil, context_options = {}, &block)
79
88
  return if collection.nil? || collection.empty?
80
- link_name = name.to_s.pluralize.to_sym
89
+ _name = entity_name(name)
90
+ link_name = _name.to_s.pluralize.to_sym
81
91
  data[:links][link_name] = []
82
92
 
83
93
  collection.each do |obj|
@@ -86,11 +96,20 @@ module Oat
86
96
  if ent
87
97
  ent_hash = ent.to_hash
88
98
  data[:links][link_name] << ent_hash[:id]
89
- entity_hash[link_name] << ent_hash
99
+ unless entity_hash[link_name].include? ent_hash
100
+ entity_hash[link_name] << ent_hash
101
+ end
90
102
  end
91
103
  end
92
104
  end
93
105
 
106
+ def entity_name(name)
107
+ # entity name may be an array, but JSON API only uses the first
108
+ name.respond_to?(:first) ? name.first : name
109
+ end
110
+
111
+ private :entity_name
112
+
94
113
  def collection(name, collection, serializer_class = nil, context_options = {}, &block)
95
114
  @treat_as_resource_collection = true
96
115
  data[:resource_collection] = [] unless data[:resource_collection].is_a?(Array)
@@ -10,6 +10,13 @@ module Oat
10
10
  data[:actions] = []
11
11
  end
12
12
 
13
+ # Sub-Entities have a required rel attribute
14
+ # https://github.com/kevinswiber/siren#rel
15
+ def rel(rels)
16
+ # rel must be an array.
17
+ data[:rel] = Array(rels)
18
+ end
19
+
13
20
  def type(*types)
14
21
  data[:class] = types
15
22
  end
@@ -30,7 +37,15 @@ module Oat
30
37
 
31
38
  def entity(name, obj, serializer_class = nil, context_options = {}, &block)
32
39
  ent = serializer_from_block_or_class(obj, serializer_class, context_options, &block)
33
- data[:entities] << ent.to_hash if ent
40
+ if ent
41
+ # use the name as the sub-entities rel to the parent resource.
42
+ ent.rel(name)
43
+ ent_hash = ent.to_hash
44
+
45
+ unless data[:entities].include? ent_hash
46
+ data[:entities] << ent_hash
47
+ end
48
+ end
34
49
  end
35
50
 
36
51
  def entities(name, collection, serializer_class = nil, context_options = {}, &block)
data/lib/oat/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Oat
2
- VERSION = "0.4.5"
2
+ VERSION = "0.4.6"
3
3
  end
@@ -81,5 +81,23 @@ describe Oat::Adapters::HAL do
81
81
  )
82
82
  end
83
83
  end
84
+
85
+ let(:array_of_linked_objects_serializer) {
86
+ array_of_linked_objects_serializer_class.new(friendly_user, nil, Oat::Adapters::HAL)
87
+ }
88
+ let(:linked_objects_hash) { array_of_linked_objects_serializer.to_hash }
89
+
90
+ context 'with an array of linked objects' do
91
+ it 'produces a HAL-compliant hash' do
92
+ expect(linked_objects_hash.fetch(:_links).fetch(:related).size).to be 3
93
+ expect(linked_objects_hash.fetch(:_links)).to include(
94
+ :related => [
95
+ {:type=>"friend", :href=>"http://foo.bar.com/1"},
96
+ {:type=>"friend", :href=>"http://foo.bar.com/2"},
97
+ {:type=>"friend", :href=>"http://foo.bar.com/3"}
98
+ ]
99
+ )
100
+ end
101
+ end
84
102
  end
85
103
  end
@@ -84,7 +84,10 @@ describe Oat::Adapters::JsonAPI do
84
84
 
85
85
  context 'using #entity' do
86
86
  subject(:linked_managers){ hash.fetch(:linked).fetch(:managers) }
87
- its(:size) { should eq(1) }
87
+
88
+ it "does not duplicate an entity that is associated with 2 objects" do
89
+ expect(linked_managers.size).to eq(1)
90
+ end
88
91
 
89
92
  it "contains the correct properties and links" do
90
93
  expect(linked_managers.first).to include(
@@ -313,7 +316,10 @@ describe Oat::Adapters::JsonAPI do
313
316
 
314
317
  context 'sub entity' do
315
318
  subject(:linked_managers){ collection_hash.fetch(:linked).fetch(:managers) }
316
- its(:size) { should eq(1) }
319
+
320
+ it "does not duplicate an entity that is associated with multiple objects" do
321
+ expect(linked_managers.size).to eq(1)
322
+ end
317
323
 
318
324
  it "contains the correct properties and links" do
319
325
  expect(linked_managers.first).to include(
@@ -45,6 +45,10 @@ describe Oat::Adapters::Siren do
45
45
  :href => "http://foo.bar.com/#{friend.id}"
46
46
  )
47
47
 
48
+ # sub-entity rel is an array, so it may have multiple values
49
+ expect(embedded_friends.first.fetch(:rel)).to include(:friends)
50
+ expect(embedded_friends.first.fetch(:rel)).to include('http://example.org/rels/person')
51
+
48
52
  embedded_managers = hash.fetch(:entities).select{ |o| o[:class].include? "manager" }
49
53
  expect(embedded_managers.size).to be 1
50
54
  expect(embedded_managers.first.fetch(:properties)).to include(
@@ -56,6 +60,7 @@ describe Oat::Adapters::Siren do
56
60
  :rel => [:self],
57
61
  :href => "http://foo.bar.com/#{manager.id}"
58
62
  )
63
+ expect(embedded_managers.first.fetch(:rel)).to include(:manager)
59
64
 
60
65
  # action close_account
61
66
  actions = hash.fetch(:actions)
data/spec/fixtures.rb CHANGED
@@ -3,8 +3,9 @@ module Fixtures
3
3
  def self.included(base)
4
4
  base.let(:user_class) { Struct.new(:name, :age, :id, :friends, :manager) }
5
5
  base.let(:friend) { user_class.new('Joe', 33, 2, []) }
6
- base.let(:manager) { user_class.new('Jane', 29, 3, []) }
6
+ base.let(:manager) { user_class.new('Jane', 29, 3, [friend]) }
7
7
  base.let(:user) { user_class.new('Ismael', 35, 1, [friend], manager) }
8
+ base.let(:friendly_user) { user_class.new('Jeff', 33, 1, [friend, manager, user]) }
8
9
  base.let(:serializer_class) do
9
10
  Class.new(Oat::Serializer) do
10
11
  klass = self
@@ -23,7 +24,7 @@ module Fixtures
23
24
  attrs.message_from_above context[:message]
24
25
  end
25
26
 
26
- entities :friends, item.friends, klass, :message => "Merged into parent's context"
27
+ entities [:friends, 'http://example.org/rels/person'], item.friends, klass, :message => "Merged into parent's context"
27
28
 
28
29
  entity :manager, item.manager do |manager, s|
29
30
  s.type 'manager'
@@ -33,6 +34,8 @@ module Fixtures
33
34
  attrs.name manager.name
34
35
  attrs.age manager.age
35
36
  end
37
+
38
+ entities [:friends, 'http://example.org/rels/person'], item.friends, klass, :message => "Merged into parent's context"
36
39
  end
37
40
 
38
41
  if adapter.respond_to?(:action)
@@ -50,6 +53,24 @@ module Fixtures
50
53
  end
51
54
  end
52
55
 
56
+ def url_for(id)
57
+ "http://foo.bar.com/#{id}"
58
+ end
59
+ end
60
+ end
61
+ base.let(:array_of_linked_objects_serializer_class) do
62
+ Class.new(Oat::Serializer) do
63
+ schema do
64
+ type 'user'
65
+
66
+ link :self, :href => url_for(item.id)
67
+ link :related, item.friends.map { |friend|
68
+ {:type => 'friend', :href => url_for(friend.id)}
69
+ }.sort_by { |link_obj|
70
+ link_obj[:href]
71
+ }
72
+ end
73
+
53
74
  def url_for(id)
54
75
  "http://foo.bar.com/#{id}"
55
76
  end
metadata CHANGED
@@ -1,83 +1,83 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: oat
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.5
4
+ version: 0.4.6
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-07-09 00:00:00.000000000 Z
11
+ date: 2015-02-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - '>='
17
+ - - ">="
18
18
  - !ruby/object:Gem::Version
19
19
  version: '0'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - '>='
24
+ - - ">="
25
25
  - !ruby/object:Gem::Version
26
26
  version: '0'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: bundler
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - ~>
31
+ - - "~>"
32
32
  - !ruby/object:Gem::Version
33
33
  version: '1.3'
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - ~>
38
+ - - "~>"
39
39
  - !ruby/object:Gem::Version
40
40
  version: '1.3'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: rake
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - '>='
45
+ - - ">="
46
46
  - !ruby/object:Gem::Version
47
47
  version: '0'
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - '>='
52
+ - - ">="
53
53
  - !ruby/object:Gem::Version
54
54
  version: '0'
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: rspec
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
- - - '>='
59
+ - - ">="
60
60
  - !ruby/object:Gem::Version
61
61
  version: '3.0'
62
62
  type: :development
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
- - - '>='
66
+ - - ">="
67
67
  - !ruby/object:Gem::Version
68
68
  version: '3.0'
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: rspec-its
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
- - - '>='
73
+ - - ">="
74
74
  - !ruby/object:Gem::Version
75
75
  version: '0'
76
76
  type: :development
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
- - - '>='
80
+ - - ">="
81
81
  - !ruby/object:Gem::Version
82
82
  version: '0'
83
83
  description: Oat helps you separate your API schema definitions from the underlying
@@ -89,9 +89,10 @@ executables: []
89
89
  extensions: []
90
90
  extra_rdoc_files: []
91
91
  files:
92
- - .gitignore
93
- - .rspec
94
- - .travis.yml
92
+ - ".gitignore"
93
+ - ".rspec"
94
+ - ".travis.yml"
95
+ - CHANGELOG.md
95
96
  - Gemfile
96
97
  - LICENSE
97
98
  - LICENSE.txt
@@ -130,17 +131,17 @@ require_paths:
130
131
  - lib
131
132
  required_ruby_version: !ruby/object:Gem::Requirement
132
133
  requirements:
133
- - - '>='
134
+ - - ">="
134
135
  - !ruby/object:Gem::Version
135
136
  version: '0'
136
137
  required_rubygems_version: !ruby/object:Gem::Requirement
137
138
  requirements:
138
- - - '>='
139
+ - - ">="
139
140
  - !ruby/object:Gem::Version
140
141
  version: '0'
141
142
  requirements: []
142
143
  rubyforge_project:
143
- rubygems_version: 2.0.3
144
+ rubygems_version: 2.2.2
144
145
  signing_key:
145
146
  specification_version: 4
146
147
  summary: Adapters-based serializers with Hypermedia support