]> git.openstreetmap.org Git - rails.git/blob - vendor/gems/rspec-1.1.2/lib/spec/runner/heckle_runner.rb
Show whether a trace is public or private in the trace list, so that a user can easil...
[rails.git] / vendor / gems / rspec-1.1.2 / lib / spec / runner / heckle_runner.rb
1 begin
2   require 'rubygems'
3   require 'heckle'
4 rescue LoadError ; raise "You must gem install heckle to use --heckle" ; end
5
6 module Spec
7   module Runner
8     # Creates a new Heckler configured to heckle all methods in the classes
9     # whose name matches +filter+
10     class HeckleRunner
11       def initialize(filter, heckle_class=Heckler)
12         @filter = filter
13         @heckle_class = heckle_class
14       end
15       
16       # Runs all the example groups held by +rspec_options+ once for each of the
17       # methods in the matched classes.
18       def heckle_with
19         if @filter =~ /(.*)[#\.](.*)/
20           heckle_method($1, $2)
21         else
22           heckle_class_or_module(@filter)
23         end
24       end
25       
26       def heckle_method(class_name, method_name)
27         verify_constant(class_name)
28         heckle = @heckle_class.new(class_name, method_name, rspec_options)
29         heckle.validate
30       end
31       
32       def heckle_class_or_module(class_or_module_name)
33         verify_constant(class_or_module_name)
34         pattern = /^#{class_or_module_name}/
35         classes = []
36         ObjectSpace.each_object(Class) do |klass|
37           classes << klass if klass.name =~ pattern
38         end
39         
40         classes.each do |klass|
41           klass.instance_methods(false).each do |method_name|
42             heckle = @heckle_class.new(klass.name, method_name, rspec_options)
43             heckle.validate
44           end
45         end
46       end
47       
48       def verify_constant(name)
49         begin
50           # This is defined in Heckle
51           name.to_class
52         rescue
53           raise "Heckling failed - \"#{name}\" is not a known class or module"
54         end
55       end
56     end
57     
58     #Supports Heckle 1.2 and prior (earlier versions used Heckle::Base)
59     class Heckler < (Heckle.const_defined?(:Base) ? Heckle::Base : Heckle)
60       def initialize(klass_name, method_name, rspec_options)
61         super(klass_name, method_name)
62         @rspec_options = rspec_options
63       end
64
65       def tests_pass?
66         success = @rspec_options.run_examples
67         success
68       end
69
70     end
71   end
72 end