Sha256: a223271ebc2badcf795287ae44b08ba7a7def7042d36c306bf04ef950dde2d4e

Contents?: true

Size: 1.91 KB

Versions: 4

Compression:

Stored size: 1.91 KB

Contents

require 'fileutils'

require 'facet/kernel/constant'
require 'facet/kernel/assign_with'

# $DBG = true

module Og

class Manager
  
  # Dump Og managed objects to the filesystem.
  
  def dump(options = {})
    classes = options[:classes] || options[:class] || manageable_classes
    basedir = options[:basedir] || 'ogdump'
    
    FileUtils.makedirs(basedir)
    
    for c in [ classes ].flatten      
      Logger.info "Dumping class '#{c}'"
      all = c.all.map { |obj| obj.properties_to_hash }
      File.open("#{basedir}/#{c}.yml", 'w') { |f| f << all.to_yaml }
    end
  end
  alias_method :export, :dump
  
  # Load Og managed objects from the filesystem. This method can apply
  # optional transformation rules in order to evolve a schema.
  
  def load(options = {})
    classes = options[:classes] || manageable_classes
    basedir = options[:basedir] || 'ogdump'
    rules = options[:rules] || rules[:evolution] || {}

    classes.each { |c| c.destroy if managed?(c) }
    unmanage_classes(classes)
    manage_classes
    
    for f in Dir["#{basedir}/*.yml"]
      all = YAML.load(File.read(f))
      
      unless all.empty?
        klass = f.split(/\/|\./)[1]
        
        Logger.info "Loading class '#{klass}'"
        
        if krules = rules[klass.to_sym]
          if krules[:self]
            # Class name changed.
            Logger.info "Renaming class '#{klass}' to '#{krules[:self]}'"
            klass = krules[:self]
          end
          
          Logger.info "Evolution transformation will be applied!"
        end      

        klass = constant(klass)
        
        for h in all
          obj = klass.allocate
          obj.assign_with(h)
          if krules
            krules.each do |old, new|
              obj.instance_variable_set "@#{new}", h[old]
            end
          end
          obj.insert
        end
      end
    end
  end
  alias_method :import, :load
  alias_method :evolve, :load
  
end
  
end

Version data entries

4 entries across 4 versions & 1 rubygems

Version Path
og-0.29.0 lib/og/evolution.rb
og-0.28.0 lib/og/evolution.rb
og-0.30.0 lib/og/evolution.rb
og-0.31.0 lib/og/evolution.rb