generators/vulcanize/vulcanize_generator.rb in sml-rubber-0.9.13 vs generators/vulcanize/vulcanize_generator.rb in sml-rubber-1.5.5

- old
+ new

@@ -1,67 +1,184 @@ -require 'fileutils' require 'find' +require 'yaml' -class VulcanizeGenerator < Rails::Generator::NamedBase - - TEMPLATE_ROOT = File.dirname(__FILE__) + "/templates" - TEMPLATE_FILE = "templates.yml" - - def manifest - record do |m| - templates = [file_name] + actions - templates.each do |t| - apply_template(m, t) +# Load and initialize rubber if it hasn't been already. +# This happens using the generator with Rails 2 and Rubber is not set up as a plugin. +unless defined?(Rubber) + env = ENV['RUBBER_ENV'] ||= 'development' + root = '.' + + require 'rubber' + Rubber::initialize(root, env) +end + +if Rubber::Util::is_rails2? + require 'fileutils' + require 'commands/generate' + + class VulcanizeGenerator < Rails::Generator::NamedBase + include Rails::Generator::Commands + + TEMPLATE_ROOT = File.dirname(__FILE__) + "/templates" unless defined?(TEMPLATE_ROOT) + TEMPLATE_FILE = "templates.yml" unless defined?(TEMPLATE_FILE) + + def manifest + record do |m| + templates = [file_name] + actions + templates.each do |t| + apply_template(m, t) + end end end + + def apply_template(m, name) + sp = source_path("#{name}/") + unless File.directory?(sp) + raise Rails::Generator::UsageError.new("Invalid template #{name}, use one of #{valid_templates.join(', ')}") + end + + @template_dependencies ||= [] + + templ_conf = load_template_config(sp) + deps = templ_conf['dependent_templates'] || [] + @template_dependencies.concat(deps) + deps.each do |dep| + apply_template(m, dep) + end + + extra_generator_steps_file = File.join(TEMPLATE_ROOT, name, 'templates.rb') + + Find.find(sp) do |f| + Find.prune if File.basename(f) =~ /^(CVS|\.svn)$/ + Find.prune if f == "#{sp}#{TEMPLATE_FILE}" + Find.prune if f == extra_generator_steps_file # don't copy over templates.rb + + rel = f.gsub(/#{source_root}\//, '') + dest_rel = rel.gsub(/^#{name}\//, '') + + # Only include optional files when their conditions eval to true + template_conf = YAML.load(File.read(TEMPLATE_FILE)) rescue {} + optional = template_conf['optional'][dest_rel] rescue nil + Find.prune if optional && ! eval(optional) + + m.directory(dest_rel) if File.directory?(f) + if File.file?(f) + # force scripts to be executable + opts = (File.read(f) =~ /^#!/) ? {:chmod => 0755} : {} + m.file(rel, dest_rel, opts) + end + end + + if File.exist? extra_generator_steps_file + eval File.read(extra_generator_steps_file), binding, extra_generator_steps_file + end + end + + protected + def valid_templates + valid = Dir.entries(TEMPLATE_ROOT).delete_if {|e| e =~ /(^\.)|svn|CVS/ } + end + + def load_template_config(template_dir) + templ_file = "#{template_dir}/templates.yml" + templ_conf = YAML.load(File.read(templ_file)) rescue {} + return templ_conf + end + + def banner + usage = "Usage: #{$0} vulcanize template_name ...\n" + usage << "where template_name is one of:\n\n" + valid_templates.each do |t| + templ_conf = load_template_config("#{TEMPLATE_ROOT}/#{t}") + desc = templ_conf['description'] + usage << " #{t}: #{desc}\n" + end + return usage + end end - def apply_template(m, name) - sp = source_path("#{name}/") - unless File.directory?(sp) - raise Rails::Generator::UsageError.new("Invalid template #{name}, use one of #{valid_templates.join(', ')}") +else + require 'rails/generators' + + class VulcanizeGenerator < Rails::Generators::NamedBase + + def self.source_root + File.join(File.dirname(__FILE__), 'templates') end - - templ_conf = load_template_config(sp) - deps = templ_conf['dependent_templates'] || [] - deps.each do |dep| - apply_template(m, dep) + + def copy_template_files + @template_dependencies = find_dependencies(file_name) + ([file_name] + @template_dependencies).each do |template| + apply_template(template) + end end - - Find.find(sp) do |f| - Find.prune if File.basename(f) =~ /^(CVS|\.svn)$/ - Find.prune if f == "#{sp}#{TEMPLATE_FILE}" - - rel = f.gsub(/#{source_root}\//, '') - dest_rel = rel.gsub(/^#{name}\//, '') - m.directory(dest_rel) if File.directory?(f) - if File.file?(f) - # force scripts to be executable - opts = (File.read(f) =~ /^#!/) ? {:chmod => 0755} : {} - m.file(rel, dest_rel, opts) + + protected + + # helper to test for rails for optional templates + def rails? + Rubber::Util::is_rails? + end + + def find_dependencies(name) + template_dir = File.join(self.class.source_root, name, '') + unless File.directory?(template_dir) + raise Rails::Generators::Error.new("Invalid template #{name}, use one of #{valid_templates.join(', ')}") end + template_conf = load_template_config(template_dir) + template_dependencies = template_conf['dependent_templates'] || [] + + template_dependencies.clone.each do |dep| + template_dependencies.concat(find_dependencies(dep)) + end + + return template_dependencies.uniq end - end - protected + def apply_template(name) + template_dir = File.join(self.class.source_root, name, '') + unless File.directory?(template_dir) + raise Rails::Generators::Error.new("Invalid template #{name}, use one of #{valid_templates.join(', ')}") + end + + template_conf = load_template_config(template_dir) + + extra_generator_steps_file = File.join(template_dir, 'templates.rb') + + Find.find(template_dir) do |f| + Find.prune if f == File.join(template_dir, 'templates.yml') # don't copy over templates.yml + Find.prune if f == extra_generator_steps_file # don't copy over templates.rb + + template_rel = f.gsub(/#{template_dir}/, '') + source_rel = f.gsub(/#{self.class.source_root}\//, '') + dest_rel = source_rel.gsub(/^#{name}\//, '') + + # Only include optional files when their conditions eval to true + optional = template_conf['optional'][template_rel] rescue nil + Find.prune if optional && ! eval(optional) + + if File.directory?(f) + empty_directory(dest_rel) + else + copy_file(source_rel, dest_rel) + src_mode = File.stat(f).mode + dest_mode = File.stat(File.join(destination_root, dest_rel)).mode + chmod(dest_rel, src_mode) if src_mode != dest_mode + end + end + + if File.exist? extra_generator_steps_file + eval File.read(extra_generator_steps_file), binding, extra_generator_steps_file + end + end + def valid_templates - valid = Dir.entries(TEMPLATE_ROOT).delete_if {|e| e =~ /(^\.)|svn|CVS/ } + valid = Dir.entries(self.class.source_root).delete_if {|e| e =~ /(^\.)|svn|CVS/ } end - + def load_template_config(template_dir) - templ_file = "#{template_dir}/templates.yml" - templ_conf = YAML.load(File.read(templ_file)) rescue {} - return templ_conf + YAML.load(File.read(File.join(template_dir, 'templates.yml'))) rescue {} end + end - def banner - usage = "Usage: #{$0} vulcanize template_name ...\n" - usage << "where template_name is one of:\n\n" - valid_templates.each do |t| - templ_conf = load_template_config("#{TEMPLATE_ROOT}/#{t}") - desc = templ_conf['description'] - usage << " #{t}: #{desc}\n" - end - return usage - end end