billomat 0.1.4 → 0.3.0

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 (48) hide show
  1. checksums.yaml +5 -5
  2. data/.editorconfig +30 -0
  3. data/.github/workflows/documentation.yml +38 -0
  4. data/.github/workflows/test.yml +59 -0
  5. data/.gitignore +5 -0
  6. data/.rubocop.yml +53 -0
  7. data/.simplecov +3 -0
  8. data/.yardopts +6 -0
  9. data/CHANGELOG.md +48 -0
  10. data/Dockerfile +29 -0
  11. data/Envfile +6 -0
  12. data/Gemfile +3 -1
  13. data/Makefile +135 -0
  14. data/README.md +42 -17
  15. data/Rakefile +74 -3
  16. data/billomat.gemspec +28 -22
  17. data/config/docker/.bash_profile +3 -0
  18. data/config/docker/.bashrc +48 -0
  19. data/config/docker/.inputrc +17 -0
  20. data/doc/assets/project.svg +68 -0
  21. data/docker-compose.yml +9 -0
  22. data/lib/billomat/actions/cancel.rb +3 -5
  23. data/lib/billomat/actions/complete.rb +8 -12
  24. data/lib/billomat/actions/email.rb +6 -10
  25. data/lib/billomat/actions/pdf.rb +4 -10
  26. data/lib/billomat/actions/uncancel.rb +3 -6
  27. data/lib/billomat/actions.rb +0 -1
  28. data/lib/billomat/configuration.rb +2 -1
  29. data/lib/billomat/gateway.rb +52 -24
  30. data/lib/billomat/models/base.rb +26 -27
  31. data/lib/billomat/models/client.rb +3 -4
  32. data/lib/billomat/models/contact.rb +18 -0
  33. data/lib/billomat/models/credit_note.rb +18 -0
  34. data/lib/billomat/models/credit_note_item.rb +18 -0
  35. data/lib/billomat/models/invoice.rb +6 -11
  36. data/lib/billomat/models/invoice_item.rb +3 -3
  37. data/lib/billomat/models/invoice_payment.rb +3 -4
  38. data/lib/billomat/models/tag.rb +18 -0
  39. data/lib/billomat/models/template.rb +18 -0
  40. data/lib/billomat/models.rb +6 -2
  41. data/lib/billomat/search.rb +12 -14
  42. data/lib/billomat/version.rb +1 -1
  43. data/lib/billomat.rb +15 -18
  44. metadata +117 -20
  45. data/.travis.yml +0 -18
  46. data/doc/assets/logo.png +0 -0
  47. data/doc/assets/project.png +0 -0
  48. data/doc/assets/project.xcf +0 -0
@@ -4,50 +4,49 @@ require 'ostruct'
4
4
 
5
5
  module Billomat
6
6
  module Models
7
- ##
8
7
  # This class is the base for all other models (resources).
9
8
  # It handles the communication with the gateway to talk to the API.
10
9
  class Base
11
10
  attr_accessor :data
12
11
 
13
- ##
14
- # Tries to find the resource for the given id
12
+ # Tries to find the resource for the given id.
15
13
  #
16
- # @param [String] id The resource id
17
- # @return [Billomat::Models::Base, nil] The found resource or nil
14
+ # @param id [String] the resource id
15
+ # @return [Billomat::Models::Base, nil] the found resource or nil
18
16
  def self.find(id)
19
17
  return nil if id.nil?
18
+
20
19
  resp = Billomat::Gateway.new(:get, "#{base_path}/#{id}").run
21
20
  new(resp[resource_name])
22
21
  end
23
22
 
24
- ##
25
- # Allows to query for a record
23
+ # Allows to query for a record.
26
24
  #
27
- # @param [Hash] hash The query parameters
28
- # @return [Array<Billomat::Models::Base>] The found records
25
+ # @param hash [Hash] the query parameters
26
+ # @return [Array<Billomat::Models::Base>] the found records
29
27
  def self.where(hash = {})
30
28
  Billomat::Search.new(self, hash).run
31
29
  end
32
30
 
33
31
  ##
34
- # Initializes a new model
32
+ # Initializes a new model.
35
33
  #
36
- # @param [Hash] data The attributes of the object
37
- # @return [Billomat::Models::Base] The record as an object
34
+ # @param data [Hash] the attributes of the object
35
+ # @return [Billomat::Models::Base] the record as an object
38
36
  def initialize(data = {})
