lib/active_record/migrations/tasks/db.rb
# Copyright, 2016, by Samuel G. D. Williams. <http://www.codeotaku.com>
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in
# all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
# THE SOFTWARE.
require 'rake'
require 'variant'
task :environment do
# Can be overriden by user.
end
namespace :db do
task :load_config => :environment do
database_tasks = ActiveRecord::Tasks::DatabaseTasks
unless root = ActiveRecord::Migrations.root
abort "ActiveRecord::Migrations.root needs to be set!"
end
# DATABASE_ENV is a legacy environment variable:
variant = Variant.for(:database) || DATABASE_ENV
if ActiveRecord::Base.configurations.empty?
abort "ActiveRecord::Base.configurations needs to be setup!"
end
database_tasks.root = root
database_tasks.db_dir = File.join(root, 'db')
database_tasks.env = variant.to_s
database_tasks.database_configuration = ActiveRecord::Base.configurations
database_tasks.migrations_paths = [File.join(root, 'db/migrate')]
database_tasks.fixtures_path = File.join(root, 'db/fixtures', variant.to_s)
database_tasks.send(:define_method, :load_seed) do
load File.join(root, 'db/seed.rb')
end
end
task :schema_path => :load_config do
database_tasks = ActiveRecord::Tasks::DatabaseTasks
paths = [
ENV['SCHEMA'],
File.join(database_tasks.fixtures_path, 'schema.rb'),
File.join(database_tasks.db_dir, 'schema.rb'),
].compact
unless @schema_path = paths.select{|path| File.exist?(path)}.first
abort "Could not locate schema file: #{paths.inspect}!"
end
puts "Found schema: #{@schema_path}"
end
desc 'Setup a new database if required and run migrations.'
task :deploy => [:load_config, :schema_path] do
database_tasks = ActiveRecord::Tasks::DatabaseTasks
unless ActiveRecord::Migrations.database?
Rake::Task['db:create'].invoke
ActiveRecord::Tasks::DatabaseTasks.load_schema_current(:ruby, @schema_path)
Rake::Task['db:seed'].invoke
end
Rake::Task['db:migrate'].invoke
end
task :connection_config => :environment do
require 'rainbow'
puts "#{Rainbow("Connection Config:").bright} DATABASE_ENV=#{Rainbow(DATABASE_ENV).green}"
ActiveRecord::Base.connection_config.each do |key,value|
key = Rainbow("#{key}:".rjust(30)).yellow
puts "\t#{key} #{value.inspect}"
end
end
desc 'Print out connection configuration and available tables/data sources.'
task :info => :connection_config do
puts Rainbow("Data Sources:").bright
if ActiveRecord::Migrations.database?
ActiveRecord::Base.connection.data_sources.each do |data_source|
puts "\t#{data_source}"
end
else
puts Rainbow("\tDatabase does not exist!").red
end
end
end
# Loading this AFTER we define our own load_config task is critical, we need to make sure things are set up correctly before we run the task of the same name from ActiveRecord.
load 'active_record/railties/databases.rake'
# We load these afterwards as it augments/replace the existing tasks:
require_relative 'db/seed'
require_relative 'db/fixtures'
require_relative 'db/migrations'