treezor_connect 0.21.0 → 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: f42fbc240623d62e13b086515e5e3d0bd709f9b8f3b8700a10fbd213db2cce6a
4
- data.tar.gz: 85e14d31652d27fe8189921dc6220d2974ed4761e54fcaecce8531797cfd412c
3
+ metadata.gz: af881cf032f896376706c821ec29e3a7a9d2c41b1720e474ff609d3edcefe01d
4
+ data.tar.gz: 00f85ff778af5d215a42ce9ebece82db614a0fc3826a29a9b5412560dd7bf038
5
5
  SHA512:
6
- metadata.gz: cc3ee88a1189859357ec0b782bcabef1e47efb37dafeb0c759d48bc509de883facecd0e3dbe8404a432ecd0bed614a80fff72561fb11e9568fb19540b04de762
7
- data.tar.gz: 4448aa73525211e191755873caf1ac1cac04f695a33d925855c654e193f9e4cf433c9c451362c97ff57c098f18306b9118bd8d97c2449f6184141b748b6ddc2b
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)
@@ -8,28 +8,43 @@ module TreezorConnect
8
8
  @access_token = access_token.nil? ? default_access_token : access_token
9
9
  @conn = Faraday.new(
10
10
  url: TreezorConnect.api_base_url,
11
- headers: { 'Authorization' => "Bearer #{@access_token}" }
12
- ) do |f|
13
- f.response :logger, Logger.new($stdout) if ENV['ENABLE_HTTP_LOGGING']
14
- f.adapter Faraday.default_adapter
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
15
16
  end
16
17
  end
17
18
 
18
19
  def execute_request(method, path, headers: {}, params: {})
19
20
  response = conn.public_send(method, path) do |req|
20
21
  req.headers.merge!(headers)
21
- req.params.merge!(params[:query]) if params[:query]
22
- apply_body(req, params)
22
+ configure_request(req, params)
23
23
  end
24
24
 
25
25
  process_response(response)
26
26
  end
27
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
+
28
42
  private
29
43
 
30
44
  attr_reader :conn
31
45
 
32
- def apply_body(req, params)
46
+ def configure_request(req, params)
47
+ req.params.merge!(params[:query]) if params[:query]
33
48
  if params[:form]
34
49
  req.headers['Content-Type'] = 'application/x-www-form-urlencoded'
35
50
  req.body = URI.encode_www_form(params[:form])
@@ -47,6 +62,14 @@ module TreezorConnect
47
62
  )
48
63
  end
49
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
+
50
73
  def fetch_access_token
51
74
  oauth_client.client_credentials.get_token.token
52
75
  end
@@ -57,12 +80,22 @@ module TreezorConnect
57
80
  elsif response.status == 303
58
81
  raise AlreadyCreatedError, response
59
82
  else
60
- raise_api_error(http_status: response.status, http_body: JSON.parse(response.body))
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))
61
94
  end
62
95
  end
63
96
 
64
- def raise_api_error(http_status:, http_body:)
65
- raise ApiError.new(
97
+ def build_api_error(http_status:, http_body:)
98
+ ApiError.new(
66
99
  "API request failed: #{http_body.inspect} (HTTP response code was #{http_status})",
67
100
  http_body,
68
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
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,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: treezor_connect
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.21.0
4
+ version: 0.22.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - stefakins
8
8
  - jbauzone
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2026-06-08 00:00:00.000000000 Z
11
+ date: 2026-06-10 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: A gem for making HTTP calls to Treezor Connect.
14
14
  email: stefan.atkinson69@gmail.com
@@ -17,6 +17,7 @@ extensions: []
17
17
  extra_rdoc_files: []
18
18
  files:
19
19
  - lib/treezor_connect.rb
20
+ - lib/treezor_connect/api_operations/bulk_create.rb
20
21
  - lib/treezor_connect/api_operations/create.rb
21
22
  - lib/treezor_connect/api_operations/delete.rb
22
23
  - lib/treezor_connect/api_operations/fetch.rb