credit_card_validations 1.5.0 → 1.5.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +1 -0
- data/lib/credit_card_validations/card_rules.rb +12 -5
- data/lib/credit_card_validations/detector.rb +5 -6
- data/lib/credit_card_validations/version.rb +1 -1
- data/test/credit_card_validations_test.rb +72 -68
- data/test/fixtures/invalid_cards.yml +6 -0
- data/test/fixtures/valid_cards.yml +79 -0
- data/test/models/any_credit_card.rb +6 -0
- data/test/models/credit_card.rb +5 -0
- data/test/test_helper.rb +5 -1
- metadata +10 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9dc4aaa6683f8c4b1b0bcfea5ca31076fa3109f2
|
4
|
+
data.tar.gz: 33aba134c4e4b5e445f51796740ffe8477d6fdac
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2bf428e04e75942465f12bec35b449943bd3825c20ecc709364a937f861041284c16909430afb74fd0e9cf76492c7b6f167580d6a8179f6273d60e8def127a65
|
7
|
+
data.tar.gz: f164f228a43fd51410c03040b11f0b0cdb3c09dd1d9a3a2aa7e193f166eec3ad6d43dd9616b9ffef557d237d07089132a5a75c3ed6762eb1c40546fcdb98b030
|
data/README.md
CHANGED
@@ -34,6 +34,7 @@ The following issuing institutes are accepted:
|
|
34
34
|
Diners Club | :diners | http://en.wikipedia.org/wiki/Diners_Club_International
|
35
35
|
Dinner Club US | :diners_us | http://en.wikipedia.org/wiki/Diners_Club_International#MasterCard_alliance
|
36
36
|
Discover | :discover | http://en.wikipedia.org/wiki/Discover_Card
|
37
|
+
Hipercard | :hipercard | http://pt.wikipedia.org/wiki/Hipercard
|
37
38
|
JCB | :jcb | http://en.wikipedia.org/wiki/Japan_Credit_Bureau
|
38
39
|
Laser | :laser | http://en.wikipedia.org/wiki/Laser_%28debit_card%29
|
39
40
|
Maestro | :maestro | http://en.wikipedia.org/wiki/Maestro_%28debit_card%29
|
@@ -32,7 +32,8 @@ module CreditCardValidations
|
|
32
32
|
],
|
33
33
|
|
34
34
|
jcb: [
|
35
|
-
{length: [16], prefixes: ['3528', '3529', '353', '354', '355', '356', '357', '358'
|
35
|
+
{length: [15,16], prefixes: ['3528', '3529', '353', '354', '355', '356', '357', '358']},
|
36
|
+
{length: [15], prefixes: ['1800', '2131']}
|
36
37
|
],
|
37
38
|
|
38
39
|
|
@@ -52,11 +53,14 @@ module CreditCardValidations
|
|
52
53
|
maestro: [
|
53
54
|
{length: [12, 13, 14, 15, 16, 17, 18, 19], prefixes: ['5010', '5011', '5012', '5013', '5014', '5015', '5016', '5017', '5018',
|
54
55
|
'502', '503', '504', '505', '506', '507', '508',
|
55
|
-
'
|
56
|
+
'56','57', '58', '59',
|
57
|
+
'6010', '6012', '6013', '6014', '6015', '6016', '6017', '6018', '6019',
|
56
58
|
'602', '603', '604', '605', '6060',
|
57
59
|
'621', '627', '629',
|
58
|
-
'
|
59
|
-
'6760', '6761', '6762', '6763', '6764', '6765', '6766', '6768', '6769'
|
60
|
+
'670','671', '672','673', '674', '675', '677',
|
61
|
+
'6760', '6761', '6762', '6763', '6764', '6765', '6766', '6768', '6769',
|
62
|
+
'679'
|
63
|
+
]}
|
60
64
|
],
|
61
65
|
|
62
66
|
# Luhn validation are skipped for union pay cards because they have unknown generation algoritm
|
@@ -70,8 +74,11 @@ module CreditCardValidations
|
|
70
74
|
|
71
75
|
rupay: [
|
72
76
|
{length: [16], prefixes: ['6061', '6062', '6063', '6064', '6065', '6066', '6067', '6068', '6069', '607', '608'], skip_luhn: true}
|
77
|
+
],
|
78
|
+
|
79
|
+
hipercard: [
|
80
|
+
length: [19], prefixes: ['384']
|
73
81
|
]
|
74
|
-
|
75
82
|
}
|
76
83
|
end
|
77
84
|
end
|
@@ -53,12 +53,11 @@ module CreditCardValidations
|
|
53
53
|
length = Array.wrap(length)
|
54
54
|
rules[brand] = [] if rules[brand].blank?
|
55
55
|
rules[brand] << {length: length, regexp: compile_regexp(prefixes), prefixes: prefixes, skip_luhn: skip_luhn}
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
BOOLEAN_RULE
|
56
|
+
|
57
|
+
define_method "#{brand}?".to_sym do
|
58
|
+
valid?(brand)
|
59
|
+
end unless method_defined? "#{brand}?".to_sym
|
60
|
+
|
62
61
|
rules[brand]
|
63
62
|
end
|
64
63
|
end
|
@@ -1,80 +1,73 @@
|
|
1
1
|
require_relative 'test_helper'
|
2
|
+
require 'yaml'
|
2
3
|
|
3
4
|
class CreditCardValidationsTest < MiniTest::Test
|
4
5
|
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
6
|
+
|
7
|
+
def initialize name
|
8
|
+
super name
|
9
|
+
@test_valid_numbers = YAML.load_file File.join(File.dirname(__FILE__), 'fixtures/valid_cards.yml')
|
10
|
+
@test_invalid_numbers = YAML.load_file File.join(File.dirname(__FILE__), 'fixtures/invalid_cards.yml')
|
9
11
|
end
|
10
12
|
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
13
|
+
|
14
|
+
def test_card_luhn
|
15
|
+
@test_valid_numbers.each do |brand, card_numbers|
|
16
|
+
if has_luhn_check_rule?(brand)
|
17
|
+
card_numbers.each do |number|
|
18
|
+
assert luhn_valid?(detector(number).number), "#{number} failed luhn"
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
15
23
|
end
|
16
24
|
|
17
|
-
def
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
diners: ['3020 4169 3226 43', '30569309025904'],
|
23
|
-
amex: ['3782 8224 6310 005', '371449635398431'],
|
24
|
-
discover: ['6011 1111 1111 1117', '6011000990139424'],
|
25
|
-
maestro: ['6759 6498 2643 8453'],
|
26
|
-
jcb: ['3575 7591 5225 4876', '3566002020360505'],
|
27
|
-
solo: ['6767 6222 2222 2222 222'],
|
28
|
-
unionpay: ['6264-1852-1292-2132-067', '6288997715452584', '6269 9920 5813 4322'],
|
29
|
-
dankrot: ['5019717010103742'],
|
30
|
-
switch: ['6331101999990016'],
|
31
|
-
rupay: ['6076-6000-0619-9992']
|
32
|
-
}
|
33
|
-
end
|
34
|
-
|
35
|
-
def test_card_brand_detection
|
36
|
-
@test_numbers.each do |key, value|
|
37
|
-
value.each do |card_number|
|
38
|
-
assert detector(card_number).send("#{key}?")
|
39
|
-
assert_equal key, detector(card_number).brand
|
25
|
+
def test_card_if_credit_card_valid
|
26
|
+
@test_valid_numbers.each do |brand, card_numbers|
|
27
|
+
card_numbers.each do |card_number|
|
28
|
+
assert detector(card_number).send("#{brand}?"), "#{card_number} is #{brand}"
|
29
|
+
assert_equal brand, detector(card_number).brand, "#{card_number} detects as #{brand}"
|
40
30
|
end
|
41
31
|
end
|
42
32
|
end
|
43
33
|
|
44
|
-
def
|
45
|
-
|
34
|
+
def test_card_if_credit_card_invalid
|
35
|
+
@test_invalid_numbers.each do |card_number|
|
36
|
+
assert !detector(card_number).valid?
|
37
|
+
assert_nil detector(card_number).brand
|
38
|
+
@test_valid_numbers.keys.each do |brand|
|
39
|
+
assert !detector(card_number).send("#{brand}?")
|
40
|
+
end
|
41
|
+
end
|
46
42
|
end
|
47
43
|
|
48
44
|
def test_card_brand_detection_with_restriction
|
49
|
-
@
|
45
|
+
@test_valid_numbers.slice(:visa, :mastercard).each do |key, value|
|
50
46
|
assert_equal key, detector(value.first).brand(:visa, :mastercard)
|
51
47
|
end
|
52
48
|
|
53
|
-
@
|
49
|
+
@test_valid_numbers.except(:visa, :mastercard).each do |key, value|
|
54
50
|
assert_nil detector(value.first).brand(:visa, :mastercard)
|
55
51
|
end
|
56
52
|
end
|
57
53
|
|
58
54
|
def test_card_valid_method
|
59
|
-
@
|
55
|
+
@test_valid_numbers.each do |key, value|
|
60
56
|
value.each do |card_number|
|
61
57
|
assert detector(card_number).valid?(key)
|
62
58
|
assert detector(card_number).valid?
|
63
59
|
end
|
64
60
|
end
|
65
|
-
assert !detector('1111111111111111').valid?
|
66
61
|
end
|
67
62
|
|
68
|
-
|
69
63
|
def test_card_particular_brand_valid
|
70
|
-
assert !detector(@
|
71
|
-
assert !detector(@
|
64
|
+
assert !detector(@test_valid_numbers[:visa].first).valid?(:mastercard)
|
65
|
+
assert !detector(@test_valid_numbers[:mastercard].first).valid?(:visa)
|
72
66
|
end
|
73
67
|
|
74
|
-
|
75
68
|
def test_card_particular_brands_valid
|
76
|
-
assert detector(@
|
77
|
-
assert !detector(@
|
69
|
+
assert detector(@test_valid_numbers[:visa].first).valid?(:mastercard, :visa)
|
70
|
+
assert !detector(@test_valid_numbers[:visa].first).valid?(:mastercard, :amex)
|
78
71
|
end
|
79
72
|
|
80
73
|
#add rules which were not present before
|
@@ -89,59 +82,70 @@ class CreditCardValidationsTest < MiniTest::Test
|
|
89
82
|
assert !detector(voyager_test_card_number).mastercard?
|
90
83
|
end
|
91
84
|
|
85
|
+
def test_active_model_any_validator
|
86
|
+
cc = AnyCreditCard.new
|
87
|
+
cc.number='1'
|
88
|
+
assert !cc.valid?
|
89
|
+
cc.number = @test_valid_numbers[:mastercard].first
|
90
|
+
assert cc.valid?
|
91
|
+
end
|
92
|
+
|
92
93
|
def test_active_model_validator
|
93
|
-
cc =
|
94
|
-
cc.number = @
|
94
|
+
cc = CreditCard.new
|
95
|
+
cc.number = @test_valid_numbers[:maestro].first
|
95
96
|
assert cc.valid?
|
96
97
|
|
97
|
-
cc =
|
98
|
-
cc.number = @
|
98
|
+
cc = CreditCard.new
|
99
|
+
cc.number = @test_valid_numbers[:mastercard].first
|
99
100
|
assert !cc.valid?
|
100
101
|
assert cc.errors[:number].include?(cc.errors.generate_message(:number, :invalid))
|
101
102
|
|
102
|
-
|
103
|
-
cc = CreditCardModelAny.new
|
104
|
-
cc.number='1'
|
105
|
-
assert !cc.valid?
|
106
|
-
cc.number = @test_numbers[:mastercard].first
|
107
|
-
assert cc.valid?
|
108
|
-
|
109
103
|
end
|
110
104
|
|
111
105
|
def test_string_extension
|
106
|
+
assert !@test_valid_numbers[:mastercard].first.respond_to?(:credit_card_brand)
|
107
|
+
assert !@test_valid_numbers[:mastercard].first.respond_to?(:valid_credit_card_brand?)
|
112
108
|
require 'credit_card_validations/string'
|
113
|
-
assert_equal @
|
114
|
-
assert @
|
115
|
-
assert !@
|
109
|
+
assert_equal @test_valid_numbers[:mastercard].first.credit_card_brand, :mastercard
|
110
|
+
assert @test_valid_numbers[:mastercard].first.valid_credit_card_brand?(:mastercard)
|
111
|
+
assert !@test_valid_numbers[:mastercard].first.valid_credit_card_brand?(:visa, :amex)
|
116
112
|
end
|
117
113
|
|
114
|
+
def test_call_luhn
|
115
|
+
d = detector(@test_valid_numbers[:unionpay].first)
|
116
|
+
d.expects(:valid_luhn?).once
|
117
|
+
assert !d.valid?(:visa)
|
118
118
|
|
119
|
-
|
120
|
-
d
|
119
|
+
d.expects(:valid_luhn?).once
|
120
|
+
assert d.valid?(:visa, :unionpay)
|
121
|
+
end
|
121
122
|
|
123
|
+
def test_skip_luhn
|
124
|
+
d = detector(@test_valid_numbers[:unionpay].first)
|
122
125
|
d.expects(:valid_luhn?).never
|
123
126
|
assert d.valid?(:unionpay)
|
124
|
-
|
125
|
-
d.expects(:valid_luhn?).once
|
126
|
-
assert !d.valid?(:visa)
|
127
|
-
|
128
127
|
d.expects(:valid_luhn?).never
|
129
128
|
assert d.valid?(:unionpay, :visa)
|
130
|
-
|
131
|
-
d.expects(:valid_luhn?).once
|
132
|
-
assert d.valid?(:visa, :unionpay)
|
133
129
|
end
|
134
130
|
|
135
131
|
def test_mmi
|
136
|
-
d = detector(@
|
137
|
-
assert_equal d.issuer_category, CreditCardValidations::Mmi::ISSUER_CATEGORIES[
|
132
|
+
d = detector(@test_valid_numbers[:visa].first)
|
133
|
+
assert_equal d.issuer_category, CreditCardValidations::Mmi::ISSUER_CATEGORIES[d.number[0]]
|
138
134
|
end
|
139
135
|
|
140
136
|
protected
|
141
137
|
|
138
|
+
def luhn_valid?(number)
|
139
|
+
CreditCardValidations::Luhn.valid?(number)
|
140
|
+
end
|
141
|
+
|
142
142
|
def detector(number)
|
143
143
|
CreditCardValidations::Detector.new(number)
|
144
144
|
end
|
145
145
|
|
146
146
|
|
147
|
+
def has_luhn_check_rule?(brand)
|
148
|
+
CreditCardValidations::Detector.rules[brand].any? { |rule| !rule[:skip_luhn] }
|
149
|
+
end
|
150
|
+
|
147
151
|
end
|
@@ -0,0 +1,79 @@
|
|
1
|
+
---
|
2
|
+
:visa:
|
3
|
+
- 4012 8888 8888 1881
|
4
|
+
- 4111 1111 1111 1111
|
5
|
+
- 4222 2222 2222 2
|
6
|
+
- 4917 6100 0000 0000
|
7
|
+
:mastercard:
|
8
|
+
- 5274 5763 9425 9961
|
9
|
+
- 5555 5555 5555 4444
|
10
|
+
- 5105 1051 0510 5100
|
11
|
+
:diners:
|
12
|
+
- 3020 4169 3226 43
|
13
|
+
- 3021 8047 1965 57
|
14
|
+
- 3022 1511 5632 52
|
15
|
+
- 3600 0000 0000 08
|
16
|
+
- 3614 8900 6479 13
|
17
|
+
- 3670 0102 0000 00
|
18
|
+
- 3852 0000 0232 37
|
19
|
+
- 3056 9309 0259 04
|
20
|
+
- 3020 4169 3226 43
|
21
|
+
:amex:
|
22
|
+
- 3714 4963 5398 431
|
23
|
+
- 3787 3449 3671 000
|
24
|
+
- 3400 0000 0000 009
|
25
|
+
- 3411 1111 1111 111
|
26
|
+
- 3434 3434 3434 343
|
27
|
+
- 3468 2763 0435 344
|
28
|
+
- 3700 0000 0000 002
|
29
|
+
- 3700 0020 0000 000
|
30
|
+
- 3704 0726 9909 809
|
31
|
+
- 3705 5601 9309 221
|
32
|
+
- 3714 4963 5398 431
|
33
|
+
- 3742 0000 0000 004
|
34
|
+
- 3764 6228 0921 451
|
35
|
+
- 3777 5274 9896 404
|
36
|
+
- 3782 8224 6310 005
|
37
|
+
:discover:
|
38
|
+
- 6011 1111 1111 1117
|
39
|
+
- 6011 0009 9013 9424
|
40
|
+
- 6011 0000 0000 0004
|
41
|
+
- 6011 0004 0000 0000
|
42
|
+
- 6011 1532 1637 1980
|
43
|
+
- 6011 6011 6011 6611
|
44
|
+
- 6011 6874 8256 4166
|
45
|
+
- 6011 8148 3690 5651
|
46
|
+
:maestro:
|
47
|
+
- 6759 6498 2643 8453
|
48
|
+
- 5641 8200 0000 0005
|
49
|
+
- 5033 9619 8909 17
|
50
|
+
- 5868 2416 0825 5333 38
|
51
|
+
- 6799 9901 0000 0000 019
|
52
|
+
:jcb:
|
53
|
+
- 3575 7591 5225 4876
|
54
|
+
- 3566 0020 2036 0505
|
55
|
+
- 1800 0163 8277 392
|
56
|
+
- 3569 9900 0000 0009
|
57
|
+
- 3530 1113 3330 0000
|
58
|
+
:solo:
|
59
|
+
- 6767 6222 2222 2222 222
|
60
|
+
- 6334 5805 0000 0000
|
61
|
+
- 6334 9000 0000 0005
|
62
|
+
- 6334 7306 0000 0000 00
|
63
|
+
- 6767 6767 6767 6767 671
|
64
|
+
:unionpay:
|
65
|
+
- 6264 1852 1292 2132 067
|
66
|
+
- 6288 9977 1545 2584
|
67
|
+
- 6269 9920 5813 4322
|
68
|
+
:dankrot:
|
69
|
+
- 5019 7170 1010 3742
|
70
|
+
:switch:
|
71
|
+
- 6331 1019 9999 0016
|
72
|
+
:laser:
|
73
|
+
- 6304 9506 0000 0000 00
|
74
|
+
- 6304 9000 1774 0292 441
|
75
|
+
:rupay:
|
76
|
+
- 6076 6000 0619 9992
|
77
|
+
- 6070 5500 5000 0047
|
78
|
+
:hipercard:
|
79
|
+
- 3841 0058 9908 8180 330
|
data/test/test_helper.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: credit_card_validations
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.5.
|
4
|
+
version: 1.5.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Igor
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-12-
|
11
|
+
date: 2014-12-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activemodel
|
@@ -100,6 +100,10 @@ files:
|
|
100
100
|
- lib/credit_card_validations/string.rb
|
101
101
|
- lib/credit_card_validations/version.rb
|
102
102
|
- test/credit_card_validations_test.rb
|
103
|
+
- test/fixtures/invalid_cards.yml
|
104
|
+
- test/fixtures/valid_cards.yml
|
105
|
+
- test/models/any_credit_card.rb
|
106
|
+
- test/models/credit_card.rb
|
103
107
|
- test/test_helper.rb
|
104
108
|
homepage: https://github.com/Fivell/credit_card_validations
|
105
109
|
licenses:
|
@@ -127,4 +131,8 @@ specification_version: 4
|
|
127
131
|
summary: gem for credit card numbers validation, card brands detections
|
128
132
|
test_files:
|
129
133
|
- test/credit_card_validations_test.rb
|
134
|
+
- test/fixtures/invalid_cards.yml
|
135
|
+
- test/fixtures/valid_cards.yml
|
136
|
+
- test/models/any_credit_card.rb
|
137
|
+
- test/models/credit_card.rb
|
130
138
|
- test/test_helper.rb
|