treezor_connect 0.20.2 → 0.22.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 011f091f5e0c82a0981aa71593c47a061c61f437fbbf375a21a24ce520c8aecc
4
- data.tar.gz: 70e687f287b0ca4f4f3766a1d81e425d6317583d5adc5f56647dd200ea8df48f
3
+ metadata.gz: af881cf032f896376706c821ec29e3a7a9d2c41b1720e474ff609d3edcefe01d
4
+ data.tar.gz: 00f85ff778af5d215a42ce9ebece82db614a0fc3826a29a9b5412560dd7bf038
5
5
  SHA512:
6
- metadata.gz: 1da2519ac8dded6d4a8d14f5a8c20ceb00adcbba6cfe1ccefb8691249eea64081c4b49ca007ab7571dbe2224728a2a6729b2c687e8eaeced45dd5933ccc6f5e8
7
- data.tar.gz: 650952e894270479623be87d5a17b3353f40159fcc274afce31db8e2fbf03059ca8f634947b85170e8160ce7e4acd74b00a02aa41aa9d4c68d414b491d30707b
6
+ metadata.gz: 6895c953b9a931be42a543bd3ff53c841621899a3e2ec071d7443a9ebc2925a3b3f339e738a83e67dd4e907456dc8438e441c280fb9db85bd121df14b775d7c7
7
+ data.tar.gz: 45a00902e1468f9dbab98c926a91cd5fe2402cc96b935b729828715745c57c7adf408006bb2ee6bf529946107ae1fd55777fa217e8fc629a21e79f7ccc7d91e0
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ module TreezorConnect
4
+ module ApiOperations
5
+ module BulkCreate
6
+ def bulk_create(params_list, access_token = nil)
7
+ params_list = params_list.map { |params| { body: params } }
8
+ treezor_responses = parallel_request(:post, resource_url, params_list:, access_token:)
9
+ treezor_responses.map do |treezor_response|
10
+ if treezor_response.is_a?(ApiError)
11
+ treezor_response
12
+ else
13
+ data = extract_response_data(treezor_response, extract_all_objects: false)
14
+ Util.convert_to_treezor_object(data, { object_class: self::OBJECT_NAME })
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -7,14 +7,19 @@ module TreezorConnect
7
7
  def request(method, url, params: {}, headers: {}, access_token: nil)
8
8
  params = Util.normalize_params(params)
9
9
  client = TreezorConnect::Client.new(access_token)
10
- response = client.execute_request(
11
- method, url,
12
- headers:,
13
- params:
14
- )
10
+ response = client.execute_request(method, url, headers:, params:)
15
11
  TreezorResponse.from_http_response(response)
16
12
  end
17
13
 
14
+ def parallel_request(method, url, params_list: {}, headers: {}, access_token: nil)
15
+ params_list = params_list.map { |params| Util.normalize_params(params) }
16
+ client = TreezorConnect::Client.new(access_token)
17
+ responses = client.execute_parallel_requests(method, url, headers:, params_list:)
18
+ responses.map do |response|
19
+ response.is_a?(ApiError) ? response : TreezorResponse.from_http_response(response)
20
+ end
21
+ end
22
+
18
23
  def extract_response_data(response, extract_all_objects: true)
19
24
  if defined?(self::OBJECT_KEY) && response.data.key?(self::OBJECT_KEY)
20
25
  objects = response.data.fetch(self::OBJECT_KEY)
@@ -5,27 +5,53 @@ module TreezorConnect
5
5
  attr_reader :access_token
6
6
 
7
7
  def initialize(access_token)
8
- @conn = build_default_conn
9
8
  @access_token = access_token.nil? ? default_access_token : access_token
9
+ @conn = Faraday.new(
10
+ url: TreezorConnect.api_base_url,
11
+ headers: { 'Authorization' => "Bearer #{@access_token}" },
12
+ parallel_manager:
13
+ ) do |faraday|
14
+ faraday.response :logger, Logger.new($stdout) if ENV['ENABLE_HTTP_LOGGING']
15
+ faraday.adapter :typhoeus
16
+ end
10
17
  end
11
18
 
12
19
  def execute_request(method, path, headers: {}, params: {})
13
- headers['Authorization'] = "Bearer #{access_token}"
14
- response = conn.public_send(method, path, params: params[:query], form: params[:form], json: params[:body],
15
- headers:)
20
+ response = conn.public_send(method, path) do |req|
21
+ req.headers.merge!(headers)
22
+ configure_request(req, params)
23
+ end
16
24
 
17
25
  process_response(response)
18
26
  end
19
27
 
28
+ def execute_parallel_requests(method, path, headers: {}, params_list: [])
29
+ responses = []
30
+ conn.in_parallel do
31
+ params_list.each do |params|
32
+ responses << conn.public_send(method, path) do |req|
33
+ req.headers.merge!(headers)
34
+ configure_request(req, params)
35
+ end
36
+ end
37
+ end
38
+
39
+ responses.map { |response| process_parallel_response(response) }
40
+ end
41
+
20
42
  private
21
43
 
22
44
  attr_reader :conn
23
45
 
