disco-railties/lib/tasks/db.rake
require 'yaml'
require 'active_record'
namespace :disco do
namespace :db do
def disco_database_configuration(disco_config, database)
disco_config.reduce({}) do |map, (key, value)|
if value.is_a?(Hash) && value.has_key?(database)
map[key] = value[database]
end
map
end
end
task :load_config => :environment do
migrate_path = 'db/migrate'
ActiveRecord::Tasks::DatabaseTasks.db_dir = Rails.application.config.paths['db'].first
ActiveRecord::Tasks::DatabaseTasks.seed_loader = Rails.application
ActiveRecord::Base.clear_all_connections!
if ENV['SYSTEM'] == 'domain'
migrate_path = 'db/migrate_domain'
ActiveRecord::Tasks::DatabaseTasks.env = ENV['DOMAIN_ENV'] || Rails.env
disco_config = YAML.load_file(File.join Rails.root, 'config', 'disco.yml')
ActiveRecord::Tasks::DatabaseTasks.database_configuration = disco_database_configuration(disco_config, 'domain_database')
ActiveRecord::Tasks::DatabaseTasks.migrations_paths =
Array(ENV['DOMAIN_MIGRATIONS_DIR'] || Rails.application.paths[migrate_path] || File.join(Rails.root, migrate_path))
ActiveRecord::Tasks::DatabaseTasks.fixtures_path = File.join Rails.root, 'test', 'fixtures_domain'
ENV['SCHEMA'] = File.join(ActiveRecord::Tasks::DatabaseTasks.db_dir, 'schema_domain.rb')
ENV['DB_STRUCTURE'] || File.join(ActiveRecord::Tasks::DatabaseTasks.db_dir, 'structure_domain.sql')
else # 'projection' - normal rails
ActiveRecord::Tasks::DatabaseTasks.env = ENV['PROJECTION_ENV'] || Rails.env
ActiveRecord::Tasks::DatabaseTasks.database_configuration = Rails.application.config.database_configuration
ActiveRecord::Tasks::DatabaseTasks.migrations_paths = Array(Rails.application.paths[migrate_path])
ActiveRecord::Tasks::DatabaseTasks.fixtures_path = File.join Rails.root, 'test', 'fixtures'
ENV['SCHEMA'] = File.join(ActiveRecord::Tasks::DatabaseTasks.db_dir, 'schema.rb')
ENV['DB_STRUCTURE'] = File.join(ActiveRecord::Tasks::DatabaseTasks.db_dir, 'structure.sql')
end
if defined?(ENGINE_PATH) && (engine = Rails::Engine.find(ENGINE_PATH))
if engine.paths[migrate_path].existent
ActiveRecord::Tasks::DatabaseTasks.migrations_paths += Array(engine.paths[migrate_path])
elsif Dir.exists?(File.join engine.root, migrate_path)
ActiveRecord::Tasks::DatabaseTasks.migrations_paths << File.join(engine.root, migrate_path)
end
end
Rails.env = ActiveRecord::Tasks::DatabaseTasks.env
ActiveRecord::Tasks::DatabaseTasks.root = Rails.root if ActiveRecord::Tasks::DatabaseTasks.respond_to? :root
#puts "env = #{ActiveRecord::Tasks::DatabaseTasks.env}"
puts "system = #{ENV['SYSTEM']}"
#puts "config = #{ActiveRecord::Tasks::DatabaseTasks.database_configuration[ActiveRecord::Tasks::DatabaseTasks.env]}"
end
def connect
ActiveRecord::Base.establish_connection ActiveRecord::Tasks::DatabaseTasks.env
end
namespace :migrate do
desc 'Copys the migrations files from the gems directories (options: SYSTEM=(projection|domain))'
task :copy => :load_config do
target_path = ActiveRecord::Tasks::DatabaseTasks.migrations_paths.first
gems = %w(active_event active_domain)
gems = %w(active_projection) if ENV['SYSTEM'] != 'domain'
gems.each do |gem|
gem_spec = Gem::Specification.find_by_name(gem)
if gem.nil?
puts "missing gem #{gem}!"
elsif Dir.exists?(File.join gem_spec.gem_dir, 'db/migrate')
cp_r (File.join gem_spec.gem_dir, 'db/migrate/.'), target_path
else
puts "missing db/migrate in gem #{gem}!"
end
end
end
desc 'Copy and run migrations (options: SYSTEM=(projection|domain))'
task :setup do
Rake::Task[:'disco:db:migrate:copy'].invoke
Rake::Task[:'disco:db:create'].invoke
Rake::Task[:'disco:db:migrate'].invoke
end
# make sure the right database is connected
task :down do connect end
task :up do connect end
task :status do connect end
end
task :migrate do connect end
namespace :schema do
task :load do connect end
end
namespace :structure do
task :load do connect end
end
end
load 'active_record/railties/databases.rake'
namespace :domain do
task :environment do
ENV['SYSTEM'] = 'domain'
end
namespace :create do
task :all => [:environment, :'disco:db:create:all']
end
desc 'Create the database from config/disco.yml (use create:all to create all dbs in the config)'
task :create => [:environment, :'disco:db:create']
namespace :drop do
task :all => [:environment, :'disco:db:drop:all']
end
desc 'Drops the database using config/disco.yml (use drop:all to drop all databases)'
task :drop => [:environment, :'disco:db:drop']
desc 'run domain migrations'
task :migrate => [:environment, :'disco:db:migrate']
namespace :migrate do
desc 'Display status of migrations'
task :status => [:environment, :'disco:db:migrate:status']
desc 'Copy migrations from rails disco'
task :copy => [:environment, :'disco:db:migrate:copy']
desc 'Copy and run migrations from rails disco'
task :setup => [:environment, :'disco:db:migrate:setup']
desc 'drop and create, copy and run migrations from rails disco'
task :reset => [:environment, :'disco:db:migrate:reset']
end
desc 'create and load schema and seeds for domain database'
task :setup => [:environment, :'disco:db:setup']
end
def reenable
Rake::Task.tasks.map &:reenable
end
desc 'creates the domain and projection databases for the current environment'
task :create do
ENV['SYSTEM'] = 'projection'
Rake::Task[:'disco:db:create'].invoke
reenable
Rake::Task[:'disco:domain:create'].invoke
end
desc 'drops the domain and projection databases for the current environment'
task :drop do
ENV['SYSTEM'] = 'projection'
Rake::Task[:'disco:db:drop'].invoke
reenable
Rake::Task[:'disco:domain:drop'].invoke
end
desc 'migrates the domain and projection databases for the current environment'
task :migrate do
ENV['SYSTEM'] = 'projection'
Rake::Task[:'disco:db:migrate'].invoke
reenable
Rake::Task[:'disco:domain:migrate'].invoke
end
desc 'Create and load schema and seeds for domain and projection databases'
task :setup do
ENV['SYSTEM'] = 'projection'
Rake::Task[:'disco:db:setup'].invoke
reenable
Rake::Task[:'disco:domain:setup'].invoke
end
desc 'Drop, recreate and load schema and seeds for domain and projection databases'
task :reset do
ENV['SYSTEM'] = 'projection'
Rake::Task[:'disco:db:drop'].invoke
Rake::Task[:'disco:db:setup'].invoke
reenable
Rake::Task[:'disco:domain:drop'].invoke
Rake::Task[:'disco:domain:setup'].invoke
end
namespace :migrate do
desc 'copies, creates and runs all migrations for domain and projection databases for the current environment'
task :setup do
ENV['SYSTEM'] = 'projection'
Rake::Task[:'disco:db:migrate:setup'].invoke
reenable
Rake::Task[:'disco:domain:migrate:setup'].invoke
end
desc 'Resets your domain and projection databases using your migrations for the current environment'
task :reset do
ENV['SYSTEM'] = 'projection'
Rake::Task[:'disco:db:migrate:reset'].invoke
reenable
Rake::Task[:'disco:domain:migrate:reset'].invoke
end
desc 'Display status of domain and projection migrations'
task :status do
ENV['SYSTEM'] = 'projection'
Rake::Task[:'disco:db:migrate:status'].invoke
reenable
Rake::Task[:'disco:domain:migrate:status'].invoke
end
end
end