kintsugi_sdk 5.5.12 → 5.6.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.
Files changed (172) hide show
  1. checksums.yaml +4 -4
  2. data/lib/crystalline/enum.rbi +17 -0
  3. data/lib/crystalline/metadata_fields.rb +94 -38
  4. data/lib/crystalline/module.rb +103 -13
  5. data/lib/crystalline/types.rb +100 -16
  6. data/lib/crystalline/utils.rb +13 -0
  7. data/lib/kintsugi_sdk/addressvalidation.rb +3 -3
  8. data/lib/kintsugi_sdk/customers.rb +10 -10
  9. data/lib/kintsugi_sdk/exemptions.rb +7 -7
  10. data/lib/kintsugi_sdk/models/errors/backend_src_address_validation_responses_validationerrorresponse.rb +0 -1
  11. data/lib/kintsugi_sdk/models/errors/backend_src_customers_responses_validationerrorresponse.rb +0 -1
  12. data/lib/kintsugi_sdk/models/errors/backend_src_exemptions_responses_validationerrorresponse.rb +0 -1
  13. data/lib/kintsugi_sdk/models/errors/backend_src_products_responses_validationerrorresponse.rb +0 -1
  14. data/lib/kintsugi_sdk/models/errors/backend_src_tax_estimation_responses_validationerrorresponse.rb +0 -1
  15. data/lib/kintsugi_sdk/models/errors/backend_src_transactions_responses_validationerrorresponse.rb +0 -1
  16. data/lib/kintsugi_sdk/models/errors/errorresponse.rb +0 -1
  17. data/lib/kintsugi_sdk/models/errors/httpvalidationerror.rb +0 -1
  18. data/lib/kintsugi_sdk/models/ops/createtransactionbycustomer_request.rb +0 -1
  19. data/lib/kintsugi_sdk/models/ops/estimate_tax_v1_tax_estimate_post_request.rb +2 -3
  20. data/lib/kintsugi_sdk/models/ops/get_customer_by_external_id_v1_customers_external_external_id_get_request.rb +0 -1
  21. data/lib/kintsugi_sdk/models/ops/get_customer_by_id_v1_customers_customer_id_get_request.rb +0 -1
  22. data/lib/kintsugi_sdk/models/ops/get_customers_v1_request.rb +0 -1
  23. data/lib/kintsugi_sdk/models/ops/get_exemption_by_id_v1_exemptions_exemption_id_get_request.rb +0 -1
  24. data/lib/kintsugi_sdk/models/ops/get_exemptions_v1_exemptions_get_request.rb +0 -1
  25. data/lib/kintsugi_sdk/models/ops/get_nexus_for_org_v1_nexus_get_request.rb +12 -5
  26. data/lib/kintsugi_sdk/models/ops/get_nexus_for_org_v1_nexus_get_request.rbi +4 -0
  27. data/lib/kintsugi_sdk/models/ops/get_product_by_id_v1_products_product_id_get_request.rb +0 -1
  28. data/lib/kintsugi_sdk/models/ops/get_transaction_by_id_v1_transactions_transaction_id_get_request.rb +0 -1
  29. data/lib/kintsugi_sdk/models/ops/get_transactions_v1_transactions_get_request.rb +0 -1
  30. data/lib/kintsugi_sdk/models/ops/getexemptionattachments_request.rb +0 -1
  31. data/lib/kintsugi_sdk/models/ops/gettransactionbyexternalid_request.rb +0 -1
  32. data/lib/kintsugi_sdk/models/ops/gettransactionsbycustomer_request.rb +0 -1
  33. data/lib/kintsugi_sdk/models/ops/gettransactionsbyfiling_request.rb +0 -1
  34. data/lib/kintsugi_sdk/models/ops/search_v1_address_validation_search_post_security.rb +0 -1
  35. data/lib/kintsugi_sdk/models/ops/update_customer_v1_customers_customer_id_put_request.rb +0 -1
  36. data/lib/kintsugi_sdk/models/ops/update_product_v1_products_product_id_put_request.rb +0 -1
  37. data/lib/kintsugi_sdk/models/ops/update_transaction_v1_transactions_transaction_id_put_request.rb +0 -1
  38. data/lib/kintsugi_sdk/models/ops/uploadexemptioncert_request.rb +0 -1
  39. data/lib/kintsugi_sdk/models/ops.rb +0 -1
  40. data/lib/kintsugi_sdk/models/shared/addressbase.rb +1 -2
  41. data/lib/kintsugi_sdk/models/shared/addresses.rb +3 -4
  42. data/lib/kintsugi_sdk/models/shared/addressresponsedata.rb +0 -1
  43. data/lib/kintsugi_sdk/models/shared/addresssearchresponse.rb +0 -1
  44. data/lib/kintsugi_sdk/models/shared/addressstatus.rb +0 -3
  45. data/lib/kintsugi_sdk/models/shared/addresssubmittedresponse.rb +0 -1
  46. data/lib/kintsugi_sdk/models/shared/addresstype.rb +0 -3
  47. data/lib/kintsugi_sdk/models/shared/appliedto.rb +0 -3
  48. data/lib/kintsugi_sdk/models/shared/attachmentread.rb +1 -2
  49. data/lib/kintsugi_sdk/models/shared/backend_src_address_validation_responses_validationerroritem.rb +0 -1
  50. data/lib/kintsugi_sdk/models/shared/backend_src_customers_responses_validationerroritem.rb +0 -1
  51. data/lib/kintsugi_sdk/models/shared/backend_src_exemptions_models_exemptionread.rb +4 -5
  52. data/lib/kintsugi_sdk/models/shared/backend_src_exemptions_responses_validationerroritem.rb +0 -1
  53. data/lib/kintsugi_sdk/models/shared/backend_src_exemptions_serializers_exemptionread.rb +4 -5
  54. data/lib/kintsugi_sdk/models/shared/backend_src_products_responses_validationerroritem.rb +0 -1
  55. data/lib/kintsugi_sdk/models/shared/backend_src_tax_estimation_responses_validationerroritem.rb +0 -1
  56. data/lib/kintsugi_sdk/models/shared/backend_src_transactions_responses_validationerroritem.rb +0 -1
  57. data/lib/kintsugi_sdk/models/shared/body_upload_exemption_certificate_v1_exemptions_exemption_id_attachments_post.rb +0 -1
  58. data/lib/kintsugi_sdk/models/shared/countrycodeenum.rb +1 -3
  59. data/lib/kintsugi_sdk/models/shared/currencyenum.rb +0 -3
  60. data/lib/kintsugi_sdk/models/shared/customerbase.rb +4 -5
  61. data/lib/kintsugi_sdk/models/shared/customerbasebase.rb +4 -5
  62. data/lib/kintsugi_sdk/models/shared/customerbasepublic.rb +4 -5
  63. data/lib/kintsugi_sdk/models/shared/customercreate.rb +14 -7
  64. data/lib/kintsugi_sdk/models/shared/customercreate.rbi +4 -0
  65. data/lib/kintsugi_sdk/models/shared/customerread.rb +14 -7
  66. data/lib/kintsugi_sdk/models/shared/customerread.rbi +4 -0
  67. data/lib/kintsugi_sdk/models/shared/customertaxregistrationread.rb +52 -0
  68. data/lib/kintsugi_sdk/models/shared/customertaxregistrationread.rbi +23 -0
  69. data/lib/kintsugi_sdk/models/shared/customertaxtypeenum.rb +25 -0
  70. data/lib/kintsugi_sdk/models/shared/customertaxtypeenum.rbi +11 -0
  71. data/lib/kintsugi_sdk/models/shared/customerupdate.rb +10 -7
  72. data/lib/kintsugi_sdk/models/shared/customerupdate.rbi +2 -0
  73. data/lib/kintsugi_sdk/models/shared/discountbuilder.rb +2 -3
  74. data/lib/kintsugi_sdk/models/shared/exemption.rb +5 -6
  75. data/lib/kintsugi_sdk/models/shared/exemptioncreate.rb +4 -5
  76. data/lib/kintsugi_sdk/models/shared/exemptionrequired.rb +6 -5
  77. data/lib/kintsugi_sdk/models/shared/exemptionstatus.rb +0 -3
  78. data/lib/kintsugi_sdk/models/shared/exemptiontype.rb +0 -3
  79. data/lib/kintsugi_sdk/models/shared/fastapi_pagination_default_page_exemptionread_2.rb +3 -4
  80. data/lib/kintsugi_sdk/models/shared/file.rb +0 -1
  81. data/lib/kintsugi_sdk/models/shared/findthresholdcrossingtransactionstate.rb +56 -0
  82. data/lib/kintsugi_sdk/models/shared/findthresholdcrossingtransactionstate.rbi +25 -0
  83. data/lib/kintsugi_sdk/models/shared/jurisdictiontype.rb +0 -3
  84. data/lib/kintsugi_sdk/models/shared/nexusresponse.rb +41 -26
  85. data/lib/kintsugi_sdk/models/shared/nexusresponse.rbi +10 -2
  86. data/lib/kintsugi_sdk/models/shared/nexusstateenum.rb +0 -3
  87. data/lib/kintsugi_sdk/models/shared/nexusstatusenum.rb +0 -3
  88. data/lib/kintsugi_sdk/models/shared/nexustypeenum.rb +0 -3
  89. data/lib/kintsugi_sdk/models/shared/page_customerread_.rb +3 -4
  90. data/lib/kintsugi_sdk/models/shared/page_nexusresponse_.rb +3 -4
  91. data/lib/kintsugi_sdk/models/shared/page_transactionestimateresponse_.rb +3 -4
  92. data/lib/kintsugi_sdk/models/shared/page_transactionread_.rb +3 -4
  93. data/lib/kintsugi_sdk/models/shared/periodmodelenum.rb +0 -3
  94. data/lib/kintsugi_sdk/models/shared/processingstatusenum.rb +1 -3
  95. data/lib/kintsugi_sdk/models/shared/productread.rb +12 -9
  96. data/lib/kintsugi_sdk/models/shared/productstatusenum.rb +0 -3
  97. data/lib/kintsugi_sdk/models/shared/productupdate.rb +10 -7
  98. data/lib/kintsugi_sdk/models/shared/registration.rb +0 -1
  99. data/lib/kintsugi_sdk/models/shared/registrationsregimeenum.rb +0 -3
  100. data/lib/kintsugi_sdk/models/shared/relatedentitytype.rb +0 -3
  101. data/lib/kintsugi_sdk/models/shared/salesortransactionsenum.rb +0 -3
  102. data/lib/kintsugi_sdk/models/shared/security.rb +0 -1
  103. data/lib/kintsugi_sdk/models/shared/sourceenum.rb +10 -4
  104. data/lib/kintsugi_sdk/models/shared/statusenum.rb +0 -3
  105. data/lib/kintsugi_sdk/models/shared/taxexemptionenum.rb +1 -3
  106. data/lib/kintsugi_sdk/models/shared/taxitembuilder.rb +4 -5
  107. data/lib/kintsugi_sdk/models/shared/taxitemestimate.rb +1 -2
  108. data/lib/kintsugi_sdk/models/shared/taxitemread.rb +4 -5
  109. data/lib/kintsugi_sdk/models/shared/taxitemreturnreasonenum.rb +2 -3
  110. data/lib/kintsugi_sdk/models/shared/taxitemtypeenum.rb +0 -3
  111. data/lib/kintsugi_sdk/models/shared/taxliabilitysourceenum.rb +0 -3
  112. data/lib/kintsugi_sdk/models/shared/transactionaddressbuilder.rb +3 -4
  113. data/lib/kintsugi_sdk/models/shared/transactionaddresspublic.rb +2 -3
  114. data/lib/kintsugi_sdk/models/shared/transactionaddressread_output.rb +3 -4
  115. data/lib/kintsugi_sdk/models/shared/transactioncreate.rb +23 -19
  116. data/lib/kintsugi_sdk/models/shared/transactioncreate.rbi +2 -2
  117. data/lib/kintsugi_sdk/models/shared/transactionestimatepublicrequest.rb +6 -11
  118. data/lib/kintsugi_sdk/models/shared/transactionestimatepublicrequest.rbi +0 -2
  119. data/lib/kintsugi_sdk/models/shared/transactionestimateresponse.rb +7 -12
  120. data/lib/kintsugi_sdk/models/shared/transactionestimateresponse.rbi +0 -2
  121. data/lib/kintsugi_sdk/models/shared/transactionestimateresponse_addresses.rb +3 -4
  122. data/lib/kintsugi_sdk/models/shared/transactionestimateresponse_type.rb +0 -3
  123. data/lib/kintsugi_sdk/models/shared/transactionexemptstatusenum.rb +2 -3
  124. data/lib/kintsugi_sdk/models/shared/transactionitembuilder.rb +8 -7
  125. data/lib/kintsugi_sdk/models/shared/transactionitemcreateupdate.rb +8 -7
  126. data/lib/kintsugi_sdk/models/shared/transactionitemestimatebase.rb +9 -8
  127. data/lib/kintsugi_sdk/models/shared/transactionitemestimateresponse.rb +10 -9
  128. data/lib/kintsugi_sdk/models/shared/transactionitemread.rb +7 -6
  129. data/lib/kintsugi_sdk/models/shared/transactionpublicrequest.rb +21 -17
  130. data/lib/kintsugi_sdk/models/shared/transactionpublicrequest.rbi +2 -2
  131. data/lib/kintsugi_sdk/models/shared/transactionread.rb +24 -20
  132. data/lib/kintsugi_sdk/models/shared/transactionread.rbi +2 -2
  133. data/lib/kintsugi_sdk/models/shared/transactionrefundstatus.rb +0 -3
  134. data/lib/kintsugi_sdk/models/shared/transactionstatusenum.rb +0 -3
  135. data/lib/kintsugi_sdk/models/shared/transactiontypeenum.rb +0 -3
  136. data/lib/kintsugi_sdk/models/shared/transactionupdate.rb +19 -60
  137. data/lib/kintsugi_sdk/models/shared/transactionupdate.rbi +2 -24
  138. data/lib/kintsugi_sdk/models/shared/treatmentenum.rb +0 -3
  139. data/lib/kintsugi_sdk/models/shared/type.rb +0 -3
  140. data/lib/kintsugi_sdk/models/shared/validationaddress.rb +0 -1
  141. data/lib/kintsugi_sdk/models/shared/validationerror.rb +0 -1
  142. data/lib/kintsugi_sdk/models/shared.rb +3 -7
  143. data/lib/kintsugi_sdk/nexus.rb +1 -1
  144. data/lib/kintsugi_sdk/openapisdk.rb +13 -15
  145. data/lib/kintsugi_sdk/products.rb +6 -414
  146. data/lib/kintsugi_sdk/sdk_hooks/hooks.rb +0 -1
  147. data/lib/kintsugi_sdk/sdkconfiguration.rb +5 -10
  148. data/lib/kintsugi_sdk/taxestimation.rb +4 -4
  149. data/lib/kintsugi_sdk/transactions.rb +8 -8
  150. data/lib/kintsugi_sdk/utils/forms.rb +1 -1
  151. data/lib/kintsugi_sdk/utils/query_params.rb +4 -2
  152. data/lib/kintsugi_sdk/utils/request_bodies.rb +11 -6
  153. data/lib/kintsugi_sdk/utils/security.rb +10 -0
  154. data/lib/kintsugi_sdk/utils/url.rb +11 -5
  155. data/lib/kintsugi_sdk/utils/utils.rb +45 -3
  156. metadata +77 -41
  157. data/lib/kintsugi_sdk/models/ops/get_products_v1_products_get_request.rb +0 -61
  158. data/lib/kintsugi_sdk/models/ops/get_products_v1_products_get_request.rbi +0 -27
  159. data/lib/kintsugi_sdk/models/shared/page_productread_.rb +0 -49
  160. data/lib/kintsugi_sdk/models/shared/page_productread_.rbi +0 -21
  161. data/lib/kintsugi_sdk/models/shared/productcategories.rb +0 -38
  162. data/lib/kintsugi_sdk/models/shared/productcategories.rbi +0 -15
  163. data/lib/kintsugi_sdk/models/shared/productcategoryenum.rb +0 -25
  164. data/lib/kintsugi_sdk/models/shared/productcategoryenum.rbi +0 -11
  165. data/lib/kintsugi_sdk/models/shared/productcodeenum.rb +0 -82
  166. data/lib/kintsugi_sdk/models/shared/productcodeenum.rbi +0 -11
  167. data/lib/kintsugi_sdk/models/shared/productcreatemanual.rb +0 -61
  168. data/lib/kintsugi_sdk/models/shared/productcreatemanual.rbi +0 -27
  169. data/lib/kintsugi_sdk/models/shared/productsubcategory.rb +0 -46
  170. data/lib/kintsugi_sdk/models/shared/productsubcategory.rbi +0 -19
  171. data/lib/kintsugi_sdk/models/shared/productsubcategoryenum.rb +0 -83
  172. data/lib/kintsugi_sdk/models/shared/productsubcategoryenum.rbi +0 -11
