require 'rbconfig' require 'fileutils' require 'facet/fileutils/safe_ln' require 'facet/string/tabto' require 'facet/module/basename' require 'facet/module/attr_setter' require 'facet/filelist' # Base class for reap tasks. # # Here's an oh so simple example: # # class MyTask < Reap::Task # # register 'mytask' # # default_desc 'this is a custom reap task' # # attr_accessor :message # # def init # @message ||= master['default'] || 'None Found!' # end # # def run # puts @message # end # end # # The corresponding settings in the ProjectInfo file will then be: # # default: Default text, if any. # # myname: # TASK: mytask # message: Message text, if any. # module Reap @registry ||= {} # Hash of all task classes def self.registry ; @registry ; end # Hash of tasks available to this project def self.tasks unless @tasks @tasks = {} @registry.each { |name, klass| @tasks[name] = klass if klass.verify? } end @tasks end def self.register $PROJECT_INFO = ProjectInfo.new( $PROJECT_FILE ) #@registry ||= {} #ObjectSpace.each_object(Class) { |klass| # if klass < ::Reap::Task # if klass.verify # @registry[klass.basename.downcase] = klass # end # end #} end # def self.initialize # @tasks ||= {} # registry.each do |name, klass| # @tasks[name] = klass.new # end # end class Task include ::Config include ::FileUtils RUBY = CONFIG['ruby_install_name'] class << self def task_desc( text=nil, &block ) if text @task_desc = proc { text } elsif block_given? @task_desc = block else @task_desc.call end end def task_help( text=nil, &block ) if text @task_help = proc { text } elsif block_given? @task_help = block else @task_help.call end end #def task_desc ; '(no desciption given)' ; end def task_name ; basename.downcase ; end def section_required( val ) ; @section_required = val ;end def section_required? ; @section_required ; end def verify? if section_required? return $PROJECT_INFO.info.key?(task_name) end true end def inherited( base ) Reap.registry[base.task_name] = base end def master_attributes ; @master_attributes ||= [] ; end # Use this DSL method to define master task attributes. def attr_master( *names ) attr_accessor *names @master_attributes ||= [] @master_attributes |= names.collect { |n| n.to_s } end end # instance methods def task_name ; self.class.task_name ; end def task_desc ; self.class.task_desc ; end def section_required? ; self.class.section_required? ; end #def master ; ::ProjectInfo.info ; end def master ; @master ; end def section ; @section ; end # def initialize( *args ) @master = $PROJECT_INFO sect = @master[task_name] if sect.is_a?(Array) @master[task_name].each do |sec| set( sec ) init run end else set( sect || {} ) init run end end def set( sec ) @section = sec self.class.master_attributes.each do |k,v| send( "#{k}=", @master[k] ) end @section.each do |k,v| send( "#{k}=", v ) end end def init raise "not implemented for '#{task_name}' task" end def run raise "no action defined for task #{task_name}" end # task support methods def sh( arg ) puts arg system arg unless $PRETEND end end #class Task end #module Reap ## # Convenience methods for built-in rake tasks ## # module RakeTask # extend self # # def gem_package_task(*args,&blk) # ::Rake::GemPackageTask.new(*args,&blk) # end # # def package_task(*args,&blk) # ::Rake::PackageTask.new(*args,&blk) # end # # def test_task(*args,&blk) # ::Rake::TestTask.new(*args,&blk) # end # # def rdoc_task(*args,&blk) # ::Rake::RDocTask.new(*args,&blk) # end # # end