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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 1af198971c12eee07f52d36f221c8aad6ae74d19
4
- data.tar.gz: 6fd28ff02942241485baa88a467e2bac4243de76
3
+ metadata.gz: efe0d22849b9038cd0f8ba2d2a5ca9b73af14137
4
+ data.tar.gz: dbf58fdc4ba8242d3676b76b01f194a5d58c4412
5
5
  SHA512:
6
- metadata.gz: 2d55d85858f2842f59c3ca940f5a1dea1638e39d191e1ed34f3a8e265a710cb673c2715b916c084e515044b561b98e2e9d18239afead21d67319e1290305f7b1
7
- data.tar.gz: 1e62d33b36ac2a4d2b90cdce248a308b547721f493757fbb19f4a31bb48668a88d6fb72aecacf2932dc9daf33529e32d5d26922f6f46e98f01f686b8fcb8b7f8
6
+ metadata.gz: 254642c61af11750bc56d04714521b778a34ac4f9852d65eb426ab50cd820c828a90efd180058e2c6b453a4745162ecc731aaf9e4cbcd2fccbe156017d042edb
7
+ data.tar.gz: 1edbf221f87f7097760555697d26ec15bc7896906b3f63fd385c845f897cefebf17fa9dd74da3dff8e422e61004f3d132739f4a5e924c5cd4d14d5035c34e9f5
data/CHANGELOG.md CHANGED
@@ -1,13 +1,20 @@
1
- ## 0.2.1 - January 30, 2014
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, 2014
12
+ ## 0.2.0 - January 27, 2015
6
13
 
7
14
  - Add GermanDetailsConverter
8
15
 
9
16
 
10
- ## 0.1.1 - January 8, 2014
17
+ ## 0.1.1 - January 8, 2015
11
18
 
12
19
  - Add zero-padding to CheckDigit.spanish
13
20
 
data/README.md CHANGED
@@ -56,6 +56,9 @@ iban.errors # => { country_code: "'XQ' is not a valid..." }
56
56
 
57
57
  The following error keys may be set:
58
58
  - `country_code`
59
+ - `bank_code`
60
+ - `branch_code`
61
+ - `account_number`
59
62
  - `check_digits`
60
63
  - `characters`
61
64
  - `length`
@@ -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
- bban_format: bban_formats[country.country_code]
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
- def convert_swift_convention(swift_string)
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: