quaderno 1.15.2 → 2.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -13,11 +13,15 @@ module Quaderno::Behavior
13
13
 
14
14
  party_response = api_model.get("#{authentication_data[:url]}#{api_model.api_path}/#{id}/deliver.json",
15
15
  basic_auth: authentication_data[:basic_auth],
16
- headers: self.class.version_header.merge(authentication_data[:headers])
16
+ headers: self.class.default_headers.merge(authentication_data[:headers])
17
17
  )
18
18
 
19
19
  api_model.check_exception_for(party_response, { rate_limit: true, subdomain_or_token: true, id: true, required_fields: true })
20
- { limit: party_response.headers["x-ratelimit-limit"].to_i, remaining: party_response.headers["x-ratelimit-remaining"].to_i }
20
+
21
+ data = Quaderno::Base.new(success: true)
22
+ data.rate_limit_info = party_response
23
+
24
+ data
21
25
  end
22
26
  end
23
27
  end
@@ -11,13 +11,13 @@ module Quaderno::Behavior
11
11
  def add_payment(params = {})
12
12
  if (params.keys.map(&:to_s) & %w(auth_token access_token api_url mode api_model)).any?
13
13
  self.authentication_data = get_authentication(params.merge(api_model: api_model))
14
- params = params.delete_if { |k, _| %w(auth_token access_token api_url mode api_model).include? k.to_s }
14
+ params = params.dup.delete_if { |k, _| %w(auth_token access_token api_url mode api_model).include? k.to_s }
15
15
  end
16
16
 
17
17
  response = api_model.post("#{authentication_data[:url]}#{api_model.api_path}/#{id}/payments.json",
18
18
  body: params,
19
19
  basic_auth: authentication_data[:basic_auth],
20
- headers: self.class.version_header.merge(authentication_data[:headers])
20
+ headers: self.class.default_headers.merge(authentication_data[:headers])
21
21
  )
22
22
 
23
23
  api_model.check_exception_for(response, { rate_limit: true, subdomain_or_token: true, required_fields: true })
@@ -25,23 +25,29 @@ module Quaderno::Behavior
25
25
  instance = Quaderno::Payment.new(response.parsed_response)
26
26
  self.payments << instance
27
27
 
28
- Quaderno::Payment.new instance
28
+ instance.rate_limit_info = response
29
+
30
+ instance
29
31
  end
30
32
 
31
33
  def remove_payment(payment_id, options = nil)
32
34
  self.authentication_data = get_authentication(options.merge(api_model: api_model)) if options.is_a?(Hash)
33
35
 
34
-
35
36
  response = HTTParty.delete("#{authentication_data[:url]}#{api_model.api_path}/#{id}/payments/#{payment_id}.json",
36
37
  basic_auth: authentication_data[:basic_auth],
37
- headers: self.class.version_header.merge(authentication_data[:headers])
38
+ headers: self.class.default_headers.merge(authentication_data[:headers])
38
39
  )
39
40
 
40
41
  api_model.check_exception_for(response, { rate_limit: true, subdomain_or_token: true, id: true })
41
42
 
42
43
  self.payments.delete_if { |payment| payment.id == payment_id }
43
44
 
44
- true
45
+ hash = { deleted: true, id: payment_id}
46
+
47
+ object = Quaderno::Payment.new(hash)
48
+ object.rate_limit_info = response
49
+
50
+ object
45
51
  end
46
52
  end
47
53
  end
@@ -13,14 +13,17 @@ module Quaderno::Behavior
13
13
 
14
14
  response = get("#{authentication[:url]}#{gateway}/#{@_retrieve_path}/#{gateway_id}.json",
15
15
  basic_auth: authentication[:basic_auth],
16
- headers: version_header.merge(authentication[:headers])
16
+ headers: default_headers.merge(authentication[:headers])
17
17
  )
18
18
 
19
19
  check_exception_for(response, { rate_limit: true, subdomain_or_token: true, id: true })
20
20
  hash = response.parsed_response
21
21
  hash[:authentication_data] = authentication
