module Xmvc module Generator class App < Thor::Group include Thor::Actions def self.source_root File.join(Xmvc::TEMPLATE_PATH, "app", "public") end argument :name, :type => :string, :desc => "Name of application to generate" desc "Generates a new Xmvc application" def create_root empty_directory(name) self.destination_root = name FileUtils.chdir(name) end def vendor_spec copy_file("vendor.yml", "vendor.yml") end def create_app empty_directory("app") inside("app", {}) do #copy_file("App.js", "#{destination_root}/App.js") empty_directory("models") directory("views", "views") directory("controllers", "controllers") end end def create_config directory("config", "config") end def create_lib empty_directory("lib") end def create_public empty_directory("public") inside("public", {}) do copy_file("index.html", "index.html") empty_directory("images") empty_directory("javascripts") directory("stylesheets", "stylesheets") end end def create_spec directory("spec", "spec", :recursive => false) inside("spec", {}) do empty_directory("models") empty_directory("controllers") end end def create_vendor directory("vendor", "vendor") inside("vendor", {}) do |vendor_dir| empty_directory("plugins") # install vendors Xmvc.vendors.each do |vendor| vendor::API.install({ :root => vendor_dir }) end end end def install_plugins inside("vendor/plugins", {}) do # install vendor/plugins here end end def environment Xmvc::Config.setup end def boot ## # We want to get rid of Xmvc::Builder in favour of each vendor providing its own secretary # @vendors = [] # bundle all vendor assets inside "vendor" do |dir| Xmvc.vendors.each do |vendor| api = vendor::API.load({ :root => dir, :format => :js, :asset_root => Xmvc::PUBLIC_PATH }) api.invoke(:bundle) @vendors << api end end # Bundle application code last app = Xmvc::API.load({ :root => ".", :format => :js, :asset_root => Xmvc::PUBLIC_PATH }) app.invoke(:bundle) @vendors << app # Create a boot-generator boot = Xmvc::Generator::Boot.new([], { :root => self.destination_root, :vendors => @vendors }) boot.invoke(:default) boot.invoke(:sprockets) end end end end