require 'erb' module Methadone # Stuff to implement methadone's CLI app. These # stuff isn't generally for your use and it's not # included when you require 'methadone' module CLI # Checks that the basedir can be used, either by # not existing, or by existing and force is true. # In that case, we clean it out entirely # # +basedir+:: base directory where the user wants to create a new project # +force+:: if true, and +basedir+ exists, delete it before proceeding # # This will exit the app if the dir exists and force is false def check_and_prepare_basedir!(basedir,force) if File.exists? basedir if force rm_rf basedir, :verbose => true, :secure => true else exit_now! 1,"error: #{basedir} exists, use --force to override" end end mkdir_p basedir end # Add content to a file # # +file+:: path to the file # +lines+:: Array of String representing the lines to add # +options+:: Hash of options: # :before:: A regexp that will appear right after the new content. i.e. # this is where to insert said content. def add_to_file(file,lines,options = {}) new_lines = [] found_line = false File.open(file).readlines.each do |line| line.chomp! if options[:before] && options[:before] === line found_line = true new_lines += lines end new_lines << line end raise "No line matched #{options[:before]}" if options[:before] && !found_line new_lines += lines unless options[:before] File.open(file,'w') do |fp| new_lines.each { |line| fp.puts line } end end # Copies a file, running it through ERB # # +relative_path+:: path to the file, relative to the project root, minus the .erb extension # You should use forward slashes to separate paths; this method # will handle making the ultimate path OS independent. # +options+:: Options to affect how the copy is done: # :from:: The name of the profile from which to find the file, "full" by default # :as:: The name the file should get if not the one in relative_path # :executable:: true if this file should be set executable # :binding:: the binding to use for the template def copy_file(relative_path,options = {}) options[:from] ||= :full relative_path = File.join(relative_path.split(/\//)) template_path = File.join(template_dir(options[:from]),relative_path + ".erb") template = ERB.new(File.open(template_path).readlines.join('')) relative_path_parts = File.split(relative_path) relative_path_parts[-1] = options[:as] if options[:as] erb_binding = options[:binding] or binding File.open(File.join(relative_path_parts),'w') do |file| file.puts template.result(erb_binding) file.chmod(0755) if options[:executable] end end # Get the location of the templates for profile "from" def template_dir(from) File.join(File.dirname(__FILE__),'..','..','templates',from.to_s) end def template_dirs_in(profile) template_dir = template_dir(:full) Dir["#{template_dir}/**/*"].select { |x| File.directory? x }.map { |dir| dir.gsub(/^#{template_dir}\//,'') } end end end