changelog shortlog tags changeset manifest revisions annotate raw

vendor/plugins/rspec/lib/spec/story/step.rb

changeset 15: 64acf98d15f4
author: moriq@moriq.com
date: Mon Mar 10 10:12:58 2008 +0900 (16 years ago)
permissions: -rw-r--r--
description: add plugins rspec
1module 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(string_or_regexp)
43 if String === string_or_regexp
44 expression = string_or_regexp.dup
45 expression.gsub! '(', '\('
46 expression.gsub! ')', '\)'
47 elsif Regexp === string_or_regexp
48 expression = string_or_regexp.source
49 end
50 while expression =~ PARAM_PATTERN
51 expression.gsub!($1, "(.*?)")
52 end
53 @expression = Regexp.new("^#{expression}$")
54 end
55
56 end
57 end
58end