json_api_client 1.12.2 → 1.13.0

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
  SHA256:
3
- metadata.gz: 23df9f5e291703c5f26c4f837109fd2a6b828e432a35587aee8f715e52409651
4
- data.tar.gz: cf9590a0ae72bedaf5759b05324f4fb31da965e4d8572f73f60136b37336b279
3
+ metadata.gz: cf7116009e3f1ebb219cd068a038a984d20561b2e5987f7e913f08cf48d78f35
4
+ data.tar.gz: 2218b88e39fdaf36324917037f0ed9f6057ef7675436b6e20625cf29c527766f
5
5
  SHA512:
6
- metadata.gz: 75f135db9889b82f718cdc14a1b33787f629df6f55c02d3bcfbbadaa50aeaddb61b448e1e679a3b2c7fbe3624d489d4a0cd0396a5208d20028b0cd9847ce2f1f
7
- data.tar.gz: 2ceff266b9bcf65078514400dc97fdc5af4d573d506a667cad22dd393f92028f81bc3b9a5b98963a1e382e1b701ecdf78a3a713ea0673e40aff2045a4f382531
6
+ metadata.gz: 85d9257d737ac385d2aece0abb97c459312f34588bfa55022cef4e9964959ab9b51fc16126912fbb0dce661a3cdd68bf92212b4ebb1f2562f1942ab392608076
7
+ data.tar.gz: 26ef5c579c30b8248a3f981cb3e107dd567fb5aa17238781572b176ea6fefbdecf1d39a52dee303dd41999f585eed22e2c7ee9762321ddcf9ef5c9ee3a000d5e
data/README.md CHANGED
@@ -599,6 +599,20 @@ class MyApi::Base < JsonApiClient::Resource
599
599
  end
