ibandit 1.21.0 → 1.27.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.
@@ -11,9 +11,7 @@ describe Ibandit::IBAN do
11
11
  its(:iban) { is_expected.to eq(iban_code) }
12
12
 
13
13
  context "with locales" do
14
- all_keys = YAML.safe_load(
15
- File.read("config/locales/en.yml"),
16
- )["en"]["ibandit"].keys
14
+ all_keys = YAML.safe_load_file("config/locales/en.yml")["en"]["ibandit"].keys
17
15
 
18
16
  Ibandit::Constants::SUPPORTED_LOCALES.each do |locale|
19
17
  context "for #{locale}", locale: locale do
@@ -129,19 +127,19 @@ describe Ibandit::IBAN do
129
127
  end
130
128
 
131
129
  context "when the IBAN was created from a Belgian IBAN" do
132
- let(:iban_code) { "BE62510007547061" }
130
+ let(:iban_code) { "BE68539007547034" }
133
131
 
134
132
  its(:country_code) { is_expected.to eq("BE") }
135
- its(:bank_code) { is_expected.to eq("510") }
133
+ its(:bank_code) { is_expected.to eq("539") }
136
134
  its(:branch_code) { is_expected.to be_nil }
137
- its(:account_number) { is_expected.to eq("510007547061") }
135
+ its(:account_number) { is_expected.to eq("539007547034") }
138
136
  its(:account_number_suffix) { is_expected.to be_nil }
139
- its(:swift_bank_code) { is_expected.to eq("510") }
137
+ its(:swift_bank_code) { is_expected.to eq("539") }
140
138
  its(:swift_branch_code) { is_expected.to be_nil }
141
- its(:swift_account_number) { is_expected.to eq("510007547061") }
142
- its(:swift_national_id) { is_expected.to eq("510") }
143
- its(:local_check_digits) { is_expected.to eq("61") }
144
- its(:bban) { is_expected.to eq("510007547061") }
139
+ its(:swift_account_number) { is_expected.to eq("539007547034") }
140
+ its(:swift_national_id) { is_expected.to eq("539") }
141
+ its(:local_check_digits) { is_expected.to eq("34") }
142
+ its(:bban) { is_expected.to eq("539007547034") }
145
143
  end
146
144
 
147
145
  context "when the IBAN was created with local details" do
@@ -185,6 +183,75 @@ describe Ibandit::IBAN do
185
183
  its(:iban) { is_expected.to eq("SE5412000000012810105723") }
186
184
  its(:pseudo_iban) { is_expected.to eq("SEZZX1281XXX0105723") }
187
185
  its(:to_s) { is_expected.to eq("SE5412000000012810105723") }
186
+ its(:valid?) { is_expected.to eq(true) }
187
+
188
+ context "and the clearing code is not part of the IBAN" do
189
+ context "and the branch code allows for zero-filling of short account numbers" do
190
+ let(:arg) do
191
+ {
192
+ country_code: "SE",
193
+ branch_code: "6000",
194
+ account_number: "1234567",
195
+ }
196
+ end
197
+
198
+ its(:country_code) { is_expected.to eq("SE") }
199
+ its(:bank_code) { is_expected.to be_nil }
200
+ its(:branch_code) { is_expected.to eq("6000") }
201
+ its(:account_number) { is_expected.to eq("001234567") }
202
+ its(:swift_bank_code) { is_expected.to eq("600") }
203
+ its(:swift_branch_code) { is_expected.to be_nil }
204
+ its(:swift_account_number) { is_expected.to eq("00000000001234567") }
205
+ its(:iban) { is_expected.to eq("SE2260000000000001234567") }
206
+ its(:pseudo_iban) { is_expected.to eq("SEZZX6000X001234567") }
207
+ its(:to_s) { is_expected.to eq("SE2260000000000001234567") }
208
+ its(:valid?) { is_expected.to eq(true) }
209
+ end
210
+
211
+ context "and the branch code does not allow for zero-filling of short account numbers" do
212
+ let(:arg) do
213
+ {
214
+ country_code: "SE",
215
+ branch_code: "3300",
216
+ account_number: "1234567",
217
+ }
218
+ end
219
+
220
+ its(:country_code) { is_expected.to eq("SE") }
221
+ its(:bank_code) { is_expected.to be_nil }
222
+ its(:branch_code) { is_expected.to eq("3300") }
223
+ its(:account_number) { is_expected.to eq("1234567") }
224
+ its(:swift_bank_code) { is_expected.to eq("300") }
225
+ its(:swift_branch_code) { is_expected.to be_nil }
226
+ its(:swift_account_number) { is_expected.to eq("00000000001234567") }
227
+ its(:iban) { is_expected.to eq("SE4130000000000001234567") }
228
+ its(:pseudo_iban) { is_expected.to eq("SEZZX3300XXX1234567") }
229
+ its(:to_s) { is_expected.to eq("SE4130000000000001234567") }
230
+ its(:valid?) { is_expected.to eq(false) }
231
+ end
232
+ end
233
+
234
+ context "and the clearing code is part of the IBAN" do
235
+ let(:arg) do
236
+ {
237
+ country_code: "SE",
238
+ branch_code: "3410",
239
+ account_number: "1234567",
240
+ }
241
+ end
242
+
243
+ its(:country_code) { is_expected.to eq("SE") }
244
+ its(:bank_code) { is_expected.to be_nil }
245
+ its(:branch_code) { is_expected.to eq("3410") }
246
+ its(:account_number) { is_expected.to eq("1234567") }
247
+ its(:swift_bank_code) { is_expected.to eq("300") }
248
+ its(:swift_branch_code) { is_expected.to be_nil }
249
+ its(:swift_account_number) { is_expected.to eq("00000034101234567") }
250
+ its(:iban) { is_expected.to eq("SE1030000000034101234567") }
251
+ its(:pseudo_iban) { is_expected.to eq("SEZZX3410XXX1234567") }
252
+ its(:to_s) { is_expected.to eq("SE1030000000034101234567") }
253
+ its(:valid?) { is_expected.to eq(true) }
254
+ end
188
255
  end
189
256
 
190
257
  context "when the IBAN was created from a pseudo-IBAN" do
@@ -200,6 +267,98 @@ describe Ibandit::IBAN do
200
267
  its(:iban) { is_expected.to eq("SE5412000000012810105723") }
201
268
  its(:pseudo_iban) { is_expected.to eq("SEZZX1281XXX0105723") }
202
269
  its(:to_s) { is_expected.to eq("SE5412000000012810105723") }
270
+ its(:valid?) { is_expected.to eq(true) }
271
+ end
272
+
273
+ context "when the IBAN was created from a Swedish IBAN" do
274
+ context "with check digits that make it look like a pseudo-IBAN" do
275
+ let(:arg) { "SEZZ30000000031231234567" }
276
+
277
+ its(:country_code) { is_expected.to eq("SE") }
278
+ its(:valid?) { is_expected.to eq(false) }
279
+ end
280
+
281
+ context "where the clearing code is part of the account number" do
282
+ let(:arg) { "SE4730000000031231234567" }
283
+
284
+ its(:country_code) { is_expected.to eq("SE") }
285
+ its(:bank_code) { is_expected.to be_nil }
286
+ its(:branch_code) { is_expected.to be_nil }
287
+ its(:account_number) { is_expected.to be_nil }
288
+ its(:swift_bank_code) { is_expected.to eq("300") }
289
+ its(:swift_branch_code) { is_expected.to be_nil }
290
+ its(:swift_account_number) { is_expected.to eq("00000031231234567") }
291
+ its(:iban) { is_expected.to eq("SE4730000000031231234567") }
292
+ its(:pseudo_iban) { is_expected.to be_nil }
293
+ its(:to_s) { is_expected.to eq("SE4730000000031231234567") }
294
+ its(:valid?) { is_expected.to eq(true) }
295
+ end
296
+
297
+ context "where the clearing code is not part of the account number" do
298
+ let(:arg) { "SE7160000000000123456789" }
299
+
300
+ its(:country_code) { is_expected.to eq("SE") }
301
+ its(:bank_code) { is_expected.to be_nil }
302
+ its(:branch_code) { is_expected.to be_nil }
303
+ its(:account_number) { is_expected.to be_nil }
304
+ its(:swift_bank_code) { is_expected.to eq("600") }
305
+ its(:swift_branch_code) { is_expected.to be_nil }
306
+ its(:swift_account_number) { is_expected.to eq("00000000123456789") }
307
+ its(:iban) { is_expected.to eq("SE7160000000000123456789") }
308
+ its(:pseudo_iban) { is_expected.to be_nil }
309
+ its(:to_s) { is_expected.to eq("SE7160000000000123456789") }
310
+ its(:valid?) { is_expected.to eq(true) }
311
+ end
312
+
313
+ context "where the clearing code is 3300, and therefore the account number is the national ID" do
314
+ context "where the person was born in the 1990s" do
315
+ let(:arg) { "SE2130000000009308127392" }
316
+
317
+ its(:country_code) { is_expected.to eq("SE") }
318
+ its(:bank_code) { is_expected.to be_nil }
319
+ its(:branch_code) { is_expected.to be_nil }
320
+ its(:account_number) { is_expected.to be_nil }
321
+ its(:swift_bank_code) { is_expected.to eq("300") }
322
+ its(:swift_branch_code) { is_expected.to be_nil }
323
+ its(:swift_account_number) { is_expected.to eq("00000009308127392") }
324
+ its(:iban) { is_expected.to eq("SE2130000000009308127392") }
325
+ its(:pseudo_iban) { is_expected.to be_nil }
326
+ its(:to_s) { is_expected.to eq("SE2130000000009308127392") }
327
+ its(:valid?) { is_expected.to eq(true) }
328
+ end
329
+
330
+ context "where the person was born in the 2000s" do
331
+ let(:arg) { "SE9430000000000607274287" }
332
+
333
+ its(:country_code) { is_expected.to eq("SE") }
334
+ its(:bank_code) { is_expected.to be_nil }
335
+ its(:branch_code) { is_expected.to be_nil }
336
+ its(:account_number) { is_expected.to be_nil }
337
+ its(:swift_bank_code) { is_expected.to eq("300") }
338
+ its(:swift_branch_code) { is_expected.to be_nil }
339
+ its(:swift_account_number) { is_expected.to eq("00000000607274287") }
340
+ its(:iban) { is_expected.to eq("SE9430000000000607274287") }
341
+ its(:pseudo_iban) { is_expected.to be_nil }
342
+ its(:to_s) { is_expected.to eq("SE9430000000000607274287") }
343
+ its(:valid?) { is_expected.to eq(true) }
344
+ end
345
+
346
+ context "where the person was born in the year 2000" do
347
+ let(:arg) { "SE3830000000000007134937" }
348
+
349
+ its(:country_code) { is_expected.to eq("SE") }
350
+ its(:bank_code) { is_expected.to be_nil }
351
+ its(:branch_code) { is_expected.to be_nil }
352
+ its(:account_number) { is_expected.to be_nil }
353
+ its(:swift_bank_code) { is_expected.to eq("300") }
354
+ its(:swift_branch_code) { is_expected.to be_nil }
355
+ its(:swift_account_number) { is_expected.to eq("00000000007134937") }
356
+ its(:iban) { is_expected.to eq("SE3830000000000007134937") }
357
+ its(:pseudo_iban) { is_expected.to be_nil }
358
+ its(:to_s) { is_expected.to eq("SE3830000000000007134937") }
359
+ its(:valid?) { is_expected.to eq(true) }
360
+ end
361
+ end
203
362
  end
