quaderno 1.11.2 → 1.12.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (80) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile.lock +1 -1
  3. data/README.md +53 -1
  4. data/VERSION +1 -1
  5. data/changelog.md +3 -0
  6. data/lib/quaderno-ruby/base.rb +12 -2
  7. data/lib/quaderno-ruby/behavior/crud.rb +56 -11
  8. data/lib/quaderno-ruby/behavior/deliver.rb +10 -2
  9. data/lib/quaderno-ruby/behavior/payment.rb +23 -4
  10. data/lib/quaderno-ruby/behavior/retrieve.rb +11 -2
  11. data/lib/quaderno-ruby/collection.rb +22 -0
  12. data/lib/quaderno-ruby/helpers/authentication.rb +26 -0
  13. data/lib/quaderno-ruby.rb +4 -1
  14. data/quaderno.gemspec +16 -5
  15. data/test/fixtures/quaderno_cassettes/all_contacts.yml +11 -282
  16. data/test/fixtures/quaderno_cassettes/all_contacts_by_access_token.yml +56 -0
  17. data/test/fixtures/quaderno_cassettes/all_contacts_by_authentication_token.yml +57 -0
  18. data/test/fixtures/quaderno_cassettes/all_estimates.yml +10 -14
  19. data/test/fixtures/quaderno_cassettes/all_expenses.yml +14 -47
  20. data/test/fixtures/quaderno_cassettes/all_invoices.yml +13 -2873
  21. data/test/fixtures/quaderno_cassettes/all_items.yml +8 -8
  22. data/test/fixtures/quaderno_cassettes/all_receipts.yml +11 -14
  23. data/test/fixtures/quaderno_cassettes/all_webhooks.yml +40 -36
  24. data/test/fixtures/quaderno_cassettes/create_estimate_on_downgraded_API.yml +46 -318
  25. data/test/fixtures/quaderno_cassettes/create_expense_on_downgraded_API.yml +125 -357
  26. data/test/fixtures/quaderno_cassettes/create_invoice_on_downgraded_API.yml +45 -318
  27. data/test/fixtures/quaderno_cassettes/create_receipt_on_downgraded_API.yml +56 -53
  28. data/test/fixtures/quaderno_cassettes/deleted_contact.yml +40 -592
  29. data/test/fixtures/quaderno_cassettes/deleted_contact_by_access_token.yml +199 -0
  30. data/test/fixtures/quaderno_cassettes/deleted_contact_by_authentication_token.yml +199 -0
  31. data/test/fixtures/quaderno_cassettes/deleted_estimate.yml +40 -334
  32. data/test/fixtures/quaderno_cassettes/deleted_expense.yml +43 -364
  33. data/test/fixtures/quaderno_cassettes/deleted_invoice.yml +44 -3199
  34. data/test/fixtures/quaderno_cassettes/deleted_item.yml +22 -22
  35. data/test/fixtures/quaderno_cassettes/deleted_receipt.yml +43 -42
  36. data/test/fixtures/quaderno_cassettes/deleted_webhook.yml +48 -44
  37. data/test/fixtures/quaderno_cassettes/delivered_estimate.yml +25 -32
  38. data/test/fixtures/quaderno_cassettes/delivered_invoice.yml +29 -2888
  39. data/test/fixtures/quaderno_cassettes/delivered_receipt.yml +29 -29
  40. data/test/fixtures/quaderno_cassettes/evidence_invoice.yml +19 -354
  41. data/test/fixtures/quaderno_cassettes/found_contact.yml +19 -291
  42. data/test/fixtures/quaderno_cassettes/found_contact_by_access_token.yml +99 -0
  43. data/test/fixtures/quaderno_cassettes/found_contact_by_authentication_token.yml +100 -0
  44. data/test/fixtures/quaderno_cassettes/found_estimate.yml +20 -24
  45. data/test/fixtures/quaderno_cassettes/found_expense.yml +24 -94
  46. data/test/fixtures/quaderno_cassettes/found_invoice.yml +22 -2886
  47. data/test/fixtures/quaderno_cassettes/found_item.yml +18 -16
  48. data/test/fixtures/quaderno_cassettes/found_receipt.yml +21 -24
  49. data/test/fixtures/quaderno_cassettes/found_webhook.yml +24 -22
  50. data/test/fixtures/quaderno_cassettes/new_contact.yml +9 -7
  51. data/test/fixtures/quaderno_cassettes/new_contact_by_access_token.yml +48 -0
  52. data/test/fixtures/quaderno_cassettes/new_contact_by_authentication_token.yml +48 -0
  53. data/test/fixtures/quaderno_cassettes/new_estimate.yml +29 -320
  54. data/test/fixtures/quaderno_cassettes/new_evidence.yml +10 -8
  55. data/test/fixtures/quaderno_cassettes/new_expense.yml +42 -363
  56. data/test/fixtures/quaderno_cassettes/new_invoice.yml +29 -324
  57. data/test/fixtures/quaderno_cassettes/new_item.yml +10 -8
  58. data/test/fixtures/quaderno_cassettes/new_receipt.yml +28 -24
  59. data/test/fixtures/quaderno_cassettes/new_webhook.yml +16 -14
  60. data/test/fixtures/quaderno_cassettes/paid_expense.yml +22 -52
  61. data/test/fixtures/quaderno_cassettes/paid_invoice.yml +22 -2879
  62. data/test/fixtures/quaderno_cassettes/rate_limit.yml +5 -5
  63. data/test/fixtures/quaderno_cassettes/unpay_an_expense.yml +29 -61
  64. data/test/fixtures/quaderno_cassettes/unpay_an_invoice.yml +28 -2888
  65. data/test/fixtures/quaderno_cassettes/updated_contact.yml +22 -292
  66. data/test/fixtures/quaderno_cassettes/updated_contact_by_access_token.yml +101 -0
  67. data/test/fixtures/quaderno_cassettes/updated_contact_by_authentication_token.yml +102 -0
  68. data/test/fixtures/quaderno_cassettes/updated_estimate.yml +44 -353
  69. data/test/fixtures/quaderno_cassettes/updated_expense.yml +43 -346
  70. data/test/fixtures/quaderno_cassettes/updated_invoice.yml +43 -361
  71. data/test/fixtures/quaderno_cassettes/updated_item.yml +21 -17
  72. data/test/fixtures/quaderno_cassettes/updated_receipt.yml +47 -41
  73. data/test/fixtures/quaderno_cassettes/updated_webhook.yml +35 -31
  74. data/test/helper.rb +2 -1
  75. data/test/unit/test_quaderno_contacts.rb +1 -1
  76. data/test/unit/test_quaderno_contacts_thread_safe.rb +104 -0
  77. data/test/unit/test_quaderno_expenses.rb +5 -5
  78. metadata +15 -4
  79. data/test/fixtures/quaderno_cassettes/calculate_tax.yml +0 -85
  80. data/test/fixtures/quaderno_cassettes/wrong_token.yml +0 -36
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 470de4559fa2e97d4765b34b5d73613c8dd1f388
4
- data.tar.gz: 437161875f0a344443d824d40998c115446600db
3
+ metadata.gz: 99d18f2cc67c9df4eb49d8bf5c545a966c6ff520
4
+ data.tar.gz: 2e605b26ce41c9f45b8871852b4cd5251e14f8d5
5
5
  SHA512:
