ioquatix/activerecord-migrations

View on GitHub
lib/active_record/migrations/tasks/db.rb

Summary

Maintainability
A
0 mins
Test Coverage
# 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'