nz_bank_account_validator 1.0.0 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 41cda291273f19edfda0b18968d46ba1f65ef836
4
- data.tar.gz: f542268d119d4b7eef21326a4232c70e030fe5c5
2
+ SHA256:
3
+ metadata.gz: 93d01a32380a3a0205ac9fb23d6d641c3a0c1b87a991668461e360a1ededf858
4
+ data.tar.gz: 1acc8512108e428c6ffed4834f9604de152a5c4645fe3ff55e4eeb9023bd9854
5
5
  SHA512:
6
- metadata.gz: b9ac2d9ace8242af0522242d24008396911e2d425cccbe681e0a7dd5fcee7640bf11a24d8596bfc97e761163391dd8abc0a185bcaabbe99c2c193b11a9e51e1f
7
- data.tar.gz: d9d0ec628b5a8da404cd49b71f7dec529969cc73ea21eba2e38a54bd52709a80b06d385febc1806ab4f9677649d7b886de5f384e57c9befe88e275039404b3d3
6
+ metadata.gz: eb569c9d512b4c64037d1bb981ce2bbd613c2ba53531b627176c136f1eb86d00903f4c4cdca5fca83260213e746cd3e783ad08f2b0f6a4402256b602ad4c0621
7
+ data.tar.gz: 869edddce45641db25d7566b119a78bdeac3ff9fc284cb4ec606fbe8f21e4eb9dd8e874d9a0c3140023bdbd6b1512ea61b6bbdd5d288c9adfe40f0d471ed331c
@@ -0,0 +1,134 @@
1
+ require:
2
+ - rubocop-rspec
3
+ - rubocop-performance
4
+
5
+ AllCops:
6
+ TargetRubyVersion: 2.6
7
+ Exclude:
8
+ - .git/
9
+ - bin/*
10
+ - config/deploy/*
11
+ - coverage/**/*
12
+ - db/migrate/*
13
+ - db/schema.rb
14
+ - doc/**/*
15
+ - Gemfile
16
+ - lib/tasks/*.rake
17
+ - log/**/*
18
+ - node_modules/**/*
19
+ - script/*
20
+ - spec/**/*
21
+ - test/**/*
22
+ - tmp/**/*
23
+ - vendor/assets/**/*
24
+ - vendor/gems/*/bin/*
25
+ - vendor/gems/*/spec/**/*
26
+
27
+ Layout/AlignParameters:
28
+ EnforcedStyle: with_first_parameter
29
+
30
+ Layout/AlignHash:
31
+ EnforcedHashRocketStyle: table
32
+ EnforcedColonStyle: table
33
+
34
+ Lint/UnusedBlockArgument:
35
+ AllowUnusedKeywordArguments: true
36
+
37
+ Lint/UnusedMethodArgument:
38
+ AllowUnusedKeywordArguments: true
39
+
40
+ Lint/LiteralAsCondition:
41
+ Enabled: false
42
+
43
+ Layout/EndAlignment:
44
+ EnforcedStyleAlignWith: keyword
45
+ AutoCorrect: true
46
+
47
+ Layout/BlockAlignment:
48
+ EnforcedStyleAlignWith: start_of_block
49
+ AutoCorrect: true
50
+
51
+ Layout/DefEndAlignment:
52
+ EnforcedStyleAlignWith: def
53
+ AutoCorrect: true
54
+
55
+ Style/AsciiComments:
56
+ Enabled: false
57
+
58
+ Style/StringLiterals:
59
+ EnforcedStyle: double_quotes
60
+
61
+ Style/TrailingCommaInArrayLiteral:
62
+ EnforcedStyleForMultiline: comma
63
+
64
+ Style/TrailingCommaInHashLiteral:
65
+ EnforcedStyleForMultiline: comma
66
+
67
+ Style/WordArray:
68
+ EnforcedStyle: brackets
69
+
70
+ Style/SymbolArray:
71
+ EnforcedStyle: brackets
72
+
73
+ Style/Lambda:
74
+ EnforcedStyle: literal
75
+
76
+ Style/FormatStringToken:
77
+ EnforcedStyle: template
78
+
79
+ Style/ClassAndModuleChildren:
80
+ EnforcedStyle: nested
81
+
82
+ Style/EmptyMethod:
83
+ EnforcedStyle: expanded
84
+
85
+ Style/NumericLiterals:
86
+ Enabled: false
87
+
88
+ Style/FrozenStringLiteralComment:
89
+ Enabled: false
90
+
91
+ Style/DoubleNegation:
92
+ Enabled: false
93
+
94
+ Style/Documentation:
95
+ Enabled: false
96
+
97
+ Style/RegexpLiteral:
98
+ Enabled: false
99
+
100
+ Style/IfUnlessModifier:
101
+ Enabled: false
102
+
103
+ Metrics/LineLength:
104
+ Enabled: false
105
+
106
+ Metrics/ClassLength:
107
+ Enabled: false
108
+
109
+ Metrics/BlockLength:
110
+ Enabled: false
111
+
112
+ Metrics/MethodLength:
113
+ Enabled: false
114
+
115
+ Metrics/ModuleLength:
116
+ Enabled: false
117
+
118
+ Metrics/CyclomaticComplexity:
119
+ Enabled: false
120
+
121
+ Metrics/PerceivedComplexity:
122
+ Enabled: false
123
+
124
+ Metrics/AbcSize:
125
+ Enabled: false
126
+
127
+ Metrics/ParameterLists:
128
+ Enabled: false
129
+
130
+ Metrics/BlockNesting:
131
+ Enabled: false
132
+
133
+ Naming/UncommunicativeMethodParamName:
134
+ Enabled: false
@@ -1,3 +1,5 @@
1
+ 1.1.0 - Tidy up code, add more bank accounts from updated document
2
+ 1.0.0 - First public release
1
3
  0.9.0 - Add new ranges from updated IRD document
2
4
  Use new RSpec syntax
3
5
  Accept a string of a full bank account number rather than a collection of parts
data/Gemfile CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  source 'https://rubygems.org'
2
4
 
3
5
  gemspec
data/Rakefile CHANGED
@@ -1,5 +1,7 @@
1
- require 'bundler/gem_tasks'
2
- require 'rspec/core/rake_task'
1
+ # frozen_string_literal: true
2
+
3
+ require "bundler/gem_tasks"
4
+ require "rspec/core/rake_task"
3
5
 
4
6
  RSpec::Core::RakeTask.new(:spec)
5
7
 
@@ -1,4 +1,5 @@
1
1
  #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
2
3
 
3
4
  require 'bundler/setup'
4
5
  require 'nz_bank_account_validator'
@@ -1,10 +1,24 @@
1
1
  # frozen_string_literal: true
2
- require 'nz_bank_account_validator/version'
2
+
3
+ require "nz_bank_account_validator/version"
3
4
 
4
5
  class NzBankAccountValidator
5
- BankDefinition = Struct.new(:ranges, :algo)
6
+ class BankDefinition
7
+ def initialize(ranges: [], algo: nil)
8
+ @ranges = ranges
9
+ @algo = algo
10
+ end
11
+
12
+ attr_reader :algo
13
+
14
+ def include?(branch)
15
+ @ranges.any? do |range|
16
+ range.include?(branch)
17
+ end
18
+ end
19
+ end
6
20
 
7
- PATTERN = /\A^(?<bank_id>\d{1,2})[- ]?(?<bank_branch>\d{1,4})[- ]?(?<account_base_number>\d{1,8})[- ]?(?<account_suffix>\d{1,4})\z/
21
+ PATTERN = /\A^(?<bank_id>\d{1,2})[- ]?(?<bank_branch>\d{1,4})[- ]?(?<account_base_number>\d{1,8})[- ]?(?<account_suffix>\d{1,4})\z/.freeze
8
22
 
9
23
  RADIX = 10
10
24
 
@@ -13,36 +27,38 @@ class NzBankAccountValidator
13
27
  ACCOUNT_BASE_NUMBER_CUTOFF = 990_000
14
28
 
15
29
  BANKS = {
16
- 1 => BankDefinition.new([1..999, 1100..1199, 1800..1899]),
17
- 2 => BankDefinition.new([1..999, 1200..1299]),
18
- 3 => BankDefinition.new([1..999, 1300..1399, 1500..1599, 1700..1799, 1900..1999]),
19
- 6 => BankDefinition.new([1..999, 1400..1499]),
20
- 8 => BankDefinition.new([6500..6599], :d),
21
- 9 => BankDefinition.new([0..0], :e),
22
- 11 => BankDefinition.new([5000..6499, 6600..8999]),
23
- 12 => BankDefinition.new([3000..3299, 3400..3499, 3600..3699]),
24
- 13 => BankDefinition.new([4900..4999]),
25
- 14 => BankDefinition.new([4700..4799]),
26
- 15 => BankDefinition.new([3900..3999]),
27
- 16 => BankDefinition.new([4400..4499]),
28
- 17 => BankDefinition.new([3300..3399]),
29
- 18 => BankDefinition.new([3500..3599]),
30
- 19 => BankDefinition.new([4600..4649]),
31
- 20 => BankDefinition.new([4100..4199]),
32
- 21 => BankDefinition.new([4800..4899]),
33
- 22 => BankDefinition.new([4000..4049]),
34
- 23 => BankDefinition.new([3700..3799]),
35
- 24 => BankDefinition.new([4300..4349]),
36
- 25 => BankDefinition.new([2500..2599], :f),
37
- 26 => BankDefinition.new([2600..2699], :g),
38
- 27 => BankDefinition.new([3800..3849]),
39
- 28 => BankDefinition.new([2100..2149], :g),
40
- 29 => BankDefinition.new([2150..2299], :g),
41
- 30 => BankDefinition.new([2900..2949]),
42
- 31 => BankDefinition.new([2800..2849], :x),
43
- 33 => BankDefinition.new([6700..6799], :f),
44
- 35 => BankDefinition.new([2400..2499]),
45
- 38 => BankDefinition.new([9000..9499])
30
+ 1 => BankDefinition.new(ranges: [1..999, 1100..1199, 1800..1899]),
31
+ 2 => BankDefinition.new(ranges: [1..999, 1200..1299]),
32
+ 3 => BankDefinition.new(ranges: [1..999, 1300..1399, 1500..1599, 1700..1799, 1900..1999, 7350..7399]),
33
+ 4 => BankDefinition.new(ranges: [2020..2024]),
34
+ 6 => BankDefinition.new(ranges: [1..999, 1400..1499]),
35
+ 8 => BankDefinition.new(ranges: [6500..6599], algo: :d),
36
+ 9 => BankDefinition.new(ranges: [0..0], algo: :e),
37
+ 10 => BankDefinition.new(ranges: [5165..5169]),
38
+ 11 => BankDefinition.new(ranges: [5000..6499, 6600..8999]),
39
+ 12 => BankDefinition.new(ranges: [3000..3299, 3400..3499, 3600..3699]),
40
+ 13 => BankDefinition.new(ranges: [4900..4999]),
41
+ 14 => BankDefinition.new(ranges: [4700..4799]),
42
+ 15 => BankDefinition.new(ranges: [3900..3999]),
43
+ 16 => BankDefinition.new(ranges: [4400..4499]),
44
+ 17 => BankDefinition.new(ranges: [3300..3399]),
45
+ 18 => BankDefinition.new(ranges: [3500..3599]),
46
+ 19 => BankDefinition.new(ranges: [4600..4649]),
47
+ 20 => BankDefinition.new(ranges: [4100..4199]),
48
+ 21 => BankDefinition.new(ranges: [4800..4899]),
49
+ 22 => BankDefinition.new(ranges: [4000..4049]),
50
+ 23 => BankDefinition.new(ranges: [3700..3799]),
51
+ 24 => BankDefinition.new(ranges: [4300..4349]),
52
+ 25 => BankDefinition.new(ranges: [2500..2599], algo: :f),
53
+ 26 => BankDefinition.new(ranges: [2600..2699], algo: :g),
54
+ 27 => BankDefinition.new(ranges: [3800..3849]),
55
+ 28 => BankDefinition.new(ranges: [2100..2149], algo: :g),
56
+ 29 => BankDefinition.new(ranges: [2150..2299], algo: :g),
57
+ 30 => BankDefinition.new(ranges: [2900..2949]),
58
+ 31 => BankDefinition.new(ranges: [2800..2849], algo: :x),
59
+ 33 => BankDefinition.new(ranges: [6700..6799], algo: :f),
60
+ 35 => BankDefinition.new(ranges: [2400..2499]),
61
+ 38 => BankDefinition.new(ranges: [9000..9499]),
46
62
  }.freeze
47
63
 
48
64
  ALGOS = {
@@ -53,7 +69,7 @@ class NzBankAccountValidator
53
69
  e: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 4, 3, 2, 0, 0, 0, 1, 11],
