cucumber 0.3.3 → 0.3.4

Sign up to get free protection for your applications and to get access to all the features.
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