increase 0.3.0 → 0.3.2

Sign up to get free protection for your applications and to get access to all the features.
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