starling-ruby 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (57) hide show
  1. checksums.yaml +4 -4
  2. data/.circleci/config.yml +8 -0
  3. data/.gitignore +1 -0
  4. data/.reek +27 -0
  5. data/.rubocop.yml +6 -4
  6. data/CHANGELOG.md +17 -0
  7. data/Gemfile.lock +37 -2
  8. data/README.md +102 -17
  9. data/bin/console +2 -6
  10. data/lib/starling.rb +40 -7
  11. data/lib/starling/api_service.rb +45 -37
  12. data/lib/starling/client.rb +165 -6
  13. data/lib/starling/errors/api_error.rb +35 -2
  14. data/lib/starling/errors/base_error.rb +6 -24
  15. data/lib/starling/middlewares/raise_starling_errors.rb +11 -10
  16. data/lib/starling/request.rb +17 -19
  17. data/lib/starling/resources/account_balance_resource.rb +14 -6
  18. data/lib/starling/resources/account_resource.rb +10 -0
  19. data/lib/starling/resources/address_resource.rb +26 -0
  20. data/lib/starling/resources/addresses_resource.rb +18 -0
  21. data/lib/starling/resources/base_resource.rb +34 -9
  22. data/lib/starling/resources/card_resource.rb +46 -0
  23. data/lib/starling/resources/contact_account_resource.rb +31 -0
  24. data/lib/starling/resources/contact_resource.rb +16 -0
  25. data/lib/starling/resources/customer_resource.rb +36 -0
  26. data/lib/starling/resources/direct_debit_mandate_resource.rb +43 -0
  27. data/lib/starling/resources/direct_debit_transaction_resource.rb +54 -0
  28. data/lib/starling/resources/inbound_faster_payments_transaction_resource.rb +56 -0
  29. data/lib/starling/resources/mastercard_transaction_resource.rb +73 -0
  30. data/lib/starling/resources/me_resource.rb +26 -0
  31. data/lib/starling/resources/merchant_location_resource.rb +33 -0
  32. data/lib/starling/resources/merchant_resource.rb +34 -0
  33. data/lib/starling/resources/outbound_faster_payments_transaction_resource.rb +56 -0
  34. data/lib/starling/resources/payment_resource.rb +78 -0
  35. data/lib/starling/resources/transaction_resource.rb +42 -0
  36. data/lib/starling/services/account_balance_service.rb +11 -2
  37. data/lib/starling/services/account_service.rb +16 -3
  38. data/lib/starling/services/addresses_service.rb +26 -0
  39. data/lib/starling/services/base_service.rb +22 -1
  40. data/lib/starling/services/card_service.rb +26 -0
  41. data/lib/starling/services/contact_accounts_service.rb +54 -0
  42. data/lib/starling/services/contacts_service.rb +73 -0
  43. data/lib/starling/services/customer_service.rb +25 -0
  44. data/lib/starling/services/direct_debit_mandates_service.rb +61 -0
  45. data/lib/starling/services/direct_debit_transactions_service.rb +46 -0
  46. data/lib/starling/services/inbound_faster_payments_transactions_service.rb +46 -0
  47. data/lib/starling/services/mastercard_transactions_service.rb +30 -0
  48. data/lib/starling/services/me_service.rb +26 -0
  49. data/lib/starling/services/merchant_locations_service.rb +34 -0
  50. data/lib/starling/services/merchants_service.rb +26 -0
  51. data/lib/starling/services/outbound_faster_payments_transactions_service.rb +46 -0
  52. data/lib/starling/services/payments_service.rb +30 -0
  53. data/lib/starling/services/transactions_service.rb +44 -0
  54. data/lib/starling/utils.rb +30 -0
  55. data/lib/starling/version.rb +1 -1
  56. data/starling-ruby.gemspec +2 -0
  57. metadata +63 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 7792e100b4e4f2815be54969b6f93eb7dc462cea
4
- data.tar.gz: 39494875175595c11bd964e26d3790332e863dca
3
+ metadata.gz: b8a9d85c10f82c31df8e74a368d3180e01d16d76
4
+ data.tar.gz: b844476947553b58c50ad54e927746bf21978af1
5
5
  SHA512:
