jortt 2.0.0 → 5.0.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 (45) hide show
  1. checksums.yaml +5 -5
  2. data/.ruby-version +1 -1
  3. data/.travis.yml +1 -3
  4. data/README.md +86 -48
  5. data/Rakefile +0 -1
  6. data/jortt.gemspec +24 -13
  7. data/lib/jortt.rb +21 -0
  8. data/lib/jortt/client.rb +121 -0
  9. data/lib/jortt/client/customers.rb +91 -0
  10. data/lib/jortt/client/error.rb +33 -0
  11. data/lib/jortt/client/invoices.rb +65 -0
  12. data/lib/jortt/client/ledger_accounts.rb +27 -0
  13. data/lib/jortt/client/version.rb +6 -0
  14. data/spec/fixtures/vcr_cassettes/Jortt/_client/1_1_1.yml +64 -0
  15. data/spec/fixtures/vcr_cassettes/Jortt_Client/configured/_customers/1_1_1_1.yml +64 -0
  16. data/spec/fixtures/vcr_cassettes/Jortt_Client/configured/_invoices/1_1_2_1.yml +64 -0
  17. data/spec/fixtures/vcr_cassettes/Jortt_Client/configured/_ledger_accounts/1_1_3_1.yml +64 -0
  18. data/spec/fixtures/vcr_cassettes/Jortt_Client_Customers/_create/faulty_payload/shows_a_nice_error.yml +413 -0
  19. data/spec/fixtures/vcr_cassettes/Jortt_Client_Customers/_create/valid_payload/creates_the_customer.yml +505 -0
  20. data/spec/fixtures/vcr_cassettes/Jortt_Client_Customers/_delete/deletes_the_customer.yml +505 -0
  21. data/spec/fixtures/vcr_cassettes/Jortt_Client_Customers/_direct_debit_mandate/sends_direct_debit_mandate_to_the_customer_or_responds_with_an_error_when_not_possible.yml +470 -0
  22. data/spec/fixtures/vcr_cassettes/Jortt_Client_Customers/_index/query/returns_the_queried_customers.yml +464 -0
  23. data/spec/fixtures/vcr_cassettes/Jortt_Client_Customers/_index/without_params/returns_customers.yml +415 -0
  24. data/spec/fixtures/vcr_cassettes/Jortt_Client_Customers/_show/returns_the_customer.yml +464 -0
  25. data/spec/fixtures/vcr_cassettes/Jortt_Client_Customers/_update/updates_the_customer.yml +603 -0
  26. data/spec/fixtures/vcr_cassettes/Jortt_Client_Invoices/_create/creates_the_invoice.yml +170 -0
  27. data/spec/fixtures/vcr_cassettes/Jortt_Client_Invoices/_download/returns_the_invoice_download_link.yml +168 -0
  28. data/spec/fixtures/vcr_cassettes/Jortt_Client_Invoices/_index/invoice_status/returns_those_invoices.yml +776 -0
  29. data/spec/fixtures/vcr_cassettes/Jortt_Client_Invoices/_index/query/returns_the_queried_invoices.yml +315 -0
  30. data/spec/fixtures/vcr_cassettes/Jortt_Client_Invoices/_show/returns_the_invoice.yml +421 -0
  31. data/spec/fixtures/vcr_cassettes/Jortt_Client_LedgerAccounts/_index/returns_invoices.yml +118 -0
  32. data/spec/jortt/client/customers_spec.rb +104 -0
  33. data/spec/jortt/client/invoices_spec.rb +119 -0
  34. data/spec/jortt/client/ledger_accounts_spec.rb +19 -0
  35. data/spec/jortt/client_spec.rb +22 -0
  36. data/spec/{freemle_spec.rb → jortt_spec.rb} +2 -3
  37. data/spec/spec_helper.rb +22 -10
  38. metadata +99 -42
  39. data/.rubocop.yml +0 -26
  40. data/lib/freemle.rb +0 -22
  41. data/lib/freemle/client.rb +0 -69
  42. data/lib/freemle/client/resource.rb +0 -140
  43. data/lib/freemle/client/version.rb +0 -7
  44. data/spec/freemle/client/resource_spec.rb +0 -31
  45. data/spec/freemle/client_spec.rb +0 -43
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 77c2bef2b81e18794d1f60872ba00fb5a267d2e1
4
- data.tar.gz: be437bdf4b8d419736c7d5a08f963931a1b70826
2
+ SHA256:
3
+ metadata.gz: 4034de85abfce8b8e5116576441272434c1435d4d51c7f86a2c01d7f87da5506
4
+ data.tar.gz: 764eba179889e670fc8f0c1a7620dfcefdba8735612ef002c67c7ce4817eea66
5
5
  SHA512:
