namespace :heart_seed do
desc "create dir and file" task :init => ["config/heart_seed.yml", "db/xls/.gitkeep", "db/seeds/.gitkeep"] do template = <<RUBY
# Appended by `rake heart_seed:init` HeartSeed::DbSeed.import_all
RUBY
append_file("db/seeds.rb", template) end file "config/heart_seed.yml" => "config" do template = <<YAML
seed_dir: db/seeds xls_dir: db/xls catalogs: # user: # - users # - user_profiles YAML
create_file("config/heart_seed.yml", template) end file "db/xls/.gitkeep" => "db/xls" do create_file("db/xls/.gitkeep") end file "db/seeds/.gitkeep" => "db/seeds" do create_file("db/seeds/.gitkeep") end directory "config" directory "db/xls" directory "db/seeds" desc "create seed files by xls directory (options: FILES=table1.xls,table2.xlsx SHEETS=sheet1,sheet2)" task :xls => :environment do ActiveRecord::Migration.verbose = true Dir.glob(File.join(HeartSeed::Helper.xls_dir, "*.{xls,xlsx}")) do |file| next if File.basename(file) =~ /^~/ next unless target_file?(file) ActiveRecord::Migration.say_with_time("Source File: #{file}") do sheets = HeartSeed::Converter.table_sheets(file) sheets.each do |sheet| unless ActiveRecord::Base.connection.table_exists?(sheet) ActiveRecord::Migration.say("[#{sheet}] Table is not found", true) next end next unless target_sheet?(sheet) dist_file = File.join(HeartSeed::Helper.seed_dir, "#{sheet}.yml") fixtures = HeartSeed::Converter.convert_to_yml(source_file: file, source_sheet: sheet, dist_file: dist_file) if fixtures ActiveRecord::Migration.say("[#{sheet}] Create seed: #{dist_file}", true) else ActiveRecord::Migration.say(" [#{sheet}] Sheet is empty", true) end end end end end namespace :db do desc "Load the seed data from db/seeds/*.yml (options: TABLES=table1,table2 CATALOGS=catalog1,catalog2)" task :seed => :environment do HeartSeed::DbSeed.import_all end end private def target_file?(file) return true if ENV["FILES"].blank? ENV["FILES"].split(",").include?(File.basename(file)) end def target_sheet?(sheet) return true if ENV["SHEETS"].blank? ENV["SHEETS"].split(",").include?(sheet) end def create_file(file, str = nil) open(file, "w") do |out| out.write(str) if str end puts "create: #{file}" end def append_file(file, str) return if File.exist?(file) && File.open(file).read.include?(str) File.open(file, "a") do |out| out.write(str) end puts "append: #{file}" end
end