module RubiGen
module GeneratorTestHelper
# Runs the create command (like the command line does)
def run_generator(name, params, sources, options = {})
silence_generator do
build_generator(name, params, sources, options).command(:create).invoke!
end
end
# Instatiates the Generator
def build_generator(name, params, sources, options)
options.merge!(:collision => :force) # so no questions are prompted
if sources.is_a?(Symbol)
if sources == :app
RubiGen::Base.use_application_sources!
else
RubiGen::Base.use_component_sources!
end
else
RubiGen::Base.reset_sources
RubiGen::Base.append_sources(*sources) unless sources.blank?
end
# generator_options = options.find { |o| o.is_a?(Hash) } || {}
RubiGen::Base.instance(name, params, options)
end
# Silences the logger temporarily and returns the output as a String
def silence_generator
logger_original=RubiGen::Base.logger
myout=StringIO.new
RubiGen::Base.logger=RubiGen::SimpleLogger.new(myout)
# TODO redirect $stdout to myout
yield if block_given?
RubiGen::Base.logger=logger_original
# TODO fix $stdout again
myout.string
end
# asserts that the given file was generated.
# the contents of the file is passed to a block.
def assert_generated_file(path)
assert_file_exists(path)
File.open("#{APP_ROOT}/#{path}") do |f|
yield f.read if block_given?
end
end
# asserts that the given file exists
def assert_file_exists(path)
assert File.exists?("#{APP_ROOT}/#{path}"),"The file '#{path}' should exist"
end
# asserts that the given directory exists
def assert_directory_exists(path)
assert File.directory?("#{APP_ROOT}/#{path}"),"The directory '#{path}' should exist"
end
# asserts that the given class source file was generated.
# It takes a path without the .rb part and an optional super class.
# the contents of the class source file is passed to a block.
def assert_generated_class(path,parent=nil)
path=~/\/?(\d+_)?(\w+)$/
class_name=$2.camelize
assert_generated_file("#{path}.rb") do |body|
assert body=~/class #{class_name}#{parent.nil? ? '':" < #{parent}"}/,"the file '#{path}.rb' should be a class"
yield body if block_given?
end
end
# asserts that the given module source file was generated.
# It takes a path without the .rb part.
# the contents of the class source file is passed to a block.
def assert_generated_module(path)
path=~/\/?(\w+)$/
module_name=$1.camelize
assert_generated_file("#{path}.rb") do |body|
assert body=~/module #{module_name}/,"the file '#{path}.rb' should be a module"
yield body if block_given?
end
end
# asserts that the given unit test was generated.
# It takes a name or symbol without the test_ part and an optional super class.
# the contents of the class source file is passed to a block.
def assert_generated_test_for(name, parent="Test::Unit::TestCase")
assert_generated_class "test/test_#{name.to_s.underscore}",parent do |body|
yield body if block_given?
end
end
# asserts that the given methods are defined in the body.
# This does assume standard rails code conventions with regards to the source code.
# The body of each individual method is passed to a block.
def assert_has_method(body,*methods)
methods.each do |name|
assert body=~/^ def #{name.to_s}\n((\n| .*\n)*) end/,"should have method #{name.to_s}"
yield( name, $1 ) if block_given?
end
end
def app_root_files
Dir[APP_ROOT + '/**/*']
end
def rubygem_folders
%w[bin examples lib test]
end
def rubygems_setup
bare_setup
rubygem_folders.each do |folder|
Dir.mkdir("#{APP_ROOT}/#{folder}") unless File.exists?("#{APP_ROOT}/#{folder}")
end
end
def rubygems_teardown
bare_teardown
end
def bare_setup
FileUtils.mkdir_p(APP_ROOT)
end
def bare_teardown
FileUtils.rm_rf TMP_ROOT || APP_ROOT
end
end
end