xing-backend 0.0.18 → 0.0.19

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: 8124784dfc906a44033c779b625e825133266b78
4
- data.tar.gz: ef03e6925c23a2b62f28e9de03db9463a78dba24
3
+ metadata.gz: a7bb90034c2383f0866fde062f849ea3aabace59
4
+ data.tar.gz: a5823af9381a90361195f139eb80292cb085f738
5
5
  SHA512:
6
- metadata.gz: 476da8b9dfc5228f14460bd93706c9acadea42784f11bd646a3d5d63ea31d7c859eff7f0f59fc8e7b0831d1c03b3c91daefec1fbbf0e6dfab35eba2866a39138
7
- data.tar.gz: ba5adaf5ed0f9af7b4a1fcaf6c80e981f44b92c536f0d9d5eea070f78c1f0d90be6e6173d034cdb29dfd25c6352ff3d88254d261876797b040b44f1272452d99
6
+ metadata.gz: 43fd7dd223af84a296b348e0731aaaf800ff4b41b61068df3069dd9dd8f934cb4bdd4ec5228a9af313a107442a0ae3192598951da13ef40943beffef481b5382
7
+ data.tar.gz: d0b79eed9ed10eb308b65b0104c7fe6d93a36aa63853139157b98ade4445979fc05c65fbaa5f5fcc371d4d3d4c93245aae46837a31a80e8dc4f731117854195e
@@ -0,0 +1,35 @@
1
+ module Xing::Serializers
2
+ module Paged
3
+ def template_link
4
+ raise NotImplementedError,
5
+ "subclasses of Xing::Serializers::PagedList must override template_link to provide a path URL template with a single :page field\n" +
6
+ "usually you can do something like my_resource_path_rfc6570 (sometimes you'll need to also call .partial_expand)\n\n" +
7
+ "If you prefer, you can return nil from template_link and override page_link to do something else."
8
+ end
9
+
10
+ def total_pages
11
+ object.total_pages
12
+ end
13
+
14
+ def first_link
15
+ page_link({page: 1})
16
+ end
17
+
18
+ def last_link
19
+ page_link({page: total_pages})
20
+ end
21
+
22
+ def page_link(options)
23
+ template_link.expand(options)
24
+ end
25
+
26
+ def links
27
+ {
28
+ :self => self_link,
29
+ :first => first_link,
30
+ :last => last_link,
31
+ :template => template_link
32
+ }
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,35 @@
1
+ require 'xing/serializers/base'
2
+ require 'xing/serializers/paged'
3
+
4
+ module Xing::Serializers
5
+ # Serializes the reference index of a long paginated list. We assume the
6
+ # interface provided by Kaminari: the object to be serialized needs to
7
+ # respond to:
8
+ #
9
+ # current_page, limit_value, total_pages, total_count, each(and various
10
+ # Enumerable methods)
11
+
12
+ class PagedIndex < Base
13
+ include Paged
14
+
15
+ def self.total_called(name)
16
+ attributes name
17
+ alias_method name, :total_items
18
+ end
19
+
20
+ attributes :per_page, :total_pages, :total_items
21
+
22
+ def total_items
23
+ object.total_count
24
+ end
25
+
26
+ def per_page
27
+ object.limit_value
28
+ end
29
+
30
+ def self_link
31
+ raise NotImplementedError,
32
+ "subclasses of Xing::Serializers::PagedIndex must override self_link to provide a path URL to themselves"
33
+ end
34
+ end
35
+ end
@@ -1,19 +1,19 @@
1
1
  require 'xing/serializers/list'
2
+ require 'xing/serializers/paged'
2
3
 
3
4
  module Xing::Serializers
4
- class PagedList < List
5
- def initialize(list, page_num, total_pages, options = {})
6
- @page_num = page_num.to_i
7
- @total_pages = total_pages
8
5
 
