cuke-patterns 0.1.1 → 0.1.2

Sign up to get free protection for your applications and to get access to all the features.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.1
1
+ 0.1.2
@@ -5,7 +5,7 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{cuke-patterns}
8
- s.version = "0.1.1"
8
+ s.version = "0.1.2"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Brendan Baldwin"]
@@ -14,9 +14,6 @@ Then /^@x should evaluate to (.*)$/ do |expression|
14
14
  @x.should == eval(expression)
15
15
  end
16
16
 
17
- Pattern 'a', /a|an/
18
- Pattern 'an', /a|an/
19
-
20
17
  Pattern :class, /([A-Z][a-z]+)/ do |class_name|
21
18
  Object.const_get(class_name)
22
19
  end
@@ -28,3 +25,15 @@ end
28
25
  Pattern :list_of_integers, /(-?\d+(?: *(?:,|and) *-?\d+)*)/ do |list|
29
26
  list.split(/ *(?:,|and) */).map{|number| number.to_i}
30
27
  end
28
+
29
+ PatternGenerator do |key|
30
+ %w[a an].include?(key) and /a|an/
31
+ end
32
+
33
+ ## This PatternGenerator would enable automatic singularize/pluralize of ALL words
34
+ ## so you don't have to resort to regexp construction for steps just do deal with
35
+ ## pluralization related nonsense.
36
+ #
37
+ # PatternGenerator do |key|
38
+ # Regexp.new([Regexp.escape(key.singularize), Regexp.escape(key.pluralize)].join('|'))
39
+ # end
data/lib/cuke-patterns.rb CHANGED
@@ -6,6 +6,10 @@ module CukePatterns
6
6
  @rb_language.register_rb_cuke_pattern(name, regexp, &proc)
7
7
  end
8
8
 
9
+ def register_rb_cuke_pattern_generator(&proc)
10
+ @rb_language.register_rb_cuke_pattern_generator(&proc)
11
+ end
12
+
9
13
  end
10
14
 
11
15
  # For extending the Cucumber::RbSupport::RbLanguage class
@@ -33,7 +37,21 @@ module CukePatterns
33
37
  end
34
38
 
35
39
  def cuke_patterns
36
- @cuke_patterns ||= {}
40
+ @cuke_patterns ||= Hash.new {|hash, key| default_cuke_pattern(key)}
41
+ end
42
+
43
+ # Hook this method to automatically generate regexp matches for words in step
44
+ # definition strings that *don't* match to registered patterns.
45
+ def default_cuke_pattern(key)
46
+ default_cuke_pattern_generators.each do |generator|
47
+ regexp, proc = generator[key]
48
+ return [regexp, proc] if regexp
49
+ end
50
+ return nil
51
+ end
52
+
53
+ def default_cuke_pattern_generators
54
+ @default_cuke_pattern_generators ||= []
37
55
  end
38
56
 
39
57
  def register_rb_cuke_pattern(name, regexp, &conversion_proc)
@@ -51,6 +69,10 @@ module CukePatterns
51
69
  return cuke_patterns[name] = [regexp, conversion_proc]
52
70
  end
53
71
 
72
+ def register_rb_cuke_pattern_generator(&proc)
73
+ default_cuke_pattern_generators << proc
74
+ end
75
+
54
76
  def register_rb_step_definition_with_cuke_patterns(matcher, proc)
55
77
  return register_rb_step_definition_without_cuke_patterns(matcher, proc) unless matcher.is_a?(String)
56
78
  cuke_pattern_delayed_step_definition_registrations << [matcher, proc]
@@ -73,13 +95,13 @@ module CukePatterns
73
95
  # Split the string by non-alphanumeric, underscore or leading-colon characters
74
96
  matcher.scan(/(:?\w+)|([^:\w]+|:)/) do |candidate, non_candidate|
75
97
 
76
- if non_candidate or not cuke_patterns.include?(candidate)
98
+ regexp, conversion_proc = cuke_patterns[candidate] if candidate
99
+
100
+ if non_candidate or not regexp
77
101
  matcher_regexp << Regexp.escape(candidate || non_candidate)
78
102
  next
79
103
  end
80
104
 
81
- regexp, conversion_proc = cuke_patterns[candidate]
82
-
83
105
  pattern_capture_count = capture_count_for(regexp)
84
106
 
85
107
  proc = convert_cuke_pattern_proc_arguments(
@@ -89,7 +111,7 @@ module CukePatterns
89
111
  pattern_counter += 1 unless pattern_capture_count == 0
90
112
  capture_counter += pattern_capture_count
91
113
 
92
- matcher_regexp << regexp.to_s
114
+ matcher_regexp << "(?:#{regexp})"
93
115
 
94
116
  end
95
117
 
@@ -162,6 +184,11 @@ Cucumber::RbSupport::RbDsl.module_eval do
162
184
  def Pattern(name, regexp, &proc)
163
185
  Cucumber::RbSupport::RbDsl.register_rb_cuke_pattern(name, regexp, &proc)
164
186
  end
187
+
188
+ def PatternGenerator(&proc)
189
+ Cucumber::RbSupport::RbDsl.register_rb_cuke_pattern_generator(&proc)
190
+ end
191
+
165
192
  end
166
193
 
167
194
  Cucumber::RbSupport::RbLanguage.class_eval do
metadata CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
5
5
  segments:
6
6
  - 0
7
7
  - 1
8
- - 1
9
- version: 0.1.1
8
+ - 2
9
+ version: 0.1.2
10
10
  platform: ruby
11
11
  authors:
12
12
  - Brendan Baldwin