quaderno 1.9.1 → 1.9.2

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.
Files changed (74) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +6 -6
  3. data/Gemfile.lock +8 -5
  4. data/README.md +7 -1
  5. data/VERSION +1 -1
  6. data/changelog.md +5 -0
  7. data/lib/quaderno-ruby/behavior/crud.rb +30 -36
  8. data/lib/quaderno-ruby/behavior/payment.rb +12 -19
  9. data/lib/quaderno-ruby/behavior/retrieve.rb +20 -0
  10. data/lib/quaderno-ruby/contact.rb +1 -0
  11. data/lib/quaderno-ruby/payment.rb +0 -2
  12. data/lib/quaderno-ruby/tax.rb +3 -3
  13. data/lib/quaderno-ruby/webhook.rb +0 -2
  14. data/lib/quaderno-ruby.rb +1 -1
  15. data/quaderno.gemspec +15 -3
  16. data/test/fixtures/quaderno_cassettes/all_contacts.yml +295 -31
  17. data/test/fixtures/quaderno_cassettes/all_estimates.yml +28 -36
  18. data/test/fixtures/quaderno_cassettes/all_expenses.yml +60 -34
  19. data/test/fixtures/quaderno_cassettes/all_invoices.yml +2888 -36
  20. data/test/fixtures/quaderno_cassettes/all_items.yml +22 -27
  21. data/test/fixtures/quaderno_cassettes/all_receipts.yml +56 -0
  22. data/test/fixtures/quaderno_cassettes/all_webhooks.yml +98 -126
  23. data/test/fixtures/quaderno_cassettes/calculate_tax.yml +38 -62
  24. data/test/fixtures/quaderno_cassettes/create_estimate_on_downgraded_API.yml +428 -0
  25. data/test/fixtures/quaderno_cassettes/create_expense_on_downgraded_API.yml +510 -0
  26. data/test/fixtures/quaderno_cassettes/create_invoice_on_downgraded_API.yml +432 -0
  27. data/test/fixtures/quaderno_cassettes/create_receipt_on_downgraded_API.yml +193 -0
  28. data/test/fixtures/quaderno_cassettes/deleted_contact.yml +642 -113
  29. data/test/fixtures/quaderno_cassettes/deleted_estimate.yml +385 -120
  30. data/test/fixtures/quaderno_cassettes/deleted_expense.yml +414 -118
  31. data/test/fixtures/quaderno_cassettes/deleted_invoice.yml +3249 -120
  32. data/test/fixtures/quaderno_cassettes/deleted_item.yml +60 -75
  33. data/test/fixtures/quaderno_cassettes/deleted_receipt.yml +222 -0
  34. data/test/fixtures/quaderno_cassettes/deleted_webhook.yml +120 -152
  35. data/test/fixtures/quaderno_cassettes/delivered_estimate.yml +76 -89
  36. data/test/fixtures/quaderno_cassettes/delivered_invoice.yml +2935 -89
  37. data/test/fixtures/quaderno_cassettes/delivered_receipt.yml +140 -0
  38. data/test/fixtures/quaderno_cassettes/found_contact.yml +319 -60
  39. data/test/fixtures/quaderno_cassettes/found_estimate.yml +53 -69
  40. data/test/fixtures/quaderno_cassettes/found_expense.yml +121 -65
  41. data/test/fixtures/quaderno_cassettes/found_invoice.yml +2916 -67
  42. data/test/fixtures/quaderno_cassettes/found_item.yml +50 -60
  43. data/test/fixtures/quaderno_cassettes/found_receipt.yml +101 -0
  44. data/test/fixtures/quaderno_cassettes/found_webhook.yml +60 -76
  45. data/test/fixtures/quaderno_cassettes/new_contact.yml +22 -29
  46. data/test/fixtures/quaderno_cassettes/new_estimate.yml +357 -84
  47. data/test/fixtures/quaderno_cassettes/new_expense.yml +414 -118
  48. data/test/fixtures/quaderno_cassettes/new_invoice.yml +361 -84
  49. data/test/fixtures/quaderno_cassettes/new_item.yml +22 -29
  50. data/test/fixtures/quaderno_cassettes/new_receipt.yml +169 -0
  51. data/test/fixtures/quaderno_cassettes/new_webhook.yml +38 -50
  52. data/test/fixtures/quaderno_cassettes/paid_expense.yml +79 -63
  53. data/test/fixtures/quaderno_cassettes/paid_invoice.yml +2907 -65
  54. data/test/fixtures/quaderno_cassettes/rate_limit.yml +22 -26
  55. data/test/fixtures/quaderno_cassettes/unpay_an_expense.yml +98 -85
  56. data/test/fixtures/quaderno_cassettes/unpay_an_invoice.yml +2926 -87
  57. data/test/fixtures/quaderno_cassettes/updated_contact.yml +318 -62
  58. data/test/fixtures/quaderno_cassettes/updated_estimate.yml +402 -116
  59. data/test/fixtures/quaderno_cassettes/updated_expense.yml +395 -113
  60. data/test/fixtures/quaderno_cassettes/updated_invoice.yml +410 -116
  61. data/test/fixtures/quaderno_cassettes/updated_item.yml +49 -61
  62. data/test/fixtures/quaderno_cassettes/updated_receipt.yml +214 -0
  63. data/test/fixtures/quaderno_cassettes/updated_webhook.yml +82 -105
  64. data/test/fixtures/quaderno_cassettes/wrong_token.yml +11 -25
  65. data/test/helper.rb +4 -0
  66. data/test/unit/test_quaderno_contacts.rb +18 -19
  67. data/test/unit/test_quaderno_estimates.rb +58 -31
  68. data/test/unit/test_quaderno_expenses.rb +68 -41
  69. data/test/unit/test_quaderno_invoices.rb +74 -47
  70. data/test/unit/test_quaderno_items.rb +27 -26
  71. data/test/unit/test_quaderno_receipts.rb +156 -0
  72. data/test/unit/test_quaderno_tax.rb +10 -10
  73. data/test/unit/test_quaderno_webhooks.rb +19 -20
  74. metadata +14 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: c6699c1ffde675d6d20e1bc6a89b411c24a5e684
