update ruby version and replace bank-contact with iban-tools

This commit is contained in:
Jörg Seitz 2025-06-03 17:44:15 +02:00
parent fa8116627f
commit e1d14dc1db
5 changed files with 40 additions and 40 deletions

View File

@ -1 +1 @@
3.0.2 3.4.3

View File

@ -2,27 +2,27 @@ PATH
remote: . remote: .
specs: specs:
girocode (0.2.0) girocode (0.2.0)
bank-contact iban-tools
rqrcode rqrcode
GEM GEM
remote: https://rubygems.org/ remote: https://rubygems.org/
specs: specs:
bank-contact (0.0.6)
chunky_png (1.4.0) chunky_png (1.4.0)
docile (1.4.0) docile (1.4.1)
minitest (5.14.4) iban-tools (1.2.1)
rake (13.0.6) minitest (5.25.5)
rqrcode (2.1.0) rake (13.3.0)
rqrcode (3.1.0)
chunky_png (~> 1.0) chunky_png (~> 1.0)
rqrcode_core (~> 1.0) rqrcode_core (~> 2.0)
rqrcode_core (1.2.0) rqrcode_core (2.0.0)
simplecov (0.21.2) simplecov (0.22.0)
docile (~> 1.1) docile (~> 1.1)
simplecov-html (~> 0.11) simplecov-html (~> 0.11)
simplecov_json_formatter (~> 0.1) simplecov_json_formatter (~> 0.1)
simplecov-html (0.12.3) simplecov-html (0.13.1)
simplecov_json_formatter (0.1.3) simplecov_json_formatter (0.1.4)
PLATFORMS PLATFORMS
ruby ruby
@ -34,4 +34,4 @@ DEPENDENCIES
simplecov simplecov
BUNDLED WITH BUNDLED WITH
2.2.22 2.6.8

View File

@ -17,5 +17,5 @@ Gem::Specification.new do |s|
s.require_paths = ['lib'] s.require_paths = ['lib']
s.add_dependency 'rqrcode' s.add_dependency 'rqrcode'
s.add_dependency 'bank-contact' s.add_dependency 'iban-tools'
end end

View File

@ -1,5 +1,5 @@
require 'bigdecimal' require 'bigdecimal'
require 'bank/contact' require 'iban-tools'
require 'rqrcode' require 'rqrcode'
require_relative 'girocode/version' require_relative 'girocode/version'

View File

