dphaener/kanji

View on GitHub
lib/kanji/templates/Rakefile.tt

Summary

Maintainability
Test Coverage
require "bundler/setup"
require "pry-byebug" unless ENV["RACK_ENV"] == "production"
require "rom/sql/rake_task"
require "shellwords"
require_relative "system/<%= config[:underscored_project_name] %>/container"

begin
  require "rspec/core/rake_task"
  RSpec::Core::RakeTask.new :spec
  task default: [:spec]
rescue LoadError
end

def db
  <%= config[:camel_cased_app_name] %>::Container["persistence.db"]
end

def settings
  <%= config[:camel_cased_app_name] %>::Container["settings"]
end

def database_uri
  require "uri"
  URI.parse(settings.database_url)
end

def postgres_env_vars(uri)
  {}.tap do |vars|
    vars["PGHOST"] = uri.host
    vars["PGPORT"] = uri.port if uri.port
    vars["PGUSER"] = uri.user if uri.user
    vars["PGPASSWORD"] = uri.password if uri.password
  end
end

namespace :db do
  task :setup do
    <%= config[:camel_cased_app_name] %>::Container.start :rom
  end

  task :settings do
    <%= config[:camel_cased_app_name] %>::Container.start :settings
  end

  desc "Print current database schema version"
  task version: :setup do
    version =
      if db.tables.include?(:schema_migrations)
        db[:schema_migrations].order(:filename).last[:filename]
      else
        "not available"
      end

    puts "Current schema version: #{version}"
  end

  desc "Create database"
  task create: :settings do
    if system("which createdb", out: File::NULL)
      uri = database_uri
      system(postgres_env_vars(uri), "createdb #{Shellwords.escape(uri.path[1..-1])}")
    else
      puts "You must have Postgres installed to create a database"
      exit 1
    end
  end

  desc "Drop database"
  task drop: :settings do
    if system("which dropdb", out: File::NULL)
      uri = database_uri
      system(postgres_env_vars(uri), "dropdb #{Shellwords.escape(uri.path[1..-1])}")
    else
      puts "You must have Postgres installed to drop a database"
      exit 1
    end
  end

  desc "Migrate database up to latest migration available"
  task :migrate do
    # Enhance the migration task provided by ROM

    # Once it finishes, dump the db structure
    Rake::Task["db:structure:dump"].execute

    # And print the current migration version
    Rake::Task["db:version"].execute
  end

  namespace :structure do
    desc "Dump database structure to db/structure.sql"
    task :dump do
      if system("which pg_dump", out: File::NULL)
        uri = database_uri
        system(postgres_env_vars(uri), "pg_dump -s -x -O #{Shellwords.escape(uri.path[1..-1])}", out: "db/structure.sql")
      else
        puts "You must have pg_dump installed to dump the database structure"
      end
    end
  end

  desc "Load seed data into the database"
  task :seed do
    seed_data = File.join("db", "seed.rb")
    load(seed_data) if File.exist?(seed_data)
  end

  desc "Load a small, representative set of data so that the application can start in a useful state (for development)."
  task :sample_data do
    sample_data = File.join("db", "sample_data.rb")
    load(sample_data) if File.exist?(sample_data)
  end
end