credit_card_validations 1.4.1 → 1.4.2
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 +15 -0
- data/.travis.yml +0 -1
- data/README.md +3 -0
- data/credit_card_validations.gemspec +8 -6
- data/lib/credit_card_validations/card_rules.rb +55 -57
- data/lib/credit_card_validations/detector.rb +3 -3
- data/lib/credit_card_validations/version.rb +1 -1
- data/test/credit_card_validations_test.rb +39 -41
- metadata +27 -38
checksums.yaml
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
---
|
2
|
+
!binary "U0hBMQ==":
|
3
|
+
metadata.gz: !binary |-
|
4
|
+
NjAyN2VjODkxNmY1OWVhM2M2YjlhYTk0ZTE4ZDQ4Y2NkNjhkZGI0Ng==
|
5
|
+
data.tar.gz: !binary |-
|
6
|
+
NTM3MTY2NzdmYzBiODZiNTk0ODAyMzYxZTEyMDkwM2IwNGI2NTc5NA==
|
7
|
+
SHA512:
|
8
|
+
metadata.gz: !binary |-
|
9
|
+
YzY2Y2QwNTA2ZTc2NTFlNmM0NmNhYzBjZTUwNmFkNDU4MTY0YjIzMjBiNmUw
|
10
|
+
MTA1M2Y5ZGY2OWVjZTQxOTJmNDg1NjAxYTdkYWViODYxNTM2OWIwNjQwMDEz
|
11
|
+
MTE3MzViOTdjNzQwNmJiYjA4YWRlNmQyMDk3NGFjMDY5NDAxOWQ=
|
12
|
+
data.tar.gz: !binary |-
|
13
|
+
YWQ0OGIyODBhMmU0ZmM1ZGVkYzBjODA0Y2U1MTA4NzBiMmY0YzFmOWZiMTU2
|
14
|
+
ZmMxZTM2YWE5OTk0M2I3Mzg1NTA0MjIzYjc2NTQ0N2E5NGNhZTRjYjY4N2Fj
|
15
|
+
MjcyNDhmNjhhNmQ1Yzg2ZWFmM2JjODhlOWRlYzQ1MzYzY2JjNjU=
|
data/.travis.yml
CHANGED
data/README.md
CHANGED
@@ -11,17 +11,19 @@ Gem::Specification.new do |gem|
|
|
11
11
|
gem.description = %q{A ruby gem for validating credit card numbers (a port of ZF2 Zend\Validator\CreditCard)}
|
12
12
|
gem.summary = "gem for credit card numbers validation, card brands detections"
|
13
13
|
gem.homepage = "https://github.com/Fivell/credit_card_validations"
|
14
|
-
|
14
|
+
gem.license = 'MIT'
|
15
|
+
|
15
16
|
gem.files = `git ls-files`.split($/)
|
16
17
|
gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
|
17
18
|
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
18
19
|
gem.require_paths = ["lib"]
|
19
20
|
|
20
|
-
gem.add_dependency "activemodel", ">= 3.0", "< 4.1"
|
21
|
-
gem.add_dependency "activesupport", ">= 3.0", "< 4.1"
|
22
21
|
|
23
|
-
gem.
|
24
|
-
gem.
|
25
|
-
|
22
|
+
gem.add_dependency "activemodel", ">= 3.0", "<= 4.2"
|
23
|
+
gem.add_dependency "activesupport", ">= 3.0", "<= 4.2"
|
24
|
+
|
25
|
+
gem.add_development_dependency "test-unit",'~> 2.5'
|
26
|
+
gem.add_development_dependency "mocha", '~> 0.12'
|
27
|
+
gem.add_development_dependency 'rake', '~> 10'
|
26
28
|
|
27
29
|
end
|
@@ -1,62 +1,60 @@
|
|
1
1
|
module CreditCardValidations
|
2
2
|
module CardRules
|
3
3
|
######## most used brands #########
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
4
|
+
mattr_accessor :rules
|
5
|
+
|
6
|
+
self.rules = {
|
7
|
+
visa: [
|
8
|
+
{length: [16], prefixes: ['4']}
|
9
|
+
],
|
10
|
+
mastercard: [
|
11
|
+
{length: [16], prefixes: ['51', '52', '53', '54', '55']}
|
12
|
+
],
|
13
|
+
######## other brands ########
|
14
|
+
amex: [
|
15
|
+
{length: [15], prefixes: ['34', '37']}
|
16
|
+
],
|
17
|
+
|
18
|
+
diners: [
|
19
|
+
{length: [14], prefixes: ['300', '301', '302', '303', '304', '305', '36']},
|
20
|
+
],
|
21
|
+
|
22
|
+
#There are Diners Club (North America) cards that begin with 5. These are a joint venture between Diners Club and MasterCard, and are processed like a MasterCard
|
23
|
+
# will be removed in next major version
|
24
|
+
|
25
|
+
diners_us: [
|
26
|
+
{length: [16], prefixes: ['54', '55']}
|
27
|
+
],
|
28
|
+
|
29
|
+
discover: [
|
30
|
+
{length: [16], prefixes: ['6011', '644', '645', '646', '647', '648',
|
31
|
+
'649', '65']}
|
32
|
+
],
|
33
|
+
|
34
|
+
jcb: [
|
35
|
+
{length: [16], prefixes: ['3528', '3529', '353', '354', '355', '356', '357', '358']}
|
36
|
+
],
|
37
|
+
|
38
|
+
|
39
|
+
laser: [
|
40
|
+
{length: [16, 17, 18, 19], prefixes: ['6304', '6706', '6771', '6709']}
|
41
|
+
],
|
42
|
+
|
43
|
+
maestro: [
|
44
|
+
{length: [12, 13, 14, 15, 16, 17, 18, 19], prefixes: ['5018', '5020', '5038', '6304', '6759', '6761', '6762', '6763', '6764', '6765', '6766']}
|
45
|
+
],
|
46
|
+
|
47
|
+
solo: [
|
48
|
+
{length: [16, 18, 19], prefixes: ['6334', '6767']}
|
49
|
+
],
|
50
|
+
# Luhn validation are skipped for union pay cards because they have unknown generation algoritm
|
51
|
+
unionpay: [
|
52
|
+
{length: [16, 17, 18, 19], prefixes: ['622', '624', '625', '626', '628'], skip_validation: true}
|
53
|
+
],
|
54
|
+
|
55
|
+
dankrot: [
|
56
|
+
{length: [16], prefixes: ['5019']}
|
57
|
+
],
|
58
|
+
}
|
61
59
|
end
|
62
60
|
end
|
@@ -62,9 +62,9 @@ module CreditCardValidations
|
|
62
62
|
end
|
63
63
|
end
|
64
64
|
|
65
|
-
CardRules.
|
66
|
-
|
67
|
-
self.add_rule(
|
65
|
+
CardRules.rules.each do |name, rules|
|
66
|
+
rules.each do |rule_value|
|
67
|
+
self.add_rule(name, rule_value[:length], rule_value[:prefixes], rule_value[:skip_validation])
|
68
68
|
end
|
69
69
|
|
70
70
|
end
|
@@ -15,71 +15,71 @@ class CreditCardValidationsTest < Test::Unit::TestCase
|
|
15
15
|
validates :number, credit_card_number: {brands: [:amex, :maestro]}
|
16
16
|
end
|
17
17
|
|
18
|
-
|
19
|
-
|
20
|
-
class CreditCardModelAny
|
18
|
+
class CreditCardModelAny
|
21
19
|
attr_accessor :number
|
22
20
|
include ActiveModel::Validations
|
23
21
|
validates :number, presence: true, credit_card_number: true
|
24
|
-
end
|
25
|
-
|
22
|
+
end
|
26
23
|
|
27
24
|
def initialize name
|
28
25
|
super name
|
29
26
|
@test_numbers = {
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
27
|
+
visa: ['4012 8888 8888 1881','4111111111111111'],
|
28
|
+
mastercard: ['5274 5763 9425 9961', '5555-5555-5555-4444'],
|
29
|
+
diners: ['3020 4169 3226 43', '30569309025904'],
|
30
|
+
amex: ['3782 8224 6310 005', '371449635398431'],
|
31
|
+
discover: ['6011 1111 1111 1117','6011000990139424'],
|
32
|
+
maestro: ['6759 6498 2643 8453'],
|
33
|
+
jcb: ['3575 7591 5225 4876', '3566002020360505' ],
|
34
|
+
solo: ['6767 6222 2222 2222 222'],
|
35
|
+
unionpay: ['6264-1852-1292-2132-067', '6288997715452584', '6269 9920 5813 4322'],
|
36
|
+
dankrot: ['5019717010103742']
|
41
37
|
}
|
42
38
|
end
|
43
|
-
|
39
|
+
|
44
40
|
def test_card_brand_detection
|
45
41
|
@test_numbers.each do |key, value|
|
46
|
-
|
47
|
-
|
42
|
+
value.each do |card_number|
|
43
|
+
assert detector(card_number).send("#{key}?")
|
44
|
+
assert_equal key, detector(card_number).brand
|
45
|
+
end
|
48
46
|
end
|
49
47
|
end
|
50
|
-
|
48
|
+
|
51
49
|
def test_card_brand_is_nil_if_credit_card_invalid
|
52
50
|
assert_nil detector('1111111111111111').brand
|
53
51
|
end
|
54
|
-
|
52
|
+
|
55
53
|
def test_card_brand_detection_with_restriction
|
56
54
|
@test_numbers.slice(:visa, :mastercard).each do |key, value|
|
57
|
-
assert_equal key, detector(value).brand(:visa, :mastercard)
|
55
|
+
assert_equal key, detector(value.first).brand(:visa, :mastercard)
|
58
56
|
end
|
59
|
-
|
57
|
+
|
60
58
|
@test_numbers.except(:visa, :mastercard).each do |key, value|
|
61
|
-
assert_nil detector(value).brand(:visa, :mastercard)
|
59
|
+
assert_nil detector(value.first).brand(:visa, :mastercard)
|
62
60
|
end
|
63
61
|
end
|
64
|
-
|
62
|
+
|
65
63
|
def test_card_valid_method
|
66
64
|
@test_numbers.each do |key, value|
|
67
|
-
|
68
|
-
|
65
|
+
value.each do |card_number|
|
66
|
+
assert detector(card_number).valid?(key)
|
67
|
+
assert detector(card_number).valid?
|
68
|
+
end
|
69
69
|
end
|
70
70
|
assert !detector('1111111111111111').valid?
|
71
71
|
end
|
72
72
|
|
73
73
|
|
74
74
|
def test_card_particular_brand_valid
|
75
|
-
assert !detector(@test_numbers[:visa]).valid?(:mastercard)
|
76
|
-
assert !detector(@test_numbers[:mastercard]).valid?(:visa)
|
75
|
+
assert !detector(@test_numbers[:visa].first).valid?(:mastercard)
|
76
|
+
assert !detector(@test_numbers[:mastercard].first).valid?(:visa)
|
77
77
|
end
|
78
78
|
|
79
79
|
|
80
80
|
def test_card_particular_brands_valid
|
81
|
-
assert detector(@test_numbers[:visa]).valid?(:mastercard, :visa)
|
82
|
-
assert !detector(@test_numbers[:visa]).valid?(:mastercard, :amex)
|
81
|
+
assert detector(@test_numbers[:visa].first).valid?(:mastercard, :visa)
|
82
|
+
assert !detector(@test_numbers[:visa].first).valid?(:mastercard, :amex)
|
83
83
|
end
|
84
84
|
|
85
85
|
#add rules which were not present before
|
@@ -96,11 +96,11 @@ end
|
|
96
96
|
|
97
97
|
def test_active_model_validator
|
98
98
|
cc = CreditCardModel.new
|
99
|
-
cc.number = @test_numbers[:maestro]
|
99
|
+
cc.number = @test_numbers[:maestro].first
|
100
100
|
assert cc.valid?
|
101
101
|
|
102
102
|
cc = CreditCardModel.new
|
103
|
-
cc.number = @test_numbers[:mastercard]
|
103
|
+
cc.number = @test_numbers[:mastercard].first
|
104
104
|
assert !cc.valid?
|
105
105
|
assert cc.errors[:number].include?(cc.errors.generate_message(:number, :invalid))
|
106
106
|
|
@@ -108,33 +108,31 @@ end
|
|
108
108
|
cc = CreditCardModelAny.new
|
109
109
|
cc.number='1'
|
110
110
|
assert !cc.valid?
|
111
|
-
cc.number = @test_numbers[:mastercard]
|
111
|
+
cc.number = @test_numbers[:mastercard].first
|
112
112
|
assert cc.valid?
|
113
113
|
|
114
114
|
end
|
115
115
|
|
116
116
|
def test_string_extension
|
117
117
|
require 'credit_card_validations/string'
|
118
|
-
assert_equal @test_numbers[:mastercard].credit_card_brand, :mastercard
|
119
|
-
assert @test_numbers[:mastercard].valid_credit_card_brand?(:mastercard)
|
120
|
-
assert !@test_numbers[:mastercard].valid_credit_card_brand?(:visa, :amex)
|
118
|
+
assert_equal @test_numbers[:mastercard].first.credit_card_brand, :mastercard
|
119
|
+
assert @test_numbers[:mastercard].first.valid_credit_card_brand?(:mastercard)
|
120
|
+
assert !@test_numbers[:mastercard].first.valid_credit_card_brand?(:visa, :amex)
|
121
121
|
end
|
122
122
|
|
123
123
|
|
124
124
|
def test_skip_validation
|
125
|
-
d = detector(@test_numbers[:unionpay])
|
125
|
+
d = detector(@test_numbers[:unionpay].first)
|
126
|
+
|
126
127
|
d.expects(:valid_luhn?).never
|
127
128
|
assert d.valid?(:unionpay)
|
128
129
|
|
129
|
-
d = detector(@test_numbers[:unionpay])
|
130
130
|
d.expects(:valid_luhn?).once
|
131
131
|
assert !d.valid?(:visa)
|
132
132
|
|
133
|
-
d = detector(@test_numbers[:unionpay])
|
134
133
|
d.expects(:valid_luhn?).never
|
135
134
|
assert d.valid?(:unionpay, :visa)
|
136
135
|
|
137
|
-
d = detector(@test_numbers[:unionpay])
|
138
136
|
d.expects(:valid_luhn?).once
|
139
137
|
assert d.valid?(:visa, :unionpay)
|
140
138
|
end
|
metadata
CHANGED
@@ -1,108 +1,97 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: credit_card_validations
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.4.
|
5
|
-
prerelease:
|
4
|
+
version: 1.4.2
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Igor
|
9
8
|
autorequire:
|
10
9
|
bindir: bin
|
11
10
|
cert_chain: []
|
12
|
-
date:
|
11
|
+
date: 2014-06-03 00:00:00.000000000 Z
|
13
12
|
dependencies:
|
14
13
|
- !ruby/object:Gem::Dependency
|
15
14
|
name: activemodel
|
16
15
|
requirement: !ruby/object:Gem::Requirement
|
17
|
-
none: false
|
18
16
|
requirements:
|
19
17
|
- - ! '>='
|
20
18
|
- !ruby/object:Gem::Version
|
21
19
|
version: '3.0'
|
22
|
-
- -
|
20
|
+
- - <=
|
23
21
|
- !ruby/object:Gem::Version
|
24
|
-
version: '4.
|
22
|
+
version: '4.2'
|
25
23
|
type: :runtime
|
26
24
|
prerelease: false
|
27
25
|
version_requirements: !ruby/object:Gem::Requirement
|
28
|
-
none: false
|
29
26
|
requirements:
|
30
27
|
- - ! '>='
|
31
28
|
- !ruby/object:Gem::Version
|
32
29
|
version: '3.0'
|
33
|
-
- -
|
30
|
+
- - <=
|
34
31
|
- !ruby/object:Gem::Version
|
35
|
-
version: '4.
|
32
|
+
version: '4.2'
|
36
33
|
- !ruby/object:Gem::Dependency
|
37
34
|
name: activesupport
|
38
35
|
requirement: !ruby/object:Gem::Requirement
|
39
|
-
none: false
|
40
36
|
requirements:
|
41
37
|
- - ! '>='
|
42
38
|
- !ruby/object:Gem::Version
|
43
39
|
version: '3.0'
|
44
|
-
- -
|
40
|
+
- - <=
|
45
41
|
- !ruby/object:Gem::Version
|
46
|
-
version: '4.
|
42
|
+
version: '4.2'
|
47
43
|
type: :runtime
|
48
44
|
prerelease: false
|
49
45
|
version_requirements: !ruby/object:Gem::Requirement
|
50
|
-
none: false
|
51
46
|
requirements:
|
52
47
|
- - ! '>='
|
53
48
|
- !ruby/object:Gem::Version
|
54
49
|
version: '3.0'
|
55
|
-
- -
|
50
|
+
- - <=
|
56
51
|
- !ruby/object:Gem::Version
|
57
|
-
version: '4.
|
52
|
+
version: '4.2'
|
58
53
|
- !ruby/object:Gem::Dependency
|
59
54
|
name: test-unit
|
60
55
|
requirement: !ruby/object:Gem::Requirement
|
61
|
-
none: false
|
62
56
|
requirements:
|
63
|
-
- -
|
57
|
+
- - ~>
|
64
58
|
- !ruby/object:Gem::Version
|
65
|
-
version: '
|
59
|
+
version: '2.5'
|
66
60
|
type: :development
|
67
61
|
prerelease: false
|
68
62
|
version_requirements: !ruby/object:Gem::Requirement
|
69
|
-
none: false
|
70
63
|
requirements:
|
71
|
-
- -
|
64
|
+
- - ~>
|
72
65
|
- !ruby/object:Gem::Version
|
73
|
-
version: '
|
66
|
+
version: '2.5'
|
74
67
|
- !ruby/object:Gem::Dependency
|
75
68
|
name: mocha
|
76
69
|
requirement: !ruby/object:Gem::Requirement
|
77
|
-
none: false
|
78
70
|
requirements:
|
79
|
-
- -
|
71
|
+
- - ~>
|
80
72
|
- !ruby/object:Gem::Version
|
81
|
-
version: '0'
|
73
|
+
version: '0.12'
|
82
74
|
type: :development
|
83
75
|
prerelease: false
|
84
76
|
version_requirements: !ruby/object:Gem::Requirement
|
85
|
-
none: false
|
86
77
|
requirements:
|
87
|
-
- -
|
78
|
+
- - ~>
|
88
79
|
- !ruby/object:Gem::Version
|
89
|
-
version: '0'
|
80
|
+
version: '0.12'
|
90
81
|
- !ruby/object:Gem::Dependency
|
91
82
|
name: rake
|
92
83
|
requirement: !ruby/object:Gem::Requirement
|
93
|
-
none: false
|
94
84
|
requirements:
|
95
|
-
- -
|
85
|
+
- - ~>
|
96
86
|
- !ruby/object:Gem::Version
|
97
|
-
version: '
|
87
|
+
version: '10'
|
98
88
|
type: :development
|
99
89
|
prerelease: false
|
100
90
|
version_requirements: !ruby/object:Gem::Requirement
|
101
|
-
none: false
|
102
91
|
requirements:
|
103
|
-
- -
|
92
|
+
- - ~>
|
104
93
|
- !ruby/object:Gem::Version
|
105
|
-
version: '
|
94
|
+
version: '10'
|
106
95
|
description: A ruby gem for validating credit card numbers (a port of ZF2 Zend\Validator\CreditCard)
|
107
96
|
email:
|
108
97
|
- fedoronchuk@gmail.com
|
@@ -126,28 +115,28 @@ files:
|
|
126
115
|
- lib/credit_card_validations/version.rb
|
127
116
|
- test/credit_card_validations_test.rb
|
128
117
|
homepage: https://github.com/Fivell/credit_card_validations
|
129
|
-
licenses:
|
118
|
+
licenses:
|
119
|
+
- MIT
|
120
|
+
metadata: {}
|
130
121
|
post_install_message:
|
131
122
|
rdoc_options: []
|
132
123
|
require_paths:
|
133
124
|
- lib
|
134
125
|
required_ruby_version: !ruby/object:Gem::Requirement
|
135
|
-
none: false
|
136
126
|
requirements:
|
137
127
|
- - ! '>='
|
138
128
|
- !ruby/object:Gem::Version
|
139
129
|
version: '0'
|
140
130
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
141
|
-
none: false
|
142
131
|
requirements:
|
143
132
|
- - ! '>='
|
144
133
|
- !ruby/object:Gem::Version
|
145
134
|
version: '0'
|
146
135
|
requirements: []
|
147
136
|
rubyforge_project:
|
148
|
-
rubygems_version:
|
137
|
+
rubygems_version: 2.2.0
|
149
138
|
signing_key:
|
150
|
-
specification_version:
|
139
|
+
specification_version: 4
|
151
140
|
summary: gem for credit card numbers validation, card brands detections
|
152
141
|
test_files:
|
153
142
|
- test/credit_card_validations_test.rb
|