iban-tools 1.1.0 → 1.2.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 377405b03e8461746b0da1f91f9f7e746dd05a5e
4
- data.tar.gz: 9d82fb541e01e7ee5512bdb1c47044e0df03301b
2
+ SHA256:
3
+ metadata.gz: 7212d683c7c3b3aacaf1d71a8954cfb325e0f4bcf8d8de768dd1c618e963f791
4
+ data.tar.gz: 0ea198c6321472c427cafbc96b17aaa4b28a15075cd2958ea64f48fdf65306ea
5
5
  SHA512:
6
- metadata.gz: 643b8dca549415f422f371c9a5a175f6479982b40d2160f10108f7b41c33b978de7009a4c0b1a20c834e011dce14ad43445810c20b049f6d2ef16b0d9d20318e
7
- data.tar.gz: 72647ff594a640ef5070ef748e4af8bbf9f3c9c3308917c9352fda4d8ef89182e822a8ea2c4553609b30a6ddcb1b6040e3aa4fc34a206ddbcef617da28d7219a
6
+ metadata.gz: 5db6b71a7245d8396e06b49907878ffc352604013ace9c38cbaed0e575950137c23e32e1094eeb869dd490d5488bfb17f542d7e0b24ce2962abbdeb8f026f12e
7
+ data.tar.gz: 4b76c82fbc3d64096ffe6b60578a11339ffc10c728d63f68f85d2a4eacc69acf309c814fa4742968c4951a52c256463253236a5452dccc7de7c372e4905d975a
data/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  iban-tools is a Ruby library for manipulating and validating IBAN account numbers. You can [read more about IBAN](http://en.wikipedia.org/wiki/International_Bank_Account_Number) on Wikipedia
4
4
 
5
- [![Build Status](https://travis-ci.org/alphasights/iban-tools.svg)](https://travis-ci.org/alphasights/iban-tools)
5
+ [![Build Status](https://travis-ci.org/alphasights/iban-tools.svg?branch=master)](https://travis-ci.org/alphasights/iban-tools)
6
6
 
7
7
  ## INSTALLATION
8
8
 
@@ -34,7 +34,17 @@ Pretty print, canonicalize, and extract fields from an IBAN code
34
34
 
35
35
  iban.prettify
36
36
  => "RO49 AAAA 1B31 0075 9384 0000"
37
+
38
+ Convert local account numbers to IBAN and back to local.
39
+
40
+ iban = IBANTools::IBAN.from_local('NO', bank_code: '9710', account_number: '1112222', check_digit: '7')
41
+
42
+ iban.code
43
+ => "NO6197101112227"
44
+
45
+ iban.to_local
46
+ => {:bank_code=>"9710", :account_number=>"111222", :check_digit=>"7"}
37
47
 
38
48
  ## Credit
39
49
 
40
- [Iulianu](http://github.com/iulianu) wrote [iban-tools](http://github.com/iulianu/iban-tools). [AlphaSights](https://coderwall.com/team/alphasights) is maintaining the gem.
50
+ [Iulianu](http://github.com/iulianu) originally wrote [iban-tools](http://github.com/iulianu/iban-tools). The team at [AlphaSights](https://engineering.alphasights.com) is currently maintaining the gem.
@@ -4,12 +4,16 @@ module IBANTools
4
4
  def self.local2iban(country_code, data)
5
5
  config = load_config country_code
6
6
 
7
- bban = config.map do |key, value|
8
- insert_pattern = value[1]
9
- # apply integer-typecast if it is intended to format as decimal-value
10
- # this prevent mis-interpretation of integer with leading zeros into octal number!
11
- insert_value = insert_pattern.include?('d') ? data[key.to_sym].to_i : data[key.to_sym]
12
- insert_pattern % insert_value
7
+ bban = config.map do |key, values|
8
+ d = data[key.to_sym].dup
9
+ ret = [values].flatten.map do |value|
10
+ l = bban_format_length(value)
11
+ r = bban_format_to_format_string(value) % bban_format_cast(value, d[0..(l-1)])
12
+ d[0..(l-1)] = ''
13
+ r
14
+ end.join('')
15
+ # "%05s" % "a" -> " a" and not "0000a"
16
+ ret.gsub(/ /, '0')
13
17
  end.join('')
14
18
 
15
19
  check_digits = "%02d" % checksum(country_code, bban)
@@ -22,18 +26,85 @@ module IBANTools
22
26
  config = load_config country_code
23
27
 
24
28
  local = {}
25
- config.map do |key, value|
26
- local[key.to_sym] = bban.scan(/^#{value[0]}/).first.sub(/^0+/, '')
27
- bban.sub! /^#{value[0]}/, ''
29
+ config.map do |key, values|
30
+ local[key.to_sym] = [values].flatten.map do |value|
31
+ regexp = /^#{bban_format_to_regexp(value)}/
32
+ ret = bban.scan(regexp).first
33
+ bban.sub! regexp, ''
34
+ ret
35
+ end.join('')
36
+ local[key.to_sym].sub!(/^0+/, '')
37
+ local[key.to_sym] = '0' if local[key.to_sym] == ''
28
38
  end
29
39
  local
30
40
  end
31
41
 
32
42
  private
33
43
 
44
+ BBAN_REGEXP = /^(\d+)(!?)([nace])$/
45
+
46
+ def self.bban_format_length(format)
47
+ if format =~ BBAN_REGEXP
48
+ return $1.to_i
49
+ else
50
+ raise ArgumentError, "#{format} is not a valid bban format"
51
+ end
52
+ end
53
+
54
+ def self.bban_format_to_format_string(format)
55
+ if format =~ BBAN_REGEXP
56
+ if $3 == "e"
57
+ return " " * $1.to_i
58
+ end
59
+ format = '%0' + $1
60
+ format += case $3
61
+ when 'n' then 'd'
62
+ when 'a' then 's'
63
+ when 'c' then 's'
64
+ end
65
+ return format
66
+ else
67
+ raise ArgumentError, "#{format} is not a valid bban format"
68
+ end
69
+ end
70
+
71
+ def self.bban_format_cast(format, value)
72
+ if format =~ BBAN_REGEXP
73
+ if $3 == "n"
74
+ return value.to_i
75
+ else
76
+ return value
77
+ end
78
+ else
79
+ raise ArgumentError, "#{format} is not a valid bban format"
80
+ end
81
+ end
82
+
83
+ def self.bban_format_to_regexp(format)
84
+ if format =~ BBAN_REGEXP
85
+ regexp = case $3
86
+ when 'n' then '[0-9]'
87
+ when 'a' then '[A-Z]'
88
+ when 'c' then '[a-zA-Z0-9]'
89
+ when 'e' then '[ ]'
90
+ end
91
+ regexp += '{'
92
+ unless $2 == '!'
93
+ regexp += ','
94
+ end
95
+ regexp += $1 + '}'
96
+ return regexp
97
+ else
98
+ raise ArgumentError, "#{format} is not a valid bban format"
99
+ end
100
+ end
101
+
34
102
  def self.load_config(country_code)
35
103
  default_config = YAML.
36
- load(File.read(File.dirname(__FILE__) + '/conversion_rules.yml'))
104
+ load_file(File.join(File.dirname(__FILE__), 'conversion_rules.yml'))
105
+ unless default_config.key?(country_code)
106
+ raise ArgumentError, "Country code #{country_code} not availble"
107
+ end
37
108
  default_config[country_code]
38
109
  end
39
110
 
@@ -1,11 +1,326 @@
1
+ # Data from http://www.swift.com/dsp/resources/documents/IBAN_Registry.pdf
2
+ # And the parsed, readable table on
3
+ # http://en.wikipedia.org/wiki/International_Bank_Account_Number
4
+ #
5
+ # The values of the hashes follow the rules in the IBAN_Registry PDF:
6
+ #
7
+ # Length:
8
+ # nn! - mixed length
9
+ # nn - maximum length
10
+ #
11
+ # Character representation
12
+ # n - Digits (numeric characters 0 to 9 only)
13
+ # a - Upper case letters (alphabetic characters A-Z only)
14
+ # c - Upper and lower case alphanumeric characters (A-Z, a-z and 0-9)
15
+ # e - blank space
16
+ #
17
+ # If a field has more than one kind of character representation, an array can
18
+ # be used (see MU)
19
+ #
20
+
21
+ 'AD':
22
+ bank_code: 4!n
23
+ branch_code: 4!n
24
+ account_number: 12!n
25
+
26
+ 'AE':
27
+ bank_code: 3!n
28
+ account_number: 16!n
29
+
30
+ 'AL':
31
+ bank_code: 3!n
32
+ branch_code: 4!n
33
+ check_digit: 1!n
34
+ account_number: 16!n
35
+
36
+ 'AT':
37
+ bank_code: 5!n
38
+ account_number: 11!n
39
+
40
+ 'AZ':
41
+ bank_code: 4!c
42
+ account_number: 20!n
43
+
44
+ 'BA':
45
+ bank_code: 3!n
46
+ branch_code: 3!n
47
+ account_number: 8!n
48
+ check_digits: 2!n
49
+
50
+ 'BE':
51
+ bank_code: 3!n
52
+ account_number: 7!n
53
+ check_digits: 2!n
54
+
55
+ 'BG':
56
+ bank_code: 4!a
57
+ branch_code: 4!n
58
+ account_type: 2!n
59
+ account_number: 8!c
60
+
61
+ 'BH':
62
+ bank_code: 4!a
63
+ account_number: 14!c
64
+
65
+ 'CH':
66
+ bank_code: 5!n
67
+ account_number: 12!c
68
+
69
+ 'CY':
70
+ bank_code: 3!n
71
+ branch_code: 5!n
72
+ account_number: 16!c
73
+
74
+ 'CZ':
75
+ bank_code: 4!n
76
+ account_prefix: 6!n
77
+ account_number: 10!n
78
+
1
79
  'DE':
2
- blz: ['\d{8}', "%08d"]
3
- account_number: ['\d{10}', "%010d"]
80
+ blz: 8!n
81
+ account_number: 10!n
82
+
83
+ 'DK':
84
+ bank_code: 4!n
85
+ account_number: 10!n
86
+
87
+ 'DO':
88
+ bank_code: 4!a
89
+ account_number: 20!n
90
+
91
+ 'EE':
92
+ bank_code: 2!n
93
+ branch_code: 2!n
94
+ account_number: 10!n
95
+ check_digits: 2!n
4
96
 
5
97
  'ES':
6
- account_number: ['\d{20}', "%020d"]
98
+ account_number: 20!n
99
+
100
+ 'FI':
101
+ bank_code: 6!n
102
+ account_number: 7!n
103
+ check_digit: 1!n
104
+
105
+ 'FO':
106
+ bank_code: 4!n
107
+ account_number: 9!n
108
+ check_digit: 1!n
109
+
110
+ 'FR':
111
+ bank_code: 5!n
112
+ branch_code: 5!n
113
+ account_number: 11!c
114
+ check_digits: 2!n
115
+
116
+ 'GB':
117
+ bank_code: 4!a
118
+ branch_code: 6!n
119
+ account_number: 8!n
120
+
121
+ 'GE':
122
+ bank_code: 2!c
123
+ account_number: 16!n
124
+
125
+ 'GI':
126
+ bank_code: 4!a
127
+ account_number: 15!c
128
+
129
+ 'GL':
130
+ bank_code: 4!n
131
+ account_number: 10!n
132
+
133
+ 'GR':
134
+ bank_code: 3!n
135
+ branch_code: 4!n
136
+ account_number: 16!c
137
+
138
+ 'HR':
139
+ bank_code: 7!n
140
+ account_number: 10!n
141
+
142
+ 'HU':
143
+ bank_code: 3!n
144
+ branch_code: 4!n
145
+ account_prefix: 1!n
146
+ account_number: 15!n
147
+ check_digit: 1!n
148
+
149
+ 'IE':
150
+ bank_code: 4!c
151
+ branch_code: 6!c
152
+ account_number: 8n
153
+
154
+ 'IL':
155
+ bank_code: 3!n
156
+ branch_code: 3!n
157
+ account_number: 13!n
158
+
159
+ 'IS':
160
+ bank_code: 4!n
161
+ branch_code: 2!n
162
+ account_number: 6!n
163
+ kennitala: 10!n
164
+
165
+ 'IT':
166
+ check_char: 1!a
167
+ bank_code: 5!n
168
+ branch_code: 5!n
169
+ account_number: 12!c
170
+
171
+ 'JO':
172
+ bank_code: 4!a
173
+ branch_code: 4!n
174
+ zeros: 8!n
175
+ account_number: 10!n
176
+
177
+ 'KW':
178
+ bank_code: 4!a
179
+ account_number: 22!n
180
+
181
+ 'KZ':
182
+ bank_code: 3!n
183
+ account_number: 13!c
184
+
185
+ 'LB':
186
+ bank_code: 4!n
187
+ account_number: 20!c
188
+
189
+ 'LI':
190
+ bank_code: 5!n
191
+ account_number: 12!c
192
+
193
+ 'LT':
194
+ bank_code: 5!n
195
+ account_number: 11!n
196
+
197
+ 'LU':
198
+ bank_code: 3!n
199
+ account_number: 13!c
200
+
201
+ 'LV':
202
+ bank_code: 4!a
203
+ account_number: 13!c
204
+
205
+ 'MC':
206
+ bank_code: 5!n
207
+ branch_code: 5!n
208
+ account_number: 11!c
209
+ check_digits: 2!n
210
+
211
+ 'MD':
212
+ bank_code: 2!c
213
+ account_number: 18!n
214
+
215
+ 'ME':
216
+ bank_code: 3!n
217
+ account_number: 13!n
218
+ check_digits: 2!n
219
+
220
+ 'MK':
221
+ bank_code: 3!n
222
+ account_number: 10!c
223
+ check_digits: 2!n
224
+
225
+ 'MR':
226
+ bank_code: 5!n
227
+ branch_code: 5!n
228
+ account_number: 11!n
229
+ check_digits: 2!n
230
+
231
+ 'MT':
232
+ bank_code: 4!a
233
+ branch_code: 5!n
234
+ account_number: 18!c
235
+
236
+ 'MU':
237
+ bank_code: ['4!a', '2!n']
238
+ branch_code: 2!n
239
+ account_number: ['15!n', '3!a']
240
+
241
+ 'NL':
242
+ bank_code: 4!a
243
+ account_number: 10!n
244
+
245
+ 'NO':
246
+ # Don't remove the quotes here, NO == no == false in yaml.
247
+ bank_code: 4!n
248
+ account_number: 6!n
249
+ check_digit: 1!n
250
+
251
+ 'PK':
252
+ bank_code: 4!c
253
+ account_number: 16!n
254
+
255
+ 'PL':
256
+ bank_code: 3!n
257
+ branch_code: 4!n
258
+ check_digit: 1!n
259
+ account_number: 16!n
260
+
261
+ 'PS':
262
+ bank_code: 4!c
263
+ account_number: 21!n
264
+
265
+ 'PT':
266
+ bank_code: 4!n
267
+ branch_code: 4!n
268
+ account_number: 11!n
269
+ check_digits: 2!n
270
+
271
+ 'QA':
272
+ bank_code: 4!a
273
+ account_number: 21!c
274
+
275
+ 'RO':
276
+ bank_code: 4!a
277
+ account_number: 16!c
278
+
279
+ 'RS':
280
+ bank_code: 3!n
281
+ account_number: 13!n
282
+ check_digits: 2!n
283
+
284
+ 'SA':
285
+ bank_code: 2!n
286
+ account_number: 18!c
287
+
288
+ 'SE':
289
+ bank_code: 3!n
290
+ account_number: 16!n
291
+ check_digit: 1!n
292
+
293
+ 'SI':
294
+ bank_code: 2!n
295
+ branch_code: 3!n
296
+ account_number: 8!n
297
+ check_digits: 2!n
7
298
 
8
299
  'SK':
9
- bank_code: ['\d{4}', "%04d"]
10
- account_prefix: ['\d{6}', "%06d"]
11
- account_number: ['\d{10}', "%010d"]
300
+ bank_code: 4!n
301
+ account_prefix: 6!n
302
+ account_number: 10!n
303
+
304
+ 'SM':
305
+ check_char: 1!a
306
+ bank_code: 5!n
307
+ branch_code: 5!n
308
+ account_number: 12!c
309
+
310
+ 'TN':
311
+ bank_code: 2!n
312
+ branch_code: 3!n
313
+ account_number: 15!n
314
+
315
+ 'TR':
316
+ bank_code: 5!n
317
+ reserved: 1!c
318
+ account_number: 16!c
319
+
320
+ 'VA':
321
+ bank_code: 3!n
322
+ account_number: 15!n
323
+
324
+ 'VG':
325
+ bank_code: 4!c
326
+ account_number: 16!n
@@ -50,11 +50,31 @@
50
50
  length: 29
51
51
  bban_pattern: '\d{23}[A-Z0-9]{2}'
52
52
 
53
+ 'BY':
54
+ # Belarus
55
+ length: 28
56
+ bban_pattern: '[A-Z0-9]{4}\d{4}[A-Z0-9]{16}'
57
+
53
58
  'CH':
54
59
  # Switzerland
55
60
  length: 21
56
61
  bban_pattern: '\d{5}[A-Z0-9]{12}'
57
62
 
63
+ 'CI':
64
+ # Ivory Coast
65
+ length: 28
66
+ bban_pattern: '[A-Z0-9]{24}' # specification not clear
67
+
68
+ 'CR':
69
+ # Costa Rica
70
+ length: 22
71
+ bban_pattern: '\d{1}\d{3}\d{14}'
72
+
73
+ 'CV':
74
+ # Cape Verde
75
+ length: 25
76
+ bban_pattern: '\d{21}'
77
+
58
78
  'CY':
59
79
  # Cyprus
60
80
  length: 28
@@ -80,6 +100,11 @@
80
100
  length: 28
81
101
  bban_pattern: '[A-Z]{4}\d{20}'
82
102
 
103
+ 'EG':
104
+ # Egypt
105
+ length: 27
106
+ bban_pattern: '\d{23}' # specification not clear
107
+
83
108
  'EE':
84
109
  # Estonia
85
110
  length: 20
@@ -105,6 +130,11 @@
105
130
  length: 27
106
131
  bban_pattern: '\d{10}[A-Z0-9]{11}\d{2}'
107
132
 
133
+ 'GA':
134
+ # Gabon
135
+ length: 27
136
+ bban_pattern: '\d{23}' # specification not clear
137
+
108
138
  'GB':
109
139
  # United Kingdom
110
140
  length: 22
@@ -155,6 +185,11 @@
155
185
  length: 26
156
186
  bban_pattern: '\d{22}'
157
187
 
188
+ 'IQ':
189
+ # Iraq
190
+ length: 23
191
+ bban_pattern: '[A-Z]{4}[0-9]{15}'
192
+
158
193
  'IT':
159
194
  # Italy
160
195
  length: 27
@@ -215,6 +250,11 @@
215
250
  length: 22
216
251
  bban_pattern: '\d{18}'
217
252
 
253
+ 'MG':
254
+ # Madagascar
255
+ length: 27
256
+ bban_pattern: '\d{23}'
257
+
218
258
  'MK':
219
259
  # Macedonia
220
260
  length: 19
@@ -260,6 +300,11 @@
260
300
  length: 25
261
301
  bban_pattern: '\d{21}'
262
302
 
303
+ 'PS':
304
+ # Palestinian
305
+ length: 29
306
+ bban_pattern: '[A-Z]{4}[A-Z0-9]{21}'
307
+
263
308
  'QA':
264
309
  # Quatar
265
310
  length: 29
@@ -280,6 +325,11 @@
280
325
  length: 24
281
326
  bban_pattern: '\d{2}[A-Z0-9]{18}'
282
327
 
328
+ 'SC':
329
+ # Seychelles
330
+ length: 31
331
+ bban_pattern: '[A-Z]{4}[0-9]{20}[A-Z]{3}'
332
+
283
333
  'SE':
284
334
  # Sweden
285
335
  length: 24
@@ -300,6 +350,11 @@
300
350
  length: 27
301
351
  bban_pattern: '[A-Z]\d{10}[A-Z0-9]{12}'
302
352
 
353
+ 'SV':
354
+ # El Salvador
355
+ length: 28
356
+ bban_pattern: '[A-Z]{4}\d{20}'
357
+
303
358
  'TN':
304
359
  # Tunisia
305
360
  length: 24
@@ -315,3 +370,17 @@
315
370
  length: 29
316
371
  bban_pattern: '\d{25}'
317
372
 
373
+ 'VA':
374
+ # Vatican City
375
+ length: 22
376
+ bban_pattern: '\d{18}'
377
+
378
+ 'VG':
379
+ # Virgin Islands
380
+ length: 24
381
+ bban_pattern: '[A-Z0-9]{4}\d{16}'
382
+
383
+ 'XK':
384
+ # Kosovo
385
+ length: 20
386
+ bban_pattern: '\d{4}\d{12}'
data/lib/iban-tools.rb CHANGED
@@ -22,6 +22,6 @@
22
22
  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23
23
  #++
24
24
 
25
- require 'iban-tools/conversion.rb'
26
- require 'iban-tools/iban.rb'
27
- require 'iban-tools/iban_rules.rb'
25
+ require 'iban-tools/conversion'
26
+ require 'iban-tools/iban'
27
+ require 'iban-tools/iban_rules'
metadata CHANGED
@@ -1,15 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: iban-tools
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.0
4
+ version: 1.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Iulian Dogariu
8
8
  - Tor Erik Linnerud
9
- autorequire:
9
+ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2016-01-04 00:00:00.000000000 Z
12
+ date: 2023-12-04 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rspec
@@ -58,7 +58,7 @@ homepage: https://github.com/alphasights/iban-tools
58
58
  licenses:
59
59
  - MIT
60
60
  metadata: {}
61
- post_install_message:
61
+ post_install_message:
62
62
  rdoc_options: []
63
63
  require_paths:
64
64
  - lib
@@ -74,9 +74,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
74
74
  version: '0'
75
75
  requirements:
76
76
  - none
77
- rubyforge_project:
78
- rubygems_version: 2.4.5.1
79
- signing_key:
77
+ rubygems_version: 3.3.7
78
+ signing_key:
80
79
  specification_version: 4
81
80
  summary: IBAN validator
82
81
  test_files: []