class Datev::Base

Attributes

default_attributes[W]
fields[RW]

Public Class Methods

default_attributes() click to toggle source
# File lib/datev/base.rb, line 7
def default_attributes
  if @default_attributes.is_a?(Proc)
    @default_attributes.call
  else
    @default_attributes
  end
end
field(name, type, options={}, &block) click to toggle source
# File lib/datev/base.rb, line 21
def self.field(name, type, options={}, &block)
  self.fields ||= []

  # Check if there is already a field with the same name
  if field_by_name(name)
    raise ArgumentError.new("Field '#{name}' already exists")
  end

  field_class = const_get("Datev::#{type.to_s.capitalize}Field")
  self.fields << field_class.new(name, options, &block)
end
field_by_name(name) click to toggle source
# File lib/datev/base.rb, line 33
def self.field_by_name(name)
  self.fields.find { |f| f.name == name }
end
inherited(subclass) click to toggle source
# File lib/datev/base.rb, line 15
def inherited(subclass)
  subclass.fields             = self.fields
  subclass.default_attributes = self.default_attributes
end
new(attributes) click to toggle source
# File lib/datev/base.rb, line 37
def initialize(attributes)
  raise ArgumentError.new('Hash required') unless attributes.is_a?(Hash)

  @attributes = self.class.default_attributes || {}

  # Check existing names and set value (if valid)
  attributes.each_pair do |name,value|
    unless field = self.class.field_by_name(name)
      raise ArgumentError.new("Field '#{name}' not found")
    end

    field.validate!(value)
    @attributes[name] = value
  end

  # Check for missing values
  self.class.fields.select(&:required?).each do |field|
    if @attributes[field.name].nil?
      raise ArgumentError.new("Value for field '#{field.name}' is required but missing")
    end
  end
end

Public Instance Methods

[](name) click to toggle source
# File lib/datev/base.rb, line 60
def [](name)
  field = self.class.field_by_name(name)
  raise ArgumentError.new("Field '#{name}' not found") unless field

  @attributes[field.name]
end
output(context=nil) click to toggle source
# File lib/datev/base.rb, line 67
def output(context=nil)
  self.class.fields.map do |field|
    value = @attributes[field.name]
    field.output(value, context)
  end
end