From d856e9e6b69bdb9cb01839f475f63a04d2f0560b Mon Sep 17 00:00:00 2001 From: Joe Stanton Date: Thu, 31 Oct 2013 14:47:56 +0000 Subject: [PATCH 1/2] Implemented automatic pagination for GET's Unless :auto_paginate => false --- lib/freeagent/client.rb | 45 ++++++++++++++++++++++++++++++++++++++++- 1 file changed, 44 insertions(+), 1 deletion(-) diff --git a/lib/freeagent/client.rb b/lib/freeagent/client.rb index 05e2291..17ea8c2 100644 --- a/lib/freeagent/client.rb +++ b/lib/freeagent/client.rb @@ -58,8 +58,37 @@ def access_token=(token) @access_token = OAuth2::AccessToken.new(@client, token) end + def get_default(params) + { + auto_paginate: true, + per_page: 100 + }.merge params + end + def get(path, params={}) - request(:get, "#{Client.site}#{path}", :params => params).parsed + response = request(:get, "#{Client.site}#{path}", :params => params) + params = get_default(params) + + if params[:auto_paginate] + auto_paginate(response, params) + else + response.parsed + end + end + + def auto_paginate(response, params) + rels = process_rels(response) + items = response.parsed + + while rels[:next] + response = request(:get, rels[:next], :params => params) + rels = process_rels(response) + items.merge response.parsed do |_, current, new| + current.concat new + end + end + + items end def post(path, data={}) @@ -76,6 +105,20 @@ def delete(path, data={}) private + # Finds link relations from 'Link' response header + # + # Returns an array of Relations + # https://github.com/lostisland/sawyer/blob/master/lib/sawyer/response.rb + def process_rels(response) + links = (response.headers["Link"] || "" ).split(', ').map do |link| + href, name = link.match(/<(.*?)>; rel=['"](\w+)["']/).captures + [name.to_sym, href] + end + + Hash[*links.flatten] + end + + def request(method, path, options = {}) if @access_token options[:body] = MultiJson.encode(options[:data]) unless options[:data].nil? From c2130b0b18c93f9be06c7ca6cc71fa773f246f3e Mon Sep 17 00:00:00 2001 From: Joe Stanton Date: Thu, 31 Oct 2013 16:08:10 +0000 Subject: [PATCH 2/2] Merge params before initial request --- lib/freeagent/client.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/freeagent/client.rb b/lib/freeagent/client.rb index 17ea8c2..c719724 100644 --- a/lib/freeagent/client.rb +++ b/lib/freeagent/client.rb @@ -66,8 +66,8 @@ def get_default(params) end def get(path, params={}) - response = request(:get, "#{Client.site}#{path}", :params => params) params = get_default(params) + response = request(:get, "#{Client.site}#{path}", :params => params) if params[:auto_paginate] auto_paginate(response, params)