activemerchant 1.125.0 → 1.129.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (80) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG +316 -0
  3. data/lib/active_merchant/billing/check.rb +40 -8
  4. data/lib/active_merchant/billing/credit_card.rb +28 -1
  5. data/lib/active_merchant/billing/credit_card_methods.rb +91 -23
  6. data/lib/active_merchant/billing/gateway.rb +2 -1
  7. data/lib/active_merchant/billing/gateways/adyen.rb +74 -12
  8. data/lib/active_merchant/billing/gateways/airwallex.rb +370 -0
  9. data/lib/active_merchant/billing/gateways/alelo.rb +256 -0
  10. data/lib/active_merchant/billing/gateways/authorize_net.rb +21 -4
  11. data/lib/active_merchant/billing/gateways/barclaycard_smartpay.rb +2 -1
  12. data/lib/active_merchant/billing/gateways/beanstream.rb +18 -0
  13. data/lib/active_merchant/billing/gateways/blue_pay.rb +1 -1
  14. data/lib/active_merchant/billing/gateways/blue_snap.rb +53 -22
  15. data/lib/active_merchant/billing/gateways/bogus.rb +4 -0
  16. data/lib/active_merchant/billing/gateways/borgun.rb +56 -16
  17. data/lib/active_merchant/billing/gateways/braintree/braintree_common.rb +6 -1
  18. data/lib/active_merchant/billing/gateways/braintree/token_nonce.rb +113 -0
  19. data/lib/active_merchant/billing/gateways/braintree_blue.rb +151 -32
  20. data/lib/active_merchant/billing/gateways/card_connect.rb +28 -10
  21. data/lib/active_merchant/billing/gateways/card_stream.rb +23 -0
  22. data/lib/active_merchant/billing/gateways/checkout_v2.rb +228 -57
  23. data/lib/active_merchant/billing/gateways/commerce_hub.rb +361 -0
  24. data/lib/active_merchant/billing/gateways/credorax.rb +56 -26
  25. data/lib/active_merchant/billing/gateways/cyber_source/cyber_source_common.rb +36 -0
  26. data/lib/active_merchant/billing/gateways/cyber_source.rb +112 -58
  27. data/lib/active_merchant/billing/gateways/cyber_source_rest.rb +456 -0
  28. data/lib/active_merchant/billing/gateways/d_local.rb +93 -5
  29. data/lib/active_merchant/billing/gateways/decidir.rb +32 -5
  30. data/lib/active_merchant/billing/gateways/decidir_plus.rb +185 -14
  31. data/lib/active_merchant/billing/gateways/ebanx.rb +39 -26
  32. data/lib/active_merchant/billing/gateways/element.rb +21 -1
  33. data/lib/active_merchant/billing/gateways/global_collect.rb +98 -37
  34. data/lib/active_merchant/billing/gateways/ipg.rb +14 -10
  35. data/lib/active_merchant/billing/gateways/iveri.rb +39 -3
  36. data/lib/active_merchant/billing/gateways/kushki.rb +21 -1
  37. data/lib/active_merchant/billing/gateways/litle.rb +118 -6
  38. data/lib/active_merchant/billing/gateways/mastercard.rb +1 -8
  39. data/lib/active_merchant/billing/gateways/mercado_pago.rb +17 -0
  40. data/lib/active_merchant/billing/gateways/merchant_e_solutions.rb +44 -10
  41. data/lib/active_merchant/billing/gateways/monei.rb +2 -0
  42. data/lib/active_merchant/billing/gateways/moneris.rb +55 -13
  43. data/lib/active_merchant/billing/gateways/mundipagg.rb +3 -0
  44. data/lib/active_merchant/billing/gateways/nmi.rb +12 -7
  45. data/lib/active_merchant/billing/gateways/ogone.rb +35 -7
  46. data/lib/active_merchant/billing/gateways/openpay.rb +20 -3
  47. data/lib/active_merchant/billing/gateways/orbital.rb +378 -335
  48. data/lib/active_merchant/billing/gateways/pay_trace.rb +64 -18
  49. data/lib/active_merchant/billing/gateways/payeezy.rb +59 -4
  50. data/lib/active_merchant/billing/gateways/payflow.rb +62 -0
  51. data/lib/active_merchant/billing/gateways/paymentez.rb +44 -13
  52. data/lib/active_merchant/billing/gateways/paypal/paypal_express_response.rb +4 -0
  53. data/lib/active_merchant/billing/gateways/paysafe.rb +37 -29
  54. data/lib/active_merchant/billing/gateways/payu_latam.rb +28 -15
  55. data/lib/active_merchant/billing/gateways/plexo.rb +308 -0
  56. data/lib/active_merchant/billing/gateways/priority.rb +185 -140
  57. data/lib/active_merchant/billing/gateways/rapyd.rb +319 -0
  58. data/lib/active_merchant/billing/gateways/reach.rb +277 -0
  59. data/lib/active_merchant/billing/gateways/redsys.rb +9 -5
  60. data/lib/active_merchant/billing/gateways/safe_charge.rb +1 -4
  61. data/lib/active_merchant/billing/gateways/sage_pay.rb +1 -1
  62. data/lib/active_merchant/billing/gateways/securion_pay.rb +40 -0
  63. data/lib/active_merchant/billing/gateways/shift4.rb +342 -0
  64. data/lib/active_merchant/billing/gateways/simetrik.rb +368 -0
  65. data/lib/active_merchant/billing/gateways/stripe.rb +25 -3
  66. data/lib/active_merchant/billing/gateways/stripe_payment_intents.rb +155 -70
  67. data/lib/active_merchant/billing/gateways/tns.rb +2 -5
  68. data/lib/active_merchant/billing/gateways/trans_first_transaction_express.rb +1 -1
  69. data/lib/active_merchant/billing/gateways/trust_commerce.rb +14 -3
  70. data/lib/active_merchant/billing/gateways/vanco.rb +12 -3
  71. data/lib/active_merchant/billing/gateways/visanet_peru.rb +6 -2
  72. data/lib/active_merchant/billing/gateways/vpos.rb +7 -4
  73. data/lib/active_merchant/billing/gateways/wompi.rb +8 -4
  74. data/lib/active_merchant/billing/gateways/worldpay.rb +117 -9
  75. data/lib/active_merchant/billing/response.rb +15 -1
  76. data/lib/active_merchant/connection.rb +0 -2
  77. data/lib/active_merchant/country.rb +1 -0
  78. data/lib/active_merchant/errors.rb +4 -1
  79. data/lib/active_merchant/version.rb +1 -1
  80. metadata +28 -3
