ref: master
script/export_data
#!/usr/bin/env ruby require 'rubygems' require "#{File.dirname(__FILE__)}/../config/environment" def parse_opts puts "please provide the yaml configuration file" if ARGV.blank? $config_file = ARGV[0] $config = YAML.load File.read($config_file) end class ActiveRecord::Base yaml_as "tag:ruby.yaml.org,2002:ActiveRecord" end class Object attr_accessor :embeded_file end def patch_to_yaml Object.class_eval do attr_accessor :export_methods def to_yaml opts = {} YAML::quick_emit self, opts do |out| out.map taguri, to_yaml_style do |map| self.export_methods.each do |m| map.add m, self.send(m).to_yaml end end end end end end def export_association sources, associations = [], options = {} sources.to_a.each do |source| source.export_methods = ['attributes'] if options[:embed_files] and source.respond_to? :public_filename source.embeded_file = File.read "public#{source.public_filename}" source.export_methods << 'embeded_file' end associations.to_a.each do |association| if association.is_a? Hash association.each do |association, associations| source.export_methods << association export_association source.send(association), associations, options end else source.export_methods << association export_association source.send(association), [], options end end end end def export_config config patch_to_yaml config = HashWithIndifferentAccess.new config options = config[:options] data = config[:sources].to_a.map do |source_config| source = source_config[:type].constantize.find source_config[:id] export_association source, source_config[:associations].to_a, options end STDOUT << data.to_yaml end module ScriptTest class TestUploadedFile attr_accessor :path, :content_type, :size def original_filename File.basename self.path end end class << self def create_test_data environment = Environment.create! :name => 'env' product_category = ProductCategory.create! :environment => environment, :name => 'prod cat' enterprise = environment.enterprises.first product = enterprise.products.create! :product_category => product_category image_data = TestUploadedFile.new image_data.path = 'test/fixtures/files/noosfero-network.png' image_data.content_type = 'text/plain' image_data.size = 30 product.image = Image.create! :parent_id => product, :uploaded_data => image_data product.save environment end def test_config id { "options" => { "embed_files"=>true }, "sources"=> [ { "id"=>id, "type"=>"Environment", "associations"=> [ { "products"=> [ {"image"=>["thumbnails"]} ] } ] } ] } end end end def run parse_opts export_config $config end def test environment = ScriptTest.create_test_data $config = ScriptTest.test_config environment.id export_config $config # FIXME: can't destroy with modified to_yaml #environment.destroy end run #test