9
- super(list, options)
10
- end
6
+ # Serializes a single page of a long paginated list. We assume the interface
7
+ # provided by Kaminari: the object to be serialized needs to respond to:
8
+ #
9
+ # current_page, limit_value, total_pages, total_count, each(and various
10
+ # Enumerable methods)
11
11
 
12
- attr_reader :page_num, :total_pages
12
+ class PagedList < List
13
+ include Paged
13
14
 
14
- def page_link(options)
15
- raise NotImplementedError,
16
- "subclasses of Xing::Serializers::PagesData must override page_link to return the URL of a page based on a :page => Integer() hash"
15
+ def page_num
16
+ object.current_page
17
17
  end
18
18
 
19
19
  def next_link
@@ -25,11 +25,10 @@ module Xing::Serializers
25
25
  end
26
26
 
27
27
  def links
28
- {
29
- :self => self_link,
30
- :next => next_link,
31
- :previous => previous_link
32
- }
28
+ super.merge(
29
+ :next => next_link,
30
+ :previous => previous_link
31
+ )
33
32
  end
34
33
  end
35
34
  end
@@ -0,0 +1,25 @@
1
+ module Xing::Services
2
+ # If you want to use the PagedList serializers, but are using resources that
3
+ # aren't actually provided by Kaminari, you can instead feed them to
4
+ # PageWrapper and you should get everything you need
5
+ class PageWrapper
6
+ include Enumerable
7
+
8
+ def initialize(list, page_num, total_items, per_page)
9
+ @list, @total_items, @per_page, @page_num = list, total_items, per_page, page_num
10
+ end
11
+ attr_reader :list, :total_items, :per_page, :page_num
12
+
13
+ alias current_page page_num
14
+ alias total_count total_items
15
+ alias limit_value per_page
16
+
17
+ def total_pages
18
+ (total_items / per_page.to_f).ceil
19
+ end
20
+
21
+ def each(*args, &block)
22
+ @list.each(*args, &block)
23
+ end
24
+ end
25
+ end
@@ -32,7 +32,7 @@ describe Xing::Mappers::Base do
32
32
 
33
33
  expect do
34
34
  mapper.save
35
- end.to raise_error
35
+ end.to raise_error(NameError, /update_record/)
36
36
  end
37
37
 
38
38
  it "shouldn't error if it does have an update_record and a record_class method" do
@@ -0,0 +1,73 @@
1
+ require 'xing/serializers/paged_index'
2
+ require 'xing/services/page_wrapper'
3
+
4
+ describe Xing::Serializers::PagedIndex do
5
+ class PageIndexSerializer < Xing::Serializers::PagedIndex
6
+ def self_link
7
+ "url_for_index"
8
+ end
9
+
10
+ def template_link
11
+ Addressable::Template.new("/page{/page}")
12
+ end
13
+ end
14
+
15
+ let :per_page do
16
+ 3
17
+ end
18
+
19
+ let :list do
20
+ (1..per_page).map do |index|
21
+ double("a mock activemodel").tap do |model|
22
+ allow(model).to receive(:read_attribute_for_serialization).with(:name).and_return("Name #{index}!")
23
+ allow(model).to receive(:read_attribute_for_serialization).with(:position).and_return(index)
24
+ end
25
+ end
26
+ end
27
+
28
+ let :page_num do 1 end
29
+
30
+ let :total_pages do 3 end
31
+
32
+ let :total_items do
33
+ total_pages * per_page - 1
34
+ end
35
+
36
+ let :json do
37
+ serializer.to_json
38
+ end
39
+
40
+ describe 'as_json' do
41
+ let :serializer do
42
+ PageIndexSerializer.new(Xing::Services::PageWrapper.new(list, page_num, total_items, per_page))
43
+ end
44
+
45
+ it "should generate a JSON with the proper links and self" do
46
+ expect(parse_json(json, "links/self")).to eq("url_for_index")
47
+ expect(parse_json(json, "links/first")).to eq("/page/1")
48
+ expect(parse_json(json, "links/last")).to eq("/page/3")
49
+ expect(parse_json(json, "data/per_page")).to eq(per_page)
50
+ expect(parse_json(json, "data/total_pages")).to eq(total_pages)
51
+ expect(parse_json(json, "data/total_items")).to eq(total_items)
52
+ end
53
+ end
54
+
55
+ describe 'using Kaminari' do
56
+ let :kaminari_list do
57
+ Kaminari.paginate_array((list * 3)[0..-2]).page(1).per(per_page)
58
+ end
59
+
60
+ let :serializer do
61
+ PageIndexSerializer.new(kaminari_list)
62
+ end
63
+
64
+ it "should generate a JSON with the proper links and self" do
65
+ expect(parse_json(json, "links/self")).to eq("url_for_index")
66
+ expect(parse_json(json, "links/first")).to eq("/page/1")
67
+ expect(parse_json(json, "links/last")).to eq("/page/3")
68
+ expect(parse_json(json, "data/per_page")).to eq(per_page)
69
+ expect(parse_json(json, "data/total_pages")).to eq(total_pages)
70
+ expect(parse_json(json, "data/total_items")).to eq(total_items)
71
+ end
72
+ end
73
+ end
@@ -1,9 +1,6 @@
1
1
  require 'xing/serializers/paged_list'
