Skip to content

Commit 80f6562

Browse files
committed
exchange pagination class to inside json_api scope
1 parent a61675d commit 80f6562

File tree

7 files changed

+80
-82
lines changed

7 files changed

+80
-82
lines changed

lib/active_model/serializer/adapter.rb

Lines changed: 0 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@ def as_json(options = nil)
2525
return hash if self.class == FlattenJson
2626

2727
include_meta(hash)
28-
include_pagination_links(hash) if options && options[:pagination]
2928
end
3029
end
3130

@@ -97,21 +96,6 @@ def include_meta(json)
9796
json[meta_key] = meta if meta
9897
json
9998
end
100-
101-
def include_pagination_links(json)
102-
return unless page_links
103-
104-
links?(json) ? json.merge!(page_links) : json['links'] = page_links
105-
json
106-
end
107-
108-
def page_links
109-
@links ||= serializer.page_links
110-
end
111-
112-
def links?(json)
113-
!json['links'].nil?
114-
end
11599
end
116100
end
117101
end

lib/active_model/serializer/adapter/json_api.rb

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
require 'active_model/serializer/adapter/json_api/fragment_cache'
2+
require 'active_model/serializer/adapter/json_api/pagination_links'
23

34
module ActiveModel
45
class Serializer
@@ -27,6 +28,8 @@ def serializable_hash(options = nil)
2728
@hash[:included] |= result[:included]
2829
end
2930
end
31+
32+
include_pagination_links if serializer.pagination
3033
else
3134
@hash[:data] = attributes_for_serializer(serializer, options)
3235
add_resource_relationships(@hash[:data], serializer)
@@ -157,6 +160,20 @@ def add_resource_relationships(attrs, serializer, options = {})
157160
end
158161
end
159162
end
163+
164+
def include_pagination_links
165+
return if page_links.empty?
166+
167+
links? ? @hash[:links].merge!(page_links) : @hash[:links] = page_links
168+
end
169+
170+
def page_links
171+
@links ||= JsonApi::PaginationLinks.new(serializer.resource).page_links
172+
end
173+
174+
def links?
175+
!@hash[:links].nil?
176+
end
160177
end
161178
end
162179
end
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
module ActiveModel
2+
class Serializer
3+
class Adapter
4+
class JsonApi < Adapter
5+
class PaginationLinks
6+
FIRST_PAGE = 1
7+
8+
attr_reader :collection
9+
10+
def initialize(collection)
11+
raise_unless_any_gem_installed
12+
@collection = collection
13+
end
14+
15+
def page_links
16+
build_links
17+
end
18+
19+
private
20+
21+
def build_links
22+
pages_from.each_with_object({}) do |(key, value), hash|
23+
hash[key] = "?page=#{value}&per_page=#{collection.size}"
24+
end
25+
end
26+
27+
def pages_from
28+
return {} if collection.total_pages == FIRST_PAGE
29+
30+
{}.tap do |pages|
31+
unless collection.current_page == FIRST_PAGE
32+
pages[:first] = FIRST_PAGE
33+
pages[:prev] = collection.current_page - FIRST_PAGE
34+
end
35+
36+
unless collection.current_page == collection.total_pages
37+
pages[:next] = collection.current_page + FIRST_PAGE
38+
pages[:last] = collection.total_pages
39+
end
40+
end
41+
end
42+
43+
def raise_unless_any_gem_installed
44+
return if defined?(WillPaginate) || defined?(Kaminari)
45+
raise "AMS relies on either Kaminari or WillPaginate." +
46+
"Please install either dependency by adding one of those to your Gemfile"
47+
end
48+
end
49+
end
50+
end
51+
end
52+
end

lib/active_model/serializer/array_serializer.rb

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,8 @@ class ArraySerializer
44
NoSerializerError = Class.new(StandardError)
55
include Enumerable
66
delegate :each, to: :@objects
7-
delegate :page_links, to: :pagination
87

9-
attr_reader :root, :meta, :meta_key, :pagination
8+
attr_reader :root, :meta, :meta_key, :pagination, :resource
109

1110
def initialize(objects, options = {})
1211
@root = options[:root]
@@ -25,7 +24,7 @@ def initialize(objects, options = {})
2524
end
2625
@meta = options[:meta]
2726
@meta_key = options[:meta_key]
28-
@pagination = ActiveModel::Serializer::Pagination.new(objects) if options[:pagination]
27+
@pagination = options[:pagination]
2928
end
3029

3130
def json_key

lib/active_model/serializer/pagination.rb

Lines changed: 0 additions & 62 deletions
This file was deleted.

lib/active_model_serializers.rb

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
require 'active_model/serializer/version'
33
require 'active_model/serializer'
44
require 'active_model/serializer/fieldset'
5-
require 'active_model/serializer/pagination'
65
require 'active_model/serializable_resource'
76

87
begin

test/array_serializer_test.rb

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,15 @@ def test_json_key_with_root_and_no_serializers
9292
serializer = ArraySerializer.new(build_named_collection, root: 'custom_root')
9393
assert_equal serializer.json_key, 'custom_roots'
9494
end
95+
96+
def test_pagination_attr_readers
97+
serializer = ArraySerializer.new(@resource, pagination: true)
98+
assert_equal serializer.pagination, true
99+
end
100+
101+
def test_resource
102+
assert_equal @serializer.resource, @resource
103+
end
95104
end
96105
end
97106
end

0 commit comments

Comments
 (0)