Skip to content

Instantly share code, notes, and snippets.

@dougo-chris
Created March 24, 2010 22:26
Show Gist options
  • Save dougo-chris/342902 to your computer and use it in GitHub Desktop.
Save dougo-chris/342902 to your computer and use it in GitHub Desktop.
bmani
#!/opt/local/bin/ruby -w
#
# run this script in the gem direcory with the
# example bam ~/Workspace/my_rails_project [name]
#
# /rails_generators/manifests/NAME.yml
#
# contents :
# - app/views/admin/users
# - app/views/user_mailer
# - app/views/users
#
# files :
# - app/controllers/users_controller.rb
# - app/controllers/admin/users_controller.rb
# - app/models/user.rb
#
# templates :
# replacements :
# - complex : rule_name
# - Complex : rule_class
# - '20100725233933' : "Time.now.strftime('%Y%m%d%H%M%S')"
#
# directories :
# - app/views/re_rule_definitions/complex_rule
#
# files :
# - app/rules/complex_rule.rb
require 'yaml'
require 'fileutils'
require 'find'
unless ARGV.length > 1
puts "Usage: #{ARGF} [project_dir] [manifest_name]"
exit(-1)
end
project_dir = ARGV[0]
gem_dir = Dir.pwd
manifest = ARGV[1]
manifest_class = "#{manifest.gsub(/\/(.?)/) { "::" + $1.upcase }.gsub(/(^|_)(.)/) { $2.upcase }.gsub(/\b('?[a-z])/) { $1.capitalize }}Manifest"
generator_dir = "#{gem_dir}/rails_generators"
manifest_file = "#{generator_dir}/manifests/#{manifest}.yml"
unless File.exists?(manifest_file) && File.directory?(project_dir)
puts "Check Manifest file : #{manifest_file}"
puts "Check Project dir : #{project_dir}"
exit(-1)
end
settings = YAML::load_file(manifest_file)
replacement_list = []
directory_list = {}
file_list = {}
template_list = {}
unless settings['contents'].nil?
settings['contents'].each do |directory|
dir_from = "#{project_dir}/#{directory}/."
dir_to = "#{generator_dir}/templates/#{directory}"
FileUtils.rm_r(dir_to) if File.directory?(dir_to)
FileUtils.mkdir_p(dir_to)
FileUtils.cp_r(dir_from, dir_to) #, :verbose => true)
Find.find(dir_to) do |path|
short_path = path.sub("#{generator_dir}/templates/", '')
if FileTest.directory?(path)
directory_list[short_path] = true unless directory_list[short_path]
else
file_list[short_path] = true unless file_list[short_path] || path =~ /\/\./
end
end
end
end
unless settings['directories'].nil?
settings['directories'].each do |directory|
directory_list[directory] = true unless directory_list[directory]
end
end
unless settings['files'].nil?
settings['files'].each do |file|
file_from = "#{project_dir}/#{file}"
file_to = "#{generator_dir}/templates/#{file}"
FileUtils.rm_r(file_to) if File.directory?(file_to)
FileUtils.rm(file_to) if File.exists?(file_to)
FileUtils.mkdir_p(File.dirname(file_to))
FileUtils.cp(file_from, file_to) #, :verbose => true)
file_list[file] = true unless file_list[file]
short_path = File.dirname(file).sub("#{generator_dir}/templates/", '')
directory_list[short_path] = true unless directory_list[short_path]
end
end
unless settings['templates'].nil? || settings['templates']['replacements'].nil? || settings['templates']['replacements'].empty?
settings['templates']['replacements'].each do | value |
value.each do |key, value|
replacement_list << value
end
end
unless settings['templates']['directories'].nil?
settings['templates']['directories'].each do | directory |
short_path = directory
settings['templates']['replacements'].each do | value |
value.each do |key, value|
short_path.gsub!(key, "\#{#{value}}")
end
end
directory_list[short_path] = true unless directory_list[short_path]
end
end
unless settings['templates']['files'].nil?
settings['templates']['files'].each do | file |
file_from = "#{project_dir}/#{file}"
file_to = "#{generator_dir}/templates/#{file}"
FileUtils.rm_r(file_to) if File.directory?(file_to)
FileUtils.rm(file_to) if File.exists?(file_to)
FileUtils.mkdir_p(File.dirname(file_to))
data = File.read(file_from)
if file =~ /.erb/
data.gsub!("<%", "<%%")
end
short_path = "#{file}"
settings['templates']['replacements'].each do | value |
value.each do |key, value|
short_path.gsub!(key, "\#{#{value}}")
data.gsub!(key, "<%=#{value}%>")
end
end
File.open(file_to, 'w') do |write_to|
write_to.write data
end
template_list[file] = short_path unless template_list[file]
end
end
end
File.open("#{generator_dir}/manifests/#{manifest}.rb" , 'w') do |file|
file.puts "class #{manifest_class}"
if replacement_list.empty?
file.puts " def self.populate_record(m)"
else
file.puts " def self.populate_record(m, rule_name ,rule_class)"
end
file.puts ""
file.puts " %W("
directory_list.sort{|a,b| a[0]<=>b[0]}.each do |value|
file.puts " #{value[0]}"
end
file.puts " ).each do |dirname|"
file.puts " m.directory dirname"
file.puts " end"
file.puts ""
file.puts " %W("
file_list.sort{|a,b| a[0]<=>b[0]}.each do |value|
file.puts " #{value[0]}"
end
file.puts " ).each do |filename|"
file.puts " m.file filename, filename"
file.puts " end"
file.puts ""
template_list.sort{|a,b| a[0]<=>b[0]}.each do |value|
file.puts " m.template \"#{value[0]}\", \"#{value[1]}\""
end
file.puts ""
file.puts " end"
file.puts "end"
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment