Ryan Leavengood said:
>
> Another possible issue is the fact that there is no equivalent to Java
> annotations, though I've done some prototyping and figured out a way to
> fairly easily have the equivalent in Ruby, at least for methods.

I see there has been quite a few additional discussions of this. I decided
to code up a more thorough prototype of how Java method annotations could
be simulated in Ruby:

class Class
  attr_reader :configs, :groups, :test_methods
  def config(hash)
    @config_method = true
    @temp_configs = []
    hash.each do |key, value|
      if value
        @temp_configs << key
      end
    end
  end

  def test(hash)
    @test_method = true
    @current_groups = hash[:groups]
  end

  def method_added(method)
    if @config_method or @test_method
      if @current_groups
        @groups||={}
        @current_groups.each do |group|
          (@groups[group]||=[]) << method
        end
      end
      if @config_method
        @configs||={}
        @temp_configs.each do |config|
          (@configs[config]||=[]) << method
        end
      end
      if @test_method
        (@test_methods||=[]) << method
      end
    end
    @config_method = false
    @current_groups = nil
    @temp_configs=nil
    @test_method = false
  end
end

class Test
  config :before_test => true
  def setup
    puts "Test#setup called"
  end

  config :after_test => true
  def teardown
    puts "Test#teardown called"
  end

  test :groups => ['one']
  def test_method1
    puts "Test#test_method1 called"
  end

  test :groups => ['two']
  def test_method2
    puts "Test#test_method2 called"
  end
end

class Test2
  config :before_test => true
  def setup
    puts "Test2#setup called"
  end

  config :after_test => true
  def teardown
    puts "Test2#teardown called"
  end

  test :groups => ['one']
  def test_method1
    puts "Test2#test_method1 called"
  end

  test :groups => ['two']
  def test_method2
    puts "Test2#test_method2 called"
  end
end

def run_tests(tests, test_instance, test_class)
  tests.each do |method|
    if test_class.configs[:before_test]
      test_class.configs[:before_test].each do |config_method|
        test_instance.__send__(config_method)
      end
    end
    test_instance.__send__(method)
    if test_class.configs[:after_test]
      test_class.configs[:after_test].each do |config_method|
        test_instance.__send__(config_method)
      end
    end
  end
end

if $0 == __FILE__
  %w{Test Test2}.each do |klass|
    klass = Module.const_get(klass)
    test = klass.new
    run_tests(klass.test_methods, test, klass)
    klass.groups.each do |group, list|
      puts "\nTesting group #{group}:"
      run_tests(list, test, klass)
    end
    puts
  end
end
__END__

Ryan