update ruby version and replace bank-contact with iban-tools
This commit is contained in:
parent
fa8116627f
commit
e1d14dc1db
@ -1 +1 @@
|
|||||||
3.0.2
|
3.4.3
|
||||||
|
24
Gemfile.lock
24
Gemfile.lock
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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'
|
||||||
|
@ -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
|
||||||
|
Loading…
x
Reference in New Issue
Block a user