39
37
  @data = OpenStruct.new(data)
40
38
  end
41
39
 
42
- ##
43
40
  # Persists the current object in the API.
44
41
  # When record is new it calls create, otherwise it saves the object.
45
42
  #
46
43
  # @return [TrueClass]
47
44
  def save
48
45
  return create if id.nil?
46
+
49
47
  update
50
48
  end
49
+ alias save! save
51
50
 
52
51
  # @return [TrueClass]
53
52
  def create
@@ -59,6 +58,7 @@ module Billomat
59
58
 
60
59
  true
61
60
  end
61
+ alias create! create
62
62
 
63
63
  # @return [TrueClass]
64
64
  def update
@@ -68,6 +68,7 @@ module Billomat
68
68
 
69
69
  true
70
70
  end
71
+ alias update! update
71
72
 
72
73
  # @return [TrueClass]
73
74
  def delete
@@ -76,52 +77,50 @@ module Billomat
76
77
 
77
78
  true
78
79
  end
80
+ alias delete! delete
79
81
 
80
- # @return [String, nil] The object's ID
82
+ # @return [String, nil] the object's ID
81
83
  def id
82
84
  @data['id'] || nil
83
85
  end
84
86
 
85
- ##
86
- # Wraps the data so the API accepts the request
87
+ # Wraps the data so the API accepts the request.
87
88
  #
88
89
  # @example
89
90
  # some_invoice.wrapped_data
90
91
  # #=> { "invoice" => { "id" => "12345" } }
91
92
  #
92
- # @return [Hash] The wrapped data
93
+ # @return [Hash] the wrapped data
93
94
  def wrapped_data
94
95
  { self.class.resource_name => @data.to_h }
95
96
  end
96
97
 
97
- ##
98
- # Returns the object with the right JSON structure
98
+ # Returns the object with the right JSON structure.
99
99
  #
100
- # @return [Hash] The objects data
101
- def as_json(options = nil)
100
+ # @return [Hash] the objects data
101
+ def as_json(_options = nil)
102
102
  @data.to_h
103
103
  end
104
104
 
105
- ##
106
- # All values in the @data hash can be accessed like a 'normal' method
105
+ # All values in the @data hash can be accessed like a 'normal' method.
107
106
  #
108
107
  # @example
109
108
  # invoice = Billomat::Models::Invoice.new(invoice_number: '123')
110
109
  # invoice.invoice_number
111
110
  # #=> '123'
112
111
  def method_missing(method, *args, &block)
113
- return @data[method] if @data.to_h.keys.include?(method)
112
+ return @data[method] if @data.to_h.key?(method)
113
+
114
114
  super
115
115
  end
116
116
 
117
- ##
118
- # Necessary for method_missing
117
+ # Necessary for method_missing.
119
118
  #
120
119
  # @param [Symbol] method The method name
121
120
  # @param [TrueClass, FalseClass] include_privat
122
121
  # @return [TrueClass, FalseClass]
123
122
  def respond_to_missing?(method, include_privat = false)
124
- @data.to_h.keys.include?(method.to_s) || super
123
+ @data.to_h.key?(method.to_s) || super
125
124
  end
126
125
  end
127
126
  end
@@ -2,15 +2,14 @@
2
2
 
3
3
  module Billomat
4
4
  module Models
5
- ##
6
- # Representation of the client resource
5
+ # Representation of the client resource.
7
6
  class Client < Base
8
- # @return [String] The resource's base path
7
+ # @return [String] the resource's base path
9
8
  def self.base_path
10
9
  '/clients'
11
10
  end
12
11
 
13
- # @return [String] The resource's name
12
+ # @return [String] the resource's name
14
13
  def self.resource_name
15
14
  'client'
16
15
  end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Billomat
4
+ module Models
5
+ # Representation of the client resource.
6
+ class Contact < Base
7
+ # @return [String] the resource's base path
8
+ def self.base_path
9
+ '/contacts'
10
+ end
11
+
12
+ # @return [String] the resource's name
13
+ def self.resource_name
14
+ 'contact'
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Billomat
4
+ module Models
5
+ # Representation of the credit note resource
6
+ class CreditNote < Base
7
+ # @return [String] the resource's base path
8
+ def self.base_path
9
+ '/credit-notes'
10
+ end
11
+
12
+ # @return [String] the resource's name
13
+ def self.resource_name
14
+ 'credit-note'
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Billomat
4
+ module Models
5
+ # Representation of the credit note item resource
6
+ class CreditNoteItem < Base
7
+ # @return [String] the resource's base path
8
+ def self.base_path
9
+ '/credit-note-items'
10
+ end
11
+
12
+ # @return [String] the resource's name
13
+ def self.resource_name
14
+ 'credit-note-item'
15
+ end
16
+ end
17
+ end
18
+ end
@@ -2,33 +2,29 @@
2
2
 
