bsb 0.0.15 → 0.0.16

Sign up to get free protection for your applications and to get access to all the features.
@@ -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