cucumber 0.3.3 → 0.3.4

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 (75) hide show
  1. data/History.txt +44 -1
  2. data/Manifest.txt +11 -1
  3. data/bin/cucumber +11 -1
  4. data/examples/cs/Rakefile +1 -1
  5. data/examples/cs/features/addition.feature +5 -5
  6. data/examples/cs/features/step_definitons/calculator_steps.rb +2 -2
  7. data/examples/dos_line_endings/Rakefile +1 -1
  8. data/examples/i18n/ar/Rakefile +1 -1
  9. data/examples/i18n/bg/Rakefile +1 -1
  10. data/examples/i18n/cat/Rakefile +6 -0
  11. data/examples/i18n/cat/features/step_definitons/calculator_steps.rb +21 -0
  12. data/examples/i18n/cat/features/suma.feature +16 -0
  13. data/examples/i18n/cat/lib/calculadora.rb +16 -0
  14. data/examples/i18n/da/Rakefile +1 -1
  15. data/examples/i18n/de/Rakefile +1 -1
  16. data/examples/i18n/en-lol/Rakefile +1 -1
  17. data/examples/i18n/en/Rakefile +1 -1
  18. data/examples/i18n/es/Rakefile +1 -1
  19. data/examples/i18n/et/Rakefile +1 -1
  20. data/examples/i18n/fi/Rakefile +1 -1
  21. data/examples/i18n/fr/Rakefile +1 -1
  22. data/examples/i18n/he/Rakefile +1 -1
  23. data/examples/i18n/hu/Rakefile +1 -1
  24. data/examples/i18n/id/Rakefile +1 -1
  25. data/examples/i18n/it/Rakefile +1 -1
  26. data/examples/i18n/ja/Rakefile +1 -1
  27. data/examples/i18n/ko/Rakefile +1 -1
  28. data/examples/i18n/lt/Rakefile +1 -1
  29. data/examples/i18n/lt/features/addition.feature +2 -3
  30. data/examples/i18n/lv/Rakefile +1 -1
  31. data/examples/i18n/no/Rakefile +1 -1
  32. data/examples/i18n/pt/Rakefile +1 -1
  33. data/examples/i18n/pt/features/step_definitions/calculadora_steps.rb +3 -7
  34. data/examples/i18n/pt/features/support/env.rb +6 -0
  35. data/examples/i18n/ro/Rakefile +1 -1
  36. data/examples/i18n/ru/Rakefile +1 -1
  37. data/examples/i18n/se/Rakefile +1 -1
  38. data/examples/i18n/sk/Rakefile +1 -1
  39. data/examples/i18n/zh-CN/Rakefile +1 -1
  40. data/examples/i18n/zh-TW/Rakefile +1 -1
  41. data/examples/java/README.textile +2 -6
  42. data/examples/java/build.xml +26 -0
  43. data/examples/java/features/step_definitons/hello_steps.rb +0 -2
  44. data/examples/junit/features/one_passing_one_failing.feature +8 -0
  45. data/examples/junit/features/pending.feature +5 -0
  46. data/examples/junit/features/step_definitions/steps.rb +11 -0
  47. data/examples/selenium/Rakefile +1 -1
  48. data/examples/selenium_webrat/Rakefile +1 -1
  49. data/examples/sinatra/Rakefile +1 -1
  50. data/examples/test_unit/Rakefile +1 -1
  51. data/examples/tickets/Rakefile +3 -3
  52. data/examples/tickets/features/177/1.feature +29 -29
  53. data/examples/tickets/features/177/2.feature +20 -20
  54. data/examples/watir/Rakefile +1 -1
  55. data/features/junit_formatter.feature +59 -0
  56. data/features/rake_task.feature +4 -4
  57. data/features/step_definitions/cucumber_steps.rb +25 -2
  58. data/gem_tasks/features.rake +5 -1
  59. data/lib/cucumber.rb +2 -2
  60. data/lib/cucumber/cli/configuration.rb +28 -32
  61. data/lib/cucumber/cli/main.rb +0 -2
  62. data/lib/cucumber/core_ext/proc.rb +9 -13
  63. data/lib/cucumber/formatter.rb +1 -1
  64. data/lib/cucumber/formatter/html.rb +1 -0
  65. data/lib/cucumber/formatter/junit.rb +78 -0
  66. data/lib/cucumber/languages.yml +36 -4
  67. data/lib/cucumber/parser/feature.rb +10 -6
  68. data/lib/cucumber/parser/feature.tt +18 -14
  69. data/lib/cucumber/rake/task.rb +92 -24
  70. data/lib/cucumber/step_mother.rb +3 -0
  71. data/lib/cucumber/version.rb +1 -1
  72. data/rails_generators/cucumber/templates/cucumber.rake +2 -1
  73. data/spec/cucumber/cli/configuration_spec.rb +9 -18
  74. metadata +13 -3
  75. data/examples/java/Rakefile +0 -12
