Module: Postmod

Defined in:
lib/postmod.rb,
lib/postmod/action.rb,
lib/postmod/create.rb

Defined Under Namespace

Modules: Generate Classes: Action

Constant Summary collapse

Create =
Action.new(:project_path) do

  def call
    create_project
    create_lib
    create_db
    create_bin
    create_api
    create_web
    create_spec
  end

  private

  def create_project
    FileUtils.mkdir(project_path)
    FileUtils.cp_r(Dir.glob(project_template_path + "/*"), project_path)
    FileUtils.cp_r(Dir.glob(project_template_path + "/*"), project_path)
    File.write("#{project_path}/.ruby-version", '2.2.2')
    File.write("#{project_path}/.ruby-version", '2.2.2')
    File.write("#{project_path}/.env", "export DATABASE_URL=postgres:///#{project_name}_dev")
  end

  def create_lib
    Generate::Module.("#{project_path}/lib/#{project_name}")
  end

  def create_db
    db_config_file = Mustache.new
    db_config_file.template_file = "#{project_path}/db/config.yml"
    db_config_file_content = db_config_file.render(app_name: project_name)

    File.write("#{project_path}/db/config.yml", db_config_file_content)
  end

  def create_bin
    FileUtils.mkdir(project_path + '/bin')
    File.open("#{project_path}/bin/console", 'w') do |console_file|
      console_file.puts '#!/usr/bin/env ruby'
      console_file.puts "require 'pry'"
      console_file.puts "require_relative '../lib/#{project_name}'"
      console_file.puts "ActiveRecord::Base.establish_connection"
      console_file.puts "#{project_name.capitalize}.pry"
    end
    `chmod u+x #{project_path}/bin/console`
  end

  def create_api
    api_file_content = File.readlines("#{project_template_path}/api/api.rb")

    File.open("#{project_path}/api/api.rb", 'w') do |api_file|
      api_file.puts "require_relative '../lib/#{project_name}'"
      api_file_content.each { |line| api_file.puts line }
    end
  end

  def create_web
    FileUtils.rm_rf("#{project_path}/web")
    Chaplin::New.("#{project_path}/web")
    FileUtils.cp("#{project_template_path}/web/config.ru", "#{project_path}/web/config.ru")
    FileUtils.cp("#{project_template_path}/web/web.rb", "#{project_path}/web/web.rb")
    FileUtils.cp("#{project_template_path}/web/app.yml", "#{project_path}/web/app.yml")
  end

  def create_spec
    FileUtils.cp_r("#{project_template_path}/spec", project_path)
  end

  def project_template_path
    "#{__dir__}/../../project_template"
  end

  def project_name
    project_path.split("/").last
  end

end