vindi-rails 0.4.0 → 0.5.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: 6f34e79050cac8b00e8adb6757a19bf53c5f8dc6d36e73a9dbd00a9e9d0225eb
4
- data.tar.gz: 22e96970c0466b000dfa0335f9b375dd6cd947983796bb726bb4012c2951b704
3
+ metadata.gz: 9cc70a8b11e2e8ba106e24508d896f8c7d862c576b2a5567b9b761cbf4e576bc
4
+ data.tar.gz: 80020ce37d9eb50fbdfa3af086787c3f21dec7d9117b910a49f8ef35d699b4d1
5
5
  SHA512:
6
- metadata.gz: 6a59dcae84e89f32fc84944528ae9e91ec154f85211c66201e88c8742af6129cf5c2d7b883407479cfdbac2112c7541478f43af4c2c662e059aa9ff7b3cec11d
7
- data.tar.gz: 7327ed4fc6ededab8b4cb9a3da5baae263818d9567f4133c83faa3f6ec3575f723b586377d2b1a7695bbedda0b8584c79fa8562c2bd00d3d72d91c89f4e4d068
6
+ metadata.gz: d0ac13636a87643501770e84730fcc00686897057705fba0c2eed3a5f274832afbacbe9601fc81c882559ed6b4befc1afd907d06d66f88e49ccc123d411a9cf9
7
+ data.tar.gz: d2b83b3553f2850334b1e8820aeceabcce3bef8a49e0132b3afc44da595163eed5f2e3182b5c9483690a4b450be58c99f5ed6a3fefdc1d4bc45efcc8ded24910
data/CHANGELOG.md CHANGED
@@ -2,6 +2,12 @@
2
2
 
3
3
  All notable changes to this project will be documented in this file.
4
4
 
5
+ ---
6
+ ## [0.5.0] - 2026-06-21
7
+
8
+ ### Added
9
+ - **Dynamic Multi-Merchant (Multi-Tenancy)**: Added thread-safe dynamic configuration capabilities via `Vindi.with_config` to allow executing blocks of API actions with different credentials or settings temporarily, without affecting other concurrent threads or the global state.
10
+
5
11
  ---
6
12
  ## [0.4.0] - 2026-06-15
7
13
 
data/CHANGELOG.pt-BR.md CHANGED
@@ -2,6 +2,12 @@
2
2
 
3
3
  Todas as alterações notáveis neste projeto serão documentadas neste arquivo.
4
4
 
5
+ ---
6
+ ## [0.5.0] - 21-06-2026
7
+
8
+ ### Adicionado
9
+ - **Multi-Merchant Dinâmico (Multi-Tenancy)**: Suporte a configurações dinâmicas e isoladas por thread (thread-safe) usando `Vindi.with_config` para executar blocos de ações da API com credenciais ou configurações diferentes temporariamente, sem interferir no estado global ou em outras threads concorrentes.
10
+
5
11
  ---
6
12
  ## [0.4.0] - 15-06-2026
7
13
 
data/README.md CHANGED
@@ -46,6 +46,20 @@ Vindi.configure do |config|
46
46
  end
47
47
  ```
48
48
 
49
+ ### Dynamic Configuration (Multi-Merchant / Multi-Tenancy)
50
+
51
+ If your application needs to handle multiple Vindi accounts or switch API credentials dynamically (e.g., in a multi-tenant SaaS application), you can use `Vindi.with_config` to run a block with temporary credentials. This operation is thread-safe:
52
+
53
+ ```ruby
54
+ # Switch key and API url dynamically within a block
55
+ Vindi.with_config(api_key: 'another_merchant_api_key', api_url: 'https://gp.vindi.com.br/api/v1') do
56
+ # Any API call here will use the overridden configuration
57
+ customers = Vindi::Customer.list
58
+ end
59
+
60
+ # The original global configuration is automatically restored outside the block
61
+ ```
62
+
49
63
  ## Usage
50
64
 
51
65
  Resources are mapped directly under the `Vindi` namespace.
data/README.pt-BR.md CHANGED
@@ -46,6 +46,20 @@ Vindi.configure do |config|
46
46
  end
47
47
  ```
48
48
 
49
+ ### Configuração Dinâmica (Multi-Merchant / Multi-Tenancy)
50
+
51
+ Se a sua aplicação precisa lidar com múltiplas contas da Vindi ou alternar credenciais da API dinamicamente (por exemplo, em uma aplicação SaaS multi-tenant), você pode usar `Vindi.with_config` para executar um bloco com credenciais temporárias. Esta operação é segura contra concorrência (thread-safe):
52
+
53
+ ```ruby
54
+ # Altera a chave e a URL da API dinamicamente dentro de um bloco
55
+ Vindi.with_config(api_key: 'outra_chave_api_do_merchant', api_url: 'https://gp.vindi.com.br/api/v1') do
56
+ # Qualquer chamada de API dentro deste bloco usará as configurações sobrescritas
57
+ clientes = Vindi::Customer.list
58
+ end
59
+
60
+ # A configuração global original é restaurada automaticamente fora do bloco
61
+ ```
62
+
49
63
  ## Utilização