@@ -144,6 +144,11 @@ module ActiveMerchant #:nodoc:
144
144
  store_request(credit_card, options)
145
145
  end
146
146
 
147
+ def inquire(authorization, options = {})
148
+ order_id = order_id_from_authorization(authorization.to_s) || options[:order_id]
149
+ commit('direct_inquiry', build_order_inquiry_request(order_id, options), :ok, options)
150
+ end
151
+
147
152
  def supports_scrubbing
148
153
  true
149
154
  end
@@ -237,6 +242,7 @@ module ActiveMerchant #:nodoc:
237
242
  add_sub_merchant_data(xml, options[:sub_merchant_data]) if options[:sub_merchant_data]
238
243
  add_hcg_additional_data(xml, options) if options[:hcg_additional_data]
239
244
  add_instalments_data(xml, options) if options[:instalments]
245
+ add_additional_data(xml, money, options) if options[:level_2_data] || options[:level_3_data]
240
246
  add_moto_flag(xml, options) if options.dig(:metadata, :manual_entry)
241
247
  add_additional_3ds_data(xml, options) if options[:execute_threed] && options[:three_ds_version] && options[:three_ds_version] =~ /^2/
242
248
  add_3ds_exemption(xml, options) if options[:exemption_type]
@@ -245,6 +251,91 @@ module ActiveMerchant #:nodoc:
245
251
  end
246
252
  end
247
253
 