@@ -64,7 +64,7 @@ module KintsugiSDK
64
64
  hook_ctx = SDKHooks::HookContext.new(
65
65
  config: @sdk_configuration,
66
66
  base_url: base_url,
67
- oauth2_scopes: [],
67
+ oauth2_scopes: nil,
68
68
  operation_id: 'get_transactions_v1_transactions_get',
69
69
  security_source: @sdk_configuration.security_source
70
70
  )
@@ -195,7 +195,7 @@ module KintsugiSDK
195
195
  headers['content-type'] = req_content_type
196
196
  raise StandardError, 'request body is required' if data.nil? && form.nil?
197
197
 
198
- if form
198
+ if form && !form.empty?
199
199
  body = Utils.encode_form(form)
200
200
  elsif Utils.match_content_type(req_content_type, 'application/x-www-form-urlencoded')
201
201
  body = URI.encode_www_form(T.cast(data, T::Hash[Symbol, Object]))
@@ -216,7 +216,7 @@ module KintsugiSDK
216
216
  hook_ctx = SDKHooks::HookContext.new(
217
217
  config: @sdk_configuration,
218
218
  base_url: base_url,
219
- oauth2_scopes: [],
219
+ oauth2_scopes: nil,
220
220
  operation_id: 'create_transaction_v1_transactions_post',
221
221
  security_source: @sdk_configuration.security_source
222
222
  )
