# Author:: Nicolas Pouillard . # Copyright:: Copyright (c) 2005 Nicolas Pouillard. All rights reserved. # License:: GNU General Public License (GPL). # Revision:: $Id: runner.rb 221 2005-05-09 12:40:57Z ertai $ module Commands module Runners class Runner abstract include Hookable include Hooker # # Hooks declaration # hook_declare :display_command hook_declare :data hook_declare :before_open hook_declare :before_chdir hook_declare :before_exec hook_declare :exec # # Construction methods. # def initialize @command_data_factory = Datas::Factory.new hooker_subscribe self # hooker_subscribe VerboseHooker.new end # # Methods. # def run ( aCommand ) unless aCommand.is_a? Commands::Command raise ArgumentError, 'Need a Runner::Command' end hook_trigger :display_command, aCommand data = @command_data_factory.create data.input = aCommand.input data.output = aCommand.output data.error = aCommand.error hook_trigger :data, aCommand, data run_impl(aCommand, data) data end def run_impl ( aCommand, data ) hook_trigger :before_open, data STDIN.reopen(data.input.to_io) unless data.input.nil? STDOUT.reopen(data.output.to_io) unless data.output.nil? STDERR.reopen(data.error.to_io) unless data.error.nil? hook_trigger :before_chdir, data Dir.chdir(aCommand.dir) unless aCommand.dir.nil? hook_trigger :before_exec, aCommand, data hook_trigger :exec, aCommand, data end class VerboseHooker include Hooker def log ( m, *a ) STDERR.puts STDERR.puts "#{m}: #{a.inspect}" end hook_default_method :log end # class VerboseHooker end # class Runner if $0 == __FILE__ require 'test/unit' class RunnerTest < Test::Unit::TestCase def test_abstract assert_raise(TypeError) { Runner.new } end end # class RunnerTest end end # module Runners end # module Commands