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.
- checksums.yaml +5 -5
- data/README.md +140 -107
- data/changelog.md +73 -44
- data/lib/quaderno-ruby.rb +3 -1
- data/lib/quaderno-ruby/base.rb +31 -14
- data/lib/quaderno-ruby/behavior/block.rb +5 -2
- data/lib/quaderno-ruby/behavior/crud.rb +64 -30
- data/lib/quaderno-ruby/behavior/deliver.rb +6 -2
- data/lib/quaderno-ruby/behavior/payment.rb +12 -6
- data/lib/quaderno-ruby/behavior/retrieve.rb +5 -2
- data/lib/quaderno-ruby/checkout_session.rb +4 -0
- data/lib/quaderno-ruby/collection.rb +17 -11
- data/lib/quaderno-ruby/exceptions/exceptions.rb +17 -9
- data/lib/quaderno-ruby/helpers/rate_limit.rb +12 -0
- data/lib/quaderno-ruby/payment.rb +1 -0
- data/lib/quaderno-ruby/report.rb +7 -7
- data/lib/quaderno-ruby/tax.rb +16 -9
- data/lib/quaderno-ruby/version.rb +1 -1
- data/quaderno.gemspec +3 -3
- metadata +11 -10
@@ -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.
|
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
|
-
|
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.
|
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
|
-
|
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.
|
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:
|
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
|
|
@@ -1,22 +1,28 @@
|
|
1
1
|
class Quaderno::Collection < Array
|
2
|
+
include Quaderno::Helpers::RateLimit
|
2
3
|
|
3
|
-
def
|
4
|
-
@
|
4
|
+
def request_options=(options)
|
5
|
+
@request_options = options
|
5
6
|
end
|
6
7
|
|
7
|
-
def
|
8
|
-
@
|
8
|
+
def collection_type=(collection_type)
|
9
|
+
@collection_type = collection_type
|
9
10
|
end
|
10
11
|
|
11
|
-
def
|
12
|
-
@
|
12
|
+
def has_more=(has_more_response)
|
13
|
+
@has_more = has_more_response
|
13
14
|
end
|
14
15
|
|
15
|
-
def
|
16
|
-
@
|
16
|
+
def next_page_url=(next_page_url)
|
17
|
+
@next_page_url = next_page_url
|
17
18
|
end
|
18
19
|
|
19
|
-
def
|
20
|
-
|
20
|
+
def has_more?
|
21
|
+
@has_more == 'true'
|
21
22
|
end
|
22
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
data/lib/quaderno-ruby/report.rb
CHANGED
@@ -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:
|
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:
|
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:
|
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
|
data/lib/quaderno-ruby/tax.rb
CHANGED
@@ -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]}
|
16
|
+
response = get("#{authentication[:url]}tax_rates/calculate.json",
|
17
17
|
query: params,
|
18
18
|
basic_auth: authentication[:basic_auth],
|
19
|
-
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]}
|
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:
|
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:
|
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
|
|
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 = "
|
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", "~>
|
31
|
-
spec.add_development_dependency("rake", "
|
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:
|
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:
|
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: '
|
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: '
|
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:
|
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:
|
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
|
-
|
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)
|