@@ -14,7 +14,7 @@ module Cucumber
14
14
  # To further configure the task, you can pass a block:
15
15
  #
16
16
  # Cucumber::Rake::Task.new do |t|
17
- # t.cucumber_opts = "--format progress"
17
+ # t.cucumber_opts = %w{--format progress}
18
18
  # end
19
19
  #
20
20
  # This task can also be configured to be run with RCov:
@@ -25,7 +25,62 @@ module Cucumber
25
25
  #
26
26
  # See the attributes for additional configuration possibilities.
27
27
  class Task
28
- LIB = File.expand_path(File.dirname(__FILE__) + '/../..') # :nodoc:
28
+ class InProcessCucumberRunner #:nodoc:
29
+ attr_reader :args
30
+
31
+ def initialize(libs, cucumber_opts, feature_files)
32
+ libs.reverse.each{|lib| $:.unshift(lib)}
33
+ @args = (
34
+ cucumber_opts +
35
+ feature_files
36
+ ).flatten.compact
37
+ end
38
+
39
+ def run
40
+ require 'cucumber/cli/main'
41
+ Cucumber::Cli::Main.execute(args)
42
+ end
43
+ end
44
+
45
+ class ForkedCucumberRunner #:nodoc:
46
+ attr_reader :args
47
+
48
+ def initialize(libs, cucumber_bin, cucumber_opts, feature_files)
49
+ @args = (
50
+ ['-I'] + load_path(libs) +
51
+ quoted_binary(cucumber_bin) +
52
+ cucumber_opts +
53
+ feature_files
54
+ ).flatten
55
+ end
56
+
57
+ def load_path(libs)
58
+ ['"%s"' % libs.join(File::PATH_SEPARATOR)]
59
+ end
60
+
61
+ def quoted_binary(cucumber_bin)
62
+ ['"%s"' % cucumber_bin]
63
+ end
64
+
65
+ def run
66
+ ruby(args.join(" ")) # ruby(*args) is broken on Windows
67
+ end
68
+ end
69
+
70
+ class RCovCucumberRunner < ForkedCucumberRunner #:nodoc:
71
+ def initialize(libs, cucumber_bin, cucumber_opts, feature_files, rcov_opts)
72
+ @args = (
73
+ ['-I'] + load_path(libs) +
74
+ ['-S', 'rcov'] + rcov_opts +
75
+ quoted_binary(cucumber_bin) +
76
+ ['--'] +
77
+ cucumber_opts +
78
+ feature_files
79
+ ).flatten
80
+ end
81
+ end
82
+
83
+ LIB = File.expand_path(File.dirname(__FILE__) + '/../..') # :nodoc:
29
84
 
30
85
  # TODO: remove depreated accessors for 0.4.0
31
86
  def self.deprecate_accessor(attribute) # :nodoc:
@@ -40,24 +95,45 @@ module Cucumber
40
95
 
41
96
  # Directories to add to the Ruby $LOAD_PATH
42
97
  attr_accessor :libs
98
+
43
99
  # Name of the cucumber binary to use for running features. Defaults to Cucumber::BINARY
44
100
  attr_accessor :binary
101
+
45
102
  # Array of paths to specific step definition files to use
46
103
  deprecate_accessor :step_list
104
+
47
105
  # File pattern for finding step definitions. Defaults to
48
106
  # 'features/**/*.rb'.
49
107
  deprecate_accessor :step_pattern
108
+
50
109
  # Array of paths to specific features to run.
51
110
  deprecate_accessor :feature_list
111
+
52
112
  # File pattern for finding features to run. Defaults to
53
113
  # 'features/**/*.feature'. Can be overridden by the FEATURE environment variable.
54
114
  deprecate_accessor :feature_pattern
115
+
55
116
  # Extra options to pass to the cucumber binary. Can be overridden by the CUCUMBER_OPTS environment variable.
117
+ # It's recommended to pass an Array, but if it's a String it will be #split by ' '.
56
118
  attr_accessor :cucumber_opts
