creditcard-identifier 2.0.1 → 2.2.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/README.md +18 -0
- data/lib/creditcard_identifier/brands.rb +207 -25
- data/lib/creditcard_identifier/brands_detailed.rb +25117 -321
- data/lib/creditcard_identifier.rb +53 -3
- metadata +2 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: eeb429f9281142942cbd4ad498d415acd95e0459ceb90bd50a692b8cc268410a
|
|
4
|
+
data.tar.gz: 1b7a83a04668a633a08eb27c71858e10940ed8d6e40136a68f130720ca758251
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: fadfb663cfb3403e8c66f6216aba4c27249c3c67cd24ce3f8497b5d8c177c0dc1446d620e0580fc9eae8bb5164713065025ef434cecf8e47efe975b2a7726187
|
|
7
|
+
data.tar.gz: 4b571b66cdb0ef013686c321812cf8de15a232cbd2d72d4286369dabdb6ef5daab3f67f80950f315497f3de4973381b0b5a28648f3dc6d377a52aea34dfdca04
|
data/README.md
CHANGED
|
@@ -89,6 +89,14 @@ puts detailed
|
|
|
89
89
|
brands = validator.list_brands
|
|
90
90
|
puts brands
|
|
91
91
|
# ['amex', 'aura', 'banesecard', 'diners', 'discover', 'elo', 'hipercard', 'jcb', 'maestro', 'mastercard', 'unionpay', 'visa']
|
|
92
|
+
|
|
93
|
+
# Validate card number using Luhn algorithm
|
|
94
|
+
is_valid = CreditcardIdentifier.luhn('4012001037141112')
|
|
95
|
+
puts is_valid # true
|
|
96
|
+
|
|
97
|
+
# Or using validator instance
|
|
98
|
+
is_valid = validator.luhn('4012001037141112')
|
|
99
|
+
puts is_valid # true
|
|
92
100
|
```
|
|
93
101
|
|
|
94
102
|
## API
|
|
@@ -163,6 +171,16 @@ List all supported brands.
|
|
|
163
171
|
|
|
164
172
|
**Returns:** (Array<String>) List of brand names
|
|
165
173
|
|
|
174
|
+
#### `luhn(number)`
|
|
175
|
+
Validate a credit card number using the Luhn algorithm.
|
|
176
|
+
|
|
177
|
+
**Parameters:**
|
|
178
|
+
- `number` (String): Credit card number (digits only)
|
|
179
|
+
|
|
180
|
+
**Returns:** (Boolean) true if valid according to Luhn algorithm
|
|
181
|
+
|
|
182
|
+
**Raises:** TypeError if input is not a string
|
|
183
|
+
|
|
166
184
|
## Data Source
|
|
167
185
|
|
|
168
186
|
This library uses the BIN data from the [bin-cc project](https://github.com/renatovico/bin-cc).
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
3
|
# Auto-generated by bin-cc build - DO NOT EDIT
|
|
4
|
-
# Generated: 2026-01-
|
|
4
|
+
# Generated: 2026-01-14T23:56:46.018Z
|
|
5
5
|
|
|
6
6
|
module CreditcardIdentifier
|
|
7
7
|
# Credit card brand data
|
|
@@ -14,10 +14,38 @@ module CreditcardIdentifier
|
|
|
14
14
|
regexp_cvv: /\A\d{4}\z/,
|
|
15
15
|
},
|
|
16
16
|
{
|
|
17
|
-
name: "
|
|
17
|
+
name: "bankcard",
|
|
18
|
+
priority_over: [],
|
|
19
|
+
regexp_bin: /\A(5610|56022[1-5])/,
|
|
20
|
+
regexp_full: /\A(?=.{16}$)(?:5610|56022[1-5])[0-9]*\z/,
|
|
21
|
+
regexp_cvv: /\A\d{3}\z/,
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
name: "cabal",
|
|
25
|
+
priority_over: ["maestro"],
|
|
26
|
+
regexp_bin: /\A(604400|627170|603522|589657|(60420[1-9]|6042[1][0-9])|(6043[0-9]{2}))/,
|
|
27
|
+
regexp_full: /\A(?=.{16}$)(?:604400|627170|603522|589657|(60420[1-9]|6042[1][0-9])|(6043[0-9]{2}))[0-9]*\z/,
|
|
28
|
+
regexp_cvv: /\A\d{3}\z/,
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
name: "china-t-union",
|
|
32
|
+
priority_over: [],
|
|
33
|
+
regexp_bin: /\A(31)/,
|
|
34
|
+
regexp_full: /\A(?=.{19}$)(?:31)[0-9]*\z/,
|
|
35
|
+
regexp_cvv: /\A\d{3}\z/,
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
name: "dankort",
|
|
39
|
+
priority_over: ["visa"],
|
|
40
|
+
regexp_bin: /\A(5019|4571)/,
|
|
41
|
+
regexp_full: /\A(?=.{16}$)(?:5019|4571)[0-9]*\z/,
|
|
42
|
+
regexp_cvv: /\A\d{3}\z/,
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
name: "diners-enroute",
|
|
18
46
|
priority_over: [],
|
|
19
|
-
regexp_bin: /\A(
|
|
20
|
-
regexp_full: /\A(?=.{
|
|
47
|
+
regexp_bin: /\A(2014|2149)/,
|
|
48
|
+
regexp_full: /\A(?=.{15}$)(?:2014|2149)[0-9]*\z/,
|
|
21
49
|
regexp_cvv: /\A\d{3}\z/,
|
|
22
50
|
},
|
|
23
51
|
{
|
|
@@ -28,24 +56,94 @@ module CreditcardIdentifier
|
|
|
28
56
|
regexp_cvv: /\A\d{3}\z/,
|
|
29
57
|
},
|
|
30
58
|
{
|
|
31
|
-
name: "
|
|
59
|
+
name: "humo",
|
|
32
60
|
priority_over: [],
|
|
33
|
-
regexp_bin: /\A(
|
|
34
|
-
regexp_full: /\A(?=.{16}$)(?:
|
|
61
|
+
regexp_bin: /\A(9860)/,
|
|
62
|
+
regexp_full: /\A(?=.{16}$)(?:9860)[0-9]*\z/,
|
|
63
|
+
regexp_cvv: /\A\d{3}\z/,
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
name: "lankapay",
|
|
67
|
+
priority_over: ["jcb"],
|
|
68
|
+
regexp_bin: /\A(357111)/,
|
|
69
|
+
regexp_full: /\A(?=.{16}$)(?:357111)[0-9]*\z/,
|
|
70
|
+
regexp_cvv: /\A\d{3}\z/,
|
|
71
|
+
},
|
|
72
|
+
{
|
|
73
|
+
name: "laser",
|
|
74
|
+
priority_over: ["maestro"],
|
|
75
|
+
regexp_bin: /\A(6304|6706|6771|6709)/,
|
|
76
|
+
regexp_full: /\A(?=.{16,19}$)(?:6304|6706|6771|6709)[0-9]*\z/,
|
|
35
77
|
regexp_cvv: /\A\d{3}\z/,
|
|
36
78
|
},
|
|
37
79
|
{
|
|
38
80
|
name: "mastercard",
|
|
81
|
+
priority_over: ["diners-us-canada", "mir", "borica"],
|
|
82
|
+
regexp_bin: /\A(5[1-5]|2(?:2(?:2[1-9]|[3-9][0-9])|[3-6][0-9]{2}|7(?:[0-1][0-9]|20)))/,
|
|
83
|
+
regexp_full: /\A(?=.{16}$)(?:5[1-5]|2(?:2(?:2[1-9]|[3-9][0-9])|[3-6][0-9]{2}|7(?:[0-1][0-9]|20)))[0-9]*\z/,
|
|
84
|
+
regexp_cvv: /\A\d{3}\z/,
|
|
85
|
+
},
|
|
86
|
+
{
|
|
87
|
+
name: "napas",
|
|
39
88
|
priority_over: [],
|
|
40
|
-
regexp_bin: /\A(
|
|
41
|
-
regexp_full: /\A(?=.{16}$)(?:
|
|
89
|
+
regexp_bin: /\A(9704)/,
|
|
90
|
+
regexp_full: /\A(?=.{16,19}$)(?:9704)[0-9]*\z/,
|
|
42
91
|
regexp_cvv: /\A\d{3}\z/,
|
|
43
92
|
},
|
|
44
93
|
{
|
|
45
|
-
name: "
|
|
46
|
-
priority_over: [
|
|
47
|
-
regexp_bin: /\A(
|
|
48
|
-
regexp_full: /\A(?=.{16
|
|
94
|
+
name: "naranja",
|
|
95
|
+
priority_over: [],
|
|
96
|
+
regexp_bin: /\A(589562)/,
|
|
97
|
+
regexp_full: /\A(?=.{16}$)(?:589562)[0-9]*\z/,
|
|
98
|
+
regexp_cvv: /\A\d{3}\z/,
|
|
99
|
+
},
|
|
100
|
+
{
|
|
101
|
+
name: "nps-pridnestrovie",
|
|
102
|
+
priority_over: [],
|
|
103
|
+
regexp_bin: /\A(605474[0-4])/,
|
|
104
|
+
regexp_full: /\A(?=.{16}$)(?:605474[0-4])[0-9]*\z/,
|
|
105
|
+
regexp_cvv: /\A\d{3}\z/,
|
|
106
|
+
},
|
|
107
|
+
{
|
|
108
|
+
name: "solo",
|
|
109
|
+
priority_over: [],
|
|
110
|
+
regexp_bin: /\A(6334|6767)/,
|
|
111
|
+
regexp_full: /\A(?=.{16,19}$)(?:6334|6767)[0-9]*\z/,
|
|
112
|
+
regexp_cvv: /\A\d{3}\z/,
|
|
113
|
+
},
|
|
114
|
+
{
|
|
115
|
+
name: "switch",
|
|
116
|
+
priority_over: ["visa", "maestro"],
|
|
117
|
+
regexp_bin: /\A(4903|4905|4911|4936|564182|633110|6333|6759)/,
|
|
118
|
+
regexp_full: /\A(?=.{16,19}$)(?:4903|4905|4911|4936|564182|633110|6333|6759)[0-9]*\z/,
|
|
119
|
+
regexp_cvv: /\A\d{3}\z/,
|
|
120
|
+
},
|
|
121
|
+
{
|
|
122
|
+
name: "uatp",
|
|
123
|
+
priority_over: [],
|
|
124
|
+
regexp_bin: /\A(1)/,
|
|
125
|
+
regexp_full: /\A(?=.{15}$)(?:1)[0-9]*\z/,
|
|
126
|
+
regexp_cvv: /\A\d{3}\z/,
|
|
127
|
+
},
|
|
128
|
+
{
|
|
129
|
+
name: "ukrcart",
|
|
130
|
+
priority_over: ["hipercard"],
|
|
131
|
+
regexp_bin: /\A((60400[1-9][0-9]{2}|6040[1-9][0-9]{3}|604[1][0-9]{4}|6042[0][0][0-9]{2}))/,
|
|
132
|
+
regexp_full: /\A(?=.{16,19}$)(?:(60400[1-9][0-9]{2}|6040[1-9][0-9]{3}|604[1][0-9]{4}|6042[0][0][0-9]{2}))[0-9]*\z/,
|
|
133
|
+
regexp_cvv: /\A\d{3}\z/,
|
|
134
|
+
},
|
|
135
|
+
{
|
|
136
|
+
name: "uzcard",
|
|
137
|
+
priority_over: [],
|
|
138
|
+
regexp_bin: /\A(8600|5614)/,
|
|
139
|
+
regexp_full: /\A(?=.{16}$)(?:8600|5614)[0-9]*\z/,
|
|
140
|
+
regexp_cvv: /\A\d{3}\z/,
|
|
141
|
+
},
|
|
142
|
+
{
|
|
143
|
+
name: "visa-electron",
|
|
144
|
+
priority_over: ["visa"],
|
|
145
|
+
regexp_bin: /\A(4026|4405|4508|4844|4913|4917|417500)/,
|
|
146
|
+
regexp_full: /\A(?=.{16}$)(?:4026|4405|4508|4844|4913|4917|417500)[0-9]*\z/,
|
|
49
147
|
regexp_cvv: /\A\d{3}\z/,
|
|
50
148
|
},
|
|
51
149
|
{
|
|
@@ -56,38 +154,122 @@ module CreditcardIdentifier
|
|
|
56
154
|
regexp_cvv: /\A\d{3}\z/,
|
|
57
155
|
},
|
|
58
156
|
{
|
|
59
|
-
name: "
|
|
157
|
+
name: "borica",
|
|
60
158
|
priority_over: [],
|
|
61
|
-
regexp_bin: /\A(
|
|
62
|
-
regexp_full: /\A(?=.{
|
|
159
|
+
regexp_bin: /\A(2205)/,
|
|
160
|
+
regexp_full: /\A(?=.{16}$)(?:2205)[0-9]*\z/,
|
|
63
161
|
regexp_cvv: /\A\d{3}\z/,
|
|
64
162
|
},
|
|
65
163
|
{
|
|
66
|
-
name: "
|
|
164
|
+
name: "diners",
|
|
67
165
|
priority_over: [],
|
|
68
|
-
regexp_bin: /\A(
|
|
69
|
-
regexp_full: /\A(?=.{
|
|
166
|
+
regexp_bin: /\A(3(?:0[0-5]|6|8|9))/,
|
|
167
|
+
regexp_full: /\A(?=.{14}$)(?:3(?:0[0-5]|6|8|9))[0-9]*\z/,
|
|
168
|
+
regexp_cvv: /\A\d{3}\z/,
|
|
169
|
+
},
|
|
170
|
+
{
|
|
171
|
+
name: "instapayment",
|
|
172
|
+
priority_over: [],
|
|
173
|
+
regexp_bin: /\A(63[7-9])/,
|
|
174
|
+
regexp_full: /\A(?=.{16}$)(?:63[7-9])[0-9]*\z/,
|
|
175
|
+
regexp_cvv: /\A\d{3}\z/,
|
|
176
|
+
},
|
|
177
|
+
{
|
|
178
|
+
name: "interpayment",
|
|
179
|
+
priority_over: [],
|
|
180
|
+
regexp_bin: /\A(636)/,
|
|
181
|
+
regexp_full: /\A(?=.{16,19}$)(?:636)[0-9]*\z/,
|
|
182
|
+
regexp_cvv: /\A\d{3}\z/,
|
|
183
|
+
},
|
|
184
|
+
{
|
|
185
|
+
name: "jcb",
|
|
186
|
+
priority_over: [],
|
|
187
|
+
regexp_bin: /\A((?:2131|1800|35))/,
|
|
188
|
+
regexp_full: /\A(?=.{16}$)(?:(?:2131|1800|35))[0-9]*\z/,
|
|
189
|
+
regexp_cvv: /\A\d{3}\z/,
|
|
190
|
+
},
|
|
191
|
+
{
|
|
192
|
+
name: "mir",
|
|
193
|
+
priority_over: [],
|
|
194
|
+
regexp_bin: /\A(220[0-4])/,
|
|
195
|
+
regexp_full: /\A(?=.{16,19}$)(?:220[0-4])[0-9]*\z/,
|
|
196
|
+
regexp_cvv: /\A\d{3}\z/,
|
|
197
|
+
},
|
|
198
|
+
{
|
|
199
|
+
name: "troy",
|
|
200
|
+
priority_over: [],
|
|
201
|
+
regexp_bin: /\A(65|9792)/,
|
|
202
|
+
regexp_full: /\A(?=.{16}$)(?:65|9792)[0-9]*\z/,
|
|
203
|
+
regexp_cvv: /\A\d{3}\z/,
|
|
204
|
+
},
|
|
205
|
+
{
|
|
206
|
+
name: "aura",
|
|
207
|
+
priority_over: ["maestro", "maestro-uk", "gpn", "verve"],
|
|
208
|
+
regexp_bin: /\A(50)/,
|
|
209
|
+
regexp_full: /\A(?=.{16,19}$)(?:50)[0-9]*\z/,
|
|
210
|
+
regexp_cvv: /\A\d{3}\z/,
|
|
211
|
+
},
|
|
212
|
+
{
|
|
213
|
+
name: "maestro-uk",
|
|
214
|
+
priority_over: ["maestro"],
|
|
215
|
+
regexp_bin: /\A(6759|676770|676774)/,
|
|
216
|
+
regexp_full: /\A(?=.{12,19}$)(?:6759|676770|676774)[0-9]*\z/,
|
|
70
217
|
regexp_cvv: /\A\d{3}\z/,
|
|
71
218
|
},
|
|
72
219
|
{
|
|
73
220
|
name: "discover",
|
|
74
|
-
priority_over: ["hipercard", "unionpay"],
|
|
221
|
+
priority_over: ["hipercard", "unionpay", "gpn", "rupay", "troy", "verve"],
|
|
75
222
|
regexp_bin: /\A(6011|64[4-9]|65)/,
|
|
76
223
|
regexp_full: /\A(?=.{16,19}$)(?:6011|64[4-9]|65)[0-9]*\z/,
|
|
77
224
|
regexp_cvv: /\A\d{3}\z/,
|
|
78
225
|
},
|
|
226
|
+
{
|
|
227
|
+
name: "unionpay",
|
|
228
|
+
priority_over: [],
|
|
229
|
+
regexp_bin: /\A(62)/,
|
|
230
|
+
regexp_full: /\A(?=.{16,19}$)(?:62)[0-9]*\z/,
|
|
231
|
+
regexp_cvv: /\A\d{3}\z/,
|
|
232
|
+
},
|
|
79
233
|
{
|
|
80
234
|
name: "hipercard",
|
|
235
|
+
priority_over: ["gpn", "diners", "diners-international", "rupay"],
|
|
236
|
+
regexp_bin: /\A(384|60)/,
|
|
237
|
+
regexp_full: /\A(?=.{16,19}$)(?:384|60)[0-9]*\z/,
|
|
238
|
+
regexp_cvv: /\A\d{3}\z/,
|
|
239
|
+
},
|
|
240
|
+
{
|
|
241
|
+
name: "rupay",
|
|
81
242
|
priority_over: [],
|
|
82
|
-
regexp_bin: /\A(
|
|
83
|
-
regexp_full: /\A(?=.{16
|
|
243
|
+
regexp_bin: /\A(60|65|8[12]|508|35[36])/,
|
|
244
|
+
regexp_full: /\A(?=.{16}$)(?:60|65|8[12]|508|35[36])[0-9]*\z/,
|
|
84
245
|
regexp_cvv: /\A\d{3}\z/,
|
|
85
246
|
},
|
|
86
247
|
{
|
|
87
|
-
name: "
|
|
248
|
+
name: "verve",
|
|
249
|
+
priority_over: ["discover", "aura"],
|
|
250
|
+
regexp_bin: /\A((5060[9][9]|506[1][0-9]{2}|5061[0-9][0-8])|(65000[2-9]|6500[1][0-9]|6500[2][0-7])|(5078[6-9][5-9]|507[89][0-5][0-9]|5079[0-5][0-9]|50796[0-4]))/,
|
|
251
|
+
regexp_full: /\A(?=.{16,19}$)(?:(5060[9][9]|506[1][0-9]{2}|5061[0-9][0-8])|(65000[2-9]|6500[1][0-9]|6500[2][0-7])|(5078[6-9][5-9]|507[89][0-5][0-9]|5079[0-5][0-9]|50796[0-4]))[0-9]*\z/,
|
|
252
|
+
regexp_cvv: /\A\d{3}\z/,
|
|
253
|
+
},
|
|
254
|
+
{
|
|
255
|
+
name: "visa",
|
|
256
|
+
priority_over: ["gpn", "interpayment", "instapayment"],
|
|
257
|
+
regexp_bin: /\A(4|6367)/,
|
|
258
|
+
regexp_full: /\A(?=.{13,19}$)(?:4|6367)[0-9]*\z/,
|
|
259
|
+
regexp_cvv: /\A\d{3}\z/,
|
|
260
|
+
},
|
|
261
|
+
{
|
|
262
|
+
name: "gpn",
|
|
88
263
|
priority_over: [],
|
|
89
|
-
regexp_bin: /\A(
|
|
90
|
-
regexp_full: /\A(?=.{16,19}$)(?:
|
|
264
|
+
regexp_bin: /\A(1946|50|56|58|6[0-3])/,
|
|
265
|
+
regexp_full: /\A(?=.{16,19}$)(?:1946|50|56|58|6[0-3])[0-9]*\z/,
|
|
266
|
+
regexp_cvv: /\A\d{3}\z/,
|
|
267
|
+
},
|
|
268
|
+
{
|
|
269
|
+
name: "maestro",
|
|
270
|
+
priority_over: [],
|
|
271
|
+
regexp_bin: /\A((?:50|5[6-9]|6[0-9]))/,
|
|
272
|
+
regexp_full: /\A(?=.{12,19}$)(?:(?:50|5[6-9]|6[0-9]))[0-9]*\z/,
|
|
91
273
|
regexp_cvv: /\A\d{3}\z/,
|
|
92
274
|
},
|
|
93
275
|
].freeze
|