6
- metadata.gz: 685dcfac26a6f566ec4f074f6e44908b219cd1e8c094fb4c3bb4bee0962879aee17feb09e086a16e704755434a08d0e96c68f55121a0d69a316dca9a80480b39
7
- data.tar.gz: c7b5c30f5d1417acaecf3d736e0b9bf8fcdb985bdae26bd56abba674037ca445454b8da71e63fcb434197fe0a245f004b2956f1a2ca082057520bd416b97fb9d
6
+ metadata.gz: aaa6c20cfeedfdf18f2eeafa90e46ae7c8e0402bad48ad6b3849d10ca1caaa919697b7e7881e9333b41426cecd235f9f78206737c535f8f4e6ccafca92e7c96c
7
+ data.tar.gz: 022c967a77e8d5ac6db87ed7ba8eb4613de35d0ac62f09762476f2423e5a97333bcb5c7b4c28ac780595d0d9945e52a2e8fa401e1fe24c77cd941eafdf1ca596
@@ -1 +1 @@
1
- 2.1.5
1
+ 2.7.1
@@ -1,7 +1,5 @@
1
1
  language: ruby
2
2
  rvm:
3
- - 1.9.3
4
- - 2.1.5
3
+ - 2.4.3
5
4
  script:
6
5
  - bundle exec rspec
7
- - bundle exec rubocop
data/README.md CHANGED
@@ -1,86 +1,122 @@
1
- # Freemle REST API client
1
+ # Jortt REST API client
2
2
 
