ibandit 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +4 -0
- data/.rubocop.yml +43 -0
- data/.rubocop_todo.yml +23 -0
- data/CHANGELOG.md +48 -0
- data/Gemfile +3 -0
- data/LICENSE +22 -0
- data/README.md +303 -0
- data/TODO.md +5 -0
- data/bin/build_structure_file.rb +101 -0
- data/circle.yml +19 -0
- data/data/IBANSTRUCTURE.xml +1184 -0
- data/data/IBAN_Registry.txt +70 -0
- data/data/structure_additions.yml +43 -0
- data/ibandit.gemspec +24 -0
- data/lib/ibandit.rb +16 -0
- data/lib/ibandit/check_digit.rb +183 -0
- data/lib/ibandit/errors.rb +5 -0
- data/lib/ibandit/iban.rb +168 -0
- data/lib/ibandit/iban_builder.rb +528 -0
- data/lib/ibandit/structures.yml +703 -0
- data/lib/ibandit/version.rb +3 -0
- data/spec/ibandit/check_digit_spec.rb +130 -0
- data/spec/ibandit/iban_builder_spec.rb +853 -0
- data/spec/ibandit/iban_spec.rb +549 -0
- data/spec/spec_helper.rb +7 -0
- metadata +141 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 36930d16f5443cccf34293a0cb6014b8dc33c337
|
4
|
+
data.tar.gz: e8201ef2d1053ed3293ac3d620e0cd494e1f66a6
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 98a90bb5ed4f7b50bf82abed4709bf919d7fad46f7695dc40e317d16c102aef3b097ef928806b0d3393a07e4d2701981727cf2c77b90427b41f485e449d5f437
|
7
|
+
data.tar.gz: 7c02243b084a98aac05bd911bf527667b47cf98a362795fb6f7214018f563ce8ad3726f623201a34c3e6cd883b697c8531a3c08632b7f505446b908066a55a18
|
data/.gitignore
ADDED
data/.rubocop.yml
ADDED
@@ -0,0 +1,43 @@
|
|
1
|
+
inherit_from: .rubocop_todo.yml
|
2
|
+
|
3
|
+
AllCops:
|
4
|
+
Include:
|
5
|
+
- config.ru
|
6
|
+
- Rakefile
|
7
|
+
Exclude:
|
8
|
+
- .*/**/*
|
9
|
+
|
10
|
+
# Limit lines to 80 characters.
|
11
|
+
LineLength:
|
12
|
+
Max: 80
|
13
|
+
|
14
|
+
ClassLength:
|
15
|
+
Max: 150
|
16
|
+
|
17
|
+
# Avoid single-line methods.
|
18
|
+
SingleLineMethods:
|
19
|
+
AllowIfMethodIsEmpty: true
|
20
|
+
|
21
|
+
# Wants underscores in all large numbers. Pain in the ass for things like
|
22
|
+
# unix timestamps.
|
23
|
+
NumericLiterals:
|
24
|
+
Enabled: false
|
25
|
+
|
26
|
+
# Wants you to use the same argument names for every reduce. This seems kinda
|
27
|
+
# naff compared to naming them semantically
|
28
|
+
SingleLineBlockParams:
|
29
|
+
Enabled: false
|
30
|
+
|
31
|
+
Style/SignalException:
|
32
|
+
EnforcedStyle: 'only_raise'
|
33
|
+
|
34
|
+
# Wants to exclude accents from comments
|
35
|
+
Style/AsciiComments:
|
36
|
+
Enabled: false
|
37
|
+
|
38
|
+
# Configuration parameters: CountComments.
|
39
|
+
Metrics/MethodLength:
|
40
|
+
Max: 25
|
41
|
+
|
42
|
+
Style/DotPosition:
|
43
|
+
EnforcedStyle: 'trailing'
|
data/.rubocop_todo.yml
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
# This configuration was generated by `rubocop --auto-gen-config`
|
2
|
+
# on 2014-12-08 13:56:37 +0000 using RuboCop version 0.27.1.
|
3
|
+
# The point is for the user to remove these configuration records
|
4
|
+
# one by one as the offenses are removed from the code base.
|
5
|
+
# Note that changes in the inspected code, or installation of new
|
6
|
+
# versions of RuboCop, may require this file to be generated again.
|
7
|
+
|
8
|
+
# Offense count: 4
|
9
|
+
Metrics/AbcSize:
|
10
|
+
Max: 28
|
11
|
+
|
12
|
+
# Offense count: 1
|
13
|
+
# Configuration parameters: CountComments.
|
14
|
+
Metrics/ClassLength:
|
15
|
+
Max: 110
|
16
|
+
|
17
|
+
# Offense count: 1
|
18
|
+
Metrics/CyclomaticComplexity:
|
19
|
+
Max: 10
|
20
|
+
|
21
|
+
# Offense count: 4
|
22
|
+
Style/Documentation:
|
23
|
+
Enabled: false
|
data/CHANGELOG.md
ADDED
@@ -0,0 +1,48 @@
|
|
1
|
+
## 0.1.0 - December 29, 2014
|
2
|
+
|
3
|
+
- Initial public release
|
4
|
+
|
5
|
+
## 0.0.16 - December 29, 2014
|
6
|
+
|
7
|
+
- Fix error handling in Modulus 97-10 check digit calculation
|
8
|
+
|
9
|
+
## 0.0.15 - December 26, 2014
|
10
|
+
|
11
|
+
- Raise namespaced errors
|
12
|
+
|
13
|
+
## 0.0.14 - December 17, 2014
|
14
|
+
|
15
|
+
- Add the Netherlands to IBANBuilder, and rename CheckDigit.mod_11
|
16
|
+
|
17
|
+
## 0.0.13 - December 17, 2014
|
18
|
+
|
19
|
+
- Send cleaned (de-space/hyphenated) sort codes to the BIC finder lambda
|
20
|
+
|
21
|
+
## 0.0.12 - December 16, 2014
|
22
|
+
|
23
|
+
- Allow spaced as well as hyphenated UK sort codes
|
24
|
+
|
25
|
+
## 0.0.11 - December 15, 2014
|
26
|
+
|
27
|
+
- `IBAN#to_s` returns IBAN string rather than object properties
|
28
|
+
- Local check digits accessors
|
29
|
+
- Only raises `ArgumentError`
|
30
|
+
- Additional documentation on local details/IBAN conversion quirks
|
31
|
+
|
32
|
+
## 0.0.10 - December 13, 2014
|
33
|
+
|
34
|
+
- Update format validations for all IBAN countries. Add local_check_digits
|
35
|
+
accessor method to IBAN.
|
36
|
+
|
37
|
+
## 0.0.5 - December 8, 2014
|
38
|
+
|
39
|
+
- Add IBANSTRUCTURE file. All IBAN countries are now supported for validation
|
40
|
+
and deconstruction.
|
41
|
+
|
42
|
+
## 0.0.2 - December 4, 2014
|
43
|
+
|
44
|
+
- Rename to ibandit
|
45
|
+
|
46
|
+
## 0.0.1 - November 27, 2014
|
47
|
+
|
48
|
+
- Initial commit
|
data/Gemfile
ADDED
data/LICENSE
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2014 GoCardless
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person
|
4
|
+
obtaining a copy of this software and associated documentation
|
5
|
+
files (the "Software"), to deal in the Software without
|
6
|
+
restriction, including without limitation the rights to use,
|
7
|
+
copy, modify, merge, publish, distribute, sublicense, and/or sell
|
8
|
+
copies of the Software, and to permit persons to whom the
|
9
|
+
Software is furnished to do so, subject to the following
|
10
|
+
conditions:
|
11
|
+
|
12
|
+
The above copyright notice and this permission notice shall be
|
13
|
+
included in all copies or substantial portions of the Software.
|
14
|
+
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
16
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
|
17
|
+
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
18
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
19
|
+
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
20
|
+
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
21
|
+
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
22
|
+
OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,303 @@
|
|
1
|
+
# Ibandit
|
2
|
+
|
3
|
+
Ibandit is a Ruby library for manipulating and validating
|
4
|
+
[IBANs](http://en.wikipedia.org/wiki/International_Bank_Account_Number). It
|
5
|
+
allows you to:
|
6
|
+
|
7
|
+
1. Create an IBAN from national banking details
|
8
|
+
2. Deconstruct an IBAN into national banking details
|
9
|
+
3. Validate an IBAN's check digits and structure
|
10
|
+
|
11
|
+
Ibandit also provides helper methods for validating some countries' local
|
12
|
+
account details.
|
13
|
+
|
14
|
+
The gem is kept up to date using the IBAN structure file from SWIFT.
|
15
|
+
|
16
|
+
## Usage
|
17
|
+
|
18
|
+
### Installation
|
19
|
+
|
20
|
+
You don't need this source code unless you want to modify the gem. If you just
|
21
|
+
want to use it, you should run:
|
22
|
+
|
23
|
+
```ruby
|
24
|
+
gem install ibandit
|
25
|
+
```
|
26
|
+
|
27
|
+
### Creating IBANs
|
28
|
+
|
29
|
+
All functionality is based around `IBAN` objects. To create one, simply pass a
|
30
|
+
string to `Ibandit::IBAN.new`. Note that you don't need to worry about case and
|
31
|
+
whitespace:
|
32
|
+
|
33
|
+
```ruby
|
34
|
+
iban = Ibandit::IBAN.new("xq75 B a dCode 666")
|
35
|
+
iban.to_s # => "XQ75BADCODE666"
|
36
|
+
iban.to_s(:formatted) # => "XQ75 BADC ODE6 66"
|
37
|
+
```
|
38
|
+
|
39
|
+
### Validating an IBAN
|
40
|
+
|
41
|
+
IBANs are validated based on their structure and check-digits:
|
42
|
+
|
43
|
+
```ruby
|
44
|
+
iban = Ibandit::IBAN.new("XQ75 BADCODE 666")
|
45
|
+
|
46
|
+
iban.valid? # => false
|
47
|
+
```
|
48
|
+
|
49
|
+
After validations, you can fetch details of any errors:
|
50
|
+
|
51
|
+
```ruby
|
52
|
+
iban.errors # => { country_code: "'XQ' is not a valid..." }
|
53
|
+
```
|
54
|
+
|
55
|
+
The following error keys may be set:
|
56
|
+
- `country_code`
|
57
|
+
- `check_digits`
|
58
|
+
- `characters`
|
59
|
+
- `length`
|
60
|
+
- `format`
|
61
|
+
|
62
|
+
### Deconstructing an IBAN into national banking details
|
63
|
+
|
64
|
+
SWIFT define the following components for IBANs, and publish details of how each
|
65
|
+
county combines them:
|
66
|
+
|
67
|
+
`country_code`
|
68
|
+
: The [ISO 3166-1](http://en.wikipedia.org/wiki/ISO_3166-1_alpha-2#Officially_assigned_code_elements) country code prefix
|
69
|
+
|
70
|
+
`check_digits`
|
71
|
+
: Two digits calculated using part of the ISO/IEC 7064:2003 standard
|
72
|
+
|
73
|
+
`bank_code`
|
74
|
+
: The SWIFT identifier for the bank to which the IBAN refers
|
75
|
+
|
76
|
+
`branch_code`
|
77
|
+
: The SWIFT identifer for the branch to which the IBAN refers (not used in all countries)
|
78
|
+
|
79
|
+
`account_number`
|
80
|
+
: The account number for the account
|
81
|
+
|
82
|
+
`iban_national_id`
|
83
|
+
: The national ID for the bank / branch as documented by SWIFT
|
84
|
+
|
85
|
+
The SWIFT IBAN components are all available as methods on an `IBAN` object:
|
86
|
+
|
87
|
+
```ruby
|
88
|
+
iban = Ibandit::IBAN.new("GB82 WEST 1234 5698 7654 32")
|
89
|
+
|
90
|
+
iban.country_code # => "GB"
|
91
|
+
iban.check_digits # => "82"
|
92
|
+
iban.bank_code # => "WEST"
|
93
|
+
iban.branch_code # => "123456"
|
94
|
+
iban.account_number # => "98765432"
|
95
|
+
iban.iban_national_id # => "WEST123456"
|
96
|
+
```
|
97
|
+
|
98
|
+
In addition, it is often useful to extract any local check digits from the IBAN.
|
99
|
+
These are available through a `local_check_digits` method:
|
100
|
+
|
101
|
+
```ruby
|
102
|
+
iban = Ibandit::IBAN.new("ES12 1234 5678 9112 3456 7890")
|
103
|
+
|
104
|
+
iban.local_check_digits # => "91"
|
105
|
+
```
|
106
|
+
|
107
|
+
### Initializing Ibandit
|
108
|
+
|
109
|
+
The UK and Ireland both use part of the BIC as the `bank_code` in their IBANs.
|
110
|
+
If you wish to construct UK or Irish IBANs you will either need to pass the
|
111
|
+
`bank_code` explicitly, or configure Ibandit with a BIC finder:
|
112
|
+
|
113
|
+
```ruby
|
114
|
+
# config/initializers/ibandit.rb
|
115
|
+
Ibandit.bic_finder = -> (country_code, national_id) do
|
116
|
+
# This assumes you have `BankDirectoryPlus` set up to access the data provided
|
117
|
+
# by SWIFTRef in their Bank Directory Plus product. The `national_id` is the
|
118
|
+
# local national ID, not the "IBAN National ID" referred to in the IBAN Plus
|
119
|
+
# file (since that is the `bank_code` and the `branch_code`).
|
120
|
+
BankDirectoryPlus.find_by(country_code: country_code,
|
121
|
+
national_id: national_id).
|
122
|
+
try(:bic)
|
123
|
+
end
|
124
|
+
```
|
125
|
+
|
126
|
+
### Creating an IBAN from national banking details
|
127
|
+
|
128
|
+
In many countries customers are familiar with national details rather than
|
129
|
+
their IBAN. For example, in the UK customers use their Account Number and Sort
|
130
|
+
Code.
|
131
|
+
|
132
|
+
To build an IBAN from local details:
|
133
|
+
|
134
|
+
```ruby
|
135
|
+
# Austria
|
136
|
+
iban = Ibandit::IBANBuilder.build(
|
137
|
+
country_code: 'AT',
|
138
|
+
account_number: '234573201',
|
139
|
+
bank_code: '19043'
|
140
|
+
)
|
141
|
+
iban.iban # => "AT611904300234573201"
|
142
|
+
|
143
|
+
# Belgium
|
144
|
+
iban = Ibandit::IBANBuilder.build(
|
145
|
+
country_code: 'BE',
|
146
|
+
account_number: '510-0075470-61'
|
147
|
+
)
|
148
|
+
iban.iban # => "BE62510007547061"
|
149
|
+
|
150
|
+
# Cyprus
|
151
|
+
iban = Ibandit::IBANBuilder.build(
|
152
|
+
country_code: 'CY',
|
153
|
+
account_number: '1200527600',
|
154
|
+
bank_code: '002',
|
155
|
+
branch_code: '00128'
|
156
|
+
)
|
157
|
+
iban.iban # => "CY17002001280000001200527600"
|
158
|
+
|
159
|
+
# Germany
|
160
|
+
iban = Ibandit::IBANBuilder.build(
|
161
|
+
country_code: 'DE',
|
162
|
+
bank_code: '37040044',
|
163
|
+
account_number: '0532013000'
|
164
|
+
)
|
165
|
+
iban.iban # => "DE89370400440532013000"
|
166
|
+
|
167
|
+
# Estonia
|
168
|
+
iban = Ibandit::IBANBuilder.build(
|
169
|
+
country_code: 'EE',
|
170
|
+
account_number: '111020145685'
|
171
|
+
)
|
172
|
+
iban.iban # => "EE412200111020145685"
|
173
|
+
|
174
|
+
# Finland
|
175
|
+
iban = Ibandit::IBANBuilder.build(
|
176
|
+
country_code: 'FI',
|
177
|
+
bank_code: '123456'
|
178
|
+
account_number: '785'
|
179
|
+
)
|
180
|
+
iban.iban # => "FI2112345600000785"
|
181
|
+
|
182
|
+
# France
|
183
|
+
iban = Ibandit::IBANBuilder.build(
|
184
|
+
country_code: 'FR',
|
185
|
+
bank_code: '20041',
|
186
|
+
branch_code: '01005',
|
187
|
+
account_number: '0500013M02606',
|
188
|
+
)
|
189
|
+
iban.iban # => "FR1420041010050500013M02606"
|
190
|
+
|
191
|
+
# United Kingdom
|
192
|
+
iban = Ibandit::IBANBuilder.build(
|
193
|
+
country_code: 'GB',
|
194
|
+
bank_code: 'BARC', # optional if a BIC finder is configured
|
195
|
+
branch_code: '200000',
|
196
|
+
account_number: '55779911'
|
197
|
+
)
|
198
|
+
iban.iban # => "GB60BARC20000055779911"
|
199
|
+
|
200
|
+
# Ireland
|
201
|
+
iban = Ibandit::IBANBuilder.build(
|
202
|
+
country_code: 'IE',
|
203
|
+
bank_code: 'AIBK', # optional if a BIC finder is configured
|
204
|
+
branch_code: '931152',
|
205
|
+
account_number: '12345678'
|
206
|
+
)
|
207
|
+
iban.iban # => "IE29AIBK93115212345678"
|
208
|
+
|
209
|
+
# Italy
|
210
|
+
iban = Ibandit::IBANBuilder.build(
|
211
|
+
country_code: 'IT',
|
212
|
+
bank_code: '05428',
|
213
|
+
branch_code: '11101',
|
214
|
+
account_number: '000000123456'
|
215
|
+
)
|
216
|
+
iban.iban # => "IT60X0542811101000000123456"
|
217
|
+
|
218
|
+
# Latvia
|
219
|
+
iban = Ibandit::IBANBuilder.build(
|
220
|
+
country_code: 'LV',
|
221
|
+
account_number: '1234567890123',
|
222
|
+
bank_code: 'BANK'
|
223
|
+
)
|
224
|
+
iban.iban # => "LV72BANK1234567890123"
|
225
|
+
|
226
|
+
# Luxembourg
|
227
|
+
iban = Ibandit::IBANBuilder.build(
|
228
|
+
country_code: 'LU',
|
229
|
+
account_number: '1234567890123',
|
230
|
+
bank_code: 'BANK'
|
231
|
+
)
|
232
|
+
iban.iban # => "LU75BANK1234567890123"
|
233
|
+
|
234
|
+
# Monaco
|
235
|
+
iban = Ibandit::IBANBuilder.build(
|
236
|
+
country_code: 'MC',
|
237
|
+
bank_code: '20041',
|
238
|
+
branch_code: '01005',
|
239
|
+
account_number: '0500013M026'
|
240
|
+
)
|
241
|
+
iban.iban # => "MC9320041010050500013M02606"
|
242
|
+
|
243
|
+
# The Netherlands
|
244
|
+
iban = Ibandit::IBANBuilder.build(
|
245
|
+
country_code: 'NL',
|
246
|
+
account_number: '0417164300',
|
247
|
+
bank_code: 'ABNA'
|
248
|
+
)
|
249
|
+
iban.iban # => "NL91ABNA0417164300"
|
250
|
+
|
251
|
+
# Portugal
|
252
|
+
iban = Ibandit::IBANBuilder.build(
|
253
|
+
country_code: 'PT',
|
254
|
+
bank_code: '0002',
|
255
|
+
branch_code: '0023',
|
256
|
+
account_number: '0023843000578'
|
257
|
+
)
|
258
|
+
iban.iban # => "PT50000200230023843000578"
|
259
|
+
|
260
|
+
# Slovakia
|
261
|
+
iban = Ibandit::IBANBuilder.build(
|
262
|
+
country_code: 'SK',
|
263
|
+
bank_code: '1200',
|
264
|
+
account_number_prefix: '19',
|
265
|
+
account_number: '8742637541'
|
266
|
+
)
|
267
|
+
iban.iban # => "SK3112000000198742637541"
|
268
|
+
|
269
|
+
# Slovenia
|
270
|
+
iban = Ibandit::IBANBuilder.build(
|
271
|
+
country_code: 'SI',
|
272
|
+
bank_code: '19100',
|
273
|
+
account_number: '1234'
|
274
|
+
)
|
275
|
+
iban.iban # => "SI56191000000123438"
|
276
|
+
|
277
|
+
# Spain
|
278
|
+
iban = Ibandit::IBANBuilder.build(
|
279
|
+
country_code: 'ES',
|
280
|
+
bank_code: '2310',
|
281
|
+
branch_code: '0001',
|
282
|
+
account_number: '180000012345'
|
283
|
+
)
|
284
|
+
iban.iban # => "ES8023100001180000012345"
|
285
|
+
|
286
|
+
# Spain with 20 digit account number
|
287
|
+
iban = Ibandit::IBANBuilder.build(
|
288
|
+
country_code: 'ES',
|
289
|
+
account_number: '23100001180000012345'
|
290
|
+
)
|
291
|
+
iban.iban # => "ES8023100001180000012345"
|
292
|
+
|
293
|
+
# San Marino
|
294
|
+
iban = Ibandit::IBANBuilder.build(
|
295
|
+
country_code: 'SM',
|
296
|
+
bank_code: '05428',
|
297
|
+
branch_code: '11101',
|
298
|
+
account_number: '000000123456'
|
299
|
+
)
|
300
|
+
iban.iban # => "SM88X0542811101000000123456"
|
301
|
+
```
|
302
|
+
|
303
|
+
Support for Greece and Malta is coming soon.
|