54
70
  f: [0, 0, 0, 0, 0, 0, 0, 1, 7, 3, 1, 7, 3, 1, 0, 0, 0, 0, 10],
55
71
  g: [0, 0, 0, 0, 0, 0, 0, 1, 3, 7, 1, 3, 7, 1, 0, 3, 7, 1, 10],
56
- x: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1]
72
+ x: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1],
57
73
  }.freeze
58
74
 
59
75
  def self.valid?(string)
@@ -62,13 +78,12 @@ class NzBankAccountValidator
62
78
 
63
79
  def initialize(string)
64
80
  match = string.match(PATTERN)
81
+ return unless match
65
82
 
66
- if match
67
- @bank_id = Integer(match[:bank_id], RADIX)
68
- @bank_branch = Integer(match[:bank_branch], RADIX)
69
- @account_base_number = Integer(match[:account_base_number], RADIX)
70
- @account_suffix = Integer(match[:account_suffix], RADIX)
71
- end
83
+ @bank_id = Integer(match[:bank_id], RADIX)
84
+ @bank_branch = Integer(match[:bank_branch], RADIX)
85
+ @account_base_number = Integer(match[:account_base_number], RADIX)
86
+ @account_suffix = Integer(match[:account_suffix], RADIX)
72
87
  end
73
88
 
74
89
  attr_accessor :bank_id, :bank_branch, :account_base_number, :account_suffix
@@ -79,6 +94,7 @@ class NzBankAccountValidator
79
94
  return false unless account_base_number
80
95
  return false unless account_suffix
81
96
  return false unless valid_modulo?
97
+
82
98
  true
83
99
  end
84
100
 
@@ -88,35 +104,33 @@ class NzBankAccountValidator
88
104
  BANKS.key?(bank_id)
89
105
  end
90
106
 
91
- def bank_definition
92
- BANKS[bank_id]
93
- end
94
-
95
107
  def valid_bank_branch?
96
108
  return false unless bank_definition
97
109
  return false unless bank_branch
98
110
 
99
- bank_definition.ranges.any? do |range|
100
- range.include?(bank_branch)
101
- end
111
+ bank_definition.include?(bank_branch)
102
112
  end
103
113
 
104
114
  def valid_modulo?
105
115
  (checksum % algo[CHECKSUM_DIGITS]).zero?
106
116
  end
107
117
 
108
- def algo_code
109
- # If the account base number is below 00990000 then apply algorithm A
110
- # Otherwise apply algorithm B.
111
- bank_definition.algo || (account_base_number < ACCOUNT_BASE_NUMBER_CUTOFF ? :a : :b)
118
+ def bank_definition
119
+ BANKS[bank_id]
112
120
  end
113
121
 
114
122
  def algo
115
123
  ALGOS[algo_code]
116
124
  end
117
125
 
126
+ def algo_code
127
+ # If the account base number is below 00990000 then apply algorithm A
128
+ # Otherwise apply algorithm B.
129
+ bank_definition.algo || (account_base_number < ACCOUNT_BASE_NUMBER_CUTOFF ? :a : :b)
130
+ end
131
+
118
132
  def number_for_checksum
119
- format('%02d%04d%08d%04d', bank_id, bank_branch, account_base_number, account_suffix)
133
+ format("%02d%04d%08d%04d", bank_id, bank_branch, account_base_number, account_suffix)
120
134
  end
121
135
 
122
136
  def checksum
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class NzBankAccountValidator
2
- VERSION = '1.0.0'.freeze
4
+ VERSION = "1.1.0"
3
5
  end
@@ -1,24 +1,28 @@
1
- # coding: utf-8
2
- lib = File.expand_path('../lib', __FILE__)
1
+ # frozen_string_literal: true
2
+
3
+ lib = File.expand_path("lib", __dir__)
3
4
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
- require 'nz_bank_account_validator/version'
5
+ require "nz_bank_account_validator/version"
5
6
 
6
7
  Gem::Specification.new do |spec|
7
- spec.name = 'nz_bank_account_validator'
8
+ spec.name = "nz_bank_account_validator"
8
9
  spec.version = NzBankAccountValidator::VERSION