2
- require 'json_spec'
3
2
 
4
3
  describe Xing::Serializers::PagedList do
5
- include JsonSpec::Matchers
6
-
7
4
  class ItemSerializer < Xing::Serializers::Base
8
5
  attributes :name, :position
9
6
  def links
@@ -16,10 +13,8 @@ describe Xing::Serializers::PagedList do
16
13
  ItemSerializer
17
14
  end
18
15
 
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(",")}"
16
+ def template_link
17
+ Addressable::Template.new("/page{/page}")
23
18
  end
24
19
 
25
20
  def self_link
@@ -27,8 +22,12 @@ describe Xing::Serializers::PagedList do
27
22
  end
28
23
  end
29
24
 
25
+ let :per_page do
26
+ 3
27
+ end
28
+
30
29
  let :list do
31
- (1..3).map do |index|
30
+ (1..per_page).map do |index|
32
31
  double("a mock activemodel").tap do |model|
33
32
  allow(model).to receive(:read_attribute_for_serialization).with(:name).and_return("Name #{index}!")
34
33
  allow(model).to receive(:read_attribute_for_serialization).with(:position).and_return(index)
@@ -38,8 +37,12 @@ describe Xing::Serializers::PagedList do
38
37
 
39
38
  let :total_pages do 3 end
40
39
 
40
+ let :total_items do
41
+ total_pages * per_page - 1
42
+ end
43
+
41
44
  let :serializer do
42
- PageSerializer.new(list, page_num, total_pages)
45
+ PageSerializer.new(Xing::Services::PageWrapper.new(list, page_num, total_items, per_page))
43
46
  end
44
47
 
45
48
  let :json do
@@ -57,11 +60,49 @@ describe Xing::Serializers::PagedList do
57
60
  end
58
61
 
59
62
  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')
