step_master 0.0.5 → 0.0.6

Sign up to get free protection for your applications and to get access to all the features.
@@ -4,5 +4,5 @@ $:.unshift(File.dirname(__FILE__)) unless
4
4
  require 'step_master/matcher'
5
5
 
6
6
  module StepMaster
7
- VERSION = '0.0.5'
7
+ VERSION = '0.0.6'
8
8
  end
@@ -23,7 +23,7 @@ module StepMaster
23
23
  STEP_REGEX = /^\s*(Given|Then|When)\s*\(?\s*\/\^?(.*)\/(\w*)\s*\)?\s*(?:do|\{)\s*(\|[^\|]+\|)?/.freeze
24
24
  ARG_NAMES_REGEX = /\|(.*)\|/
25
25
  ARG_TEXT_REGEX = /\(.*?[^\\]\)[\?\+\*]?/
26
- NON_CAPTURE_REGEX = /\(\?\:/
26
+ NON_CAPTURE_REGEX = /^\(\?\:/
27
27
  CHUNK_REGEX = /\S+|\s\??/
28
28
 
29
29
  attr_reader :match_table
@@ -52,25 +52,21 @@ module StepMaster
52
52
  args = $4
53
53
 
54
54
  arg_names = (args =~ ARG_NAMES_REGEX) ? $1.split(/\s*,\s*/) : []
55
- arg_regexs = regex.chomp("$").scan(ARG_TEXT_REGEX)
55
+ arg_regexs = extract_captures(regex)
56
56
 
57
57
  arg_objects = arg_regexs.collect do |x|
58
58
  is_non_capture = (x =~ NON_CAPTURE_REGEX) != nil
59
59
  StepVariable.new(x, regex_options, (is_non_capture) ? nil : arg_names.shift)
60
60
  end
61
61
 
62
-
63
- elements = if arg_regexs.length > 0
64
- regex.split(Regexp.union(arg_regexs.collect { |x|
65
- Regexp.new(Regexp.escape(x))
66
- })).collect { |x|
62
+ if arg_regexs.length > 0
63
+ regex.split(Regexp.union(arg_regexs.collect { |x| Regexp.new(Regexp.escape(x)) })).collect { |x|
67
64
  x.scan(CHUNK_REGEX).collect { |i| StepItem.new(i, regex_options) }
68
- }.zip(arg_objects).flatten.compact.unshift(StepItem.new(" ", regex_options)).unshift(StepItem.new(step_type, regex_options))
65
+ }.+(Array.new(5)).zip(arg_objects).flatten.compact.unshift(StepItem.new(" ", regex_options)).unshift(StepItem.new(step_type, regex_options))
69
66
  else
70
67
  regex.scan(CHUNK_REGEX).unshift(" ").unshift(step_type).collect { |i| StepItem.new(i, regex_options) }
71
- end
72
-
73
- elements.inject(@match_table) { |parent, i| parent[i] ||= Possible.new }.terminal!(value, options)
68
+ end.inject(@match_table) { |parent, i| parent[i] ||= Possible.new }.terminal!(value, options)
69
+
74
70
  end
75
71
 
76
72
  # Returns all possible outcomes of a string.
@@ -136,5 +132,39 @@ private
136
132
  end
137
133
  collection
138
134
  end
135
+
136
+ def extract_captures(t)
137
+ captures = []
138
+ index = 0
139
+ while true do
140
+ break unless index = t.index(/\(/, index)
141
+ index += 1
142
+ next if t[index-2,1] == "\\"
143
+
144
+ close, depth = index - 1, 1
145
+
146
+ begin
147
+ next_close = t.index(/[^\\]\)/, close)
148
+ next_open = t.index(/[^\\]\(/, close)
149
+
150
+ raise "Unmatched" unless next_close
151
+
152
+ if !next_open.nil? and next_open < next_close
153
+ close = next_open + 1
154
+ depth += 1
155
+ else
156
+ close = next_close + 1
157
+ depth -= 1
158
+ end
159
+
160
+ end while depth > 0
161
+
162
+ close += $&.length if t[close + 1..-1] =~ /^[\+\*\?]/
163
+ captures << t[index -1..close]
164
+
165
+ index = close
166
+ end
167
+ captures
168
+ end
139
169
  end
140
170
  end
@@ -118,7 +118,15 @@ module StepMaster
118
118
  it "should correctly match" do
119
119
  @matcher.is_match?("Given this").should be_true
120
120
  end
121
- end
121
+ end
122
+
123
+ describe "with a weird self-repeating step" do
124
+ it "should correctly match" do
125
+ @matcher << %q[Given /^I have a scheduled encounter ((?:\d+\s(?:weeks?|days?|minutes?|hours?|seconds|)(?:,\s?|\s?and\s?| ))+)(from now|ago)$/ do |time, from_now_or_ago| ]
126
+ @matcher.is_match?("Given I have a scheduled encounter 3 weeks from now").should be_true
127
+ end
128
+
129
+ end
122
130
  end
123
131
 
124
132
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: step_master
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.5
4
+ version: 0.0.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jim Holmes
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-10-20 00:00:00 -04:00
12
+ date: 2009-10-29 00:00:00 -04:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency