xing-backend 0.0.11 → 0.0.12

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: 862c1da5f835e9cd13790d7bc67c4739d14bc4f8
4
- data.tar.gz: b02e0ee68d0d8cffa10fc9ec4a203907ebfed41f
3
+ metadata.gz: 827d47919fcc3646787ebec8fd234016afbddb78
4
+ data.tar.gz: 270b23ee03b4fcb2adfae0993069dd12f5c38bef
5
5
  SHA512:
6
- metadata.gz: 64f348a5ae8f9a76d14afbb4a23ad8fabe05bca393b49d21e7facbec9d7bb8ee2657d91b3816d17bd4d20e054e1dcabe651a1027761ad9fdaa7b7a8b9cfc577f
7
- data.tar.gz: b29cbe4dec8c39c58d0cafb97103556ce9a9dcc9aa79a76c1631796b102f748f9e5a08fea5c429f3dd5036a70faaa2e67c32d3324f98cb5d43839647912aad3f
6
+ metadata.gz: af3d2370c38452056e039a5e8409ed3602ef9f2ffc4633270695b551cdba582a9a48446f907bf9c5e17370907b950c75f0691208e9bafad957f3ae7a9d733cbb
7
+ data.tar.gz: c4dcade49aeac1b828d90f2df37e6ef56e0734acdc44bcc37869a2fb0e7dec7d75c302cf7f369d728266514e7a0122a1f8b154318ec370d7ef6c4d123f7dc2a5
@@ -4,4 +4,5 @@ module Xing
4
4
  end
5
5
 
6
6
  require 'xing/serializers/base'
7
+ require 'xing/serializers/paged_list'
7
8
  require 'xing/serializers/root_resources'
@@ -0,0 +1,55 @@
1
+ require 'xing/serializers/base'
2
+
3
+ module Xing::Serializers
4
+ class PagedList < Base
5
+ def initialize(list, page_num, total_pages, options = {})
6
+ @page_num = page_num.to_i
7
+ @total_pages = total_pages
8
+
9
+ super(list, options)
10
+ end
11
+
12
+ attr_reader :page_num, :total_pages
13
+
14
+ def item_serializer_class
15
+ raise NotImplemented,
16
+ "subclasses of Xing::Serializers::PagesData must override item_serializer_class to refer to the per-item serializer"
17
+ end
18
+
19
+ def item_serializer_options
20
+ {}
21
+ end
22
+
23
+ def page_link(options)
24
+ raise NotImplemented,
25
+ "subclasses of Xing::Serializers::PagesData must override page_link to return the URL of a page based on a :page => Integer() hash"
26
+ end
27
+
28
+ def self_link
29
+ raise NotImplemented,
30
+ "subclasses of Xing::Serializers::PagesData must override self_link to return their own path"
31
+ end
32
+
33
+ def as_json_without_wrap(options={})
34
+ object.map do |item|
35
+ item_serializer_class.new(item, item_serializer_options).as_json
36
+ end
37
+ end
38
+
39
+ def next_link
40
+ page_link({page: page_num + 1}) unless page_num == total_pages
41
+ end
42
+
43
+ def previous_link
44
+ page_link({page: page_num - 1}) unless page_num == 1
45
+ end
46
+
47
+ def links
48
+ {
49
+ :self => self_link,
50
+ :next => next_link,
51
+ :previous => previous_link
52
+ }
53
+ end
54
+ end
55
+ end
@@ -1,7 +1,6 @@
1
1
  require 'xing/serializers/base'
2
2
  require 'json_spec'
3
3
 
4
-
5
4
  describe Xing::Serializers::Base do
6
5
  include JsonSpec::Matchers
7
6
 
