From f990f7202b6323f7bdb0c8f192b9173360a84d67 Mon Sep 17 00:00:00 2001 From: Jan Szumiec Date: Wed, 28 Jan 2015 22:57:05 +0000 Subject: [PATCH 1/4] Category endpoint & resource. --- lib/freeagent.rb | 2 +- lib/freeagent/category.rb | 23 +++++++++++++++++++++++ 2 files changed, 24 insertions(+), 1 deletion(-) create mode 100644 lib/freeagent/category.rb diff --git a/lib/freeagent.rb b/lib/freeagent.rb index 55963e7..5cd35ee 100644 --- a/lib/freeagent.rb +++ b/lib/freeagent.rb @@ -7,7 +7,7 @@ module FreeAgent require_relative 'freeagent/company' require_relative 'freeagent/timeline_item' require_relative 'freeagent/attachment' - + require_relative 'freeagent/category' require_relative 'freeagent/contact' require_relative 'freeagent/project' require_relative 'freeagent/task' diff --git a/lib/freeagent/category.rb b/lib/freeagent/category.rb new file mode 100644 index 0000000..19689be --- /dev/null +++ b/lib/freeagent/category.rb @@ -0,0 +1,23 @@ +module FreeAgent + class Category < Resource + resource :category + endpoint[:plural] = :categories + + resource_methods :find + + attr_accessor :url, :description, :nominal_code, :allowable_for_tax, :tax_reporting_name, :auto_sales_tax_rate + + def self.all + response = FreeAgent.client.get("#{endpoint[:plural]}") + response.values.flatten.collect { |r| self.new(r) } + end + + def self.find(id) + response = FreeAgent.client.get("#{endpoint[:plural]}/#{id}") + self.new(response.values.first) + rescue FreeAgent::ApiError => error + raise error if FreeAgent.debug + nil + end + end +end From e683ebc57424bebefa35d11bc2fb108fdbea3935 Mon Sep 17 00:00:00 2001 From: Jan Szumiec Date: Sun, 1 Mar 2015 22:17:31 +0000 Subject: [PATCH 2/4] Added the BankTransactionExplanation resource. --- lib/freeagent.rb | 2 ++ lib/freeagent/bank_transaction_explanation.rb | 17 +++++++++++++++++ 2 files changed, 19 insertions(+) create mode 100644 lib/freeagent/bank_transaction_explanation.rb diff --git a/lib/freeagent.rb b/lib/freeagent.rb index 5cd35ee..daaadb9 100644 --- a/lib/freeagent.rb +++ b/lib/freeagent.rb @@ -19,6 +19,8 @@ module FreeAgent require_relative 'freeagent/estimate' require_relative 'freeagent/expense' require_relative 'freeagent/bank_transaction' + require_relative 'freeagent/bank_transaction_explanation' + class << self attr_accessor :environment attr_accessor :debug diff --git a/lib/freeagent/bank_transaction_explanation.rb b/lib/freeagent/bank_transaction_explanation.rb new file mode 100644 index 0000000..0ee0864 --- /dev/null +++ b/lib/freeagent/bank_transaction_explanation.rb @@ -0,0 +1,17 @@ +module FreeAgent + class BankTransactionExplanation < Resource + resource :bank_transaction_explanation + + resource_methods :default + attr_accessor :bank_account, :bank_transaction, :manual_sales_tax_amount, :sales_tax_rate, :description, + :gross_value, :foreign_currency_value, :rebill_type, :rebill_factor, :category, :paid_invoice, + :paid_bill, :paid_user, :transfer_bank_account, :asset_life_years, :attachment + + date_accessor :dated_on + + def self.find_all_by_bank_account(bank_account, options = {}) + options.merge!(:bank_account => bank_account) + BankTransactionExplanation.filter(options) + end + end +end From df1c8f0f8a1cf38835609ac2542313398b8c44db Mon Sep 17 00:00:00 2001 From: Jan Szumiec Date: Sun, 23 Aug 2015 20:50:24 +0100 Subject: [PATCH 3/4] * Pull out pagination information from the 'Link' header. * Backwards-compatible support for paginated collections. --- lib/freeagent.rb | 1 + lib/freeagent/client.rb | 16 +++++++++--- lib/freeagent/collection.rb | 49 +++++++++++++++++++++++++++++++++++++ lib/freeagent/resource.rb | 3 +-- 4 files changed, 63 insertions(+), 6 deletions(-) create mode 100644 lib/freeagent/collection.rb diff --git a/lib/freeagent.rb b/lib/freeagent.rb index daaadb9..f477117 100644 --- a/lib/freeagent.rb +++ b/lib/freeagent.rb @@ -2,6 +2,7 @@ module FreeAgent require_relative 'freeagent/client' require_relative 'freeagent/errors' + require_relative 'freeagent/collection' require_relative 'freeagent/resource' require_relative 'freeagent/user' require_relative 'freeagent/company' diff --git a/lib/freeagent/client.rb b/lib/freeagent/client.rb index 05e2291..e179d66 100644 --- a/lib/freeagent/client.rb +++ b/lib/freeagent/client.rb @@ -59,21 +59,29 @@ def access_token=(token) end def get(path, params={}) - request(:get, "#{Client.site}#{path}", :params => params).parsed + parse(request(:get, "#{Client.site}#{path}", :params => params)) end def post(path, data={}) - request(:post, "#{Client.site}#{path}", :data => data).parsed + parse(request(:post, "#{Client.site}#{path}", :data => data)) end def put(path, data={}) - request(:put, "#{Client.site}#{path}", :data => data).parsed + parse(request(:put, "#{Client.site}#{path}", :data => data)) end def delete(path, data={}) - request(:delete, "#{Client.site}#{path}", :data => data).parsed + parse(request(:delete, "#{Client.site}#{path}", :data => data)) end + def parse(request) + request.parsed.tap do |hash| + request.headers['Link'].scan(/<(https:.*?)>; rel='(prev|next|first|last)'/).each do |(url, rel)| + hash[rel] = url + end + end + end + private def request(method, path, options = {}) diff --git a/lib/freeagent/collection.rb b/lib/freeagent/collection.rb new file mode 100644 index 0000000..1f8eed6 --- /dev/null +++ b/lib/freeagent/collection.rb @@ -0,0 +1,49 @@ +module FreeAgent + class Collection < Array + def initialize(response, resource) + super(response[resource.endpoint[:plural]].collect { |r| resource.new(r) }) + @resource = resource + @next_page_url = response['next'] + @prev_page_url = response['prev'] + @first_page_url = response['first'] + @last_page_url = response['last'] + end + + def next_page? + @next_page_url + end + + def prev_page? + @prev_page_url + end + + def first_page? + @first_page_url + end + + def last_page? + @last_page_url + end + + def next_page + fetch_page(@next_page_url) + end + + def prev_page + fetch_page(@prev_page_url) + end + + def first_page + fetch_page(@first_page_url) + end + + def last_page + fetch_page(@last_page_url) + end + + def fetch_page(url) + uri = URI.parse(url).request_uri.gsub(/^\/v2/, '') + Collection.new(FreeAgent.client.get(uri), @resource) + end + end +end diff --git a/lib/freeagent/resource.rb b/lib/freeagent/resource.rb index 1e33c8b..c49dad2 100644 --- a/lib/freeagent/resource.rb +++ b/lib/freeagent/resource.rb @@ -112,8 +112,7 @@ def self.define_all def self.define_filter self.define_singleton_method(:filter) do |params| - response = FreeAgent.client.get("#{endpoint[:plural]}/", params) - response[endpoint[:plural]].collect{ |r| self.new(r) } + Collection.new(FreeAgent.client.get("#{endpoint[:plural]}/", params), self) end end From 84603b337f627742db4d8b57af7a33737d99bf89 Mon Sep 17 00:00:00 2001 From: Jan Szumiec Date: Mon, 24 Aug 2015 14:57:08 +0100 Subject: [PATCH 4/4] Quick fix for a case where there's no Link header. --- lib/freeagent/client.rb | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/lib/freeagent/client.rb b/lib/freeagent/client.rb index e179d66..d074db6 100644 --- a/lib/freeagent/client.rb +++ b/lib/freeagent/client.rb @@ -76,8 +76,10 @@ def delete(path, data={}) def parse(request) request.parsed.tap do |hash| - request.headers['Link'].scan(/<(https:.*?)>; rel='(prev|next|first|last)'/).each do |(url, rel)| - hash[rel] = url + if link_header = request.headers['Link'] + link_header.scan(/<(https:.*?)>; rel='(prev|next|first|last)'/).each do |(url, rel)| + hash[rel] = url + end end end end