activemerchant 1.106.0 → 1.108.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG +79 -0
- data/README.md +2 -2
- data/lib/active_merchant/billing/gateways/adyen.rb +1 -1
- data/lib/active_merchant/billing/gateways/authorize_net.rb +1 -1
- data/lib/active_merchant/billing/gateways/blue_pay.rb +2 -2
- data/lib/active_merchant/billing/gateways/borgun.rb +15 -4
- data/lib/active_merchant/billing/gateways/braintree_blue.rb +11 -9
- data/lib/active_merchant/billing/gateways/checkout_v2.rb +20 -9
- data/lib/active_merchant/billing/gateways/clearhaus.rb +1 -1
- data/lib/active_merchant/billing/gateways/cyber_source.rb +74 -21
- data/lib/active_merchant/billing/gateways/d_local.rb +17 -5
- data/lib/active_merchant/billing/gateways/decidir.rb +29 -0
- data/lib/active_merchant/billing/gateways/ebanx.rb +13 -1
- data/lib/active_merchant/billing/gateways/elavon.rb +58 -5
- data/lib/active_merchant/billing/gateways/element.rb +13 -5
- data/lib/active_merchant/billing/gateways/firstdata_e4.rb +2 -2
- data/lib/active_merchant/billing/gateways/firstdata_e4_v27.rb +2 -2
- data/lib/active_merchant/billing/gateways/forte.rb +7 -6
- data/lib/active_merchant/billing/gateways/global_collect.rb +30 -24
- data/lib/active_merchant/billing/gateways/hps.rb +4 -2
- data/lib/active_merchant/billing/gateways/iats_payments.rb +31 -14
- data/lib/active_merchant/billing/gateways/iridium.rb +4 -2
- data/lib/active_merchant/billing/gateways/iveri.rb +4 -1
- data/lib/active_merchant/billing/gateways/ixopay.rb +1 -0
- data/lib/active_merchant/billing/gateways/kushki.rb +34 -5
- data/lib/active_merchant/billing/gateways/litle.rb +6 -1
- data/lib/active_merchant/billing/gateways/mercado_pago.rb +1 -0
- data/lib/active_merchant/billing/gateways/netaxept.rb +1 -1
- data/lib/active_merchant/billing/gateways/netbanx.rb +1 -1
- data/lib/active_merchant/billing/gateways/opp.rb +13 -7
- data/lib/active_merchant/billing/gateways/optimal_payment.rb +4 -0
- data/lib/active_merchant/billing/gateways/orbital.rb +44 -2
- data/lib/active_merchant/billing/gateways/payflow/payflow_common_api.rb +1 -1
- data/lib/active_merchant/billing/gateways/payment_express.rb +2 -2
- data/lib/active_merchant/billing/gateways/payu_latam.rb +1 -1
- data/lib/active_merchant/billing/gateways/pin.rb +1 -1
- data/lib/active_merchant/billing/gateways/quantum.rb +1 -1
- data/lib/active_merchant/billing/gateways/realex.rb +10 -3
- data/lib/active_merchant/billing/gateways/redsys.rb +1 -1
- data/lib/active_merchant/billing/gateways/secure_pay_au.rb +1 -1
- data/lib/active_merchant/billing/gateways/so_easy_pay.rb +1 -1
- data/lib/active_merchant/billing/gateways/stripe.rb +7 -2
- data/lib/active_merchant/billing/gateways/stripe_payment_intents.rb +40 -6
- data/lib/active_merchant/billing/gateways/transact_pro.rb +2 -2
- data/lib/active_merchant/billing/gateways/trexle.rb +1 -1
- data/lib/active_merchant/billing/gateways/worldpay.rb +8 -6
- data/lib/active_merchant/billing/network_tokenization_credit_card.rb +1 -1
- data/lib/active_merchant/connection.rb +40 -42
- data/lib/active_merchant/network_connection_retries.rb +10 -12
- data/lib/active_merchant/version.rb +1 -1
- metadata +5 -4
@@ -186,7 +186,7 @@ module ActiveMerchant #:nodoc:
|
|
186
186
|
billing_address[:street2] = address[:address2]
|
187
187
|
billing_address[:city] = address[:city]
|
188
188
|
billing_address[:state] = address[:state]
|
189
|
-
billing_address[:country] = address[:country]
|
189
|
+
billing_address[:country] = address[:country] unless address[:country].blank?
|
190
190
|
billing_address[:postalCode] = address[:zip] if @options[:payment_country] == 'MX'
|
191
191
|
billing_address[:phone] = address[:phone]
|
192
192
|
billing_address
|
@@ -138,7 +138,7 @@ module ActiveMerchant #:nodoc:
|
|
138
138
|
name: creditcard.name
|
139
139
|
)
|
140
140
|
elsif creditcard.kind_of?(String)
|
141
|
-
if
|
141
|
+
if /^card_/.match?(creditcard)
|
142
142
|
post[:card_token] = get_card_token(creditcard)
|
143
143
|
else
|
144
144
|
post[:customer_token] = creditcard
|
@@ -253,7 +253,7 @@ module ActiveMerchant #:nodoc:
|
|
253
253
|
if node.has_elements?
|
254
254
|
node.elements.each { |e| parse_element(reply, e) }
|
255
255
|
else
|
256
|
-
if node.parent.name
|
256
|
+
if /item/.match?(node.parent.name)
|
257
257
|
parent = node.parent.name + (node.parent.attributes['id'] ? '_' + node.parent.attributes['id'] : '')
|
258
258
|
reply[(parent + '_' + node.name).to_sym] = node.text
|
259
259
|
else
|
@@ -230,13 +230,14 @@ module ActiveMerchant
|
|
230
230
|
def add_address_and_customer_info(xml, options)
|
231
231
|
billing_address = options[:billing_address] || options[:address]
|
232
232
|
shipping_address = options[:shipping_address]
|
233
|
+
ipv4_address = ipv4?(options[:ip]) ? options[:ip] : nil
|
233
234
|
|
234
|
-
return unless billing_address || shipping_address || options[:customer] || options[:invoice] ||
|
235
|
+
return unless billing_address || shipping_address || options[:customer] || options[:invoice] || ipv4_address
|
235
236
|
|
236
237
|
xml.tag! 'tssinfo' do
|
237
238
|
xml.tag! 'custnum', options[:customer] if options[:customer]
|
238
239
|
xml.tag! 'prodid', options[:invoice] if options[:invoice]
|
239
|
-
xml.tag! 'custipaddress', options[:ip] if
|
240
|
+
xml.tag! 'custipaddress', options[:ip] if ipv4_address
|
240
241
|
|
241
242
|
if billing_address
|
242
243
|
xml.tag! 'address', 'type' => 'billing' do
|
@@ -309,7 +310,7 @@ module ActiveMerchant
|
|
309
310
|
|
310
311
|
version = three_d_secure.fetch(:version, '')
|
311
312
|
xml.tag! 'mpi' do
|
312
|
-
if
|
313
|
+
if /^2/.match?(version)
|
313
314
|
xml.tag! 'authentication_value', three_d_secure[:cavv]
|
314
315
|
xml.tag! 'ds_trans_id', three_d_secure[:ds_transaction_id]
|
315
316
|
else
|
@@ -369,6 +370,12 @@ module ActiveMerchant
|
|
369
370
|
def sanitize_order_id(order_id)
|
370
371
|
order_id.to_s.gsub(/[^a-zA-Z0-9\-_]/, '')
|
371
372
|
end
|
373
|
+
|
374
|
+
def ipv4?(ip_address)
|
375
|
+
return false if ip_address.nil?
|
376
|
+
|
377
|
+
!ip_address.match(/\A\d+\.\d+\.\d+\.\d+\z/).nil?
|
378
|
+
end
|
372
379
|
end
|
373
380
|
end
|
374
381
|
end
|
@@ -565,7 +565,7 @@ module ActiveMerchant #:nodoc:
|
|
565
565
|
|
566
566
|
def clean_order_id(order_id)
|
567
567
|
cleansed = order_id.gsub(/[^\da-zA-Z]/, '')
|
568
|
-
if
|
568
|
+
if /^\d{4}/.match?(cleansed)
|
569
569
|
cleansed[0..11]
|
570
570
|
else
|
571
571
|
'%04d%s' % [rand(0..9999), cleansed[0...8]]
|
@@ -8,7 +8,7 @@ module ActiveMerchant #:nodoc:
|
|
8
8
|
|
9
9
|
class_attribute :test_periodic_url, :live_periodic_url
|
10
10
|
|
11
|
-
self.test_url = 'https://api.securepay.com.au/
|
11
|
+
self.test_url = 'https://test.api.securepay.com.au/xmlapi/payment'
|
12
12
|
self.live_url = 'https://api.securepay.com.au/xmlapi/payment'
|
13
13
|
|
14
14
|
self.test_periodic_url = 'https://test.securepay.com.au/xmlapi/periodic'
|
@@ -149,7 +149,7 @@ module ActiveMerchant #:nodoc:
|
|
149
149
|
def parse(response, action)
|
150
150
|
result = {}
|
151
151
|
document = REXML::Document.new(response)
|
152
|
-
response_element = document.root.get_elements("
|
152
|
+
response_element = document.root.get_elements("//*[@xsi:type='tns:#{action}Response']").first
|
153
153
|
response_element.elements.each do |element|
|
154
154
|
result[element.name.underscore] = element.text
|
155
155
|
end
|
@@ -80,6 +80,11 @@ module ActiveMerchant #:nodoc:
|
|
80
80
|
end
|
81
81
|
|
82
82
|
def authorize(money, payment, options = {})
|
83
|
+
if ach?(payment)
|
84
|
+
direct_bank_error = 'Direct bank account transactions are not supported for authorize.'
|
85
|
+
return Response.new(false, direct_bank_error)
|
86
|
+
end
|
87
|
+
|
83
88
|
MultiResponse.run do |r|
|
84
89
|
if payment.is_a?(ApplePayPaymentToken)
|
85
90
|
r.process { tokenize_apple_pay_token(payment) }
|
@@ -647,7 +652,7 @@ module ActiveMerchant #:nodoc:
|
|
647
652
|
add_expand_parameters(parameters, options) if parameters
|
648
653
|
response = api_request(method, url, parameters, options)
|
649
654
|
response['webhook_id'] = options[:webhook_id] if options[:webhook_id]
|
650
|
-
success = success_from(response)
|
655
|
+
success = success_from(response, options)
|
651
656
|
|
652
657
|
card = card_from_response(response)
|
653
658
|
avs_code = AVS_CODE_TRANSLATOR["line1: #{card["address_line1_check"]}, zip: #{card["address_zip_check"]}"]
|
@@ -681,7 +686,7 @@ module ActiveMerchant #:nodoc:
|
|
681
686
|
success ? 'Transaction approved' : response.fetch('error', {'message' => 'No error details'})['message']
|
682
687
|
end
|
683
688
|
|
684
|
-
def success_from(response)
|
689
|
+
def success_from(response, options)
|
685
690
|
!response.key?('error') && response['status'] != 'failed'
|
686
691
|
end
|
687
692
|
|
@@ -20,7 +20,9 @@ module ActiveMerchant #:nodoc:
|
|
20
20
|
add_capture_method(post, options)
|
21
21
|
add_confirmation_method(post, options)
|
22
22
|
add_customer(post, options)
|
23
|
-
add_payment_method_token(post, payment_method, options)
|
23
|
+
payment_method = add_payment_method_token(post, payment_method, options)
|
24
|
+
return payment_method if payment_method.is_a?(ActiveMerchant::Billing::Response)
|
25
|
+
|
24
26
|
add_metadata(post, options)
|
25
27
|
add_return_url(post, options)
|
26
28
|
add_connected_account(post, options)
|
@@ -41,7 +43,9 @@ module ActiveMerchant #:nodoc:
|
|
41
43
|
|
42
44
|
def confirm_intent(intent_id, payment_method, options = {})
|
43
45
|
post = {}
|
44
|
-
add_payment_method_token(post, payment_method, options)
|
46
|
+
payment_method = add_payment_method_token(post, payment_method, options)
|
47
|
+
return payment_method if payment_method.is_a?(ActiveMerchant::Billing::Response)
|
48
|
+
|
45
49
|
CONFIRM_INTENT_ATTRIBUTES.each do |attribute|
|
46
50
|
add_whitelisted_attribute(post, options, attribute)
|
47
51
|
end
|
@@ -65,7 +69,9 @@ module ActiveMerchant #:nodoc:
|
|
65
69
|
post = {}
|
66
70
|
add_amount(post, money, options)
|
67
71
|
|
68
|
-
add_payment_method_token(post, payment_method, options)
|
72
|
+
payment_method = add_payment_method_token(post, payment_method, options)
|
73
|
+
return payment_method if payment_method.is_a?(ActiveMerchant::Billing::Response)
|
74
|
+
|
69
75
|
add_payment_method_types(post, options)
|
70
76
|
add_customer(post, options)
|
71
77
|
add_metadata(post, options)
|
@@ -106,8 +112,22 @@ module ActiveMerchant #:nodoc:
|
|
106
112
|
end
|
107
113
|
|
108
114
|
def refund(money, intent_id, options = {})
|
109
|
-
|
110
|
-
|
115
|
+
if intent_id.include?('pi_')
|
116
|
+
intent = api_request(:get, "payment_intents/#{intent_id}", nil, options)
|
117
|
+
|
118
|
+
return Response.new(false, intent['error']['message'], intent) if intent['error']
|
119
|
+
|
120
|
+
charge_id = intent.try(:[], 'charges').try(:[], 'data').try(:[], 0).try(:[], 'id')
|
121
|
+
|
122
|
+
if charge_id.nil?
|
123
|
+
error_message = "No associated charge for #{intent['id']}"
|
124
|
+
error_message << "; payment_intent has a status of #{intent['status']}" if intent.try(:[], 'status') && intent.try(:[], 'status') != 'succeeded'
|
125
|
+
return Response.new(false, error_message, intent)
|
126
|
+
end
|
127
|
+
else
|
128
|
+
charge_id = intent_id
|
129
|
+
end
|
130
|
+
|
111
131
|
super(money, charge_id, options)
|
112
132
|
end
|
113
133
|
|
@@ -121,7 +141,9 @@ module ActiveMerchant #:nodoc:
|
|
121
141
|
# If customer option is provided, create a payment method and attach to customer id
|
122
142
|
# Otherwise, create a customer, then attach
|
123
143
|
if payment_method.is_a?(StripePaymentToken) || payment_method.is_a?(ActiveMerchant::Billing::CreditCard)
|
124
|
-
add_payment_method_token(params, payment_method, options)
|
144
|
+
payment_method = add_payment_method_token(params, payment_method, options)
|
145
|
+
return payment_method if payment_method.is_a?(ActiveMerchant::Billing::Response)
|
146
|
+
|
125
147
|
if options[:customer]
|
126
148
|
customer_id = options[:customer]
|
127
149
|
else
|
@@ -191,6 +213,8 @@ module ActiveMerchant #:nodoc:
|
|
191
213
|
|
192
214
|
if payment_method.is_a?(ActiveMerchant::Billing::CreditCard)
|
193
215
|
p = create_payment_method(payment_method, options)
|
216
|
+
return p unless p.success?
|
217
|
+
|
194
218
|
payment_method = p.params['id']
|
195
219
|
end
|
196
220
|
|
@@ -271,6 +295,16 @@ module ActiveMerchant #:nodoc:
|
|
271
295
|
|
272
296
|
options.merge(idempotency_key: "#{options[:idempotency_key]}-#{suffix}")
|
273
297
|
end
|
298
|
+
|
299
|
+
def success_from(response, options)
|
300
|
+
if response['status'] == 'requires_action' && !options[:execute_threed]
|
301
|
+
response['error'] = {}
|
302
|
+
response['error']['message'] = 'Received unexpected 3DS authentication response. Use the execute_threed option to initiate a proper 3DS flow.'
|
303
|
+
return false
|
304
|
+
end
|
305
|
+
|
306
|
+
super(response, options)
|
307
|
+
end
|
274
308
|
end
|
275
309
|
end
|
276
310
|
end
|
@@ -162,7 +162,7 @@ module ActiveMerchant #:nodoc:
|
|
162
162
|
end
|
163
163
|
|
164
164
|
def parse(body)
|
165
|
-
if
|
165
|
+
if /^ID:/.match?(body)
|
166
166
|
body.split('~').reduce(Hash.new) { |h, v|
|
167
167
|
m = v.match('(.*?):(.*)')
|
168
168
|
h.merge!(m[1].underscore.to_sym => m[2])
|
@@ -197,7 +197,7 @@ module ActiveMerchant #:nodoc:
|
|
197
197
|
end
|
198
198
|
|
199
199
|
def split_authorization(authorization)
|
200
|
-
if authorization
|
200
|
+
if /|/.match?(authorization)
|
201
201
|
identifier, amount = authorization.split('|')
|
202
202
|
[identifier, amount.to_i]
|
203
203
|
else
|
@@ -94,10 +94,12 @@ module ActiveMerchant #:nodoc:
|
|
94
94
|
r.process { refund_request(money, authorization, options) }
|
95
95
|
end
|
96
96
|
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
97
|
+
if !response.success? && options[:force_full_refund_if_unsettled] &&
|
98
|
+
response.params['last_event'] == 'AUTHORISED'
|
99
|
+
void(authorization, options)
|
100
|
+
else
|
101
|
+
response
|
102
|
+
end
|
101
103
|
end
|
102
104
|
|
103
105
|
# Credits only function on a Merchant ID/login/profile flagged for Payouts
|
@@ -404,7 +406,7 @@ module ActiveMerchant #:nodoc:
|
|
404
406
|
def add_three_d_secure(three_d_secure, xml)
|
405
407
|
xml.info3DSecure do
|
406
408
|
xml.threeDSVersion three_d_secure[:version]
|
407
|
-
if three_d_secure[:version]
|
409
|
+
if /^2/.match?(three_d_secure[:version])
|
408
410
|
xml.dsTransactionId three_d_secure[:ds_transaction_id]
|
409
411
|
else
|
410
412
|
xml.xid three_d_secure[:xid]
|
@@ -580,7 +582,7 @@ module ActiveMerchant #:nodoc:
|
|
580
582
|
xml = ssl_post(url, request, headers(options))
|
581
583
|
raw = parse(action, xml)
|
582
584
|
if options[:execute_threed]
|
583
|
-
raw[:cookie] = @cookie
|
585
|
+
raw[:cookie] = @cookie if defined?(@cookie)
|
584
586
|
raw[:session_id] = options[:session_id]
|
585
587
|
raw[:is3DSOrder] = true
|
586
588
|
end
|
@@ -17,7 +17,7 @@ module ActiveMerchant #:nodoc:
|
|
17
17
|
attr_accessor :payment_cryptogram, :eci, :transaction_id
|
18
18
|
attr_writer :source
|
19
19
|
|
20
|
-
SOURCES = %i(apple_pay android_pay google_pay)
|
20
|
+
SOURCES = %i(apple_pay android_pay google_pay network_token)
|
21
21
|
|
22
22
|
def source
|
23
23
|
if defined?(@source) && SOURCES.include?(@source)
|
@@ -73,52 +73,50 @@ module ActiveMerchant
|
|
73
73
|
headers['connection'] ||= 'close'
|
74
74
|
|
75
75
|
retry_exceptions(max_retries: max_retries, logger: logger, tag: tag) do
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
76
|
+
info "connection_http_method=#{method.to_s.upcase} connection_uri=#{endpoint}", tag
|
77
|
+
|
78
|
+
result = nil
|
79
|
+
|
80
|
+
realtime = Benchmark.realtime do
|
81
|
+
http.start unless http.started?
|
82
|
+
@ssl_connection = http.ssl_connection
|
83
|
+
info "connection_ssl_version=#{ssl_connection[:version]} connection_ssl_cipher=#{ssl_connection[:cipher]}", tag
|
84
|
+
|
85
|
+
result =
|
86
|
+
case method
|
87
|
+
when :get
|
88
|
+
raise ArgumentError, 'GET requests do not support a request body' if body
|
89
|
+
|
90
|
+
http.get(endpoint.request_uri, headers)
|
91
|
+
when :post
|
92
|
+
debug body
|
93
|
+
http.post(endpoint.request_uri, body, RUBY_184_POST_HEADERS.merge(headers))
|
94
|
+
when :put
|
95
|
+
debug body
|
96
|
+
http.put(endpoint.request_uri, body, headers)
|
97
|
+
when :patch
|
98
|
+
debug body
|
99
|
+
http.patch(endpoint.request_uri, body, headers)
|
100
|
+
when :delete
|
101
|
+
# It's kind of ambiguous whether the RFC allows bodies
|
102
|
+
# for DELETE requests. But Net::HTTP's delete method
|
103
|
+
# very unambiguously does not.
|
104
|
+
if body
|
93
105
|
debug body
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
http.put(endpoint.request_uri, body, headers)
|
98
|
-
when :patch
|
99
|
-
debug body
|
100
|
-
http.patch(endpoint.request_uri, body, headers)
|
101
|
-
when :delete
|
102
|
-
# It's kind of ambiguous whether the RFC allows bodies
|
103
|
-
# for DELETE requests. But Net::HTTP's delete method
|
104
|
-
# very unambiguously does not.
|
105
|
-
if body
|
106
|
-
debug body
|
107
|
-
req = Net::HTTP::Delete.new(endpoint.request_uri, headers)
|
108
|
-
req.body = body
|
109
|
-
http.request(req)
|
110
|
-
else
|
111
|
-
http.delete(endpoint.request_uri, headers)
|
112
|
-
end
|
106
|
+
req = Net::HTTP::Delete.new(endpoint.request_uri, headers)
|
107
|
+
req.body = body
|
108
|
+
http.request(req)
|
113
109
|
else
|
114
|
-
|
110
|
+
http.delete(endpoint.request_uri, headers)
|
115
111
|
end
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
debug result.body
|
120
|
-
result
|
112
|
+
else
|
113
|
+
raise ArgumentError, "Unsupported request method #{method.to_s.upcase}"
|
114
|
+
end
|
121
115
|
end
|
116
|
+
|
117
|
+
info '--> %d %s (%d %.4fs)' % [result.code, result.message, result.body ? result.body.length : 0, realtime], tag
|
118
|
+
debug result.body
|
119
|
+
result
|
122
120
|
end
|
123
121
|
ensure
|
124
122
|
info 'connection_request_total_time=%.4fs' % [Process.clock_gettime(Process::CLOCK_MONOTONIC) - request_start], tag
|
@@ -21,18 +21,16 @@ module ActiveMerchant
|
|
21
21
|
connection_errors = DEFAULT_CONNECTION_ERRORS.merge(options[:connection_exceptions] || {})
|
22
22
|
|
23
23
|
retry_network_exceptions(options) do
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
raise ActiveMerchant::ConnectionError.new(derived_error_message(connection_errors, e.class), e)
|
35
|
-
end
|
24
|
+
yield
|
25
|
+
rescue Errno::ECONNREFUSED => e
|
26
|
+
raise ActiveMerchant::RetriableConnectionError.new('The remote server refused the connection', e)
|
27
|
+
rescue OpenSSL::X509::CertificateError => e
|
28
|
+
NetworkConnectionRetries.log(options[:logger], :error, e.message, options[:tag])
|
29
|
+
raise ActiveMerchant::ClientCertificateError, 'The remote server did not accept the provided SSL certificate'
|
30
|
+
rescue Zlib::BufError
|
31
|
+
raise ActiveMerchant::InvalidResponseError, 'The remote server replied with an invalid response'
|
32
|
+
rescue *connection_errors.keys => e
|
33
|
+
raise ActiveMerchant::ConnectionError.new(derived_error_message(connection_errors, e.class), e)
|
36
34
|
end
|
37
35
|
end
|
38
36
|
|
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.
|
4
|
+
version: 1.108.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: 2020-
|
11
|
+
date: 2020-06-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -412,7 +412,8 @@ files:
|
|
412
412
|
homepage: http://activemerchant.org/
|
413
413
|
licenses:
|
414
414
|
- MIT
|
415
|
-
metadata:
|
415
|
+
metadata:
|
416
|
+
allowed_push_host: https://rubygems.org
|
416
417
|
post_install_message:
|
417
418
|
rdoc_options: []
|
418
419
|
require_paths:
|
@@ -421,7 +422,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
421
422
|
requirements:
|
422
423
|
- - ">="
|
423
424
|
- !ruby/object:Gem::Version
|
424
|
-
version: '2.
|
425
|
+
version: '2.5'
|
425
426
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
426
427
|
requirements:
|
427
428
|
- - ">="
|