modern_treasury 0.1.0.pre.alpha.20 → 0.1.0.pre.alpha.22
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 +4 -4
- data/CHANGELOG.md +42 -0
- data/README.md +3 -3
- data/lib/modern_treasury/errors.rb +22 -0
- data/lib/modern_treasury/internal/transport/base_client.rb +10 -2
- data/lib/modern_treasury/internal/type/array_of.rb +6 -1
- data/lib/modern_treasury/internal/type/base_model.rb +77 -23
- data/lib/modern_treasury/internal/type/boolean.rb +7 -1
- data/lib/modern_treasury/internal/type/converter.rb +42 -34
- data/lib/modern_treasury/internal/type/enum.rb +16 -5
- data/lib/modern_treasury/internal/type/file_input.rb +6 -1
- data/lib/modern_treasury/internal/type/hash_of.rb +6 -1
- data/lib/modern_treasury/internal/type/union.rb +19 -9
- data/lib/modern_treasury/internal/type/unknown.rb +7 -1
- data/lib/modern_treasury/internal/util.rb +13 -10
- data/lib/modern_treasury/models/bulk_request_create_params.rb +143 -18
- data/lib/modern_treasury/models/bulk_result.rb +5 -3
- data/lib/modern_treasury/models/counterparty_create_params.rb +1 -0
- data/lib/modern_treasury/models/external_account_create_params.rb +1 -0
- data/lib/modern_treasury/models/incoming_payment_detail.rb +1 -0
- data/lib/modern_treasury/models/internal_account.rb +146 -3
- data/lib/modern_treasury/models/internal_account_create_params.rb +138 -1
- data/lib/modern_treasury/models/internal_accounts/balance_report_retrieve_params.rb +23 -0
- data/lib/modern_treasury/models/invoice.rb +10 -1
- data/lib/modern_treasury/models/ledger_account.rb +9 -1
- data/lib/modern_treasury/models/ledger_account_category.rb +9 -1
- data/lib/modern_treasury/models/ledger_account_category_list_params.rb +8 -1
- data/lib/modern_treasury/models/ledger_account_list_params.rb +15 -1
- data/lib/modern_treasury/models/payment_order.rb +21 -9
- data/lib/modern_treasury/models/payment_order_create_async_params.rb +8 -7
- data/lib/modern_treasury/models/payment_order_create_params.rb +8 -7
- data/lib/modern_treasury/models/payment_order_list_params.rb +9 -1
- data/lib/modern_treasury/models/payment_order_update_params.rb +9 -7
- data/lib/modern_treasury/models/payment_reference.rb +4 -1
- data/lib/modern_treasury/models/return_create_params.rb +75 -1
- data/lib/modern_treasury/models/return_object.rb +80 -2
- data/lib/modern_treasury/models/routing_detail.rb +1 -0
- data/lib/modern_treasury/models/routing_detail_create_params.rb +1 -0
- data/lib/modern_treasury/models/transaction.rb +1 -0
- data/lib/modern_treasury/models/transaction_create_params.rb +9 -1
- data/lib/modern_treasury/models/transactions/transaction_line_item.rb +9 -1
- data/lib/modern_treasury/models/validation_validate_routing_number_params.rb +1 -0
- data/lib/modern_treasury/models/virtual_account_create_params.rb +1 -0
- data/lib/modern_treasury/models.rb +4 -22
- data/lib/modern_treasury/resources/bulk_requests.rb +1 -1
- data/lib/modern_treasury/resources/internal_accounts/balance_reports.rb +2 -2
- data/lib/modern_treasury/resources/internal_accounts.rb +3 -1
- data/lib/modern_treasury/resources/ledger_account_categories.rb +3 -1
- data/lib/modern_treasury/resources/ledger_accounts.rb +5 -1
- data/lib/modern_treasury/resources/ledger_event_handlers.rb +0 -111
- data/lib/modern_treasury/resources/ledgerable_events.rb +0 -51
- data/lib/modern_treasury/resources/payment_orders.rb +6 -4
- data/lib/modern_treasury/resources/returns.rb +3 -1
- data/lib/modern_treasury/resources/transactions.rb +3 -1
- data/lib/modern_treasury/version.rb +1 -1
- data/lib/modern_treasury.rb +3 -10
- data/rbi/modern_treasury/errors.rbi +16 -0
- data/rbi/modern_treasury/internal/type/boolean.rbi +2 -0
- data/rbi/modern_treasury/internal/type/converter.rbi +15 -15
- data/rbi/modern_treasury/internal/type/union.rbi +5 -0
- data/rbi/modern_treasury/internal/type/unknown.rbi +2 -0
- data/rbi/modern_treasury/internal/util.rbi +2 -0
- data/rbi/modern_treasury/models/bulk_request_create_params.rbi +234 -18
- data/rbi/modern_treasury/models/bulk_result.rbi +2 -0
- data/rbi/modern_treasury/models/counterparty_create_params.rbi +5 -0
- data/rbi/modern_treasury/models/external_account_create_params.rbi +5 -0
- data/rbi/modern_treasury/models/incoming_payment_detail.rbi +5 -0
- data/rbi/modern_treasury/models/internal_account.rbi +328 -5
- data/rbi/modern_treasury/models/internal_account_create_params.rbi +333 -0
- data/rbi/modern_treasury/models/internal_accounts/balance_report_retrieve_params.rbi +37 -0
- data/rbi/modern_treasury/models/invoice.rbi +10 -0
- data/rbi/modern_treasury/models/ledger_account.rbi +8 -0
- data/rbi/modern_treasury/models/ledger_account_category.rbi +8 -0
- data/rbi/modern_treasury/models/ledger_account_category_list_params.rbi +9 -0
- data/rbi/modern_treasury/models/ledger_account_list_params.rbi +22 -0
- data/rbi/modern_treasury/models/payment_order.rbi +39 -14
- data/rbi/modern_treasury/models/payment_order_create_async_params.rbi +14 -9
- data/rbi/modern_treasury/models/payment_order_create_params.rbi +14 -9
- data/rbi/modern_treasury/models/payment_order_list_params.rbi +14 -0
- data/rbi/modern_treasury/models/payment_order_update_params.rbi +19 -9
- data/rbi/modern_treasury/models/payment_reference.rbi +20 -5
- data/rbi/modern_treasury/models/return_create_params.rbi +114 -0
- data/rbi/modern_treasury/models/return_object.rbi +131 -5
- data/rbi/modern_treasury/models/routing_detail.rbi +5 -0
- data/rbi/modern_treasury/models/routing_detail_create_params.rbi +5 -0
- data/rbi/modern_treasury/models/transaction.rbi +5 -0
- data/rbi/modern_treasury/models/transaction_create_params.rbi +8 -0
- data/rbi/modern_treasury/models/transactions/transaction_line_item.rbi +8 -0
- data/rbi/modern_treasury/models/validation_validate_routing_number_params.rbi +5 -0
- data/rbi/modern_treasury/models/virtual_account_create_params.rbi +5 -0
- data/rbi/modern_treasury/models.rbi +0 -25
- data/rbi/modern_treasury/resources/bulk_requests.rbi +1 -0
- data/rbi/modern_treasury/resources/internal_accounts/balance_reports.rbi +7 -3
- data/rbi/modern_treasury/resources/internal_accounts.rbi +7 -0
- data/rbi/modern_treasury/resources/ledger_account_categories.rbi +2 -0
- data/rbi/modern_treasury/resources/ledger_accounts.rbi +4 -0
- data/rbi/modern_treasury/resources/ledger_event_handlers.rbi +0 -97
- data/rbi/modern_treasury/resources/ledgerable_events.rbi +0 -38
- data/rbi/modern_treasury/resources/payment_orders.rbi +11 -9
- data/rbi/modern_treasury/resources/returns.rbi +6 -0
- data/rbi/modern_treasury/resources/transactions.rbi +3 -0
- data/sig/modern_treasury/errors.rbs +9 -0
- data/sig/modern_treasury/internal/type/converter.rbs +7 -1
- data/sig/modern_treasury/models/bulk_request_create_params.rbs +101 -0
- data/sig/modern_treasury/models/bulk_result.rbs +1 -0
- data/sig/modern_treasury/models/counterparty_create_params.rbs +2 -0
- data/sig/modern_treasury/models/external_account_create_params.rbs +2 -0
- data/sig/modern_treasury/models/incoming_payment_detail.rbs +2 -0
- data/sig/modern_treasury/models/internal_account.rbs +147 -3
- data/sig/modern_treasury/models/internal_account_create_params.rbs +143 -0
- data/sig/modern_treasury/models/internal_accounts/balance_report_retrieve_params.rbs +10 -0
- data/sig/modern_treasury/models/invoice.rbs +5 -0
- data/sig/modern_treasury/models/ledger_account.rbs +5 -0
- data/sig/modern_treasury/models/ledger_account_category.rbs +5 -0
- data/sig/modern_treasury/models/ledger_account_category_list_params.rbs +7 -0
- data/sig/modern_treasury/models/ledger_account_list_params.rbs +16 -0
- data/sig/modern_treasury/models/payment_order.rbs +15 -2
- data/sig/modern_treasury/models/payment_order_create_async_params.rbs +2 -0
- data/sig/modern_treasury/models/payment_order_create_params.rbs +2 -0
- data/sig/modern_treasury/models/payment_order_list_params.rbs +9 -0
- data/sig/modern_treasury/models/payment_order_update_params.rbs +4 -0
- data/sig/modern_treasury/models/payment_reference.rbs +8 -2
- data/sig/modern_treasury/models/return_create_params.rbs +47 -0
- data/sig/modern_treasury/models/return_object.rbs +55 -2
- data/sig/modern_treasury/models/routing_detail.rbs +2 -0
- data/sig/modern_treasury/models/routing_detail_create_params.rbs +2 -0
- data/sig/modern_treasury/models/transaction.rbs +2 -0
- data/sig/modern_treasury/models/transaction_create_params.rbs +5 -0
- data/sig/modern_treasury/models/transactions/transaction_line_item.rbs +5 -0
- data/sig/modern_treasury/models/validation_validate_routing_number_params.rbs +2 -0
- data/sig/modern_treasury/models/virtual_account_create_params.rbs +2 -0
- data/sig/modern_treasury/models.rbs +0 -18
- data/sig/modern_treasury/resources/internal_accounts/balance_reports.rbs +1 -1
- data/sig/modern_treasury/resources/internal_accounts.rbs +1 -0
- data/sig/modern_treasury/resources/ledger_account_categories.rbs +1 -0
- data/sig/modern_treasury/resources/ledger_accounts.rbs +2 -0
- data/sig/modern_treasury/resources/ledger_event_handlers.rbs +0 -30
- data/sig/modern_treasury/resources/ledgerable_events.rbs +0 -13
- data/sig/modern_treasury/resources/payment_orders.rbs +1 -0
- data/sig/modern_treasury/resources/returns.rbs +1 -0
- data/sig/modern_treasury/resources/transactions.rbs +1 -0
- metadata +2 -29
- data/lib/modern_treasury/models/ledger_event_handler.rb +0 -222
- data/lib/modern_treasury/models/ledger_event_handler_create_params.rb +0 -177
- data/lib/modern_treasury/models/ledger_event_handler_delete_params.rb +0 -14
- data/lib/modern_treasury/models/ledger_event_handler_list_params.rb +0 -58
- data/lib/modern_treasury/models/ledger_event_handler_retrieve_params.rb +0 -14
- data/lib/modern_treasury/models/ledger_event_handler_variable.rb +0 -59
- data/lib/modern_treasury/models/ledgerable_event.rb +0 -92
- data/lib/modern_treasury/models/ledgerable_event_create_params.rb +0 -50
- data/lib/modern_treasury/models/ledgerable_event_retrieve_params.rb +0 -14
- data/rbi/modern_treasury/models/ledger_event_handler.rbi +0 -322
- data/rbi/modern_treasury/models/ledger_event_handler_create_params.rbi +0 -303
- data/rbi/modern_treasury/models/ledger_event_handler_delete_params.rbi +0 -32
- data/rbi/modern_treasury/models/ledger_event_handler_list_params.rbi +0 -92
- data/rbi/modern_treasury/models/ledger_event_handler_retrieve_params.rbi +0 -32
- data/rbi/modern_treasury/models/ledger_event_handler_variable.rbi +0 -98
- data/rbi/modern_treasury/models/ledgerable_event.rbi +0 -108
- data/rbi/modern_treasury/models/ledgerable_event_create_params.rbi +0 -75
- data/rbi/modern_treasury/models/ledgerable_event_retrieve_params.rbi +0 -32
- data/sig/modern_treasury/models/ledger_event_handler.rbs +0 -149
- data/sig/modern_treasury/models/ledger_event_handler_create_params.rbs +0 -127
- data/sig/modern_treasury/models/ledger_event_handler_delete_params.rbs +0 -15
- data/sig/modern_treasury/models/ledger_event_handler_list_params.rbs +0 -54
- data/sig/modern_treasury/models/ledger_event_handler_retrieve_params.rbs +0 -15
- data/sig/modern_treasury/models/ledger_event_handler_variable.rbs +0 -36
- data/sig/modern_treasury/models/ledgerable_event.rbs +0 -65
- data/sig/modern_treasury/models/ledgerable_event_create_params.rbs +0 -43
- data/sig/modern_treasury/models/ledgerable_event_retrieve_params.rbs +0 -15
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0e2766150019c1a41f648f065a5abf75cd06fa84c92f22f1227a3857d1bd374b
|
4
|
+
data.tar.gz: df97b8ec088fc597f5e6938b6a7d3d1ab83e44249c01e5d18c90aaef6b918539
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7f478df30dc06596b1db42686d2e58117ae547ee3c4aa305f339f9735f057eb5faa5a9b9deea3085c18bf80e2f0f4a66434a0a45ff16186ba72f77e686c28080
|
7
|
+
data.tar.gz: 8cead0ca921ab83d3ca050e527a1e762587f0401c8d16210cd5c739864bf620871dec49fd7d003c99a273176a35802b2fd398aee8652d20c6af23262bfc02b34
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,47 @@
|
|
1
1
|
# Changelog
|
2
2
|
|
3
|
+
## 0.1.0-alpha.22 (2025-07-07)
|
4
|
+
|
5
|
+
Full Changelog: [v0.1.0-alpha.21...v0.1.0-alpha.22](https://github.com/Modern-Treasury/modern-treasury-ruby/compare/v0.1.0-alpha.21...v0.1.0-alpha.22)
|
6
|
+
|
7
|
+
### Features
|
8
|
+
|
9
|
+
* **api:** api update ([f9b7650](https://github.com/Modern-Treasury/modern-treasury-ruby/commit/f9b765072627604455f57237b76a32e07a03e30a))
|
10
|
+
* **api:** api update ([9a357cc](https://github.com/Modern-Treasury/modern-treasury-ruby/commit/9a357cc723fd191f542d6975b4f84cb5acc555e1))
|
11
|
+
* **api:** api update ([0ea5708](https://github.com/Modern-Treasury/modern-treasury-ruby/commit/0ea5708a1c1057643b10481fe3f28599c238b387))
|
12
|
+
* **api:** api update ([a9e4c9b](https://github.com/Modern-Treasury/modern-treasury-ruby/commit/a9e4c9b8984b08a8887e3897f44e45b32222af0e))
|
13
|
+
* **api:** api update ([7e4655b](https://github.com/Modern-Treasury/modern-treasury-ruby/commit/7e4655b211def4398f04e5f190c264eb82b92487))
|
14
|
+
* **api:** api update ([b387235](https://github.com/Modern-Treasury/modern-treasury-ruby/commit/b387235b089476f0ed63ac717eb2308f1fbbb6f8))
|
15
|
+
|
16
|
+
|
17
|
+
### Bug Fixes
|
18
|
+
|
19
|
+
* **ci:** release-doctor — report correct token name ([e04ac73](https://github.com/Modern-Treasury/modern-treasury-ruby/commit/e04ac73389f3bcec56f7403dea71e818a03022cf))
|
20
|
+
* issue where we cannot mutate arrays on base model derivatives ([e387253](https://github.com/Modern-Treasury/modern-treasury-ruby/commit/e387253acf1d48294e42fee99ce023668308aedf))
|
21
|
+
|
22
|
+
|
23
|
+
### Chores
|
24
|
+
|
25
|
+
* **ci:** enable for pull requests ([00b3946](https://github.com/Modern-Treasury/modern-treasury-ruby/commit/00b394631003a1c1e8f961e838b25bb1b5391805))
|
26
|
+
* **ci:** link to correct github repo ([c7048da](https://github.com/Modern-Treasury/modern-treasury-ruby/commit/c7048dad5371a6b9e7c5467bd0aefa0df97df3b4))
|
27
|
+
* **ci:** only run for pushes and fork pull requests ([1d387c6](https://github.com/Modern-Treasury/modern-treasury-ruby/commit/1d387c65cbf539ef9b5a188a2201c1af732b60e7))
|
28
|
+
* **internal:** allow streams to also be unwrapped on a per-row basis ([658a566](https://github.com/Modern-Treasury/modern-treasury-ruby/commit/658a566873f97d28b0734af37806a4e0a16e3740))
|
29
|
+
|
30
|
+
## 0.1.0-alpha.21 (2025-06-04)
|
31
|
+
|
32
|
+
Full Changelog: [v0.1.0-alpha.20...v0.1.0-alpha.21](https://github.com/Modern-Treasury/modern-treasury-ruby/compare/v0.1.0-alpha.20...v0.1.0-alpha.21)
|
33
|
+
|
34
|
+
### Bug Fixes
|
35
|
+
|
36
|
+
* `to_sorbet_type` should not return branded types ([64e22b2](https://github.com/Modern-Treasury/modern-treasury-ruby/commit/64e22b2126f3da851a7b9dbe66b35ddf75f8720e))
|
37
|
+
* default content-type for text in multi-part formdata uploads should be text/plain ([1ccbced](https://github.com/Modern-Treasury/modern-treasury-ruby/commit/1ccbcedbc67024e305f42562b0e450dfa3c96580))
|
38
|
+
* sorbet types for enums, and make tapioca detection ignore `tapioca dsl` ([8db30b1](https://github.com/Modern-Treasury/modern-treasury-ruby/commit/8db30b16ce159a33ad0580b613f7c4d4f7064394))
|
39
|
+
|
40
|
+
|
41
|
+
### Chores
|
42
|
+
|
43
|
+
* **docs:** reorder client arguments ([f7efa80](https://github.com/Modern-Treasury/modern-treasury-ruby/commit/f7efa807c5978616f167451d4968285bcb502555))
|
44
|
+
|
3
45
|
## 0.1.0-alpha.20 (2025-05-23)
|
4
46
|
|
5
47
|
Full Changelog: [v0.1.0-alpha.19...v0.1.0-alpha.20](https://github.com/Modern-Treasury/modern-treasury-ruby/compare/v0.1.0-alpha.19...v0.1.0-alpha.20)
|
data/README.md
CHANGED
@@ -15,7 +15,7 @@ To use this gem, install via Bundler by adding the following to your application
|
|
15
15
|
<!-- x-release-please-start-version -->
|
16
16
|
|
17
17
|
```ruby
|
18
|
-
gem "modern_treasury", "~> 0.1.0.pre.alpha.
|
18
|
+
gem "modern_treasury", "~> 0.1.0.pre.alpha.22"
|
19
19
|
```
|
20
20
|
|
21
21
|
<!-- x-release-please-end -->
|
@@ -27,8 +27,8 @@ require "bundler/setup"
|
|
27
27
|
require "modern_treasury"
|
28
28
|
|
29
29
|
modern_treasury = ModernTreasury::Client.new(
|
30
|
-
|
31
|
-
|
30
|
+
api_key: ENV["MODERN_TREASURY_API_KEY"], # This is the default and can be omitted
|
31
|
+
organization_id: ENV["MODERN_TREASURY_ORGANIZATION_ID"] # This is the default and can be omitted
|
32
32
|
)
|
33
33
|
|
34
34
|
counterparty = modern_treasury.counterparties.create(name: "my first counterparty")
|
@@ -9,6 +9,28 @@ module ModernTreasury
|
|
9
9
|
end
|
10
10
|
|
11
11
|
class ConversionError < ModernTreasury::Errors::Error
|
12
|
+
# @return [StandardError, nil]
|
13
|
+
def cause = @cause.nil? ? super : @cause
|
14
|
+
|
15
|
+
# @api private
|
16
|
+
#
|
17
|
+
# @param on [Class<StandardError>]
|
18
|
+
# @param method [Symbol]
|
19
|
+
# @param target [Object]
|
20
|
+
# @param value [Object]
|
21
|
+
# @param cause [StandardError, nil]
|
22
|
+
def initialize(on:, method:, target:, value:, cause: nil)
|
23
|
+
cls = on.name.split("::").last
|
24
|
+
|
25
|
+
message = [
|
26
|
+
"Failed to parse #{cls}.#{method} from #{value.class} to #{target.inspect}.",
|
27
|
+
"To get the unparsed API response, use #{cls}[#{method.inspect}].",
|
28
|
+
cause && "Cause: #{cause.message}"
|
29
|
+
].filter(&:itself).join(" ")
|
30
|
+
|
31
|
+
@cause = cause
|
32
|
+
super(message)
|
33
|
+
end
|
12
34
|
end
|
13
35
|
|
14
36
|
class APIError < ModernTreasury::Errors::Error
|
@@ -478,6 +478,7 @@ module ModernTreasury
|
|
478
478
|
self.class.validate!(req)
|
479
479
|
model = req.fetch(:model) { ModernTreasury::Internal::Type::Unknown }
|
480
480
|
opts = req[:options].to_h
|
481
|
+
unwrap = req[:unwrap]
|
481
482
|
ModernTreasury::RequestOptions.validate!(opts)
|
482
483
|
request = build_request(req.except(:options), opts)
|
483
484
|
url = request.fetch(:url)
|
@@ -494,11 +495,18 @@ module ModernTreasury
|
|
494
495
|
decoded = ModernTreasury::Internal::Util.decode_content(response, stream: stream)
|
495
496
|
case req
|
496
497
|
in {stream: Class => st}
|
497
|
-
st.new(
|
498
|
+
st.new(
|
499
|
+
model: model,
|
500
|
+
url: url,
|
501
|
+
status: status,
|
502
|
+
response: response,
|
503
|
+
unwrap: unwrap,
|
504
|
+
stream: decoded
|
505
|
+
)
|
498
506
|
in {page: Class => page}
|
499
507
|
page.new(client: self, req: req, headers: response, page_data: decoded)
|
500
508
|
else
|
501
|
-
unwrapped = ModernTreasury::Internal::Util.dig(decoded,
|
509
|
+
unwrapped = ModernTreasury::Internal::Util.dig(decoded, unwrap)
|
502
510
|
ModernTreasury::Internal::Type::Converter.coerce(model, unwrapped)
|
503
511
|
end
|
504
512
|
end
|
@@ -62,10 +62,14 @@ module ModernTreasury
|
|
62
62
|
#
|
63
63
|
# @param state [Hash{Symbol=>Object}] .
|
64
64
|
#
|
65
|
-
# @option state [Boolean
|
65
|
+
# @option state [Boolean] :translate_names
|
66
|
+
#
|
67
|
+
# @option state [Boolean] :strictness
|
66
68
|
#
|
67
69
|
# @option state [Hash{Symbol=>Object}] :exactness
|
68
70
|
#
|
71
|
+
# @option state [Class<StandardError>] :error
|
72
|
+
#
|
69
73
|
# @option state [Integer] :branched
|
70
74
|
#
|
71
75
|
# @return [Array<Object>, Object]
|
@@ -74,6 +78,7 @@ module ModernTreasury
|
|
74
78
|
|
75
79
|
unless value.is_a?(Array)
|
76
80
|
exactness[:no] += 1
|
81
|
+
state[:error] = TypeError.new("#{value.class} can't be coerced into #{Array}")
|
77
82
|
return value
|
78
83
|
end
|
79
84
|
|
@@ -60,7 +60,7 @@ module ModernTreasury
|
|
60
60
|
[ModernTreasury::Internal::Type::Converter.type_info(type_info), type_info]
|
61
61
|
end
|
62
62
|
|
63
|
-
setter = "#{name_sym}="
|
63
|
+
setter = :"#{name_sym}="
|
64
64
|
api_name = info.fetch(:api_name, name_sym)
|
65
65
|
nilable = info.fetch(:nil?, false)
|
66
66
|
const = if required && !nilable
|
@@ -84,28 +84,61 @@ module ModernTreasury
|
|
84
84
|
type_fn: type_fn
|
85
85
|
}
|
86
86
|
|
87
|
-
define_method(setter)
|
87
|
+
define_method(setter) do |value|
|
88
|
+
target = type_fn.call
|
89
|
+
state = ModernTreasury::Internal::Type::Converter.new_coerce_state(translate_names: false)
|
90
|
+
coerced = ModernTreasury::Internal::Type::Converter.coerce(target, value, state: state)
|
91
|
+
status = @coerced.store(name_sym, state.fetch(:error) || true)
|
92
|
+
stored =
|
93
|
+
case [target, status]
|
94
|
+
in [ModernTreasury::Internal::Type::Converter | Symbol, true]
|
95
|
+
coerced
|
96
|
+
else
|
97
|
+
value
|
98
|
+
end
|
99
|
+
@data.store(name_sym, stored)
|
100
|
+
end
|
88
101
|
|
102
|
+
# rubocop:disable Style/CaseEquality
|
103
|
+
# rubocop:disable Metrics/BlockLength
|
89
104
|
define_method(name_sym) do
|
90
105
|
target = type_fn.call
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
ModernTreasury::
|
97
|
-
|
106
|
+
|
107
|
+
case @coerced[name_sym]
|
108
|
+
in true | false if ModernTreasury::Internal::Type::Converter === target
|
109
|
+
@data.fetch(name_sym)
|
110
|
+
in ::StandardError => e
|
111
|
+
raise ModernTreasury::Errors::ConversionError.new(
|
112
|
+
on: self.class,
|
113
|
+
method: __method__,
|
114
|
+
target: target,
|
115
|
+
value: @data.fetch(name_sym),
|
116
|
+
cause: e
|
98
117
|
)
|
118
|
+
else
|
119
|
+
Kernel.then do
|
120
|
+
value = @data.fetch(name_sym) { const == ModernTreasury::Internal::OMIT ? nil : const }
|
121
|
+
state = ModernTreasury::Internal::Type::Converter.new_coerce_state(translate_names: false)
|
122
|
+
if (nilable || !required) && value.nil?
|
123
|
+
nil
|
124
|
+
else
|
125
|
+
ModernTreasury::Internal::Type::Converter.coerce(
|
126
|
+
target, value, state: state
|
127
|
+
)
|
128
|
+
end
|
129
|
+
rescue StandardError => e
|
130
|
+
raise ModernTreasury::Errors::ConversionError.new(
|
131
|
+
on: self.class,
|
132
|
+
method: __method__,
|
133
|
+
target: target,
|
134
|
+
value: value,
|
135
|
+
cause: e
|
136
|
+
)
|
137
|
+
end
|
99
138
|
end
|
100
|
-
rescue StandardError => e
|
101
|
-
cls = self.class.name.split("::").last
|
102
|
-
message = [
|
103
|
-
"Failed to parse #{cls}.#{__method__} from #{value.class} to #{target.inspect}.",
|
104
|
-
"To get the unparsed API response, use #{cls}[#{__method__.inspect}].",
|
105
|
-
"Cause: #{e.message}"
|
106
|
-
].join(" ")
|
107
|
-
raise ModernTreasury::Errors::ConversionError.new(message)
|
108
139
|
end
|
140
|
+
# rubocop:enable Metrics/BlockLength
|
141
|
+
# rubocop:enable Style/CaseEquality
|
109
142
|
end
|
110
143
|
|
111
144
|
# @api private
|
@@ -205,23 +238,28 @@ module ModernTreasury
|
|
205
238
|
#
|
206
239
|
# @param state [Hash{Symbol=>Object}] .
|
207
240
|
#
|
208
|
-
# @option state [Boolean
|
241
|
+
# @option state [Boolean] :translate_names
|
242
|
+
#
|
243
|
+
# @option state [Boolean] :strictness
|
209
244
|
#
|
210
245
|
# @option state [Hash{Symbol=>Object}] :exactness
|
211
246
|
#
|
247
|
+
# @option state [Class<StandardError>] :error
|
248
|
+
#
|
212
249
|
# @option state [Integer] :branched
|
213
250
|
#
|
214
251
|
# @return [self, Object]
|
215
252
|
def coerce(value, state:)
|
216
253
|
exactness = state.fetch(:exactness)
|
217
254
|
|
218
|
-
if value.is_a?(self
|
255
|
+
if value.is_a?(self)
|
219
256
|
exactness[:yes] += 1
|
220
257
|
return value
|
221
258
|
end
|
222
259
|
|
223
260
|
unless (val = ModernTreasury::Internal::Util.coerce_hash(value)).is_a?(Hash)
|
224
261
|
exactness[:no] += 1
|
262
|
+
state[:error] = TypeError.new("#{value.class} can't be coerced into #{Hash}")
|
225
263
|
return value
|
226
264
|
end
|
227
265
|
exactness[:yes] += 1
|
@@ -229,13 +267,15 @@ module ModernTreasury
|
|
229
267
|
keys = val.keys.to_set
|
230
268
|
instance = new
|
231
269
|
data = instance.to_h
|
270
|
+
status = instance.instance_variable_get(:@coerced)
|
232
271
|
|
233
272
|
# rubocop:disable Metrics/BlockLength
|
234
273
|
fields.each do |name, field|
|
235
274
|
mode, required, target = field.fetch_values(:mode, :required, :type)
|
236
275
|
api_name, nilable, const = field.fetch_values(:api_name, :nilable, :const)
|
276
|
+
src_name = state.fetch(:translate_names) ? api_name : name
|
237
277
|
|
238
|
-
unless val.key?(
|
278
|
+
unless val.key?(src_name)
|
239
279
|
if required && mode != :dump && const == ModernTreasury::Internal::OMIT
|
240
280
|
exactness[nilable ? :maybe : :no] += 1
|
241
281
|
else
|
@@ -244,9 +284,10 @@ module ModernTreasury
|
|
244
284
|
next
|
245
285
|
end
|
246
286
|
|
247
|
-
item = val.fetch(
|
248
|
-
keys.delete(
|
287
|
+
item = val.fetch(src_name)
|
288
|
+
keys.delete(src_name)
|
249
289
|
|
290
|
+
state[:error] = nil
|
250
291
|
converted =
|
251
292
|
if item.nil? && (nilable || !required)
|
252
293
|
exactness[nilable ? :yes : :maybe] += 1
|
@@ -260,6 +301,8 @@ module ModernTreasury
|
|
260
301
|
item
|
261
302
|
end
|
262
303
|
end
|
304
|
+
|
305
|
+
status.store(name, state.fetch(:error) || true)
|
263
306
|
data.store(name, converted)
|
264
307
|
end
|
265
308
|
# rubocop:enable Metrics/BlockLength
|
@@ -437,7 +480,18 @@ module ModernTreasury
|
|
437
480
|
# Create a new instance of a model.
|
438
481
|
#
|
439
482
|
# @param data [Hash{Symbol=>Object}, self]
|
440
|
-
def initialize(data = {})
|
483
|
+
def initialize(data = {})
|
484
|
+
@data = {}
|
485
|
+
@coerced = {}
|
486
|
+
ModernTreasury::Internal::Util.coerce_hash!(data).each do
|
487
|
+
if self.class.known_fields.key?(_1)
|
488
|
+
public_send(:"#{_1}=", _2)
|
489
|
+
else
|
490
|
+
@data.store(_1, _2)
|
491
|
+
@coerced.store(_1, false)
|
492
|
+
end
|
493
|
+
end
|
494
|
+
end
|
441
495
|
|
442
496
|
class << self
|
443
497
|
# @api private
|
@@ -31,14 +31,20 @@ module ModernTreasury
|
|
31
31
|
class << self
|
32
32
|
# @api private
|
33
33
|
#
|
34
|
+
# Coerce value to Boolean if possible, otherwise return the original value.
|
35
|
+
#
|
34
36
|
# @param value [Boolean, Object]
|
35
37
|
#
|
36
38
|
# @param state [Hash{Symbol=>Object}] .
|
37
39
|
#
|
38
|
-
# @option state [Boolean
|
40
|
+
# @option state [Boolean] :translate_names
|
41
|
+
#
|
42
|
+
# @option state [Boolean] :strictness
|
39
43
|
#
|
40
44
|
# @option state [Hash{Symbol=>Object}] :exactness
|
41
45
|
#
|
46
|
+
# @option state [Class<StandardError>] :error
|
47
|
+
#
|
42
48
|
# @option state [Integer] :branched
|
43
49
|
#
|
44
50
|
# @return [Boolean, Object]
|
@@ -15,10 +15,14 @@ module ModernTreasury
|
|
15
15
|
#
|
16
16
|
# @param state [Hash{Symbol=>Object}] .
|
17
17
|
#
|
18
|
-
# @option state [Boolean
|
18
|
+
# @option state [Boolean] :translate_names
|
19
|
+
#
|
20
|
+
# @option state [Boolean] :strictness
|
19
21
|
#
|
20
22
|
# @option state [Hash{Symbol=>Object}] :exactness
|
21
23
|
#
|
24
|
+
# @option state [Class<StandardError>] :error
|
25
|
+
#
|
22
26
|
# @option state [Integer] :branched
|
23
27
|
#
|
24
28
|
# @return [Object]
|
@@ -94,6 +98,21 @@ module ModernTreasury
|
|
94
98
|
end
|
95
99
|
end
|
96
100
|
|
101
|
+
# @api private
|
102
|
+
#
|
103
|
+
# @param translate_names [Boolean]
|
104
|
+
#
|
105
|
+
# @return [Hash{Symbol=>Object}]
|
106
|
+
def new_coerce_state(translate_names: true)
|
107
|
+
{
|
108
|
+
translate_names: translate_names,
|
109
|
+
strictness: true,
|
110
|
+
exactness: {yes: 0, no: 0, maybe: 0},
|
111
|
+
error: nil,
|
112
|
+
branched: 0
|
113
|
+
}
|
114
|
+
end
|
115
|
+
|
97
116
|
# @api private
|
98
117
|
#
|
99
118
|
# Based on `target`, transform `value` into `target`, to the extent possible:
|
@@ -110,14 +129,11 @@ module ModernTreasury
|
|
110
129
|
#
|
111
130
|
# @param value [Object]
|
112
131
|
#
|
113
|
-
# @param state [Hash{Symbol=>Object}] The `strictness` is one of `true`, `false
|
114
|
-
#
|
115
|
-
# targets:
|
132
|
+
# @param state [Hash{Symbol=>Object}] The `strictness` is one of `true`, `false`. This informs the coercion strategy
|
133
|
+
# when we have to decide between multiple possible conversion targets:
|
116
134
|
#
|
117
135
|
# - `true`: the conversion must be exact, with minimum coercion.
|
118
136
|
# - `false`: the conversion can be approximate, with some coercion.
|
119
|
-
# - `:strong`: the conversion must be exact, with no coercion, and raise an error
|
120
|
-
# if not possible.
|
121
137
|
#
|
122
138
|
# The `exactness` is `Hash` with keys being one of `yes`, `no`, or `maybe`. For
|
123
139
|
# any given conversion attempt, the exactness will be updated based on how closely
|
@@ -130,21 +146,20 @@ module ModernTreasury
|
|
130
146
|
#
|
131
147
|
# See implementation below for more details.
|
132
148
|
#
|
133
|
-
# @option state [Boolean
|
149
|
+
# @option state [Boolean] :translate_names
|
150
|
+
#
|
151
|
+
# @option state [Boolean] :strictness
|
134
152
|
#
|
135
153
|
# @option state [Hash{Symbol=>Object}] :exactness
|
136
154
|
#
|
155
|
+
# @option state [Class<StandardError>] :error
|
156
|
+
#
|
137
157
|
# @option state [Integer] :branched
|
138
158
|
#
|
139
159
|
# @return [Object]
|
140
|
-
def coerce(
|
141
|
-
target,
|
142
|
-
value,
|
143
|
-
state: {strictness: true, exactness: {yes: 0, no: 0, maybe: 0}, branched: 0}
|
144
|
-
)
|
145
|
-
# rubocop:disable Lint/SuppressedException
|
160
|
+
def coerce(target, value, state: ModernTreasury::Internal::Type::Converter.new_coerce_state)
|
146
161
|
# rubocop:disable Metrics/BlockNesting
|
147
|
-
|
162
|
+
exactness = state.fetch(:exactness)
|
148
163
|
|
149
164
|
case target
|
150
165
|
in ModernTreasury::Internal::Type::Converter
|
@@ -160,29 +175,26 @@ module ModernTreasury
|
|
160
175
|
exactness[value.nil? ? :yes : :maybe] += 1
|
161
176
|
return nil
|
162
177
|
in -> { _1 <= Integer }
|
163
|
-
|
178
|
+
case value
|
179
|
+
in Integer
|
164
180
|
exactness[:yes] += 1
|
165
181
|
return value
|
166
|
-
elsif strictness == :strong && Integer(value, exception: false) != value
|
167
|
-
message = "no implicit conversion of #{value.class} into #{target.inspect}"
|
168
|
-
raise value.is_a?(Numeric) ? ArgumentError.new(message) : TypeError.new(message)
|
169
182
|
else
|
170
183
|
Kernel.then do
|
171
184
|
return Integer(value).tap { exactness[:maybe] += 1 }
|
172
|
-
rescue ArgumentError, TypeError
|
185
|
+
rescue ArgumentError, TypeError => e
|
186
|
+
state[:error] = e
|
173
187
|
end
|
174
188
|
end
|
175
189
|
in -> { _1 <= Float }
|
176
190
|
if value.is_a?(Numeric)
|
177
191
|
exactness[:yes] += 1
|
178
192
|
return Float(value)
|
179
|
-
elsif strictness == :strong
|
180
|
-
message = "no implicit conversion of #{value.class} into #{target.inspect}"
|
181
|
-
raise TypeError.new(message)
|
182
193
|
else
|
183
194
|
Kernel.then do
|
184
195
|
return Float(value).tap { exactness[:maybe] += 1 }
|
185
|
-
rescue ArgumentError, TypeError
|
196
|
+
rescue ArgumentError, TypeError => e
|
197
|
+
state[:error] = e
|
186
198
|
end
|
187
199
|
end
|
188
200
|
in -> { _1 <= String }
|
@@ -194,16 +206,13 @@ module ModernTreasury
|
|
194
206
|
exactness[:yes] += 1
|
195
207
|
return value.string
|
196
208
|
else
|
197
|
-
|
198
|
-
message = "no implicit conversion of #{value.class} into #{target.inspect}"
|
199
|
-
raise TypeError.new(message)
|
200
|
-
end
|
209
|
+
state[:error] = TypeError.new("#{value.class} can't be coerced into #{String}")
|
201
210
|
end
|
202
211
|
in -> { _1 <= Date || _1 <= Time }
|
203
212
|
Kernel.then do
|
204
213
|
return target.parse(value).tap { exactness[:yes] += 1 }
|
205
214
|
rescue ArgumentError, TypeError => e
|
206
|
-
|
215
|
+
state[:error] = e
|
207
216
|
end
|
208
217
|
in -> { _1 <= StringIO } if value.is_a?(String)
|
209
218
|
exactness[:yes] += 1
|
@@ -221,10 +230,8 @@ module ModernTreasury
|
|
221
230
|
return value
|
222
231
|
end
|
223
232
|
else
|
224
|
-
|
225
|
-
|
226
|
-
raise ArgumentError.new(message)
|
227
|
-
end
|
233
|
+
message = "cannot convert non-matching #{value.class} into #{target.inspect}"
|
234
|
+
state[:error] = ArgumentError.new(message)
|
228
235
|
end
|
229
236
|
else
|
230
237
|
end
|
@@ -232,7 +239,6 @@ module ModernTreasury
|
|
232
239
|
exactness[:no] += 1
|
233
240
|
value
|
234
241
|
# rubocop:enable Metrics/BlockNesting
|
235
|
-
# rubocop:enable Lint/SuppressedException
|
236
242
|
end
|
237
243
|
|
238
244
|
# @api private
|
@@ -277,8 +283,10 @@ module ModernTreasury
|
|
277
283
|
define_sorbet_constant!(:CoerceState) do
|
278
284
|
T.type_alias do
|
279
285
|
{
|
280
|
-
|
286
|
+
translate_names: T::Boolean,
|
287
|
+
strictness: T::Boolean,
|
281
288
|
exactness: {yes: Integer, no: Integer, maybe: Integer},
|
289
|
+
error: T::Class[StandardError],
|
282
290
|
branched: Integer
|
283
291
|
}
|
284
292
|
end
|
@@ -77,10 +77,14 @@ module ModernTreasury
|
|
77
77
|
#
|
78
78
|
# @param state [Hash{Symbol=>Object}] .
|
79
79
|
#
|
80
|
-
# @option state [Boolean
|
80
|
+
# @option state [Boolean] :translate_names
|
81
|
+
#
|
82
|
+
# @option state [Boolean] :strictness
|
81
83
|
#
|
82
84
|
# @option state [Hash{Symbol=>Object}] :exactness
|
83
85
|
#
|
86
|
+
# @option state [Class<StandardError>] :error
|
87
|
+
#
|
84
88
|
# @option state [Integer] :branched
|
85
89
|
#
|
86
90
|
# @return [Symbol, Object]
|
@@ -91,8 +95,12 @@ module ModernTreasury
|
|
91
95
|
if values.include?(val)
|
92
96
|
exactness[:yes] += 1
|
93
97
|
val
|
98
|
+
elsif values.first&.class == val.class
|
99
|
+
exactness[:maybe] += 1
|
100
|
+
value
|
94
101
|
else
|
95
|
-
exactness[
|
102
|
+
exactness[:no] += 1
|
103
|
+
state[:error] = TypeError.new("#{value.class} can't be coerced into #{self}")
|
96
104
|
value
|
97
105
|
end
|
98
106
|
end
|
@@ -112,11 +120,14 @@ module ModernTreasury
|
|
112
120
|
#
|
113
121
|
# @return [Object]
|
114
122
|
def to_sorbet_type
|
115
|
-
|
123
|
+
types = values.map { ModernTreasury::Internal::Util::SorbetRuntimeSupport.to_sorbet_type(_1) }.uniq
|
124
|
+
case types
|
116
125
|
in []
|
117
126
|
T.noreturn
|
118
|
-
in [
|
119
|
-
|
127
|
+
in [type]
|
128
|
+
type
|
129
|
+
else
|
130
|
+
T.any(*types)
|
120
131
|
end
|
121
132
|
end
|
122
133
|
|
@@ -45,10 +45,14 @@ module ModernTreasury
|
|
45
45
|
#
|
46
46
|
# @param state [Hash{Symbol=>Object}] .
|
47
47
|
#
|
48
|
-
# @option state [Boolean
|
48
|
+
# @option state [Boolean] :translate_names
|
49
|
+
#
|
50
|
+
# @option state [Boolean] :strictness
|
49
51
|
#
|
50
52
|
# @option state [Hash{Symbol=>Object}] :exactness
|
51
53
|
#
|
54
|
+
# @option state [Class<StandardError>] :error
|
55
|
+
#
|
52
56
|
# @option state [Integer] :branched
|
53
57
|
#
|
54
58
|
# @return [StringIO, Object]
|
@@ -62,6 +66,7 @@ module ModernTreasury
|
|
62
66
|
exactness[:yes] += 1
|
63
67
|
value
|
64
68
|
else
|
69
|
+
state[:error] = TypeError.new("#{value.class} can't be coerced into #{StringIO}")
|
65
70
|
exactness[:no] += 1
|
66
71
|
value
|
67
72
|
end
|
@@ -77,10 +77,14 @@ module ModernTreasury
|
|
77
77
|
#
|
78
78
|
# @param state [Hash{Symbol=>Object}] .
|
79
79
|
#
|
80
|
-
# @option state [Boolean
|
80
|
+
# @option state [Boolean] :translate_names
|
81
|
+
#
|
82
|
+
# @option state [Boolean] :strictness
|
81
83
|
#
|
82
84
|
# @option state [Hash{Symbol=>Object}] :exactness
|
83
85
|
#
|
86
|
+
# @option state [Class<StandardError>] :error
|
87
|
+
#
|
84
88
|
# @option state [Integer] :branched
|
85
89
|
#
|
86
90
|
# @return [Hash{Symbol=>Object}, Object]
|
@@ -89,6 +93,7 @@ module ModernTreasury
|
|
89
93
|
|
90
94
|
unless value.is_a?(Hash)
|
91
95
|
exactness[:no] += 1
|
96
|
+
state[:error] = TypeError.new("#{value.class} can't be coerced into #{Hash}")
|
92
97
|
return value
|
93
98
|
end
|
94
99
|
|