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.
@@ -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.