class Sepa::Base
Public Class Methods
array_attribute(name, tag, member_type=nil, options={ })
click to toggle source
# File lib/sepa/base.rb, line 129 def self.array_attribute name, tag, member_type=nil, options={ } attribute_defs << [name, { :tag => tag, :type => :[], :member_type => member_type, :options => options }] attr_accessor name aduki(name => member_type) if member_type end
attribute(name, tag, type=:string, member_type=nil, options={ })
click to toggle source
# File lib/sepa/base.rb, line 112 def self.attribute name, tag, type=:string, member_type=nil, options={ } if type == :[] array_attribute name, tag, member_type, options elsif type.is_a?(Class) && type != Time && type != Date typed_attribute name, tag, type, options else attr_accessor name attribute_defs << [name, { :tag => tag, :type => type, :options => options }] end end
attribute_defs()
click to toggle source
# File lib/sepa/base.rb, line 96 def self.attribute_defs @@attribute_defs[self] end
attribute_defs=(arg)
click to toggle source
# File lib/sepa/base.rb, line 100 def self.attribute_defs= arg @@attribute_defs[self]= arg end
code_or_proprietary()
click to toggle source
# File lib/sepa/base.rb, line 107 def self.code_or_proprietary attribute :code , "Cd" attribute :proprietary, "Prtry" end
definition(txt)
click to toggle source
# File lib/sepa/base.rb, line 104 def self.definition txt end
time_format=(new_format)
click to toggle source
# File lib/sepa/base.rb, line 135 def self.time_format= new_format @@time_format = new_format end
typed_attribute(name, tag, type, options)
click to toggle source
# File lib/sepa/base.rb, line 123 def self.typed_attribute name, tag, type, options attribute_defs << [name, { :tag => tag, :type => type, :options => options }] attr_accessor name aduki name => type end
Public Instance Methods
build_xml_attributes(names)
click to toggle source
# File lib/sepa/base.rb, line 30 def build_xml_attributes names result = { } (names || { }).each { |k,v| result[k] = self.send v } result end
empty?()
click to toggle source
# File lib/sepa/base.rb, line 38 def empty? false end
empty_item?(item)
click to toggle source
# File lib/sepa/base.rb, line 64 def empty_item? item item == nil || (item.respond_to?(:empty?) && item.empty?) end
normalize(str)
click to toggle source
# File lib/sepa/base.rb, line 42 def normalize str # Integer like Fixnum and Bignum can directly be returned return str if str.is_a? Integer # Check for Numeric to exclude String, but handle Float, BigDecimal, Rational, ... we don't mind. # Kernel#sprintf could handle all to_f implementers, if to_f does not throw an exception return ('%.2f' % str) if str.is_a?(Numeric) && str.respond_to?(:to_f) # For String we need to replace illegal characters by an appropriate alternative replacements = { 'à' => 'a', 'é' => 'e', 'è' => 'e', 'û' => 'u', 'î' => 'i', 'ô' => 'o', 'ü' => 'u', 'ï' => 'i', 'ö' => 'o', 'ÿ' => 'y', 'ç' => 'c', 'Ç' => 'C', 'É' => 'E', 'È' => 'E', 'á' => 'a', 'À' => 'A', 'Á' => 'A', 'Ü' => 'U', 'Ï' => 'I', 'Ö' => 'O', 'ß' => 'ss' } str = replacements.to_a. inject(str.to_s) { |s, kv| s.gsub(kv[0], kv[1]) }. gsub(/[^a-zA-Z0-9_@ \.,()'+\/\?-]/, '') end
string_type?(type_def)
click to toggle source
# File lib/sepa/base.rb, line 60 def string_type? type_def (type_def == :string) || (type_def.is_a?(Class) && type_def < StringWithConstraint) end
to_xml(builder)
click to toggle source
# File lib/sepa/base.rb, line 68 def to_xml builder self.class.attribute_defs.each do |name, meta| item = self.send(name) options = meta[:options] || { } attributes = build_xml_attributes options[:attributes] next if empty_item? item if string_type?(meta[:type]) builder.__send__(meta[:tag], normalize(item), attributes) elsif meta[:type] == :[] if meta[:member_type] == nil || string_type?(meta[:member_type]) item.each { |obj| builder.__send__(meta[:tag], normalize(obj), attributes) } else item.each do |obj| builder.__send__(meta[:tag], attributes) { obj.to_xml builder } end end elsif meta[:type] == Time v = item.is_a?(String) ? item : item.strftime(@@time_format) builder.__send__(meta[:tag], v, attributes) elsif meta[:type] == Date v = item.is_a?(String) ? item : item.strftime("%Y-%m-%d") builder.__send__(meta[:tag], v, attributes) elsif meta[:type].is_a? Class builder.__send__(meta[:tag], attributes) { item.to_xml builder } end end end