50
64
 
51
65
  Os recursos são mapeados diretamente sob o namespace `Vindi`.
data/WIKI.md CHANGED
@@ -549,4 +549,30 @@ Vindi.configure do |config|
549
549
  end
550
550
  ```
551
551
 
552
+ ---
553
+
554
+ ## 7. Dynamic Configuration (Multi-Merchant / Multi-Tenancy)
555
+
556
+ When building multi-tenant SaaS applications, you may need to perform Vindi API calls on behalf of different merchant accounts, each with its own API key and configuration settings.
557
+
558
+ To switch configuration settings on the fly in a thread-safe manner, use the `Vindi.with_config` method.
559
+
560
+ ### Example Usage
561
+
562
+ ```ruby
563
+ # The global configuration is configured in the initializer
564
+ # Vindi.configuration.api_key # => "global_api_key"
565
+
566
+ # Temporarily switch credentials within a block
567
+ Vindi.with_config(api_key: "merchant_b_api_key", api_url: "https://gp.vindi.com.br/api/v1") do
568
+ # Calls inside this block will use Merchant B's credentials and base URL
569
+ @plans = Vindi::Plan.list
570
+ end
571
+
572
+ # Once the block exits, the default global configuration is restored
573
+ # Vindi.configuration.api_key # => "global_api_key"
574
+ ```
575
+
576
+ The config override accepts either a hash of keys (`:api_key`, `:api_url`, `:cache_store`, etc.) or a complete `Vindi::Configuration` instance.
577
+
552
578
 
data/WIKI.pt-BR.md CHANGED
@@ -549,4 +549,30 @@ Vindi.configure do |config|
549
549
  end
550
550
  ```
551
551
 
552
+ ---
553
+
554
+ ## 7. Configuração Dinâmica (Multi-Merchant / Multi-Tenancy)
555
+
556
+ Ao construir aplicações SaaS multi-tenant, você pode precisar fazer chamadas à API da Vindi em nome de contas de merchants diferentes, cada uma com sua própria chave de API e parâmetros de configuração.
557
+
558
+ Para alterar as configurações em tempo de execução de forma segura contra concorrência (thread-safe), use o método `Vindi.with_config`.
559
+
560
+ ### Exemplo de Uso
561
+
562
+ ```ruby
563
+ # A configuração global é definida no inicializador (ex: config/initializers/vindi.rb)
564
+ # Vindi.configuration.api_key # => "chave_global"
565
+
566
+ # Altera temporariamente as credenciais dentro de um bloco
567
+ Vindi.with_config(api_key: "chave_do_merchant_b", api_url: "https://gp.vindi.com.br/api/v1") do
568
+ # Chamadas de API dentro deste bloco usam a chave e URL do Merchant B
569
+ @plans = Vindi::Plan.list
570
+ end
571
+
572
+ # Após a saída do bloco, a configuração global padrão é restaurada automaticamente
573
+ # Vindi.configuration.api_key # => "chave_global"
574
+ ```
575
+
576
+ O override de configuração aceita tanto um hash de chaves (`:api_key`, `:api_url`, `:cache_store`, etc.) quanto uma instância completa da classe `Vindi::Configuration`.
577
+
552
578
 
data/lib/vindi/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Vindi
4
- VERSION = "0.4.0"
4
+ VERSION = "0.5.0"
5
5
  end