600
600
  ```
601
601
 
602
+ ### NestedParamPaginator
603
+
604
+ The default `JsonApiClient::Paginating::Paginator` is not strict about how it handles the param keys ([#347](https://github.com/JsonApiClient/json_api_client/issues/347)). There is a second paginator that more rigorously adheres to the JSON:API pagination recommendation style of `page[page]=1&page[per_page]=10`.
605
+
606
+ If this second style suits your needs better, it is available as a class override:
607
+
608
+ ```ruby
609
+ class Order < JsonApiClient::Resource
610
+ self.paginator = JsonApiClient::Paginating::NestedParamPaginator
611
+ end
612
+ ```
613
+
614
+ You can also extend `NestedParamPaginator` in your custom paginators or assign the `page_param` or `per_page_param` as with the default version above.
615
+
602
616
  ### Custom type
603
617
 
604
618
  If your model must be named differently from classified type of resource you can easily customize it.
@@ -1,5 +1,6 @@
1
1
  module JsonApiClient
2
2
  module Paginating
3
3
  autoload :Paginator, 'json_api_client/paginating/paginator'
4
+ autoload :NestedParamPaginator, 'json_api_client/paginating/nested_param_paginator'
4
5
  end
5
- end
6
+ end
@@ -0,0 +1,140 @@
1
+ module JsonApiClient
2
+ module Paginating
3
+ # An alternate, more consistent Paginator that always wraps
4
+ # pagination query string params in a top-level wrapper_name,
5
+ # e.g. page[offset]=2, page[limit]=10.
6
+ class NestedParamPaginator
7
+ DEFAULT_WRAPPER_NAME = "page".freeze
8
+ DEFAULT_PAGE_PARAM = "page".freeze
9
+ DEFAULT_PER_PAGE_PARAM = "per_page".freeze
10
+
11
+ # Define class accessors as methods to enforce standard way
12
+ # of defining pagination related query string params.
13
+ class << self
14
+
15
+ def wrapper_name
16
+ @_wrapper_name ||= DEFAULT_WRAPPER_NAME
17
+ end
18
+
19
+ def wrapper_name=(param = DEFAULT_WRAPPER_NAME)
20
+ raise ArgumentError, "don't wrap wrapper_name" unless valid_param?(param)
21
+
22
+ @_wrapper_name = param.to_s
23
+ end
24
+
25
+ def page_param
26
+ @_page_param ||= DEFAULT_PAGE_PARAM
27
+ "#{wrapper_name}[#{@_page_param}]"
28
+ end
29
+
30
+ def page_param=(param = DEFAULT_PAGE_PARAM)
31
+ raise ArgumentError, "don't wrap page_param" unless valid_param?(param)
32
+
33
+ @_page_param = param.to_s
34
+ end
35
+
36
+ def per_page_param
37
+ @_per_page_param ||= DEFAULT_PER_PAGE_PARAM
38
+ "#{wrapper_name}[#{@_per_page_param}]"
39
+ end
40
+
41
+ def per_page_param=(param = DEFAULT_PER_PAGE_PARAM)
42
+ raise ArgumentError, "don't wrap per_page_param" unless valid_param?(param)
43
+
44
+ @_per_page_param = param
45
+ end
46
+
47
+ private
48
+
49
+ def valid_param?(param)
50
+ !(param.nil? || param.to_s.include?("[") || param.to_s.include?("]"))
51
+ end
52
+
53
+ end
54
+
55
+ attr_reader :params, :result_set, :links
56
+
57
+ def initialize(result_set, data)
58
+ @params = params_for_uri(result_set.uri)
59
+ @result_set = result_set
60
+ @links = data["links"]
61
+ end
62
+
63
+ def next
64
+ result_set.links.fetch_link("next")
65
+ end
66
+
67
+ def prev
68
+ result_set.links.fetch_link("prev")
69
+ end
70
+
71
+ def first
72
+ result_set.links.fetch_link("first")
73
+ end
74
+
75
+ def last
76
+ result_set.links.fetch_link("last")
77
+ end
78
+
79
+ def total_pages
80
+ if links["last"]
81
+ uri = result_set.links.link_url_for("last")
82
+ last_params = params_for_uri(uri)
83
+ last_params.fetch(page_param, &method(:current_page)).to_i
84
+ else
85
+ current_page
86
+ end
87
+ end
88
+
89
+ # this is an estimate, not necessarily an exact count
90
+ def total_entries
91
+ per_page * total_pages
92
+ end
93
+ def total_count; total_entries; end
94
+
95
+ def offset
96
+ per_page * (current_page - 1)
97
+ end
98
+
99
+ def per_page
100
+ params.fetch(per_page_param) do
101
+ result_set.length
102
+ end.to_i
103
+ end
104
+
105
+ def current_page
106
+ params.fetch(page_param, 1).to_i
107
+ end
108
+
109
+ def out_of_bounds?
110
+ current_page > total_pages
111
+ end
112
+
113
+ def previous_page
114
+ current_page > 1 ? (current_page - 1) : nil
115
+ end
116
+
117
+ def next_page
118
+ current_page < total_pages ? (current_page + 1) : nil
119
+ end
120
+
121
+ def page_param
122
+ self.class.page_param
123
+ end
124
+
125
+ def per_page_param
126
+ self.class.per_page_param
127
+ end
128
+
129
+ alias limit_value per_page
130
+
131
+ protected
132
+
133
+ def params_for_uri(uri)
134
+ return {} unless uri
135
+ uri = Addressable::URI.parse(uri)
136
+ ( uri.query_values || {} ).with_indifferent_access
137
+ end
138
+ end
139
+ end
140
+ end
@@ -146,7 +146,13 @@ module JsonApiClient
146
146
  end
147
147
 
148
148
  def pagination_params
149
- @pagination_params.empty? ? {} : {page: @pagination_params}
149
+ if klass.paginator.ancestors.include?(Paginating::Paginator)
150
+ # Original Paginator inconsistently wraps pagination params here. Keeping
151
+ # default behavior for now so as not to break backward compatibility.
152
+ @pagination_params.empty? ? {} : {page: @pagination_params}
153
+ else
154
+ @pagination_params
155
+ end
150
156
  end
151
157
 
152
158
  def includes_params
@@ -1,3 +1,3 @@
1
1
  module JsonApiClient
2
- VERSION = "1.12.2"
2
+ VERSION = "1.13.0"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: json_api_client
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.12.2
4
+ version: 1.13.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jeff Ching
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-06-25 00:00:00.000000000 Z
11
+ date: 2019-06-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -164,6 +164,7 @@ files:
164
164
  - lib/json_api_client/middleware/parse_json.rb
165
165
  - lib/json_api_client/middleware/status.rb
166
166
  - lib/json_api_client/paginating.rb
167
+ - lib/json_api_client/paginating/nested_param_paginator.rb
167
168
  - lib/json_api_client/paginating/paginator.rb
168
169
  - lib/json_api_client/parsers.rb
169
170
  - lib/json_api_client/parsers/parser.rb