bsb 0.0.13 → 0.0.16
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 +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.
|