4
- data.tar.gz: 56b5cd78c82c019eebe55d28cd100e7f124b047d
3
+ metadata.gz: ba3feaca76f5023f241d8fd0b6014bfa44c1f428
4
+ data.tar.gz: 16c5c2dae1a59d643531a94fae1ebae837d25b5d
5
5
  SHA512:
6
- metadata.gz: c1ac26cc48424b25301e43fa60a36dfbab5fccf0214e87577b69ca6b2f84f7603e8459a3110c9dc58a5067d4309245dde28f1a1a88a940bc55b59be76680e58d
7
- data.tar.gz: 79e42d2edfd106aba7cc750e03fe408da27aada6bd96b60e084b83d1a3cf5ec86e683b68cb25fb68b0dc409bbd963cb89a4fefef68f61a70b96b8a98db83c1af
6
+ metadata.gz: b6cfe30aed9a4441fa0c1ce7ad42f8bbed1059f5001ce018b4339a5fdbd338648542bb799729653c8968a0d7ebd13b0a723c576f785d54d4066fbe451913f1e1
7
+ data.tar.gz: 64d9a7b1c72c1b2c75865032208033715644e8c18dbe506fbc73acf4749b5ee939997e45bf03d49e37f373579a1663fe5c836d89b51289ab51b99cb70c1b5175
data/Gemfile CHANGED
@@ -1,17 +1,17 @@
1
- source "http://rubygems.org"
1
+ source 'http://rubygems.org'
2
2
 
3
3
  gem 'httparty', '~> 0.13.1'
4
4
 
5
5
  group :development do
6
- gem "jeweler", "~> 2.0.1"
7
- gem "rdoc", "~> 3.12"
6
+ gem 'jeweler', '~> 2.0.1'
7
+ gem 'rdoc', '~> 3.12'
8
8
  end
9
9
 
10
10
  group :test do
11
- gem "bundler", ">= 1.0.0"
11
+ gem 'bundler', '>= 1.0.0'
12
12
  gem 'fakeweb'
13
13
  gem 'minitest', '~> 4.7.5 '
14
- gem "simplecov", ">= 0"
15
- gem "shoulda", ">= 0"
14
+ gem 'simplecov', '>= 0'
15
+ gem 'shoulda', '>= 0'
16
16
  gem 'vcr', :require => 'vcr'
17
17
  end
data/Gemfile.lock CHANGED
@@ -11,7 +11,7 @@ GEM
11
11
  builder (3.2.2)
12
12
  descendants_tracker (0.0.4)
13
13
  thread_safe (~> 0.3, >= 0.3.1)