254
+ def add_additional_data(xml, amount, options)
255
+ level_two_data = options[:level_2_data] || {}
256
+ level_three_data = options[:level_3_data] || {}
257
+ level_two_and_three_data = level_two_data.merge(level_three_data).symbolize_keys
258
+
259
+ xml.branchSpecificExtension do
260
+ xml.purchase do
261
+ add_level_two_and_three_data(xml, amount, level_two_and_three_data)
262
+ end
263
+ end
264
+ end
265
+
266
+ def add_level_two_and_three_data(xml, amount, data)
267
+ xml.invoiceReferenceNumber data[:invoice_reference_number] if data.include?(:invoice_reference_number)
268
+ xml.customerReference data[:customer_reference] if data.include?(:customer_reference)
269
+ xml.cardAcceptorTaxId data[:card_acceptor_tax_id] if data.include?(:card_acceptor_tax_id)
270
+
271
+ {
272
+ sales_tax: 'salesTax',
273
+ discount_amount: 'discountAmount',
274
+ shipping_amount: 'shippingAmount',
275
+ duty_amount: 'dutyAmount'
276
+ }.each do |key, tag|
277
+ next unless data.include?(key)
278
+
279
+ xml.tag! tag do
280
+ data_amount = data[key].symbolize_keys
281
+ add_amount(xml, data_amount[:amount].to_i, data_amount)
282
+ end
283
+ end
284
+
285
+ xml.discountName data[:discount_name] if data.include?(:discount_name)
286
+ xml.discountCode data[:discount_code] if data.include?(:discount_code)
287
+
288
+ add_date_element(xml, 'shippingDate', data[:shipping_date]) if data.include?(:shipping_date)
289
+
290
+ if data.include?(:shipping_courier)
291
+ xml.shippingCourier(
292
+ data[:shipping_courier][:priority],
293
+ data[:shipping_courier][:tracking_number],
294
+ data[:shipping_courier][:name]
295
+ )
296
+ end
297
+
298
+ add_optional_data_level_two_and_three(xml, data)
299
+
300
+ if data.include?(:item) && data[:item].kind_of?(Array)
301
+ data[:item].each { |item| add_items_into_level_three_data(xml, item.symbolize_keys) }
302
+ elsif data.include?(:item)
303
+ add_items_into_level_three_data(xml, data[:item].symbolize_keys)
304
+ end
305
+ end
306
+
307
+ def add_items_into_level_three_data(xml, item)
308
+ xml.item do
309
+ xml.description item[:description] if item[:description]
310
+ xml.productCode item[:product_code] if item[:product_code]
311
+ xml.commodityCode item[:commodity_code] if item[:commodity_code]
312
+ xml.quantity item[:quantity] if item[:quantity]
313
+
314
+ {
315
+ unit_cost: 'unitCost',
316
+ item_total: 'itemTotal',
317
+ item_total_with_tax: 'itemTotalWithTax',
318
+ item_discount_amount: 'itemDiscountAmount',
319
+ tax_amount: 'taxAmount'
320
+ }.each do |key, tag|
321
+ next unless item.include?(key)
322
+
323
+ xml.tag! tag do
324
+ data_amount = item[key].symbolize_keys
325
+ add_amount(xml, data_amount[:amount].to_i, data_amount)
326
+ end
327
+ end
328
+ end
329
+ end
330
+
331
+ def add_optional_data_level_two_and_three(xml, data)
332
+ xml.shipFromPostalCode data[:ship_from_postal_code] if data.include?(:ship_from_postal_code)
333
+ xml.destinationPostalCode data[:destination_postal_code] if data.include?(:destination_postal_code)
334
+ xml.destinationCountryCode data[:destination_country_code] if data.include?(:destination_country_code)
335
+ add_date_element(xml, 'orderDate', data[:order_date].symbolize_keys) if data.include?(:order_date)
336
+ xml.taxExempt data[:tax_exempt] if data.include?(:tax_exempt)
337
+ end
338
+
248
339
  def order_tag_attributes(options)
249
340
  { 'orderCode' => clean_order_id(options[:order_id]), 'installationId' => options[:inst_id] || @options[:inst_id] }.reject { |_, v| !v.present? }
250
341
  end
@@ -718,9 +809,18 @@ module ActiveMerchant #:nodoc:
718
809
  resp_params = { action: action }
719
810
 
720
811
  parse_elements(doc.root, resp_params)
812
+ extract_issuer_response(doc.root, resp_params)
813
+
721
814
  resp_params
722
815
  end
723
816
 