24
- def build_default_conn
25
- http = HTTP.persistent(TreezorConnect.api_base_url)
26
- return http.use(logging: { logger: Logger.new($stdout) }) unless ENV['ENABLE_HTTP_LOGGING'].nil?
27
-
28
- http
46
+ def configure_request(req, params)
47
+ req.params.merge!(params[:query]) if params[:query]
48
+ if params[:form]
49
+ req.headers['Content-Type'] = 'application/x-www-form-urlencoded'
50
+ req.body = URI.encode_www_form(params[:form])
51
+ elsif params[:body]
52
+ req.headers['Content-Type'] = 'application/json'
53
+ req.body = params[:body].to_json
54
+ end
29
55
  end
30
56
 
31
57
  def oauth_client
@@ -36,23 +62,40 @@ module TreezorConnect
36
62
  )
37
63
  end
38
64
 
65
+ def parallel_manager
66
+ @parallel_manager ||= begin
67
+ # Currently library default is 200 but this way we are future-proof
68
+ max_concurrency = TreezorConnect.max_concurrency || Typhoeus::Hydra.new.max_concurrency
69
+ Typhoeus::Hydra.new(max_concurrency:)
70
+ end
71
+ end
72
+
39
73
  def fetch_access_token
40
74
  oauth_client.client_credentials.get_token.token
41
75
  end
42
76
 
43
77
  def process_response(response)
44
- http_status = response.status
45
- if http_status.success?
78
+ if response.success?
46
79
  response
47
- elsif http_status == 303
80
+ elsif response.status == 303
48
81
  raise AlreadyCreatedError, response
49
82
  else
50
- raise_api_error(http_status:, http_body: JSON.parse(response.to_s))
83
+ raise build_api_error(http_status: response.status, http_body: JSON.parse(response.body))
84
+ end
85
+ end
86
+
87
+ def process_parallel_response(response)
88
+ if response.success?
89
+ response
90
+ elsif response.status == 303
91
+ AlreadyCreatedError.new(response)
92
+ else
93
+ build_api_error(http_status: response.status, http_body: JSON.parse(response.body))
51
94
  end
52
95
  end
53
96
 
54
- def raise_api_error(http_status:, http_body:)
55
- raise ApiError.new(
97
+ def build_api_error(http_status:, http_body:)
98
+ ApiError.new(
56
99
  "API request failed: #{http_body.inspect} (HTTP response code was #{http_status})",
57
100
  http_body,
58
101
  http_status
@@ -11,6 +11,7 @@ module TreezorConnect
11
11
  end
12
12
 
13
13
  extend TreezorConnect::ApiOperations::Create
14
+ extend TreezorConnect::ApiOperations::BulkCreate
14
15
  extend TreezorConnect::ApiOperations::Fetch
15
16
  end
16
17
  end
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'http'
3
+ require 'faraday'
4
+ require 'faraday/typhoeus'
4
5
  require 'oauth2'
5
6
  require 'logger'
6
7
 
@@ -19,6 +20,7 @@ require 'treezor_connect/errors'
19
20
  require 'treezor_connect/api_operations/fetch'
20
21
  require 'treezor_connect/api_operations/list'
21
22
  require 'treezor_connect/api_operations/create'
23
+ require 'treezor_connect/api_operations/bulk_create'
22
24
  require 'treezor_connect/api_operations/request'
23
25
  require 'treezor_connect/api_operations/update'
24
26
  require 'treezor_connect/api_operations/delete'
@@ -29,7 +31,7 @@ require 'treezor_connect/resources'
29
31
 
30
32
  module TreezorConnect
31
33
  class << self
32
- attr_accessor :api_base_url, :client_id, :client_secret
34
+ attr_accessor :api_base_url, :client_id, :client_secret, :max_concurrency
33
35
  end
34
36
 
35
37
  def self.configure
metadata CHANGED
@@ -1,15 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: treezor_connect
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.20.2
4
+ version: 0.22.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - stefakins
8
8
  - jbauzone
9
- autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2026-06-01 00:00:00.000000000 Z
11
+ date: 2026-06-10 00:00:00.000000000 Z
13
12
  dependencies: []
14
13
  description: A gem for making HTTP calls to Treezor Connect.
15
14
  email: stefan.atkinson69@gmail.com
@@ -18,6 +17,7 @@ extensions: []
18
17
  extra_rdoc_files: []
19
18
  files:
20
19
  - lib/treezor_connect.rb
20
+ - lib/treezor_connect/api_operations/bulk_create.rb
21
21
  - lib/treezor_connect/api_operations/create.rb
22
22
  - lib/treezor_connect/api_operations/delete.rb
23
23
  - lib/treezor_connect/api_operations/fetch.rb
@@ -52,7 +52,6 @@ licenses:
52
52
  - MIT
53
53
  metadata:
54
54
  rubygems_mfa_required: 'true'
55
- post_install_message:
56
55
  rdoc_options: []
57
56
  require_paths:
58
57
  - lib
@@ -60,15 +59,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
60
59
  requirements:
61
60
  - - ">="
62
61
  - !ruby/object:Gem::Version
63
- version: 3.1.4.0
62
+ version: 3.1.4
64
63
  required_rubygems_version: !ruby/object:Gem::Requirement
65
64
  requirements:
66
65
  - - ">="
67
66
  - !ruby/object:Gem::Version
68
67
  version: '0'
69
68
  requirements: []
70
- rubygems_version: 3.0.3.1
71
- signing_key:
69
+ rubygems_version: 3.6.5
72
70
  specification_version: 4
73
71
  summary: A gem for making HTTP calls to Treezor Connect.
74
72
  test_files: []