204
363
 
205
364
  context "when the IBAN was created with local details for Australia" do
@@ -640,6 +799,24 @@ describe Ibandit::IBAN do
640
799
  its(:to_s) { is_expected.to eq("") }
641
800
  end
642
801
 
802
+ context "with a nil account number" do
803
+ let(:account_number) { nil }
804
+
805
+ its(:country_code) { is_expected.to eq("NZ") }
806
+ its(:bank_code) { is_expected.to eq("11") }
807
+ its(:branch_code) { is_expected.to eq("2222") }
808
+ its(:account_number) { is_expected.to eq(nil) }
809
+ its(:account_number_suffix) { is_expected.to eq(nil) }
810
+ its(:swift_bank_code) { is_expected.to eq("11") }
811
+ its(:swift_branch_code) { is_expected.to eq("2222") }
812
+ its(:swift_account_number) { is_expected.to eq(nil) }
813
+ its(:swift_national_id) { is_expected.to eq("112222") }
814
+ its(:iban) { is_expected.to be_nil }
815
+ its(:pseudo_iban) { is_expected.to eq(nil) }
816
+ its(:valid?) { is_expected.to eq(false) }
817
+ its(:to_s) { is_expected.to eq("") }
818
+ end
819
+
643
820
  context "with bank and branch code embedded in account_number field" do
644
821
  let(:arg) do
