aslakhellesoy-cucumber 0.3.101.2 → 0.3.102

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,8 +1,10 @@
1
- == (In Git)
1
+ == 2009-09-22
2
2
 
3
3
  This release has some changes in the Rails support, so make sure you run "script/generate cucumber" after you upgrade.
4
+ Other noteworthy new features are improved Hook, tags and Transform support, and as always - several smaler bug fixes.
4
5
 
5
6
  === New Features
7
+ * Added new internal API for Regexp and groups, allowing other programming languages to leverage native regexps. (Aslak Hellesøy)
6
8
  * New @allow_rescue tag for Rails scenarios. Causes exceptions raised in actions to be caught by rails and not bubble up to Cucumber (Aslak Hellesøy)
7
9
  * Negative tags can now be used in hooks, just like the command line's --tags option: Before('~@yarr') - will run for all scenarios that *don't* have the @yarr tag. (Aslak Hellesøy)
8
10
  * Transform has current "World" scope (Larry Diehl)
@@ -10,6 +12,9 @@ This release has some changes in the Rails support, so make sure you run "script
10
12
  * Execute "After" hooks in reverse order of declaration for better behavior with dependent blocks and to mimic the behavior of at_exit (David Waite)
11
13
 
12
14
  === Bugfixes
15
+ * features/support/env.rb runs commands twice (bugfix cuts total time by almost 50% w00t) (#452 Jim Meyer)
16
+ * Problems adding custom formatters to features/support. (features/support is added to $LOAD_PATH) (#449 Aslak Hellesøy)
17
+ * Some options set in cucumber.yml profiles are ignored (#446 Leonard CHIN)
13
18
  * Missing step_definition snippets not properly displayed (#433 Aslak Hellesøy)
14
19
  * rspec-rails, :lib => false (#447 David Chelimsky)
15
20
  * Cucumber with Spork breaks on OS X Snow Leopard (#431 David Chelimsky)
@@ -385,6 +385,7 @@ lib/cucumber/rails/test_unit.rb
385
385
  lib/cucumber/rails/world.rb
386
386
  lib/cucumber/rake/task.rb
387
387
  lib/cucumber/rb_support/rb_dsl.rb
388
+ lib/cucumber/rb_support/rb_group.rb
388
389
  lib/cucumber/rb_support/rb_hook.rb
389
390
  lib/cucumber/rb_support/rb_language.rb
390
391
  lib/cucumber/rb_support/rb_step_definition.rb
@@ -8,4 +8,39 @@ Feature: Custom Formatter
8
8
  | 1 | 1 | 1 | 1 | 1 | 2 | 1 | 2 | 1 | 2 | 1 |
9
9
 
10
10
  """
11
-
11
+
12
+ Scenario: my own formatter
13
+ Given a standard Cucumber project directory structure
14
+ And a file named "features/f.feature" with:
15
+ """
16
+ Feature: i'll use my own
17
+ Scenario: just print me
18
+ Given this step works
19
+ """
20
+ And a file named "features/step_definitions/steps.rb" with:
21
+ """
22
+ Given /^this step works$/ do
23
+ end
24
+ """
25
+ And a file named "features/support/ze/formator.rb" with:
26
+ """
27
+ module Ze
28
+ class Formator < Cucumber::Ast::Visitor
29
+ def initialize(step_mother, io, options)
30
+ super(step_mother)
31
+ @io = io
32
+ end
33
+
34
+ def visit_scenario_name(keyword, name, file_colon_line, source_indent)
35
+ @io.puts "$ #{name.upcase}"
36
+ end
37
+ end
38
+ end
39
+ """
40
+ When I run cucumber features/f.feature --format Ze::Formator
41
+ Then STDERR should be empty
42
+ Then it should pass with
43
+ """
44
+ $ JUST PRINT ME
45
+
46
+ """
@@ -61,6 +61,7 @@ class CucumberWorld
61
61
  def create_file(file_name, file_content)
62
62
  file_content.gsub!("CUCUMBER_LIB", "'#{cucumber_lib_dir}'") # Some files, such as Rakefiles need to use the lib dir
63
63
  in_current_dir do
64
+ FileUtils.mkdir_p(File.dirname(file_name)) unless File.directory?(File.dirname(file_name))
64
65
  File.open(file_name, 'w') { |f| f << file_content }
65
66
  end
66
67
  end
@@ -83,7 +84,6 @@ class CucumberWorld
83
84
  stderr_file = Tempfile.new('cucumber')
84
85
  stderr_file.close
85
86
  in_current_dir do
86
- @last_stdout = `#{command} 2> #{stderr_file.path}`
87
87
  mode = Cucumber::RUBY_1_9 ? {:external_encoding=>"UTF-8"} : 'r'
88
88
  IO.popen("#{command} 2> #{stderr_file.path}", mode) do |io|
89
89
  @last_stdout = io.read
@@ -47,6 +47,7 @@ module Cucumber
47
47
  step_mother.after_configuration(configuration)
48
48
  features = step_mother.load_plain_text_features(configuration.feature_files)
49
49
  step_mother.load_code_files(configuration.step_defs_to_load)
50
+
50
51
  enable_diffing
51
52
 
52
53
  visitor = configuration.build_formatter_broadcaster(step_mother)
@@ -319,6 +319,8 @@ module Cucumber
319
319
  def reverse_merge(other_options)
320
320
  @options = other_options.options.merge(@options)
321
321
  @options[:require] += other_options[:require]
322
+ @options[:excludes] += other_options[:excludes]
323
+ @options[:name_regexps] += other_options[:name_regexps]
322
324
  @options[:tag_names].merge! other_options[:tag_names]
323
325
  @options[:env_vars] = other_options[:env_vars].merge(@options[:env_vars])
324
326
  if @options[:paths].empty?
@@ -1,7 +1,9 @@
1
1
  module Cucumber
2
2
  module Constantize #:nodoc:
3
3
  def constantize(camel_cased_word)
4
+ try = 0
4
5
  begin
6
+ try += 1
5
7
  names = camel_cased_word.split('::')
6
8
  names.shift if names.empty? || names.first.empty?
7
9
 
@@ -10,9 +12,13 @@ module Cucumber
10
12
  constant = constant.const_defined?(name) ? constant.const_get(name) : constant.const_missing(name)
11
13
  end
12
14
  constant
13
- rescue NameError
15
+ rescue NameError => e
14
16
  require underscore(camel_cased_word)
15
- retry
17
+ if try < 2
18
+ retry
19
+ else
20
+ raise e
21
+ end
16
22
  end
17
23
  end
18
24
 
@@ -7,34 +7,24 @@ class String #:nodoc:
7
7
  end
8
8
  end
9
9
 
10
- # re.source.gsub(/\([^)]*\)/, '$var')
11
- # Cumulative #sub
12
- def subs(re, *args)
13
- args.inject(self) do |s,arg|
14
- s.sub(re, arg)
15
- end
16
- end
17
-
18
- # TODO: Use subs instead...
19
- def gzub(regexp, format=nil, &proc)
20
- md = match(regexp)
21
- raise "#{self.inspect} doesn't match #{regexp.inspect}" if md.nil?
22
-
10
+ # TODO: Move to StepMatch
11
+ # +groups+ is an array of 2-element arrays, where
12
+ # the 1st element is the value of a regexp match group,
13
+ # and the 2nd element is its start index.
14
+ def gzub(groups, format=nil, &proc)
23
15
  s = dup
24
- pos = 0
25
- md.captures.each_with_index do |m, n|
16
+ offset = 0
17
+ groups.each do |group|
26
18
  replacement = if block_given?
27
- proc.call(m)
19
+ proc.call(group.val)
28
20
  elsif Proc === format
29
- format.call(m)
21
+ format.call(group.val)
30
22
  else
31
- format % m
23
+ format % group.val
32
24
  end
33
25
 
34
- if md.offset(n+1)[0]
35
- s[md.offset(n+1)[0] + pos, m.length] = replacement
36
- pos += replacement.length - m.length
37
- end
26
+ s[group.start + offset, group.val.length] = replacement
27
+ offset += replacement.length - group.val.length
38
28
  end
39
29
  s
40
30
  end
@@ -4,36 +4,13 @@ module Cucumber
4
4
  module LanguageSupport
5
5
  module StepDefinitionMethods
6
6
  def step_match(name_to_match, name_to_report)
7
- if(match = regexp.match(name_to_match))
8
- StepMatch.new(self, name_to_match, name_to_report, match.captures)
7
+ if(groups = groups(name_to_match))
8
+ StepMatch.new(self, name_to_match, name_to_report, groups)
9
9
  else
10
10
  nil
11
11
  end
12
12
  end
13
13
 
14
- # Formats the matched arguments of the associated Step. This method
15
- # is usually called from visitors, which render output.
16
- #
17
- # The +format+ can either be a String or a Proc.
18
- #
19
- # If it is a String it should be a format string according to
20
- # <tt>Kernel#sprinf</tt>, for example:
21
- #
22
- # '<span class="param">%s</span></tt>'
23
- #
24
- # If it is a Proc, it should take one argument and return the formatted
25
- # argument, for example:
26
- #
27
- # lambda { |param| "[#{param}]" }
28
- #
29
- def format_args(step_name, format)
30
- step_name.gzub(regexp, format)
31
- end
32
-
33
- def same_regexp?(regexp)
34
- self.regexp == regexp
35
- end
36
-
37
14
  def backtrace_line
38
15
  "#{file_colon_line}:in `#{regexp.inspect}'"
39
16
  end
@@ -0,0 +1,11 @@
1
+ module Cucumber
2
+ module RbSupport
3
+ class RbGroup
4
+ attr_reader :val, :start
5
+
6
+ def initialize(val, start)
7
+ @val, @start = val, start
8
+ end
9
+ end
10
+ end
11
+ end
@@ -1,6 +1,7 @@
1
1
  require 'cucumber/step_match'
2
2
  require 'cucumber/core_ext/string'
3
3
  require 'cucumber/core_ext/proc'
4
+ require 'cucumber/rb_support/rb_group'
4
5
 
5
6
  module Cucumber
6
7
  module RbSupport
@@ -25,13 +26,30 @@ module Cucumber
25
26
 
26
27
  attr_reader :proc, :regexp
27
28
 
28
- def initialize(rb_language, pattern, proc)
29
+ def initialize(rb_language, regexp, proc)
29
30
  raise MissingProc if proc.nil?
30
- if String === pattern
31
- p = pattern.gsub(/\$\w+/, '(.*)') # Replace $var with (.*)
32
- pattern = Regexp.new("^#{p}$")
31
+ if String === regexp
32
+ p = regexp.gsub(/\$\w+/, '(.*)') # Replace $var with (.*)
33
+ regexp = Regexp.new("^#{p}$")
34
+ end
35
+ @rb_language, @regexp, @proc = rb_language, regexp, proc
36
+ end
37
+
38
+ def ==(step_definition)
39
+ self.regexp == step_definition.regexp
40
+ end
41
+
42
+ def groups(step_name)
43
+ match = regexp.match(step_name)
44
+ if match
45
+ n = 0
46
+ match.captures.map do |val|
47
+ n += 1
48
+ RbGroup.new(val, match.offset(n)[0])
49
+ end
50
+ else
51
+ nil
33
52
  end
34
- @rb_language, @regexp, @proc = rb_language, pattern, proc
35
53
  end
36
54
 
37
55
  def invoke(args)
@@ -1,9 +1,13 @@
1
1
  module Cucumber
2
2
  class StepMatch #:nodoc:
3
- attr_reader :step_definition, :args
3
+ attr_reader :step_definition
4
4
 
5
- def initialize(step_definition, step_name, formatted_step_name, args)
6
- @step_definition, @step_name, @formatted_step_name, @args = step_definition, step_name, formatted_step_name, args
5
+ def initialize(step_definition, step_name, formatted_step_name, groups)
6
+ @step_definition, @step_name, @formatted_step_name, @groups = step_definition, step_name, formatted_step_name, groups
7
+ end
8
+
9
+ def args
10
+ @groups.map{|g| g.val}
7
11
  end
8
12
 
9
13
  def name
@@ -11,13 +15,28 @@ module Cucumber
11
15
  end
12
16
 
13
17
  def invoke(multiline_arg)
14
- all_args = @args.dup
18
+ all_args = args
15
19
  all_args << multiline_arg if multiline_arg
16
20
  @step_definition.invoke(all_args)
17
21
  end
18
22
 
23
+ # Formats the matched arguments of the associated Step. This method
24
+ # is usually called from visitors, which render output.
25
+ #
26
+ # The +format+ can either be a String or a Proc.
27
+ #
28
+ # If it is a String it should be a format string according to
29
+ # <tt>Kernel#sprinf</tt>, for example:
30
+ #
31
+ # '<span class="param">%s</span></tt>'
32
+ #
33
+ # If it is a Proc, it should take one argument and return the formatted
34
+ # argument, for example:
35
+ #
36
+ # lambda { |param| "[#{param}]" }
37
+ #
19
38
  def format_args(format = lambda{|a| a})
20
- @formatted_step_name || @step_definition.format_args(@step_name, format)
39
+ @formatted_step_name || @step_name.gzub(@groups, format)
21
40
  end
22
41
 
23
42
  def file_colon_line
@@ -249,7 +249,7 @@ module Cucumber
249
249
  # contract (API).
250
250
  def register_step_definition(step_definition)
251
251
  step_definitions.each do |already|
252
- raise Redundant.new(already, step_definition) if already.same_regexp?(step_definition.regexp)
252
+ raise Redundant.new(already, step_definition) if already == step_definition
253
253
  end
254
254
  step_definitions << step_definition
255
255
  step_definition
@@ -2,8 +2,8 @@ module Cucumber #:nodoc:
2
2
  class VERSION #:nodoc:
3
3
  MAJOR = 0
4
4
  MINOR = 3
5
- TINY = 101
6
- PATCH = 2 # Set to nil for official release
5
+ TINY = 102
6
+ PATCH = nil # Set to nil for official release
7
7
 
8
8
  STRING = [MAJOR, MINOR, TINY, PATCH].compact.join('.')
9
9
  end
@@ -1,19 +1,24 @@
1
1
  require File.dirname(__FILE__) + '/../../spec_helper'
2
- require File.dirname(__FILE__) + '/../../../lib/cucumber/core_ext/string'
2
+ require 'cucumber/core_ext/string'
3
+ require 'cucumber/rb_support/rb_group'
3
4
 
4
5
  describe String, "#gzub" do
6
+ def groups(a)
7
+ a.map{|c| Cucumber::RbSupport::RbGroup.new(c[0], c[1])}
8
+ end
9
+
5
10
  it "should format groups with format string" do
6
- "I ate 1 egg this morning".gzub(/I (\w+) (\d+) (\w+) this (\w+)/, "<span>%s</span>").should ==
11
+ "I ate 1 egg this morning".gzub(groups([['ate', 2], ['1', 6], ['egg', 8], ['morning', 17]]), "<span>%s</span>").should ==
7
12
  "I <span>ate</span> <span>1</span> <span>egg</span> this <span>morning</span>"
8
13
  end
9
14
 
10
15
  it "should format groups with format string when there are dupes" do
11
- "I bob 1 bo this bobs".gzub(/I (\w+) (\d+) (\w+) this (\w+)/, "<span>%s</span>").should ==
16
+ "I bob 1 bo this bobs".gzub(groups([['bob', 2], ['1', 6], ['bo', 8], ['bobs', 16]]), "<span>%s</span>").should ==
12
17
  "I <span>bob</span> <span>1</span> <span>bo</span> this <span>bobs</span>"
13
18
  end
14
19
 
15
20
  it "should format groups with block" do
16
- f = "I ate 1 egg this morning".gzub(/I (\w+) (\d+) (\w+) this (\w+)/) do |m|
21
+ f = "I ate 1 egg this morning".gzub(groups([['ate', 2], ['1', 6], ['egg', 8], ['morning', 17]])) do |m|
17
22
  "<span>#{m}</span>"
18
23
  end
19
24
  f.should == "I <span>ate</span> <span>1</span> <span>egg</span> this <span>morning</span>"
@@ -23,21 +28,14 @@ describe String, "#gzub" do
23
28
  proc = lambda do |m|
24
29
  "<span>#{m}</span>"
25
30
  end
26
- f = "I ate 1 egg this morning".gzub(/I (\w+) (\d+) (\w+) this (\w+)/, proc)
31
+ f = "I ate 1 egg this morning".gzub(groups([['ate', 2], ['1', 6], ['egg', 8], ['morning', 17]]), proc)
27
32
  f.should == "I <span>ate</span> <span>1</span> <span>egg</span> this <span>morning</span>"
28
33
  end
29
34
 
30
35
  it "should format groups with block with not all placeholders having a value" do
31
- f = "another member named Bob joins the group".gzub(/(a|another) (user|member) named ([^ ]+)( who is not logged in)?/) do |m|
36
+ f = "another member named Bob joins the group".gzub(groups([['another', 0], ['member', 8], ['Bob', 21]])) do |m|
32
37
  "<span>#{m}</span>"
33
38
  end
34
39
  f.should == "<span>another</span> <span>member</span> named <span>Bob</span> joins the group"
35
40
  end
36
-
37
- it "should format match groups in a textile table row" do
38
- f = "I ate 1 egg this morning".gzub(/I (\w+) (\d+) (\w+) this (\w+)/) do |m|
39
- "<span>#{m}</span>"
40
- end
41
- f.should == "I <span>ate</span> <span>1</span> <span>egg</span> this <span>morning</span>"
42
- end
43
41
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: aslakhellesoy-cucumber
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.101.2
4
+ version: 0.3.102
5
5
  platform: ruby
6
6
  authors:
7
7
  - "Aslak Helles\xC3\xB8y"
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-09-21 00:00:00 -07:00
12
+ date: 2009-09-22 00:00:00 -07:00
13
13
  default_executable: cucumber
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -463,6 +463,7 @@ files:
463
463
  - lib/cucumber/rails/world.rb
464
464
  - lib/cucumber/rake/task.rb
465
465
  - lib/cucumber/rb_support/rb_dsl.rb
466
+ - lib/cucumber/rb_support/rb_group.rb
466
467
  - lib/cucumber/rb_support/rb_hook.rb
467
468
  - lib/cucumber/rb_support/rb_language.rb
468
469
  - lib/cucumber/rb_support/rb_step_definition.rb