am_credit_card 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +17 -0
- data/Gemfile +4 -0
- data/README.md +50 -0
- data/Rakefile +19 -0
- data/am_credit_card.gemspec +21 -0
- data/lib/active_merchant/billing/base.rb +27 -0
- data/lib/active_merchant/billing/credit_card.rb +260 -0
- data/lib/active_merchant/billing/credit_card_methods.rb +125 -0
- data/lib/active_merchant/billing/expiry_date.rb +34 -0
- data/lib/active_merchant/validateable.rb +81 -0
- data/lib/am_credit_card.rb +32 -0
- data/lib/am_credit_card_version.rb +3 -0
- data/test/test_helper.rb +174 -0
- data/test/unit/credit_card_methods_test.rb +195 -0
- data/test/unit/credit_card_test.rb +354 -0
- data/test/unit/expiry_date_test.rb +32 -0
- data/test/unit/validateable_test.rb +59 -0
- metadata +91 -0
@@ -0,0 +1,354 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class CreditCardTest < Test::Unit::TestCase
|
4
|
+
def setup
|
5
|
+
CreditCard.require_verification_value = false
|
6
|
+
@visa = credit_card("4779139500118580", :type => "visa")
|
7
|
+
@solo = credit_card("676700000000000000", :type => "solo", :issue_number => '01')
|
8
|
+
end
|
9
|
+
|
10
|
+
def teardown
|
11
|
+
CreditCard.require_verification_value = false
|
12
|
+
end
|
13
|
+
|
14
|
+
def test_constructor_should_properly_assign_values
|
15
|
+
c = credit_card
|
16
|
+
|
17
|
+
assert_equal "4242424242424242", c.number
|
18
|
+
assert_equal 9, c.month
|
19
|
+
assert_equal Time.now.year + 1, c.year
|
20
|
+
assert_equal "Longbob Longsen", c.name
|
21
|
+
assert_equal "visa", c.type
|
22
|
+
assert_valid c
|
23
|
+
end
|
24
|
+
|
25
|
+
def test_new_credit_card_should_not_be_valid
|
26
|
+
c = CreditCard.new
|
27
|
+
|
28
|
+
assert_not_valid c
|
29
|
+
assert_false c.errors.empty?
|
30
|
+
end
|
31
|
+
|
32
|
+
def test_should_be_a_valid_visa_card
|
33
|
+
assert_valid @visa
|
34
|
+
assert @visa.errors.empty?
|
35
|
+
end
|
36
|
+
|
37
|
+
def test_should_be_a_valid_solo_card
|
38
|
+
assert_valid @solo
|
39
|
+
assert @solo.errors.empty?
|
40
|
+
end
|
41
|
+
|
42
|
+
def test_cards_with_empty_names_should_not_be_valid
|
43
|
+
@visa.first_name = ''
|
44
|
+
@visa.last_name = ''
|
45
|
+
|
46
|
+
assert_not_valid @visa
|
47
|
+
assert_false @visa.errors.empty?
|
48
|
+
end
|
49
|
+
|
50
|
+
def test_should_be_able_to_access_errors_indifferently
|
51
|
+
@visa.first_name = ''
|
52
|
+
|
53
|
+
assert_not_valid @visa
|
54
|
+
assert @visa.errors.on(:first_name)
|
55
|
+
assert @visa.errors.on("first_name")
|
56
|
+
end
|
57
|
+
|
58
|
+
def test_should_be_able_to_liberate_a_bogus_card
|
59
|
+
c = credit_card('', :type => 'bogus')
|
60
|
+
assert_valid c
|
61
|
+
|
62
|
+
c.type = 'visa'
|
63
|
+
assert_not_valid c
|
64
|
+
end
|
65
|
+
|
66
|
+
def test_should_be_able_to_identify_invalid_card_numbers
|
67
|
+
@visa.number = nil
|
68
|
+
assert_not_valid @visa
|
69
|
+
|
70
|
+
@visa.number = "11112222333344ff"
|
71
|
+
assert_not_valid @visa
|
72
|
+
assert_false @visa.errors.on(:type)
|
73
|
+
assert @visa.errors.on(:number)
|
74
|
+
|
75
|
+
@visa.number = "111122223333444"
|
76
|
+
assert_not_valid @visa
|
77
|
+
assert_false @visa.errors.on(:type)
|
78
|
+
assert @visa.errors.on(:number)
|
79
|
+
|
80
|
+
@visa.number = "11112222333344444"
|
81
|
+
assert_not_valid @visa
|
82
|
+
assert_false @visa.errors.on(:type)
|
83
|
+
assert @visa.errors.on(:number)
|
84
|
+
end
|
85
|
+
|
86
|
+
def test_should_have_errors_with_invalid_card_type_for_otherwise_correct_number
|
87
|
+
@visa.type = 'master'
|
88
|
+
|
89
|
+
assert_not_valid @visa
|
90
|
+
assert_not_equal @visa.errors.on(:number), @visa.errors.on(:type)
|
91
|
+
end
|
92
|
+
|
93
|
+
def test_should_be_invalid_when_type_cannot_be_detected
|
94
|
+
@visa.number = nil
|
95
|
+
@visa.type = nil
|
96
|
+
|
97
|
+
assert_not_valid @visa
|
98
|
+
assert !@visa.errors.on(:type)
|
99
|
+
assert @visa.errors.on(:number)
|
100
|
+
assert_equal 'is required', @visa.errors.on(:number)
|
101
|
+
end
|
102
|
+
|
103
|
+
def test_should_be_a_valid_card_number
|
104
|
+
@visa.number = "4242424242424242"
|
105
|
+
|
106
|
+
assert_valid @visa
|
107
|
+
end
|
108
|
+
|
109
|
+
def test_should_require_a_valid_card_month
|
110
|
+
@visa.month = Time.now.utc.month
|
111
|
+
@visa.year = Time.now.utc.year
|
112
|
+
|
113
|
+
assert_valid @visa
|
114
|
+
end
|
115
|
+
|
116
|
+
def test_should_not_be_valid_with_empty_month
|
117
|
+
@visa.month = ''
|
118
|
+
|
119
|
+
assert_not_valid @visa
|
120
|
+
assert_equal 'is required', @visa.errors.on('month')
|
121
|
+
end
|
122
|
+
|
123
|
+
def test_should_not_be_valid_for_edge_month_cases
|
124
|
+
@visa.month = 13
|
125
|
+
@visa.year = Time.now.year
|
126
|
+
assert_not_valid @visa
|
127
|
+
assert @visa.errors.on('month')
|
128
|
+
|
129
|
+
@visa.month = 0
|
130
|
+
@visa.year = Time.now.year
|
131
|
+
assert_not_valid @visa
|
132
|
+
assert @visa.errors.on('month')
|
133
|
+
end
|
134
|
+
|
135
|
+
def test_should_be_invalid_with_empty_year
|
136
|
+
@visa.year = ''
|
137
|
+
assert_not_valid @visa
|
138
|
+
assert_equal 'is required', @visa.errors.on('year')
|
139
|
+
end
|
140
|
+
|
141
|
+
def test_should_not_be_valid_for_edge_year_cases
|
142
|
+
@visa.year = Time.now.year - 1
|
143
|
+
assert_not_valid @visa
|
144
|
+
assert @visa.errors.on('year')
|
145
|
+
|
146
|
+
@visa.year = Time.now.year + 21
|
147
|
+
assert_not_valid @visa
|
148
|
+
assert @visa.errors.on('year')
|
149
|
+
end
|
150
|
+
|
151
|
+
def test_should_be_a_valid_future_year
|
152
|
+
@visa.year = Time.now.year + 1
|
153
|
+
assert_valid @visa
|
154
|
+
end
|
155
|
+
|
156
|
+
def test_expired_card_should_have_one_error_on_year
|
157
|
+
@visa.year = Time.now.year - 1
|
158
|
+
assert_not_valid @visa
|
159
|
+
assert_equal 1, @visa.errors['year'].length
|
160
|
+
assert /expired/ =~ @visa.errors['year'].first
|
161
|
+
end
|
162
|
+
|
163
|
+
def test_should_be_valid_with_start_month_and_year_as_string
|
164
|
+
@solo.start_month = '2'
|
165
|
+
@solo.start_year = '2007'
|
166
|
+
assert_valid @solo
|
167
|
+
end
|
168
|
+
|
169
|
+
def test_should_identify_wrong_cardtype
|
170
|
+
c = credit_card(:type => 'master')
|
171
|
+
assert_not_valid c
|
172
|
+
end
|
173
|
+
|
174
|
+
def test_should_display_number
|
175
|
+
assert_equal 'XXXX-XXXX-XXXX-1234', CreditCard.new(:number => '1111222233331234').display_number
|
176
|
+
assert_equal 'XXXX-XXXX-XXXX-1234', CreditCard.new(:number => '111222233331234').display_number
|
177
|
+
assert_equal 'XXXX-XXXX-XXXX-1234', CreditCard.new(:number => '1112223331234').display_number
|
178
|
+
|
179
|
+
assert_equal 'XXXX-XXXX-XXXX-', CreditCard.new(:number => nil).display_number
|
180
|
+
assert_equal 'XXXX-XXXX-XXXX-', CreditCard.new(:number => '').display_number
|
181
|
+
assert_equal 'XXXX-XXXX-XXXX-123', CreditCard.new(:number => '123').display_number
|
182
|
+
assert_equal 'XXXX-XXXX-XXXX-1234', CreditCard.new(:number => '1234').display_number
|
183
|
+
assert_equal 'XXXX-XXXX-XXXX-1234', CreditCard.new(:number => '01234').display_number
|
184
|
+
end
|
185
|
+
|
186
|
+
def test_should_correctly_identify_card_type
|
187
|
+
assert_equal 'visa', CreditCard.type?('4242424242424242')
|
188
|
+
assert_equal 'american_express', CreditCard.type?('341111111111111')
|
189
|
+
assert_nil CreditCard.type?('')
|
190
|
+
end
|
191
|
+
|
192
|
+
def test_should_be_able_to_require_a_verification_value
|
193
|
+
CreditCard.require_verification_value = true
|
194
|
+
assert CreditCard.requires_verification_value?
|
195
|
+
end
|
196
|
+
|
197
|
+
def test_should_not_be_valid_when_requiring_a_verification_value
|
198
|
+
CreditCard.require_verification_value = true
|
199
|
+
card = credit_card('4242424242424242', :verification_value => nil)
|
200
|
+
assert_not_valid card
|
201
|
+
|
202
|
+
card.verification_value = '123'
|
203
|
+
assert_valid card
|
204
|
+
end
|
205
|
+
|
206
|
+
def test_should_require_valid_start_date_for_solo_or_switch
|
207
|
+
@solo.start_month = nil
|
208
|
+
@solo.start_year = nil
|
209
|
+
@solo.issue_number = nil
|
210
|
+
|
211
|
+
assert_not_valid @solo
|
212
|
+
assert @solo.errors.on('start_month')
|
213
|
+
assert @solo.errors.on('start_year')
|
214
|
+
assert @solo.errors.on('issue_number')
|
215
|
+
|
216
|
+
@solo.start_month = 2
|
217
|
+
@solo.start_year = 2007
|
218
|
+
assert_valid @solo
|
219
|
+
end
|
220
|
+
|
221
|
+
def test_should_require_a_valid_issue_number_for_solo_or_switch
|
222
|
+
@solo.start_month = nil
|
223
|
+
@solo.start_year = 2005
|
224
|
+
@solo.issue_number = nil
|
225
|
+
|
226
|
+
assert_not_valid @solo
|
227
|
+
assert @solo.errors.on('start_month')
|
228
|
+
assert @solo.errors.on('issue_number')
|
229
|
+
|
230
|
+
@solo.issue_number = 3
|
231
|
+
assert_valid @solo
|
232
|
+
end
|
233
|
+
|
234
|
+
def test_should_return_last_four_digits_of_card_number
|
235
|
+
ccn = CreditCard.new(:number => "4779139500118580")
|
236
|
+
assert_equal "8580", ccn.last_digits
|
237
|
+
end
|
238
|
+
|
239
|
+
def test_bogus_last_digits
|
240
|
+
ccn = CreditCard.new(:number => "1")
|
241
|
+
assert_equal "1", ccn.last_digits
|
242
|
+
end
|
243
|
+
|
244
|
+
def test_should_be_true_when_credit_card_has_a_first_name
|
245
|
+
c = CreditCard.new
|
246
|
+
assert_false c.first_name?
|
247
|
+
|
248
|
+
c = CreditCard.new(:first_name => 'James')
|
249
|
+
assert c.first_name?
|
250
|
+
end
|
251
|
+
|
252
|
+
def test_should_be_true_when_credit_card_has_a_last_name
|
253
|
+
c = CreditCard.new
|
254
|
+
assert_false c.last_name?
|
255
|
+
|
256
|
+
c = CreditCard.new(:last_name => 'Herdman')
|
257
|
+
assert c.last_name?
|
258
|
+
end
|
259
|
+
|
260
|
+
def test_should_test_for_a_full_name
|
261
|
+
c = CreditCard.new
|
262
|
+
assert_false c.name?
|
263
|
+
|
264
|
+
c = CreditCard.new(:first_name => 'James', :last_name => 'Herdman')
|
265
|
+
assert c.name?
|
266
|
+
end
|
267
|
+
|
268
|
+
def test_should_handle_full_name_when_first_or_last_is_missing
|
269
|
+
c = CreditCard.new(:first_name => 'James')
|
270
|
+
assert c.name?
|
271
|
+
assert_equal "James", c.name
|
272
|
+
|
273
|
+
c = CreditCard.new(:last_name => 'Herdman')
|
274
|
+
assert c.name?
|
275
|
+
assert_equal "Herdman", c.name
|
276
|
+
end
|
277
|
+
|
278
|
+
def test_should_assign_a_full_name
|
279
|
+
c = CreditCard.new :name => "James Herdman"
|
280
|
+
assert_equal "James", c.first_name
|
281
|
+
assert_equal "Herdman", c.last_name
|
282
|
+
|
283
|
+
c = CreditCard.new :name => "Rocket J. Squirrel"
|
284
|
+
assert_equal "Rocket J.", c.first_name
|
285
|
+
assert_equal "Squirrel", c.last_name
|
286
|
+
|
287
|
+
c = CreditCard.new :name => "Twiggy"
|
288
|
+
assert_equal "", c.first_name
|
289
|
+
assert_equal "Twiggy", c.last_name
|
290
|
+
end
|
291
|
+
|
292
|
+
# The following is a regression for a bug that raised an exception when
|
293
|
+
# a new credit card was validated
|
294
|
+
def test_validate_new_card
|
295
|
+
credit_card = CreditCard.new
|
296
|
+
|
297
|
+
assert_nothing_raised do
|
298
|
+
credit_card.validate
|
299
|
+
end
|
300
|
+
end
|
301
|
+
|
302
|
+
# The following is a regression for a bug where the keys of the
|
303
|
+
# credit card card_companies hash were not duped when detecting the type
|
304
|
+
def test_create_and_validate_credit_card_from_type
|
305
|
+
credit_card = CreditCard.new(:type => CreditCard.type?('4242424242424242'))
|
306
|
+
assert_nothing_raised do
|
307
|
+
credit_card.valid?
|
308
|
+
end
|
309
|
+
end
|
310
|
+
|
311
|
+
def test_autodetection_of_credit_card_type
|
312
|
+
credit_card = CreditCard.new(:number => '4242424242424242')
|
313
|
+
credit_card.valid?
|
314
|
+
assert_equal 'visa', credit_card.type
|
315
|
+
end
|
316
|
+
|
317
|
+
def test_card_type_should_not_be_autodetected_when_provided
|
318
|
+
credit_card = CreditCard.new(:number => '4242424242424242', :type => 'master')
|
319
|
+
credit_card.valid?
|
320
|
+
assert_equal 'master', credit_card.type
|
321
|
+
end
|
322
|
+
|
323
|
+
def test_detecting_bogus_card
|
324
|
+
credit_card = CreditCard.new(:number => '1')
|
325
|
+
credit_card.valid?
|
326
|
+
assert_equal 'bogus', credit_card.type
|
327
|
+
end
|
328
|
+
|
329
|
+
def test_validating_bogus_card
|
330
|
+
credit_card = credit_card('1', :type => nil)
|
331
|
+
assert credit_card.valid?
|
332
|
+
end
|
333
|
+
|
334
|
+
def test_mask_number
|
335
|
+
assert_equal 'XXXX-XXXX-XXXX-5100', CreditCard.mask('5105105105105100')
|
336
|
+
end
|
337
|
+
|
338
|
+
def test_strip_non_digit_characters
|
339
|
+
card = credit_card('4242-4242 %%%%%%4242......4242')
|
340
|
+
assert card.valid?
|
341
|
+
assert_equal "4242424242424242", card.number
|
342
|
+
end
|
343
|
+
|
344
|
+
def test_before_validate_handles_blank_number
|
345
|
+
card = credit_card(nil)
|
346
|
+
assert !card.valid?
|
347
|
+
assert_equal "", card.number
|
348
|
+
end
|
349
|
+
|
350
|
+
def test_type_is_aliased_as_brand
|
351
|
+
assert_equal @visa.type, @visa.brand
|
352
|
+
assert_equal @solo.type, @solo.brand
|
353
|
+
end
|
354
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class ExpiryDateTest < Test::Unit::TestCase
|
4
|
+
def test_should_be_expired
|
5
|
+
last_month = 2.months.ago
|
6
|
+
date = CreditCard::ExpiryDate.new(last_month.month, last_month.year)
|
7
|
+
assert date.expired?
|
8
|
+
end
|
9
|
+
|
10
|
+
def test_today_should_not_be_expired
|
11
|
+
today = Time.now.utc
|
12
|
+
date = CreditCard::ExpiryDate.new(today.month, today.year)
|
13
|
+
assert_false date.expired?
|
14
|
+
end
|
15
|
+
|
16
|
+
def test_dates_in_the_future_should_not_be_expired
|
17
|
+
next_month = 1.month.from_now
|
18
|
+
date = CreditCard::ExpiryDate.new(next_month.month, next_month.year)
|
19
|
+
assert_false date.expired?
|
20
|
+
end
|
21
|
+
|
22
|
+
def test_invalid_date
|
23
|
+
expiry = CreditCard::ExpiryDate.new(13, 2009)
|
24
|
+
assert_equal Time.at(0).utc, expiry.expiration
|
25
|
+
end
|
26
|
+
|
27
|
+
def test_month_and_year_coerced_to_integer
|
28
|
+
expiry = CreditCard::ExpiryDate.new("13", "2009")
|
29
|
+
assert_equal 13, expiry.month
|
30
|
+
assert_equal 2009, expiry.year
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,59 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class Dood
|
4
|
+
include ActiveMerchant::Validateable
|
5
|
+
|
6
|
+
attr_accessor :name, :email, :country
|
7
|
+
|
8
|
+
def validate
|
9
|
+
errors.add "name", "cannot be empty" if name.blank?
|
10
|
+
errors.add "email", "cannot be empty" if email.blank?
|
11
|
+
errors.add_to_base "The country cannot be blank" if country.blank?
|
12
|
+
end
|
13
|
+
|
14
|
+
end
|
15
|
+
|
16
|
+
class ValidateableTest < Test::Unit::TestCase
|
17
|
+
|
18
|
+
def setup
|
19
|
+
@dood = Dood.new
|
20
|
+
end
|
21
|
+
|
22
|
+
def test_validation
|
23
|
+
assert ! @dood.valid?
|
24
|
+
assert ! @dood.errors.empty?
|
25
|
+
end
|
26
|
+
|
27
|
+
def test_assigns
|
28
|
+
@dood = Dood.new(:name => "tobi", :email => "tobi@neech.de", :country => 'DE')
|
29
|
+
|
30
|
+
assert_equal "tobi", @dood.name
|
31
|
+
assert_equal "tobi@neech.de", @dood.email
|
32
|
+
assert @dood.valid?
|
33
|
+
end
|
34
|
+
|
35
|
+
def test_multiple_calls
|
36
|
+
@dood.name = "tobi"
|
37
|
+
assert !@dood.valid?
|
38
|
+
|
39
|
+
@dood.email = "tobi@neech.de"
|
40
|
+
assert !@dood.valid?
|
41
|
+
|
42
|
+
@dood.country = 'DE'
|
43
|
+
assert @dood.valid?
|
44
|
+
end
|
45
|
+
|
46
|
+
def test_messages
|
47
|
+
@dood.valid?
|
48
|
+
assert_equal "cannot be empty", @dood.errors.on('name')
|
49
|
+
assert_equal "cannot be empty", @dood.errors.on('email')
|
50
|
+
assert_equal nil, @dood.errors.on('doesnt_exist')
|
51
|
+
|
52
|
+
end
|
53
|
+
|
54
|
+
def test_full_messages
|
55
|
+
@dood.valid?
|
56
|
+
assert_equal ["Email cannot be empty", "Name cannot be empty", "The country cannot be blank"], @dood.errors.full_messages.sort
|
57
|
+
end
|
58
|
+
|
59
|
+
end
|
metadata
ADDED
@@ -0,0 +1,91 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: am_credit_card
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Paul Annesley
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2011-11-15 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: activesupport
|
16
|
+
requirement: &70105816630500 !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: 2.3.11
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: *70105816630500
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: i18n
|
27
|
+
requirement: &70105816629620 !ruby/object:Gem::Requirement
|
28
|
+
none: false
|
29
|
+
requirements:
|
30
|
+
- - ! '>='
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: '0'
|
33
|
+
type: :runtime
|
34
|
+
prerelease: false
|
35
|
+
version_requirements: *70105816629620
|
36
|
+
description: ActiveMerchant::Billing::CreditCard, without ActiveMerchant
|
37
|
+
email:
|
38
|
+
- paul@annesley.cc
|
39
|
+
executables: []
|
40
|
+
extensions: []
|
41
|
+
extra_rdoc_files: []
|
42
|
+
files:
|
43
|
+
- .gitignore
|
44
|
+
- Gemfile
|
45
|
+
- README.md
|
46
|
+
- Rakefile
|
47
|
+
- am_credit_card.gemspec
|
48
|
+
- lib/active_merchant/billing/base.rb
|
49
|
+
- lib/active_merchant/billing/credit_card.rb
|
50
|
+
- lib/active_merchant/billing/credit_card_methods.rb
|
51
|
+
- lib/active_merchant/billing/expiry_date.rb
|
52
|
+
- lib/active_merchant/validateable.rb
|
53
|
+
- lib/am_credit_card.rb
|
54
|
+
- lib/am_credit_card_version.rb
|
55
|
+
- test/test_helper.rb
|
56
|
+
- test/unit/credit_card_methods_test.rb
|
57
|
+
- test/unit/credit_card_test.rb
|
58
|
+
- test/unit/expiry_date_test.rb
|
59
|
+
- test/unit/validateable_test.rb
|
60
|
+
homepage: https://github.com/pda/am_credit_card
|
61
|
+
licenses: []
|
62
|
+
post_install_message:
|
63
|
+
rdoc_options: []
|
64
|
+
require_paths:
|
65
|
+
- lib
|
66
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
67
|
+
none: false
|
68
|
+
requirements:
|
69
|
+
- - ! '>='
|
70
|
+
- !ruby/object:Gem::Version
|
71
|
+
version: '0'
|
72
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
74
|
+
requirements:
|
75
|
+
- - ! '>='
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: '0'
|
78
|
+
requirements: []
|
79
|
+
rubyforge_project:
|
80
|
+
rubygems_version: 1.8.11
|
81
|
+
signing_key:
|
82
|
+
specification_version: 3
|
83
|
+
summary: ActiveMerchant has nice credit card validations, but also lots of dependencies
|
84
|
+
and other code. That's fine for those using the rest of ActiveMerchant, but if you're
|
85
|
+
just after it's credit card model/validations, this is for you.
|
86
|
+
test_files:
|
87
|
+
- test/test_helper.rb
|
88
|
+
- test/unit/credit_card_methods_test.rb
|
89
|
+
- test/unit/credit_card_test.rb
|
90
|
+
- test/unit/expiry_date_test.rb
|
91
|
+
- test/unit/validateable_test.rb
|