@@ -0,0 +1,118 @@
1
+ require 'xing/serializers/paged_list'
2
+ require 'json_spec'
3
+
4
+ describe Xing::Serializers::PagedList do
5
+ include JsonSpec::Matchers
6
+
7
+ class ItemSerializer < Xing::Serializers::Base
8
+ attributes :name, :position
9
+ def links
10
+ { :self => 'url_for_this_model' }
11
+ end
12
+ end
13
+
14
+ class PageSerializer < Xing::Serializers::PagedList
15
+ def item_serializer_class
16
+ ItemSerializer
17
+ end
18
+
19
+ # Structures a testable "link" text
20
+ def page_link(options)
21
+ page_num = options.delete(:page)
22
+ "page_link:#{page_num}-#{options.keys.join(",")}"
23
+ end
24
+
25
+ def self_link
26
+ "url_for_this_page"
27
+ end
28
+ end
29
+
30
+ let :list do
31
+ (1..3).map do |index|
32
+ double("a mock activemodel").tap do |model|
33
+ allow(model).to receive(:read_attribute_for_serialization).with(:name).and_return("Name #{index}!")
34
+ allow(model).to receive(:read_attribute_for_serialization).with(:position).and_return(index)
35
+ end
36
+ end
37
+ end
38
+
39
+ let :total_pages do 3 end
40
+
41
+ let :serializer do
42
+ PageSerializer.new(list, page_num, total_pages)
43
+ end
44
+
45
+ let :json do
46
+ serializer.to_json
47
+ end
48
+
49
+ describe 'as_json' do
50
+ let :page_num do 1 end
51
+
52
+ it "should have the correct structure" do
53
+ expect(json).to have_json_path('links/self')
54
+ expect(json).to have_json_path('links/next')
55
+ expect(json).to have_json_path('links/previous')
56
+ expect(json).to have_json_path('data/')
57
+ end
58
+
59
+ it "should generate a JSON with the proper links and self" do
60
+ expect(json).to be_json_eql('"url_for_this_page"').at_path('links/self')
61
+ expect(json).to be_json_eql('"page_link:2-"').at_path('links/next')
62
+ expect(json).to be_json_eql('"Name 2!"').at_path('data/1/data/name')
63
+ expect(json).to be_json_eql('2').at_path('data/1/data/position')
64
+ expect(json).to be_json_eql('"url_for_this_model"').at_path('data/1/links/self')
65
+ end
66
+
67
+ it "should call the video response serializer" do
68
+ expect(ItemSerializer).to receive(:new).with(list[0], anything)
69
+ expect(ItemSerializer).to receive(:new).with(list[1], anything)
70
+ expect(ItemSerializer).to receive(:new).with(list[2], anything)
71
+ expect(json).to have_json_size(3).at_path('data')
72
+ end
73
+ end
74
+
75
+ describe 'links' do
76
+ context 'first page' do
77
+ let :page_num do
78
+ 1
79
+ end
80
+
81
+ it 'should not have a previous link' do
82
+ expect(serializer.previous_link).to be_nil
83
+ end
84
+
85
+ it 'should have a next link' do
86
+ expect(serializer.next_link).to_not be_nil
87
+ end
88
+ end
89
+
90
+ context 'last page' do
91
+ let :page_num do
92
+ 3
93
+ end
94
+
95
+ it 'should have a previous link' do
96
+ expect(serializer.previous_link).to_not be_nil
97
+ end
98
+
99
+ it 'should not have a next link' do
100
+ expect(serializer.next_link).to be_nil
101
+ end
102
+ end
103
+
104
+ context 'neither first page or last page' do
105
+ let :page_num do
106
+ 2
107
+ end
108
+
109
+ it 'should have a previous link' do
110
+ expect(serializer.previous_link).to_not be_nil
111
+ end
112
+
113
+ it 'should have a next link' do
114
+ expect(serializer.next_link).to_not be_nil
115
+ end
116
+ end
117
+ end
118
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: xing-backend
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.11
4
+ version: 0.0.12
5
5
  platform: ruby
6
6
  authors:
7
7
  - Evan Dorn
@@ -19,14 +19,14 @@ dependencies:
19
19
  requirements:
20
20
  - - "~>"
21
21
  - !ruby/object:Gem::Version
22
- version: 4.2.0
22
+ version: 4.2.1
23
23
  type: :runtime
24
24
  prerelease: false
25
25
  version_requirements: !ruby/object:Gem::Requirement
26
26
  requirements:
27
27
  - - "~>"
28
28
  - !ruby/object:Gem::Version
29
- version: 4.2.0
29
+ version: 4.2.1
30
30
  - !ruby/object:Gem::Dependency
31
31
  name: active_model_serializers
32
32
  requirement: !ruby/object:Gem::Requirement
@@ -132,6 +132,7 @@ files:
132
132
  - lib/xing/mappers/base.rb
133
133
  - lib/xing/serializers.rb
134
134
  - lib/xing/serializers/base.rb
135
+ - lib/xing/serializers/paged_list.rb
135
136
  - lib/xing/serializers/root_resources.rb
136
137
  - lib/xing/services.rb
137
138
  - lib/xing/services/error_converter.rb
@@ -148,6 +149,7 @@ files:
148
149
  - spec/xing/controllers/root_resources_controller_spec.rb
149
150
  - spec/xing/mappers/base_spec.rb
150
151
  - spec/xing/serializers/base_spec.rb
152
+ - spec/xing/serializers/paged_list_spec.rb
151
153
  - spec/xing/serializers/root_resources_spec.rb
152
154
  - spec/xing/services/error_converter_spec.rb
153
155
  - spec/xing/services/json_tree_lister_spec.rb
@@ -200,7 +202,7 @@ rdoc_options:
200
202
  - "--main"
201
203
  - doc/README
202
204
  - "--title"
203
- - xing-backend-0.0.11 Documentation
205
+ - xing-backend-0.0.12 Documentation
204
206
  require_paths:
205
207
  - lib/
206
208
  required_ruby_version: !ruby/object:Gem::Requirement