6
- metadata.gz: e82c0ca11d00d1665fdbc5feea79817dfb77065796905a05ffc15a33985db6e7621bdf4763133e7b484f92d565905195b5d48b5ef6dde7d823223861655a9f50
7
- data.tar.gz: 612492a35d4de1bb25e8d9d8a01abd3bca0edecc5f04a29a33bda3ab7417c12b5dc8e48fc0005a723c984e289fe03c4406df5f3385a0959f88983fd80293bc52
6
+ metadata.gz: df6103bb3533d7d5ae0abccf312c3939f5c06c07cf49fe19fd502274c969798ea33691ffa217e6fee52c2c670d29ff5b27cfef47aa245d7107b305e21330d85a
7
+ data.tar.gz: 10c9a6efe88bf5f4b65654513d7e2aae5ce9a96230a39b51887d5764274f9ab5cb35ffddb8fa16a197402b6b29b23d35762203e7ef7c7f02cbe0265f2562e278
@@ -11,6 +11,9 @@ jobs:
11
11
  - type: cache-restore
12
12
  key: starling-{{ checksum "Gemfile.lock" }}
13
13
 
14
+ # Update bundler
15
+ - run: gem install bundler
16
+
14
17
  # Bundle install dependencies
15
18
  - run: bundle install --path vendor/bundle
16
19
 
@@ -34,6 +37,11 @@ jobs:
34
37
  command: |
35
38
  bundle exec rubocop
36
39
 
40
+ # Run Reek
41
+ - type: shell
42
+ command: |
43
+ bundle exec reek lib
44
+
37
45
  # Save artifacts
38
46
  - type: store_test_results
39
47
  path: /tmp/test-results
data/.gitignore CHANGED
@@ -8,3 +8,4 @@
8
8
  /tmp/
9
9
  /vendor
10
10
  .rspec_status
11
+ *.gem
data/.reek ADDED
@@ -0,0 +1,27 @@
1
+ UtilityFunction:
2
+ public_methods_only: true
3
+
4
+ IrresponsibleModule:
5
+ enabled: false
6
+
7
+ TooManyInstanceVariables:
8
+ exclude:
9
+ - "Starling::Request"
10
+
11
+ LongParameterList:
12
+ max_params: 4
13
+ exclude:
14
+ - "Starling::ApiService#make_request"
15
+
16
+ DataClump:
17
+ min_clump_size: 4
18
+
19
+ ControlParameter:
20
+ exclude:
21
+ # This looks like a false positive to me! `parsed_data` doesn't control the method.
22
+ - "Starling::Resources::BaseResource#initialize"
23
+
24
+ TooManyMethods:
25
+ exclude:
26
+ # Starling::Client has to have lots of methods, since it has one for each service
27
+ - "Starling::Client"
@@ -3,10 +3,12 @@ AllCops:
3
3
 
4
4
  Metrics/LineLength:
5
5
  Max: 90
6
-
7
- Style/Documentation:
8
- Enabled: false
6
+ Exclude:
7
+ # We have a very long line in this file in our YARD documentation comments to link to
8
+ # a PDF on the MasterCard website. This can't be broken into separate lines, and
9
+ # adding a rubocop:disable comment appears in the docs, so let's disable it here.
10
+ - lib/starling/resources/merchant_location_resource.rb
9
11
 
10
12
  Metrics/BlockLength:
11
13
  Exclude:
12
- - spec/**/*
14
+ - spec/**/*
@@ -0,0 +1,17 @@
1
+ ## v0.2.0 - 4 Jun 2017
2
+
3
+ * Add support for the Transaction Faster Payments In, Transaction Faster Payments Out,
4
+ Transaction Direct Debit, Payment and Transaction Mastercard APIs
5
+ * Improve error handling behaviour to raise errors at the right time with clear,
6
+ accessible information about what went wrong
7
+ * Use Ruby 2.0+ keyword arguments rather than passing around `Hash`es
8
+ * Add full [YARD](http://yardoc.org/) documentation
9
+ * Consistently return `Float`s for all API attributes which can be integers or floats
10
+ * Refactor `Request` to remove private methods
11
+ * Refactor `Resources::BaseResource`
12
+ * Check for common code smells with [Reek](https://github.com/troessner/reek) as part of
13
+ the CI process
14
+
15
+ ## v0.1.0 - 30 May 2017
16
+
17
+ * Initial release
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- starling-ruby (0.1.0)
4
+ starling-ruby (0.2.0)
5
5
  faraday (>= 0.8.9, < 0.10)
6
6
 
7
7
  GEM
@@ -10,14 +10,27 @@ GEM
10
10
  addressable (2.5.1)
11
11
  public_suffix (~> 2.0, >= 2.0.2)
12
12
  ast (2.3.0)
13
+ axiom-types (0.1.1)
14
+ descendants_tracker (~> 0.0.4)
15
+ ice_nine (~> 0.11.0)
16
+ thread_safe (~> 0.3, >= 0.3.1)
13
17
  builder (3.2.3)
18
+ codeclimate-engine-rb (0.4.0)
19
+ virtus (~> 1.0)
14
20
  coderay (1.1.1)
21
+ coercible (1.0.0)
22
+ descendants_tracker (~> 0.0.1)
15
23
  crack (0.4.3)
16
24
  safe_yaml (~> 1.0.0)
25
+ descendants_tracker (0.0.4)
26
+ thread_safe (~> 0.3, >= 0.3.1)
17
27
  diff-lcs (1.3)
28
+ equalizer (0.0.11)
18
29
  faraday (0.9.2)
19
30
  multipart-post (>= 1.2, < 3)
31
+ ffi (1.9.18-java)
20
32
  hashdiff (0.3.4)
33
+ ice_nine (0.11.2)
21
34
  method_source (0.8.2)
22
35
  multipart-post (2.0.0)
23
36
  parallel (1.11.2)
@@ -28,10 +41,19 @@ GEM
28
41
  coderay (~> 1.1.0)
29
42
  method_source (~> 0.8.1)
30
43
  slop (~> 3.4)
44
+ pry (0.10.4-java)
45
+ coderay (~> 1.1.0)
46
+ method_source (~> 0.8.1)
47
+ slop (~> 3.4)
48
+ spoon (~> 0.0)
31
49
  public_suffix (2.0.5)
32
50
  rainbow (2.2.2)
33
51
  rake
34
52
  rake (10.5.0)
53
+ reek (4.7.0)
54
+ codeclimate-engine-rb (~> 0.4.0)
55
+ parser (>= 2.4.0.0, < 2.5)
56
+ rainbow (~> 2.0)
35
57
  rspec (3.6.0)
36
58
  rspec-core (~> 3.6.0)
37
59
  rspec-expectations (~> 3.6.0)
@@ -61,20 +83,32 @@ GEM
61
83
  ruby-progressbar (1.8.1)
62
84
  safe_yaml (1.0.4)
63
85
  slop (3.6.0)
86
+ spoon (0.0.6)
87
+ ffi
88
+ thread_safe (0.3.6)
89
+ thread_safe (0.3.6-java)
64
90
  unicode-display_width (1.2.1)
65
91
  values (1.8.0)
92
+ virtus (1.0.5)
93
+ axiom-types (~> 0.1)
94
+ coercible (~> 1.0)
95
+ descendants_tracker (~> 0.0, >= 0.0.3)
96
+ equalizer (~> 0.0, >= 0.0.9)
66
97
  webmock (3.0.1)
67
98
  addressable (>= 2.3.6)
68
99
  crack (>= 0.3.2)
69
100
  hashdiff
101
+ yard (0.8.7.6)
70
102
 
71
103
  PLATFORMS
104
+ java
72
105
  ruby
73
106
 
74
107
  DEPENDENCIES
75
108
  bundler (~> 1.14)
76
109
  pry (~> 0.10.4)
77
110
  rake (~> 10.0)
111
+ reek (~> 4.7.0)
78
112
  rspec (~> 3.0)
79
113
  rspec-its (~> 1.2.0)
80
114
  rspec_junit_formatter (~> 0.2.3)
@@ -82,6 +116,7 @@ DEPENDENCIES
82
116
  starling-ruby!
83
117
  values (~> 1.8.0)
84
118
  webmock (~> 3.0.1)
119
+ yard (~> 0.8.7.6)
85
120
 
86
121
  BUNDLED WITH
87
- 1.15.0
122
+ 1.15.1
data/README.md CHANGED
@@ -3,17 +3,28 @@
3
3
  The Starling Ruby library provides a simple, idiomatic interface to the [Starling Bank API](https://developer.starlingbank.com).
4
4
 
5
5
  [![CircleCI](https://circleci.com/gh/timrogers/starling-ruby/tree/master.svg?style=svg)](https://circleci.com/gh/timrogers/starling-ruby/tree/master)
6
+ [![Gem Version](https://badge.fury.io/rb/starling-ruby.svg)](https://badge.fury.io/rb/starling-ruby)
6
7
 
7
8
  ## Getting started
8
9
 
9
10
  Install the gem by adding it to your Gemfile, and then run `bundle`:
10
11
 
11
12
  ```ruby
12
- # The gem will be available on RubyGems soon 💎
13
- gem 'starling-ruby', github: "timrogers/starling-ruby"
13
+ gem 'starling-ruby', '~> 0.2.0', require: 'starling'
14
14
  ```
15
15
 
16
- You can now initialise the client, providing an access token, an optionally an environment (either `:sandbox` or `:production`, defaulting to :production):
16
+ You'll need to get a personal access token for your Starling account. To get set up,
17
+ head to the Starling Developers
18
+ ["Get Started" page](https://developer.starlingbank.com/get-started) and then scroll
19
+ down to the "Personal Access" section for instructions.
20
+
21
+ At the moment, the library is not designed to
22
+ support OAuth applications (it can't handle refreshing access tokens) or endpoints
23
+ requiring the [`pay-local:create` scope](https://developer.starlingbank.com/tiers),
24
+ which is not granted to personal access tokens.
25
+
26
+ You can now initialise the client, providing your access token, and optionally an
27
+ environment (either `:sandbox` or `:production`, defaulting to :production):
17
28
 
18
29
  ```ruby
19
30
  starling = Starling::Client.new(
@@ -25,11 +36,15 @@ starling = Starling::Client.new(
25
36
 
26
37
  ## Usage
27
38
 
28
- Once you've initialised a `Starling::Client`, it exposes a number of services (living
29
- in `lib/starling/services`) which have methods calling out to the API, and returning
30
- resources (found in `lib/starling/resources`).
39
+ Now you've initialised a `Starling::Client` with your access token, you can start making
40
+ requests to the API.
41
+
42
+ All APIs are supported except "Get Photo" under the Contact API (it doesn't seem to
43
+ actually be possible to set a photo...) and the Payment APIs for creating an immediate or scheduled payment (which are not supported for personal access tokens).
31
44
 
32
- Much of the API has not yet been implemented. Stay tuned for further updates ❤️
45
+ See below for a few simple examples, or head to our
46
+ [full documentation](http://www.rubydoc.info/github/timrogers/starling-ruby/master) for
47
+ complete details:
33
48
 
34
49
  ### Check your balance
35
50
 
@@ -42,14 +57,16 @@ puts "Your balance is #{balance.amount} #{balance.currency}!"
42
57
 
43
58
  ```ruby
44
59
  account = starling.account.get
45
- puts "Your sort code is #{account.sort_code} and your account number is #{account.number}."
60
+ puts "Your sort code is #{account.sort_code} and your account number is " \
61
+ "#{account.number}."
46
62
  ```
47
63
 
48
64
  ### List transactions
49
65
 
50
66
  ```ruby
51
67
  transaction = starling.transactions.list.first
52
- puts "Your most recent transaction was for #{transaction.amount} on #{transaction.created}"
68
+ puts "Your most recent transaction was for #{transaction.amount} on " \
69
+ "#{transaction.created}"
53
70
  ```
54
71
 
55
72
  ### Fetch a transaction by ID
@@ -59,27 +76,95 @@ transaction = starling.transactions.get("insert-uuid-here")
59
76
  puts "Your transaction was for #{transaction.amount} on #{transaction.created}"
60
77
  ```
61
78
 
79
+ ### Fetch a merchant by ID
80
+
81
+ ```ruby
82
+ merchant = starling.merchants.get("insert-uuid-here")
83
+ puts "You can call #{merchant.name} on #{merchant.phone_number}"
84
+ ```
85
+
86
+ ### Fetch a merchant location by ID
87
+
88
+ ```ruby
89
+ merchant_location = starling.merchant_locations.get(
90
+ "insert-merchant-uid-here",
91
+ "insert-merchant-location-uid-here"
92
+ )
93
+
94
+ puts "This location for #{merchant_location.merchant_name} is called " \
95
+ "#{merchant_location.location_name}"
96
+ ```
97
+
98
+ ## Philosophy
99
+
100
+ Once you've initialised a `Starling::Client`, it exposes a number of services (living
101
+ in `lib/starling/services`) which have methods calling out to the API.
102
+
103
+ Philosophically, these services represent "kinds of things" (i.e. resources) returned by
104
+ or manipulated by the API. __These do not necessarily match up with the APIs listed in
105
+ Starling's [documentation](https://developer.starlingbank.com/docs), which is grouped slightly differently__.
106
+
107
+ The benefit is that we can have a small, predictable set of methods in our
108
+ services exposing API endpoints: `#get`, `#list`, `#create` and `#delete`.
109
+
110
+ This is best shown through an example - let's look at the Merchant API. It has two
111
+ endpoints listed under it: "Get Merchant" and "Get Location". The former operates on
112
+ a "kind of thing" called a "contact", and the latter operates on a "kind of thing" called
113
+ a "contact account". You could potentially group these together, but then you'd have to
114
+ have a slightly odd method name (something like `get_location`). Instead, we keep things
115
+ consistent, like follows:
116
+
117
+ ```ruby
118
+ starling.merchants.get(merchant_id)
119
+ starling.merchant_locations.get(merchant_id, merchant_location_id)
120
+ ```
121
+
122
+ Other parts of the Starling Bank API exhibit similar difficulties - for example, the
123
+ Contact API operates on Contacts, Contact Accounts and Contact Photos.
124
+
125
+ Methods on the services for accessing the API return resources (found in
126
+ `lib/starling/resources`), arrays of resources or, rarely, `Faraday::Response`s in the
127
+ case of `DELETE` requests.
128
+
129
+ ## Backwards compatability
130
+
131
+ This gem is versioned using [Semantic Versioning](http://semver.org/), so you can be
132
+ confident when updating that there will not be breaking changes outside of a major
133
+ version (following format MAJOR.MINOR.PATCH, so for instance moving from 2.3.0 to 3.0.0
134
+ would be allowed to include incompatible API changes). See
135
+ [CHANGELOG.md](https://github.com/timrogers/starling-ruby/tree/master/CHANGELOG.md) for
136
+ details on what has changed in each version.
137
+
138
+ Until we reach v1.0, minor versions may contain backwards-incompatible changes, as the
139
+ API stabilises. Any such changes will be flagged in the changelog.
140
+
62
141
  ## Tests
63
142
 
64
- The recommended way to run tests on the project is using CircleCI's local Docker testing
65
- - this is the best way to make sure that what passes tests locally in development will
66
- work when you push it and it runs through our automated CI.
143
+ The recommended way to run tests on the project is using CircleCI's local Docker
144
+ testing - this is the best way to make sure that what passes tests locally in development
145
+ will work when you push it and it runs through our automated CI.
67
146
 
68
147
  ```bash
69
148
  # Download the circleci binary (assuming /usr/local/bin is in your PATH)
70
- curl -o /usr/local/bin/circleci https://circle-downloads.s3.amazonaws.com/releases/build_agent_wrapper/circleci && chmod +x /usr/local/bin/circleci
149
+ curl -o /usr/local/bin/circleci \
150
+ https://circle-downloads.s3.amazonaws.com/releases/build_agent_wrapper/circleci
151
+
152
+ chmod +x /usr/local/bin/circleci
71
153
 
72
- # Run the full CI process, including tests and Rubocop. You'll need Docker installed.
154
+ # Run the full CI process, including tests, Rubocop and Reek. You'll need Docker
155
+ # installed.
73
156
  circleci build
74
157
  ```
75
158
 
76
- You can also run tests in your own environment by running `bundle exec rake`, and can
77
- run Rubocop by running `bundle exec rubocop`.
159
+ You can also run tests in your own environment by running `bundle exec rake`, can
160
+ run Rubocop by running `bundle exec rubocop` and can run Reek by running `bundle exec
161
+ reek lib`.
78
162
 
79
163
  ## Contributing
80
164
 
81
165
  All contributions are welcome - just make a pull request, making sure you include tests
82
- and write a good, informative commit message/pull request body.
166
+ and documentation for any public methods, and write a good, informative commit
167
+ message/pull request body.
83
168
 
84
169
  Check out
85
170
  [CODE_OF_CONDUCT.md](https://github.com/timrogers/starling-ruby/blob/master/CODE_OF_CONDUCT.md)
@@ -6,9 +6,5 @@ require 'starling'
6
6
  # You can add fixtures and/or initialization code here to make experimenting
7
7
  # with your gem easier. You can also use a different console, if you like.
8
8
 
9
- # (If you use this, don't forget to add pry to your Gemfile!)
10
- # require "pry"
11
- # Pry.start
12
-
13
- require 'irb'
14
- IRB.start(__FILE__)
9
+ require 'pry'
10
+ Pry.start
@@ -1,18 +1,51 @@
1
+ require 'starling/utils'
1
2
  require 'starling/version'
2
- require 'starling/client'
3
- require 'starling/api_service'
4
3
  require 'starling/request'
4
+ require 'starling/api_service'
5
+ require 'starling/client'
5
6
  require 'starling/errors/base_error'
6
7
  require 'starling/errors/api_error'
7
8
  require 'starling/middlewares/raise_starling_errors'
8
- require 'starling/services/base_service'
9
- require 'starling/services/account_service'
10
- require 'starling/services/account_balance_service'
11
- require 'starling/services/transactions_service'
9
+
12
10
  require 'starling/resources/base_resource'
13
- require 'starling/resources/account_resource'
14
11
  require 'starling/resources/account_balance_resource'
12
+ require 'starling/resources/account_resource'
13
+ require 'starling/resources/address_resource'
14
+ require 'starling/resources/addresses_resource'
15
+ require 'starling/resources/card_resource'
16
+ require 'starling/resources/contact_account_resource'
17
+ require 'starling/resources/contact_resource'
18
+ require 'starling/resources/customer_resource'
19
+ require 'starling/resources/direct_debit_mandate_resource'
20
+ require 'starling/resources/direct_debit_transaction_resource'
21
+ require 'starling/resources/inbound_faster_payments_transaction_resource'
22
+ require 'starling/resources/mastercard_transaction_resource'
23
+ require 'starling/resources/me_resource'
24
+ require 'starling/resources/merchant_location_resource'
25
+ require 'starling/resources/merchant_resource'
26
+ require 'starling/resources/outbound_faster_payments_transaction_resource'
27
+ require 'starling/resources/payment_resource'
15
28
  require 'starling/resources/transaction_resource'
16
29
 
30
+ require 'starling/services/base_service'
31
+ require 'starling/services/account_balance_service'
32
+ require 'starling/services/account_service'
33
+ require 'starling/services/addresses_service'
34
+ require 'starling/services/card_service'
35
+ require 'starling/services/contact_accounts_service'
36
+ require 'starling/services/contacts_service'
37
+ require 'starling/services/customer_service'
38
+ require 'starling/services/direct_debit_mandates_service'
39
+ require 'starling/services/direct_debit_transactions_service'
40
+ require 'starling/services/inbound_faster_payments_transactions_service'
41
+ require 'starling/services/mastercard_transactions_service'
42
+ require 'starling/services/me_service'
43
+ require 'starling/services/merchant_locations_service'
44
+ require 'starling/services/merchants_service'
45
+ require 'starling/services/outbound_faster_payments_transactions_service'
46
+ require 'starling/services/payments_service'
47
+ require 'starling/services/transactions_service'
48
+
49
+ # A Ruby client for accessing the Starling Bank API
17
50
  module Starling
18
51
  end
@@ -1,31 +1,57 @@
1
1
  require 'faraday'
2
2
 
3
3
  module Starling
4
+ # The API client under the hood, used by services publicly exposed by
5
+ # {Starling::Client} to dispatch requests to the Starling Bank API
4
6
  class ApiService
7
+ # The default adapter which will be used by Faraday to make requests. This can be
8
+ # customised by passing a :http_adapter when instantiating the ApiService.
5
9
  DEFAULT_ADAPTER = :net_http
6
- BASE_PATH = '/api/v1'.freeze
7
-
8
- def initialize(base_url, options = {})
9
- @access_token = options.fetch(:access_token)
10
10
 
11
- http_adapter = options[:http_adapter] || [DEFAULT_ADAPTER]
12
- connection_options = options[:connection_options]
11
+ # The path of the API version which will be prepended to request paths
12
+ BASE_PATH = '/api/v1'.freeze
13
13
 
14
+ # Instantiates a {ApiService} for dispatching requests to the Starling Bank API
15
+ #
16
+ # @param base_url [String] The base URL for the Starling API, including the protocol
17
+ # and hostname, to which the {BASE_PATH} and request paths
18
+ # will be added
19
+ # @param access_token [String] A personal access token for the Starling Bank API
20
+ # @param http_adapter [Array] The HTTP adapter to be used, defaulting to
21
+ # {DEFAULT_ADAPTER}
22
+ # @param connection_options [Hash] A hash of options to be passed in when
23
+ # instantiating Faraday (for example for setting
24
+ # the request timeout)
25
+ # @param default_headers [Hash] A set of user-provided HTTP headers to add to each
26
+ # request, alongside the library's defaults defined in
27
+ # {#library_default_headers}
28
+ # @return [Starling::ApiService] The configured ApiService
29
+ def initialize(base_url, access_token:, http_adapter: [DEFAULT_ADAPTER],
30
+ connection_options: {}, default_headers: {})
14
31
  @connection = Faraday.new(base_url, connection_options) do |faraday|
15
32
  faraday.response(:raise_starling_errors)
16
33
  faraday.adapter(*http_adapter)
17
34
  end
18
35
 
19
- user_provided_default_headers = options.fetch(:default_headers, {})
20
- @headers = default_headers.merge(user_provided_default_headers)
36
+ @headers = library_default_headers(access_token: access_token)
37
+ .merge(default_headers)
21
38
  end
22
39
 
23
- def make_request(method, path, options = {})
24
- raise ArgumentError, 'options must be a hash' unless options.is_a?(Hash)
25
- options[:headers] ||= {}
26
- options[:headers] = @headers.merge(options[:headers])
27
-
28
- Request.new(@connection, method, build_path(path), options)
40
+ # Makes an HTTP request to the Starling Bank API with the specified method and path
41
+ #
42
+ # @param method [Symbol] The HTTP method which will be used for the request
43
+ # @param path [String] The path of the API endpoint, which will be appended to the
44
+ # {BASE_PATH}
45
+ # @param params [Hash] The parameters which will be included in the request, either
46
+ # in the URL or the body, depending on the method
47
+ # @param headers [Hash] Additional headers to be included in your request, which will
48
+ # be merged on top of the service's default headers
49
+ # @return [Faraday::Response] The response from the server to the dispatched request
50
+ def make_request(method, path, params: {}, headers: {})
51
+ headers = @headers.merge(headers)
52
+
53
+ Request.new(@connection, method, build_path(path), params: params,
54
+ headers: headers)
29
55
  .make_request
30
56
  end
31
57
 
@@ -35,9 +61,9 @@ module Starling
35
61
  "#{BASE_PATH}#{path}"
36
62
  end
37
63
 
38
- def default_headers
64
+ def library_default_headers(access_token:)
39
65
  {
40
- 'Authorization' => "Bearer #{@access_token}",
66
+ 'Authorization' => "Bearer #{access_token}",
41
67
  'Accept' => 'application/json',
42
68
  'User-Agent' => user_agent
43
69
  }
@@ -47,32 +73,14 @@ module Starling
47
73
  @user_agent ||=
48
74
  begin
49
75
  comment = [
50
- "#{ruby_engine}/#{ruby_version}",
51
- "#{RUBY_ENGINE}/#{interpreter_version}",
76
+ "#{Utils.ruby_engine}/#{Utils.ruby_version}",
77
+ "#{RUBY_ENGINE}/#{Utils.interpreter_version}",
52
78
  RUBY_PLATFORM.to_s,
53
79
  "faraday/#{Faraday::VERSION}"
54
80
  ]
55
81
 
56
- "#{gem_info} #{comment.join(' ')}"
82
+ "#{Utils.gem_info} #{comment.join(' ')}"
57
83
  end
58
84
  end
59
-
60
- def gem_info
61
- return 'starling-ruby' unless defined?(Starling::VERSION)
62
- "starling-ruby/v#{Starling::VERSION}"
63
- end
64
-
65
- def ruby_engine
66
- defined?(RUBY_ENGINE) ? RUBY_ENGINE : 'ruby'
67
- end
68
-
69
- def ruby_version
70
- return RUBY_VERSION unless defined?(RUBY_PATCHLEVEL)
71
- RUBY_VERSION + "p#{RUBY_PATCHLEVEL}"
72
- end
73
-
74
- def interpreter_version
75
- defined?(JRUBY_VERSION) ? JRUBY_VERSION : RUBY_VERSION
76
- end
77
85
  end
78
86
  end