Inline BIC validation from bank-contact

Fix bundler
This commit is contained in:
Matthias Grosser 2025-06-04 00:20:19 +02:00
parent 2bd3dd8656
commit 8d93f295cf
8 changed files with 89 additions and 13 deletions

View File

@ -1,3 +1,5 @@
## 0.2.0
## 1.0.0
- support Ruby 2.7+
- Drop bank-contact, use iban-tools (@Joerg-Seitz)
- Inline BIC validation from bank-contact
- Support Ruby 3.4

View File

@ -1,13 +1,15 @@
PATH
remote: .
specs:
girocode (0.2.0)
girocode (1.0.0)
bigdecimal
iban-tools
rqrcode
GEM
remote: https://rubygems.org/
specs:
bigdecimal (3.2.1)
chunky_png (1.4.0)
docile (1.4.1)
iban-tools (1.2.1)
@ -32,6 +34,3 @@ DEPENDENCIES
minitest
rake
simplecov
BUNDLED WITH
2.6.8

View File

@ -16,6 +16,7 @@ Gem::Specification.new do |s|
s.files = Dir['{lib}/**/*.rb', 'LICENSE', 'README.md', 'CHANGELOG.md']
s.require_paths = ['lib']
s.add_dependency 'bigdecimal'
s.add_dependency 'rqrcode'
s.add_dependency 'iban-tools'
end

View File

@ -3,6 +3,7 @@ require 'iban-tools'
require 'rqrcode'
require_relative 'girocode/version'
require_relative 'girocode/bic'
require_relative 'girocode/code'
module Girocode

67
lib/girocode/bic.rb Normal file
View File

@ -0,0 +1,67 @@
# derived from bank-contact/bic by Kevin
module Girocode
class BIC
REGEX = /\A([A-Z]{4})([A-Z]{2})([A-Z0-9]{2})([A-Z0-9]{3})?\z/.freeze
def self.valid?(code)
new(code).valid?
end
def initialize(code)
@code = code.to_s.gsub(/\s+/, '').upcase
end
def bank_code
@code[0..3]
end
def country_code
@code[4..5]
end
def location_code
@code[6..7]
end
def branch_code
@code[8..10]
end
def to_s(formatted = false)
formatted ? to_formatted_str : @code
end
def to_formatted_str
"#{bank_code} #{country_code} #{location_code} #{branch_code}".strip
end
def test?
location_code[1] == '0'
end
def passive?
location_code[1] == '1'
end
def reverse_billing?
location_code[1] == '2'
end
def valid?
valid_format? && valid_location_code? && valid_branch_code?
end
def valid_format?
REGEX.match?(@code)
end
def valid_location_code?
!location_code.start_with?('0', '1') && !location_code.end_with?('O')
end
def valid_branch_code?
branch_code.empty? || branch_code == 'XXX' || !branch_code.start_with?('X')
end
end
end

View File

@ -23,10 +23,10 @@ module Girocode
def bic=(value)
if value.nil?
@bic = nil
elsif value.match? /\A[A-Z0-9]{4}([A-Z]{2})([A-Z0-9]{2})([A-Z0-9]{3})?\z/
@bic = value
else
raise ArgumentError, "Invalid BIC #{value.inspect}"
bic = BIC.new(value)
raise ArgumentError, "Invalid BIC #{value.inspect}" unless bic.valid?
@bic = bic.to_s
end
end

View File

@ -1,3 +1,3 @@
module Girocode
VERSION = "0.2.0"
VERSION = "1.0.0"
end

View File

@ -2,7 +2,7 @@ require_relative 'test_helper'
class GirocodeTest < Minitest::Test
def test_that_it_has_a_version_number
refute_nil ::Girocode::VERSION
refute_nil Girocode::VERSION
end
def test_girocode
@ -10,9 +10,15 @@ class GirocodeTest < Minitest::Test
code = Girocode.new(**attrs)
assert_equal data(:data), code.to_ascii
end
def test_bic
assert_raises ArgumentError do
Girocode.new(bic: 'FOOBAR', name: 'Franz Mustermänn', iban: 'DE71110220330123456789', currency: :eur, amount: 12.3, purpose: 'GDDS', creditor_reference: 'RF18539007547034')
end
end
private
def data(name)
Pathname(__dir__).join("#{name}.txt").read
end