57
- # Run cucumber with RCov?
119
+ def cucumber_opts=(opts) #:nodoc:
120
+ @cucumber_opts = String === opts ? opts.split(' ') : opts
121
+ end
122
+
123
+ # Run cucumber with RCov? Defaults to false. If you set this to
124
+ # true, +fork+ is implicit.
58
125
  attr_accessor :rcov
59
- # Extra options to pass to rcov
126
+
127
+ # Extra options to pass to rcov.
128
+ # It's recommended to pass an Array, but if it's a String it will be #split by ' '.
60
129
  attr_accessor :rcov_opts
130
+ def rcov_opts=(opts) #:nodoc:
131
+ @rcov_opts = String === opts ? opts.split(' ') : opts
132
+ end
133
+
134
+ # Whether or not to fork a new ruby interpreter. Defaults to false.
135
+ attr_accessor :fork
136
+
61
137
  # Define what profile to be used. When used with cucumber_opts it is simply appended to it. Will be ignored when CUCUMBER_OPTS is used.
62
138
  def profile=(profile)
63
139
  @profile = profile
@@ -69,13 +145,14 @@ module Cucumber
69
145
  end
70
146
  attr_reader :profile
71
147
 
72
- # Define a Rake
148
+ # Define Cucumber Rake task
73
149
  def initialize(task_name = "features", desc = "Run Features with Cucumber")
74
150
  @task_name, @desc = task_name, desc
75
151
  @libs = ['lib']
76
152
  @rcov_opts = %w{--rails --exclude osx\/objc,gems\/}
77
153
 
78
154
  yield self if block_given?
155
+ @fork = true if @rcov
79
156
 
80
157
  @feature_pattern = "features/**/*.feature" if feature_pattern.nil? && feature_list.nil?
81
158
  @step_pattern = "features/**/*.rb" if step_pattern.nil? && step_list.nil?
@@ -89,32 +166,23 @@ module Cucumber
89
166
  def define_task # :nodoc:
90
167
  desc @desc
91
168
  task @task_name do
92
- ruby(arguments_for_ruby_execution.join(" ")) # ruby(*args) is broken on Windows
169
+ runner.run
93
170
  end
94
171
  end
95
172
 
96
- def arguments_for_ruby_execution(task_args = nil) # :nodoc:
97
- lib_args = ['"%s"' % libs.join(File::PATH_SEPARATOR)]
98
- cucumber_bin = ['"%s"' % binary]
99
- cuc_opts = [(ENV['CUCUMBER_OPTS'] || cucumber_opts_with_profile)]
100
-
101
- step_files(task_args).each do |step_file|
102
- cuc_opts << '--require'
103
- cuc_opts << step_file
104
- end
105
-
106
- if rcov
107
- args = (['-I'] + lib_args + ['-S', 'rcov'] + rcov_opts +
108
- cucumber_bin + ['--'] + cuc_opts + feature_files(task_args)).flatten
173
+ def runner(task_args = nil) # :nodoc:
174
+ cucumber_opts = [(ENV['CUCUMBER_OPTS'] || cucumber_opts_with_profile)]
175
+ if(@rcov)
176
+ RCovCucumberRunner.new(libs, binary, cucumber_opts, feature_files(task_args), rcov_opts)
177
+ elsif(@fork)
178
+ ForkedCucumberRunner.new(libs, binary, cucumber_opts, feature_files(task_args))
109
179
  else
110
- args = (['-I'] + lib_args + cucumber_bin + cuc_opts + feature_files(task_args)).flatten
180
+ InProcessCucumberRunner.new(libs, cucumber_opts, feature_files(task_args))
111
181
  end
112
-
113
- args
114
182
  end
115
183
 
116
184
  def cucumber_opts_with_profile # :nodoc:
117
- @profile ? "#{cucumber_opts} --profile #{@profile}" : cucumber_opts
185
+ @profile ? [cucumber_opts, '--profile', @profile] : cucumber_opts
118
186
  end
119
187
 
120
188
  def feature_files(task_args = nil) # :nodoc:
@@ -149,7 +217,7 @@ module Cucumber
149
217
  def define_task # :nodoc:
150
218
  desc @desc
151
219
  task @task_name, :feature_name do |t, args|
152
- ruby(arguments_for_ruby_execution(args).join(" ")) # ruby(*args) is broken on Windows
220
+ runner(args).run
153
221
  end
154
222
  end
155
223
 
@@ -262,6 +262,7 @@ module Cucumber
262
262
 
263
263
  # Creates a new world instance
264
264
  def new_world!
265
+ return if options[:dry_run]
265
266
  create_world!
266
267
  extend_world
