quaderno 1.15.2 → 2.0.1

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.
@@ -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)