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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: c88cdee72a10369be227c5e17055b5322411525e2c5cf1dbedfb631141b2bd4f
4
- data.tar.gz: e9b62ef2301e4f2eb7c3deac99c526eb3c33a24edd006289f9f1cbbf10860a66
3
+ metadata.gz: eeb429f9281142942cbd4ad498d415acd95e0459ceb90bd50a692b8cc268410a
4
+ data.tar.gz: 1b7a83a04668a633a08eb27c71858e10940ed8d6e40136a68f130720ca758251
5
5
  SHA512:
6
- metadata.gz: 600ef8ee4b9aee759f362d85a290d8b2b0032d3cc9bba66d9bb2c17fe0b163f196a7824b2dfd8846142120c74817421ca73693e76d05337dcc729a647c1f62aa
7
- data.tar.gz: 5da351094afc901f8960a1e054e7f9d27e086268f70dbef70967b47a7038bb5c5d385ab43fa1d005abacc708c9210d3d473aa8ba4ed5908dcd8e80d3ce2d29dd
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-11T20:57:15.838Z
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: "diners",
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(3(?:0[0-5]|[68][0-9]))/,
20
- regexp_full: /\A(?=.{14}$)(?:3(?:0[0-5]|[68][0-9]))[0-9]*\z/,
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: "jcb",
59
+ name: "humo",
32
60
  priority_over: [],
33
- regexp_bin: /\A((?:2131|1800|35))/,
34
- regexp_full: /\A(?=.{16}$)(?:(?:2131|1800|35))[0-9]*\z/,
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(5[1-5]|2[2-7][0-2][0-9])/,
41
- regexp_full: /\A(?=.{16}$)(?:5[1-5]|2[2-7][0-2][0-9])[0-9]*\z/,
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: "aura",
46
- priority_over: ["maestro"],
47
- regexp_bin: /\A(50)/,
48
- regexp_full: /\A(?=.{16,19}$)(?:50)[0-9]*\z/,
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: "maestro",
157
+ name: "borica",
60
158
  priority_over: [],
61
- regexp_bin: /\A(5018|5020|5038|5893|6304|6759|676[1-3]|6706)/,
62
- regexp_full: /\A(?=.{12,19}$)(?:5018|5020|5038|5893|6304|6759|676[1-3]|6706)[0-9]*\z/,
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: "visa",
164
+ name: "diners",
67
165
  priority_over: [],
68
- regexp_bin: /\A(4|6367)/,
69
- regexp_full: /\A(?=.{13,16}$)(?:4|6367)[0-9]*\z/,
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(38|60)/,
83
- regexp_full: /\A(?=.{16,19}$)(?:38|60)[0-9]*\z/,
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: "unionpay",
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(62)/,
90
- regexp_full: /\A(?=.{16,19}$)(?:62)[0-9]*\z/,
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