14
- docile (1.1.4)
14
+ docile (1.1.5)
15
15
  fakeweb (1.3.0)
16
16
  faraday (0.9.0)
17
17
  multipart-post (>= 1.2, < 3)
@@ -64,11 +64,11 @@ GEM
64
64
  shoulda-context (1.2.1)
65
65
  shoulda-matchers (2.6.1)
66
66
  activesupport (>= 3.0.0)
67
- simplecov (0.8.2)
67
+ simplecov (0.11.2)
68
68
  docile (~> 1.1.0)
69
- multi_json
70
- simplecov-html (~> 0.8.0)
71
- simplecov-html (0.8.0)
69
+ json (~> 1.8)
70
+ simplecov-html (~> 0.10.0)
71
+ simplecov-html (0.10.0)
72
72
  thread_safe (0.3.4)
73
73
  tzinfo (0.3.39)
74
74
  vcr (2.9.2)
@@ -86,3 +86,6 @@ DEPENDENCIES
86
86
  shoulda
87
87
  simplecov
88
88
  vcr
89
+
90
+ BUNDLED WITH
91
+ 1.11.2
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.9.1 See the changelog [here](https://github.com/quaderno/quaderno-ruby/blob/master/changelog.md)
6
+ Current version is 1.9.2 See the changelog [here](https://github.com/quaderno/quaderno-ruby/blob/master/changelog.md)
7
7
 
8
8
  ## Installation & Configuration
9
9
 
@@ -87,6 +87,12 @@ Quaderno-ruby parses all the json responses in human readable data, so you can a
87
87
 
88
88
  will return the contact with the id passed as parameter.
89
89
 
90
+ ## Retrieving a customer contact by its payment gatewaycustomer ID
91
+ ```ruby
92
+ Quaderno::Contact.retrieve_customer(PAYMENT_GATEWAY_CUSTOMER_ID, PAYMENT_GATEWAY) #=> Quaderno::Contact
93
+ ```
94
+ will return the contact with the customer id passed as parameter.
95
+
90
96
  ### Creating a new contact
91
97
  ```ruby
92
98
  Quaderno::Contact.create(params) #=> Quaderno::Contact
data/VERSION CHANGED
@@ -1 +1 @@
1
- 1.9.1
1
+ 1.9.2
data/changelog.md CHANGED
@@ -1,5 +1,10 @@
1
1
  #Changelog
2
2
 
3
+ ##1.9.2
4
+ * Added `Quaderno::Contact.retrieve` method
5
+ * Code cleanup
6
+ * Update tests
7
+
3
8
  ##1.9.1
4
9
  * `Quaderno::Base.authorization` raises `Quaderno::Exceptions::InvalidSubdomainOrToken` instead returning false on wrong credentials
5
10
  * Inherit from `StandardError` instead of `Exception` for `Quaderno::Exceptions` by **@mvelikov**
@@ -6,37 +6,30 @@ module Quaderno
6
6
  end
7
7
 
8
8
  module ClassMethods
9
- def to_instance(klass, hash)
10
- klass.new hash
11
- end
12
-
13
- # Parse nested elements of a document
14
- def parse(element)
15
- payments_collection = []
16
- (element['payments'] || []).each do |payment|
17
- payments_collection << api_model.to_instance(Quaderno::Payment, payment)
18
- end unless api_model == Quaderno::Estimate
19
- element['payments'] = payments_collection
20
-
21
- items_collection = []
22
- element['items'].each do |item|
23
- items_collection << api_model.to_instance(Quaderno::DocumentItem, item)
9
+ def parse_nested(element)
10
+ if element.has_key?('payments')
11
+ payments_collection = Array.new
12
+ (element['payments'] || Array.new).each { |payment| payments_collection << Quaderno::Payment.new(payment) }
13
+ element['payments'] = payments_collection
24
14
  end
15
+
16
+ items_collection = Array.new
17
+ element['items'].each { |item| items_collection << Quaderno::DocumentItem.new(item) }
25
18
  element['items'] = items_collection
19
+ element['contact'] = Quaderno::Contact.new(element['contact'])
26
20
 
27
- contact = api_model.to_instance(Quaderno::Contact, element['contact'])
28
- element['contact'] = contact
21
+ element
29
22
  end
30
23
 
31
24
  def all(filter = nil)
32
- party_response = get("#{api_model.url}#{ api_model.api_path }.json", body: filter, basic_auth: { username: api_model.auth_token }, headers: version_header)
33
- check_exception_for(party_response, { rate_limit: true, subdomain_or_token: true })
34
- array = party_response.parsed_response
35
- collection = []
25
+ response = get("#{api_model.url}#{ api_model.api_path }.json", body: filter, basic_auth: { username: api_model.auth_token }, headers: version_header)
26
+ check_exception_for(response, { rate_limit: true, subdomain_or_token: true })
27
+ array = response.parsed_response
28
+ collection = Array.new
36
29
 
37
30
  if is_a_document?
38
31
  array.each do |element|
39
- api_model.parse(element)
32
+ api_model.parse_nested(element)
40
33
  collection << (new element)
41
34
  end
42
35
  else
@@ -47,38 +40,39 @@ module Quaderno
47
40
  end
48
41
 
49
42
  def find(id)
50
- party_response = get "#{api_model.url}#{ api_model.api_path }/#{ id }.json", basic_auth: { username: api_model.auth_token }, headers: version_header
51
- check_exception_for(party_response, { rate_limit: true, subdomain_or_token: true, id: true })
52
- hash = party_response.parsed_response
43
+ response = get "#{api_model.url}#{ api_model.api_path }/#{ id }.json", basic_auth: { username: api_model.auth_token }, headers: version_header
44
+ check_exception_for(response, { rate_limit: true, subdomain_or_token: true, id: true })
45
+ hash = response.parsed_response
53
46
 
54
- api_model.parse(hash) if is_a_document?
47
+ api_model.parse_nested(hash) if is_a_document?
55
48
 
56
49
  new hash
57
50
  end
58
51
 
59
52
  def create(params)
60
- party_response = post "#{api_model.url}#{ api_model.api_path }.json", body: params, basic_auth: { username: api_model.auth_token }, headers: version_header
61
- check_exception_for(party_response, { rate_limit: true, subdomain_or_token: true, required_fields: true })
62
- hash = party_response.parsed_response
53
+ response = post "#{api_model.url}#{ api_model.api_path }.json", body: params, basic_auth: { username: api_model.auth_token }, headers: version_header
54
+ check_exception_for(response, { rate_limit: true, subdomain_or_token: true, required_fields: true })
55
+ hash = response.parsed_response
63
56
 
64
- api_model.parse(hash) if is_a_document?
57
+ api_model.parse_nested(hash) if is_a_document?
65
58
 
66
59
  new hash
67
60
  end
68
61
 
69
62
  def update(id, params)
70
- party_response = put "#{api_model.url}#{ api_model.api_path }/#{ id }.json", body: params, basic_auth: { username: api_model.auth_token }, headers: version_header
71
- check_exception_for(party_response, { rate_limit: true, required_fields: true, subdomain_or_token: true, id: true })
72
- hash = party_response.parsed_response
63
+ response = put "#{api_model.url}#{ api_model.api_path }/#{ id }.json", body: params, basic_auth: { username: api_model.auth_token }, headers: version_header
64
+ check_exception_for(response, { rate_limit: true, required_fields: true, subdomain_or_token: true, id: true })
65
+ hash = response.parsed_response
73
66
 
74
- api_model.parse(hash) if is_a_document?
67
+ api_model.parse_nested(hash) if is_a_document?
75
68
 
76
69
  new hash
77
70
  end
78
71
 
79
72
  def delete(id)
80
- party_response = HTTParty.delete "#{api_model.url}#{ api_model.api_path }/#{ id }.json", basic_auth: { username: api_model.auth_token }, headers: version_header
81
- check_exception_for(party_response, { rate_limit: true, subdomain_or_token: true, id: true, has_documents: true })
73
+ response = HTTParty.delete "#{api_model.url}#{ api_model.api_path }/#{ id }.json", basic_auth: { username: api_model.auth_token }, headers: version_header
74
+ check_exception_for(response, { rate_limit: true, subdomain_or_token: true, id: true, has_documents: true })
75
+
82
76
  true
83
77
  end
84
78
  end
@@ -6,30 +6,23 @@ module Quaderno
6
6
  end
7
7
 
8
8
  module InstanceMethods
9
- def to_instance(klass, parsed)
10
- klass.new(parsed)
11
- end
12
9
 
13
10
  def add_payment(params)
14
- party_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
15
- api_model.check_exception_for(party_response, { rate_limit: true, subdomain_or_token: true, required_fields: true })
16
- parsed = JSON::parse party_response.body
17
- instance = to_instance(Quaderno::Payment, parsed)
18
- payments << instance
19
- Quaderno::Payment.new parsed
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
+ api_model.check_exception_for(response, { rate_limit: true, subdomain_or_token: true, required_fields: true })
13
+
14
+ instance = Quaderno::Payment.new(response.parsed_response)
15
+ self.payments << instance
16
+
17
+ Quaderno::Payment.new instance
20
18
  end
21
19
 
22
20
  def remove_payment(payment_id)
23
- party_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
24
- to_delete = nil
25
- payments.each do |payment|
26
- if payment.id == payment_id
27
- to_delete = payment
28
- break
29
- end
30
- end
31
- payments.delete(to_delete)
32
- api_model.check_exception_for(party_response, { rate_limit: true, subdomain_or_token: true, id: true })
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
22
+ api_model.check_exception_for(response, { rate_limit: true, subdomain_or_token: true, id: true })
23
+
24
+ self.payments.delete_if { |payment| payment.id == payment_id }
25
+
33
26
  true
34
27
  end
35
28
  end
@@ -0,0 +1,20 @@
1
+ module Quaderno
2
+ module Behavior
3
+ module Retrieve
4
+ def self.included(receiver)
5
+ receiver.send :extend, ClassMethods
6
+ end
7
+
8
+ module ClassMethods
9
+
10
+ def retrieve_customer(customer_id, gateway = nil)
11
+ response = get "#{api_model.url}#{gateway || 'stripe'}/customers/#{customer_id}.json", basic_auth: { username: api_model.auth_token }, headers: version_header
12
+ check_exception_for(response, { rate_limit: true, subdomain_or_token: true, id: true })
13
+ hash = response.parsed_response
14
+
15
+ new hash
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -1,5 +1,6 @@
1
1
  module Quaderno
2
2
  class Contact < Base
3
+ include Quaderno::Behavior::Retrieve
3
4
 
4
5
  api_model Quaderno::Contact
5
6
  api_path 'contacts'
@@ -1,6 +1,4 @@
1
1
  module Quaderno
2
-
3
2
  class Payment < OpenStruct
4
3
  end
5
-
6
4
  end
@@ -2,11 +2,11 @@ module Quaderno
2
2
  class Tax < Base
3
3
  api_model Quaderno::Tax
4
4
  api_path 'taxes'
5
-
5
+
6
6
  class << self
7
- undef :all, :find, :create, :update, :delete, :parse
7
+ undef :all, :find, :create, :update, :delete, :parse_nested
8
8
  end
9
-
9
+
10
10
  def self.calculate(params)
11
11
  party_response = get("#{self.url}taxes/calculate.json", query: params, basic_auth: { username: api_model.auth_token } )
12
12
  check_exception_for(party_response, { rate_limit: true, subdomain_or_token: true, id: true })
@@ -1,8 +1,6 @@
1
1
  module Quaderno
2
2
  class Webhook < Base
3
-
4
3
  api_model Quaderno::Webhook
5
4
  api_path 'webhooks'
6
-
7
5
  end
8
6
  end
data/lib/quaderno-ruby.rb CHANGED
@@ -1,7 +1,7 @@
1
1
  require 'ostruct'
2
2
 
3
3
  require 'quaderno-ruby/exceptions/exceptions'
4
- %w(crud deliver payment).each { |filename| require "quaderno-ruby/behavior/#{ filename }" }
4
+ %w(crud deliver payment retrieve).each { |filename| require "quaderno-ruby/behavior/#{ filename }" }
5
5
  %w(base contact item invoice receipt credit estimate expense recurring document_item payment webhook tax).each { |filename| require "quaderno-ruby/#{ filename }" }
6
6
 
7
7
  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.9.1 ruby lib
5
+ # stub: quaderno 1.9.2 ruby lib
6
6
 
7
7
  Gem::Specification.new do |s|
8
8
  s.name = "quaderno"
9
- s.version = "1.9.1"
9
+ s.version = "1.9.2"
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 = "2016-06-21"
14
+ s.date = "2016-06-23"
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/crud.rb",
34
34
  "lib/quaderno-ruby/behavior/deliver.rb",
35
35
  "lib/quaderno-ruby/behavior/payment.rb",
36
+ "lib/quaderno-ruby/behavior/retrieve.rb",
36
37
  "lib/quaderno-ruby/contact.rb",
37
38
  "lib/quaderno-ruby/credit.rb",
38
39
  "lib/quaderno-ruby/document_item.rb",
@@ -53,27 +54,36 @@ Gem::Specification.new do |s|
53
54
  "test/fixtures/quaderno_cassettes/all_expenses.yml",
54
55
  "test/fixtures/quaderno_cassettes/all_invoices.yml",
55
56
  "test/fixtures/quaderno_cassettes/all_items.yml",
57
+ "test/fixtures/quaderno_cassettes/all_receipts.yml",
56
58
  "test/fixtures/quaderno_cassettes/all_webhooks.yml",
57
59
  "test/fixtures/quaderno_cassettes/calculate_tax.yml",
60
+ "test/fixtures/quaderno_cassettes/create_estimate_on_downgraded_API.yml",
61
+ "test/fixtures/quaderno_cassettes/create_expense_on_downgraded_API.yml",
62
+ "test/fixtures/quaderno_cassettes/create_invoice_on_downgraded_API.yml",
63
+ "test/fixtures/quaderno_cassettes/create_receipt_on_downgraded_API.yml",
58
64
  "test/fixtures/quaderno_cassettes/deleted_contact.yml",
59
65
  "test/fixtures/quaderno_cassettes/deleted_estimate.yml",
60
66
  "test/fixtures/quaderno_cassettes/deleted_expense.yml",
61
67
  "test/fixtures/quaderno_cassettes/deleted_invoice.yml",
62
68
  "test/fixtures/quaderno_cassettes/deleted_item.yml",
69
+ "test/fixtures/quaderno_cassettes/deleted_receipt.yml",
63
70
  "test/fixtures/quaderno_cassettes/deleted_webhook.yml",
64
71
  "test/fixtures/quaderno_cassettes/delivered_estimate.yml",
65
72
  "test/fixtures/quaderno_cassettes/delivered_invoice.yml",
73
+ "test/fixtures/quaderno_cassettes/delivered_receipt.yml",
66
74
  "test/fixtures/quaderno_cassettes/found_contact.yml",
67
75
  "test/fixtures/quaderno_cassettes/found_estimate.yml",
68
76
  "test/fixtures/quaderno_cassettes/found_expense.yml",
69
77
  "test/fixtures/quaderno_cassettes/found_invoice.yml",
70
78
  "test/fixtures/quaderno_cassettes/found_item.yml",
79
+ "test/fixtures/quaderno_cassettes/found_receipt.yml",
71
80
  "test/fixtures/quaderno_cassettes/found_webhook.yml",
72
81
  "test/fixtures/quaderno_cassettes/new_contact.yml",
73
82
  "test/fixtures/quaderno_cassettes/new_estimate.yml",
74
83
  "test/fixtures/quaderno_cassettes/new_expense.yml",
75
84
  "test/fixtures/quaderno_cassettes/new_invoice.yml",
76
85
  "test/fixtures/quaderno_cassettes/new_item.yml",
86
+ "test/fixtures/quaderno_cassettes/new_receipt.yml",
77
87
  "test/fixtures/quaderno_cassettes/new_webhook.yml",
78
88
  "test/fixtures/quaderno_cassettes/paid_expense.yml",
79
89
  "test/fixtures/quaderno_cassettes/paid_invoice.yml",
@@ -85,6 +95,7 @@ Gem::Specification.new do |s|
85
95
  "test/fixtures/quaderno_cassettes/updated_expense.yml",
86
96
  "test/fixtures/quaderno_cassettes/updated_invoice.yml",
87
97
  "test/fixtures/quaderno_cassettes/updated_item.yml",
98
+ "test/fixtures/quaderno_cassettes/updated_receipt.yml",
88
99
  "test/fixtures/quaderno_cassettes/updated_webhook.yml",
89
100
  "test/fixtures/quaderno_cassettes/wrong_token.yml",
90
101
  "test/helper.rb",
@@ -93,6 +104,7 @@ Gem::Specification.new do |s|
93
104
  "test/unit/test_quaderno_expenses.rb",
94
105
  "test/unit/test_quaderno_invoices.rb",
95
106
  "test/unit/test_quaderno_items.rb",
107
+ "test/unit/test_quaderno_receipts.rb",
96
108
  "test/unit/test_quaderno_tax.rb",
97
109
  "test/unit/test_quaderno_webhooks.rb"
98
110
  ]