ktoblzcheck 1.44.0.beta
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.
- checksums.yaml +7 -0
- data/.gitignore +25 -0
- data/.rspec +2 -0
- data/.travis.yml +8 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +36 -0
- data/README.md +82 -0
- data/Rakefile +27 -0
- data/ext/ktoblzcheck/extconf.rb +22 -0
- data/ext/ktoblzcheck/ktoblzcheck.c +345 -0
- data/ktoblzcheck.gemspec +24 -0
- data/lib/ktoblzcheck.rb +100 -0
- data/spec/fixtures.yml +162 -0
- data/spec/iban_spec.rb +30 -0
- data/spec/ktoblzcheck_spec.rb +85 -0
- data/spec/spec_helper.rb +3 -0
- metadata +112 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 1b8bf15cb12ce936e0eebbcd42e7acbde80848e0
|
4
|
+
data.tar.gz: b6fa4cf43a7a0e77818ed3e99ba02fe83e7b7004
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 46149af8e24289311bb21b484fea7e247bf2f5ad80519c643f63161f641dfaa6167fbc64655a2758711f110be32c9d1b49b302c0bfebfcb4d1967a3c0bda5a7d
|
7
|
+
data.tar.gz: eedbaf5a2892fa5a315da7fdf98ce287bd3014d6d8856a22fa18b3e2d58fe976bc63d7b067428972aa5f6ee64182dc8bef7f697f79a61e049fc6deb091a3baa2
|
data/.gitignore
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
*.gem
|
2
|
+
*.rbc
|
3
|
+
.bundle
|
4
|
+
.config
|
5
|
+
.yardoc
|
6
|
+
Gemfile.lock
|
7
|
+
InstalledFiles
|
8
|
+
_yardoc
|
9
|
+
coverage
|
10
|
+
doc/
|
11
|
+
lib/bundler/man
|
12
|
+
pkg
|
13
|
+
rdoc
|
14
|
+
spec/reports
|
15
|
+
test/tmp
|
16
|
+
test/version_tmp
|
17
|
+
tmp
|
18
|
+
*~
|
19
|
+
.ruby-*
|
20
|
+
|
21
|
+
# buildables
|
22
|
+
ext/**/Makefile
|
23
|
+
ext/**/*.so
|
24
|
+
ext/**/*.o
|
25
|
+
ext/**/*.log
|
data/.rspec
ADDED
data/.travis.yml
ADDED
data/Gemfile
ADDED
data/LICENSE.txt
ADDED
@@ -0,0 +1,36 @@
|
|
1
|
+
(c) 2004 Sascha Loetz (sloetz ( a t ) web.de). All rights reserved.
|
2
|
+
|
3
|
+
Redistribution and use in source and binary forms of this software, with
|
4
|
+
or without modification, are permitted provided that the following
|
5
|
+
conditions are met:
|
6
|
+
|
7
|
+
1. Redistributions of source code must retain any existing copyright
|
8
|
+
notice, and this entire permission notice in its entirety,
|
9
|
+
including the disclaimer of warranties.
|
10
|
+
|
11
|
+
2. Redistributions in binary form must reproduce all prior and current
|
12
|
+
copyright notices, this list of conditions, and the following
|
13
|
+
disclaimer in the documentation and/or other materials provided
|
14
|
+
with the distribution.
|
15
|
+
|
16
|
+
3. The name of any author may not be used to endorse or promote
|
17
|
+
products derived from this software without their specific prior
|
18
|
+
written permission.
|
19
|
+
|
20
|
+
ALTERNATIVELY, this product may be distributed under the terms of the
|
21
|
+
GNU General Public License, in which case the provisions of the GNU
|
22
|
+
GPL are required INSTEAD OF the above restrictions. (This clause is
|
23
|
+
necessary due to a potential conflict between the GNU GPL and the
|
24
|
+
restrictions contained in a BSD-style copyright.)
|
25
|
+
|
26
|
+
THIS SOFTWARE IS PROVIDED AS IS'' AND ANY EXPRESS OR IMPLIED
|
27
|
+
WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
28
|
+
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
29
|
+
IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
|
30
|
+
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
31
|
+
BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
|
32
|
+
OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
33
|
+
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
|
34
|
+
TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
|
35
|
+
USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
|
36
|
+
DAMAGE.
|
data/README.md
ADDED
@@ -0,0 +1,82 @@
|
|
1
|
+
# KtoBlzCheck
|
2
|
+
|
3
|
+
[](https://travis-ci.org/dmke/ktoblzcheck)
|
4
|
+
|
5
|
+
`KtoBlzCheck` is a small Ruby extension for Linux (written in C) that provides an interface for
|
6
|
+
[`libktoblzcheck`](http://ktoblzcheck.sourceforge.net), a library to check German
|
7
|
+
account numbers and bank codes. It further provides a simple query method to find
|
8
|
+
bank codes, locations and names
|
9
|
+
|
10
|
+
Huge chunks of this RubyGem is based on the original Ruby/C implementation
|
11
|
+
[rbKtoBlzCheck](https://github.com/krudolph/rbktoblzcheck) by Kim Rudolph.
|
12
|
+
|
13
|
+
## Installation
|
14
|
+
|
15
|
+
You'll need
|
16
|
+
|
17
|
+
- Ruby v1.9.3 or higher (if you still run Ruby 1.8, use rbKtoBlzCheck)
|
18
|
+
- and `libktoblzcheck` (the package name may vary).
|
19
|
+
|
20
|
+
Add this line to your application's Gemfile:
|
21
|
+
|
22
|
+
gem 'ktoblzcheck'
|
23
|
+
|
24
|
+
And then execute:
|
25
|
+
|
26
|
+
$ bundle
|
27
|
+
|
28
|
+
Or install it yourself as:
|
29
|
+
|
30
|
+
$ gem install ktoblzcheck
|
31
|
+
|
32
|
+
If you get a warning like `Couldn't find header file ktoblzcheck.h`, make sure
|
33
|
+
you have `libktoblzcheck` installed. You can either fetch this library from
|
34
|
+
[SourceForge](http://ktoblzcheck.sourceforge.net) or install it on Debian/Ubuntu
|
35
|
+
with
|
36
|
+
|
37
|
+
# apt-get install -y libktoblzcheck1c2a libktoblzcheck1-dev
|
38
|
+
|
39
|
+
You can verify the installation e.g. by calling `locate ktoblzcheck.h`—this should
|
40
|
+
point to an existing file.
|
41
|
+
|
42
|
+
## Usage
|
43
|
+
|
44
|
+
require 'ktoblzcheck'
|
45
|
+
|
46
|
+
@bank_code = "20030700"
|
47
|
+
@account_no = "0"
|
48
|
+
|
49
|
+
puts "Testing Bank Code: #{@bank_code} / Account No. #{@account_no}"
|
50
|
+
|
51
|
+
KtoBlzCheck.new do |kbc|
|
52
|
+
name, location = kbc.find(@bank_code)
|
53
|
+
if name
|
54
|
+
puts "Bank found! #{name} located in #{location}"
|
55
|
+
else
|
56
|
+
puts "Bank not found!"
|
57
|
+
end
|
58
|
+
case kbc.check(@bank_code, @account_no)
|
59
|
+
when KtoBlzCheck::ERROR
|
60
|
+
puts "Failed, bank code and account number don't match"
|
61
|
+
when KtoBlzCheck::OK
|
62
|
+
puts "Success, valid combination of bank code and account number"
|
63
|
+
when KtoBlzCheck::UNKNOWN
|
64
|
+
puts "Unknown."
|
65
|
+
when KtoBlzCheck::BANK_NOT_KNOWN
|
66
|
+
puts "Unknown bank code"
|
67
|
+
else
|
68
|
+
puts "Never reached :)"
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
## License
|
73
|
+
|
74
|
+
3-clause BSD or GPL (see `LICENSE.txt`)
|
75
|
+
|
76
|
+
## Contributing
|
77
|
+
|
78
|
+
1. Fork it
|
79
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
80
|
+
3. Commit your changes (`git commit -am 'Add some feature'`)
|
81
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
82
|
+
5. Create new Pull Request
|
data/Rakefile
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
require "bundler/gem_tasks"
|
2
|
+
require "rspec/core/rake_task"
|
3
|
+
|
4
|
+
RSpec::Core::RakeTask.new(:spec)
|
5
|
+
|
6
|
+
task :spec_build do
|
7
|
+
Dir.chdir('ext/ktoblzcheck') do
|
8
|
+
output = `ruby extconf.rb`
|
9
|
+
raise output unless $? == 0
|
10
|
+
output = `make`
|
11
|
+
raise output unless $? == 0
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
task spec: :spec_build
|
16
|
+
task default: :spec
|
17
|
+
|
18
|
+
task console: :spec_build do
|
19
|
+
lib = File.expand_path('../lib', __FILE__)
|
20
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
21
|
+
|
22
|
+
require 'irb'
|
23
|
+
require 'irb/completion'
|
24
|
+
require 'ktoblzcheck'
|
25
|
+
ARGV.clear
|
26
|
+
IRB.start
|
27
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require 'mkmf'
|
2
|
+
|
3
|
+
if !have_header('ktoblzcheck.h')
|
4
|
+
STDERR.puts "Couldn't find header file ktoblzcheck.h. Install library files and try again\n"
|
5
|
+
STDERR.puts "Hint: visit http://ktoblzcheck.sourceforge.net to obtain a source distribution tar-ball or check the package archives of your distribution (e.g. for Debian `apt-get install libktoblzcheck1-dev`)"
|
6
|
+
exit 1
|
7
|
+
end
|
8
|
+
|
9
|
+
if !have_header('iban.h')
|
10
|
+
STDERR.puts "Couldn't find header file iban.h. Install library files and try again\n"
|
11
|
+
STDERR.puts "Hint: visit http://ktoblzcheck.sourceforge.net to obtain a source distribution tar-ball or check the package archives of your distribution (e.g. for Debian `apt-get install libktoblzcheck1-dev`)"
|
12
|
+
exit 1
|
13
|
+
end
|
14
|
+
|
15
|
+
if !have_library('ktoblzcheck')
|
16
|
+
STDERR.puts "Couldn't find link library libktoblzcheck. Install library files and try again\n"
|
17
|
+
STDERR.puts "Hint: visit http://ktoblzcheck.sourceforge.net to obtain a source distribution tar-ball or check the package archives of your distribution (e.g. for Debian `apt-get install libktoblzcheck1-dev`)"
|
18
|
+
exit 1
|
19
|
+
end
|
20
|
+
|
21
|
+
dir_config('ktoblzcheck')
|
22
|
+
create_makefile('ktoblzcheck')
|
@@ -0,0 +1,345 @@
|
|
1
|
+
/***************************************************************************
|
2
|
+
*
|
3
|
+
* (c) 2004 Sascha Loetz (sloetz ( a t ) web.de). All rights reserved.
|
4
|
+
*
|
5
|
+
*
|
6
|
+
* Redistribution and use in source and binary forms of this software, with
|
7
|
+
* or without modification, are permitted provided that the following
|
8
|
+
* conditions are met:
|
9
|
+
*
|
10
|
+
* 1. Redistributions of source code must retain any existing copyright
|
11
|
+
* notice, and this entire permission notice in its entirety,
|
12
|
+
* including the disclaimer of warranties.
|
13
|
+
*
|
14
|
+
* 2. Redistributions in binary form must reproduce all prior and current
|
15
|
+
* copyright notices, this list of conditions, and the following
|
16
|
+
* disclaimer in the documentation and/or other materials provided
|
17
|
+
* with the distribution.
|
18
|
+
*
|
19
|
+
* 3. The name of any author may not be used to endorse or promote
|
20
|
+
* products derived from this software without their specific prior
|
21
|
+
* written permission.
|
22
|
+
*
|
23
|
+
* ALTERNATIVELY, this product may be distributed under the terms of the
|
24
|
+
* GNU General Public License, in which case the provisions of the GNU
|
25
|
+
* GPL are required INSTEAD OF the above restrictions. (This clause is
|
26
|
+
* necessary due to a potential conflict between the GNU GPL and the
|
27
|
+
* restrictions contained in a BSD-style copyright.)
|
28
|
+
*
|
29
|
+
* THIS SOFTWARE IS PROVIDED AS IS'' AND ANY EXPRESS OR IMPLIED
|
30
|
+
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
31
|
+
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
32
|
+
* IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
|
33
|
+
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
34
|
+
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
|
35
|
+
* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
36
|
+
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
|
37
|
+
* TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
|
38
|
+
* USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
|
39
|
+
* DAMAGE.
|
40
|
+
*************************************************************************
|
41
|
+
*
|
42
|
+
* This file is part of the ktoblzcheck package available as a gem
|
43
|
+
*
|
44
|
+
* $Id: ktoblzcheck.c,v 1.1 2004/10/28 19:10:19 vdpsoftware Exp $
|
45
|
+
*
|
46
|
+
*************************************************************************/
|
47
|
+
#include <stdio.h>
|
48
|
+
#include <stdlib.h>
|
49
|
+
#include <unistd.h>
|
50
|
+
#include <ruby.h>
|
51
|
+
#include <ktoblzcheck.h>
|
52
|
+
#include <iban.h>
|
53
|
+
|
54
|
+
static VALUE g_error;
|
55
|
+
static VALUE g_ktoblzcheck;
|
56
|
+
static VALUE g_ktoblzcheck_iban;
|
57
|
+
static AccountNumberCheck* g_anc = NULL;
|
58
|
+
static IbanCheck* g_ic = NULL;
|
59
|
+
|
60
|
+
#ifndef RUBY_19
|
61
|
+
#ifndef RSTRING_PTR
|
62
|
+
#define RSTRING_PTR(v) (RSTRING(v)->ptr)
|
63
|
+
#endif
|
64
|
+
#endif
|
65
|
+
|
66
|
+
/*
|
67
|
+
* call-seq:
|
68
|
+
* kbc.close -> nil
|
69
|
+
*
|
70
|
+
* Closes the KtoBlzCheck object's handle for `libktoblzcheck`. Must be called
|
71
|
+
* to prevent resource leaks if the constructor is not used with block syntax.
|
72
|
+
*/
|
73
|
+
static VALUE
|
74
|
+
close_anc(VALUE self) {
|
75
|
+
if (NULL != g_anc) {
|
76
|
+
AccountNumberCheck_delete(g_anc);
|
77
|
+
}
|
78
|
+
return Qnil;
|
79
|
+
}
|
80
|
+
|
81
|
+
static VALUE
|
82
|
+
close_ic(VALUE self) {
|
83
|
+
if (NULL != g_ic) {
|
84
|
+
IbanCheck_free(g_ic);
|
85
|
+
}
|
86
|
+
return Qnil;
|
87
|
+
}
|
88
|
+
|
89
|
+
/*
|
90
|
+
* call-seq:
|
91
|
+
* KtoBlzCheck.new([datapath]) {|kbc| block } -> nil
|
92
|
+
* KtoBlzCheck.new([datapath]) -> kbc
|
93
|
+
*
|
94
|
+
* Constructs a new KtoBlzCheck object, returns it or passes it to an optional
|
95
|
+
* code block. If no block is provided, the user must call `kbc.close` to
|
96
|
+
* ensure that all resources are freed after usage.
|
97
|
+
*
|
98
|
+
* If a parameter is passed to new it is interpreted as the path to the data
|
99
|
+
* file to be used by `libktoblzcheck`. When the parameter is omitted, the
|
100
|
+
* default file of `libktoblzcheck` is used (usually
|
101
|
+
* `/usr/[local/]share/[lib]ktoblzcheck[*]/bankdata.txt`).
|
102
|
+
*
|
103
|
+
* A `nil` value passed as parameter is ignored.
|
104
|
+
*/
|
105
|
+
static VALUE
|
106
|
+
init_anc(int argc, VALUE *argv, VALUE self)
|
107
|
+
{
|
108
|
+
VALUE dp = Qnil;
|
109
|
+
|
110
|
+
rb_scan_args(argc, argv, "01", &dp);
|
111
|
+
|
112
|
+
if (Qnil == dp) {
|
113
|
+
/* no parameter given */
|
114
|
+
g_anc = AccountNumberCheck_new();
|
115
|
+
} else {
|
116
|
+
/* a path to a different data path was passed to method */
|
117
|
+
Check_Type(dp, T_STRING);
|
118
|
+
|
119
|
+
/*
|
120
|
+
* The libktoblzcheck constructor writes an error message to stderr if the
|
121
|
+
* given data filen can not be accessed :(
|
122
|
+
* Additionally, we don't get a proper return value which could be used to
|
123
|
+
* test for success (it's a C++ constructor that we are calling). Even a
|
124
|
+
* successful intialization (i.e. we get a `pointer != NULL` from
|
125
|
+
* `AccountNumberCheck_new_file` doesn't mean that the opened file is a
|
126
|
+
* valid data file).
|
127
|
+
*
|
128
|
+
* We do basic access checking ourselves and hope for the best :)
|
129
|
+
*/
|
130
|
+
|
131
|
+
if (0 != access(RSTRING_PTR(dp), R_OK)) {
|
132
|
+
rb_raise(g_error, "Can't access file %s", RSTRING_PTR(dp));
|
133
|
+
}
|
134
|
+
g_anc = AccountNumberCheck_new_file(RSTRING_PTR(dp));
|
135
|
+
}
|
136
|
+
|
137
|
+
/* did we successfully obtain an AccountNumberCheck handle? */
|
138
|
+
|
139
|
+
if (NULL == g_anc) {
|
140
|
+
rb_raise(g_error, "Couldn't initialize libktoblzcheck");
|
141
|
+
return Qnil;
|
142
|
+
}
|
143
|
+
|
144
|
+
if (rb_block_given_p()) {
|
145
|
+
return rb_ensure(rb_yield, self, close_anc, self);
|
146
|
+
} else {
|
147
|
+
return self;
|
148
|
+
}
|
149
|
+
}
|
150
|
+
|
151
|
+
static VALUE
|
152
|
+
init_ic(int argc, VALUE *argv, VALUE self)
|
153
|
+
{
|
154
|
+
VALUE dp = Qnil;
|
155
|
+
|
156
|
+
rb_scan_args(argc, argv, "01", &dp);
|
157
|
+
|
158
|
+
if (Qnil == dp) {
|
159
|
+
/* no parameter given */
|
160
|
+
g_ic = IbanCheck_new(NULL);
|
161
|
+
} else {
|
162
|
+
/* a path to a different data path was passed to method */
|
163
|
+
Check_Type(dp, T_STRING);
|
164
|
+
|
165
|
+
if (0 != access(RSTRING_PTR(dp), R_OK)) {
|
166
|
+
rb_raise(g_error, "Can't access file %s", RSTRING_PTR(dp));
|
167
|
+
}
|
168
|
+
g_ic = IbanCheck_new(RSTRING_PTR(dp));
|
169
|
+
}
|
170
|
+
|
171
|
+
/* did we successfully obtain an AccountNumberCheck handle? */
|
172
|
+
if (NULL == g_ic) {
|
173
|
+
rb_raise(g_error, "Couldn't initialize libktoblzcheck");
|
174
|
+
return Qnil;
|
175
|
+
}
|
176
|
+
|
177
|
+
if (rb_block_given_p()) {
|
178
|
+
return rb_ensure(rb_yield, self, close_ic, self);
|
179
|
+
} else {
|
180
|
+
return self;
|
181
|
+
}
|
182
|
+
}
|
183
|
+
|
184
|
+
/*
|
185
|
+
* call-seq:
|
186
|
+
* kbc.check(bank_code, account_no) -> fixnum
|
187
|
+
*
|
188
|
+
* Checks if `bank_code` and `account_no` form a valid combination. The
|
189
|
+
* returned Fixnum indicates the result. The following constants can be
|
190
|
+
* used test the result:
|
191
|
+
*
|
192
|
+
* KtoBlzCheck::OK #=> valid combination of bank code and account number
|
193
|
+
* KtoBlzCheck::ERROR #=> !OK
|
194
|
+
* KtoBlzCheck::UNKNOWN #=> no verification possible for unknown reason
|
195
|
+
* KtoBlzCheck::BANK_NOT_KNOWN #=> bank code not known
|
196
|
+
*
|
197
|
+
* If `bank_code` and `account_no` are not of type String, a TypeError is raised.
|
198
|
+
*/
|
199
|
+
static VALUE
|
200
|
+
check_acn(VALUE self, VALUE blz, VALUE account)
|
201
|
+
{
|
202
|
+
AccountNumberCheck_Result res;
|
203
|
+
Check_Type(blz, T_STRING);
|
204
|
+
Check_Type(account, T_STRING);
|
205
|
+
|
206
|
+
res = AccountNumberCheck_check(g_anc, RSTRING_PTR(blz), RSTRING_PTR(account));
|
207
|
+
return INT2FIX(res);
|
208
|
+
}
|
209
|
+
|
210
|
+
static VALUE
|
211
|
+
check_ic(VALUE self, VALUE iban, VALUE country)
|
212
|
+
{
|
213
|
+
IbanCheck_Result res;
|
214
|
+
Check_Type(iban, T_STRING);
|
215
|
+
Check_Type(country, T_STRING);
|
216
|
+
|
217
|
+
res = IbanCheck_check_str(g_ic, RSTRING_PTR(iban), RSTRING_PTR(country));
|
218
|
+
return INT2FIX(res);
|
219
|
+
}
|
220
|
+
|
221
|
+
/*
|
222
|
+
* call-seq:
|
223
|
+
* kbc.num_records -> fixnum
|
224
|
+
*
|
225
|
+
* Returns the number of entries in the currently used data file for
|
226
|
+
* `libktoblzcheck`.
|
227
|
+
*/
|
228
|
+
static VALUE
|
229
|
+
num_records(VALUE self)
|
230
|
+
{
|
231
|
+
return INT2FIX(AccountNumberCheck_bankCount(g_anc));
|
232
|
+
}
|
233
|
+
|
234
|
+
/*
|
235
|
+
* call-seq:
|
236
|
+
* kbc.find(bank_code) -> array
|
237
|
+
*
|
238
|
+
* Looks up bank name and bank location (city) for the bank identified by
|
239
|
+
* `bank_code`.
|
240
|
+
*
|
241
|
+
* Returns an array with the bank's name (index 0) and the bank's location
|
242
|
+
* (index 1). The returned array is empty if no bank is found for the given
|
243
|
+
* bank code.
|
244
|
+
*/
|
245
|
+
static VALUE
|
246
|
+
find_info(VALUE self, VALUE blz)
|
247
|
+
{
|
248
|
+
VALUE ret = rb_ary_new2(2);
|
249
|
+
const AccountNumberCheck_Record* cr;
|
250
|
+
|
251
|
+
Check_Type(blz, T_STRING);
|
252
|
+
|
253
|
+
cr = AccountNumberCheck_findBank(g_anc, RSTRING_PTR(blz));
|
254
|
+
|
255
|
+
if (NULL != cr) {
|
256
|
+
rb_ary_push(ret, rb_str_new2(AccountNumberCheck_Record_bankName(cr)));
|
257
|
+
rb_ary_push(ret, rb_str_new2(AccountNumberCheck_Record_location(cr)));
|
258
|
+
}
|
259
|
+
|
260
|
+
return ret;
|
261
|
+
}
|
262
|
+
|
263
|
+
/*
|
264
|
+
* call-seq:
|
265
|
+
* KtoBlzCheck.bankdata_dir -> string
|
266
|
+
*
|
267
|
+
* Returns the directory where the bankdata file is stored, usually
|
268
|
+
* `/usr/[local/]share/[lib]ktoblzcheck[*]/`.
|
269
|
+
*/
|
270
|
+
static VALUE
|
271
|
+
bankdata_dir()
|
272
|
+
{
|
273
|
+
return rb_str_new2(AccountNumberCheck_bankdata_dir());
|
274
|
+
}
|
275
|
+
|
276
|
+
/*
|
277
|
+
* call-seq:
|
278
|
+
* KtoBlzCheck.encoding -> string
|
279
|
+
*
|
280
|
+
* Returns the character encoding that is used when strings are returned. So
|
281
|
+
* far this has been `ISO-8859-15` (up to and including version 1.11), but at
|
282
|
+
* some point in the future it might change into `UTF-8`.
|
283
|
+
*
|
284
|
+
* For Ruby scripts, this value has little to no relevance, except you want to
|
285
|
+
* mess with `KtoBlzCheck.bankdata_dir`.
|
286
|
+
*/
|
287
|
+
static VALUE
|
288
|
+
encoding()
|
289
|
+
{
|
290
|
+
return rb_str_new2(AccountNumberCheck_stringEncoding());
|
291
|
+
}
|
292
|
+
|
293
|
+
/*
|
294
|
+
* Document-class: KtoBlzCheck
|
295
|
+
*
|
296
|
+
* A collection of methods around German bank account checks.
|
297
|
+
*/
|
298
|
+
|
299
|
+
/*
|
300
|
+
* Document-class: KtoBlzCheck::Error
|
301
|
+
*
|
302
|
+
* Error thrown, when the underlying `libktoblzcheck` fails to complete a task.
|
303
|
+
*/
|
304
|
+
|
305
|
+
/*
|
306
|
+
* Ruby extension stuff
|
307
|
+
*/
|
308
|
+
void
|
309
|
+
Init_ktoblzcheck()
|
310
|
+
{
|
311
|
+
g_ktoblzcheck = rb_define_class("KtoBlzCheck", rb_cObject);
|
312
|
+
g_error = rb_define_class_under(g_ktoblzcheck, "Error", rb_eStandardError);
|
313
|
+
|
314
|
+
rb_define_singleton_method(g_ktoblzcheck, "bankdata_dir", bankdata_dir, 0);
|
315
|
+
rb_define_singleton_method(g_ktoblzcheck, "encoding", encoding, 0);
|
316
|
+
|
317
|
+
rb_define_const(g_ktoblzcheck, "VERSION", rb_str_new2(AccountNumberCheck_libraryVersion()));
|
318
|
+
|
319
|
+
rb_define_const(g_ktoblzcheck, "OK", INT2FIX(0));
|
320
|
+
rb_define_const(g_ktoblzcheck, "UNKNOWN", INT2FIX(1));
|
321
|
+
rb_define_const(g_ktoblzcheck, "ERROR", INT2FIX(2));
|
322
|
+
rb_define_const(g_ktoblzcheck, "BANK_NOT_KNOWN", INT2FIX(3));
|
323
|
+
|
324
|
+
rb_define_method(g_ktoblzcheck, "initialize", init_anc, -1);
|
325
|
+
rb_define_method(g_ktoblzcheck, "check", check_acn, 2);
|
326
|
+
rb_define_method(g_ktoblzcheck, "num_records", num_records, 0);
|
327
|
+
rb_define_method(g_ktoblzcheck, "close", close_anc, 0);
|
328
|
+
rb_define_method(g_ktoblzcheck, "find", find_info, 1);
|
329
|
+
|
330
|
+
g_ktoblzcheck_iban = rb_define_class_under(g_ktoblzcheck, "IBAN", rb_cObject);
|
331
|
+
|
332
|
+
rb_define_const(g_ktoblzcheck_iban, "VERSION", rb_str_new2(AccountNumberCheck_libraryVersion())); /* yup. */
|
333
|
+
|
334
|
+
rb_define_const(g_ktoblzcheck_iban, "OK", INT2FIX(0));
|
335
|
+
rb_define_const(g_ktoblzcheck_iban, "TOO_SHORT", INT2FIX(1));
|
336
|
+
rb_define_const(g_ktoblzcheck_iban, "PREFIX_NOT_FOUND", INT2FIX(2));
|
337
|
+
rb_define_const(g_ktoblzcheck_iban, "WRONG_LENGTH", INT2FIX(3));
|
338
|
+
rb_define_const(g_ktoblzcheck_iban, "COUNTRY_NOT_FOUND", INT2FIX(4));
|
339
|
+
rb_define_const(g_ktoblzcheck_iban, "WRONG_COUNTRY", INT2FIX(5));
|
340
|
+
rb_define_const(g_ktoblzcheck_iban, "BAD_CHECKSUM", INT2FIX(6));
|
341
|
+
|
342
|
+
rb_define_method(g_ktoblzcheck_iban, "initialize", init_ic, -1);
|
343
|
+
rb_define_method(g_ktoblzcheck_iban, "check", check_ic, 2);
|
344
|
+
rb_define_method(g_ktoblzcheck_iban, "close", close_ic, 0);
|
345
|
+
}
|
data/ktoblzcheck.gemspec
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
|
5
|
+
Gem::Specification.new do |spec|
|
6
|
+
spec.name = "ktoblzcheck"
|
7
|
+
spec.version = "1.44.0.beta"
|
8
|
+
spec.authors = ["Sascha Loetz", "Kim Rudolph", "Dominik Menke"]
|
9
|
+
spec.email = ["kim.rudolph@web.de", "dom@digineo.de"]
|
10
|
+
spec.description =
|
11
|
+
spec.summary = %q{ktoblzcheck is an interface for libktoblzcheck, a library to check German account numbers and bank codes. See http://ktoblzcheck.sourceforge.net for details.}
|
12
|
+
spec.homepage = "http://github.com/dmke/ktoblzcheck"
|
13
|
+
spec.license = "GPL"
|
14
|
+
|
15
|
+
spec.files = `git ls-files`.split($/)
|
16
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
17
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
18
|
+
spec.require_paths = ["ext", "lib"]
|
19
|
+
spec.extensions = ["ext/ktoblzcheck/extconf.rb"]
|
20
|
+
|
21
|
+
spec.add_development_dependency "bundler", "~> 1.3"
|
22
|
+
spec.add_development_dependency "rake"
|
23
|
+
spec.add_development_dependency "rspec"
|
24
|
+
end
|
data/lib/ktoblzcheck.rb
ADDED
@@ -0,0 +1,100 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
|
3
|
+
require 'ktoblzcheck/ktoblzcheck'
|
4
|
+
require 'pathname'
|
5
|
+
|
6
|
+
class KtoBlzCheck
|
7
|
+
RESULT_CODES = {
|
8
|
+
OK => 'OK',
|
9
|
+
UNKNOWN => 'unknown validation algorithm',
|
10
|
+
ERROR => 'account and bank do not match',
|
11
|
+
BANK_NOT_KNOWN => 'bank is unknown'
|
12
|
+
}
|
13
|
+
|
14
|
+
# A simple data structure to hold basic bank information.
|
15
|
+
#
|
16
|
+
# @param blz "Bankleitzahl, BLZ", German bank identification number
|
17
|
+
# @param mid checksum method id (is only internally used)
|
18
|
+
# @param name bank name
|
19
|
+
# @param location bank location
|
20
|
+
class Bank < Struct.new(:blz, :mid, :name, :location)
|
21
|
+
# @returns string representation
|
22
|
+
def to_s
|
23
|
+
[blz, name, location].join(', ')
|
24
|
+
end
|
25
|
+
|
26
|
+
# Check whether BLZ, name or location matches against query parameter.
|
27
|
+
#
|
28
|
+
# @param [Regexp] query
|
29
|
+
# @returns A truthy value, if match was positive
|
30
|
+
def matches?(query)
|
31
|
+
[blz, name, location].any?{|e| e =~ query }
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
# an exhaustive list of banks.
|
36
|
+
KNOWN_BANKS = begin
|
37
|
+
known = []
|
38
|
+
Pathname.new(bankdata_dir).children.select{|c|
|
39
|
+
c.basename.to_s =~ /^bankdata.*\.txt$/
|
40
|
+
}.sort.last.open("r:#{encoding}:#{__ENCODING__}") do |f|
|
41
|
+
f.readlines.each do |l|
|
42
|
+
known << Bank.new(*l.strip.split("\t"))
|
43
|
+
end
|
44
|
+
end
|
45
|
+
known
|
46
|
+
end
|
47
|
+
|
48
|
+
# Query the known banks and search for the given particle.
|
49
|
+
#
|
50
|
+
# @param [#to_s] query a particle to match against BLZ, bank name or bank location.
|
51
|
+
# @param [int|nil] limit maximum result length (default to 10), `nil` disables limit.
|
52
|
+
# @returns [Array] query result list
|
53
|
+
def self.search(query, limit=10)
|
54
|
+
candidates = []
|
55
|
+
q = Regexp.new Regexp.escape(query), Regexp::IGNORECASE
|
56
|
+
|
57
|
+
KNOWN_BANKS.each do |b|
|
58
|
+
break if candidates.size > limit
|
59
|
+
candidates << b.to_s if b.matches?(q)
|
60
|
+
end
|
61
|
+
|
62
|
+
candidates
|
63
|
+
end
|
64
|
+
|
65
|
+
def self.check(blz, kto)
|
66
|
+
res = nil
|
67
|
+
new {|e| res = e.check(blz.to_s, kto.to_s) }
|
68
|
+
res
|
69
|
+
end
|
70
|
+
|
71
|
+
def self.check!(blz, kto)
|
72
|
+
res = check(blz, kto)
|
73
|
+
return true if res == OK
|
74
|
+
raise KtoBlzCheck::Error, RESULT_CODES[res]
|
75
|
+
end
|
76
|
+
|
77
|
+
class IBAN
|
78
|
+
RESULT_CODES = {
|
79
|
+
OK => 'IBAN is ok',
|
80
|
+
TOO_SHORT => 'IBAN is too short',
|
81
|
+
PREFIX_NOT_FOUND => 'unknown IBAN country prefix',
|
82
|
+
WRONG_LENGTH => 'wrong length of IBAN',
|
83
|
+
COUNTRY_NOT_FOUND => 'country for IBAN not found',
|
84
|
+
WRONG_COUNTRY => 'IBAN prefix does not match for country',
|
85
|
+
BAD_CHECKSUM => 'bad checksum'
|
86
|
+
}
|
87
|
+
|
88
|
+
def self.check(iban)
|
89
|
+
res = nil
|
90
|
+
new {|e| res = e.check(iban.gsub(/\s+/, ''), iban[0,2].upcase) }
|
91
|
+
res
|
92
|
+
end
|
93
|
+
|
94
|
+
def self.check!(iban)
|
95
|
+
res = check(iban)
|
96
|
+
return true if res == OK
|
97
|
+
raise KtoBlzCheck::Error, RESULT_CODES[res]
|
98
|
+
end
|
99
|
+
end
|
100
|
+
end
|
data/spec/fixtures.yml
ADDED
@@ -0,0 +1,162 @@
|
|
1
|
+
# extracted from http://www.bundesbank.de/Redaktion/DE/Downloads/Kerngeschaeftsfelder/Unbarer_Zahlungsverkehr/pruefzifferberechnungsmethoden.pdf
|
2
|
+
# updated version from 09/2013
|
3
|
+
#
|
4
|
+
# notation: checksum method -> example account numbers
|
5
|
+
ok:
|
6
|
+
'00': ['9290701', '539290858', '1501824', '1501832']
|
7
|
+
'06': ['94012341', '5073321010']
|
8
|
+
'10': ['12345008', '87654008']
|
9
|
+
'17': ['0446786040']
|
10
|
+
'19': ['0240334000', '0200520016']
|
11
|
+
'24': ['138301', '1306118605', '3307118608', '9307118603']
|
12
|
+
'25': ['521382181']
|
13
|
+
'26': ['0520309001', '1111118111', '0005501024']
|
14
|
+
'27': ['2847169488']
|
15
|
+
'28': ['19999000', '9130000201']
|
16
|
+
'29': ['3145863029']
|
17
|
+
'31': ['1000000524', '1000000583']
|
18
|
+
'32': ['9141405', '1709107983', '0122116979', '0121114867', '9030101192', '9245500460']
|
19
|
+
'33': ['48658', '84956']
|
20
|
+
'34': ['9913000700', '9914001000']
|
21
|
+
'35': ['0000108443', '0000107451', '0000102921', '0000102349', '0000101709', '0000101599']
|
22
|
+
'36': ['113178', '146666']
|
23
|
+
'37': ['624315', '632500']
|
24
|
+
'38': ['191919', '1100660']
|
25
|
+
'39': ['200205', '10019400']
|
26
|
+
'40': ['1258345', '3231963']
|
27
|
+
'41': ['4013410024', '4016660195', '0166805317', '4019310079', '4019340829', '4019151002']
|
28
|
+
'42': ['59498', '59510']
|
29
|
+
'43': ['6135244', '9516893476']
|
30
|
+
'44': ['889006', '2618040504']
|
31
|
+
'45': ['0994681254', '0000012340', '1000199999', '0100114240']
|
32
|
+
'46': ['0235468612', '0837890901', '1041447600']
|
33
|
+
'47': ['1018000', '1003554450']
|
34
|
+
'50': ['4000005001', '4444442001']
|
35
|
+
'51': ['0001156071', '0001156136', '0001156078', '0001234567', '340968', '201178', '1009588', '0000156071', '101356073', '0199100002', '0099100010', '2599100002', '0199100004', '2599100003', '3199204090']
|
36
|
+
'54': ['4964137395', '4900010987', '64137395', '00010987']
|
37
|
+
'56': ['0290545005', '9718304037']
|
38
|
+
'57': ['7500021766', '9400001734', '7800028282', '8100244186', '3251080371', '3891234567', '7777778800', '5001050352', '5045090090', '1909700805', '9322111030', '7400060823']
|
39
|
+
'58': ['1800881120', '9200654108', '1015222224', '3703169668']
|
40
|
+
'61': ['2063099200', '0260760481']
|
41
|
+
'62': ['5029076701']
|
42
|
+
'63': ['123456600', '0001234566']
|
43
|
+
'64': ['1206473010', '5016511020']
|
44
|
+
'65': ['1234567400', '1234567590']
|
45
|
+
'66': ['100154508', '101154508', '100154516', '101154516']
|
46
|
+
'68': ['8889654328', '987654324', '987654328']
|
47
|
+
'69': ['9721134869', '1234567900', '1234567006']
|
48
|
+
'71': ['7101234007']
|
49
|
+
'73': ['0003503398', '0001340967', '0003503391', '0001340968', '0003503392', '0001340966', '123456']
|
50
|
+
'74': ['1016', '26260', '242243', '242248', '18002113', '1821200043']
|
51
|
+
'76': ['0006543200', '9012345600', '7876543100']
|
52
|
+
'77': ['10338', '13844', '65354', '69258']
|
53
|
+
'78': ['7581499', '9999999981']
|
54
|
+
'79': ['3230012688', '4230028872', '5440001898', '6330001063', '7000149349', '8000003577', '1550167850', '9011200140']
|
55
|
+
'80': ['340968', '370966']
|
56
|
+
'81': ['0646440', '1359100']
|
57
|
+
'82': ['123897', '3199500501']
|
58
|
+
'83': ['0001156071', '0001156136', '0000156078', '0000156071', '0099100002']
|
59
|
+
'84': ['240699', '350982', '461059', '240692', '350985', '461052', '240961', '350984', '461054']
|
60
|
+
'85': ['0001156071', '0001156136', '0000156078', '0000156071', '3199100002']
|
61
|
+
'86': ['340968', '1001171', '1009588', '123897', '340960']
|
62
|
+
'87': ['0000000406', '0000051768', '0010701590', '0010720185', '0000100005', '0000393814', '0000950360', '3199500501']
|
63
|
+
'88': ['2525259', '1000500', '90013000', '92525253', '99913003']
|
64
|
+
'89': ['1098506', '32028008', '218433000']
|
65
|
+
'90': ['0001975641', '0001988654', '0000863530', '0000784451', '0000654321', '0000824491', '0000677747', '0000840507', '0000996663', '0000666034', '0099100002']
|
66
|
+
'91': ['2974118000', '5281741000', '9952810000', '2974117000', '5281770000', '9952812000', '8840019000', '8840050000', '8840087000', '8840045000', '8840012000', '8840055000', '8840080000']
|
67
|
+
'93': ['6714790000', '0000671479', '1277830000', '0000127783', '1277910000', '0000127791', '3067540000', '0000306754']
|
68
|
+
'94': ['6782533003']
|
69
|
+
'95': ['0068007003', '0847321750', '6450060494', '6454000003']
|
70
|
+
'96': ['0000000208', '0101115152', '0301204301']
|
71
|
+
'97': ['24010019']
|
72
|
+
'98': ['9619439213', '3009800016', '9619509976', '5989800173', '9619319999', '6719430018']
|
73
|
+
'99': ['0068007003', '0847321750']
|
74
|
+
'A0': ['521003287', '54500', '3287', '18761', '28290']
|
75
|
+
'A1': ['0010030005', '0010030997', '1010030054']
|
76
|
+
'A2': ['3456789012']
|
77
|
+
'A3': ['1234567897', '0123456782', '9876543210', '1234567890', '0123456789']
|
78
|
+
'A4': ['0004711173', '0007093330', '0004711172', '0007093335', '1199503010', '8499421235', '0000862342', '8997710000', '0664040000', '0000905844', '5030101099', '0001123458', '1299503117']
|
79
|
+
'A5': ['9941510001', '9961230019', '9380027210', '9932290910', '0000251437', '0007948344', '0000159590', '0000051640']
|
80
|
+
'A6': ['17', '55300030', '150178033', '600003555', '900291823']
|
81
|
+
'A7': ['19010008', '19010438', '19010660', '19010876', '209010892']
|
82
|
+
'A8': ['7436661', '7436670', '1359100', '7436660', '7436678', '0003503398', '0001340967']
|
83
|
+
'A9': ['5043608', '86725', '504360', '822035', '32577083']
|
84
|
+
'B0': ['1197423162', '1000000606', '1000000406', '1035791538', '1126939724', '1197423460']
|
85
|
+
'B1': ['1434253150', '2746315471', '7414398260', '8347251693']
|
86
|
+
'B2': ['0020012357', '0080012345', '0926801910', '1002345674', '8000990054', '9000481805']
|
87
|
+
'B3': ['1000000060', '0000000140', '0000000019', '1002798417', '8409915001', '9635000101', '9730200100']
|
88
|
+
'B4': ['9941510001', '9961230019', '9380027210', '9932290910', '0000251437', '0007948344', '0000051640']
|
89
|
+
'B5': ['0159006955', '2000123451', '1151043216', '9000939033', '0123456782', '0130098767', '1045000252']
|
90
|
+
'B6': ['9110000000', '0269876545', '487310018']
|
91
|
+
'B7': ['0700001529', '0730000019', '0001001008', '0001057887', '0001007222', '0810011825', '0800107653', '0005922372']
|
92
|
+
'B8': ['0734192657', '6932875274', '3145863029', '2938692523']
|
93
|
+
'B9': ['87920187', '41203755', '81069577', '61287958', '58467232', '7125633', '1253657', '4353631']
|
94
|
+
'C0': ['43001500', '48726458', '0082335729', '0734192657', '6932875274']
|
95
|
+
'C1': ['0446786040', '0478046940', '0701625830', '0701625840', '0882095630', '5432112349', '5543223456', '5654334563', '5765445670', '5876556788']
|
96
|
+
'C2': ['2394871426', '4218461950', '7352569148', '5127485166', '8738142564']
|
97
|
+
'C3': ['9294182', '4431276', '19919', '9000420530', '9000010006', '9000577650']
|
98
|
+
'C4': ['0000000019', '0000292932', '0000094455', '9000420530', '9000010006', '9000577650']
|
99
|
+
'C5': ['0000301168', '0000302554', '0300020050', '0300566000', '1000061378', '1000061412', '4450164064', '4863476104', '5000000028', '5000000391', '6450008149', '6800001016', '9000100012', '9000210017', '3060188103', '3070402023']
|
100
|
+
'C6': ['0000065516', '0203178249', '1031405209', '1082012201', '2003455189', '2004001016', '3110150986', '3068459207', '5035105948', '5286102149', '4012660028', '4100235626', '6028426119', '6861001755', '7008199027', '7002000023', '8526080015', '8711072264', '9000430223', '9000781153']
|
101
|
+
'C7': ['3500022', '38150900', '600103660', '39101181', '94012341', '5073321010']
|
102
|
+
'C8': ['3456789019', '5678901231', '3456789012', '0022007130', '0123456789', '0552071285']
|
103
|
+
'C9': ['3456789019', '5678901231', '0123456789']
|
104
|
+
'D0': ['6100272324', '6100273479']
|
105
|
+
'D1': ['0082012203', '1452683581', '2129642505', '3002000027', '4230001407', '5000065514', '6001526215', '7126502149', '9000430223']
|
106
|
+
'D2': ['189912137', '235308215', '4455667784', '1234567897', '51181008', '71214205']
|
107
|
+
'D3': ['1600169591', '1600189151', '1800084079', '6019937007', '6021354007', '6030642006']
|
108
|
+
'D4': ['1112048219', '2024601814', '3000005012', '4143406984', '5926485111', '6286304975', '7900256617', '8102228628', '9002364588']
|
109
|
+
'D5': ['5999718138', '1799222116', '0099632004', '0004711173', '0007093330', '0000127787', '0004711172', '0007093335', '0000100062', '0000100088']
|
110
|
+
'D6': ['3409', '585327', '1650513', '3601671056', '4402001046', '6100268241', '7001000681', '9000111105', '9001291005']
|
111
|
+
'D7': ['0500018205', '0230103715', '0301000434', '0330035104', '0420001202', '0134637709', '0201005939', '0602006999']
|
112
|
+
'D8': ['1403414848', '6800000439', '6899999954']
|
113
|
+
'D9': ['1234567897', '0123456782', '9876543210', '1234567890', '0123456789', '1100132044', '1100669030']
|
114
|
+
'E0': ['1234568013', '1534568010', '2610015', '8741013011']
|
115
|
+
error:
|
116
|
+
'51': ['0001156078', '0000156079', '0001234566', '0012345678', '0023456783', '0076543211', '0123412345', '67493647', '0199100004', '2599100003', '0099345678', '0099345678', '0099100110', '0199100040']
|
117
|
+
'57': ['5302707782', '6412121212', '1813499124', '2206735010']
|
118
|
+
'73': ['0003503391', '0001340966', '0003503392', '0001340966', '121212', '987654321']
|
119
|
+
'74': ['1011', '26265', '18002118', '6160000024']
|
120
|
+
'84': ['240965', '350980', '461053', '240965', '350980', '461053', '240965', '350980', '461053']
|
121
|
+
'90': ['0001924592', '0000654321', '0000901568', '0000997664', '0000863536', '0000820487', '0000820484', '0000654328', '0000726393', '0000677742', '0000726391', '0000924591', '0099100007']
|
122
|
+
'91': ['8840017000', '8840023000', '8840041000', '8840014000', '8840026000', '8840045000', '8840011000', '8840025000', '8840062000', '840010000', '8840057000']
|
123
|
+
'A1': ['0110030005', '0010030998', '0000030005']
|
124
|
+
'A2': ['1234567890', '0123456789']
|
125
|
+
'A3': ['9876543210', '1234567890', '6543217890', '0543216789', '6543217890', '0543216789']
|
126
|
+
'A4': ['0004711172', '8623420004', '0001123458', '8623420000', '0001123458', '1299503117', '6099702031', '0000399443', '0000553313']
|
127
|
+
'A5': ['9941510002', '9961230020', '0000251438', '0007948345']
|
128
|
+
'A6': ['305888', '200071280']
|
129
|
+
'A7': ['19010660', '19010876', '209010892', '209010893', '209010893']
|
130
|
+
'A8': ['7436660', '7436678', '7436666', '7436677', '0003503391', '0001340966']
|
131
|
+
'A9': ['504360', '822035', '32577083', '86724', '86724', '292497', '30767208']
|
132
|
+
'B0': ['8137423260', '600000606', '51234309', '1000000405', '1035791539', '8035791532', '535791830', '51234901']
|
133
|
+
'B1': ['7414398260', '8347251693', '0123456789', '2345678901', '5678901234', '0123456789', '2345678901', '5678901234']
|
134
|
+
'B2': ['0020012399', '0080012347', '0080012370', '0932100027', '3310123454', '8000990057', '8011000126', '9000481800', '9980480111']
|
135
|
+
'B3': ['0002799899', '1000000111', '9635100101', '9730300100']
|
136
|
+
'B4': ['9941510002', '9961230020', '0000251438', '0007948345', '0000159590']
|
137
|
+
'B5': ['7414398260', '8347251693', '1151043211', '2345678901', '5678901234', '9000293707', '0159004165', '0023456787', '0056789018', '3045000333']
|
138
|
+
'B6': ['9111000000', '0269456780', '467310018', '477310018']
|
139
|
+
'B7': ['0001057886', '0003815570', '0005620516', '0740912243', '0893524479']
|
140
|
+
'B8': ['3145863029', '2938692523', '0132572975', '5432198760', '9070873333', '5011654366', '9000412340', '9310305011', '0132572975', '5432198760', '9070873333', '9000412340', '9310305011']
|
141
|
+
'B9': ['88034023', '43025432', '86521362', '61256523', '54352684', '2356412', '5435886', '9435414']
|
142
|
+
'C0': ['82335729', '29837521', '0132572975', '3038752371']
|
143
|
+
'C1': ['0446786240', '0478046340', '0701625730', '0701625440', '0882095130', '5432112341', '5543223458', '5654334565', '5765445672', '5876556780']
|
144
|
+
'C2': ['5127485166', '8738142564', '0328705282', '9024675131', '0328705282', '9024675131']
|
145
|
+
'C3': ['17002', '123451', '122448', '9000734028', '9000733227', '9000731120']
|
146
|
+
'C4': ['0000000017', '0000292933', '0000094459', '9000726558', '9001733457', '9000732000']
|
147
|
+
'C5': ['0000302589', '0000507336', '0302555000', '0302589000', '00061457', '1000061498', '4864446015', '4865038012', '5000001028', '5000001075', '6450008150', '6542812818', '9000110012', '9000300310', '3081000783', '3081308871']
|
148
|
+
'C6': ['0525111212', '0091423614', '1082311275', '1000118821', '2004306518', '2016001206', '3462816371', '3622548632', '4232300158', '4000456126', '5002684526', '5564123850', '6295473774', '6640806317', '7000062022', '7006003027', '8348300002', '8654216984', '9000641509', '9000260986']
|
149
|
+
'C7': ['94012341', '5073321010', '1234517892', '987614325']
|
150
|
+
'C8': ['3456789012', '0123456789', '1234567890', '9012345678', '0123456789', '1234567890', '9012345678', '1234567890', '9012345678']
|
151
|
+
'C9': ['3456789012', '0123456789', '1234567890', '9012345678', '1234567890', '9012345678']
|
152
|
+
'D0': ['6100272885', '6100273377', '6100274012']
|
153
|
+
'D1': ['0000260986', '1062813622', '2256412314', '3012084101', '4006003027', '5814500990', '6128462594', '7000062035', '8003306026', '9000641509']
|
154
|
+
'D2': ['4455667784', '1234567897', '51181008', '71214205', '6414241', '179751314', '51181008', '71214205', '6414241', '179751314', '6414241', '179751314']
|
155
|
+
'D3': ['1600166307', '1600176485', '1600201934', '6025017009', '6028267003', '6019835001']
|
156
|
+
'D4': ['0359432843', '1000062023', '2204271250', '3051681017', '4000123456', '5212744564', '6286420010', '7859103459', '8003306026', '9916524534']
|
157
|
+
'D5': ['3299632008', '1999204293', '0399242139', '0004711172', '8623420004', '0001123458', '8623410000', '0001123458', '0000100084', '0000100085']
|
158
|
+
'D6': ['33394', '595795', '16400501', '3615071237', '6039267013', '6039316014', '04017653', '9002720007', '9017483524']
|
159
|
+
'D7': ['0501006102', '0231307867', '0301005331', '0330034104', '0420001302', '0135638809', '0202005939', '0601006977']
|
160
|
+
'D8': ['3012084101', '1062813622', '0000260986']
|
161
|
+
'D9': ['9876543210', '1234567890', '6543217890', '0543216789', '6543217890', '0543216789', '1100789043', '1100914032']
|
162
|
+
'E0': ['1234769013', '2710014', '9741015011']
|
data/spec/iban_spec.rb
ADDED
@@ -0,0 +1,30 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe KtoBlzCheck::IBAN do
|
4
|
+
context 'definitions' do
|
5
|
+
context 'of instance methods' do
|
6
|
+
subject { KtoBlzCheck::IBAN.new }
|
7
|
+
after(:all) { subject.close }
|
8
|
+
|
9
|
+
it { should respond_to :check }
|
10
|
+
it { should respond_to :close }
|
11
|
+
end
|
12
|
+
|
13
|
+
context 'of constant' do
|
14
|
+
[
|
15
|
+
:VERSION,
|
16
|
+
:OK,
|
17
|
+
:TOO_SHORT,
|
18
|
+
:PREFIX_NOT_FOUND,
|
19
|
+
:WRONG_LENGTH,
|
20
|
+
:COUNTRY_NOT_FOUND,
|
21
|
+
:WRONG_COUNTRY,
|
22
|
+
:BAD_CHECKSUM
|
23
|
+
].each do |c|
|
24
|
+
it c.to_s do
|
25
|
+
KtoBlzCheck::IBAN.const_get(c).should be
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,85 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'yaml'
|
3
|
+
|
4
|
+
def mid2blz(mid)
|
5
|
+
bank = KtoBlzCheck::KNOWN_BANKS.select{|b| b.mid == mid }.first
|
6
|
+
bank.blz unless bank.nil?
|
7
|
+
end
|
8
|
+
|
9
|
+
def fixtures
|
10
|
+
@fixtures ||= YAML.load_file('spec/fixtures.yml')
|
11
|
+
end
|
12
|
+
|
13
|
+
describe KtoBlzCheck do
|
14
|
+
context 'definitions' do
|
15
|
+
context 'of class methods' do
|
16
|
+
subject { KtoBlzCheck }
|
17
|
+
|
18
|
+
it { should respond_to :bankdata_dir }
|
19
|
+
it { should respond_to :encoding }
|
20
|
+
end
|
21
|
+
|
22
|
+
context 'of instance methods' do
|
23
|
+
subject { KtoBlzCheck.new }
|
24
|
+
after(:all) { subject.close }
|
25
|
+
|
26
|
+
it { should respond_to :check }
|
27
|
+
it { should respond_to :num_records }
|
28
|
+
it { should respond_to :close }
|
29
|
+
it { should respond_to :find }
|
30
|
+
end
|
31
|
+
|
32
|
+
context 'of constant' do
|
33
|
+
[
|
34
|
+
:VERSION,
|
35
|
+
:KNOWN_BANKS,
|
36
|
+
:OK,
|
37
|
+
:UNKNOWN,
|
38
|
+
:ERROR,
|
39
|
+
:BANK_NOT_KNOWN
|
40
|
+
].each do |c|
|
41
|
+
it c.to_s do
|
42
|
+
KtoBlzCheck.const_get(c).should be
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
context 'general behavior' do
|
49
|
+
it 'has a valid bankdata directory' do
|
50
|
+
dir = KtoBlzCheck.bankdata_dir
|
51
|
+
Pathname(dir).should be_exist # language, anyone? :-)
|
52
|
+
end
|
53
|
+
|
54
|
+
it 'has all banks parsed' do
|
55
|
+
KtoBlzCheck::KNOWN_BANKS.size.should == KtoBlzCheck.new.num_records
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
# some additional tests
|
60
|
+
if ENV['CHECK_SAMPLE_DATA'] == 'true'
|
61
|
+
context 'fixture validation' do
|
62
|
+
subject { KtoBlzCheck.new }
|
63
|
+
after(:each) { subject.close }
|
64
|
+
|
65
|
+
fixtures.each do |e, data|
|
66
|
+
expectation = case e
|
67
|
+
when 'ok' then KtoBlzCheck::OK
|
68
|
+
when 'error' then KtoBlzCheck::ERROR
|
69
|
+
end
|
70
|
+
|
71
|
+
data.each do |mid, account_numbers|
|
72
|
+
blz = mid2blz(mid)
|
73
|
+
next if blz.nil?
|
74
|
+
account_numbers.each do |acc|
|
75
|
+
it "blz #{blz}, acc. #{acc}" do
|
76
|
+
subject.check(blz, acc).should == expectation
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
end # each fixture set
|
82
|
+
end # context
|
83
|
+
end # if
|
84
|
+
|
85
|
+
end
|
data/spec/spec_helper.rb
ADDED
metadata
ADDED
@@ -0,0 +1,112 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: ktoblzcheck
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.44.0.beta
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Sascha Loetz
|
8
|
+
- Kim Rudolph
|
9
|
+
- Dominik Menke
|
10
|
+
autorequire:
|
11
|
+
bindir: bin
|
12
|
+
cert_chain: []
|
13
|
+
date: 2014-02-11 00:00:00.000000000 Z
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
16
|
+
name: bundler
|
17
|
+
requirement: !ruby/object:Gem::Requirement
|
18
|
+
requirements:
|
19
|
+
- - "~>"
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '1.3'
|
22
|
+
type: :development
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
requirements:
|
26
|
+
- - "~>"
|
27
|
+
- !ruby/object:Gem::Version
|
28
|
+
version: '1.3'
|
29
|
+
- !ruby/object:Gem::Dependency
|
30
|
+
name: rake
|
31
|
+
requirement: !ruby/object:Gem::Requirement
|
32
|
+
requirements:
|
33
|
+
- - ">="
|
34
|
+
- !ruby/object:Gem::Version
|
35
|
+
version: '0'
|
36
|
+
type: :development
|
37
|
+
prerelease: false
|
38
|
+
version_requirements: !ruby/object:Gem::Requirement
|
39
|
+
requirements:
|
40
|
+
- - ">="
|
41
|
+
- !ruby/object:Gem::Version
|
42
|
+
version: '0'
|
43
|
+
- !ruby/object:Gem::Dependency
|
44
|
+
name: rspec
|
45
|
+
requirement: !ruby/object:Gem::Requirement
|
46
|
+
requirements:
|
47
|
+
- - ">="
|
48
|
+
- !ruby/object:Gem::Version
|
49
|
+
version: '0'
|
50
|
+
type: :development
|
51
|
+
prerelease: false
|
52
|
+
version_requirements: !ruby/object:Gem::Requirement
|
53
|
+
requirements:
|
54
|
+
- - ">="
|
55
|
+
- !ruby/object:Gem::Version
|
56
|
+
version: '0'
|
57
|
+
description: ktoblzcheck is an interface for libktoblzcheck, a library to check German
|
58
|
+
account numbers and bank codes. See http://ktoblzcheck.sourceforge.net for details.
|
59
|
+
email:
|
60
|
+
- kim.rudolph@web.de
|
61
|
+
- dom@digineo.de
|
62
|
+
executables: []
|
63
|
+
extensions:
|
64
|
+
- ext/ktoblzcheck/extconf.rb
|
65
|
+
extra_rdoc_files: []
|
66
|
+
files:
|
67
|
+
- ".gitignore"
|
68
|
+
- ".rspec"
|
69
|
+
- ".travis.yml"
|
70
|
+
- Gemfile
|
71
|
+
- LICENSE.txt
|
72
|
+
- README.md
|
73
|
+
- Rakefile
|
74
|
+
- ext/ktoblzcheck/extconf.rb
|
75
|
+
- ext/ktoblzcheck/ktoblzcheck.c
|
76
|
+
- ktoblzcheck.gemspec
|
77
|
+
- lib/ktoblzcheck.rb
|
78
|
+
- spec/fixtures.yml
|
79
|
+
- spec/iban_spec.rb
|
80
|
+
- spec/ktoblzcheck_spec.rb
|
81
|
+
- spec/spec_helper.rb
|
82
|
+
homepage: http://github.com/dmke/ktoblzcheck
|
83
|
+
licenses:
|
84
|
+
- GPL
|
85
|
+
metadata: {}
|
86
|
+
post_install_message:
|
87
|
+
rdoc_options: []
|
88
|
+
require_paths:
|
89
|
+
- ext
|
90
|
+
- lib
|
91
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
92
|
+
requirements:
|
93
|
+
- - ">="
|
94
|
+
- !ruby/object:Gem::Version
|
95
|
+
version: '0'
|
96
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
97
|
+
requirements:
|
98
|
+
- - ">"
|
99
|
+
- !ruby/object:Gem::Version
|
100
|
+
version: 1.3.1
|
101
|
+
requirements: []
|
102
|
+
rubyforge_project:
|
103
|
+
rubygems_version: 2.2.0
|
104
|
+
signing_key:
|
105
|
+
specification_version: 4
|
106
|
+
summary: ktoblzcheck is an interface for libktoblzcheck, a library to check German
|
107
|
+
account numbers and bank codes. See http://ktoblzcheck.sourceforge.net for details.
|
108
|
+
test_files:
|
109
|
+
- spec/fixtures.yml
|
110
|
+
- spec/iban_spec.rb
|
111
|
+
- spec/ktoblzcheck_spec.rb
|
112
|
+
- spec/spec_helper.rb
|