22
22
 
23
- new hash
23
+ object = new hash
24
+ object.rate_limit_info = response
25
+
26
+ object
24
27
  end
25
28
  alias_method :retrieve_customer, :retrieve
26
29
 
@@ -0,0 +1,4 @@
1
+ class Quaderno::CheckoutSession < Quaderno::Base
2
+ api_model Quaderno::CheckoutSession
3
+ api_path 'checkout/sessions'
4
+ end
@@ -1,22 +1,28 @@
1
1
  class Quaderno::Collection < Array
2
+ include Quaderno::Helpers::RateLimit
2
3
 
3
- def current_page=(page_number)
4
- @page = page_number
4
+ def request_options=(options)
5
+ @request_options = options
5
6
  end
6
7
 
7
- def current_page
8
- @page.to_i || 1
8
+ def collection_type=(collection_type)
9
+ @collection_type = collection_type
9
10
  end
10
11
 
11
- def total_pages=(total_pages)
12
- @total_pages = total_pages
12
+ def has_more=(has_more_response)
13
+ @has_more = has_more_response
13
14
  end
14
15
 
15
- def total_pages
16
- @total_pages.to_i || 1
16
+ def next_page_url=(next_page_url)
17
+ @next_page_url = next_page_url
17
18
  end
18
19
 
19
- def pagination_info
20
- { current_page: current_page, total_pages: total_pages }
20
+ def has_more?
21
+ @has_more == 'true'
21
22
  end
22
- end
23
+
24
+ def next_page
25
+ return Quaderno::Collection.new unless has_more?
26
+ @collection_type.all_from_url(@next_page_url, @request_options)
27
+ end
28
+ end
@@ -1,5 +1,6 @@
1
1
  module Quaderno::Exceptions
2
2
  class BaseException < StandardError
3
+ include Quaderno::Helpers::RateLimit
3
4
  end
4
5
 
5
6
  class InvalidSubdomainOrToken < BaseException
@@ -29,26 +30,33 @@ module Quaderno::Exceptions
29
30
 
30
31
  module ClassMethods
31
32
  def check_exception_for(party_response, params = {})
32
- raise(Quaderno::Exceptions::UnsupportedApiVersion, 'Unsupported API version') if !!(party_response.body =~ /Unsupported API version/)
33
+ raise_exception(Quaderno::Exceptions::UnsupportedApiVersion, 'Unsupported API version', party_response) if !!(party_response.body =~ /Unsupported API version/)
33
34
 
34
- if params[:throttle_limit].nil? == false
35
- raise(Quaderno::Exceptions::ThrottleLimitExceeded, 'Throttle limit exceeded, please try again later') if party_response.response.class == Net::HTTPServiceUnavailable
35
+ if params[:throttle_limit].nil? == false && party_response.response.class == Net::HTTPServiceUnavailable
36
+ raise_exception(Quaderno::Exceptions::ThrottleLimitExceeded, 'Throttle limit exceeded, please try again later', party_response)
36
37
  end
37
- if params[:rate_limit].nil? == false
38
- raise(Quaderno::Exceptions::RateLimitExceeded, 'Rate limit exceeded') if party_response.response.class == Net::HTTPForbidden
38
+ if params[:rate_limit].nil? == false && party_response.response.class == Net::HTTPForbidden
39
+ raise_exception(Quaderno::Exceptions::RateLimitExceeded, 'Rate limit exceeded', party_response)
39
40
  end
40
41
  if params[:subdomain_or_token].nil? == false
41
- raise(Quaderno::Exceptions::InvalidSubdomainOrToken, 'Invalid subdomain or token') if party_response.response.class == Net::HTTPUnauthorized
42
+ raise_exception(Quaderno::Exceptions::InvalidSubdomainOrToken, 'Invalid subdomain or token', party_response) if party_response.response.class == Net::HTTPUnauthorized
42
43
  end
43
44
  if params[:id].nil? == false