9
- spec.authors = ['Steve Hoeksema', 'Eaden McKee']
10
- spec.email = ['steve@kotiri.com']
11
- spec.summary = 'Validate a New Zealand bank account number according to IRD specifications'
12
- spec.description = 'Validate a New Zealand bank account number according to IRD specifications'
13
- spec.homepage = 'https://github.com/steveh/nz_bank_account_validator'
14
- spec.license = 'MIT'
10
+ spec.authors = ["Steve Hoeksema", "Eaden McKee"]
11
+ spec.email = ["steve@kotiri.com"]
12
+ spec.summary = "Validate a New Zealand bank account number according to IRD specifications"
13
+ spec.description = "Validate a New Zealand bank account number according to IRD specifications"
14
+ spec.homepage = "https://github.com/steveh/nz_bank_account_validator"
15
+ spec.license = "MIT"
15
16
  spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
16
- spec.bindir = 'exe'
17
+ spec.bindir = "exe"
17
18
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
18
- spec.require_paths = ['lib']
19
+ spec.require_paths = ["lib"]
19
20
 
20
- spec.add_development_dependency 'bundler'
21
- spec.add_development_dependency 'rake'
22
- spec.add_development_dependency 'rspec'
23
- spec.add_development_dependency 'codeclimate-test-reporter'
21
+ spec.add_development_dependency "bundler"
22
+ spec.add_development_dependency "rake"
23
+ spec.add_development_dependency "rspec"
24
+ spec.add_development_dependency "rubocop"
25
+ spec.add_development_dependency "rubocop-performance"
26
+ spec.add_development_dependency "rubocop-rspec"
27
+ spec.add_development_dependency "simplecov"
24
28
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: nz_bank_account_validator
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Steve Hoeksema
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: exe
11
11
  cert_chain: []
12
- date: 2016-08-30 00:00:00.000000000 Z
12
+ date: 2019-06-03 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: bundler
@@ -54,7 +54,49 @@ dependencies:
54
54
  - !ruby/object:Gem::Version
55
55
  version: '0'
56
56
  - !ruby/object:Gem::Dependency
57
- name: codeclimate-test-reporter
57
+ name: rubocop
58
+ requirement: !ruby/object:Gem::Requirement
59
+ requirements:
60
+ - - ">="
61
+ - !ruby/object:Gem::Version
62
+ version: '0'
63
+ type: :development
64
+ prerelease: false
65
+ version_requirements: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - ">="
68
+ - !ruby/object:Gem::Version
69
+ version: '0'
70
+ - !ruby/object:Gem::Dependency
71
+ name: rubocop-performance
72
+ requirement: !ruby/object:Gem::Requirement
73
+ requirements:
74
+ - - ">="
75
+ - !ruby/object:Gem::Version
76
+ version: '0'
77
+ type: :development
78
+ prerelease: false
79
+ version_requirements: !ruby/object:Gem::Requirement
80
+ requirements:
81
+ - - ">="
82
+ - !ruby/object:Gem::Version
83
+ version: '0'
84
+ - !ruby/object:Gem::Dependency
85
+ name: rubocop-rspec
86
+ requirement: !ruby/object:Gem::Requirement
87
+ requirements:
88
+ - - ">="
89
+ - !ruby/object:Gem::Version
90
+ version: '0'
91
+ type: :development
92
+ prerelease: false
93
+ version_requirements: !ruby/object:Gem::Requirement
94
+ requirements:
95
+ - - ">="
96
+ - !ruby/object:Gem::Version
97
+ version: '0'
98
+ - !ruby/object:Gem::Dependency
99
+ name: simplecov
58
100
  requirement: !ruby/object:Gem::Requirement
59
101
  requirements:
60
102
  - - ">="
@@ -76,6 +118,7 @@ extra_rdoc_files: []
76
118
  files:
77
119
  - ".gitignore"
78
120
  - ".rspec"
121
+ - ".rubocop.yml"
79
122
  - ".travis.yml"
80
123
  - CHANGELOG.txt
81
124
  - Gemfile
@@ -106,8 +149,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
106
149
  - !ruby/object:Gem::Version
107
150
  version: '0'
108
151
  requirements: []
109
- rubyforge_project:
110
- rubygems_version: 2.5.1
152
+ rubygems_version: 3.0.3
111
153
  signing_key:
112
154
  specification_version: 4
113
155
  summary: Validate a New Zealand bank account number according to IRD specifications