3
3
  module Billomat
4
4
  module Models
5
- ##
6
5
  # Representation of the invoice resource
7
6
  class Invoice < Base
8
- # @return [String] The resource's base path
7
+ # @return [String] the resource's base path
9
8
  def self.base_path
10
9
  '/invoices'
11
10
  end
12
11
 
13
- # @return [String] The resource's name
12
+ # @return [String] the resource's name
14
13
  def self.resource_name
15
14
  'invoice'
16
15
  end
17
16
 
18
- ##
19
- # Completes the invoice by calling the Complete action
17
+ # Completes the invoice by calling the Complete action.
20
18
  def complete!
21
19
  Billomat::Actions::Complete.new(id).call
22
20
  end
23
21
 
24
- ##
25
- # Cancels the invoice by calling the Cancel action
22
+ # Cancels the invoice by calling the Cancel action.
26
23
  def cancel!
27
24
  Billomat::Actions::Cancel.new(id).call
28
25
  end
29
26
 
30
- ##
31
- # Sends the invoice as an email to the given recipient
27
+ # Sends the invoice as an email to the given recipient.
32
28
  #
33
29
  # @param [String] recipient The email address of the recipient
34
30
  def send_email(recipient)
@@ -37,8 +33,7 @@ module Billomat
37
33
  Billomat::Actions::Email.new(id, email_params).call
38
34
  end
39
35
 
40
- ##
41
- # Allows to download the invoice as an PDF
36
+ # Allows to download the invoice as an PDF.
42
37
  def to_pdf
43
38
  Billomat::Actions::Pdf.new(id).call
44
39
  end
@@ -3,14 +3,14 @@
3
3
  module Billomat
4
4
  module Models
5
5
  ##
6
- # Representation of the invoice item resource
6
+ # Representation of the invoice item resource.
7
7
  class InvoiceItem < Base
8
- # @return [String] The resource's base path
8
+ # @return [String] the resource's base path
9
9
  def self.base_path
10
10
  '/invoice-items'
11
11
  end
12
12
 
13
- # @return [String] The resource's name
13
+ # @return [String] the resource's name
14
14
  def self.resource_name
15
15
  'invoice-item'
16
16
  end
@@ -2,15 +2,14 @@
2
2
 
3
3
  module Billomat
4
4
  module Models
5
- ##
6
- # Representation of the invoice payment resource
5
+ # Representation of the invoice payment resource.
7
6
  class InvoicePayment < Base
8
- # @return [String] The resource's base path
7
+ # @return [String] the resource's base path
9
8
  def self.base_path
10
9
  '/invoice-payments'
11
10
  end
12
11
 
13
- # @return [String] The resource's name
12
+ # @return [String] the resource's name
14
13
  def self.resource_name
15
14
  'invoice-payment'
16
15
  end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Billomat
4
+ module Models
5
+ # Representation of the tag resource.
6
+ class Tag < Base
7
+ # @return [String] the resource's base path
8
+ def self.base_path
9
+ '/tags'
10
+ end
11
+
12
+ # @return [String] the resource's name
13
+ def self.resource_name
14
+ 'tag'
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Billomat
4
+ module Models
5
+ # Representation of the template resource.
6
+ class Template < Base
7
+ # @return [String] the resource's base path
8
+ def self.base_path
9
+ '/templates'
10
+ end
11
+
12
+ # @return [String] the resource's name
13
+ def self.resource_name
14
+ 'template'
15
+ end
16
+ end
17
+ end
18
+ end
@@ -2,12 +2,16 @@
2
2
 
3
3
  require 'billomat/models/base'
4
4
  require 'billomat/models/client'
5
+ require 'billomat/models/credit_note'
6
+ require 'billomat/models/credit_note_item'
5
7
  require 'billomat/models/invoice'
6
8
  require 'billomat/models/invoice_item'
7
9
  require 'billomat/models/invoice_payment'