6
- metadata.gz: 06dde9c589f2dbcb3e56e2aed929798a94035f024db6a2c5ea6fabb1a1e5e9571170ead4522d74a13efb2dfacb844513dd75dd01dd761ccaf18464317a558b92
7
- data.tar.gz: 7fa2dee669868d93400484a84e8f7f2a55279366a803230e1695c087c53e3f67acbc7c4d76e8b3e8fef29976487d270506e65a08f3c7ca722b8fad751c16c260
6
+ metadata.gz: 918acf002048a31ff6f8830d23d72e8ba1a66825aba93322e9a9c1c86e6d8bd4d80ee47f3084bba1bc18c886af56c31f29dd5b6875b675155e3fe4f19b8ca97d
7
+ data.tar.gz: 70fecee7f72f788b1d35c4936199dfae703d89f7b9f824b1c29c266af9af90209f5182867b09ce0790f8be50600b129833db420ff306995c61bc9d13f40f158d
data/Gemfile.lock CHANGED
@@ -29,7 +29,7 @@ GEM
29
29
  httparty (0.13.1)
30
30
  json (~> 1.8)
31
31
  multi_xml (>= 0.5.2)
32
- i18n (0.6.9)
32
+ i18n (0.7.0)
33
33
  jeweler (2.0.1)