@@ -363,7 +363,7 @@ module KintsugiSDK
363
363
  hook_ctx = SDKHooks::HookContext.new(
364
364
  config: @sdk_configuration,
365
365
  base_url: base_url,
366
- oauth2_scopes: [],
366
+ oauth2_scopes: nil,
367
367
  operation_id: 'getTransactionByExternalId',
368
368
  security_source: @sdk_configuration.security_source
369
369
  )
@@ -498,7 +498,7 @@ module KintsugiSDK
498
498
  headers['content-type'] = req_content_type
499
499
  raise StandardError, 'request body is required' if data.nil? && form.nil?
500
500
 
501
- if form
501
+ if form && !form.empty?
502
502
  body = Utils.encode_form(form)
503
503
  elsif Utils.match_content_type(req_content_type, 'application/x-www-form-urlencoded')
504
504
  body = URI.encode_www_form(T.cast(data, T::Hash[Symbol, Object]))
@@ -519,7 +519,7 @@ module KintsugiSDK
519
519
  hook_ctx = SDKHooks::HookContext.new(
520
520
  config: @sdk_configuration,
521
521
  base_url: base_url,
522
- oauth2_scopes: [],
522
+ oauth2_scopes: nil,
523
523
  operation_id: 'update_transaction_v1_transactions__transaction_id__put',
524
524
  security_source: @sdk_configuration.security_source
525
525
  )