44
- raise(Quaderno::Exceptions::InvalidID, "Invalid #{ api_model } instance identifier") if (party_response.response.class == Net::HTTPInternalServerError) || (party_response.response.class == Net::HTTPNotFound)
45
+ raise_exception(Quaderno::Exceptions::InvalidID, "Invalid #{ api_model } instance identifier", party_response) if (party_response.response.class == Net::HTTPInternalServerError) || (party_response.response.class == Net::HTTPNotFound)
45
46
  end
46
47
  if params[:required_fields].nil? == false
47
- raise(Quaderno::Exceptions::RequiredFieldsEmptyOrInvalid, party_response.body) if party_response.response.class == Net::HTTPUnprocessableEntity
48
+ raise_exception(Quaderno::Exceptions::RequiredFieldsEmptyOrInvalid, party_response.body, party_response) if party_response.response.class == Net::HTTPUnprocessableEntity
48
49
  end
49
50
  if params[:has_documents].nil? == false
50
- raise(Quaderno::Exceptions::HasAssociatedDocuments, party_response.body) if party_response.response.class == Net::HTTPClientError
51
+ raise_exception(Quaderno::Exceptions::HasAssociatedDocuments, party_response.body, party_response) if party_response.response.class == Net::HTTPClientError
51
52
  end
52
53
  end
54
+
55
+ def raise_exception(klass, message, response)
56
+ exception = klass.new(message)
57
+ exception.rate_limit_info = response
58
+
59
+ raise exception
60
+ end
53
61
  end
54
62
  end
@@ -0,0 +1,12 @@
1
+ module Quaderno::Helpers
2
+ module RateLimit
3
+
4
+ def rate_limit_info=(response)
5
+ @rate_limit_info = { reset: response.headers['x-ratelimit-reset'].to_i, remaining: response.headers["x-ratelimit-remaining"].to_i }
6
+ end
7
+
8
+ def rate_limit_info
9
+ @rate_limit_info
10
+ end
11
+ end
12
+ end
@@ -1,2 +1,3 @@
1
1
  class Quaderno::Payment < OpenStruct
2
+ include Quaderno::Helpers::RateLimit
2
3
  end
@@ -8,12 +8,12 @@ class Quaderno::Report < Quaderno::Base
8
8
 
9
9
  def self.journal(options = {})
10
10
  authentication = get_authentication(options.merge(api_model: api_model))
11
- filter = options.delete_if { |k,v| %w(auth_token access_token api_url mode api_model).include? k.to_s }
11
+ filter = options.dup.delete_if { |k,v| %w(auth_token access_token api_url mode api_model).include? k.to_s }
12
12
 
13
13
  response = get("#{authentication[:url]}#{api_model.api_path}/journal.json",
14
14
  query: filter,
15
15
  basic_auth: authentication[:basic_auth],
16
- headers: version_header.merge(authentication[:headers])
16
+ headers: default_headers.merge(authentication[:headers])
17
17
  )
18
18
 
19
19
  check_exception_for(response, { rate_limit: true, subdomain_or_token: true })
@@ -23,12 +23,12 @@ class Quaderno::Report < Quaderno::Base
23
23
 
24
24
  def self.taxes(options = {})
25
25
  authentication = get_authentication(options.merge(api_model: api_model))
26
- filter = options.delete_if { |k,v| %w(auth_token access_token api_url mode api_model).include? k.to_s }
26
+ filter = options.dup.delete_if { |k,v| %w(auth_token access_token api_url mode api_model).include? k.to_s }
27
27
 
28
28
  response = get("#{authentication[:url]}#{api_model.api_path}/taxes.json",
29
29
  query: filter,
30
30
  basic_auth: authentication[:basic_auth],
31
- headers: version_header.merge(authentication[:headers])
31
+ headers: default_headers.merge(authentication[:headers])
32
32
  )
33
33
 
34
34
  check_exception_for(response, { rate_limit: true, subdomain_or_token: true })
@@ -60,12 +60,12 @@ class Quaderno::Report < Quaderno::Base
60
60
 
