lib/middleman-core/cli/init.rb



require 'middleman-core/templates'

# CLI Module
module Middleman::Cli
  # A thor task for creating new projects
  class Init < Thor
    check_unknown_options!

    namespace :init

    desc 'init NAME [options]', 'Create new project NAME'
    available_templates = ::Middleman::Templates.registered.keys.join(', ')
    method_option 'template',
                  aliases: '-T',
                  default: 'default',
                  desc: "Use a project template: #{available_templates}"
    method_option 'css_dir',
                  # :default => "stylesheets",
                  desc: 'The path to the css files'
    method_option 'js_dir',
                  # :default => "javascripts",
                  desc: 'The path to the javascript files'
    method_option 'images_dir',
                  # :default => "images",
                  desc: 'The path to the image files'
    method_option 'rack',
                  type: :boolean,
                  default: false,
                  desc: 'Include a config.ru file'
    method_option 'skip-gemfile',
                  type: :boolean,
                  default: false,
                  desc: "Don't create a Gemfile"
    method_option 'skip-bundle',
                  type: :boolean,
                  aliases: '-B',
                  default: false,
                  desc: "Don't run bundle install"
    method_option 'skip-git',
                  type: :boolean,
                  default: false,
                  desc: 'Skip Git ignores and keeps'
    method_option 'force',
                  type: :boolean,
                  default: false,
                  desc: 'Overwrite existing files without any question'

    # The init task
    # @param [String] name
    def init(name='.')
      key = options[:template].to_sym
      unless ::Middleman::Templates.registered.key?(key)
        raise Thor::Error, "Unknown project template '#{key}'"
      end

      thor_group = ::Middleman::Templates.registered[key]
      thor_group.new([name], options).invoke_all
    end
  end

  def self.exit_on_failure?
    true
  end

  # Map "i", "new" and "n" to "init"
  Base.map(
             'i'   => 'init',
             'new' => 'init',
             'n'   => 'init'
  )
end