withassociates/slices

View on GitHub
lib/tasks/seeds.rake

Summary

Maintainability
Test Coverage
require 'highline/import'

module Slices
  module Tasks
    class Exists < RuntimeError; end

    def self.with_message(text)
      print "#{text} ... "
      yield
      puts "ok"
    rescue Exists
      puts "(exists)"
    end

    def self.make_virtual(role, name, status)
      with_message("Creating #{status} page") do
        if Page.where(role: role).count > 0
          raise Exists
        end
        Page.make(role: role, name: name, active: true)
      end
    end

    def self.make_home
      with_message("Creating home page") do
        raise Exists if Page.where(path: '/').any?
        Page.make(name:         'Home',
                  permalink:    '',
                  show_in_nav:  true,
                  active:       true)
      end
    end

    def self.make_errors
      make_virtual('not_found', 'Page not found', 404)
      make_virtual('error', 'Whoops', 500)
    end

    def self.make_admin
      if Admin.exists?
        say "Creating admin user ... (exists)"
        return
      end

      say("Creating admin user ...")

      admin = Admin.create!(
        name: ask('Enter a name: '),
        email: ask('Enter an email address: '),
        password: ask('Enter a password: ') { |q| q.echo = false }
      )
      admin.super_user = true
      admin.save!

      say("... ok")
    end

    def self.make_all
      make_home
      make_errors
      make_admin
    end
  end
end

namespace :slices do
  namespace :seed do
    task :foo do
      puts "Bar"
    end

    desc "Create the home page"
    task :home => :environment do
      Slices::Tasks.make_home
    end

    desc "Create 404 and 500 pages"
    task :errors => :home do
      Slices::Tasks.make_errors
    end

    desc "Create admin user"
    task :admin => :environment do
      Slices::Tasks.make_admin
    end
  end

  desc "Seed home, errors and admin user"
  task :seed => :environment do
    Slices::Tasks.make_all
  end
end