Class: Kicker::Recipes::Ruby

Inherits:
Object
  • Object
show all
Defined in:
lib/kicker/recipes/ruby.rb

Direct Known Subclasses

Rails

Class Attribute Summary collapse

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(files) ⇒ Ruby

:nodoc:



114
115
116
117
# File 'lib/kicker/recipes/ruby.rb', line 114

def initialize(files) #:nodoc:
  @files = files
  @tests = []
end

Class Attribute Details

.runner_binObject

Returns the ruby command to run the tests with. Eg: ‘ruby’ or ‘spec’.

Defaults to ‘ruby’ if test_type is ‘test’ and ‘spec’ if test_type is ‘spec’.



22
23
24
# File 'lib/kicker/recipes/ruby.rb', line 22

def runner_bin
  @runner_bin ||= test_type == 'test' ? 'ruby' : 'spec'
end

.test_cases_rootObject

Returns the root directory of where test cases will be looked up.

Defaults to the value of test_type. Eg: ‘test’ or ‘spec’.



32
33
34
# File 'lib/kicker/recipes/ruby.rb', line 32

def test_cases_root
  @test_cases_root ||= test_type
end

.test_optionsObject

Assigns extra options that are to be passed on to the runner_bin.

Ruby.test_options << '-I ./lib/foo'


41
42
43
# File 'lib/kicker/recipes/ruby.rb', line 41

def test_options
  @test_options ||= []
end

.test_typeObject

Returns the type of tests to run. Eg: ‘test’ or ‘spec’.

Defaults to ‘test’ if no ‘spec’ directory exists.



9
10
11
# File 'lib/kicker/recipes/ruby.rb', line 9

def test_type
  @test_type ||= File.exist?('spec') ? 'spec' : 'test'
end

Instance Attribute Details

#testsObject (readonly)

The list of collected tests.



112
113
114
# File 'lib/kicker/recipes/ruby.rb', line 112

def tests
  @tests
end

Class Method Details

.call(files) ⇒ Object

:nodoc:



105
106
107
108
109
# File 'lib/kicker/recipes/ruby.rb', line 105

def self.call(files) #:nodoc:
  handler = new(files)
  handler.handle!
  run_tests(handler.tests)
end

.reset!Object



45
46
47
48
49
50
# File 'lib/kicker/recipes/ruby.rb', line 45

def reset!
  @test_type = nil
  @runner_bin = nil
  @test_cases_root = nil
  @test_options = nil
end

.run_tests(tests) ⇒ Object

Runs the given tests, if there are any, with the method defined by test_type. If test_type is ‘test’ the run_with_test_runner method is used. The same applies when test_type is ‘spec’.



66
67
68
# File 'lib/kicker/recipes/ruby.rb', line 66

def run_tests(tests)
  send("run_with_#{test_type}_runner", tests) unless tests.empty?
end

.run_with_spec_runner(tests) ⇒ Object

Runs the given tests with ‘spec’ as RSpec tests.

If you want to adjust the logging, stdout and growl, override this, call spec_runner_command with the tests to get the command and call execute with the custom logging block.



96
97
98
99
100
101
102
# File 'lib/kicker/recipes/ruby.rb', line 96

def run_with_spec_runner(tests)
  execute(spec_runner_command(tests)) do |status|
    if status.after? && status.growl?
      status.output.split("\n").last
    end
  end
end

.run_with_test_runner(tests) ⇒ Object

Runs the given tests with ‘ruby’ as unit-test tests.

If you want to adjust the logging, stdout and growl, override this, call test_runner_command with the tests to get the command and call execute with the custom logging block.



79
80
81
82
83
84
85
# File 'lib/kicker/recipes/ruby.rb', line 79

def run_with_test_runner(tests)
  execute(test_runner_command(tests)) do |status|
    if status.after? && status.growl?
      status.output.split("\n").last
    end
  end
end

.runner_command(*parts) ⇒ Object



52
53
54
55
56
57
58
59
60
61
# File 'lib/kicker/recipes/ruby.rb', line 52

def runner_command(*parts)
  parts.map do |part|
    case part
    when Array
      part.empty? ? nil : part.join(' ')
    else
      part.to_s
    end
  end.compact.join(' ')
end

.spec_runner_command(tests) ⇒ Object



87
88
89
# File 'lib/kicker/recipes/ruby.rb', line 87

def spec_runner_command(tests)
  runner_command(runner_bin, test_options, tests)
end

.test_runner_command(tests) ⇒ Object



70
71
72
# File 'lib/kicker/recipes/ruby.rb', line 70

def test_runner_command(tests)
  runner_command(runner_bin, test_options, '-r', tests.join(' -r '), "-e ''")
end

Instance Method Details

#handle!Object

This method is called to collect tests. Override this if you’re subclassing and make sure to call super.



146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
# File 'lib/kicker/recipes/ruby.rb', line 146

def handle!
  @tests.concat(@files.take_and_map do |file|
    case file
    # Match any ruby test file
    when /^#{test_cases_root}\/.+_#{test_type}\.rb$/
      file
    
    # A file such as ./lib/namespace/foo.rb is mapped to:
    # * ./test/namespace/foo_test.rb
    # * ./test/foo_test.rb
    when /^lib\/(.+)\.rb$/
      if namespaced = test_file($1)
        namespaced
      elsif in_test_root = test_file(File.basename(file, '.rb'))
        in_test_root
      end
    end
  end)
end

#runner_binObject

A shortcut to Ruby.runner_bin.



125
126
127
# File 'lib/kicker/recipes/ruby.rb', line 125

def runner_bin
  self.class.runner_bin
end

#test_cases_rootObject

A shortcut to Ruby.test_cases_root.



130
131
132
# File 'lib/kicker/recipes/ruby.rb', line 130

def test_cases_root
  self.class.test_cases_root
end

#test_file(name) ⇒ Object

Returns the file for name if it exists.

test_file('foo') # => "test/foo_test.rb"
test_file('foo/bar') # => "test/foo/bar_test.rb"
test_file('does/not/exist') # => nil


139
140
141
142
# File 'lib/kicker/recipes/ruby.rb', line 139

def test_file(name)
  file = File.join(test_cases_root, "#{name}_#{test_type}.rb")
  file if File.exist?(file)
end

#test_typeObject

A shortcut to Ruby.test_type.



120
121
122
# File 'lib/kicker/recipes/ruby.rb', line 120

def test_type
  self.class.test_type
end