@@ -638,7 +638,7 @@ module KintsugiSDK
638
638
  hook_ctx = SDKHooks::HookContext.new(
639
639
  config: @sdk_configuration,
640
640
  base_url: base_url,
641
- oauth2_scopes: [],
641
+ oauth2_scopes: nil,
642
642
  operation_id: 'get_transaction_by_id_v1_transactions__transaction_id__get',
643
643
  security_source: @sdk_configuration.security_source
644
644
  )
@@ -783,7 +783,7 @@ module KintsugiSDK
783
783
  hook_ctx = SDKHooks::HookContext.new(
784
784
  config: @sdk_configuration,
785
785
  base_url: base_url,
786
- oauth2_scopes: [],
786
+ oauth2_scopes: nil,
787
787
  operation_id: 'getTransactionsByFiling',
788
788
  security_source: @sdk_configuration.security_source
789
789
  )
@@ -104,7 +104,7 @@ module KintsugiSDK
104
104
  end
105
105
  raise StandardError, 'invalid multipart/form-data file' if T.unsafe(file_name) == '' || T.unsafe(content).nil?
106
106
 
107
- form.append([field_name, [file_name, content]])
107
+ form.append(["#{field_name}[]", [file_name, content]])
108
108
  end
109
109
  else
110
110
  # Handle single file
@@ -3,7 +3,6 @@
3
3
  # typed: true
4
4
  # frozen_string_literal: true
5
5
 
6
- require 'cgi'
7
6
  require 'date'
8
7
  require 'base64'
9
8
  require 'sorbet-runtime'
@@ -17,7 +16,10 @@ module KintsugiSDK
17
16
  parsed_params = T.let({}, T::Hash[T.any(String, Symbol), T::Array[String]])
18
17
  if !url_override.nil?
19
18
  parsed_url = URI.parse url_override
20
- parsed_params = CGI.parse parsed_url.query
19
+ URI.decode_www_form(parsed_url.query.to_s).each do |key, value|
20
+ parsed_params[key] ||= []
21
+ T.must(parsed_params[key]) << value
22
+ end
21
23
  end
22
24
  params = T.let({}, T::Hash[T.any(String, Symbol), T::Array[String]])
23
25
  T.unsafe(clazz).fields.each do |f|
@@ -29,8 +29,6 @@ module KintsugiSDK
29
29
 
30
30
  return serialize_content_type(SERIALIZATION_METHOD_TO_CONTENT_TYPE[serialization_method], request) if !request.respond_to?(:fields) || !request.respond_to?(request_field_name)
31
31
 
32
- request_val = request.send(request_field_name)
33
-
34
32
  request_metadata = T.let(nil, T.nilable(T::Array[T::Array[T.any(T::Array[T.nilable(String)], String)]]))
35
33
  T.unsafe(request).fields.each do |f|
36
34
  if f.name == request_field_name
@@ -38,7 +36,14 @@ module KintsugiSDK
38
36
  break
39
37
  end
40
38
  end
41
- raise StandardError, 'invalid request type' if request_metadata.nil?
39
+ if request_metadata.nil?
40
+ # Field name collision: model has a field matching request_field_name but without :request metadata.
41
+ # Serialize the entire object as the request body.
42
+ return serialize_content_type(SERIALIZATION_METHOD_TO_CONTENT_TYPE[serialization_method], request)
43
+ end
44
+
45
+ request_val = request.send(request_field_name)
46
+ return ['', nil, nil] if request_val.nil?
42
47
 
43
48
  serialize_content_type(
44
49
  request_metadata.fetch(:media_type, 'application/octet-stream'), request_val
@@ -50,9 +55,9 @@ module KintsugiSDK
50
55
  .returns([String, Object, T.nilable(T::Array[T::Array[T.any(T::Array[T.nilable(String)], String)]])])
51
56
  end
52
57
  def self.serialize_content_type(media_type, request)
53
- return media_type, ::Crystalline.to_json(request), nil if media_type.match('(application|text)\/.*?\+*json.*')
54
- return serialize_multipart_form(media_type, request) if media_type.match('multipart\/.*')
55
- return media_type, serialize_form_data(request), nil if media_type.match('application\/x-www-form-urlencoded.*')
58
+ return media_type, ::Crystalline.to_json(request), nil if media_type.match('^(application|text)\/([^+]+\+)*json.*')
59
+ return serialize_multipart_form(media_type, request) if media_type.match('^multipart\/.*')
60
+ return media_type, serialize_form_data(request), nil if media_type.match('^application\/x-www-form-urlencoded.*')
56
61
  return media_type, request, nil if request.is_a?(String) || request.is_a?(Array)
57
62
 
58
63
  raise StandardError, "invalid request body type #{request.class} for mediaType #{media_type}"
@@ -37,6 +37,16 @@ module KintsugiSDK
37
37
 
38
38
  sig { params(req: Faraday::Request, option: Object).void }
39
39
  def self._parse_security_option(req, option)
40
+ # Check if this option uses basic auth (needs the whole object, not individual fields)
41
+ first_field = T.unsafe(option).fields.first
42
+ if first_field
43
+ first_meta = first_field.metadata[:security]
44
+ if first_meta && first_meta[:type] == 'http' && first_meta[:sub_type] == 'basic'
45
+ _parse_security_scheme(req, first_meta, option)
46
+ return
47
+ end
48
+ end
49
+
40
50
  T.unsafe(option).fields.each do |opt_field|
41
51
  metadata = opt_field.metadata[:security]
42
52
  next if metadata.nil? || !metadata.include?(:scheme)
@@ -24,7 +24,7 @@ module KintsugiSDK
24
24
  if serialization != ''
25
25
  serialized_params = _get_serialized_params(param_metadata, f_name, param)
26
26
  serialized_params.each do |k, v|
27
- path = path.sub("{#{k}}", v.join(', '))
27
+ path = path.gsub("{#{k}}", v.join(', '))
28
28
  end
29
29
  else
30
30
  if param.is_a? Array
@@ -32,7 +32,7 @@ module KintsugiSDK
32
32
  param.each do |pp_val|
33
33
  pp_vals.append(pp_val.to_s)
34
34
  end
35
- path = path.sub("{#{param_metadata.fetch(:field_name, f.name)}}", pp_vals.join(','))
35
+ path = path.gsub("{#{param_metadata.fetch(:field_name, f.name)}}", pp_vals.join(','))
36
36
  elsif param.is_a? Hash
37
37
  pp_vals = []
38
38
  param.each do |pp_key, pp_val|
@@ -44,7 +44,7 @@ module KintsugiSDK
44
44
  pp_vals.append("#{pp_key},#{value}")
45
45
  end
46
46
  end
47
- path = path.sub("{#{param_metadata.fetch(:field_name, f.name)}}", pp_vals.join(','))
47
+ path = path.gsub("{#{param_metadata.fetch(:field_name, f.name)}}", pp_vals.join(','))
48
48
  elsif param.class.include?(::Crystalline::MetadataFields)
49
49
  pp_vals = []
50
50
  attrs = T.unsafe(param).fields.filter { |field| field.name && param.respond_to?(field.name.to_sym) }.map(&:name)
@@ -72,9 +72,9 @@ module KintsugiSDK
72
72
  pp_vals.append("#{parm_name},#{param_field_val}")
73
73
  end
74
74
  end
75
- path = path.sub("{#{param_metadata.fetch(:field_name, f.name)}}", pp_vals.join(','))
75
+ path = path.gsub("{#{param_metadata.fetch(:field_name, f.name)}}", pp_vals.join(','))
76
76
  else
77
- path = path.sub("{#{param_metadata.fetch(:field_name, f.name)}}", param.to_s)
77
+ path = path.gsub("{#{param_metadata.fetch(:field_name, f.name)}}", _encode_path_param(val_to_string(param)))
78
78
  end
79
79
  end
80
80
  end
@@ -82,6 +82,12 @@ module KintsugiSDK
82
82
  server_url.delete_suffix('/') + path
83
83
  end
84
84
 
85
+ # Percent-encode characters that are invalid in URI path segments
86
+ sig { params(value: String).returns(String) }
87
+ def self._encode_path_param(value)
88
+ value.gsub(/[<>{}\[\]|\\^`\s?#%]/) { |c| format('%%%02X', c.ord) }
89
+ end
90
+
85
91
  sig { params(url_with_params: String, params: T::Hash[Symbol, T.any(String, T::Enum)]).returns(String) }
86
92
  def self.template_url(url_with_params, params)
87
93
  params.each do |key, value|
@@ -19,13 +19,43 @@ module KintsugiSDK
19
19
  if val.class.respond_to?(:enums)
20
20
  T.unsafe(val).serialize.to_s
21
21
  elsif val.is_a? DateTime
22
- val.strftime('%Y-%m-%dT%H:%M:%S.%NZ')
22
+ val.strftime('%Y-%m-%dT%H:%M:%S.%NZ').sub(/(\.\d*[1-9])0+Z\z/, '\1Z').sub(/\.0+Z\z/, 'Z')
23
23
  else
24
24
  val.to_s
25
25
 
26
26
  end
27
27
  end
28
28
 
29
+ MIME_TYPES = {
30
+ '.json' => 'application/json',
31
+ '.xml' => 'application/xml',
32
+ '.pdf' => 'application/pdf',
33
+ '.zip' => 'application/zip',
34
+ '.gz' => 'application/gzip',
35
+ '.csv' => 'text/csv',
36
+ '.txt' => 'text/plain',
37
+ '.html' => 'text/html',
38
+ '.htm' => 'text/html',
39
+ '.css' => 'text/css',
40
+ '.js' => 'application/javascript',
41
+ '.png' => 'image/png',
42
+ '.jpg' => 'image/jpeg',
43
+ '.jpeg' => 'image/jpeg',
44
+ '.gif' => 'image/gif',
45
+ '.svg' => 'image/svg+xml',
46
+ '.webp' => 'image/webp',
47
+ '.mp3' => 'audio/mpeg',
48
+ '.mp4' => 'video/mp4',
49
+ '.yaml' => 'application/yaml',
50
+ '.yml' => 'application/yaml',
51
+ }.freeze
52
+
53
+ sig { params(filename: String).returns(String) }
54
+ def self.mime_type_for_filename(filename)
55
+ ext = File.extname(filename).downcase
56
+ MIME_TYPES.fetch(ext, 'application/octet-stream')
57
+ end
58
+
29
59
  sig do
30
60
  params(metadata: T::Hash[Symbol, String], field_name: String, obj: Object)
31
61
  .returns(T::Hash[Symbol, T::Array[String]])
@@ -102,6 +132,18 @@ module KintsugiSDK
102
132
  end
103
133
  end
104
134
 
135
+ sig do
136
+ params(enum_type: Module, optional: T::Boolean)
137
+ .returns(T.proc.params(s: String).returns(T.untyped))
138
+ end
139
+ def self.open_enum_from_string(enum_type, optional)
140
+ Kernel.lambda do |s|
141
+ return nil if optional && s.nil?
142
+
143
+ return T.unsafe(enum_type).deserialize(s)
144
+ end
145
+ end
146
+
105
147
  sig { params(name: String).returns(T.proc.returns(String)) }
106
148
  def self.field_name(name)
107
149
  T.let(proc { name }, T.proc.returns(String))
@@ -143,7 +185,7 @@ module KintsugiSDK
143
185
  # Handle file uploads
144
186
  file_part = Faraday::Multipart::FilePart.new(
145
187
  StringIO.new(T.must(field[1])),
146
- 'application/octet-stream',
188
+ mime_type_for_filename(T.must(field[0])),
147
189
  field[0]
148
190
  )
149
191
 
@@ -158,7 +200,7 @@ module KintsugiSDK
158
200
  end
159
201
  end
160
202
  elsif field.length == 3
161
- param_part = Faraday::Multipart::ParamPart.new(field[1].to_json, field[2])
203
+ param_part = Faraday::Multipart::ParamPart.new(field[1], field[2])
162
204
 
163
205
  # Handle multiple values for the same field name (arrays)
164
206
  if payload.key?(field_name)
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: kintsugi_sdk
3
3
  version: !ruby/object:Gem::Version
4
- version: 5.5.12
4
+ version: 5.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kintsugi
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2025-08-20 00:00:00.000000000 Z
11
+ date: 2026-03-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: base64
@@ -36,50 +36,64 @@ dependencies:
36
36
  requirements:
37
37
  - - ">="
38
38
  - !ruby/object:Gem::Version
39
- version: '0'
39
+ version: 2.14.1
40
40
  type: :runtime
41
41
  prerelease: false
42
42
  version_requirements: !ruby/object:Gem::Requirement
43
43
  requirements:
44
44
  - - ">="
45
45
  - !ruby/object:Gem::Version
46
- version: '0'
46
+ version: 2.14.1
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: faraday-multipart
49
49
  requirement: !ruby/object:Gem::Requirement
50
50
  requirements:
51
- - - ">="
51
+ - - "~>"
52
52
  - !ruby/object:Gem::Version
53
- version: '0'
53
+ version: 1.2.0
54
54
  type: :runtime
55
55
  prerelease: false
56
56
  version_requirements: !ruby/object:Gem::Requirement
57
57
  requirements:
58
- - - ">="
58
+ - - "~>"
59
59
  - !ruby/object:Gem::Version
60
- version: '0'
60
+ version: 1.2.0
61
61
  - !ruby/object:Gem::Dependency
62
62
  name: faraday-retry
63
63
  requirement: !ruby/object:Gem::Requirement
64
64
  requirements:
65
65
  - - "~>"
66
66
  - !ruby/object:Gem::Version
67
- version: 2.2.1
67
+ version: 2.4.0
68
68
  type: :runtime
69
69
  prerelease: false
70
70
  version_requirements: !ruby/object:Gem::Requirement
71
71
  requirements:
72
72
  - - "~>"
73
73
  - !ruby/object:Gem::Version
74
- version: 2.2.1
74
+ version: 2.4.0
75
75
  - !ruby/object:Gem::Dependency
76
76
  name: sorbet-runtime
77
+ requirement: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - "~>"
80
+ - !ruby/object:Gem::Version
81
+ version: 0.6.12872
82
+ type: :runtime
83
+ prerelease: false
84
+ version_requirements: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - "~>"
87
+ - !ruby/object:Gem::Version
88
+ version: 0.6.12872
89
+ - !ruby/object:Gem::Dependency
90
+ name: irb
77
91
  requirement: !ruby/object:Gem::Requirement
78
92
  requirements:
79
93
  - - ">="
80
94
  - !ruby/object:Gem::Version
81
95
  version: '0'
82
- type: :runtime
96
+ type: :development
83
97
  prerelease: false
84
98
  version_requirements: !ruby/object:Gem::Requirement
85
99
  requirements:
@@ -92,28 +106,42 @@ dependencies:
92
106
  requirements:
93
107
  - - ">="
94
108
  - !ruby/object:Gem::Version
95
- version: '0'
109
+ version: 5.27.0
96
110
  type: :development
97
111
  prerelease: false
98
112
  version_requirements: !ruby/object:Gem::Requirement
99
113
  requirements:
100
114
  - - ">="
101
115
  - !ruby/object:Gem::Version
102
- version: '0'
116
+ version: 5.27.0
103
117
  - !ruby/object:Gem::Dependency
104
118
  name: minitest-focus
105
119
  requirement: !ruby/object:Gem::Requirement
106
120
  requirements:
107
- - - ">="
121
+ - - "~>"
108
122
  - !ruby/object:Gem::Version
109
- version: '0'
123
+ version: 1.4.1
110
124
  type: :development
111
125
  prerelease: false
112
126
  version_requirements: !ruby/object:Gem::Requirement
113
127
  requirements:
114
- - - ">="
128
+ - - "~>"
115
129
  - !ruby/object:Gem::Version
116
- version: '0'
130
+ version: 1.4.1
131
+ - !ruby/object:Gem::Dependency
132
+ name: minitest-reporters
133
+ requirement: !ruby/object:Gem::Requirement
134
+ requirements:
135
+ - - "~>"
136
+ - !ruby/object:Gem::Version
137
+ version: 1.7.1
138
+ type: :development
139
+ prerelease: false
140
+ version_requirements: !ruby/object:Gem::Requirement
141
+ requirements:
142
+ - - "~>"
143
+ - !ruby/object:Gem::Version
144
+ version: 1.7.1
117
145
  - !ruby/object:Gem::Dependency
118
146
  name: rake
119
147
  requirement: !ruby/object:Gem::Requirement
@@ -160,30 +188,44 @@ dependencies:
160
188
  name: sorbet
161
189
  requirement: !ruby/object:Gem::Requirement
162
190
  requirements:
163
- - - ">="
191
+ - - "~>"
164
192
  - !ruby/object:Gem::Version
165
- version: '0'
193
+ version: 0.6.12872
166
194
  type: :development
167
195
  prerelease: false
168
196
  version_requirements: !ruby/object:Gem::Requirement
169
197
  requirements:
170
- - - ">="
198
+ - - "~>"
171
199
  - !ruby/object:Gem::Version
172
- version: '0'
200
+ version: 0.6.12872
173
201
  - !ruby/object:Gem::Dependency
174
202
  name: tapioca
175
203
  requirement: !ruby/object:Gem::Requirement
176
204
  requirements:
177
205
  - - "~>"
178
206
  - !ruby/object:Gem::Version
179
- version: 0.16.11
207
+ version: 0.17.10
208
+ type: :development
209
+ prerelease: false
210
+ version_requirements: !ruby/object:Gem::Requirement
211
+ requirements:
212
+ - - "~>"
213
+ - !ruby/object:Gem::Version
214
+ version: 0.17.10
215
+ - !ruby/object:Gem::Dependency
216
+ name: tsort
217
+ requirement: !ruby/object:Gem::Requirement
218
+ requirements:
219
+ - - "~>"
220
+ - !ruby/object:Gem::Version
221
+ version: 0.2.0
180
222
  type: :development
181
223
  prerelease: false
182
224
  version_requirements: !ruby/object:Gem::Requirement
183
225
  requirements:
184
226
  - - "~>"
185
227
  - !ruby/object:Gem::Version
186
- version: 0.16.11
228
+ version: 0.2.0
187
229
  description: Ruby SDK for Kintsugi Tax Platform
188
230
  email:
189
231
  executables: []
@@ -191,6 +233,7 @@ extensions: []
191
233
  extra_rdoc_files: []
192
234
  files:
193
235
  - lib/crystalline.rb
236
+ - lib/crystalline/enum.rbi
194
237
  - lib/crystalline/metadata_fields.rb
195
238
  - lib/crystalline/module.rb
196
239
  - lib/crystalline/types.rb
@@ -238,8 +281,6 @@ files:
238
281
  - lib/kintsugi_sdk/models/ops/get_nexus_for_org_v1_nexus_get_request.rbi
239
282
  - lib/kintsugi_sdk/models/ops/get_product_by_id_v1_products_product_id_get_request.rb
240
283
  - lib/kintsugi_sdk/models/ops/get_product_by_id_v1_products_product_id_get_request.rbi
241
- - lib/kintsugi_sdk/models/ops/get_products_v1_products_get_request.rb
242
- - lib/kintsugi_sdk/models/ops/get_products_v1_products_get_request.rbi
243
284
  - lib/kintsugi_sdk/models/ops/get_transaction_by_id_v1_transactions_transaction_id_get_request.rb
244
285
  - lib/kintsugi_sdk/models/ops/get_transaction_by_id_v1_transactions_transaction_id_get_request.rbi
245
286
  - lib/kintsugi_sdk/models/ops/get_transactions_v1_transactions_get_request.rb
@@ -313,6 +354,10 @@ files:
313
354
  - lib/kintsugi_sdk/models/shared/customercreate.rbi
314
355
  - lib/kintsugi_sdk/models/shared/customerread.rb
315
356
  - lib/kintsugi_sdk/models/shared/customerread.rbi
357
+ - lib/kintsugi_sdk/models/shared/customertaxregistrationread.rb
358
+ - lib/kintsugi_sdk/models/shared/customertaxregistrationread.rbi
359
+ - lib/kintsugi_sdk/models/shared/customertaxtypeenum.rb
360
+ - lib/kintsugi_sdk/models/shared/customertaxtypeenum.rbi
316
361
  - lib/kintsugi_sdk/models/shared/customerupdate.rb
317
362
  - lib/kintsugi_sdk/models/shared/customerupdate.rbi
318
363
  - lib/kintsugi_sdk/models/shared/discountbuilder.rb
@@ -331,6 +376,8 @@ files:
331
376
  - lib/kintsugi_sdk/models/shared/fastapi_pagination_default_page_exemptionread_2.rbi
332
377
  - lib/kintsugi_sdk/models/shared/file.rb
333
378
  - lib/kintsugi_sdk/models/shared/file.rbi
379
+ - lib/kintsugi_sdk/models/shared/findthresholdcrossingtransactionstate.rb
380
+ - lib/kintsugi_sdk/models/shared/findthresholdcrossingtransactionstate.rbi
334
381
  - lib/kintsugi_sdk/models/shared/jurisdictiontype.rb
335
382
  - lib/kintsugi_sdk/models/shared/jurisdictiontype.rbi
336
383
  - lib/kintsugi_sdk/models/shared/nexusresponse.rb
@@ -345,8 +392,6 @@ files:
345
392
  - lib/kintsugi_sdk/models/shared/page_customerread_.rbi
346
393
  - lib/kintsugi_sdk/models/shared/page_nexusresponse_.rb
347
394
  - lib/kintsugi_sdk/models/shared/page_nexusresponse_.rbi
348
- - lib/kintsugi_sdk/models/shared/page_productread_.rb
349
- - lib/kintsugi_sdk/models/shared/page_productread_.rbi
350
395
  - lib/kintsugi_sdk/models/shared/page_transactionestimateresponse_.rb
351
396
  - lib/kintsugi_sdk/models/shared/page_transactionestimateresponse_.rbi
352
397
  - lib/kintsugi_sdk/models/shared/page_transactionread_.rb
@@ -355,22 +400,10 @@ files:
355
400
  - lib/kintsugi_sdk/models/shared/periodmodelenum.rbi
356
401
  - lib/kintsugi_sdk/models/shared/processingstatusenum.rb
357
402
  - lib/kintsugi_sdk/models/shared/processingstatusenum.rbi
358
- - lib/kintsugi_sdk/models/shared/productcategories.rb
359
- - lib/kintsugi_sdk/models/shared/productcategories.rbi
360
- - lib/kintsugi_sdk/models/shared/productcategoryenum.rb
361
- - lib/kintsugi_sdk/models/shared/productcategoryenum.rbi
362
- - lib/kintsugi_sdk/models/shared/productcodeenum.rb
363
- - lib/kintsugi_sdk/models/shared/productcodeenum.rbi
364
- - lib/kintsugi_sdk/models/shared/productcreatemanual.rb
365
- - lib/kintsugi_sdk/models/shared/productcreatemanual.rbi
366
403
  - lib/kintsugi_sdk/models/shared/productread.rb
367
404
  - lib/kintsugi_sdk/models/shared/productread.rbi
368
405
  - lib/kintsugi_sdk/models/shared/productstatusenum.rb
369
406
  - lib/kintsugi_sdk/models/shared/productstatusenum.rbi
370
- - lib/kintsugi_sdk/models/shared/productsubcategory.rb
371
- - lib/kintsugi_sdk/models/shared/productsubcategory.rbi
372
- - lib/kintsugi_sdk/models/shared/productsubcategoryenum.rb
373
- - lib/kintsugi_sdk/models/shared/productsubcategoryenum.rbi
374
407
  - lib/kintsugi_sdk/models/shared/productupdate.rb
375
408
  - lib/kintsugi_sdk/models/shared/productupdate.rbi
376
409
  - lib/kintsugi_sdk/models/shared/registration.rb
@@ -466,10 +499,13 @@ files:
466
499
  - lib/kintsugi_sdk/utils/security.rb
467
500
  - lib/kintsugi_sdk/utils/url.rb
468
501
  - lib/kintsugi_sdk/utils/utils.rb
469
- homepage:
502
+ homepage: https://github.com/kintsugi-tax/kintsugi-tax-ruby-sdk.git
470
503
  licenses:
471
504
  - Apache-2.0
472
- metadata: {}
505
+ metadata:
506
+ homepage_uri: https://github.com/kintsugi-tax/kintsugi-tax-ruby-sdk.git
507
+ documentation_uri: https://github.com/kintsugi-tax/kintsugi-tax-ruby-sdk.git
508
+ source_code_uri: https://github.com/kintsugi-tax/kintsugi-tax-ruby-sdk.git
473
509
  post_install_message:
474
510
  rdoc_options: []
475
511
  require_paths:
@@ -1,61 +0,0 @@
1
- # Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.
2
-
3
- # typed: true
4
- # frozen_string_literal: true
5
-
6
-
7
- module KintsugiSDK
8
- module Models
9
- module Ops
10
-
11
-
12
- class GetProductsV1ProductsGetRequest
13
- extend T::Sig
14
- include Crystalline::MetadataFields
15
-
16
- # Search term to filter products by name or other details.
17
- field :query, Crystalline::Nilable.new(::String), { 'query_param': { 'field_name': 'query', 'style': 'form', 'explode': true } }
18
- # Filter products by status (comma-separated)
19
- field :status_in, Crystalline::Nilable.new(::String), { 'query_param': { 'field_name': 'status__in', 'style': 'form', 'explode': true } }
20
- # Filter products by category (comma-separated)
21
- field :product_category_in, Crystalline::Nilable.new(::String), { 'query_param': { 'field_name': 'product_category__in', 'style': 'form', 'explode': true } }
22
- # Filter products by subcategory (comma-separated)
23
- field :product_subcategory_in, Crystalline::Nilable.new(::String), { 'query_param': { 'field_name': 'product_subcategory__in', 'style': 'form', 'explode': true } }
24
- # Filter products by source (comma-separated)
25
- field :source_in, Crystalline::Nilable.new(::String), { 'query_param': { 'field_name': 'source__in', 'style': 'form', 'explode': true } }
26
- # Order results by specified fields (comma-separated)
27
- field :order_by, Crystalline::Nilable.new(::String), { 'query_param': { 'field_name': 'order_by', 'style': 'form', 'explode': true } }
28
- # Page number
29
- field :page, Crystalline::Nilable.new(::Integer), { 'query_param': { 'field_name': 'page', 'style': 'form', 'explode': true } }
30
- # Page size
31
- field :size, Crystalline::Nilable.new(::Integer), { 'query_param': { 'field_name': 'size', 'style': 'form', 'explode': true } }
32
-
33
- sig { params(query: T.nilable(::String), status_in: T.nilable(::String), product_category_in: T.nilable(::String), product_subcategory_in: T.nilable(::String), source_in: T.nilable(::String), order_by: T.nilable(::String), page: T.nilable(::Integer), size: T.nilable(::Integer)).void }
34
- def initialize(query: nil, status_in: nil, product_category_in: nil, product_subcategory_in: nil, source_in: nil, order_by: nil, page: 1, size: 50)
35
- @query = query
36
- @status_in = status_in
37
- @product_category_in = product_category_in
38
- @product_subcategory_in = product_subcategory_in
39
- @source_in = source_in
40
- @order_by = order_by
41
- @page = page
42
- @size = size
43
- end
44
-
45
- sig { params(other: T.untyped).returns(T::Boolean) }
46
- def ==(other)
47
- return false unless other.is_a? self.class
48
- return false unless @query == other.query
49
- return false unless @status_in == other.status_in
50
- return false unless @product_category_in == other.product_category_in
51
- return false unless @product_subcategory_in == other.product_subcategory_in
52
- return false unless @source_in == other.source_in
53
- return false unless @order_by == other.order_by
54
- return false unless @page == other.page
55
- return false unless @size == other.size
56
- true
57
- end
58
- end
59
- end
60
- end
61
- end
@@ -1,27 +0,0 @@
1
- # typed: true
2
- # frozen_string_literal: true
3
-
4
-
5
- class KintsugiSDK::Models::Ops::GetProductsV1ProductsGetRequest
6
- extend ::Crystalline::MetadataFields::ClassMethods
7
- end
8
-
9
-
10
- class KintsugiSDK::Models::Ops::GetProductsV1ProductsGetRequest
11
- def query(); end
12
- def query=(str_); end
13
- def status_in(); end
14
- def status_in=(str_); end
15
- def product_category_in(); end
16
- def product_category_in=(str_); end
17
- def product_subcategory_in(); end
18
- def product_subcategory_in=(str_); end
19
- def source_in(); end
20
- def source_in=(str_); end
21
- def order_by(); end
22
- def order_by=(str_); end
23
- def page(); end
24
- def page=(str_); end
25
- def size(); end
26
- def size=(str_); end
27
- end