3
3
  [![Inline docs](
4
- http://inch-ci.org/github/jorttbv/jortr-ruby.svg?branch=master&style=flat
4
+ http://inch-ci.org/github/jorttbv/jortt-ruby.svg?branch=master&style=flat
5
5
  )](http://inch-ci.org/github/jorttbv/jortt-ruby)
6
6
  [![Code Climate](
7
7
  http://img.shields.io/codeclimate/github/jorttbv/jortt-ruby.svg?style=flat
8
8
  )](https://codeclimate.com/github/jorttbv/jortt-ruby)
9
- [![Coverage Status](
10
- http://img.shields.io/coveralls/jorttbv/jortt-ruby.svg?style=flat
11
- )](https://coveralls.io/r/jorttbv/jortt-ruby)
9
+ [![Code Coverage](
10
+ https://codecov.io/github/jorttbv/jortt-ruby/coverage.svg?branch=master
11
+ )](https://codecov.io/github/jorttbv/jortt-ruby?branch=master)
12
12
  [![Build Status](
13
13
  http://img.shields.io/travis/jorttbv/jortt-ruby.svg?style=flat
14
14
  )](https://travis-ci.org/jorttbv/jortt-ruby)
15
15
 
16
16
  A Ruby interface to the [Jortt](https://www.jortt.nl/) REST API.
17
17
 
18
- ## Usage
18
+ Check https://developer.jortt.nl/ for more info.
19
19
 
20
- Note: The client is still called Freemle for historic reasons. Name change on its way...
20
+ > THIS VERSION IS FOR THE NEW OAUTH API. STILL ON THE LEGACY API? USE VERSION 4.x OF THIS GEM: [CLICK HERE](https://github.com/jorttbv/jortt-ruby/tree/v4.2.0)
21
21
 
22
- To create a freemle client:
22
+ ## Usage examples
23
+
24
+ To create a jortt client:
23
25
  ```ruby
24
- freemle = Freemle.client(
25
- app_name: "application-name-as-chosen-on-jortt.nl",
26
- api_key: "api-key-as-provided-by-jortt.nl"
27
- )
26
+ jortt = Jortt.client('<your-client-id>', '<your-client-secret>')
28
27
  ```
29
28
 
30
29
  ### Customers
31
30
 
32
- Accessing customers (`freemle.customers.search('Jortt')`) returns:
31
+ All customers (`jortt.customers.index(page: 2)`) returns:
33
32
  ```ruby
34
33
  [{
35
- company_name: 'Jortt',
36
- address: {
37
- street: "Transistorstraat 71C",
38
- postal_code: "1322 CK",
39
- city: "Almere",
40
- country_code: "NL"
41
- }
42
- },
43
- company_name: 'ttroj',
44
- address: {
45
- street: "Jorttweg",
46
- ...
47
- }
34
+ "id": "f8fd3e4e-da1c-43a7-892f-1410ac13e38a",
35
+ "is_private": true,
36
+ "customer_name": "Jortt",
37
+ "address_street": "Rozengracht 75a",
38
+ ...
48
39
  }]
49
40
  ```
50
41
 
51
42
  Adding customers:
52
43
  ```ruby
53
- freemle.customers.create(
54
- company_name: "Jortt B.V.",
55
- attn: "Vibiemme", # Optional
56
- extra_information: "The best cofee maker!", # Optional
57
- address: {
58
- street: "Transistorstraat 71C",
59
- postal_code: "1322 CK",
60
- city: "Almere",
61
- country_code: "NL"
62
- }
44
+ jortt.customers.create(
45
+ "is_private": true,
46
+ "customer_name": "Jortt",
47
+ ...
63
48
  )
64
49
  ```
65
50
 
66
51
  ### Invoices
52
+ Get invoices by ID (`jortt.invoices.get('934d59dd-76f6-4716-9e0f-82a618e1be21')`) returns:
53
+ ```ruby
54
+ {
55
+ "invoice_id": "934d59dd-76f6-4716-9e0f-82a618e1be21",
56
+ "recipient": {
57
+ "company_name": "Zilverline B.V.",
58
+ "attn": null,
59
+ "address": {
60
+ "street": "Cruquisweg 109F",
61
+ "city": "Amsterdam",
62
+ "postal_code": "1111SX",
63
+ "country": {
64
+ "code": "NL",
65
+ "name": "Nederland"
66
+ }
67
+ },
68
+ "email": "ben@jortt.nl",
69
+ "customer_id": "e1c5e15b-e34e-423e-a291-4ed43226a190",
70
+ "extra_information": null,
71
+ ...
72
+ }
73
+ ...
74
+ }
75
+ ```
76
+
77
+
78
+ Searching invoices (`jortt.invoices.index(query: '202001-002')`) returns:
79
+ ```ruby
80
+ [{
81
+ "id": "f8fd3e4e-da1c-43a7-892f-1410ac13e38a",
82
+ "invoice_status": "draft",
83
+ "customer_id": "f8fd3e4e-da1c-43a7-892f-1410ac13e38a",
84
+ "invoice_number": "202001-002",
85
+ "invoice_date": "2020-02-23",
86
+ ...
87
+ }]
88
+
89
+ ```
90
+
67
91
 
68
92
  Adding invoices:
69
93
  ```ruby
70
- freemle.invoices.create(
71
- customer_id: "123456789", # Optional
72
- delivery_period: "31-12-1234", # Optional
73
- reference: "my-reference", # Optional
94
+ jortt.invoices.create(
95
+ customer_id: "f8fd3e4e-da1c-43a7-892f-1410ac13e38a",
96
+ invoice_date: "2020-02-23",
97
+ delivery_period: "2020-02-01",
98
+ payment_term: 14,
99
+ net_amounts: true,
100
+ send_method: "email",
101
+ introduction: "example",
102
+ remarks: "example",
103
+ payment_method: "pay_later",
74
104
  line_items: [
75
- {vat: 21, amount: 1359.50, quantity: 1, description: "Scrum Training"}
76
- ]
105
+ {
106
+ description: "this is a description example",
107
+ units: 3.14,
108
+ amount_per_unit: {
109
+ value: "365.00",
110
+ currency: "EUR"
111
+ },
112
+ vat: 21,
113
+ ledger_account_id: "f8fd3e4e-da1c-43a7-892f-1410ac13e38a"
114
+ }
115
+ ],
116
+ reference: "123"
77
117
  )
78
118
  ```
79
119
 
80
- ## Documentation
81
-
82
- Check https://app.jortt.nl/api-documentatie for more info.
83
-
84
120
  ## Development
85
121
 
86
122
  ### Running tests
@@ -90,10 +126,12 @@ Check https://app.jortt.nl/api-documentatie for more info.
90
126
  ### Building the gem
91
127
 
92
128
  `rake build` and then `rake install` to test it locally (`irb` followed
93
- by `require 'freemle/client'` and do your stuff).
129
+ by `require 'jortt/client'` and do your stuff).
94
130
 
95
131
  ### Releasing the gem
96
132
 
97
133
  Make a fix, commit and push. Make sure the build is green. Then bump the
98
- version (edit `lib/freemle/client/version.rb`). Now `rake release` and follow
134
+ version (edit `lib/jortt/client/version.rb`). Now `rake release` and follow
99
135
  the instructions (you need a rubygems.org account and permissions ;-)).
136
+
137
+ Otherwise `gem build jortt.gemspec` and `gem push jortt-[version].gem`.
data/Rakefile CHANGED
@@ -1,4 +1,3 @@
1
- # encoding: UTF-8
2
1
  require 'bundler/gem_tasks'
3
2
  require 'rspec/core/rake_task'
4
3
 
@@ -1,15 +1,25 @@
1
1
  # coding: utf-8
2
2
  lib = File.expand_path('../lib', __FILE__)
3
3
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
- require 'freemle/client/version'
4
+ require 'jortt/client/version'
5
5
 
6
6
  Gem::Specification.new do |spec|
7
7
  spec.name = 'jortt'
8
- spec.version = Freemle::Client::VERSION
9
- spec.authors = ['Bob Forma', 'Steven Weller', 'Lars Vonk']
10
- spec.email = %w(bforma@zilverline.com suweller@zilverline.com lvonk@zilverline.com)
8
+ spec.version = Jortt::Client::VERSION
9
+ spec.authors = [
10
+ 'Bob Forma',
11
+ 'Michael Franken',
12
+ 'Lars Vonk',
13
+ 'Stephan van Diepen',
14
+ ]
15
+ spec.email = [
16
+ 'bforma@zilverline.com',
17
+ 'mfranken@zilverline.com',
18
+ 'lvonk@zilverline.com',
19
+ 'svdiepen@zilverline.com',
20
+ ]
11
21
  spec.summary = 'jortt.nl REST API client'
12
- spec.homepage = 'https://www.jortt.nl/api-documentatie'
22
+ spec.homepage = 'https://app.jortt.nl/api-documentatie'
13
23
  spec.license = 'MIT'
14
24
 
15
25
  spec.files = `git ls-files -z`.split("\x0")
@@ -17,13 +27,14 @@ Gem::Specification.new do |spec|
17
27
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
18
28
  spec.require_paths = ['lib']
19
29
 
20
- spec.add_runtime_dependency 'rest-client', '~> 1.6'
30
+ spec.add_runtime_dependency 'rest-client', '~> 2.0'
31
+ spec.add_runtime_dependency 'oauth2', '~> 1.4.4'
21
32
 
22
- spec.add_development_dependency 'bundler', '~> 1.0'
23
- spec.add_development_dependency 'coveralls', '~> 0.7'
24
- spec.add_development_dependency 'rake', '~> 10.0'
25
- spec.add_development_dependency 'rspec', '~> 2.14'
26
- spec.add_development_dependency 'webmock', '~> 1.17'
27
- spec.add_development_dependency 'rubocop', '~> 0.24.1'
28
- spec.add_development_dependency 'rubocop-rspec', '~> 1.1.0'
33
+ spec.add_development_dependency 'bundler', '~> 2.0'
34
+ spec.add_development_dependency 'codecov', '~> 0.1'
35
+ spec.add_development_dependency 'rake', '~> 13.0'
36
+ spec.add_development_dependency 'rspec', '~> 3.7'
37
+ spec.add_development_dependency 'rspec-its', '~> 1.2'
38
+ spec.add_development_dependency 'webmock', '~> 3.3'
39
+ spec.add_development_dependency 'vcr', '~> 6.0'
29
40
  end
@@ -0,0 +1,21 @@
1
+ require 'jortt/client'
2
+ require 'jortt/client/version'
3
+
4
+ ##
5
+ # This module contains everything needed to setup a connection to the Jortt
6
+ # API. It's only method returns a configured Jortt::Client.
7
+ module Jortt
8
+
9
+ # Convenient way to initialize a jortt client.
10
+ #
11
+ # @see {Jortt::Client.initialize}
12
+ #
13
+ # @return [ Jortt::Client ] a new jortt client instance
14
+ #
15
+ # @since 1.0.1
16
+ def client(*args)
17
+ Jortt::Client.new(*args)
18
+ end
19
+ module_function :client
20
+
21
+ end
@@ -0,0 +1,121 @@
1
+ require 'oauth2'
2
+
3
+ require 'jortt/client/error'
4
+ require 'jortt/client/customers'
5
+ require 'jortt/client/invoices'
6
+ require 'jortt/client/ledger_accounts'
7
+
8
+ module Jortt
9
+ ##
10
+ # This class is the main interface used to communicate with the Jortt API.
11
+ # It is by the {Jortt} module to create configured instances.
12
+ class Client
13
+ SITE = 'https://api.jortt.nl'
14
+ OAUTH_PROVIDER_URL = 'https://app.jortt.nl/oauth-provider/oauth'
15
+
16
+ attr_accessor :token
17
+
18
+ # Initialize a Jortt client.
19
+ #
20
+ # @example
21
+ # Jortt::Client.new(
22
+ # "my-client-id",
23
+ # "my-client-secret"
24
+ # )
25
+ #
26
+ # @params [ Hash ] opts Options for the client,
27
+ # optionally including base_url.
28
+ #
29
+ # @return [ Jortt::Client ]
30
+ #
31
+ # @since 1.0.0
32
+ def initialize(id, secret, opts = {})
33
+ oauth_provider_url = opts[:oauth_provider_url] || OAUTH_PROVIDER_URL
34
+
35
+ client = OAuth2::Client.new(id, secret,
36
+ site: opts[:site] || SITE,
37
+ token_url: "#{oauth_provider_url}/token",
38
+ authorize_url: "#{oauth_provider_url}/authorize",
39
+ auth_scheme: :basic_auth
40
+ )
41
+
42
+ @token = client.client_credentials.get_token(scope: "invoices:read invoices:write customers:read customers:write")
43
+ end
44
+
45
+ # Access the customer resource to perform operations.
46
+ #
47
+ # @example
48
+ # client.customers
49
+ #
50
+ # @return [ Jortt::Client::Customers ] entry to the customer resource.
51
+ #
52
+ # @since 1.0.0
53
+ def customers
54
+ @customers ||= Jortt::Client::Customers.new(self)
55
+ end
56
+
57
+ # Access the invoices resource to perform operations.
58
+ #
59
+ # @example
60
+ # client.invoices
61
+ #
62
+ # @return [ Jortt::Client::Invoices ] entry to the invoice resource.
63
+ #
64
+ # @since 1.0.0
65
+ def invoices
66
+ @invoices ||= Jortt::Client::Invoices.new(self)
67
+ end
68
+
69
+ # Access the ledger_accounts resource.
70
+ #
71
+ # @example
72
+ # client.ledger_accounts
73
+ #
74
+ # @return [ Jortt::Client::LedgerAccounts ] entry to the leger_accounts resource.
75
+ #
76
+ # @since 5.0.0
77
+ def ledger_accounts
78
+ Jortt::Client::LedgerAccounts.new(self)
79
+ end
80
+
81
+ def get(path, params = {})
82
+ handle_response { token.get(path, params: params) }
83
+ end
84
+
85
+ def post(path, params = {})
86
+ handle_response { token.post(path, params: params) }
87
+ end
88
+
89
+ def put(path, params = {})
90
+ handle_response { token.put(path, params: params) }
91
+ end
92
+
93
+ def delete(path)
94
+ handle_response { token.delete(path) }
95
+ end
96
+
97
+ def handle_response(&block)
98
+ response = yield
99
+ return true if response.status == 204
100
+ response.parsed.fetch('data')
101
+ rescue OAuth2::Error => e
102
+ raise Error.from_response(e.response)
103
+ end
104
+
105
+ def paginated(path, params = {})
106
+ page = 1
107
+
108
+ Enumerator.new do |yielder|
109
+ loop do
110
+ response = token.get(path, params: params.merge(page: page)).parsed
111
+ response['data'].each { |item| yielder << item }
112
+ break if response['_links']['next'].nil?
113
+ page += 1
114
+ end
115
+ end
116
+ rescue OAuth2::Error => e
117
+ raise Error.from_response(e.response)
118
+ end
119
+
120
+ end
121
+ end
@@ -0,0 +1,91 @@
1
+ module Jortt # :nodoc:
2
+ class Client # :nodoc:
3
+ ##
4
+ # Exposes the operations available for a collection of customers.
5
+ #
6
+ # @see { Jortt::Client.customers }
7
+ class Customers
8
+ attr_accessor :client
9
+
10
+ def initialize(client)
11
+ @client = client
12
+ end
13
+
14
+ ##
15
+ # Returns all customers using the GET /customers endpoint.
16
+ # https://developer.jortt.nl/#list-customers
17
+ #
18
+ # @example
19
+ # client.customers.index(query: 'Jane')
20
+ #
21
+ def index(query: nil)
22
+ client.paginated('/customers', query: query)
23
+ end
24
+
25
+ ##
26
+ # Returns a customer using the GET /customers/{customer_id} endpoint.
27
+ # https://developer.jortt.nl/#get-customer-by-id
28
+ #
29
+ # @example
30
+ # client.customers.show("9afcd96e-caf8-40a1-96c9-1af16d0bc804")
31
+ #
32
+ def show(id)
33
+ client.get("/customers/#{id}")
34
+ end
35
+
36
+ ##
37
+ # Creates a Customer using the POST /customers endpoint.
38
+ # https://developer.jortt.nl/#create-customer
39
+ #
40
+ # @example
41
+ # client.customers.create(
42
+ # is_private: false,
43
+ # customer_name: 'Nuka-Cola Corporation',
44
+ # address_street: 'Vault 11',
45
+ # address_postal_code: '1111AA',
46
+ # address_city: 'Mojave Wasteland'
47
+ # )
48
+ #
49
+ def create(payload)
50
+ client.post('/customers', payload)
51
+ end
52
+
53
+ ##
54
+ # Updates a Customer using the PUT /customers/{customer_id} endpoint.
55
+ # https://developer.jortt.nl/#update-customer
56
+ #
57
+ # @example
58
+ # client.customers.update(
59
+ # "9afcd96e-caf8-40a1-96c9-1af16d0bc804",
60
+ # { address_extra_information: 'foobar' }
61
+ # )
62
+ #
63
+ def update(id, payload)
64
+ client.put("/customers/#{id}", payload)
65
+ end
66
+
67
+ ##
68
+ # Deletes a Customer using the DELETE /customers/{customer_id} endpoint.
69
+ # https://developer.jortt.nl/#delete-a-customer
70
+ #
71
+ # @example
72
+ # client.customers.delete("9afcd96e-caf8-40a1-96c9-1af16d0bc804")
73
+ #
74
+ def delete(id)
75
+ client.delete("/customers/#{id}")
76
+ end
77
+
78
+ ##
79
+ # Send direct debit authorization to a Customer using POST /customers/{customer_id}/direct_debit_mandate.
80
+ # https://developer.jortt.nl/#send-direct-debit-authorization-to-a-customer
81
+ #
82
+ # @example
83
+ # client.customers.direct_debit_mandate("9afcd96e-caf8-40a1-96c9-1af16d0bc804")
84
+ #
85
+
86
+ def direct_debit_mandate(id)
87
+ client.post("/customers/#{id}/direct_debit_mandate")
88
+ end
89
+ end
90
+ end
91
+ end