645
822
  {
@@ -869,6 +1046,23 @@ describe Ibandit::IBAN do
869
1046
  expect(subject.errors).to eq(account_number: "format is invalid")
870
1047
  end
871
1048
  end
1049
+
1050
+ # Spanish IBANs have recently switched to 8 character national IDs
1051
+ context "with a Spanish IBAN" do
1052
+ let(:iban_code) { "ES9121000418450200051332" }
1053
+
1054
+ its(:country_code) { is_expected.to eq("ES") }
1055
+ its(:bank_code) { is_expected.to eq("2100") }
1056
+ its(:branch_code) { is_expected.to eq("0418") }
1057
+ its(:account_number) { is_expected.to eq("450200051332") }
1058
+ its(:account_number_suffix) { is_expected.to be_nil }
1059
+ its(:swift_bank_code) { is_expected.to eq("2100") }
1060
+ its(:swift_branch_code) { is_expected.to eq("0418") }
1061
+ its(:swift_account_number) { is_expected.to eq("450200051332") }
1062
+ its(:swift_national_id) { is_expected.to eq("21000418") }
1063
+ its(:local_check_digits) { is_expected.to eq("45") }
1064
+ its(:bban) { is_expected.to eq("21000418450200051332") }
1065
+ end
872
1066
  end
873
1067
 
874
1068
  describe "#to_s" do
@@ -1318,12 +1512,11 @@ describe Ibandit::IBAN do
1318
1512
  valid_branch_code?: valid_branch_code,
1319
1513
  valid_account_number?: valid_account_number,
1320
1514
  )
1515
+ iban.valid_local_modulus_check?
1321
1516
  end
1322
1517
 
1323
1518
  after { Ibandit.modulus_checker = nil }
1324
1519
 
1325
- before { iban.valid_local_modulus_check? }
1326
-
1327
1520
  context "with an invalid bank code" do
1328
1521
  let(:iban_code) { "AT611904300234573201" }
1329
1522
  let(:valid_bank_code) { false }
@@ -1351,12 +1544,13 @@ describe Ibandit::IBAN do
1351
1544
  let(:valid_branch_code) { false }
1352
1545
  let(:valid_account_number) { true }
1353
1546
 
1354
- before { Ibandit.bic_finder = double(call: "BARCGB22XXX") }
1547
+ before do
1548
+ Ibandit.bic_finder = double(call: "BARCGB22XXX")
1549
+ iban.valid_local_modulus_check?
1550
+ end
1355
1551
 
1356
1552
  after { Ibandit.bic_finder = nil }
1357
1553
 
1358
- before { iban.valid_local_modulus_check? }
1359
-
1360
1554
  it "calls valid_branch_code? with an IBAN object" do
1361
1555
  expect(Ibandit.modulus_checker).
1362
1556
  to receive(:valid_branch_code?).
@@ -2235,6 +2429,31 @@ describe Ibandit::IBAN do
2235
2429
  let(:valid_iban) { "RU0204452560040702810412345678901" }
2236
2430
  let(:invalid_iban) { "RUXX0204452560040702810412345678901" }
2237
2431
  end
2432
+
2433
+ it_behaves_like "a country's IBAN", "SO" do
2434
+ let(:valid_iban) { "SO211000001001000100141" }
2435
+ let(:invalid_iban) { "SO411000001001000100141" }
2436
+ end
2437
+
2438
+ it_behaves_like "a country's IBAN", "NI" do
2439
+ let(:valid_iban) { "NI45BAPR00000013000003558124" }
2440
+ let(:invalid_iban) { "NI55BAPR00000013000003558124" }
2441
+ end
2442
+
2443
+ it_behaves_like "a country's IBAN", "FK" do
2444
+ let(:valid_iban) { "FK88SC123456789012" }
2445
+ let(:invalid_iban) { "FK8SC123456789012" }
2446
+ end
2447
+
2448
+ it_behaves_like "a country's IBAN", "OM" do
2449
+ let(:valid_iban) { "OM810180000001299123456" }
2450
+ let(:invalid_iban) { "OM10180000001299123456" }
2451
+ end
2452
+
2453
+ it_behaves_like "a country's IBAN", "YE" do
2454
+ let(:valid_iban) { "YE15CBYE0001018861234567891234" }
2455
+ let(:invalid_iban) { "YE1CBYE0001018861234567891234" }
2456
+ end
2238
2457
  end
2239
2458
 
2240
2459
  describe "#local_check_digits" do
metadata CHANGED
@@ -1,113 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ibandit
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.21.0
4
+ version: 1.27.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - GoCardless
8
- autorequire:
9
8
  bindir: bin
10
9
  cert_chain: []
11
- date: 2024-08-06 00:00:00.000000000 Z
10
+ date: 2025-09-08 00:00:00.000000000 Z
12
11
  dependencies:
13
- - !ruby/object:Gem::Dependency
14
- name: gc_ruboconfig
15
- requirement: !ruby/object:Gem::Requirement
16
- requirements:
17
- - - "~>"
18
- - !ruby/object:Gem::Version
19
- version: '5.0'
20
- type: :development
21
- prerelease: false
22
- version_requirements: !ruby/object:Gem::Requirement
23
- requirements:
24
- - - "~>"
25
- - !ruby/object:Gem::Version
26
- version: '5.0'
27
- - !ruby/object:Gem::Dependency
28
- name: nokogiri
29
- requirement: !ruby/object:Gem::Requirement
30
- requirements:
31
- - - "~>"
32
- - !ruby/object:Gem::Version
33
- version: '1.6'
34
- type: :development
35
- prerelease: false
36
- version_requirements: !ruby/object:Gem::Requirement
37
- requirements:
38
- - - "~>"
39
- - !ruby/object:Gem::Version
40
- version: '1.6'
41
- - !ruby/object:Gem::Dependency
42
- name: pry
43
- requirement: !ruby/object:Gem::Requirement
44
- requirements:
45
- - - "~>"
46
- - !ruby/object:Gem::Version
47
- version: '0.13'
48
- type: :development
49
- prerelease: false
50
- version_requirements: !ruby/object:Gem::Requirement
51
- requirements:
52
- - - "~>"
53
- - !ruby/object:Gem::Version
54
- version: '0.13'
55
- - !ruby/object:Gem::Dependency
56
- name: pry-byebug
57
- requirement: !ruby/object:Gem::Requirement
58
- requirements:
59
- - - "~>"
60
- - !ruby/object:Gem::Version
61
- version: '3.10'
62
- type: :development
63
- prerelease: false
64
- version_requirements: !ruby/object:Gem::Requirement
65
- requirements:
66
- - - "~>"
67
- - !ruby/object:Gem::Version
68
- version: '3.10'
69
- - !ruby/object:Gem::Dependency
70
- name: rspec
71
- requirement: !ruby/object:Gem::Requirement
72
- requirements:
73
- - - "~>"
74
- - !ruby/object:Gem::Version
75
- version: '3.12'
76
- type: :development
77
- prerelease: false
78
- version_requirements: !ruby/object:Gem::Requirement
79
- requirements:
80
- - - "~>"
81
- - !ruby/object:Gem::Version
82
- version: '3.12'
83
- - !ruby/object:Gem::Dependency
84
- name: rspec-its
85
- requirement: !ruby/object:Gem::Requirement
86
- requirements:
87
- - - "~>"
88
- - !ruby/object:Gem::Version
89
- version: '1.2'
90
- type: :development
91
- prerelease: false
92
- version_requirements: !ruby/object:Gem::Requirement
93
- requirements:
94
- - - "~>"
95
- - !ruby/object:Gem::Version
96
- version: '1.2'
97
- - !ruby/object:Gem::Dependency
98
- name: sax-machine
99
- requirement: !ruby/object:Gem::Requirement
100
- requirements:
101
- - - "~>"
102
- - !ruby/object:Gem::Version
103
- version: '1.3'
104
- type: :development
105
- prerelease: false
106
- version_requirements: !ruby/object:Gem::Requirement
107
- requirements:
108
- - - "~>"
109
- - !ruby/object:Gem::Version
110
- version: '1.3'
111
12
  - !ruby/object:Gem::Dependency
112
13
  name: i18n
113
14
  requirement: !ruby/object:Gem::Requirement
@@ -157,7 +58,7 @@ files:
157
58
  - config/locales/sl.yml
158
59
  - config/locales/sv.yml
159
60
  - data/german_iban_rules.yml
160
- - data/raw/BLZ2.txt
61
+ - data/raw/BLZ2.xml
161
62
  - data/raw/IBANSTRUCTURE.xml
162
63
  - data/raw/IBAN_Registry.txt
163
64
  - data/raw/pseudo_ibans.yml
@@ -199,7 +100,6 @@ licenses:
199
100
  - MIT
200
101
  metadata:
201
102
  rubygems_mfa_required: 'true'
202
- post_install_message:
203
103
  rdoc_options: []
204
104
  require_paths:
205
105
  - lib
@@ -214,8 +114,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
214
114
  - !ruby/object:Gem::Version
215
115
  version: '0'
216
116
  requirements: []
217
- rubygems_version: 3.4.10
218
- signing_key:
117
+ rubygems_version: 3.6.2
219
118
  specification_version: 4
220
119
  summary: Convert national banking details into IBANs, and vice-versa.
221
120
  test_files: []