817
+ def extract_issuer_response(doc, response)
818
+ return unless issuer_response = doc.at_xpath('//paymentService//reply//orderStatus//payment//IssuerResponseCode')
819
+
820
+ response[:issuer_response_code] = issuer_response['code']
821
+ response[:issuer_response_description] = issuer_response['description']
822
+ end
823
+
724
824
  def parse_elements(node, response)
725
825
  node_name = node.name.underscore
726
826
  node.attributes.each do |k, v|
@@ -743,9 +843,11 @@ module ActiveMerchant #:nodoc:
743
843
  'Content-Type' => 'text/xml',
744
844
  'Authorization' => encoded_credentials
745
845
  }
746
- if options[:cookie]
747
- headers['Cookie'] = options[:cookie] if options[:cookie]
748
- end
846
+
847
+ # ensure cookie included on follow-up '3ds' and 'capture_request' calls, using the cookie saved from the preceding response
848
+ # cookie should be present in options on the 3ds and capture calls, but also still saved in the instance var in case
849
+ cookie = options[:cookie] || @cookie || nil
850
+ headers['Cookie'] = cookie if cookie
749
851
 
750
852
  headers['Idempotency-Key'] = idempotency_key if idempotency_key
751
853
  headers
@@ -761,7 +863,7 @@ module ActiveMerchant #:nodoc:
761
863
  raw[:is3DSOrder] = true
762
864
  end
763
865
  success = success_from(action, raw, success_criteria)
764
- message = message_from(success, raw, success_criteria)
866
+ message = message_from(success, raw, success_criteria, action)
765
867
 
