bsb 0.0.15 → 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.
@@ -1,7 +1,11 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'net/ftp'
2
4
 
3
5
  module Auspaynet
4
6
  class Client
7
+ MONTHS = %w(Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec)
8
+
5
9
  def initialize(host)
6
10
  @host = host
7
11
  @ftp = Net::FTP.new(@host)
@@ -15,5 +19,36 @@ module Auspaynet
15
19
  ensure
16
20
  @ftp.chdir('/')
17
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
18
53
  end
19
54
  end
@@ -1,24 +1,17 @@
1
- require 'json'
1
+ # frozen_string_literal: true
2
+
2
3
  require 'csv'
3
- require 'auspaynet/client'
4
+ require 'bsb/base_generator'
4
5
 
5
6
  module BSB
6
- class BankListGenerator
7
- def initialize(hash)
8
- @hash = hash
9
- end
10
-
11
- def json
12
- JSON.dump(@hash)
13
- end
14
-
7
+ class BankListGenerator < BaseGenerator
15
8
  def self.load_file(filename)
16
9
  client = ::Auspaynet::Client.new('bsb.hostedftp.com')
17
10
  content = client.get('~auspaynetftp/BSB', filename)
18
11
  hash = {}
19
12
  CSV.parse(content) do |row|
20
- row[2].split(", ").each do |prefix|
21
- prefix = prefix.chomp.rjust(2, "0")
13
+ row[2].split(', ').each do |prefix|
14
+ prefix = prefix.chomp.rjust(2, '0')
22
15
  hash[prefix] = row[1]
23
16
  end
24
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,24 +1,20 @@
1
- require 'json'
2
- require 'auspaynet/client'
1
+ # frozen_string_literal: true
3
2
 
4
- module BSB
5
- class DatabaseGenerator
6
- def initialize(hash)
7
- @hash = hash
8
- end
9
-
10
- def json
11
- JSON.dump(@hash)
12
- end
3
+ require 'bsb/base_generator'
13
4
 
5
+ module BSB
6
+ class DatabaseGenerator < BaseGenerator
14
7
  def self.load_file(filename)
15
8
  client = ::Auspaynet::Client.new('bsb.hostedftp.com')
16
9
  content = client.get('~auspaynetftp/BSB', filename)
17
10
  hash = {}
18
11
  content.each_line do |line|
19
- next if line[3] != "-"
20
- bsb = line[0,3] + line[4,3]
21
- hash[bsb] = [line[7,3], line[10,35].strip, line[45,35].strip, line[80,20].strip, line[100,3].strip, line[103,4], line[107,3]]
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]]
22
18
  end
23
19
  new(hash)
24
20
  end
data/lib/bsb/version.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module BSB
2
- VERSION = '0.0.15'.freeze
4
+ VERSION = '0.0.16'
3
5
  end
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
- result = {
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] == "P"),
22
- electronic: (array[6][1] == "E"),
23
- high_value: (array[6][2] == "H")
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
- return nil
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("../../config/bsb_db.json", __FILE__)))
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("../../config/bsb_bank_list.json", __FILE__)))
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
@@ -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
@@ -1,25 +1,43 @@
1
+ # frozen_string_literal: true
2
+
1
3
  namespace :bsb do
2
- desc "Generate JSON-formatted database from APCA BSB directory"
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
- STDERR.puts "Loading BSB file from APCA FTP server... (This may take a while)"
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
- STDERR.puts "Filename variable must be passed. For example, `rake bsb:generate_database filename=BSBDirectoryOct14-222.txt > config/bsb_db.json`"
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
 
14
- desc "Generate JSON-formatted bank list from APCA BSB directory"
16
+ desc 'Generate JSON-formatted bank list from APCA BSB directory'
15
17
  task :generate_bank_list do
16
18
  require 'bsb/bank_list_generator'
17
19
  if filename = ENV['filename']
18
- STDERR.puts "Loading Bank List file... (This may take a while)"
20
+ warn 'Loading Bank List file... (This may take a while)'
19
21
  bsb_bl_gen = BSB::BankListGenerator.load_file(filename)
20
22
  puts bsb_bl_gen.json
21
23
  else
22
- STDERR.puts "URL variable must be passed. For example, `rake bsb:generate_bank_list filename='KEY TO ABBREVIATIONS AND BSB NUMBERS (Apr 2020).csv' > config/bsb_bank_list.json`"
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`"
23
25
  end
24
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
25
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.15
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: 2022-06-03 00:00:00.000000000 Z
11
+ date: 2022-07-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -24,6 +24,20 @@ dependencies:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: '2.0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: net-ftp
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: 0.1.3
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: 0.1.3
27
41
  - !ruby/object:Gem::Dependency
28
42
  name: rake
29
43
  requirement: !ruby/object:Gem::Requirement
@@ -60,6 +74,7 @@ extensions: []
60
74
  extra_rdoc_files: []
61
75
  files:
62
76
  - ".github/workflows/gem-push.yml"
77
+ - ".github/workflows/sync-bank-details.yml"
63
78
  - ".gitignore"
64
79
  - Gemfile
65
80
  - Gemfile.lock
@@ -72,6 +87,7 @@ files:
72
87
  - lib/auspaynet/client.rb
73
88
  - lib/bsb.rb
74
89
  - lib/bsb/bank_list_generator.rb
90
+ - lib/bsb/base_generator.rb
75
91
  - lib/bsb/database_generator.rb
76
92
  - lib/bsb/version.rb
77
93
  - lib/bsb_number_validator.rb