$LOAD_PATH.unshift(File.dirname(__FILE__)) module Xmvc module Generator autoload :Layout, 'generators/layout' autoload :App, 'generators/app' autoload :Model, 'generators/model' autoload :View, 'generators/view' autoload :Controller, 'generators/controller' autoload :Scaffold, 'generators/scaffold' autoload :Boot, 'generators/boot' GENERATORS = %w(app model controller scaffold view namespace) def self.dispatch(generator, options, *params) Xmvc.public_path = File.expand_path("./public") unless GENERATORS.include?(generator) raise MVC::ArgumentError.new("Must use one of the following: " + GENERATORS.join(", ").downcase) end case generator when "app" options = options.dup App.start(params, options) when "model" model = Model.new([], options.dup) model.invoke("generate", [params.shift, *params]) when "controller" name = params.shift controller = Controller.new([], options.dup) controller.invoke("generate", [name]) if params.length params.each do |v| view = View.new([], options.dup) # why have to create new instance for each?? view.invoke("generate", [name, v]) end end when "scaffold" name = params.shift Xmvc.ui.warn("scaffold generation is not yet implemented") scaffold = Scaffold.new([], options.dup) scaffold.invoke("generate", [name, params]) when "view" package = params.shift name = params.shift view = View.new([], options.dup) view.invoke("generate", [package, name]) when "namespace" #self.namespace(name) end end # overwrites all instances of 'MyApp' with the namespace provided def self.namespace(namespace) current = Xmvc.namespace configs = %w( config/settings.yml config/application.js ) Dir["app/controllers/*.js"].each do |f| write_namespace(f, current, namespace) end Dir["app/views/*/*.js"].each do |f| write_namespace(f, current, namespace) end configs.each {|f| write_namespace(f, current, namespace) } end private def self.write_namespace(f, current, namespace) Xmvc.ui.confirm(" namespacing #{f}") gsub_file(f, current, namespace) end #find/replace in a file. Stolen/adapted from Rails def self.gsub_file(filename, regexp, *args, &block) content = File.read(filename).gsub(regexp, *args, &block) File.open(filename, 'wb') { |file| file.write(content) } end end end