bearcat 1.3.55 → 1.4.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 +4 -4
- data/lib/bearcat/api_array.rb +68 -61
- data/lib/bearcat/version.rb +1 -1
- data/spec/bearcat/api_array_spec.rb +32 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f18014e61dafe829eb0820bff31d40b886d178ebd4d67241bef32ffe1a550581
|
4
|
+
data.tar.gz: 8908fb0abf898a853546fdeac9211695378487f28b2508deefd5f19923cb297f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c618cfc8ce6dc51b976f4f08bee4e0186dd0d0148dcf39245ca276602ca7260165f5eace1e2be041899a33235847564645b004b5d0a2ef742fa06603ea4b09e8
|
7
|
+
data.tar.gz: eee162c665db7d9edf5f071ecdd3821a26e080cc58adf0b00a4efc7022cc2b885a78803579ea5f219b5bbd416575aef774deab387d9f62e9f7bd77f69d7d3d91
|
data/lib/bearcat/api_array.rb
CHANGED
@@ -2,7 +2,7 @@ module Bearcat
|
|
2
2
|
class ApiArray
|
3
3
|
include Enumerable
|
4
4
|
|
5
|
-
attr_reader :
|
5
|
+
attr_reader :raw_response, :members
|
6
6
|
|
7
7
|
def self.process_response(response, api_client)
|
8
8
|
if response.body.is_a?(Array)
|
@@ -26,18 +26,23 @@ module Bearcat
|
|
26
26
|
|
27
27
|
def initialize(response, api_client, array_key = nil)
|
28
28
|
@api_client = api_client
|
29
|
+
@raw_response = response
|
29
30
|
@array_key = array_key
|
30
|
-
@page_count =
|
31
|
+
@page_count = nil
|
32
|
+
|
31
33
|
case response.status
|
32
34
|
when 200..206
|
33
35
|
@members = process_body(response)
|
34
|
-
|
35
|
-
@headers = response.headers
|
36
|
-
@method = response.env[:method]
|
37
|
-
init_pages(@headers['Link'])
|
36
|
+
init_pages(headers[:link])
|
38
37
|
end
|
39
38
|
end
|
40
39
|
|
40
|
+
delegate :status, :headers, to: :raw_response
|
41
|
+
|
42
|
+
def method
|
43
|
+
raw_response.env[:method]
|
44
|
+
end
|
45
|
+
|
41
46
|
def [](i)
|
42
47
|
@members[i]
|
43
48
|
end
|
@@ -54,71 +59,37 @@ module Bearcat
|
|
54
59
|
@link_hash['next'] || @link_hash['prev']
|
55
60
|
end
|
56
61
|
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
def prev_page
|
62
|
-
load_page('prev')
|
63
|
-
end
|
64
|
-
|
65
|
-
def first_page
|
66
|
-
load_page('first')
|
67
|
-
end
|
68
|
-
|
69
|
-
def last_page
|
70
|
-
load_page('last')
|
62
|
+
%w[next prev first last].each do |rel|
|
63
|
+
define_method :"#{rel}_page" do
|
64
|
+
load_page(rel)
|
65
|
+
end
|
71
66
|
end
|
72
67
|
|
73
|
-
def each_page(page_count =
|
74
|
-
@page_count = page_count
|
68
|
+
def each_page(page_count = nil, &block)
|
75
69
|
if pages?
|
76
|
-
|
77
|
-
@headers = response.headers
|
78
|
-
@status = response.status
|
79
|
-
@method = response.env[:method]
|
80
|
-
init_pages(@headers[:link])
|
81
|
-
@members = process_body(response)
|
82
|
-
block.call(@members)
|
83
|
-
while @link_hash['next'] && @members.present?
|
84
|
-
response = get_page(@link_hash['next'])
|
85
|
-
@headers = response.headers
|
86
|
-
@status = response.status
|
87
|
-
@method = response.env[:method]
|
70
|
+
iterate_pages(page_count) do |page_response|
|
88
71
|
@members = process_body(response)
|
89
|
-
|
72
|
+
break unless @members.present?
|
90
73
|
block.call(@members)
|
91
74
|
end
|
92
|
-
@link_hash = {}
|
93
75
|
else
|
94
76
|
block.call(@members)
|
95
77
|
end
|
96
78
|
end
|
97
79
|
|
98
|
-
def all_pages_each(page_count =
|
80
|
+
def all_pages_each(page_count = nil, &block)
|
99
81
|
each_page(page_count) do |page|
|
100
82
|
page.each &block
|
101
83
|
end
|
102
84
|
end
|
103
85
|
|
104
|
-
def all_pages!(page_count =
|
86
|
+
def all_pages!(page_count = nil)
|
105
87
|
if pages?
|
106
|
-
@
|
107
|
-
|
108
|
-
|
109
|
-
@status = response.status
|
110
|
-
@method = response.env[:method]
|
111
|
-
init_pages(@headers[:link])
|
112
|
-
@members = process_body(response)
|
113
|
-
while @link_hash['next']
|
114
|
-
response = get_page(@link_hash['next'])
|
115
|
-
@headers = response.headers
|
116
|
-
@status = response.status
|
117
|
-
@method = response.env[:method]
|
118
|
-
page_members = process_body(response)
|
88
|
+
@members = []
|
89
|
+
iterate_pages(page_count) do |page_response|
|
90
|
+
page_members = process_body(page_response)
|
119
91
|
break unless page_members.present?
|
120
92
|
@members.concat(page_members)
|
121
|
-
init_pages(@headers[:link])
|
122
93
|
end
|
123
94
|
@link_hash = {}
|
124
95
|
end
|
@@ -127,9 +98,10 @@ module Bearcat
|
|
127
98
|
|
128
99
|
private
|
129
100
|
|
130
|
-
def init_pages(link_header)
|
101
|
+
def init_pages(link_header = headers[:link])
|
131
102
|
@link_hash = {}
|
132
|
-
if
|
103
|
+
if headers.has_key? 'Link'
|
104
|
+
|
133
105
|
links = link_header.split(/,\s?/)
|
134
106
|
|
135
107
|
links.each do |link|
|
@@ -143,14 +115,11 @@ module Bearcat
|
|
143
115
|
|
144
116
|
def get_page(url, params = {})
|
145
117
|
params['per_page'] = @page_count unless params.key?('per_page') || !@page_count
|
146
|
-
query = URI.parse(url).query
|
147
|
-
p = CGI.parse(query)
|
148
|
-
u = url.gsub("?#{query}", '')
|
149
118
|
|
150
|
-
|
151
|
-
p
|
152
|
-
|
153
|
-
|
119
|
+
parsed_url = URI.parse(url)
|
120
|
+
p = parse_url_params(parsed_url)
|
121
|
+
u = url.gsub("?#{parsed_url.query}", '')
|
122
|
+
|
154
123
|
# merge params
|
155
124
|
p.merge!(params)
|
156
125
|
|
@@ -166,6 +135,44 @@ module Bearcat
|
|
166
135
|
end
|
167
136
|
end
|
168
137
|
|
138
|
+
def iterate_pages(per_page = @page_count)
|
139
|
+
return to_enum(:iterate_pages, per_page) unless block_given?
|
140
|
+
|
141
|
+
if per_page.present? && per_page != per_page_count && @link_hash['first']
|
142
|
+
@page_count = per_page
|
143
|
+
@raw_response = response = get_page(@link_hash['first'])
|
144
|
+
yield response
|
145
|
+
init_pages(headers[:link])
|
146
|
+
else
|
147
|
+
yield @raw_response
|
148
|
+
end
|
149
|
+
|
150
|
+
while @link_hash['next']
|
151
|
+
@raw_response = response = get_page(@link_hash['next'])
|
152
|
+
yield response
|
153
|
+
init_pages(headers[:link])
|
154
|
+
end
|
155
|
+
end
|
156
|
+
|
157
|
+
def per_page_count
|
158
|
+
url = raw_response.env[:url]
|
159
|
+
query_params = parse_url_params(url)
|
160
|
+
query_params[:per_page]&.to_i
|
161
|
+
end
|
162
|
+
|
163
|
+
def parse_url_params(url)
|
164
|
+
url = URI.parse(url) if url.is_a?(String)
|
165
|
+
p = CGI.parse(url.query || '')
|
166
|
+
p.default = nil
|
167
|
+
|
168
|
+
# strip value out of array if value is an array and key doesn't have [] (parameter is not an array parameter)
|
169
|
+
p.each { |k, v| p[k] = v.first if v.is_a?(Array) && k !~ /\[\]$/ }
|
170
|
+
# remove [] from key names, this is copied from rails' {}.transform_keys!
|
171
|
+
p.keys.each { |k| p[k.delete('[]')] = p.delete(k) }
|
172
|
+
|
173
|
+
p.with_indifferent_access
|
174
|
+
end
|
175
|
+
|
169
176
|
#TODO: This is a quick fix for JSONAPI responses if we need to do this for anything else we need to do this a better way
|
170
177
|
def self.array_key(response)
|
171
178
|
key = nil
|
data/lib/bearcat/version.rb
CHANGED
@@ -2,8 +2,17 @@ require 'helper'
|
|
2
2
|
|
3
3
|
describe Bearcat::ApiArray do
|
4
4
|
let(:api_client) { double }
|
5
|
+
let(:response_headers) { { } }
|
6
|
+
let(:response_env) { { url: "https://fake.com" } }
|
5
7
|
let(:response_body) { @response_body || [] }
|
6
|
-
let(:original_response)
|
8
|
+
let(:original_response) do
|
9
|
+
double(
|
10
|
+
body: response_body,
|
11
|
+
status: 200,
|
12
|
+
headers: Faraday::Utils::Headers.new(response_headers),
|
13
|
+
env: Faraday::Env.from(response_env)
|
14
|
+
)
|
15
|
+
end
|
7
16
|
|
8
17
|
describe 'get_page' do
|
9
18
|
let(:api_array) { described_class.process_response(original_response, api_client) }
|
@@ -55,6 +64,28 @@ describe Bearcat::ApiArray do
|
|
55
64
|
end
|
56
65
|
end
|
57
66
|
|
67
|
+
describe '#iterate_pages' do
|
68
|
+
let(:api_array) { described_class.process_response(original_response, api_client) }
|
69
|
+
|
70
|
+
let(:original_response) do
|
71
|
+
super().tap do |s|
|
72
|
+
s.headers['Link'] = [
|
73
|
+
'<https://fake.com?page=1>; rel="first"'
|
74
|
+
].join(', ')
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
it 're-requests the first-page if per_page has changed' do
|
79
|
+
expect(api_array).to receive(:get_page).and_return(original_response)
|
80
|
+
api_array.send(:iterate_pages, 10).to_a
|
81
|
+
end
|
82
|
+
|
83
|
+
it 'yields existing first-page if per_page is unchanged' do
|
84
|
+
expect(api_array).not_to receive(:get_page)
|
85
|
+
api_array.send(:iterate_pages, nil).to_a
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
58
89
|
context 'makes returned values indifferent' do
|
59
90
|
it 'makes a Hash response indifferent' do
|
60
91
|
@response_body = { something: 1 }
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: bearcat
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Nathan Mills, Jake Sorce
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-
|
11
|
+
date: 2020-04-13 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|