require 'indented_io' require 'meta_db/db_object' module MetaDb class DbObject def dump(short = false) puts self.class.to_s dump_attrs(short) end def dump_attrs(short, *attrs) attrs = Array(attrs) attrs = self.class.attrs if attrs.empty? indent { for attr in Array(attrs) value = self.send(attr) case value when Array if value.first.is_a?(Symbol) puts "#{attr}: #{value.inspect}" else if short puts "#{attr}: [#{value.map(&:name).join(", ")}]" else puts "#{attr}: " indent { value.each { |v| v.dump } } end end when Hash if short puts "#{attr}: [#{value.values.map(&:name).join(", ")}]" else puts "#{attr}: " indent { value.values.each { |v| v.dump } } end when DbObject puts "#{attr}: #{value.name} (#{value.class})" else puts "#{attr}: #{self.send(attr).inspect}" end end } end end class Constraint < DbObject def dump(short = true) super(short) end end end