@ -1,13 +1,13 @@
module Girocode module Girocode
class Error < StandardError; end class Error < StandardError; end
class Code class Code
ATTRIBUTES = %i[bic name iban currency amount purpose creditor_reference reference bto_info] ATTRIBUTES = %i[bic name iban currency amount purpose creditor_reference reference bto_info]
attr_reader *ATTRIBUTES attr_reader *ATTRIBUTES
MAX_PAYLOAD_BYTES = 331 MAX_PAYLOAD_BYTES = 331
AMOUNT_RANGE = BigDecimal('0.01')..BigDecimal('999999999.99') AMOUNT_RANGE = BigDecimal('0.01')..BigDecimal('999999999.99')
def initialize(**attrs) def initialize(**attrs)
if keys = attrs.keys - ATTRIBUTES and not keys.empty? if keys = attrs.keys - ATTRIBUTES and not keys.empty?
raise ArgumentError, "Illegal attributes #{keys.inspect}" raise ArgumentError, "Illegal attributes #{keys.inspect}"
@ -19,17 +19,17 @@ module Girocode
raise ArgumentError, "either creditor reference or reference may be set" if creditor_reference? && reference? raise ArgumentError, "either creditor reference or reference may be set" if creditor_reference? && reference?
raise ArgumentError, "payload too long" if payload.bytesize > MAX_PAYLOAD_BYTES raise ArgumentError, "payload too long" if payload.bytesize > MAX_PAYLOAD_BYTES
end end
def bic=(value) def bic=(value)
if value.nil? if value.nil?
@bic = 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 else
bic = Bank::BIC.new(value) raise ArgumentError, "Invalid BIC #{value.inspect}"
raise ArgumentError, "Invalid BIC #{value.inspect}" unless bic.valid?
@bic = bic.to_s
end end
end end
def name=(value) def name=(value)
value = value.strip value = value.strip
raise ArgumentError, 'name is required' unless value raise ArgumentError, 'name is required' unless value
@ -37,81 +37,81 @@ module Girocode
raise ArgumentError, 'Illegal name' if value.include?("\n") || value.include?("\r") raise ArgumentError, 'Illegal name' if value.include?("\n") || value.include?("\r")
@name = value @name = value
end end
def iban=(value) def iban=(value)
iban = Bank::IBAN.new(value) raise ArgumentError, "Invalid IBAN #{value.inspect}" unless IBANTools::IBAN.valid?(value)
raise ArgumentError, "Invalid IBAN #{value.inspect}" unless iban.valid?
@iban = iban.to_s @iban = value
end end
def currency=(value) def currency=(value)
value = value.to_s.upcase value = value.to_s.upcase
raise ArgumentError, "Invalid currency" unless value.match?(/\A[A-Z]{3}\z/) raise ArgumentError, "Invalid currency" unless value.match?(/\A[A-Z]{3}\z/)
@currency = value @currency = value
end end
def amount=(value) def amount=(value)
raise ArgumentError, 'amount is required' unless value raise ArgumentError, 'amount is required' unless value
value = BigDecimal(value, Float::DIG + 1) value = BigDecimal(value, Float::DIG + 1)
raise ArgumentError, "invalid amount #{value.inspect}" unless AMOUNT_RANGE.cover?(value) raise ArgumentError, "invalid amount #{value.inspect}" unless AMOUNT_RANGE.cover?(value)
@amount = value @amount = value
end end
def purpose=(value) def purpose=(value)
unless value.nil? unless value.nil?
raise ArgumentError, "invalid purpose #{value.inspect}" unless value.match?(/\A[A-z0-9]{0,4}\z/) raise ArgumentError, "invalid purpose #{value.inspect}" unless value.match?(/\A[A-z0-9]{0,4}\z/)
end end
@purpose = value @purpose = value
end end
def creditor_reference=(value) def creditor_reference=(value)
unless value.nil? unless value.nil?
raise ArgumentError, "invalid creditor reference #{value.inspect}" if value.include?("\n") || value.include?("\r") || value.size > 35 raise ArgumentError, "invalid creditor reference #{value.inspect}" if value.include?("\n") || value.include?("\r") || value.size > 35
end end
@creditor_reference = value @creditor_reference = value
end end
def reference=(value) def reference=(value)
unless value.nil? unless value.nil?
raise ArgumentError, "invalid reference #{value.inspect}" if value.include?("\n") || value.include?("\r") || value.size > 140 raise ArgumentError, "invalid reference #{value.inspect}" if value.include?("\n") || value.include?("\r") || value.size > 140
end end
@reference = value @reference = value
end end
def bto_info=(value) def bto_info=(value)
unless value.nil? unless value.nil?
raise ArgumentError, "invalid bto_info #{value.inspect}" if value.include?("\n") || value.include?("\r") || value.size > 70 raise ArgumentError, "invalid bto_info #{value.inspect}" if value.include?("\n") || value.include?("\r") || value.size > 70
end end
@bto_info = value @bto_info = value
end end
ATTRIBUTES.each do |attr| ATTRIBUTES.each do |attr|
define_method("#{attr}?") do define_method("#{attr}?") do
value = instance_variable_get("@#{attr}") value = instance_variable_get("@#{attr}")
value.respond_to?(:empty?) ? !value.empty? : !!value value.respond_to?(:empty?) ? !value.empty? : !!value
end end
end end
def payload def payload
['BCD', '002', '1', 'SCT', ['BCD', '002', '1', 'SCT',
bic, name, iban,formatted_amount, purpose, bic, name, iban,formatted_amount, purpose,
creditor_reference || reference, bto_info].map(&:to_s).join("\n") creditor_reference || reference, bto_info].map(&:to_s).join("\n")
end end
def to_qrcode def to_qrcode
RQRCode::QRCode.new(payload, level: :m, mode: :byte_8bit) RQRCode::QRCode.new(payload, level: :m, mode: :byte_8bit)
end end
def to_ascii def to_ascii
to_qrcode.to_s to_qrcode.to_s
end end
%i[png svg html ansi].each do |format| %i[png svg html ansi].each do |format|
define_method("to_#{format}") { |*args| to_qrcode.public_send("as_#{format}", *args) } define_method("to_#{format}") { |*args| to_qrcode.public_send("as_#{format}", *args) }
end end
private private
def formatted_amount def formatted_amount
"#{currency}#{amount.round(2).to_s('F')}" if currency? && amount "#{currency}#{amount.round(2).to_s('F')}" if currency? && amount
end end