bsb 0.0.13 → 0.0.16

Sign up to get free protection for your applications and to get access to all the features.
@@ -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
- require 'json'
2
- require 'rest-client'
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 initialize(hash)
8
- @hash = hash
9
- end
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(", ").each do |prefix|
20
- prefix = prefix.chomp.rjust(2, "0")
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
- require 'json'
1
+ # frozen_string_literal: true
2
2
 
3
- module BSB
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
- require 'net/ftp'
15
- ftp = Net::FTP.new('bsb.hostedftp.com')
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
- bsb = line[0,3] + line[4,3]
24
- 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]]
25
18
  end
26
19
  new(hash)
27
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.13'.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,24 +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
 
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 url = ENV['url']
17
- STDERR.puts "Loading Bank List file... (This may take a while)"
18
- bsb_bl_gen = BSB::BankListGenerator.load_file(url)
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
- STDERR.puts "URL variable must be passed. For example, `rake bsb:generate_bank_list url='http://bsb.apca.com.au/public/BSB_DB.NSF/0/9B80EBFA44A993E6CA2579650017682A/$File/key%20to%20abbreviations%20and%20bsb%20numbers%20(july2014).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`"
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.13
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: 2021-04-12 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
@@ -25,35 +25,35 @@ dependencies:
25
25
  - !ruby/object:Gem::Version
26
26
  version: '2.0'
27
27
  - !ruby/object:Gem::Dependency
28
- name: rake
28
+ name: net-ftp
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: '13.0'
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: '13.0'
40
+ version: 0.1.3
41
41
  - !ruby/object:Gem::Dependency
42
- name: activemodel
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: :runtime
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: rest-client
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.4
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.