increase 0.3.0 → 0.3.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: a945cde9440a62a76cd7a95c5bc91b7dfea452fada50349e3d749c6fc95fa72e
4
- data.tar.gz: b6ce6f53d72e35e027287feff54fc47c7e855fa364fc11040646efd92c8ce028
3
+ metadata.gz: 316c9f7266fa873bde94e93509769dc4883691aa435da355d636a94f9c48b762
4
+ data.tar.gz: c38729a1d10974a7e46911e834c539b9931f18380d9e20aedcc71bc810fdb22d
5
5
  SHA512:
6
- metadata.gz: 30fb2ded08ba6aa27adfa4f85932e941d4e727ae069ab8df915c2dd001cdd35779b8b58090e29695100270ec66da45cd6d495efdd0b7acc4bf747473b3a5970a
7
- data.tar.gz: 5a591e007db71c14a1a4e827650bea8a6eda56d68e248eb2988e02380c6de4ccdc5054963c09bda8f2797c36a7dc148fb5a14de58105ff535cbc56bd137f7698
6
+ metadata.gz: d7b31744c795da1c21e7f7dc85721bfeacdf115de67dee45a2751adc1a4e1d97d8a8fe69bac13d658921aeaf42873bbbe400d835e9f1a1a6e77941a19f5154bb
7
+ data.tar.gz: 1f89985c494abd6b3e50df9d24a21cc1d0078b576b20010a04a11ab666ad3c8f55e910fc7959d0ae10ed72dd40bd8eae6fdc7f91dbfe71e5f91c14cd7d756da9
data/CHANGELOG.md ADDED
@@ -0,0 +1,97 @@
1
+ # Changelog
2
+
3
+ ## [0.3.2] - 2023-03-24
4
+
5
+ ### Fixes
6
+
7
+ - Updated `Increase::Webhook::Signature#verify` to
8
+ raise `WebhookSignatureVerificationError` when arguments are `nil`
9
+
10
+ ## [0.3.1] - 2023-03-23
11
+
12
+ ### Enhancements
13
+
14
+ - Support Faraday >= 1.0.1 (https://github.com/garyhtou/increase-ruby/pull/8)
15
+
16
+
17
+ ## [0.3.0] - 2023-03-23
18
+
19
+ ### Enhancements
20
+
21
+ - Better developer experience for file uploads (9fc40df62a537ed3402a0c0deb5bee908d84b671)
22
+
23
+ ### Documentation
24
+
25
+ - Pin gem version in install command (2127f5a04be8832ba5c5c42476e2844fb6ca9c24)
26
+ - Update README to reflect new file upload DX (9fc40df62a537ed3402a0c0deb5bee908d84b671)
27
+
28
+
29
+ ## [0.2.0] - 2023-03-21
30
+
31
+ ### Enhancements
32
+
33
+ - Made webhook verification `verify` raise an error, but `verify?` return a bool (58d462fc648cafdcfdb7b8d2c0e0ec1f45362984)
34
+ - Wrote a generator to generate API resource classes from the OpenAPI spec (8eedc2d4a5daecd97c156546c649f27376eb9762)
35
+ - Added all API resources (2a04096dea06a34ba8ff1d5061475ed1a2354ac2)
36
+ - Supported getting response from `list` operation (a2141f034a4f29cfee0222a4fac32949581adbc6)
37
+
38
+ ### Fixes
39
+
40
+ - Use `ArgumentError` when unknown config passed to `Configuration` (cdd0703febd6f9dec0ecd4ac34fe465697edbf08)
41
+ - File uploads! Increase::Files.create now works (236cad5011b996b40793abe85698ba47fa1ba3f8)
42
+
43
+ ### Documentation
44
+
45
+ - Updated error handling example to be more clear (85d8d6ff102a8ef502040322537b79085f89779d)
46
+ - Fixed idempotency example (343ae6d4cb1b8216192e2f820836ca87cc3a9a36)
47
+ - Added example for passing hash to `with_config` (b82fac134c813d03a31466e83341acc891c1deb6)
48
+ - Updated Rails config example to use Rails credentials (2b4fec9c1d52d04e42760a9889ba1cb313b5bd18)
49
+ - Added list filtering example (6333f982062b2527f676a6aade4e5abf01a7816b)
50
+ - Added table of contents (88e9b6ae05aaa62974514a6c318f35e708e49fb5)
51
+ - Added full example for Idempotency keys (6d5ce8bdd3d4baf13c4d0800a159c784bc1bdc78)
52
+ - Added manual pagination example using `next_cursor` (57157e2965904c9150676696e8567b5518892945)
53
+
54
+
55
+ ## [0.1.3] - 2023-03-20
56
+
57
+ ### Enhancements
58
+
59
+ - Added `Limits` resource (98654433812b202ecfd31ba35d520981529f2e2b)
60
+ - Added `CheckTransfers` resource (a899c9ca6206af78df23ba8b62c8dfc88b7fc22d)
61
+ - Added `RoutingNumbers` resource (209e7f279a1ff648142ac6aca6cfe946fc653845)
62
+
63
+ ### Documentation
64
+
65
+ - Added section about webhook signature verification (650aed416ab820ed55f0ed8936f201274964fc37)
66
+ - Added section about Rails configuration (650aed416ab820ed55f0ed8936f201274964fc37)
67
+
68
+ ## [0.1.2] - 2023-03-20
69
+
70
+ ### Enhancements
71
+
72
+ - Added webhook verification support (ce193fb8888d497817ab5551bf8e9096c5bf7e26)
73
+ - Added user agent to requests (ce44249ead32ba4055b13ba576f0b91f20493cfc)
74
+ - Update supported Ruby version to >= 2.7.4 (c404f8ddc4762615bac660edabf0385716b4bd74)
75
+
76
+ ### Fixes
77
+
78
+ - Always apply default configuration options (079f0ca603a80dd2c9523df23244b64e2e0a5772)
79
+
80
+ ### Documentation
81
+
82
+ - Wrote the README! (aa7c778834cd268ab1318e44fceea0b062a5c5df)
83
+
84
+
85
+ ## [0.1.1] - 2023-03-19
86
+
87
+ ### Enhancements
88
+ - Added client-wide configuration options (c47e32c93371b43f2e0a3ac49525e46fbe9ef326)
89
+ - Load `INCREASE_API_KEY` and `INCREASE_BASE_URL` from environment variables (2e6cbe21a2b37c230dc3f2382613b98ffc3ea4d8, 24cea582c03b64018ed2f0997f99f4bae581a1fa, 4a80e4263c7917bbfa1371c70752476d7f7f0695)
90
+ - Added the following API resources:
91
+ - `AccountNumbers` (209b155c0fa3977c2c19602a2239c8b27001935e)
92
+ - `AccountTransfers` (6065a932522bd582aa4f177037a5eca8e5d1647d)
93
+ - `AchTransfers` (caef61c36bfffc780016880959f067b59bfa288e)
94
+ - `Cards` (b58bccc8aab00fd2ee69f2973898e6a13c1b2544)
95
+ - `Events` (dd3312638227be47f04c8bd740c3dd25104959e7)
96
+ - `PendingTransactions` (b6f4b2c02a9108603b4d1feee9a39c1a7f1086ef)
97
+ - `Transaction` (b6f4b2c02a9108603b4d1feee9a39c1a7f1086ef)
data/README.md CHANGED
@@ -19,14 +19,14 @@ Bare-Metal Banking APIs!
19
19
  Install the gem and add to the application's Gemfile by executing:
20
20
 
21
21
  ```sh
22
- $ bundle add increase -v 0.3.0
22
+ $ bundle add increase -v 0.3.2
23
23
  ```
24
24
 
25
25
  If bundler is not being used to manage dependencies, install the gem by
26
26
  executing:
27
27
 
28
28
  ```sh
29
- $ gem install increase -v 0.3.0
29
+ $ gem install increase -v 0.3.2
30
30
  ```
31
31
 
32
32
  ## Usage
@@ -326,14 +326,15 @@ to run the console with your Increase sandbox API key pre-filled.
326
326
 
327
327
  To install this gem onto your local machine, run `bundle exec rake install`.
328
328
 
329
- To release a new version, update the version number in `version.rb`, and then
330
- run `bundle exec rake release`, which will create a git tag for the version,
331
- push git commits and the created tag, and push the `.gem` file
332
- to [rubygems.org](https://rubygems.org).
329
+ To release a new version:
333
330
 
334
- Alternatively, use [`gem-release`](https://github.com/svenfuchs/gem-release) and
335
- run `gem bump --version patch|minor|major`. Then release the gem by
336
- running `bundle exec rake release`.
331
+ - `gem bump --version patch|minor|major`
332
+ - Make sure you
333
+ have [`gem-release`](https://github.com/svenfuchs/gem-release)
334
+ installed
335
+ - Update the CHANGELOG and README if necessary
336
+ - `bundle exec rake release`
337
+ - Create release on GitHub from newly created tag
337
338
 
338
339
  ## Contributing
339
340
 
@@ -1,13 +1,18 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "increase/configuration"
4
+ require "increase/middleware/raise_api_error"
4
5
 
5
6
  require "faraday"
6
- require "faraday/follow_redirects"
7
- require "faraday/multipart"
8
-
9
- # Custom Faraday Middleware to handle raising errors
10
- require "faraday/raise_increase_api_error"
7
+ require "faraday/follow_redirects" # Supports both Faraday 1.0 and 2.0
8
+ if Gem::Version.new(Faraday::VERSION) >= Gem::Version.new("2.0")
9
+ # In Faraday 2.0, multipart support is no longer included by default
10
+ require "faraday/multipart"
11
+ else
12
+ # In Faraday 1.0, the JSON middleware is not included by default
13
+ require "increase/middleware/encode_json"
14
+ require "increase/middleware/parse_json"
15
+ end
11
16
 
12
17
  module Increase
13
18
  class Client
@@ -38,7 +43,7 @@ module Increase
38
43
  if @configuration.raise_api_errors
39
44
  # This custom middleware for raising Increase API errors must be
40
45
  # located before the JSON response middleware.
41
- f.use FaradayMiddleware::RaiseIncreaseApiError
46
+ f.use Increase::Middleware::RaiseApiError
42
47
  end
43
48
 
44
49
  f.response :json
@@ -1,9 +1,9 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'tempfile'
4
- require 'marcel'
5
- require 'faraday'
6
- require 'pathname'
3
+ require "tempfile"
4
+ require "marcel"
5
+ require "faraday"
6
+ require "pathname"
7
7
 
8
8
  module Increase
9
9
  class FileUpload
@@ -33,11 +33,19 @@ module Increase
33
33
  end
34
34
 
35
35
  def file_part
36
- Faraday::Multipart::FilePart.new(
37
- @file,
38
- @content_type,
39
- @filename
40
- )
36
+ if Gem::Version.new(Faraday::VERSION) >= Gem::Version.new("2.0")
37
+ Faraday::Multipart::FilePart.new(
38
+ @file,
39
+ @content_type,
40
+ @filename
41
+ )
42
+ else
43
+ Faraday::FilePart.new(
44
+ @file,
45
+ @content_type,
46
+ @filename
47
+ )
48
+ end
41
49
  end
42
50
 
43
51
  private
@@ -45,6 +53,5 @@ module Increase
45
53
  def default_filename
46
54
  "file upload #{Time.now}"
47
55
  end
48
-
49
56
  end
50
57
  end
@@ -0,0 +1,57 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "faraday"
4
+
5
+ module Increase
6
+ module Middleware
7
+ # JSON request middleware for Faraday 1.0
8
+ # In Faraday 2.0, the JSON middleware is bundled with the Faraday gem itself
9
+ #
10
+ # This middleware is from
11
+ # https://github.com/lostisland/faraday_middleware/blob/main/lib/faraday_middleware/request/encode_json.rb
12
+ class EncodeJson < Faraday::Middleware
13
+ CONTENT_TYPE = "Content-Type"
14
+ MIME_TYPE = "application/json"
15
+ MIME_TYPE_REGEX = %r{^application/(vnd\..+\+)?json$}.freeze
16
+
17
+ dependency do
18
+ require "json" unless defined?(::JSON)
19
+ end
20
+
21
+ def call(env)
22
+ match_content_type(env) do |data|
23
+ env[:body] = encode data
24
+ end
25
+ @app.call env
26
+ end
27
+
28
+ def encode(data)
29
+ ::JSON.generate data
30
+ end
31
+
32
+ def match_content_type(env)
33
+ return unless process_request?(env)
34
+
35
+ env[:request_headers][CONTENT_TYPE] ||= MIME_TYPE
36
+ yield env[:body] unless env[:body].respond_to?(:to_str)
37
+ end
38
+
39
+ def process_request?(env)
40
+ type = request_type(env)
41
+ has_body?(env) && (type.empty? || MIME_TYPE_REGEX =~ type)
42
+ end
43
+
44
+ def has_body?(env)
45
+ (body = env[:body]) && !(body.respond_to?(:to_str) && body.empty?)
46
+ end
47
+
48
+ def request_type(env)
49
+ type = env[:request_headers][CONTENT_TYPE].to_s
50
+ type = type.split(";", 2).first if type.index(";")
51
+ type
52
+ end
53
+ end
54
+ end
55
+ end
56
+
57
+ Faraday::Request.register_middleware(json: Increase::Middleware::EncodeJson)
@@ -0,0 +1,42 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "faraday"
4
+ require "json"
5
+
6
+ module Increase
7
+ module Middleware
8
+ # JSON response middleware for Faraday 1.0
9
+ # In Faraday 2.0, the JSON middleware is bundled with the Faraday gem itself
10
+ #
11
+ # This middleware is from
12
+ # https://github.com/jsmestad/jsonapi-consumer/blob/7d9721ea7feb888ea1e43edb9f1c0c38334762ed/lib/jsonapi/consumer/middleware/parse_json.rb
13
+ class ParseJson < Faraday::Middleware
14
+ def call(environment)
15
+ @app.call(environment).on_complete do |env|
16
+ if process_response_type?(response_type(env))
17
+ env[:raw_body] = env[:body]
18
+ env[:body] = parse(env[:body])
19
+ end
20
+ end
21
+ end
22
+
23
+ private
24
+
25
+ def parse(body)
26
+ ::JSON.parse(body) unless body.strip.empty?
27
+ end
28
+
29
+ def response_type(env)
30
+ type = env[:response_headers]["Content-Type"].to_s
31
+ type = type.split(";", 2).first if type.index(";")
32
+ type
33
+ end
34
+
35
+ def process_response_type?(type)
36
+ !!type.match(/\bjson$/)
37
+ end
38
+ end
39
+ end
40
+ end
41
+
42
+ Faraday::Response.register_middleware(json: Increase::Middleware::ParseJson)
@@ -0,0 +1,13 @@
1
+ require "faraday"
2
+
3
+ module Increase
4
+ module Middleware
5
+ class RaiseApiError < Faraday::Middleware
6
+ def on_complete(env)
7
+ return if env[:status] < 400
8
+
9
+ raise Increase::ApiError.from_response(env)
10
+ end
11
+ end
12
+ end
13
+ end
@@ -29,7 +29,7 @@ module Increase
29
29
  with = [with].flatten.compact
30
30
 
31
31
  # TODO: This doesn't support multiple path params
32
- is_id = ->(path_segment) { path_segment.is_a?(Symbol) && path_segment.to_s.end_with?('id') }
32
+ is_id = ->(path_segment) { path_segment.is_a?(Symbol) && path_segment.to_s.end_with?("id") }
33
33
  has_id = path.any? is_id
34
34
 
35
35
  request_method = :request
@@ -13,7 +13,7 @@ module Increase
13
13
  end
14
14
 
15
15
  def next_cursor
16
- wrapped&.dig('next_cursor')
16
+ wrapped&.dig("next_cursor")
17
17
  end
18
18
  end
19
19
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Increase
4
- VERSION = "0.3.0"
4
+ VERSION = "0.3.2"
5
5
  end
@@ -23,7 +23,7 @@ module Increase
23
23
  end
24
24
 
25
25
  # Parse header
26
- sig_values = signature_header.split(",").map { |pair| pair.split("=") }.to_h
26
+ sig_values = signature_header&.split(",")&.map { |pair| pair.split("=") }&.to_h || {}
27
27
 
28
28
  # Extract values
29
29
  t = sig_values["t"] # Should be a string (ISO-8601 timestamp)
@@ -32,6 +32,8 @@ module Increase
32
32
  raise sig_error.call("No signature found with scheme #{scheme} in signature header") if sig.nil?
33
33
 
34
34
  # Check signature
35
+ raise sig_error.call("Webhook secret is required") if secret.nil?
36
+ raise sig_error.call("Payload is required") if payload.nil?
35
37
  expected_sig = compute_signature(timestamp: t, payload: payload, secret: secret)
36
38
  matches = Util.secure_compare(expected_sig, sig)
37
39
  raise sig_error.call("Signature mismatch") unless matches
@@ -56,6 +58,10 @@ module Increase
56
58
  end
57
59
 
58
60
  def self.compute_signature(timestamp:, payload:, secret:)
61
+ raise ArgumentError, "timestamp is required" if timestamp.nil?
62
+ raise ArgumentError, "payload is required" if payload.nil?
63
+ raise ArgumentError, "secret is required" if secret.nil?
64
+
59
65
  signed_payload = timestamp.to_s + "." + payload.to_s
60
66
  OpenSSL::HMAC.hexdigest("SHA256", secret, signed_payload)
61
67
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: increase
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.3.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Gary Tou
@@ -14,30 +14,36 @@ dependencies:
14
14
  name: faraday
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - "~>"
17
+ - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: '2.7'
19
+ version: 1.0.1
20
+ - - "<"
21
+ - !ruby/object:Gem::Version
22
+ version: '2.0'
20
23
  type: :runtime
21
24
  prerelease: false
22
25
  version_requirements: !ruby/object:Gem::Requirement
23
26
  requirements:
24
- - - "~>"
27
+ - - ">="
28
+ - !ruby/object:Gem::Version
29
+ version: 1.0.1
30
+ - - "<"
25
31
  - !ruby/object:Gem::Version
26
- version: '2.7'
32
+ version: '2.0'
27
33
  - !ruby/object:Gem::Dependency
28
34
  name: faraday-follow_redirects
29
35
  requirement: !ruby/object:Gem::Requirement
30
36
  requirements:
31
- - - '='
37
+ - - "~>"
32
38
  - !ruby/object:Gem::Version
33
- version: 0.3.0
39
+ version: '0.3'
34
40
  type: :runtime
35
41
  prerelease: false
36
42
  version_requirements: !ruby/object:Gem::Requirement
37
43
  requirements:
38
- - - '='
44
+ - - "~>"
39
45
  - !ruby/object:Gem::Version
40
- version: 0.3.0
46
+ version: '0.3'
41
47
  - !ruby/object:Gem::Dependency
42
48
  name: faraday-multipart
43
49
  requirement: !ruby/object:Gem::Requirement
@@ -159,6 +165,7 @@ extra_rdoc_files: []
159
165
  files:
160
166
  - ".rspec"
161
167
  - ".standard.yml"
168
+ - CHANGELOG.md
162
169
  - Gemfile
163
170
  - LICENSE.txt
164
171
  - OPENAPI_VERSION
@@ -167,12 +174,14 @@ files:
167
174
  - bin/generate
168
175
  - bin/setup
169
176
  - generate/resource.rb.erb
170
- - lib/faraday/raise_increase_api_error.rb
171
177
  - lib/increase.rb
172
178
  - lib/increase/client.rb
173
179
  - lib/increase/configuration.rb
174
180
  - lib/increase/errors.rb
175
181
  - lib/increase/file_upload.rb
182
+ - lib/increase/middleware/encode_json.rb
183
+ - lib/increase/middleware/parse_json.rb
184
+ - lib/increase/middleware/raise_api_error.rb
176
185
  - lib/increase/resource.rb
177
186
  - lib/increase/resources.rb
178
187
  - lib/increase/resources/account_numbers.rb
@@ -1,11 +0,0 @@
1
- require "faraday"
2
-
3
- module FaradayMiddleware
4
- class RaiseIncreaseApiError < Faraday::Middleware
5
- def on_complete(env)
6
- return if env[:status] < 400
7
-
8
- raise Increase::ApiError.from_response(env)
9
- end
10
- end
11
- end