]> git.openstreetmap.org Git - rails.git/blob - vendor/gems/rspec-1.1.2/lib/spec/story/step.rb
added RSpec and RSpec on Rails
[rails.git] / vendor / gems / rspec-1.1.2 / lib / spec / story / step.rb
1 module Spec
2   module Story
3     class Step
4       PARAM_PATTERN = /(\$\w*)/
5       PARAM_OR_GROUP_PATTERN = /(\$\w*)|\(.*?\)/
6       
7       attr_reader :name
8       def initialize(name, &block)
9         @name = name
10         assign_expression(name)
11         init_module(name, &block)
12       end
13
14       def perform(instance, *args)
15         instance.extend(@mod)
16         instance.__send__(sanitize(@name), *args)
17       end
18
19       def init_module(name, &block)
20         sanitized_name = sanitize(name)
21         @mod = Module.new do
22           define_method(sanitized_name, &block)
23         end
24       end
25       
26       def sanitize(a_string_or_regexp)
27         return a_string_or_regexp.source if Regexp == a_string_or_regexp
28         a_string_or_regexp.to_s
29       end
30       
31
32       def matches?(name)
33         !(matches = name.match(@expression)).nil?
34       end
35             
36       def parse_args(name)
37         name.match(@expression)[1..-1]
38       end
39
40       private
41       
42         def assign_expression(name)
43           expression = name.dup
44           if String === expression
45             expression.gsub! '(', '\('
46             expression.gsub! ')', '\)'
47             while expression =~ PARAM_PATTERN
48               expression.gsub!($1, "(.*?)")
49             end
50           end
51           @expression = Regexp.new("^#{expression}$")
52         end
53
54     end
55   end
56 end