ibandit 0.2.1 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +10 -3
- data/README.md +3 -0
- data/bin/build_structure_file.rb +41 -5
- data/data/raw/structure_additions.yml +43 -0
- data/data/structures.yml +157 -0
- data/ibandit.gemspec +1 -1
- data/lib/ibandit/iban.rb +147 -60
- data/lib/ibandit/iban_assembler.rb +117 -0
- data/lib/ibandit/iban_splitter.rb +66 -0
- data/lib/ibandit/local_details_cleaner.rb +298 -0
- data/lib/ibandit/version.rb +1 -1
- data/lib/ibandit.rb +9 -1
- data/spec/ibandit/iban_assembler_spec.rb +567 -0
- data/spec/ibandit/iban_spec.rb +294 -13
- data/spec/ibandit/iban_splitter_spec.rb +41 -0
- data/spec/ibandit/local_details_cleaner_spec.rb +688 -0
- metadata +10 -6
- data/lib/ibandit/iban_builder.rb +0 -539
- data/spec/ibandit/iban_builder_spec.rb +0 -892
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: efe0d22849b9038cd0f8ba2d2a5ca9b73af14137
|
4
|
+
data.tar.gz: dbf58fdc4ba8242d3676b76b01f194a5d58c4412
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 254642c61af11750bc56d04714521b778a34ac4f9852d65eb426ab50cd820c828a90efd180058e2c6b453a4745162ecc731aaf9e4cbcd2fccbe156017d042edb
|
7
|
+
data.tar.gz: 1edbf221f87f7097760555697d26ec15bc7896906b3f63fd385c845f897cefebf17fa9dd74da3dff8e422e61004f3d132739f4a5e924c5cd4d14d5035c34e9f5
|
data/CHANGELOG.md
CHANGED
@@ -1,13 +1,20 @@
|
|
1
|
-
## 0.
|
1
|
+
## 0.3.0 - February 6, 2015
|
2
|
+
|
3
|
+
- Move IBANBuilder interface into main IBAN class by overloading its constructor
|
4
|
+
- Move validation of local details input out of IBANBuilder into IBAN
|
5
|
+
- Split `IBAN.valid_length?` into individual checks on the length of bank code, branch code, and account number
|
6
|
+
- Return `nil` for fields which aren't present, rather than an empty string
|
7
|
+
|
8
|
+
## 0.2.1 - January 30, 2015
|
2
9
|
|
3
10
|
- Add Lithuania to IBANBuilder
|
4
11
|
|
5
|
-
## 0.2.0 - January 27,
|
12
|
+
## 0.2.0 - January 27, 2015
|
6
13
|
|
7
14
|
- Add GermanDetailsConverter
|
8
15
|
|
9
16
|
|
10
|
-
## 0.1.1 - January 8,
|
17
|
+
## 0.1.1 - January 8, 2015
|
11
18
|
|
12
19
|
- Add zero-padding to CheckDigit.spanish
|
13
20
|
|
data/README.md
CHANGED
data/bin/build_structure_file.rb
CHANGED
@@ -37,21 +37,57 @@ def get_iban_structures(iban_structures_file, iban_registry_file)
|
|
37
37
|
account_number_position: country.account_number_position.to_i,
|
38
38
|
account_number_length: country.account_number_length.to_i,
|
39
39
|
total_length: country.total_length.to_i,
|
40
|
-
iban_national_id_length: country.iban_national_id_length.to_i
|
41
|
-
|
42
|
-
}
|
40
|
+
iban_national_id_length: country.iban_national_id_length.to_i
|
41
|
+
}.merge(bban_formats[country.country_code])
|
43
42
|
end
|
44
43
|
end
|
45
44
|
|
46
45
|
def get_bban_formats(iban_registry_file)
|
47
46
|
iban_registry_file.each_with_object({}) do |line, hash|
|
48
47
|
bban_structure = line['BBAN structure '].strip
|
48
|
+
|
49
|
+
bank_code_structure, branch_code_structure =
|
50
|
+
if line['Bank identifier length']
|
51
|
+
line['Bank identifier length'].split(/, Branch identifier length:? /)
|
52
|
+
else
|
53
|
+
['', nil]
|
54
|
+
end
|
55
|
+
|
49
56
|
country_code = line['Country code as defined in ISO 3166'].strip
|
50
|
-
hash[country_code] = convert_swift_convention(bban_structure
|
57
|
+
hash[country_code] = convert_swift_convention(bban_structure,
|
58
|
+
bank_code_structure,
|
59
|
+
branch_code_structure)
|
51
60
|
end
|
52
61
|
end
|
53
62
|
|
54
|
-
|
63
|
+
# IBAN Registry has BBAN format (which seems to be accurate), and Bank
|
64
|
+
# identifier length, which contains something roughly like the format for the
|
65
|
+
# bank code and usually the branch code where applicable. This is a best attempt
|
66
|
+
# to convert those from weird SWIFT-talk into regexes, and then work out the
|
67
|
+
# account number format regex by taking the bank and branch code regexes off
|
68
|
+
# the front of the BBAN format.
|
69
|
+
#
|
70
|
+
# This works about 70% of the time, the rest are overridden in
|
71
|
+
# structure_additions.yml
|
72
|
+
def convert_swift_convention(bban, bank, branch)
|
73
|
+
bban_regex = iban_registry_to_regex(bban)
|
74
|
+
bank_regex = iban_registry_to_regex(bank)
|
75
|
+
branch_regex = branch.nil? ? nil : iban_registry_to_regex(branch)
|
76
|
+
|
77
|
+
non_account_number_regex = [bank_regex, branch_regex].join
|
78
|
+
account_number_start = (bban_regex.index(non_account_number_regex) || 0) +
|
79
|
+
non_account_number_regex.length
|
80
|
+
account_number_regex = bban_regex[account_number_start..-1]
|
81
|
+
|
82
|
+
{
|
83
|
+
bban_format: bban_regex,
|
84
|
+
bank_code_format: bank_regex,
|
85
|
+
branch_code_format: branch_regex,
|
86
|
+
account_number_format: account_number_regex
|
87
|
+
}.reject { |_, value| value.nil? }
|
88
|
+
end
|
89
|
+
|
90
|
+
def iban_registry_to_regex(swift_string)
|
55
91
|
swift_string.gsub(/(\d+)!([nac])/, '\2{\1}').
|
56
92
|
gsub('n', '\d').
|
57
93
|
gsub('a', '[A-Z]').
|
@@ -1,10 +1,23 @@
|
|
1
1
|
---
|
2
|
+
AL:
|
3
|
+
:bank_code_format: \d{3}
|
4
|
+
:branch_code_format: \d{5}
|
5
|
+
BR:
|
6
|
+
:bank_code_format: \d{8}
|
7
|
+
:branch_code_format: \d{5}
|
8
|
+
:account_number_format: '\d{10}[A-Z]{1}[A-Z0-9]{1}'
|
2
9
|
BE:
|
3
10
|
:local_check_digit_position: 15
|
4
11
|
:local_check_digit_length: 2
|
12
|
+
BH:
|
13
|
+
:bank_code_format: '[A-Z]{4}'
|
14
|
+
:account_number_format: '[A-Z0-9]{14}'
|
5
15
|
DE:
|
6
16
|
:bban_format: \d{8}\d{10}
|
17
|
+
:account_number_format: \d{10}
|
7
18
|
EE:
|
19
|
+
:bank_code_format: '[1-9][0-9]'
|
20
|
+
:account_number_format: \d{2}\d{11}\d{1}
|
8
21
|
:local_check_digit_position: 20
|
9
22
|
:local_check_digit_length: 1
|
10
23
|
ES:
|
@@ -12,31 +25,61 @@ ES:
|
|
12
25
|
:local_check_digit_length: 2
|
13
26
|
FI:
|
14
27
|
:bban_format: \d{6}\d{7}\d{1}
|
28
|
+
:bank_code_format: \d{6}
|
29
|
+
:account_number_format: \d{7}\d{1}
|
15
30
|
:local_check_digit_position: 18
|
16
31
|
:local_check_digit_length: 1
|
17
32
|
FR:
|
33
|
+
:branch_code_format: \d{5}
|
34
|
+
:account_number_format: '[A-Z0-9]{11}\d{2}'
|
18
35
|
:local_check_digit_position: 26
|
19
36
|
:local_check_digit_length: 2
|
37
|
+
GB:
|
38
|
+
:branch_code_format: \d{6}
|
39
|
+
:account_number_format: \d{8}
|
20
40
|
HU:
|
21
41
|
:bban_format: \d{3}\d{4}\d{1}\d{15}\d{1}
|
42
|
+
:account_number_format: \d{1}\d{15}\d{1}
|
22
43
|
IT:
|
23
44
|
:local_check_digit_position: 5
|
24
45
|
:local_check_digit_length: 1
|
46
|
+
LB:
|
47
|
+
:bban_format: \d{4}[A-Z0-9]{20}
|
48
|
+
:bank_code_format: \d{4}
|
49
|
+
:account_number_format: '[A-Z0-9]{14}'
|
25
50
|
MC:
|
26
51
|
:local_check_digit_position: 26
|
27
52
|
:local_check_digit_length: 2
|
53
|
+
MU:
|
54
|
+
:bban_format: '[A-Z]{4}\d{2}\d{2}\d{12}\d{3}[A-Z]{3}'
|
55
|
+
:bank_code_format: '[A-Z]{4}\d{2}'
|
56
|
+
:branch_code_format: \d{2}
|
57
|
+
:account_number_format: '\d{12}\d{3}[A-Z]{3}'
|
28
58
|
NL:
|
29
59
|
:local_check_digit_position: 18
|
30
60
|
:local_check_digit_length: 1
|
31
61
|
PT:
|
62
|
+
:branch_code_format: \d{4}
|
63
|
+
:account_number_format: \d{11}\d{2}
|
32
64
|
:local_check_digit_position: 24
|
33
65
|
:local_check_digit_length: 2
|
34
66
|
QA:
|
35
67
|
:bban_format: '[A-Z]{4}[A-Z0-9]{21}'
|
68
|
+
:bank_code_format: '[A-Z]{4}'
|
69
|
+
:account_number_format: '[A-Z0-9]{21}'
|
70
|
+
SA:
|
71
|
+
:bank_code_format: \d{2}
|
72
|
+
:account_number_format: '[A-Z0-9]{18}'
|
73
|
+
SI:
|
74
|
+
:bank_code_format: \d{5}
|
75
|
+
:account_number_format: \d{8}\d{2}
|
36
76
|
SK:
|
37
77
|
:local_check_digit_position: 14
|
38
78
|
:local_check_digit_length: 1
|
39
79
|
SM:
|
80
|
+
:bank_code_format: \d{5}
|
81
|
+
:branch_code_format: \d{5}
|
82
|
+
:account_number_format: '[A-Z0-9]{12}'
|
40
83
|
:local_check_digit_position: 5
|
41
84
|
:local_check_digit_length: 1
|
42
85
|
TL:
|