61
61
  def self.request_tax_report(tax_report_type, options)
62
62
  authentication = get_authentication(options.merge(api_model: api_model))
63
- filter = options.delete_if { |k,v| %w(auth_token access_token api_url mode api_model).include? k.to_s }
63
+ filter = options.dup.delete_if { |k,v| %w(auth_token access_token api_url mode api_model).include? k.to_s }
64
64
 
65
65
  response = get("#{authentication[:url]}#{api_model.api_path}/#{tax_report_type}.json",
66
66
  query: filter,
67
67
  basic_auth: authentication[:basic_auth],
68
- headers: version_header.merge(authentication[:headers])
68
+ headers: default_headers.merge(authentication[:headers])
69
69
  )
70
70
 
71
71
  check_exception_for(response, { rate_limit: true, subdomain_or_token: true })
@@ -75,4 +75,4 @@ class Quaderno::Report < Quaderno::Base
75
75
 
76
76
  collection
77
77
  end
78
- end
78
+ end
@@ -11,44 +11,51 @@ class Quaderno::Tax < Quaderno::Base
11
11
 
12
12
  def self.calculate(options = {})
13
13
  authentication = get_authentication(options.merge(api_model: api_model))
14
- params = options.delete_if { |k,v| %w(auth_token access_token api_url mode api_model).include? k.to_s }
14
+ params = options.dup.delete_if { |k,v| %w(auth_token access_token api_url mode api_model).include? k.to_s }
15
15
 