267
268
  connect_world
@@ -309,12 +310,14 @@ module Cucumber
309
310
  end
310
311
 
311
312
  def execute_before(scenario)
313
+ return if options[:dry_run]
312
314
  hooks_for(:before, scenario).each do |hook|
313
315
  hook.execute_in(@current_world, scenario, 'Before')
314
316
  end
315
317
  end
316
318
 
317
319
  def execute_after(scenario)
320
+ return if options[:dry_run]
318
321
  hooks_for(:after, scenario).each do |hook|
319
322
  hook.execute_in(@current_world, scenario, 'After')
320
323
  end
@@ -2,7 +2,7 @@ module Cucumber #:nodoc:
2
2
  class VERSION #:nodoc:
3
3
  MAJOR = 0
4
4
  MINOR = 3
5
- TINY = 3
5
+ TINY = 4
6
6
  PATCH = nil # Set to nil for official release
7
7
 
8
8
  STRING = [MAJOR, MINOR, TINY, PATCH].compact.join('.')
@@ -4,7 +4,8 @@ begin
4
4
  require 'cucumber/rake/task'
5
5
 
6
6
  Cucumber::Rake::Task.new(:features) do |t|
7
- t.cucumber_opts = "--format pretty"
7
+ t.fork = true
8
+ t.cucumber_opts = %w{--format pretty}
8
9
  end
9
10
  task :features => 'db:test:prepare'
10
11
  rescue LoadError
@@ -107,8 +107,6 @@ module Cli
107
107
  given_cucumber_yml_defined_as({'default' => '--require from/yml', 'html_report' => '--format html'})
108
108
 
109
109
  config = Configuration.new(StringIO.new, error = StringIO.new)
110
- config.parse!(%w{--profile i_do_not_exist})
111
-
112
110
  expected_message = <<-END_OF_MESSAGE
113
111
  Could not find profile: 'i_do_not_exist'
114
112
 
@@ -117,16 +115,15 @@ Defined profiles in cucumber.yml:
117
115
  * html_report
118
116
  END_OF_MESSAGE
119
117
 
120
- error.string.should == expected_message
118
+ lambda{config.parse!(%w{--profile i_do_not_exist})}.should raise_error(expected_message)
121
119
  end
122
120
 
123
- it "should provide a helpful error message when a specified profile is not a String" do
121
+ it "should allow array as profile" do
124
122
  given_cucumber_yml_defined_as({'foo' => [1,2,3]})
125
123
 
126
124
  config = Configuration.new(StringIO.new, error = StringIO.new)
127
125
  config.parse!(%w{--profile foo})
128
-
129
- error.string.should == "Profiles must be defined as a String. The 'foo' profile was [1, 2, 3] (Array).\n"
126
+ config.paths.should == [1,2,3]
130
127
  end
131
128
 
132
129
  it "should provide a helpful error message when a specified profile exists but is nil or blank" do
@@ -134,9 +131,8 @@ END_OF_MESSAGE
134
131
  given_cucumber_yml_defined_as({'foo' => bad_input})
135
132
 
136
133
  config = Configuration.new(StringIO.new, error = StringIO.new)
137
- config.parse!(%w{--profile foo})
138
-
139
- error.string.should match(/The 'foo' profile in cucumber.yml was blank. Please define the command line arguments for the 'foo' profile in cucumber.yml./)
134
+ expected_error = /The 'foo' profile in cucumber.yml was blank. Please define the command line arguments for the 'foo' profile in cucumber.yml./
135
+ lambda{config.parse!(%w{--profile foo})}.should raise_error(expected_error)
140
136
  end
141
137
  end
142
138
 
@@ -144,9 +140,8 @@ END_OF_MESSAGE
144
140
  File.should_receive(:exist?).with('cucumber.yml').and_return(false)
145
141
 
146
142
  config = Configuration.new(StringIO.new, error = StringIO.new)