63
+ expect(parse_json(json, "links/self")).to eq("url_for_this_page")
64
+ expect(parse_json(json, "links/next")).to eq("/page/2")
65
+ expect(parse_json(json, "links/first")).to eq("/page/1")
66
+ expect(parse_json(json, "links/last")).to eq("/page/3")
67
+ expect(parse_json(json, "data/1/data/name")).to eq("Name 2!")
68
+ expect(parse_json(json, "data/1/data/position")).to eq(2)
69
+ expect(parse_json(json, "data/1/links/self")).to eq("url_for_this_model")
70
+ end
71
+
72
+ it "should call the video response serializer" do
73
+ expect(ItemSerializer).to receive(:new).with(list[0], anything)
74
+ expect(ItemSerializer).to receive(:new).with(list[1], anything)
75
+ expect(ItemSerializer).to receive(:new).with(list[2], anything)
76
+ expect(json).to have_json_size(3).at_path('data')
77
+ end
78
+ end
79
+
80
+ describe 'using Kaminara' do
81
+ let :kaminari_list do
82
+ Kaminari.paginate_array(list * 3).page(1).per(per_page)
83
+ end
84
+
85
+ let :serializer do
86
+ PageSerializer.new(kaminari_list)
87
+ end
88
+
89
+ let :page_num do 1 end
90
+
91
+ it "should have the correct structure" do
92
+ expect(json).to have_json_path('links/self')
93
+ expect(json).to have_json_path('links/next')
94
+ expect(json).to have_json_path('links/previous')
95
+ expect(json).to have_json_path('data/')
96
+ end
97
+
98
+ it "should generate a JSON with the proper links and self" do
99
+ expect(parse_json(json, "links/self")).to eq("url_for_this_page")
100
+ expect(parse_json(json, "links/next")).to eq("/page/2")
101
+ expect(parse_json(json, "links/first")).to eq("/page/1")
102
+ expect(parse_json(json, "links/last")).to eq("/page/3")
103
+ expect(parse_json(json, "data/1/data/name")).to eq("Name 2!")
104
+ expect(parse_json(json, "data/1/data/position")).to eq(2)
105
+ expect(parse_json(json, "data/1/links/self")).to eq("url_for_this_model")
65
106
  end
66
107
 
67
108
  it "should call the video response serializer" do
@@ -26,4 +26,6 @@ RSpec.configure do |config|
26
26
  config.around(:type => :deprecation) do |example|
27
27
  ActiveSupport::Deprecation.silence(&example)
28
28
  end
29
+
30
+ config.include JsonSpec::Helpers
29
31
  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.18
4
+ version: 0.0.19
5
5
  platform: ruby
6
6
  authors:
7
7
  - Evan Dorn
@@ -11,7 +11,7 @@ authors:
11
11
  autorequire:
12
12
  bindir: bin
13
13
  cert_chain: []
14
- date: 2015-07-23 00:00:00.000000000 Z
14
+ date: 2016-01-05 00:00:00.000000000 Z
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
17
17
  name: rails
@@ -135,12 +135,15 @@ files:
135
135
  - lib/xing/serializers.rb
136
136
  - lib/xing/serializers/base.rb
137
137
  - lib/xing/serializers/list.rb
138
+ - lib/xing/serializers/paged.rb
139
+ - lib/xing/serializers/paged_index.rb
138
140
  - lib/xing/serializers/paged_list.rb
139
141
  - lib/xing/serializers/root_resources.rb
140
142
  - lib/xing/services.rb
141
143
  - lib/xing/services/error_converter.rb
142
144
  - lib/xing/services/json_tree_lister.rb
143
145
  - lib/xing/services/locator.rb
146
+ - lib/xing/services/page_wrapper.rb
144
147
  - lib/xing/services/snapshot_fetcher.rb
145
148
  - lib/xing/services/snapshot_writer.rb
146
149
  - spec/xing/builders/list_builder_spec.rb
@@ -149,6 +152,7 @@ files:
149
152
  - spec/xing/controllers/root_resources_controller_spec.rb
150
153
  - spec/xing/mappers/base_spec.rb
151
154
  - spec/xing/serializers/base_spec.rb
155
+ - spec/xing/serializers/paged_index_spec.rb
152
156
  - spec/xing/serializers/paged_list_spec.rb
153
157
  - spec/xing/serializers/root_resources_spec.rb
154
158
  - spec/xing/services/error_converter_spec.rb
@@ -200,7 +204,7 @@ rdoc_options:
200
204
  - "--main"
201
205
  - doc/README
202
206
  - "--title"
203
- - xing-backend-0.0.18 Documentation
207
+ - xing-backend-0.0.19 Documentation
204
208
  require_paths:
205
209
  - lib/
206
210
  required_ruby_version: !ruby/object:Gem::Requirement