766
868
  Response.new(
767
869
  success,
@@ -798,7 +900,8 @@ module ActiveMerchant #:nodoc:
798
900
  def handle_response(response)
799
901
  case response.code.to_i
800
902
  when 200...300
801
- @cookie = response['Set-Cookie']
903
+ cookie = response.header['Set-Cookie']&.match('^[^;]*')
904
+ @cookie = cookie[0] if cookie
802
905
  response.body
803
906
  else
804
907
  raise ResponseError.new(response)
@@ -809,10 +912,10 @@ module ActiveMerchant #:nodoc:
809
912
  success_criteria_success?(raw, success_criteria) || action_success?(action, raw)
810
913
  end
811
914
 
812
- def message_from(success, raw, success_criteria)
915
+ def message_from(success, raw, success_criteria, action)
813
916
  return 'SUCCESS' if success
814
917
 
815
- raw[:iso8583_return_code_description] || raw[:error] || required_status_message(raw, success_criteria)
918
+ raw[:iso8583_return_code_description] || raw[:error] || required_status_message(raw, success_criteria, action) || raw[:issuer_response_description]
816
919
  end
817
920
 
818
921
  # success_criteria can be:
@@ -829,6 +932,8 @@ module ActiveMerchant #:nodoc:
829
932
  case action
830
933
  when 'store'
831
934
  raw[:token].present?
935
+ when 'direct_inquiry'
936
+ raw[:last_event].present?
832
937
  else
833
938
  false
834
939
  end
@@ -838,8 +943,11 @@ module ActiveMerchant #:nodoc:
838
943
  raw[:iso8583_return_code_code] || raw[:error_code] || nil unless success == 'SUCCESS'
839
944
  end
840
945
 
841
- def required_status_message(raw, success_criteria)
842
- "A transaction status of #{success_criteria.collect { |c| "'#{c}'" }.join(' or ')} is required." if !success_criteria.include?(raw[:last_event])
946
+ def required_status_message(raw, success_criteria, action)
947
+ return if success_criteria.include?(raw[:last_event])
948
+ return unless %w[cancel refund inquiry credit fast_credit].include?(action)
949
+
950
+ "A transaction status of #{success_criteria.collect { |c| "'#{c}'" }.join(' or ')} is required."
843
951
  end
844
952
 
845
953
  def authorization_from(action, raw, options)
@@ -85,7 +85,21 @@ module ActiveMerchant #:nodoc:
85
85
  (primary_response ? primary_response.success? : true)
86
86
  end
87
87
 
88
- %w(params message test authorization avs_result cvv_result error_code emv_authorization test? fraud_review?).each do |m|
88
+ def avs_result
89
+ return @primary_response.try(:avs_result) if @use_first_response
90
+
91
+ result = responses.reverse.find { |r| r.avs_result['code'].present? }
92
+ result.try(:avs_result) || responses.last.try(:avs_result)
93
+ end
94
+
95
+ def cvv_result
96
+ return @primary_response.try(:cvv_result) if @use_first_response
97
+
98
+ result = responses.reverse.find { |r| r.cvv_result['code'].present? }
99
+ result.try(:cvv_result) || responses.last.try(:cvv_result)
100
+ end
101
+
102
+ %w(params message test authorization error_code emv_authorization test? fraud_review?).each do |m|
89
103
  class_eval %(
90
104
  def #{m}
91
105
  (@responses.empty? ? nil : primary_response.#{m})
@@ -85,8 +85,6 @@ module ActiveMerchant
85
85
  result =
86
86
  case method
87
87
  when :get
88
- raise ArgumentError, 'GET requests do not support a request body' if body
89
-
90
88
  http.get(endpoint.request_uri, headers)
91
89
  when :post
92
90
  debug body
@@ -184,6 +184,7 @@ module ActiveMerchant #:nodoc:
184
184
  { alpha2: 'KP', name: 'Korea, Democratic People\'s Republic of', alpha3: 'PRK', numeric: '408' },
185
185
  { alpha2: 'KR', name: 'Korea, Republic of', alpha3: 'KOR', numeric: '410' },
186
186
  { alpha2: 'XK', name: 'Kosovo', alpha3: 'XKX', numeric: '900' },
187
+ { alpha2: 'QZ', name: 'Kosovo', alpha3: 'XKX', numeric: '900' },
187
188
  { alpha2: 'KW', name: 'Kuwait', alpha3: 'KWT', numeric: '414' },
188
189
  { alpha2: 'KG', name: 'Kyrgyzstan', alpha3: 'KGZ', numeric: '417' },
189
190
  { alpha2: 'LA', name: 'Lao People\'s Democratic Republic', alpha3: 'LAO', numeric: '418' },
@@ -23,10 +23,13 @@ module ActiveMerchant #:nodoc:
23
23
  end
24
24
 
25
25
  def to_s
26
- "Failed with #{response.code} #{response.message if response.respond_to?(:message)}"
26
+ "Failed with #{response.code if response.respond_to?(:code)} #{response.message if response.respond_to?(:message)}"
27
27
  end
28
28
  end
29
29
 
30
+ class OAuthResponseError < ResponseError # :nodoc:
31
+ end
32
+
30
33
  class ClientCertificateError < ActiveMerchantError # :nodoc
31
34
  end
32
35
 
@@ -1,3 +1,3 @@
1
1
  module ActiveMerchant
2
- VERSION = '1.125.0'
2
+ VERSION = '1.129.0'
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: activemerchant
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.125.0
4
+ version: 1.129.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tobias Luetke
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-01-20 00:00:00.000000000 Z
11
+ date: 2023-05-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -72,6 +72,20 @@ dependencies:
72
72
  - - "~>"
73
73
  - !ruby/object:Gem::Version
74
74
  version: '1.4'
75
+ - !ruby/object:Gem::Dependency
76
+ name: rexml
77
+ requirement: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - "~>"
80
+ - !ruby/object:Gem::Version
81
+ version: 3.2.5
82
+ type: :runtime
83
+ prerelease: false
84
+ version_requirements: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - "~>"
87
+ - !ruby/object:Gem::Version
88
+ version: 3.2.5
75
89
  - !ruby/object:Gem::Dependency
76
90
  name: mocha
77
91
  requirement: !ruby/object:Gem::Requirement
@@ -184,6 +198,8 @@ files:
184
198
  - lib/active_merchant/billing/gateway.rb
185
199
  - lib/active_merchant/billing/gateways.rb
186
200
  - lib/active_merchant/billing/gateways/adyen.rb
201
+ - lib/active_merchant/billing/gateways/airwallex.rb
202
+ - lib/active_merchant/billing/gateways/alelo.rb
187
203
  - lib/active_merchant/billing/gateways/allied_wallet.rb
188
204
  - lib/active_merchant/billing/gateways/authorize_net.rb
189
205
  - lib/active_merchant/billing/gateways/authorize_net_arb.rb
@@ -206,6 +222,7 @@ files:
206
222
  - lib/active_merchant/billing/gateways/bpoint.rb
207
223
  - lib/active_merchant/billing/gateways/braintree.rb
208
224
  - lib/active_merchant/billing/gateways/braintree/braintree_common.rb
225
+ - lib/active_merchant/billing/gateways/braintree/token_nonce.rb
209
226
  - lib/active_merchant/billing/gateways/braintree_blue.rb
210
227
  - lib/active_merchant/billing/gateways/braintree_orange.rb
211
228
  - lib/active_merchant/billing/gateways/bridge_pay.rb
@@ -223,6 +240,7 @@ files:
223
240
  - lib/active_merchant/billing/gateways/checkout_v2.rb
224
241
  - lib/active_merchant/billing/gateways/citrus_pay.rb
225
242
  - lib/active_merchant/billing/gateways/clearhaus.rb
243
+ - lib/active_merchant/billing/gateways/commerce_hub.rb
226
244
  - lib/active_merchant/billing/gateways/commercegate.rb
227
245
  - lib/active_merchant/billing/gateways/conekta.rb
228
246
  - lib/active_merchant/billing/gateways/creditcall.rb
@@ -230,6 +248,8 @@ files:
230
248
  - lib/active_merchant/billing/gateways/ct_payment.rb
231
249
  - lib/active_merchant/billing/gateways/culqi.rb
232
250
  - lib/active_merchant/billing/gateways/cyber_source.rb
251
+ - lib/active_merchant/billing/gateways/cyber_source/cyber_source_common.rb
252
+ - lib/active_merchant/billing/gateways/cyber_source_rest.rb
233
253
  - lib/active_merchant/billing/gateways/d_local.rb
234
254
  - lib/active_merchant/billing/gateways/data_cash.rb
235
255
  - lib/active_merchant/billing/gateways/decidir.rb
@@ -357,6 +377,7 @@ files:
357
377
  - lib/active_merchant/billing/gateways/payway.rb
358
378
  - lib/active_merchant/billing/gateways/payway_dot_com.rb
359
379
  - lib/active_merchant/billing/gateways/pin.rb
380
+ - lib/active_merchant/billing/gateways/plexo.rb
360
381
  - lib/active_merchant/billing/gateways/plugnpay.rb
361
382
  - lib/active_merchant/billing/gateways/priority.rb
362
383
  - lib/active_merchant/billing/gateways/pro_pay.rb
@@ -370,6 +391,8 @@ files:
370
391
  - lib/active_merchant/billing/gateways/quickpay/quickpay_v10.rb
371
392
  - lib/active_merchant/billing/gateways/quickpay/quickpay_v4to7.rb
372
393
  - lib/active_merchant/billing/gateways/qvalent.rb
394
+ - lib/active_merchant/billing/gateways/rapyd.rb
395
+ - lib/active_merchant/billing/gateways/reach.rb
373
396
  - lib/active_merchant/billing/gateways/realex.rb
374
397
  - lib/active_merchant/billing/gateways/redsys.rb
375
398
  - lib/active_merchant/billing/gateways/s5.rb
@@ -382,6 +405,8 @@ files:
382
405
  - lib/active_merchant/billing/gateways/secure_pay_au.rb
383
406
  - lib/active_merchant/billing/gateways/secure_pay_tech.rb
384
407
  - lib/active_merchant/billing/gateways/securion_pay.rb
408
+ - lib/active_merchant/billing/gateways/shift4.rb
409
+ - lib/active_merchant/billing/gateways/simetrik.rb
385
410
  - lib/active_merchant/billing/gateways/skip_jack.rb
386
411
  - lib/active_merchant/billing/gateways/smart_ps.rb
387
412
  - lib/active_merchant/billing/gateways/so_easy_pay.rb
@@ -455,7 +480,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
455
480
  - !ruby/object:Gem::Version
456
481
  version: '0'
457
482
  requirements: []
458
- rubygems_version: 3.2.20
483
+ rubygems_version: 3.4.12
459
484
  signing_key:
460
485
  specification_version: 4
461
486
  summary: Framework and tools for dealing with credit card transactions.