bsb 0.0.13 → 0.0.16
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/workflows/gem-push.yml +45 -0
- data/.github/workflows/sync-bank-details.yml +24 -0
- data/Gemfile +2 -0
- data/Gemfile.lock +23 -34
- data/README.md +4 -0
- data/Rakefile +12 -1
- data/bsb.gemspec +1 -1
- data/config/bsb_bank_list.json +1 -1
- data/config/bsb_db.json +1 -1
- data/lib/auspaynet/client.rb +54 -0
- data/lib/bsb/bank_list_generator.rb +9 -15
- data/lib/bsb/base_generator.rb +21 -0
- data/lib/bsb/database_generator.rb +12 -19
- data/lib/bsb/version.rb +3 -1
- data/lib/bsb.rb +11 -7
- data/lib/bsb_number_validator.rb +3 -3
- data/lib/tasks/bsb_tasks.rake +26 -7
- metadata +17 -13
@@ -0,0 +1,54 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'net/ftp'
|
4
|
+
|
5
|
+
module Auspaynet
|
6
|
+
class Client
|
7
|
+
MONTHS = %w(Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec)
|
8
|
+
|
9
|
+
def initialize(host)
|
10
|
+
@host = host
|
11
|
+
@ftp = Net::FTP.new(@host)
|
12
|
+
@ftp.login
|
13
|
+
@ftp.passive = true
|
14
|
+
end
|
15
|
+
|
16
|
+
def get(dir, filename)
|
17
|
+
@ftp.chdir(dir)
|
18
|
+
@ftp.gettextfile(filename, nil)
|
19
|
+
ensure
|
20
|
+
@ftp.chdir('/')
|
21
|
+
end
|
22
|
+
|
23
|
+
def list(dir:, matching_filename:, file_format: 'csv')
|
24
|
+
@ftp.chdir(dir)
|
25
|
+
files = @ftp.nlst.select do |f|
|
26
|
+
f.include?(matching_filename) &&
|
27
|
+
f.include?(file_format) &&
|
28
|
+
f.include?(current_year)
|
29
|
+
end
|
30
|
+
extract_latest_files(files:, matching_filename:, file_format:)
|
31
|
+
ensure
|
32
|
+
@ftp.chdir('/')
|
33
|
+
end
|
34
|
+
|
35
|
+
private
|
36
|
+
|
37
|
+
def current_year
|
38
|
+
Time.now.strftime("%y")
|
39
|
+
end
|
40
|
+
|
41
|
+
def extract_latest_files(files:, matching_filename:, file_format:)
|
42
|
+
files.sort_by { |filename| file_for_month(filename:, matching_filename:, file_format:) }
|
43
|
+
end
|
44
|
+
|
45
|
+
def file_for_month(filename:, matching_filename:, file_format:)
|
46
|
+
month_from_filename = filename.gsub(/(#{filename}|\#{file_format}|\W|\d)/,'')
|
47
|
+
month_number(month_from_filename)
|
48
|
+
end
|
49
|
+
|
50
|
+
def month_number(month_from_filename)
|
51
|
+
MONTHS.find_index(month_from_filename)
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
@@ -1,23 +1,17 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
3
|
require 'csv'
|
4
|
+
require 'bsb/base_generator'
|
4
5
|
|
5
6
|
module BSB
|
6
|
-
class BankListGenerator
|
7
|
-
def
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
def json
|
12
|
-
JSON.dump(@hash)
|
13
|
-
end
|
14
|
-
|
15
|
-
def self.load_file(url)
|
7
|
+
class BankListGenerator < BaseGenerator
|
8
|
+
def self.load_file(filename)
|
9
|
+
client = ::Auspaynet::Client.new('bsb.hostedftp.com')
|
10
|
+
content = client.get('~auspaynetftp/BSB', filename)
|
16
11
|
hash = {}
|
17
|
-
content = RestClient.get(url)
|
18
12
|
CSV.parse(content) do |row|
|
19
|
-
row[2].split(
|
20
|
-
prefix = prefix.chomp.rjust(2,
|
13
|
+
row[2].split(', ').each do |prefix|
|
14
|
+
prefix = prefix.chomp.rjust(2, '0')
|
21
15
|
hash[prefix] = row[1]
|
22
16
|
end
|
23
17
|
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'json'
|
4
|
+
require 'auspaynet/client'
|
5
|
+
|
6
|
+
module BSB
|
7
|
+
class BaseGenerator
|
8
|
+
def initialize(hash)
|
9
|
+
@hash = hash
|
10
|
+
end
|
11
|
+
|
12
|
+
def json
|
13
|
+
JSON.dump(@hash)
|
14
|
+
end
|
15
|
+
|
16
|
+
def self.latest_file(matching_filename:, file_format:)
|
17
|
+
client = ::Auspaynet::Client.new('bsb.hostedftp.com')
|
18
|
+
client.list(dir: '~auspaynetftp/BSB', matching_filename:, file_format:)&.last
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -1,27 +1,20 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
2
|
|
3
|
-
|
4
|
-
class DatabaseGenerator
|
5
|
-
def initialize(hash)
|
6
|
-
@hash = hash
|
7
|
-
end
|
8
|
-
|
9
|
-
def json
|
10
|
-
JSON.dump(@hash)
|
11
|
-
end
|
3
|
+
require 'bsb/base_generator'
|
12
4
|
|
5
|
+
module BSB
|
6
|
+
class DatabaseGenerator < BaseGenerator
|
13
7
|
def self.load_file(filename)
|
14
|
-
|
15
|
-
|
16
|
-
ftp.login
|
17
|
-
ftp.passive = true
|
18
|
-
ftp.chdir('~auspaynetftp/BSB')
|
19
|
-
content = ftp.gettextfile(filename, nil)
|
8
|
+
client = ::Auspaynet::Client.new('bsb.hostedftp.com')
|
9
|
+
content = client.get('~auspaynetftp/BSB', filename)
|
20
10
|
hash = {}
|
21
11
|
content.each_line do |line|
|
22
|
-
next if line[3] !=
|
23
|
-
|
24
|
-
|
12
|
+
next if line[3] != '-'
|
13
|
+
|
14
|
+
bsb = line[0, 3] + line[4, 3]
|
15
|
+
hash[bsb] =
|
16
|
+
[line[7, 3], line[10, 35].strip, line[45, 35].strip, line[80, 20].strip, line[100, 3].strip, line[103, 4],
|
17
|
+
line[107, 3]]
|
25
18
|
end
|
26
19
|
new(hash)
|
27
20
|
end
|
data/lib/bsb/version.rb
CHANGED
data/lib/bsb.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'bsb/version'
|
2
4
|
require 'json'
|
3
5
|
require 'bsb_number_validator'
|
@@ -8,7 +10,8 @@ module BSB
|
|
8
10
|
bsb = normalize(number)
|
9
11
|
array = data_hash[bsb]
|
10
12
|
return nil if array.nil?
|
11
|
-
|
13
|
+
|
14
|
+
{
|
12
15
|
bsb: bsb,
|
13
16
|
mnemonic: array[0],
|
14
17
|
bank_name: bank_name(bsb),
|
@@ -18,9 +21,9 @@ module BSB
|
|
18
21
|
state: array[4],
|
19
22
|
postcode: array[5],
|
20
23
|
flags: {
|
21
|
-
paper: (array[6][0] ==
|
22
|
-
electronic: (array[6][1] ==
|
23
|
-
high_value: (array[6][2] ==
|
24
|
+
paper: (array[6][0] == 'P'),
|
25
|
+
electronic: (array[6][1] == 'E'),
|
26
|
+
high_value: (array[6][2] == 'H')
|
24
27
|
}
|
25
28
|
}
|
26
29
|
end
|
@@ -29,7 +32,7 @@ module BSB
|
|
29
32
|
bank_list.each do |prefix, bank_name|
|
30
33
|
return bank_name if bsb.start_with? prefix
|
31
34
|
end
|
32
|
-
|
35
|
+
nil
|
33
36
|
end
|
34
37
|
|
35
38
|
def normalize(str)
|
@@ -37,12 +40,13 @@ module BSB
|
|
37
40
|
end
|
38
41
|
|
39
42
|
private
|
43
|
+
|
40
44
|
def data_hash
|
41
|
-
@data_hash ||= JSON.parse(IO.read(File.expand_path(
|
45
|
+
@data_hash ||= JSON.parse(IO.read(File.expand_path('../config/bsb_db.json', __dir__)))
|
42
46
|
end
|
43
47
|
|
44
48
|
def bank_list
|
45
|
-
@bank_list ||= JSON.parse(IO.read(File.expand_path(
|
49
|
+
@bank_list ||= JSON.parse(IO.read(File.expand_path('../config/bsb_bank_list.json', __dir__)))
|
46
50
|
end
|
47
51
|
end
|
48
52
|
end
|
data/lib/bsb_number_validator.rb
CHANGED
@@ -1,10 +1,10 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'bsb'
|
2
4
|
require 'active_model'
|
3
5
|
|
4
6
|
class BsbNumberValidator < ActiveModel::EachValidator
|
5
7
|
def validate_each(record, attribute, value)
|
6
|
-
unless BSB.lookup(value)
|
7
|
-
record.errors.add(attribute, :invalid)
|
8
|
-
end
|
8
|
+
record.errors.add(attribute, :invalid) unless BSB.lookup(value)
|
9
9
|
end
|
10
10
|
end
|
data/lib/tasks/bsb_tasks.rake
CHANGED
@@ -1,24 +1,43 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
namespace :bsb do
|
2
|
-
desc
|
4
|
+
desc 'Generate JSON-formatted database from APCA BSB directory'
|
3
5
|
task :generate_database do
|
4
6
|
require 'bsb/database_generator'
|
5
7
|
if filename = ENV['filename']
|
6
|
-
|
8
|
+
warn 'Loading BSB file from APCA FTP server... (This may take a while)'
|
7
9
|
bsb_db_gen = BSB::DatabaseGenerator.load_file(filename)
|
8
10
|
puts bsb_db_gen.json
|
9
11
|
else
|
10
|
-
|
12
|
+
warn 'Filename variable must be passed. For example, `rake bsb:generate_database filename=BSBDirectoryMay22-314.txt > config/bsb_db.json`'
|
11
13
|
end
|
12
14
|
end
|
13
15
|
|
16
|
+
desc 'Generate JSON-formatted bank list from APCA BSB directory'
|
14
17
|
task :generate_bank_list do
|
15
18
|
require 'bsb/bank_list_generator'
|
16
|
-
if
|
17
|
-
|
18
|
-
bsb_bl_gen = BSB::BankListGenerator.load_file(
|
19
|
+
if filename = ENV['filename']
|
20
|
+
warn 'Loading Bank List file... (This may take a while)'
|
21
|
+
bsb_bl_gen = BSB::BankListGenerator.load_file(filename)
|
19
22
|
puts bsb_bl_gen.json
|
20
23
|
else
|
21
|
-
|
24
|
+
warn "URL variable must be passed. For example, `rake bsb:generate_bank_list filename='KEY TO ABBREVIATIONS AND BSB NUMBERS (May 2022).csv' > config/bsb_bank_list.json`"
|
22
25
|
end
|
23
26
|
end
|
27
|
+
|
28
|
+
desc 'Sync database and bank list'
|
29
|
+
task :sync do
|
30
|
+
require 'bsb/base_generator'
|
31
|
+
bank_list_filename = BSB::BaseGenerator.latest_file(
|
32
|
+
matching_filename: 'KEY TO ABBREVIATIONS AND BSB NUMBERS',
|
33
|
+
file_format: '.csv'
|
34
|
+
)
|
35
|
+
db_list_filename = BSB::BaseGenerator.latest_file(
|
36
|
+
matching_filename: 'BSBDirectory',
|
37
|
+
file_format: '.txt'
|
38
|
+
)
|
39
|
+
|
40
|
+
system "rake bsb:generate_bank_list filename='#{bank_list_filename}' > config/bsb_bank_list.json"
|
41
|
+
system "rake bsb:generate_database filename='#{db_list_filename}' > config/bsb_db.json"
|
42
|
+
end
|
24
43
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: bsb
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.16
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ryan Zhou
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2022-07-01 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -25,35 +25,35 @@ dependencies:
|
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '2.0'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
|
-
name:
|
28
|
+
name: net-ftp
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
31
|
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version:
|
33
|
+
version: 0.1.3
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version:
|
40
|
+
version: 0.1.3
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
|
-
name:
|
42
|
+
name: rake
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
|
-
- - "
|
45
|
+
- - "~>"
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version: '0'
|
48
|
-
type: :
|
47
|
+
version: '13.0'
|
48
|
+
type: :development
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
|
-
- - "
|
52
|
+
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version: '0'
|
54
|
+
version: '13.0'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
|
-
name:
|
56
|
+
name: activemodel
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
59
|
- - ">="
|
@@ -73,6 +73,8 @@ executables: []
|
|
73
73
|
extensions: []
|
74
74
|
extra_rdoc_files: []
|
75
75
|
files:
|
76
|
+
- ".github/workflows/gem-push.yml"
|
77
|
+
- ".github/workflows/sync-bank-details.yml"
|
76
78
|
- ".gitignore"
|
77
79
|
- Gemfile
|
78
80
|
- Gemfile.lock
|
@@ -82,8 +84,10 @@ files:
|
|
82
84
|
- bsb.gemspec
|
83
85
|
- config/bsb_bank_list.json
|
84
86
|
- config/bsb_db.json
|
87
|
+
- lib/auspaynet/client.rb
|
85
88
|
- lib/bsb.rb
|
86
89
|
- lib/bsb/bank_list_generator.rb
|
90
|
+
- lib/bsb/base_generator.rb
|
87
91
|
- lib/bsb/database_generator.rb
|
88
92
|
- lib/bsb/version.rb
|
89
93
|
- lib/bsb_number_validator.rb
|
@@ -107,7 +111,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
107
111
|
- !ruby/object:Gem::Version
|
108
112
|
version: '0'
|
109
113
|
requirements: []
|
110
|
-
rubygems_version: 3.1
|
114
|
+
rubygems_version: 3.0.3.1
|
111
115
|
signing_key:
|
112
116
|
specification_version: 4
|
113
117
|
summary: BSB number validator with built-in database.
|