active_merchant_first_data 1.0.0 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -1,5 +1,5 @@
1
- First Data gateway for Active Merchant
2
- ======================================
1
+ First Data Latvia gateway for Active Merchant
2
+ =============================================
3
3
 
4
4
  [![Continuous Integration status](https://secure.travis-ci.org/ebeigarts/active_merchant_first_data.png)](http://travis-ci.org/ebeigarts/active_merchant_first_data)
5
5
 
@@ -32,14 +32,16 @@ require "active_merchant_first_data"
32
32
 
33
33
  3. Copy the 3 files you received in e-mail to `spec/certs/`:
34
34
 
35
- * 1234567.pem
36
- * 1234567_certificate_chain.p7.pem
37
- * ECOMM.pem
35
+ ```
36
+ 1234567.pem
37
+ 1234567_certificate_chain.p7.pem
38
+ ECOMM.pem
39
+ ```
38
40
 
39
41
  4. Convert the certificates and keys to `1234567_keystore.pem`
40
42
 
41
43
  ```bash
42
- $ openssl pkcs12 -export -in 1234567.pem -out spec/certs/1234567_keystore.p12 -certfile spec/certs/ECOMM.pem -inkey spec/certs/1234567_key.pem
44
+ $ openssl pkcs12 -export -in spec/certs/1234567.pem -out spec/certs/1234567_keystore.p12 -certfile spec/certs/ECOMM.pem -inkey spec/certs/1234567_key.pem
43
45
  Enter pass phrase for 1234567_key.pem: 81f174259v45
44
46
  Enter Export Password: <empty>
45
47
  ```
@@ -18,15 +18,60 @@ module ActiveMerchant #:nodoc:
18
18
  self.default_currency = '428' # LVL (http://en.wikipedia.org/wiki/ISO_4217)
19
19
  self.money_format = :cents
20
20
 
21
+ CURRENCY_CODES = {
22
+ 'ADP' => '020', 'AED' => '784', 'AFA' => '004', 'ALL' => '008', 'AMD' => '051',
23
+ 'ANG' => '532', 'AOA' => '973', 'ARS' => '032', 'AUD' => '036', 'AWG' => '533',
24
+ 'AZM' => '031', 'BAM' => '977', 'BBD' => '052', 'BDT' => '050', 'BGL' => '100',
25
+ 'BGN' => '975', 'BHD' => '048', 'BIF' => '108', 'BMD' => '060', 'BND' => '096',
26
+ 'BOB' => '068', 'BOV' => '984', 'BRL' => '986', 'BSD' => '044', 'BTN' => '064',
27
+ 'BWP' => '072', 'BYR' => '974', 'BZD' => '084', 'CAD' => '124', 'CDF' => '976',
28
+ 'CHF' => '756', 'CLF' => '990', 'CLP' => '152', 'CNY' => '156', 'COP' => '170',
29
+ 'CRC' => '188', 'CUP' => '192', 'CVE' => '132', 'CYP' => '196', 'CZK' => '203',
30
+ 'DJF' => '262', 'DKK' => '208', 'DOP' => '214', 'DZD' => '012', 'ECS' => '218',
31
+ 'ECV' => '983', 'EEK' => '233', 'EGP' => '818', 'ERN' => '232', 'ETB' => '230',
32
+ 'EUR' => '978', 'FJD' => '242', 'FKP' => '238', 'GBP' => '826', 'GEL' => '981',
33
+ 'GHC' => '288', 'GIP' => '292', 'GMD' => '270', 'GNF' => '324', 'GTQ' => '320',
34
+ 'GWP' => '624', 'GYD' => '328', 'HKD' => '344', 'HNL' => '340', 'HRK' => '191',
35
+ 'HTG' => '332', 'HUF' => '348', 'IDR' => '360', 'ILS' => '376', 'INR' => '356',
36
+ 'IQD' => '368', 'IRR' => '364', 'ISK' => '352', 'JMD' => '388', 'JOD' => '400',
37
+ 'JPY' => '392', 'KES' => '404', 'KGS' => '417', 'KHR' => '116', 'KMF' => '174',
38
+ 'KPW' => '408', 'KRW' => '410', 'KWD' => '414', 'KYD' => '136', 'KZT' => '398',
39
+ 'LAK' => '418', 'LBP' => '422', 'LKR' => '144', 'LRD' => '430', 'LSL' => '426',
40
+ 'LTL' => '440', 'LVL' => '428', 'LYD' => '434', 'MAD' => '504', 'MDL' => '498',
41
+ 'MGF' => '450', 'MKD' => '807', 'MMK' => '104', 'MNT' => '496', 'MOP' => '446',
42
+ 'MRO' => '478', 'MTL' => '470', 'MUR' => '480', 'MVR' => '462', 'MWK' => '454',
43
+ 'MXN' => '484', 'MXV' => '979', 'MYR' => '458', 'MZM' => '508', 'NAD' => '516',
44
+ 'NGN' => '566', 'NIO' => '558', 'NOK' => '578', 'NPR' => '524', 'NZD' => '554',
45
+ 'OMR' => '512', 'PAB' => '590', 'PEN' => '604', 'PGK' => '598', 'PHP' => '608',
46
+ 'PKR' => '586', 'PLN' => '985', 'PYG' => '600', 'QAR' => '634', 'ROL' => '642',
47
+ 'RUB' => '643', 'RUR' => '810', 'RWF' => '646', 'SAR' => '682', 'SBD' => '090',
48
+ 'SCR' => '690', 'SDD' => '736', 'SEK' => '752', 'SGD' => '702', 'SHP' => '654',
49
+ 'SIT' => '705', 'SKK' => '703', 'SLL' => '694', 'SOS' => '706', 'SRG' => '740',
50
+ 'STD' => '678', 'SVC' => '222', 'SYP' => '760', 'SZL' => '748', 'THB' => '764',
51
+ 'TJS' => '972', 'TMM' => '795', 'TND' => '788', 'TOP' => '776', 'TPE' => '626',
52
+ 'TRL' => '792', 'TRY' => '949', 'TTD' => '780', 'TWD' => '901', 'TZS' => '834',
53
+ 'UAH' => '980', 'UGX' => '800', 'USD' => '840', 'UYU' => '858', 'UZS' => '860',
54
+ 'VEB' => '862', 'VND' => '704', 'VUV' => '548', 'XAF' => '950', 'XCD' => '951',
55
+ 'XOF' => '952', 'XPF' => '953', 'YER' => '886', 'YUM' => '891', 'ZAR' => '710',
56
+ 'ZMK' => '894', 'ZWD' => '716'
57
+ }
58
+
59
+ class Error < StandardError
60
+ attr_reader :response
61
+
62
+ def initialize(response, msg=nil)
63
+ @response = response
64
+ super(msg || response[:error])
65
+ end
66
+ end
67
+
21
68
  # Creates a new FirstDataGateway
22
69
  #
23
70
  # The gateway requires that a valid pem and password be passed
24
71
  # in the +options+ hash.
25
72
  #
26
- # Options:
27
- #
28
- # * <tt>:pem</tt> -- The First Data cert/key (REQUIRED)
29
- # * <tt>:pem_password</tt> -- The First Data password. (REQUIRED)
73
+ # @option options [String] :pem First Data cert/key (REQUIRED)
74
+ # @option options [String] :pem_password First Data cert password (REQUIRED)
30
75
  #
31
76
  def initialize(options = {})
32
77
  requires!(options, :pem, :pem_password)
@@ -37,12 +82,13 @@ module ActiveMerchant #:nodoc:
37
82
  # Perform a purchase, which is essentially an authorization and capture in a single operation.
38
83
  #
39
84
  # Registering of SMS transaction
40
- # @param int $amount transaction amount in minor units, mandatory
41
- # @param int $currency transaction currency code, mandatory
42
- # @param string $ip clientís IP address, mandatory
43
- # @param string $desc description of transaction, optional
44
- # @param string $language authorization language identificator, optional
45
- # @return string TRANSACTION_ID
85
+ #
86
+ # @param [Integer] amount transaction amount in minor units, mandatory
87
+ # @option params [Integer, String] :currency transaction currency code, mandatory
88
+ # @option params [String] :client_ip_addr client's IP address, mandatory
89
+ # @option params [String] :description description of transaction, optional
90
+ # @option params [String] :language authorization language identificator, optional
91
+ # @return [ActiveSupport::HashWithIndifferentAccess] TRANSACTION_ID
46
92
  #
47
93
  def purchase(amount, params = {})
48
94
  params = params.reverse_merge(
@@ -50,6 +96,7 @@ module ActiveMerchant #:nodoc:
50
96
  :amount => amount,
51
97
  :currency => default_currency
52
98
  )
99
+ lookup_currency(params)
53
100
  requires!(params, :amount, :currency, :client_ip_addr)
54
101
  commit(params)
55
102
  end
@@ -58,12 +105,13 @@ module ActiveMerchant #:nodoc:
58
105
  # charge the card.
59
106
  #
60
107
  # Registering of DMS authorisation
61
- # @param int $amount transaction amount in minor units, mandatory
62
- # @param int $currency transaction currency code, mandatory
63
- # @param string $ip clientís IP address, mandatory
64
- # @param string $desc description of transaction, optional
65
- # @param string $language authorization language identificator, optional
66
- # @return string TRANSACTION_ID
108
+ #
109
+ # @param [Integer] amount transaction amount in minor units, mandatory
110
+ # @option params [Integer, String] :currency transaction currency code, mandatory
111
+ # @option params [String] :client_ip_addr client's IP address, mandatory
112
+ # @option params [String] :description description of transaction, optional
113
+ # @option params [String] :language authorization language identificator, optional
114
+ # @return [ActiveSupport::HashWithIndifferentAccess] TRANSACTION_ID
67
115
  #
68
116
  def authorize(amount, params = {})
69
117
  params = params.reverse_merge(
@@ -72,6 +120,7 @@ module ActiveMerchant #:nodoc:
72
120
  :amount => amount,
73
121
  :currency => default_currency
74
122
  )
123
+ lookup_currency(params)
75
124
  requires!(params, :amount, :currency, :client_ip_addr, :msg_type)
76
125
  commit(params)
77
126
  end
@@ -79,12 +128,13 @@ module ActiveMerchant #:nodoc:
79
128
  # Captures the funds from an authorized transaction.
80
129
  #
81
130
  # Making of DMS transaction
82
- # @param int $auth_id id of previously made successeful authorisation
83
- # @param int $amount transaction amount in minor units, mandatory
84
- # @param int $currency transaction currency code, mandatory
85
- # @param string $ip clientís IP address, mandatory
86
- # @param string $desc description of transaction, optional
87
- # @return string RESULT, RESULT_CODE, RRN, APPROVAL_CODE
131
+ #
132
+ # @param [Integer] amount transaction amount in minor units, mandatory
133
+ # @param [Integer] trans_id id of previously made successeful authorisation
134
+ # @option params [Integer, String] :currency transaction currency code, mandatory
135
+ # @option params [String] :client_ip_addr client's IP address, mandatory
136
+ # @option params [String] :description description of transaction, optional
137
+ # @return [ActiveSupport::HashWithIndifferentAccess] RESULT, RESULT_CODE, RRN, APPROVAL_CODE
88
138
  #
89
139
  def capture(amount, trans_id, params = {})
90
140
  params = params.reverse_merge(
@@ -94,15 +144,16 @@ module ActiveMerchant #:nodoc:
94
144
  :amount => amount,
95
145
  :currency => default_currency
96
146
  )
147
+ lookup_currency(params)
97
148
  requires!(params, :trans_id, :amount, :currency, :client_ip_addr)
98
149
  commit(params)
99
150
  end
100
151
 
101
152
  # Transaction result
102
153
  #
103
- # @param int $trans_id transaction identifier, mandatory
104
- # @param string $ip clientís IP address, mandatory
105
- # @return string RESULT, RESULT_CODE, 3DSECURE, AAV, RRN, APPROVAL_CODE
154
+ # @param [Integer] trans_id transaction identifier, mandatory
155
+ # @option params [String] :client_ip_addr client's IP address, mandatory
156
+ # @return [ActiveSupport::HashWithIndifferentAccess] RESULT, RESULT_CODE, 3DSECURE, AAV, RRN, APPROVAL_CODE
106
157
  #
107
158
  def result(trans_id, params = {})
108
159
  params = params.reverse_merge(
@@ -113,14 +164,15 @@ module ActiveMerchant #:nodoc:
113
164
  commit(params)
114
165
  end
115
166
 
116
- # credit() allows you to return money to a card that was previously billed.
167
+ # refund() allows you to return money to a card that was previously billed.
117
168
  #
118
169
  # Transaction reversal
119
- # @param int $trans_id transaction identifier, mandatory
120
- # @param int $amount transaction amount in minor units, mandatory
121
- # @return string RESULT, RESULT_CODE
122
170
  #
123
- def credit(amount, trans_id = nil)
171
+ # @param [Integer] amount transaction amount in minor units, mandatory
172
+ # @param [Integer] trans_id transaction identifier, mandatory
173
+ # @return [ActiveSupport::HashWithIndifferentAccess] RESULT, RESULT_CODE
174
+ #
175
+ def refund(amount, trans_id = nil)
124
176
  params = {
125
177
  :command => :r,
126
178
  :trans_id => trans_id,
@@ -130,6 +182,95 @@ module ActiveMerchant #:nodoc:
130
182
  commit(params)
131
183
  end
132
184
 
185
+ def credit(amount, trans_id = nil)
186
+ deprecated CREDIT_DEPRECATION_MESSAGE
187
+ refund(amount, trans_id)
188
+ end
189
+
190
+ # Register new recurring payment along with the first payment
191
+ #
192
+ # @param [Integer] amount transaction amount in minor units, mandatory (up to 12 digits)
193
+ # @option params [Integer, String] :currency transaction currency code, mandatory
194
+ # @option params [String] :client_ip_addr client's IP address, mandatory
195
+ # @option params [String] :description transaction details, mandatory (up to 125 characters)
196
+ # @option params [String] :biller_client_id recurring payment identifier, mandatory (up to 30 characters)
197
+ # @option params [String] :perspayee_expiry preferred deadline for a Recurring payment, mandatory (MMYY)
198
+ # (system will compare two expiry dates - recurring payment expiry date provided by Merchant and
199
+ # card expiry date provided by Cardholder. In response Merchant will receive back the earliest expiry dates of both).
200
+ # For example, Recurring payment date is 1214 but card expiry date 1213 then Merchant will receive back 1213.
201
+ # First Data system will save the earliest expiry date as Recurring payment expiry date.
202
+ # @option params [Integer] :perspayee_overwrite set to 1 to overwrite existing recurring payment card data
203
+ # together with payment, optional
204
+ # @option params [String] :language authorization language identificator, optional
205
+ # @return [ActiveSupport::HashWithIndifferentAccess] TRANSACTION_ID
206
+ #
207
+ # Afterwards when transaction result is requested then result response includes also RECC_PMNT_ID and RECC_PMNT_EXPIRY
208
+ #
209
+ def recurring(amount, params = {})
210
+ params = params.reverse_merge(
211
+ :command => :z,
212
+ :amount => amount,
213
+ :currency => default_currency,
214
+ :msg_type => 'SMS',
215
+ :perspayee_gen => 1
216
+ )
217
+ lookup_currency(params)
218
+ requires!(params, :amount, :currency, :client_ip_addr, :description, :biller_client_id, :perspayee_expiry)
219
+ commit(params)
220
+ end
221
+
222
+ # Execute subsequent recurring payment
223
+ #
224
+ # @param [Integer] amount transaction amount in minor units, mandatory (up to 12 digits)
225
+ # @option params [Integer, String] :currency transaction currency code, mandatory
226
+ # @option params [String] :client_ip_addr client's IP address, mandatory
227
+ # (the same IP address which was provided when registered recurring payment)
228
+ # @option params [String] :description transaction details, mandatory (up to 125 characters)
229
+ # @option params [String] :biller_client_id recurring payment identifier, mandatory (up to 30 characters)
230
+ # @return [ActiveSupport::HashWithIndifferentAccess] TRANSACTION_ID, RESULT, RESULT_CODE, RRN, APPROVAL_CODE
231
+ #
232
+ def execute_recurring(amount, params = {})
233
+ params = params.reverse_merge(
234
+ :command => :e,
235
+ :amount => amount,
236
+ :currency => default_currency
237
+ )
238
+ lookup_currency(params)
239
+ requires!(params, :amount, :currency, :client_ip_addr, :description, :biller_client_id)
240
+ commit(params)
241
+ end
242
+
243
+ # Overwriting existing recurring payment card data without payment
244
+ #
245
+ # @option params [Integer, String] :currency transaction currency code, mandatory
246
+ # @option params [String] :client_ip_addr client's IP address, mandatory
247
+ # @option params [String] :description transaction details, mandatory (up to 125 characters)
248
+ # @option params [String] :biller_client_id existing recurring payment identifier, mandatory (up to 30 characters)
249
+ # @option params [String] :perspayee_expiry preferred deadline for a Recurring payment, mandatory (MMYY)
250
+ # (system will compare two expiry dates - recurring payment expiry date provided by Merchant and
251
+ # card expiry date provided by Cardholder. In response Merchant will receive back the earliest expiry dates of both).
252
+ # For example, Recurring payment date is 1214 but card expiry date 1213 then Merchant will receive back 1213.
253
+ # First Data system will save the earliest expiry date as Recurring payment expiry date.
254
+ # @option params [String] :language authorization language identificator, optional
255
+ # @return [ActiveSupport::HashWithIndifferentAccess] TRANSACTION_ID
256
+ #
257
+ # Afterwards when transaction result is requested then result response includes also RECC_PMNT_ID and RECC_PMNT_EXPIRY
258
+ #
259
+ def update_recurring(params = {})
260
+ params = params.reverse_merge(
261
+ :command => :p,
262
+ :amount => 0,
263
+ :currency => default_currency,
264
+ :msg_type => 'SMS',
265
+ :msg_type => 'AUTH',
266
+ :perspayee_gen => 1,
267
+ :perspayee_overwrite => 1
268
+ )
269
+ lookup_currency(params)
270
+ requires!(params, :currency, :client_ip_addr, :description, :biller_client_id, :perspayee_expiry)
271
+ commit(params)
272
+ end
273
+
133
274
  # Close business day.
134
275
  def close_day
135
276
  commit({ :command => :b })
@@ -139,12 +280,18 @@ module ActiveMerchant #:nodoc:
139
280
  test? ? test_url : live_url
140
281
  end
141
282
 
142
- def redirect_url
143
- test? ? test_redirect_url : live_redirect_url
283
+ def redirect_url(trans_id = nil)
284
+ url = test? ? test_redirect_url : live_redirect_url
285
+ url += "?trans_id=#{CGI.escape trans_id}" if trans_id
286
+ url
144
287
  end
145
288
 
146
289
  private
147
290
 
291
+ def lookup_currency(params)
292
+ params[:currency] = CURRENCY_CODES[params[:currency]] || params[:currency]
293
+ end
294
+
148
295
  # Convert HTTP response body to a Ruby Hash.
149
296
  def parse(body)
150
297
  results = ActiveSupport::HashWithIndifferentAccess.new
@@ -157,7 +304,9 @@ module ActiveMerchant #:nodoc:
157
304
 
158
305
  def commit(params = {})
159
306
  response = parse(ssl_post(endpoint_url, post_data(params)))
160
- raise response[:error] unless response[:error].blank?
307
+ # FIXME: test cases 17 and 19 return unnecessary error even when result and result_code are present
308
+ # should be removed when this issue is fixed on gataway side
309
+ raise Error.new(response) if !response[:error].blank? && response[:result_code].blank?
161
310
  response
162
311
  end
163
312
 
metadata CHANGED
@@ -1,73 +1,97 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: active_merchant_first_data
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
5
4
  prerelease:
5
+ version: 1.1.0
6
6
  platform: ruby
7
7
  authors:
8
8
  - Edgars Beigarts
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2011-07-08 00:00:00.000000000 +03:00
13
- default_executable:
12
+ date: 2013-02-09 00:00:00.000000000 Z
14
13
  dependencies:
15
14
  - !ruby/object:Gem::Dependency
16
- name: activemerchant
17
- requirement: &2152366380 !ruby/object:Gem::Requirement
15
+ version_requirements: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ! '>='
18
+ - !ruby/object:Gem::Version
19
+ version: 1.15.0
18
20
  none: false
21
+ prerelease: false
22
+ name: activemerchant
23
+ requirement: !ruby/object:Gem::Requirement
19
24
  requirements:
20
25
  - - ! '>='
21
26
  - !ruby/object:Gem::Version
22
27
  version: 1.15.0
28
+ none: false
23
29
  type: :runtime
24
- prerelease: false
25
- version_requirements: *2152366380
26
30
  - !ruby/object:Gem::Dependency
27
- name: rake
28
- requirement: &2152366000 !ruby/object:Gem::Requirement
31
+ version_requirements: !ruby/object:Gem::Requirement
32
+ requirements:
33
+ - - ! '>='
34
+ - !ruby/object:Gem::Version
35
+ version: '0'
29
36
  none: false
37
+ prerelease: false
38
+ name: rake
39
+ requirement: !ruby/object:Gem::Requirement
30
40
  requirements:
31
41
  - - ! '>='
32
42
  - !ruby/object:Gem::Version
33
43
  version: '0'
44
+ none: false
34
45
  type: :development
35
- prerelease: false
36
- version_requirements: *2152366000
37
46
  - !ruby/object:Gem::Dependency
38
- name: rspec
39
- requirement: &2152365440 !ruby/object:Gem::Requirement
47
+ version_requirements: !ruby/object:Gem::Requirement
48
+ requirements:
49
+ - - ~>
50
+ - !ruby/object:Gem::Version
51
+ version: '2.10'
40
52
  none: false
53
+ prerelease: false
54
+ name: rspec
55
+ requirement: !ruby/object:Gem::Requirement
41
56
  requirements:
42
57
  - - ~>
43
58
  - !ruby/object:Gem::Version
44
- version: 2.6.0
59
+ version: '2.10'
60
+ none: false
45
61
  type: :development
46
- prerelease: false
47
- version_requirements: *2152365440
48
62
  - !ruby/object:Gem::Dependency
49
- name: vcr
50
- requirement: &2152365020 !ruby/object:Gem::Requirement
63
+ version_requirements: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - ~>
66
+ - !ruby/object:Gem::Version
67
+ version: '1.11'
51
68
  none: false
69
+ prerelease: false
70
+ name: vcr
71
+ requirement: !ruby/object:Gem::Requirement
52
72
  requirements:
53
- - - ! '>='
73
+ - - ~>
54
74
  - !ruby/object:Gem::Version
55
- version: '0'
75
+ version: '1.11'
76
+ none: false
56
77
  type: :development
57
- prerelease: false
58
- version_requirements: *2152365020
59
78
  - !ruby/object:Gem::Dependency
60
- name: fakeweb
61
- requirement: &2152364560 !ruby/object:Gem::Requirement
79
+ version_requirements: !ruby/object:Gem::Requirement
80
+ requirements:
81
+ - - ~>
82
+ - !ruby/object:Gem::Version
83
+ version: '1.3'
62
84
  none: false
85
+ prerelease: false
86
+ name: fakeweb
87
+ requirement: !ruby/object:Gem::Requirement
63
88
  requirements:
64
- - - ! '>='
89
+ - - ~>
65
90
  - !ruby/object:Gem::Version
66
- version: '0'
91
+ version: '1.3'
92
+ none: false
67
93
  type: :development
68
- prerelease: false
69
- version_requirements: *2152364560
70
- description: First Data gateway for Active Merchant
94
+ description: First Data Latvia gateway for Active Merchant
71
95
  email:
72
96
  - edgars.beigarts@makit.lv
73
97
  executables: []
@@ -78,7 +102,6 @@ files:
78
102
  - lib/active_merchant_first_data.rb
79
103
  - README.md
80
104
  - LICENSE
81
- has_rdoc: true
82
105
  homepage: https://github.com/ebeigarts/active_merchant_first_data
83
106
  licenses: []
84
107
  post_install_message:
@@ -86,21 +109,27 @@ rdoc_options: []
86
109
  require_paths:
87
110
  - lib
88
111
  required_ruby_version: !ruby/object:Gem::Requirement
89
- none: false
90
112
  requirements:
91
113
  - - ! '>='
92
114
  - !ruby/object:Gem::Version
93
115
  version: '0'
94
- required_rubygems_version: !ruby/object:Gem::Requirement
116
+ segments:
117
+ - 0
118
+ hash: 4550487914721957976
95
119
  none: false
120
+ required_rubygems_version: !ruby/object:Gem::Requirement
96
121
  requirements:
97
122
  - - ! '>='
98
123
  - !ruby/object:Gem::Version
99
124
  version: '0'
125
+ segments:
126
+ - 0
127
+ hash: 4550487914721957976
128
+ none: false
100
129
  requirements: []
101
130
  rubyforge_project:
102
- rubygems_version: 1.6.2
131
+ rubygems_version: 1.8.24
103
132
  signing_key:
104
133
  specification_version: 3
105
- summary: First Data gateway for Active Merchant
134
+ summary: First Data Latvia gateway for Active Merchant
106
135
  test_files: []