147
- config.parse!(%w{--profile i_do_not_exist})
148
-
149
- error.string.should match(/cucumber.yml was not found. Please refer to cucumber's documentation on defining profiles in cucumber.yml./)
143
+ expected_error = /cucumber.yml was not found. Please refer to cucumber's documentation on defining profiles in cucumber.yml./
144
+ lambda{config.parse!(%w{--profile i_do_not_exist})}.should raise_error(expected_error)
150
145
  end
151
146
 
152
147
  it "should provide a helpful error message when cucumber.yml is blank or malformed" do
@@ -156,9 +151,7 @@ END_OF_MESSAGE
156
151
  given_cucumber_yml_defined_as(bad_input)
157
152
 
158
153
  config = Configuration.new(StringIO.new, error = StringIO.new)
159
- config.parse!([])
160
-
161
- error.string.should match(expected_error_message)
154
+ lambda{config.parse!([])}.should raise_error(expected_error_message)
162
155
  end
163
156
  end
164
157
 
@@ -169,9 +162,7 @@ END_OF_MESSAGE
169
162
  YAML.should_receive(:load).and_raise Exception
170
163
 
171
164
  config = Configuration.new(StringIO.new, error = StringIO.new)
172
- config.parse!([])
173
-
174
- error.string.should match(expected_error_message)
165
+ lambda{config.parse!([])}.should raise_error(expected_error_message)
175
166
  end
176
167
 
177
168
  it "should accept --dry-run option" do
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cucumber
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.3
4
+ version: 0.3.4
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-05-10 00:00:00 +02:00
12
+ date: 2009-05-14 00:00:00 +02:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -106,6 +106,10 @@ files:
106
106
  - examples/i18n/bg/features/support/env.rb
107
107
  - examples/i18n/bg/features/support/world.rb
108
108
  - examples/i18n/bg/lib/calculator.rb
109
+ - examples/i18n/cat/Rakefile
110
+ - examples/i18n/cat/features/step_definitons/calculator_steps.rb
111
+ - examples/i18n/cat/features/suma.feature
112
+ - examples/i18n/cat/lib/calculadora.rb
109
113
  - examples/i18n/da/Rakefile
110
114
  - examples/i18n/da/features/step_definitons/kalkulator_steps.rb
111
115
  - examples/i18n/da/features/summering.feature
@@ -191,6 +195,7 @@ files:
191
195
  - examples/i18n/pt/Rakefile
192
196
  - examples/i18n/pt/features/adicao.feature
193
197
  - examples/i18n/pt/features/step_definitions/calculadora_steps.rb
198
+ - examples/i18n/pt/features/support/env.rb
194
199
  - examples/i18n/pt/lib/calculadora.rb
195
200
  - examples/i18n/ro/Rakefile
196
201
  - examples/i18n/ro/features/step_definitons/calculator_steps.rb
@@ -223,12 +228,15 @@ files:
223
228
  - examples/i18n/zh-TW/features/step_definitons/calculator_steps.rb
224
229
  - examples/i18n/zh-TW/lib/calculator.rb
225
230
  - examples/java/README.textile
226
- - examples/java/Rakefile
231
+ - examples/java/build.xml
227
232
  - examples/java/features/hello.feature
228
233
  - examples/java/features/step_definitons/hello_steps.rb
229
234
  - examples/java/features/step_definitons/tree_steps.rb
230
235
  - examples/java/features/tree.feature
231
236
  - examples/java/src/cucumber/demo/Hello.java
237
+ - examples/junit/features/one_passing_one_failing.feature
238
+ - examples/junit/features/pending.feature
239
+ - examples/junit/features/step_definitions/steps.rb
232
240
  - examples/pure_java/README.textile
233
241
  - examples/selenium/Rakefile
234
242
  - examples/selenium/features/search.feature
@@ -313,6 +321,7 @@ files:
313
321
  - features/cucumber_cli_outlines.feature
314
322
  - features/custom_formatter.feature
315
323
  - features/exclude_files.feature
324
+ - features/junit_formatter.feature
316
325
  - features/multiline_names.feature
317
326
  - features/rake_task.feature
318
327
  - features/report_called_undefined_steps.feature
@@ -368,6 +377,7 @@ files:
368
377
  - lib/cucumber/formatter/cucumber.css
369
378
  - lib/cucumber/formatter/cucumber.sass
370
379
  - lib/cucumber/formatter/html.rb
380
+ - lib/cucumber/formatter/junit.rb
371
381
  - lib/cucumber/formatter/pretty.rb
372
382
  - lib/cucumber/formatter/profile.rb
373
383
  - lib/cucumber/formatter/progress.rb
@@ -1,12 +0,0 @@
1
- $:.unshift(File.dirname(__FILE__) + '/../../lib')
2
- require 'cucumber/rake/task'
3
-
4
- Cucumber::Rake::Task.new(:features) do |t|
5
- t.cucumber_opts = "--format pretty"
6
- end
7
-
8
- task :features => :compile
9
-
10
- task :compile do
11
- sh "javac src/cucumber/demo/Hello.java && jar cf src/cucumber_demo.jar -C src cucumber/demo/Hello.class"
12
- end