34
34
  builder
35
35
  bundler (>= 1.0)
data/README.md CHANGED
@@ -3,7 +3,7 @@
3
3
  Quaderno-ruby is a ruby wrapper for [Quaderno API] (https://github.com/quaderno/quaderno-api).
4
4
  As the API, it's mostly CRUD.
5
5
 
6
- Current version is 1.11.2 See the changelog [here](https://github.com/quaderno/quaderno-ruby/blob/master/changelog.md)
6
+ Current version is 1.12.0 See the changelog [here](https://github.com/quaderno/quaderno-ruby/blob/master/changelog.md)
7
7
 
8
8
  ## Installation & Configuration
9
9
 
@@ -588,6 +588,58 @@ Quaderno-ruby exceptions raise depending on the type of error:
588
588
 
589
589
  All those exceptions inherit from `Quaderno::Exceptions::BaseException`.
590
590
 
591
+ ### Pagination information
592
+ Whenever you call the `all` method on one of the classes, the result will be a `Quaderno::Collection`. For example:
593
+
594
+ ```ruby
595
+ collection = Quaderno::Contact.all(page: 2)
596
+
597
+ collection.class #=> Quaderno::Collection
598
+ collection.pagination_info #=> {:current_page=>"1", :total_pages=>"3"}
599
+ collection.current_page #=> "2"
600
+ collection.total_pages #=> "3"
601
+ ```
602
+
603
+ ### Thread-safe configuration
604
+
605
+ If you are managing multiple accounts you may need a thread-safe way to configure the credentials. You can do it by passing the credentials on each request:
606
+
607
+ ```ruby
608
+ Quaderno::Invoice.all(
609
+ api_url: 'https://my_subdomain.quadernoapp.com/api/',
610
+ auth_token: 'my_authenticate_token'
611
+ )
612
+
613
+ Quaderno::Invoice.find(INVOICE_ID,
614
+ api_url: 'https://my_subdomain.quadernoapp.com/api/',
615
+ auth_token: 'my_authenticate_token'
616
+ )
617
+
618
+ Quaderno::Invoice.update(INVOICE_ID,
619
+ po_number: '12345',
620
+ api_url: 'https://my_subdomain.quadernoapp.com/api/',
621
+ auth_token: 'my_authenticate_token'
622
+ )
623
+
624
+ invoice = Quaderno::Invoice.find(INVOICE_ID,
625
+ api_url: 'https://my_subdomain.quadernoapp.com/api/',
626
+ auth_token: 'my_authenticate_token'
627
+ )
628
+
629
+ invoice.add_payment(params) # Credentials are already stored on the Quaderno::Invoice instance from the first request
630
+
631
+ invoice = Quaderno::Invoice.find(INVOICE_ID,
632
+ api_url: 'https://my_subdomain.quadernoapp.com/api/',
633
+ auth_token: 'my_authenticate_token'
634
+ )
635
+ invoice.remove_payment(PAYMENT_ID) # Credentials are already stored on the Quaderno::Invoice instance from the first request
636
+
637
+ Quaderno::Invoice.delete(INVOICE_ID,
638
+ api_url: 'https://my_subdomain.quadernoapp.com/api/',
639
+ auth_token: 'my_authenticate_token'
640
+ )
641
+ ```
642
+
591
643
  ## More information
592
644
 
593
645
  Remember this is only a ruby wrapper for the original API. If you want more information about the API itself, head to the original [API documentation](https://quaderno.io/docs/api/).
data/VERSION CHANGED
@@ -1 +1 @@
1
- 1.11.2
1
+ 1.12.0
data/changelog.md CHANGED
@@ -1,4 +1,7 @@
1
1
  #Changelog
2
+ ##1.12.0
3
+ * Added thread-safe credentials configuration.
4
+ * `all` methods returns a `Quaderno::Object` with pagination info instead of an `Array`
2
5
 
3
6
  ##1.11.2
4
7
  * Specify `Content-Type` header so `HTTParty` don't merge the elements within the body content.
@@ -6,6 +6,7 @@ module Quaderno
6
6
  include HTTParty
7
7
  include Quaderno::Exceptions
8
8
  include Quaderno::Behavior::Crud
9
+ include Quaderno::Helpers::Authentication
9
10
 
10
11
  PRODUCTION_URL = 'https://quadernoapp.com/api/'
11
12
  SANDBOX_URL = 'http://sandbox-quadernoapp.com/api/'
@@ -58,9 +59,18 @@ module Quaderno
58
59
  end
59
60
 
60
61
  #Check the connection
61
- def self.ping
62
+ def self.ping(options = {})
62
63
  begin
63
- party_response = get("#{@@url}ping.json", basic_auth: { username: auth_token }, headers: version_header)
64
+ options[:auth_token] ||= auth_token
65
+ options[:url] ||= url
66
+
67
+ authentication = get_authentication(options)
68
+
69
+ party_response = get("#{authentication[:url]}ping.json",
70
+ basic_auth: authentication[:basic_auth],
71
+ headers: version_header.merge(authentication[:headers])
72
+ )
73
+
64
74
  check_exception_for(party_response, { subdomain_or_token: true })
65
75
  rescue Errno::ECONNREFUSED
66
76
  return false
@@ -1,11 +1,14 @@
1
1
  module Quaderno
2
2
  module Behavior
3
3
  module Crud
4
+
4
5
  def self.included(receiver)
5
6
  receiver.send :extend, ClassMethods
6
7
  end
7
8
 
8
9
  module ClassMethods
10
+ include Quaderno::Helpers::Authentication
11
+
9
12
  def parse_nested(element)
10
13
  if element.has_key?('payments')
11
14
  payments_collection = Array.new
@@ -21,14 +24,23 @@ module Quaderno
21
24
  element
22
25
  end
23
26
 
24
- def all(filter = nil)
25
- response = get("#{api_model.url}#{ api_model.api_path }.json", body: filter, basic_auth: { username: api_model.auth_token }, headers: version_header)
27
+ def all(options = {})
28
+ authentication = get_authentication(options.merge(api_model: api_model))
29
+ filter = options.delete_if { |k,v| %w(auth_token access_token api_url mode api_model).include? k.to_s }
30
+
31
+ response = get("#{authentication[:url]}#{api_model.api_path}.json",
32
+ query: filter,
33
+ basic_auth: authentication[:basic_auth],
34
+ headers: version_header.merge(authentication[:headers])
35
+ )
36
+
26
37
  check_exception_for(response, { rate_limit: true, subdomain_or_token: true })
27
38
  array = response.parsed_response
28
- collection = Array.new
39
+ collection = Quaderno::Collection.new
29
40
 
30
41
  if is_a_document?
31
42
  array.each do |element|
43
+ element[:authentication_data] = authentication
32
44
  api_model.parse_nested(element)
33
45
  collection << (new element)
34
46
  end
@@ -36,41 +48,74 @@ module Quaderno
36
48
  array.each { |element| collection << (new element) }
37
49
  end
38
50
 
51
+ collection.current_page = response.headers['x-pages-currentpage']
52
+ collection.total_pages = response.headers['x-pages-totalpages']
53
+
39
54
  collection
40
55
  end
41
56
 
42
- def find(id)
43
- response = get "#{api_model.url}#{ api_model.api_path }/#{ id }.json", basic_auth: { username: api_model.auth_token }, headers: version_header
57
+ def find(id, options = {})
58
+ authentication = get_authentication(options.merge(api_model: api_model))
59
+
60
+ response = get("#{authentication[:url]}#{api_model.api_path}/#{id}.json",
61
+ basic_auth: authentication[:basic_auth],
62
+ headers: version_header.merge(authentication[:headers])
63
+ )
64
+
44
65
  check_exception_for(response, { rate_limit: true, subdomain_or_token: true, id: true })
45
66
  hash = response.parsed_response
67
+ hash[:authentication_data] = authentication
46
68
 
47
69
  api_model.parse_nested(hash) if is_a_document?
48
70
 
49
71
  new hash
50
72
  end
51
73
 
52
- def create(params)
53
- response = post "#{api_model.url}#{ api_model.api_path }.json", body: params.to_json, basic_auth: { username: api_model.auth_token }, headers: version_header.merge('Content-Type' => 'application/json')
74
+ def create(params = {})
75
+ authentication = get_authentication(params.merge(api_model: api_model))
76
+ params.delete_if { |k,v| %w(auth_token access_token api_url mode api_model').include? k.to_s }
77
+
78
+ response = post("#{authentication[:url]}#{api_model.api_path}.json",
79
+ body: params.to_json,
80
+ basic_auth: authentication[:basic_auth],
81
+ headers: version_header.merge(authentication[:headers]).merge('Content-Type' => 'application/json')
82
+ )
83
+
54
84
  check_exception_for(response, { rate_limit: true, subdomain_or_token: true, required_fields: true })
55
85
  hash = response.parsed_response
86
+ hash[:authentication_data] = authentication
56
87
 
57
88
  api_model.parse_nested(hash) if is_a_document?
58
89
 
59
90
  new hash
60
91
  end
61
92
 
62
- def update(id, params)
63
- response = put "#{api_model.url}#{ api_model.api_path }/#{ id }.json", body: params.to_json, basic_auth: { username: api_model.auth_token }, headers: version_header.merge('Content-Type' => 'application/json')
93
+ def update(id, params = {})
94
+ authentication = get_authentication(params.merge(api_model: api_model))
95
+ params = params.delete_if { |k,v| %w(auth_token access_token api_url mode api_model').include? k.to_s }
96
+
97
+ response = put("#{authentication[:url]}#{api_model.api_path}/#{id}.json",
98
+ body: params.to_json,
99
+ basic_auth: authentication[:basic_auth],
100
+ headers: version_header.merge(authentication[:headers]).merge('Content-Type' => 'application/json')
101
+ )
102
+
64
103
  check_exception_for(response, { rate_limit: true, required_fields: true, subdomain_or_token: true, id: true })
65
104
  hash = response.parsed_response
105
+ hash[:authentication_data] = authentication
66
106
 
67
107
  api_model.parse_nested(hash) if is_a_document?
68
108
 
69
109
  new hash
70
110
  end
71
111
 
72
- def delete(id)
73
- response = HTTParty.delete "#{api_model.url}#{ api_model.api_path }/#{ id }.json", basic_auth: { username: api_model.auth_token }, headers: version_header
112
+ def delete(id, options = {})
113
+ authentication = get_authentication(options.merge(api_model: api_model))
114
+
115
+ response = HTTParty.delete("#{authentication[:url]}#{ api_model.api_path }/#{ id }.json",
116
+ basic_auth: authentication[:basic_auth],
117
+ headers: version_header.merge(authentication[:headers])
118
+ )
74
119
  check_exception_for(response, { rate_limit: true, subdomain_or_token: true, id: true, has_documents: true })
75
120
 
76
121
  true
@@ -7,8 +7,16 @@ module Quaderno
7
7
  end
8
8
 
9
9
  module InstanceMethods
10
- def deliver
11
- party_response = api_model.get("#{api_model.url}#{ api_model.api_path }/#{ id }/deliver.json", basic_auth: { username: api_model.auth_token }, headers: self.class.version_header)
10
+ include Quaderno::Helpers::Authentication
11
+
12
+ def deliver(options = nil)
13
+ self.authentication_data = get_authentication(options.merge(api_model: api_model)) if options.is_a?(Hash)
14
+
15
+ party_response = api_model.get("#{authentication_data[:url]}#{api_model.api_path}/#{id}/deliver.json",
16
+ basic_auth: authentication_data[:basic_auth],
17
+ headers: self.class.version_header.merge(authentication_data[:headers])
18
+ )
19
+
12
20
  api_model.check_exception_for(party_response, { rate_limit: true, subdomain_or_token: true, id: true, required_fields: true })
13
21
  { limit: party_response.headers["x-ratelimit-limit"].to_i, remaining: party_response.headers["x-ratelimit-remaining"].to_i }
14
22
  end
@@ -1,14 +1,26 @@
1
1
  module Quaderno
2
2
  module Behavior
3
3
  module Payment
4
+
4
5
  def self.included(base)
5
6
  base.send :include, InstanceMethods
6
7
  end
7
8
 
8
9
  module InstanceMethods
10
+ include Quaderno::Helpers::Authentication
11
+
12
+ def add_payment(params = {})
13
+ if (params.keys.map(&:to_s) & %w(auth_token access_token api_url mode api_model)).any?
14
+ self.authentication_data = get_authentication(params.merge(api_model: api_model))
15
+ params = params.delete_if { |k, _| %w(auth_token access_token api_url mode api_model).include? k.to_s }
16
+ end
17
+
18
+ response = api_model.post("#{authentication_data[:url]}#{api_model.api_path}/#{id}/payments.json",
19
+ body: params,
20
+ basic_auth: authentication_data[:basic_auth],
21
+ headers: self.class.version_header.merge(authentication_data[:headers])
22
+ )
9
23
 
10
- def add_payment(params)
11
- response = api_model.post "#{api_model.url}#{ api_model.api_path }/#{ id }/payments.json", body: params, basic_auth: { username: api_model.auth_token }, headers: self.class.version_header
12
24
  api_model.check_exception_for(response, { rate_limit: true, subdomain_or_token: true, required_fields: true })
13
25
 
14
26
  instance = Quaderno::Payment.new(response.parsed_response)
@@ -17,8 +29,15 @@ module Quaderno
17
29
  Quaderno::Payment.new instance
18
30
  end
19
31
 
20
- def remove_payment(payment_id)
21
- response = HTTParty.delete "#{api_model.url}#{ api_model.api_path }/#{ id }/payments/#{ payment_id }.json", basic_auth: { username: api_model.auth_token }, headers: self.class.version_header
32
+ def remove_payment(payment_id, options = nil)
33
+ self.authentication_data = get_authentication(options.merge(api_model: api_model)) if options.is_a?(Hash)
34
+
35
+
36
+ response = HTTParty.delete("#{authentication_data[:url]}#{api_model.api_path}/#{id}/payments/#{payment_id}.json",
37
+ basic_auth: authentication_data[:basic_auth],
38
+ headers: self.class.version_header.merge(authentication_data[:headers])
39
+ )
40
+
22
41
  api_model.check_exception_for(response, { rate_limit: true, subdomain_or_token: true, id: true })
23
42
 
24
43
  self.payments.delete_if { |payment| payment.id == payment_id }
@@ -1,16 +1,25 @@
1
1
  module Quaderno
2
2
  module Behavior
3
3
  module Retrieve
4
+
4
5
  def self.included(receiver)
5
6
  receiver.send :extend, ClassMethods
6
7
  end
7
8
 
8
9
  module ClassMethods
10
+ include Quaderno::Helpers::Authentication
11
+
12
+ def retrieve(gateway_id, gateway = 'stripe', options = {})
13
+ authentication = get_authentication(options.merge(api_model: api_model))
14
+
15
+ response = get("#{authentication[:url]}#{gateway}/#{@_retrieve_path}/#{gateway_id}.json",
16
+ basic_auth: authentication[:basic_auth],
17
+ headers: version_header.merge(authentication[:headers])
18
+ )
9
19
 
10
- def retrieve(gateway_id, gateway = nil)
11
- response = get "#{api_model.url}#{gateway || 'stripe'}/#{@_retrieve_path}/#{gateway_id}.json", basic_auth: { username: api_model.auth_token }, headers: version_header
12
20
  check_exception_for(response, { rate_limit: true, subdomain_or_token: true, id: true })
13
21
  hash = response.parsed_response
22
+ hash[:authentication_data] = authentication
14
23
 
15
24
  new hash
16
25
  end
@@ -0,0 +1,22 @@
1
+ class Quaderno::Collection < Array
2
+
3
+ def current_page=(page_number)
4
+ @page = page_number
5
+ end
6
+
7
+ def current_page
8
+ @page || 1
9
+ end
10
+
11
+ def total_pages=(total_pages)
12
+ @total_pages = total_pages
13
+ end
14
+
15
+ def total_pages
16
+ @total_pages || 1
17
+ end
18
+
19
+ def pagination_info
20
+ { current_page: current_page, total_pages: total_pages }
21
+ end
22
+ end
@@ -0,0 +1,26 @@
1
+ module Quaderno
2
+ module Helpers
3
+ module Authentication
4
+
5
+ def get_authentication(options = {})
6
+ mode = options[:mode] || :production
7
+
8
+ local_api_model = options[:api_model]
9
+ url = options[:api_url] || (local_api_model && local_api_model.url) || (mode == :production ? 'https://quadernoapp.com/api/' : 'http://sandbox-quadernoapp.com/api/')
10
+
11
+ auth_token = options[:auth_token] || options['auth_token'] || (local_api_model && local_api_model.auth_token)
12
+ access_token = options[:access_token] || options['access_token']
13
+
14
+ authentication = { url: url, headers: {}, basic_auth: nil }
15
+
16
+ if access_token
17
+ authentication[:headers] = { 'Authorization' => "Bearer #{access_token}" }
18
+ elsif auth_token
19
+ authentication[:basic_auth] = { username: auth_token }
20
+ end
21
+
22
+ authentication
23
+ end
24
+ end
25
+ end
26
+ end
data/lib/quaderno-ruby.rb CHANGED
@@ -1,7 +1,10 @@
1
1
  require 'ostruct'
2
2
 
3
3
  require 'quaderno-ruby/exceptions/exceptions'
4
- %w(crud deliver payment retrieve).each { |filename| require "quaderno-ruby/behavior/#{ filename }" }
4
+ require 'quaderno-ruby/helpers/authentication'
5
+ require 'quaderno-ruby/collection'
6
+
7
+ %w(crud deliver payment retrieve).each { |filename| require "quaderno-ruby/behavior/#{filename}" }
5
8
  %w(base contact item invoice receipt credit estimate expense recurring document_item evidence payment webhook tax).each { |filename| require "quaderno-ruby/#{ filename }" }
6
9
 
7
10
  module Quaderno
data/quaderno.gemspec CHANGED
@@ -2,16 +2,16 @@
2
2
  # DO NOT EDIT THIS FILE DIRECTLY
3
3
  # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
4
4
  # -*- encoding: utf-8 -*-
5
- # stub: quaderno 1.11.2 ruby lib
5
+ # stub: quaderno 1.12.0 ruby lib
6
6
 
7
7
  Gem::Specification.new do |s|
8
8
  s.name = "quaderno"
9
- s.version = "1.11.2"
9
+ s.version = "1.12.0"
10
10
 
11
11
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
12
12
  s.require_paths = ["lib"]
13
13
  s.authors = ["Recrea"]
14
- s.date = "2017-03-14"
14
+ s.date = "2017-06-14"
15
15
  s.description = " A ruby wrapper for Quaderno API "
16
16
  s.email = "carlos@recrea.es"
17
17
  s.extra_rdoc_files = [
@@ -33,6 +33,7 @@ Gem::Specification.new do |s|
33
33
  "lib/quaderno-ruby/behavior/deliver.rb",
34
34
  "lib/quaderno-ruby/behavior/payment.rb",
35
35
  "lib/quaderno-ruby/behavior/retrieve.rb",
36
+ "lib/quaderno-ruby/collection.rb",
36
37
  "lib/quaderno-ruby/contact.rb",
37
38
  "lib/quaderno-ruby/credit.rb",
38
39
  "lib/quaderno-ruby/document_item.rb",
@@ -40,6 +41,7 @@ Gem::Specification.new do |s|
40
41
  "lib/quaderno-ruby/evidence.rb",
41
42
  "lib/quaderno-ruby/exceptions/exceptions.rb",
42
43
  "lib/quaderno-ruby/expense.rb",
44
+ "lib/quaderno-ruby/helpers/authentication.rb",
43
45
  "lib/quaderno-ruby/invoice.rb",
44
46
  "lib/quaderno-ruby/item.rb",
45
47
  "lib/quaderno-ruby/payment.rb",
@@ -50,18 +52,21 @@ Gem::Specification.new do |s|
50
52
  "quaderno.gemspec",
51
53
  "test/fixtures/quaderno_cassettes/.DS_Store",
52
54
  "test/fixtures/quaderno_cassettes/all_contacts.yml",
55
+ "test/fixtures/quaderno_cassettes/all_contacts_by_access_token.yml",
56
+ "test/fixtures/quaderno_cassettes/all_contacts_by_authentication_token.yml",
53
57
  "test/fixtures/quaderno_cassettes/all_estimates.yml",
54
58
  "test/fixtures/quaderno_cassettes/all_expenses.yml",
55
59
  "test/fixtures/quaderno_cassettes/all_invoices.yml",
56
60
  "test/fixtures/quaderno_cassettes/all_items.yml",
57
61
  "test/fixtures/quaderno_cassettes/all_receipts.yml",
58
62
  "test/fixtures/quaderno_cassettes/all_webhooks.yml",
59
- "test/fixtures/quaderno_cassettes/calculate_tax.yml",
60
63
  "test/fixtures/quaderno_cassettes/create_estimate_on_downgraded_API.yml",
61
64
  "test/fixtures/quaderno_cassettes/create_expense_on_downgraded_API.yml",
62
65
  "test/fixtures/quaderno_cassettes/create_invoice_on_downgraded_API.yml",
63
66
  "test/fixtures/quaderno_cassettes/create_receipt_on_downgraded_API.yml",
64
67
  "test/fixtures/quaderno_cassettes/deleted_contact.yml",
68
+ "test/fixtures/quaderno_cassettes/deleted_contact_by_access_token.yml",
69
+ "test/fixtures/quaderno_cassettes/deleted_contact_by_authentication_token.yml",
65
70
  "test/fixtures/quaderno_cassettes/deleted_estimate.yml",
66
71
  "test/fixtures/quaderno_cassettes/deleted_expense.yml",
67
72
  "test/fixtures/quaderno_cassettes/deleted_invoice.yml",
@@ -73,6 +78,8 @@ Gem::Specification.new do |s|
73
78
  "test/fixtures/quaderno_cassettes/delivered_receipt.yml",
74
79
  "test/fixtures/quaderno_cassettes/evidence_invoice.yml",
75
80
  "test/fixtures/quaderno_cassettes/found_contact.yml",
81
+ "test/fixtures/quaderno_cassettes/found_contact_by_access_token.yml",
82
+ "test/fixtures/quaderno_cassettes/found_contact_by_authentication_token.yml",
76
83
  "test/fixtures/quaderno_cassettes/found_estimate.yml",
77
84
  "test/fixtures/quaderno_cassettes/found_expense.yml",
78
85
  "test/fixtures/quaderno_cassettes/found_invoice.yml",
@@ -80,6 +87,8 @@ Gem::Specification.new do |s|
80
87
  "test/fixtures/quaderno_cassettes/found_receipt.yml",
81
88
  "test/fixtures/quaderno_cassettes/found_webhook.yml",
82
89
  "test/fixtures/quaderno_cassettes/new_contact.yml",
90
+ "test/fixtures/quaderno_cassettes/new_contact_by_access_token.yml",
91
+ "test/fixtures/quaderno_cassettes/new_contact_by_authentication_token.yml",
83
92
  "test/fixtures/quaderno_cassettes/new_estimate.yml",
84
93
  "test/fixtures/quaderno_cassettes/new_evidence.yml",
85
94
  "test/fixtures/quaderno_cassettes/new_expense.yml",
@@ -93,6 +102,8 @@ Gem::Specification.new do |s|
93
102
  "test/fixtures/quaderno_cassettes/unpay_an_expense.yml",
94
103
  "test/fixtures/quaderno_cassettes/unpay_an_invoice.yml",
95
104
  "test/fixtures/quaderno_cassettes/updated_contact.yml",
105
+ "test/fixtures/quaderno_cassettes/updated_contact_by_access_token.yml",
106
+ "test/fixtures/quaderno_cassettes/updated_contact_by_authentication_token.yml",
96
107
  "test/fixtures/quaderno_cassettes/updated_estimate.yml",
97
108
  "test/fixtures/quaderno_cassettes/updated_expense.yml",
98
109
  "test/fixtures/quaderno_cassettes/updated_invoice.yml",
@@ -101,9 +112,9 @@ Gem::Specification.new do |s|
101
112
  "test/fixtures/quaderno_cassettes/updated_webhook.yml",
102
113
  "test/fixtures/quaderno_cassettes/validate_invalid_VAT_number.yml",
103
114
  "test/fixtures/quaderno_cassettes/validate_valid_VAT_number.yml",
104
- "test/fixtures/quaderno_cassettes/wrong_token.yml",
105
115
  "test/helper.rb",
106
116
  "test/unit/test_quaderno_contacts.rb",
117
+ "test/unit/test_quaderno_contacts_thread_safe.rb",
107
118
  "test/unit/test_quaderno_estimates.rb",
108
119
  "test/unit/test_quaderno_evidences.rb",
109
120
  "test/unit/test_quaderno_expenses.rb",