10
+ require 'billomat/models/contact'
11
+ require 'billomat/models/tag'
12
+ require 'billomat/models/template'
8
13
 
9
14
  module Billomat
10
- ##
11
- # Models represent a resource in the API, e.g. invoices, clients
15
+ # Models represent a resource in the API, e.g. invoices, clients.
12
16
  module Models; end
13
17
  end
@@ -3,11 +3,9 @@
3
3
  require 'uri'
4
4
 
5
5
  module Billomat
6
- ##
7
- # This class provides the possibility to query the resources
6
+ # This class provides the possibility to query the resources.
8
7
  class Search
9
- ##
10
- # Creates a new search object
8
+ # Creates a new search object.
11
9
  #
12
10
  # @param [Class] resource The resource class to be queried
13
11
  # @param [Hash] hash The query
@@ -16,23 +14,22 @@ module Billomat
16
14
  @hash = hash
17
15
  end
18
16
 
19
- # @return [String] The path including the query
17
+ # @return [String] the path including the query
20
18
  def path
21
19
  "#{@resource.base_path}?#{hash_to_query}"
22
20
  end
23
21
 
24
- ##
25
- # Runs the query and calls the gateway
26
- # Currently it will always return an empty array when no query is provided
22
+ # Runs the query and calls the gateway.
23
+ # Currently it will always return an empty array when no query is provided.
27
24
  #
28
25
  # @return [Array<Billomat::Model::Base>]
29
26
  def run
30
- return [] if @hash.reject { |k, v| v.nil? }.empty?
27
+ return [] if @hash.reject { |_k, v| v.nil? }.empty?
28
+
31
29
  to_array(Billomat::Gateway.new(:get, path).run)
32
30
  end
33
31
 
34
- ##
35
- # Corrects the response to always return an array
32
+ # Corrects the response to always return an array.
36
33
  #
37
34
  # @todo Due to a strange API behaviour we have to fix the reponse here.
38
35
  # This may be fixed in a new API version.
@@ -53,21 +50,22 @@ module Billomat
53
50
  end
54
51
  end
55
52
 
56
- # @return [String] The name of the resource
53
+ # @return [String] the name of the resource
57
54
  def name
58
55
  @resource.resource_name
59
56
  end
60
57
 
61
58
  # @param [Hash] resp The response from the gateway
62
- # @return [Integer] The number of records found
59
+ # @return [Integer] the number of records found
63
60
  def count(resp)
64
61
  return 0 if resp.nil?
62
+
65
63
  resp["#{name}s"]['@total'].to_i
66
64
  end
67
65
 
68
66
  private
69
67
 
70
- # @return [String] The query as www encoded string
68
+ # @return [String] the query as www encoded string
71
69
  def hash_to_query
72
70
  URI.encode_www_form(@hash)
73
71
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Billomat
4
- VERSION = "0.1.4"
4
+ VERSION = '0.3.0'
5
5
  end
data/lib/billomat.rb CHANGED
@@ -7,28 +7,25 @@ require 'billomat/actions'
7
7
  require 'billomat/search'
8
8
  require 'billomat/gateway'
9
9
 
10
- ##
11
- # An wrapper for the
12
- # <a href="https://billomat.com">Billomat</a>
13
- # API
10
+ # An wrapper for the Billomat API.
14
11
  module Billomat
15
12
  class << self
16
13
  attr_writer :configuration
17
- end
18
14
 
19
- # @return [Billomat::Configuration] The global billomat configuration
20
- def self.configuration
21
- @configuration ||= Billomat::Configuration.new
22
- end
15
+ # @return [Billomat::Configuration] the global billomat configuration
16
+ def configuration
17
+ @configuration ||= Billomat::Configuration.new
18
+ end
23
19
 
24
- # Class method to set and change the global configuration
25
- #
26
- # @example
27
- # Billomat.configure do |config|
28
- # config.subdomain = 'your-business-name'
29
- # config.api_key = 'a3b148a61cb642389b4f9953f6233f20'
30
- # end
31
- def self.configure
32
- yield(configuration)
20
+ # Class method to set and change the global configuration.
21
+ #
22
+ # @example
23
+ # Billomat.configure do |config|
24
+ # config.subdomain = 'your-business-name'
25
+ # config.api_key = 'a3b148a61cb642389b4f9953f6233f20'
26
+ # end
27
+ def configure
28
+ yield(configuration)
29
+ end
33
30
  end
34
31
  end