cucumber 0.3.95 → 0.3.96

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (55) hide show
  1. data/History.txt +21 -0
  2. data/Manifest.txt +9 -3
  3. data/examples/sinatra/features/support/env.rb +1 -3
  4. data/features/cucumber_cli.feature +1 -0
  5. data/features/drb_server_integration.feature +56 -3
  6. data/features/junit_formatter.feature +23 -12
  7. data/features/step_definitions/cucumber_steps.rb +13 -2
  8. data/features/support/env.rb +19 -3
  9. data/lib/cucumber/ast/feature_element.rb +1 -1
  10. data/lib/cucumber/ast/step.rb +1 -1
  11. data/lib/cucumber/ast/step_invocation.rb +3 -2
  12. data/lib/cucumber/cli/configuration.rb +9 -25
  13. data/lib/cucumber/cli/drb_client.rb +7 -3
  14. data/lib/cucumber/cli/language_help_formatter.rb +4 -4
  15. data/lib/cucumber/cli/main.rb +26 -46
  16. data/lib/cucumber/cli/options.rb +3 -0
  17. data/lib/cucumber/constantize.rb +28 -0
  18. data/lib/cucumber/feature_file.rb +3 -3
  19. data/lib/cucumber/formatter/junit.rb +13 -9
  20. data/lib/cucumber/formatter/pretty.rb +2 -2
  21. data/lib/cucumber/language_support/hook_methods.rb +9 -0
  22. data/lib/cucumber/language_support/language_methods.rb +47 -0
  23. data/lib/cucumber/language_support/step_definition_methods.rb +44 -0
  24. data/lib/cucumber/parser/natural_language.rb +72 -0
  25. data/lib/cucumber/rb_support/rb_dsl.rb +73 -0
  26. data/lib/cucumber/rb_support/rb_hook.rb +19 -0
  27. data/lib/cucumber/rb_support/rb_language.rb +129 -0
  28. data/lib/cucumber/rb_support/rb_step_definition.rb +56 -0
  29. data/lib/cucumber/step_match.rb +2 -2
  30. data/lib/cucumber/step_mother.rb +87 -206
  31. data/lib/cucumber/version.rb +1 -1
  32. data/lib/cucumber/webrat/element_locator.rb +7 -7
  33. data/lib/cucumber/world.rb +28 -8
  34. data/rails_generators/cucumber/templates/cucumber_environment.rb +2 -2
  35. data/rails_generators/cucumber/templates/spork_env.rb +0 -2
  36. data/rails_generators/cucumber/templates/webrat_steps.rb +17 -0
  37. data/spec/cucumber/ast/background_spec.rb +8 -5
  38. data/spec/cucumber/ast/feature_factory.rb +4 -5
  39. data/spec/cucumber/ast/feature_spec.rb +7 -1
  40. data/spec/cucumber/ast/scenario_outline_spec.rb +10 -6
  41. data/spec/cucumber/ast/scenario_spec.rb +8 -3
  42. data/spec/cucumber/ast/step_collection_spec.rb +2 -2
  43. data/spec/cucumber/cli/configuration_spec.rb +15 -0
  44. data/spec/cucumber/cli/drb_client_spec.rb +35 -1
  45. data/spec/cucumber/cli/main_spec.rb +5 -4
  46. data/spec/cucumber/cli/options_spec.rb +6 -0
  47. data/spec/cucumber/parser/feature_parser_spec.rb +6 -5
  48. data/spec/cucumber/parser/table_parser_spec.rb +1 -1
  49. data/spec/cucumber/step_definition_spec.rb +26 -25
  50. data/spec/cucumber/step_mother_spec.rb +46 -41
  51. data/spec/cucumber/world/pending_spec.rb +4 -5
  52. metadata +11 -5
  53. data/lib/cucumber/cli/rb_step_def_loader.rb +0 -14
  54. data/lib/cucumber/parser/i18n/language.rb +0 -87
  55. data/lib/cucumber/step_definition.rb +0 -122
@@ -1,3 +1,22 @@
1
+ == 0.3.96 2009-08-15
2
+
3
+ This release doesn't have any directly visible new features or bug fixes. But there are big
4
+ internal changes. This release has a new API for plugging in other programming languages.
5
+ You can read more about that here: http://groups.google.com/group/cukes/browse_thread/thread/b9db8bf1f3ec9708
6
+
7
+ This might break other tools that are using Cucumber's internal APIs. For example Spork broke and had to
8
+ be patched. Please upgrade to Spork 0.5.9 if you are using Spork.
9
+
10
+ === New Features
11
+ * Ability to preload natural language in Spork's prefork. Rerun script/generate cucumber --spork to see how. (Aslak Hellesøy)
12
+ * Ability to control which DRb port is used via the --port flag or by setting CUCUMBER_DRB environment variable. (Chris Flipse)
13
+ * Upgrade Rails generator to use webrat 0.5.0. (Aslak Hellesøy)
14
+ * Upgrade Sinatra example to work with rack-test 0.4.1 and webrat 0.5.0. (Aslak Hellesøy)
15
+
16
+ === Changed Features
17
+ * --strict will cause an exit code 1 for missing and pending (used to be for missing only). (Mads Buus)
18
+ * junit formatter doesn't report pending steps unless --strict is used. (Mads Buus)
19
+
1
20
  == 0.3.95 2009-08-13
2
21
 
3
22
  This release improves Webrat support for table-like HTML markup. Now you can easily turn the HTML
@@ -15,6 +34,8 @@ This release also fixes several bugs related to --drb (Spork) and profiles (cucu
15
34
  * Resolved infinite loop problem when --drb was defined in a profile. (#408 Ben Mabey)
16
35
 
17
36
  === New Features
37
+ * Cucumber::World#table has been overloaded to work with 2D Array in addition to a table String to be parsed.
38
+ * New When /^I fill in the following:$/ step definition for Webrat. Useful for filling out a form with a Table. (Aslak Hellesøy)
18
39
  * The object returned by element_at (Webrat::Element) has a #to_table that works for table, dl, ol and ul. (Aslak Hellesøy)
19
40
  * An explanation of why failures are ok is printed when --wip is used. (Aslak Hellesøy)
20
41
  * Added cucumber alias for cucumber:ok in Rails Rake tasks. (Aslak Hellesøy)
@@ -321,7 +321,7 @@ lib/cucumber/cli/language_help_formatter.rb
321
321
  lib/cucumber/cli/main.rb
322
322
  lib/cucumber/cli/options.rb
323
323
  lib/cucumber/cli/profile_loader.rb
324
- lib/cucumber/cli/rb_step_def_loader.rb
324
+ lib/cucumber/constantize.rb
325
325
  lib/cucumber/core_ext/exception.rb
326
326
  lib/cucumber/core_ext/instance_exec.rb
327
327
  lib/cucumber/core_ext/proc.rb
@@ -346,12 +346,15 @@ lib/cucumber/formatter/tag_cloud.rb
346
346
  lib/cucumber/formatter/unicode.rb
347
347
  lib/cucumber/formatter/usage.rb
348
348
  lib/cucumber/formatters/unicode.rb
349
+ lib/cucumber/language_support/hook_methods.rb
350
+ lib/cucumber/language_support/language_methods.rb
351
+ lib/cucumber/language_support/step_definition_methods.rb
349
352
  lib/cucumber/languages.yml
350
353
  lib/cucumber/parser.rb
351
354
  lib/cucumber/parser/feature.rb
352
355
  lib/cucumber/parser/feature.tt
353
356
  lib/cucumber/parser/i18n.tt
354
- lib/cucumber/parser/i18n/language.rb
357
+ lib/cucumber/parser/natural_language.rb
355
358
  lib/cucumber/parser/table.rb
356
359
  lib/cucumber/parser/table.tt
357
360
  lib/cucumber/parser/treetop_ext.rb
@@ -359,8 +362,11 @@ lib/cucumber/platform.rb
359
362
  lib/cucumber/rails/rspec.rb
360
363
  lib/cucumber/rails/world.rb
361
364
  lib/cucumber/rake/task.rb
365
+ lib/cucumber/rb_support/rb_dsl.rb
366
+ lib/cucumber/rb_support/rb_hook.rb
367
+ lib/cucumber/rb_support/rb_language.rb
368
+ lib/cucumber/rb_support/rb_step_definition.rb
362
369
  lib/cucumber/rspec_neuter.rb
363
- lib/cucumber/step_definition.rb
364
370
  lib/cucumber/step_match.rb
365
371
  lib/cucumber/step_mother.rb
366
372
  lib/cucumber/version.rb
@@ -1,11 +1,9 @@
1
1
  # See http://wiki.github.com/aslakhellesoy/cucumber/sinatra
2
2
  # for more details about Sinatra with Cucumber
3
3
 
4
- gem 'rack-test', '=0.3.0'
5
- gem 'aslakhellesoy-webrat', '=0.4.4.1'
4
+ gem 'rack-test', '=0.4.1'
6
5
  gem 'sinatra', '=0.9.4'
7
6
 
8
- # Sinatra
9
7
  app_file = File.join(File.dirname(__FILE__), *%w[.. .. app.rb])
10
8
  require app_file
11
9
  # Force the application name because polyglot breaks the auto-detection logic.
@@ -152,6 +152,7 @@ Feature: Cucumber command line
152
152
  Scenario: Run Norwegian
153
153
  Given I am in i18n/no
154
154
  When I run cucumber -q --language no features
155
+ Then STDERR should be empty
155
156
  Then it should pass with
156
157
  """
157
158
  # language: no
@@ -23,21 +23,33 @@ Feature: DRb Server Integration
23
23
  """
24
24
  And a file named "features/sample.feature" with:
25
25
  """
26
+ # language: en
26
27
  Feature: Sample
27
28
  Scenario: this is a test
28
29
  Given I am just testing stuff
29
30
  """
31
+ And a file named "features/essai.feature" with:
32
+ """
33
+ # language: fr
34
+ Fonction: Essai
35
+ Scenario: ceci est un test
36
+ Soit je teste
37
+ """
30
38
  And a file named "features/step_definitions/all_your_steps_are_belong_to_us.rb" with:
31
39
  """
32
40
  Given /^I am just testing stuff$/ do
33
41
  # no-op
34
42
  end
43
+
44
+ Soit /^je teste$/ do
45
+ # no-op
46
+ end
35
47
  """
36
48
 
37
49
  Scenario: Feature Passing with --drb flag
38
50
  Given I am running spork in the background
39
51
 
40
- When I run cucumber features/sample.feature --drb
52
+ When I run cucumber features --drb
41
53
  Then it should pass
42
54
  And STDERR should be empty
43
55
  And the output should contain
@@ -62,7 +74,7 @@ Feature: DRb Server Integration
62
74
  """
63
75
  And I am running spork in the background
64
76
 
65
- When I run cucumber features/sample.feature --drb
77
+ When I run cucumber features --drb
66
78
  Then it should fail
67
79
  And the output should contain
68
80
  """
@@ -82,7 +94,7 @@ Feature: DRb Server Integration
82
94
 
83
95
  Given I am not running a DRb server in the background
84
96
 
85
- When I run cucumber features/sample.feature --drb
97
+ When I run cucumber features --drb
86
98
  Then it should pass
87
99
  And STDERR should match
88
100
  """
@@ -118,3 +130,44 @@ Feature: DRb Server Integration
118
130
  I'm loading all the heavy stuff...
119
131
  I'm loading the stuff just for this run...
120
132
  """
133
+
134
+ Scenario: Feature Run with --drb specifying a non-standard port
135
+
136
+ Given I am running spork in the background on port 9000
137
+
138
+ When I run cucumber features --drb --port 9000
139
+ Then it should pass
140
+ And STDERR should be empty
141
+ And the output should contain
142
+ """
143
+ 1 step (1 passed)
144
+ """
145
+ And the output should contain
146
+ """
147
+ I'm loading the stuff just for this run...
148
+ """
149
+ And the output should not contain
150
+ """
151
+ I'm loading all the heavy stuff...
152
+ """
153
+
154
+ Scenario: Feature Run with $CUCUMBER_DRB environment variable
155
+
156
+ Given I have environment variable CUCUMBER_DRB set to "9000"
157
+ And I am running spork in the background on port 9000
158
+
159
+ When I run cucumber features/ --drb
160
+ Then it should pass
161
+ And STDERR should be empty
162
+ And the output should contain
163
+ """
164
+ 1 step (1 passed)
165
+ """
166
+ And the output should contain
167
+ """
168
+ I'm loading the stuff just for this run...
169
+ """
170
+ And the output should not contain
171
+ """
172
+ I'm loading all the heavy stuff...
173
+ """
@@ -27,15 +27,13 @@ Feature: JUnit output formatter
27
27
 
28
28
  Message:
29
29
  (RuntimeError)
30
- ./features/step_definitions/steps.rb:6:in `/a failing scenario/'
31
30
  features/one_passing_one_failing.feature:7:in `Given a failing scenario' </failure>
32
31
  </testcase>
33
32
  </testsuite>
34
33
 
35
34
  """
36
35
 
37
- @mri186
38
- Scenario: pending step
36
+ Scenario: pending steps are simply skipped
39
37
  When I run cucumber --format junit --out tmp/ features/pending.feature
40
38
  Then it should pass with
41
39
  """
@@ -44,17 +42,30 @@ Feature: JUnit output formatter
44
42
  And "examples/junit/tmp/TEST-pending.xml" with junit duration "0.009" should contain
45
43
  """
46
44
  <?xml version="1.0" encoding="UTF-8"?>
47
- <testsuite errors="0" failures="1" name="Pending step" tests="1" time="0.009">
48
- <testcase classname="Pending step.Pending" name="Pending" time="0.009">
45
+ <testsuite errors="0" failures="0" name="Pending step" tests="0" time="0.009">
46
+ </testsuite>
47
+
48
+ """
49
+
50
+ Scenario: pending step with strict option should fail
51
+ When I run cucumber --format junit --out tmp/ features/pending.feature --strict
52
+ Then it should fail with
53
+ """
54
+
55
+ """
56
+ And "examples/junit/tmp/TEST-pending.xml" with junit duration "0.000160" should contain
57
+ """
58
+ <?xml version="1.0" encoding="UTF-8"?>
59
+ <testsuite errors="0" failures="1" name="Pending step" tests="1" time="0.000160">
60
+ <testcase classname="Pending step.Pending" name="Pending" time="0.000160">
49
61
  <failure message="pending Pending" type="pending">
50
62
  Scenario: Pending
51
63
 
52
64
  TODO (Cucumber::Pending)
53
- ./features/step_definitions/steps.rb:10:in `/a pending step/'
54
65
  features/pending.feature:4:in `Given a pending step' </failure>
55
66
  </testcase>
56
67
  </testsuite>
57
-
68
+
58
69
  """
59
70
 
60
71
  Scenario: run all features
@@ -68,11 +79,11 @@ Feature: JUnit output formatter
68
79
 
69
80
  Scenario: show correct error message if no --out is passed
70
81
  When I run cucumber --format junit features
71
- Then STDERR should not match
72
- """
82
+ Then STDERR should not match
83
+ """
73
84
  can't convert .* into String \(TypeError\)
74
- """
85
+ """
75
86
  And STDERR should match
76
- """
87
+ """
77
88
  You \*must\* specify \-\-out DIR for the junit formatter
78
- """
89
+ """
@@ -35,12 +35,20 @@ Given /^I am running spork in the background$/ do
35
35
  run_spork_in_background
36
36
  end
37
37
 
38
+ Given /^I am running spork in the background on port (\d+)$/ do |port|
39
+ run_spork_in_background(port.to_i)
40
+ end
41
+
38
42
  Given /^I am not running (?:.*) in the background$/ do
39
43
  # no-op
40
44
  end
41
45
 
46
+ Given /^I have environment variable (\w+) set to "([^\"]*)"$/ do |variable, value|
47
+ set_env_var(variable, value)
48
+ end
49
+
42
50
  When /^I run cucumber (.*)$/ do |cucumber_opts|
43
- run "#{Cucumber::RUBY_BINARY} #{Cucumber::BINARY} --no-color #{cucumber_opts}"
51
+ run "#{Cucumber::RUBY_BINARY} -I #{Spork::LIBDIR} #{Cucumber::BINARY} --no-color #{cucumber_opts}"
44
52
  end
45
53
 
46
54
  When /^I run rake (.*)$/ do |rake_opts|
@@ -74,13 +82,15 @@ Then /^the output should be$/ do |text|
74
82
  last_stdout.should == text
75
83
  end
76
84
 
85
+
77
86
  Then /^"([^\"]*)" should contain$/ do |file, text|
78
87
  strip_duration(IO.read(file)).should == text
79
88
  end
80
89
 
81
90
  Then /^"([^\"]*)" with junit duration "([^\"]*)" should contain$/ do |actual_file, duration_replacement, text|
82
91
  actual = IO.read(actual_file)
83
- actual = replace_junit_duration(actual, duration_replacement)
92
+ actual = replace_junit_duration(actual, duration_replacement)
93
+ actual = strip_ruby186_extra_trace(actual)
84
94
  actual.should == text
85
95
  end
86
96
 
@@ -141,3 +151,4 @@ Then /^print output$/ do
141
151
  puts last_stdout
142
152
  end
143
153
 
154
+
@@ -6,7 +6,7 @@ require 'forwardable'
6
6
  begin
7
7
  require 'spork'
8
8
  rescue Gem::LoadError => ex
9
- gem 'spork', '>= 0.5.7' # Ensure correct spork version number to avoid false-negatives.
9
+ gem 'spork', '>= 0.5.9' # Ensure correct spork version number to avoid false-negatives.
10
10
  end
11
11
 
12
12
  class CucumberWorld
@@ -54,6 +54,10 @@ class CucumberWorld
54
54
  s.gsub(/\d+\.\d\d+/m, replacement)
55
55
  end
56
56
 
57
+ def strip_ruby186_extra_trace(s)
58
+ s.gsub(/^.*\.\/features\/step_definitions(.*)\n/, "")
59
+ end
60
+
57
61
  def create_file(file_name, file_content)
58
62
  file_content.gsub!("CUCUMBER_LIB", "'#{cucumber_lib_dir}'") # Some files, such as Rakefiles need to use the lib dir
59
63
  in_current_dir do
@@ -61,6 +65,12 @@ class CucumberWorld
61
65
  end
62
66
  end
63
67
 
68
+ def set_env_var(variable, value)
69
+ @original_env_vars ||= {}
70
+ @original_env_vars[variable] = ENV[variable]
71
+ ENV[variable] = value
72
+ end
73
+
64
74
  def background_jobs
65
75
  @background_jobs ||= []
66
76
  end
@@ -84,7 +94,7 @@ class CucumberWorld
84
94
  @last_stderr = IO.read(stderr_file.path)
85
95
  end
86
96
 
87
- def run_spork_in_background
97
+ def run_spork_in_background(port = nil)
88
98
  pid = fork
89
99
  in_current_dir do
90
100
  if pid
@@ -92,7 +102,8 @@ class CucumberWorld
92
102
  else
93
103
  # STDOUT.close
94
104
  # STDERR.close
95
- cmd = "#{Cucumber::RUBY_BINARY} -I #{Cucumber::LIBDIR} #{Spork::BINARY} cuc"
105
+ port_arg = port ? "-p #{port}" : ''
106
+ cmd = "#{Cucumber::RUBY_BINARY} -I #{Cucumber::LIBDIR} #{Spork::BINARY} cuc #{port_arg}"
96
107
  exec cmd
97
108
  end
98
109
  end
@@ -107,6 +118,10 @@ class CucumberWorld
107
118
  end
108
119
  end
109
120
 
121
+ def restore_original_env_vars
122
+ @original_env_vars.each { |variable, value| ENV[variable] = value } if @original_env_vars
123
+ end
124
+
110
125
  end
111
126
 
112
127
  World do
@@ -120,4 +135,5 @@ end
120
135
 
121
136
  After do
122
137
  terminate_background_jobs
138
+ restore_original_env_vars
123
139
  end
@@ -21,7 +21,7 @@ module Cucumber
21
21
  end
22
22
 
23
23
  def name_line_lengths
24
- if @name.empty?
24
+ if @name.strip.empty?
25
25
  [@keyword.jlength]
26
26
  else
27
27
  @name.split("\n").enum_for(:each_with_index).map do |line, line_number|
@@ -1,5 +1,5 @@
1
- require 'cucumber/step_definition'
2
1
  require 'cucumber/core_ext/string'
2
+ require 'cucumber/step_match'
3
3
 
4
4
  module Cucumber
5
5
  module Ast
@@ -1,3 +1,5 @@
1
+ require 'cucumber/step_match'
2
+
1
3
  module Cucumber
2
4
  module Ast
3
5
  class StepInvocation
@@ -33,8 +35,7 @@ module Cucumber
33
35
  unless @skip_invoke || options[:dry_run] || @exception || @step_collection.exception
34
36
  @skip_invoke = true
35
37
  begin
36
- step_mother.current_world.__cucumber_current_step = self if step_mother.current_world # Nil in Pure Java
37
- @step_match.invoke(step_mother.current_world, @multiline_arg)
38
+ @step_match.invoke(@multiline_arg)
38
39
  step_mother.after_step
39
40
  status!(:passed)
40
41
  rescue Pending => e
@@ -1,4 +1,5 @@
1
1
  require 'cucumber/cli/options'
2
+ require 'cucumber/constantize'
2
3
 
3
4
  module Cucumber
4
5
  module Cli
@@ -7,6 +8,8 @@ module Cucumber
7
8
  class ProfileNotFound < StandardError; end
8
9
 
9
10
  class Configuration
11
+ include Constantize
12
+
10
13
  attr_reader :options
11
14
 
12
15
  def initialize(out_stream = STDOUT, error_stream = STDERR)
@@ -50,6 +53,10 @@ module Cucumber
50
53
  @options[:drb]
51
54
  end
52
55
 
56
+ def drb_port
57
+ @options[:drb_port].to_i if @options[:drb_port]
58
+ end
59
+
53
60
  def build_formatter_broadcaster(step_mother)
54
61
  return Formatter::Pretty.new(step_mother, nil, @options) if @options[:autoformat]
55
62
  formatters = @options[:formats].map do |format_and_out|
@@ -98,6 +105,8 @@ module Cucumber
98
105
  env_files = sorted_files.select {|f| f =~ %r{/support/env\..*} }
99
106
  files = env_files + sorted_files.reject {|f| f =~ %r{/support/env\..*} }
100
107
  remove_excluded_files_from(files)
108
+ files.reject! {|f| !File.file?(f)}
109
+ files.reject! {|f| File.extname(f) == '.feature' }
101
110
  files.reject! {|f| f =~ %r{/support/env\..*} } if @options[:dry_run]
102
111
  files
103
112
  end
@@ -112,22 +121,6 @@ module Cucumber
112
121
  potential_feature_files
113
122
  end
114
123
 
115
- def constantize(camel_cased_word)
116
- begin
117
- names = camel_cased_word.split('::')
118
- names.shift if names.empty? || names.first.empty?
119
-
120
- constant = Object
121
- names.each do |name|
122
- constant = constant.const_defined?(name) ? constant.const_get(name) : constant.const_missing(name)
123
- end
124
- constant
125
- rescue NameError
126
- require underscore(camel_cased_word)
127
- retry
128
- end
129
- end
130
-
131
124
  private
132
125
 
133
126
  def paths
@@ -159,15 +152,6 @@ module Cucumber
159
152
  def require_dirs
160
153
  feature_dirs + Dir['vendor/{gems,plugins}/*/cucumber']
161
154
  end
162
-
163
- # Snagged from active_support
164
- def underscore(camel_cased_word)
165
- camel_cased_word.to_s.gsub(/::/, '/').
166
- gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2').
167
- gsub(/([a-z\d])([A-Z])/,'\1_\2').
168
- tr("-", "_").
169
- downcase
170
- end
171
155
 
172
156
  end
173
157