moneydesktop/rubiks

View on GitHub
lib/rubiks/hierarchy.rb

Summary

Maintainability
A
35 mins
Test Coverage
module ::Rubiks

  class Hierarchy < ::Rubiks::NamedObject
    def levels
      @levels ||= []
    end

    def level(level_name, options={}, &block)
      levels.push ::Rubiks::Level.find_or_create(level_name, options, &block)
    end

    def all_member_name(new_value=nil)
      @all_member_name = new_value.to_s if new_value.present?
      @all_member_name ||= @options[:all_member_name] || 'All'
    end

    def has_all(new_value=nil)
      @has_all = new_value.to_s if new_value.present?
      @has_all ||= true
    end

    def json_hash
      hash = default_json_attributes.merge(
        :levels => levels.map{ |lvl| lvl.json_hash }
      )
      hash.delete_if { |key,value| value.nil? }
      hash.stringify_keys!
    end

    def to_xml(builder = nil)
      builder = builder || new_builder

      xml_attrs = default_xml_attributes.merge(:hasAll => has_all.to_s)
      xml_attrs[:primaryKey] = 'id' unless degenerate?
      xml_attrs[:allMemberName] = all_member_name if has_all
      builder.hierarchy(xml_attrs) do
        builder.table(:name => table_with_prefix) unless degenerate?
        levels.each{ |level| level.to_xml(builder) }
      end
    end

    def degenerate?
      table == 'degenerate'
    end
  end

end