16
- response = get("#{authentication[:url]}taxes/calculate.json",
16
+ response = get("#{authentication[:url]}tax_rates/calculate.json",
17
17
  query: params,
18
18
  basic_auth: authentication[:basic_auth],
19
- headers: version_header.merge(authentication[:headers])
19
+ headers: default_headers.merge(authentication[:headers])
20
20
  )
21
21
 
22
22
  check_exception_for(response, { rate_limit: true, subdomain_or_token: true, id: true })
23
- new response.parsed_response
23
+ data = new response.parsed_response
24
+ data.rate_limit_info = response
25
+
26
+ data
24
27
  end
25
28
 
26
29
  def self.validate_vat_number(country, vat_number, options = {})
27
30
  authentication = get_authentication(options.merge(api_model: api_model))
28
31
 
29
- response = get("#{authentication[:url]}taxes/validate.json",
32
+ response = get("#{authentication[:url]}tax_ids/validate.json",
30
33
  query: { country: country, vat_number: vat_number },
31
34
  basic_auth: authentication[:basic_auth],
32
- headers: version_header.merge(authentication[:headers])
35
+ headers: default_headers.merge(authentication[:headers])
33
36
  )
34
37
 
35
38
  check_exception_for(response, { rate_limit: true, subdomain_or_token: true, id: true })
36
39
 
37
- response.parsed_response['valid']
40
+ data = new({ valid: response.parsed_response['valid'] })
41
+ data.rate_limit_info = response
42
+
43
+ data
38
44
  end
39
45
 
40
46
  def self.reports(options = {})
41
47
  authentication = get_authentication(options.merge(api_model: api_model))
42
- params = options.delete_if { |k,v| %w(auth_token access_token api_url mode api_model).include? k.to_s }
48
+ params = options.dup.delete_if { |k,v| %w(auth_token access_token api_url mode api_model).include? k.to_s }
43
49
 
44
50
  response = get("#{authentication[:url]}taxes/reports.json",
45
51
  query: params,
46
52
  basic_auth: authentication[:basic_auth],
47
- headers: version_header.merge(authentication[:headers])
53
+ headers: default_headers.merge(authentication[:headers])
48
54
  )
49
55
 
50
56
  array = response.parsed_response
51
57
  collection = Quaderno::Collection.new
58
+ collection.rate_limit_info = response
52
59
  collection.current_page = response.headers['x-pages-currentpage']
53
60
  collection.total_pages = response.headers['x-pages-totalpages']
54
61
 
@@ -1,3 +1,3 @@
1
1
  class Quaderno
2
- VERSION = "1.15.2"
2
+ VERSION = "2.0.1"
3
3
  end
data/quaderno.gemspec CHANGED
@@ -18,7 +18,7 @@ Gem::Specification.new do |spec|
18
18
  spec.bindir = "exe"
19
19
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
20
20
  spec.require_paths = %w(lib)
21
- spec.date = "2017-12-21"
21
+ spec.date = "2018-05-07"
22
22
  spec.extra_rdoc_files = %w(LICENSE.txt README.md)
23
23
 
24
24
 
@@ -27,7 +27,7 @@ Gem::Specification.new do |spec|
27
27
  spec.add_development_dependency('activesupport', "~> 4.2.0")
28
28
  spec.add_development_dependency('webmock', "~> 1.22.6")
29
29
  spec.add_development_dependency('vcr', ">= 0")
30
- spec.add_development_dependency("bundler", "~> 1.11")
31
- spec.add_development_dependency("rake", "~> 10.0")
30
+ spec.add_development_dependency("bundler", "~> 2.2")
31
+ spec.add_development_dependency("rake", ">= 12.3.3")
32
32
  spec.add_development_dependency("rspec", "~> 3.0")
33
33
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: quaderno
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.15.2
4
+ version: 2.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Recrea
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2017-12-21 00:00:00.000000000 Z
11
+ date: 2018-05-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: httparty
@@ -86,28 +86,28 @@ dependencies:
86
86
  requirements:
87
87
  - - "~>"
88
88
  - !ruby/object:Gem::Version
89
- version: '1.11'
89
+ version: '2.2'
90
90
  type: :development
91
91
  prerelease: false
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
94
  - - "~>"
95
95
  - !ruby/object:Gem::Version
96
- version: '1.11'
96
+ version: '2.2'
97
97
  - !ruby/object:Gem::Dependency
98
98
  name: rake
99
99
  requirement: !ruby/object:Gem::Requirement
100
100
  requirements:
101
- - - "~>"
101
+ - - ">="
102
102
  - !ruby/object:Gem::Version
103
- version: '10.0'
103
+ version: 12.3.3
104
104
  type: :development
105
105
  prerelease: false
106
106
  version_requirements: !ruby/object:Gem::Requirement
107
107
  requirements:
108
- - - "~>"
108
+ - - ">="
109
109
  - !ruby/object:Gem::Version
110
- version: '10.0'
110
+ version: 12.3.3
111
111
  - !ruby/object:Gem::Dependency
112
112
  name: rspec
113
113
  requirement: !ruby/object:Gem::Requirement
@@ -146,6 +146,7 @@ files:
146
146
  - lib/quaderno-ruby/behavior/deliver.rb
147
147
  - lib/quaderno-ruby/behavior/payment.rb
148
148
  - lib/quaderno-ruby/behavior/retrieve.rb
149
+ - lib/quaderno-ruby/checkout_session.rb
149
150
  - lib/quaderno-ruby/collection.rb
150
151
  - lib/quaderno-ruby/contact.rb
151
152
  - lib/quaderno-ruby/credit.rb
@@ -155,6 +156,7 @@ files:
155
156
  - lib/quaderno-ruby/exceptions/exceptions.rb
156
157
  - lib/quaderno-ruby/expense.rb
157
158
  - lib/quaderno-ruby/helpers/authentication.rb
159
+ - lib/quaderno-ruby/helpers/rate_limit.rb
158
160
  - lib/quaderno-ruby/income.rb
159
161
  - lib/quaderno-ruby/invoice.rb
160
162
  - lib/quaderno-ruby/item.rb
@@ -185,8 +187,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
185
187
  - !ruby/object:Gem::Version
186
188
  version: '0'
187
189
  requirements: []
188
- rubyforge_project:
189
- rubygems_version: 2.4.3
190
+ rubygems_version: 3.0.3
190
191
  signing_key:
191
192
  specification_version: 4
192
193
  summary: Ruby wrapper for the Quaderno API (https://quaderno.io/docs/api)