data/lib/vindi.rb CHANGED
@@ -1,59 +1,83 @@
1
- # frozen_string_literal: true
2
-
3
- require "rest-client"
4
- require "json"
5
-
6
- require_relative "vindi/version"
7
- require_relative "vindi/configuration"
8
- require_relative "vindi/errors"
9
- require_relative "vindi/client"
10
- require_relative "vindi/api_operations/create"
11
- require_relative "vindi/api_operations/delete"
12
- require_relative "vindi/api_operations/list"
13
- require_relative "vindi/api_operations/update"
14
- require_relative "vindi/resource"
15
- require_relative "vindi/railtie" if defined?(Rails)
16
-
17
- # Load all resources
18
- require_relative "vindi/resources/customer"
19
- require_relative "vindi/resources/payment_profile"
20
- require_relative "vindi/resources/subscription"
21
- require_relative "vindi/resources/charge"
22
- require_relative "vindi/resources/plan"
23
- require_relative "vindi/resources/product"
24
- require_relative "vindi/resources/payment_method"
25
- require_relative "vindi/resources/discount"
26
- require_relative "vindi/resources/product_item"
27
- require_relative "vindi/resources/period"
28
- require_relative "vindi/resources/bill"
29
- require_relative "vindi/resources/bill_item"
30
- require_relative "vindi/resources/transaction"
31
- require_relative "vindi/resources/usage"
32
- require_relative "vindi/resources/invoice"
33
- require_relative "vindi/resources/movement"
34
- require_relative "vindi/resources/message"
35
- require_relative "vindi/resources/export_batch"
36
- require_relative "vindi/resources/import_batch"
37
- require_relative "vindi/resources/issue"
38
- require_relative "vindi/resources/notification"
39
- require_relative "vindi/resources/merchant"
40
- require_relative "vindi/resources/merchant_user"
41
- require_relative "vindi/resources/role"
42
- require_relative "vindi/resources/user"
43
- require_relative "vindi/resources/public"
44
- require_relative "vindi/resources/affiliate"
45
- require_relative "vindi/resources/partner"
46
-
47
- module Vindi
48
- class << self
49
- attr_writer :configuration
50
-
51
- def configuration
52
- @configuration ||= Configuration.new
53
- end
54
-
55
- def configure
56
- yield(configuration)
57
- end
58
- end
59
- end
1
+ # frozen_string_literal: true
2
+
3
+ require "rest-client"
4
+ require "json"
5
+
6
+ require_relative "vindi/version"
7
+ require_relative "vindi/configuration"
8
+ require_relative "vindi/errors"
9
+ require_relative "vindi/client"
10
+ require_relative "vindi/api_operations/create"
11
+ require_relative "vindi/api_operations/delete"
12
+ require_relative "vindi/api_operations/list"
13
+ require_relative "vindi/api_operations/update"
14
+ require_relative "vindi/resource"
15
+ require_relative "vindi/railtie" if defined?(Rails)
16
+
17
+ # Load all resources
18
+ require_relative "vindi/resources/customer"
19
+ require_relative "vindi/resources/payment_profile"
20
+ require_relative "vindi/resources/subscription"
21
+ require_relative "vindi/resources/charge"
22
+ require_relative "vindi/resources/plan"
23
+ require_relative "vindi/resources/product"
24
+ require_relative "vindi/resources/payment_method"
25
+ require_relative "vindi/resources/discount"
26
+ require_relative "vindi/resources/product_item"
27
+ require_relative "vindi/resources/period"
28
+ require_relative "vindi/resources/bill"
29
+ require_relative "vindi/resources/bill_item"
30
+ require_relative "vindi/resources/transaction"
31
+ require_relative "vindi/resources/usage"
32
+ require_relative "vindi/resources/invoice"
33
+ require_relative "vindi/resources/movement"
34
+ require_relative "vindi/resources/message"
35
+ require_relative "vindi/resources/export_batch"
36
+ require_relative "vindi/resources/import_batch"
37
+ require_relative "vindi/resources/issue"
38
+ require_relative "vindi/resources/notification"
39
+ require_relative "vindi/resources/merchant"
40
+ require_relative "vindi/resources/merchant_user"
41
+ require_relative "vindi/resources/role"
42
+ require_relative "vindi/resources/user"
43
+ require_relative "vindi/resources/public"
44
+ require_relative "vindi/resources/affiliate"
45
+ require_relative "vindi/resources/partner"
46
+
47
+ module Vindi
48
+ class << self
49
+ attr_writer :configuration
50
+
51
+ def configuration
52
+ Thread.current[:vindi_config] || @configuration ||= Configuration.new
53
+ end
54
+
55
+ def configure
56
+ yield(configuration)
57
+ end
58
+
59
+ def with_config(config_override)
60
+ original_config = Thread.current[:vindi_config]
61
+ Thread.current[:vindi_config] = build_override_config(config_override)
62
+ yield
63
+ ensure
64
+ Thread.current[:vindi_config] = original_config
65
+ end
66
+
67
+ private
68
+
69
+ def build_override_config(override)
70
+ return override if override.is_a?(Configuration)
71
+
72
+ current = Thread.current[:vindi_config] || @configuration || Configuration.new
73
+ cloned = current.clone
74
+
75
+ override.each do |key, value|
76
+ setter = "#{key}="
77
+ cloned.public_send(setter, value) if cloned.respond_to?(setter)
78
+ end
79
+
80
+ cloned
81
+ end
82
+ end
83
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: vindi-rails
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.0
4
+ version: 0.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Wesley Lima
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2026-06-15 00:00:00.000000000 Z
11
+ date: 2026-06-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rest-client