aslakhellesoy-cucumber 0.3.95 → 0.3.96

Sign up to get free protection for your applications and to get access to all the features.
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
data/History.txt CHANGED
@@ -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)
data/Manifest.txt CHANGED
@@ -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
 
@@ -7,14 +7,18 @@ module Cucumber
7
7
  end
8
8
  # Runs features on a DRB server, originally created with Spork compatibility in mind.
9
9
  class DRbClient
10
- def self.run(args, error_stream, out_stream)
10
+ DEFAULT_PORT = 8990
11
+
12
+ def self.run(args, error_stream, out_stream, port = nil)
13
+ port ||= ENV["CUCUMBER_DRB"] || DEFAULT_PORT
14
+
11
15
  # See http://redmine.ruby-lang.org/issues/show/496 as to why we specify localhost:0
12
16
  DRb.start_service("druby://localhost:0")
13
- feature_server = DRbObject.new_with_uri("druby://127.0.0.1:8990")
17
+ feature_server = DRbObject.new_with_uri("druby://127.0.0.1:#{port}")
14
18
  cloned_args = [] # I have no idea why this is needed, but if the regular args are sent then DRb magically transforms it into a DRb object - not an array
15
19
  args.each { |arg| cloned_args << arg }
16
20
  feature_server.run(cloned_args, error_stream, out_stream)
17
- rescue DRb::DRbConnError
21
+ rescue DRb::DRbConnError => e
18
22
  raise DRbClientError, "No DRb server is running."
19
23
  end
20
24
  end
@@ -1,5 +1,5 @@
1
1
  require 'cucumber/formatter/pretty'
2
- require 'cucumber/parser/i18n/language'
2
+ require 'cucumber/parser/natural_language'
3
3
 
4
4
  module Cucumber
5
5
  module Cli
@@ -23,8 +23,8 @@ http://wiki.github.com/aslakhellesoy/cucumber/spoken-languages
23
23
  end
24
24
 
25
25
  def self.list_keywords(io, lang)
26
- language = Parser::I18n::Language[lang]
27
- raw = Parser::I18n::Language::KEYWORD_KEYS.map do |key|
26
+ language = Parser::NaturalLanguage[lang]
27
+ raw = Parser::NaturalLanguage::KEYWORD_KEYS.map do |key|
28
28
  [key, language.keywords(key)]
29
29
  end
30
30
  table = Ast::Table.new(raw)
@@ -46,7 +46,7 @@ http://wiki.github.com/aslakhellesoy/cucumber/spoken-languages
46
46
  def visit_table_cell_value(value, status)
47
47
  if @col == 1
48
48
  if(@options[:check_lang])
49
- @incomplete = Parser::I18n::Language[value].incomplete?
49
+ @incomplete = Parser::NaturalLanguage.get(nil, value).incomplete?
50
50
  end
51
51
  status = :comment
52
52
  elsif @incomplete
@@ -15,17 +15,11 @@ module Cucumber
15
15
 
16
16
  class << self
17
17
  def step_mother
18
- @step_mother
19
- end
20
-
21
- def step_mother=(step_mother)
22
- @step_mother = step_mother
23
- @step_mother.extend(StepMother)
24
- @step_mother.snippet_generator = StepDefinition
18
+ @step_mother ||= StepMother.new
25
19
  end
26
20
 
27
21
  def execute(args)
28
- new(args).execute!(@step_mother)
22
+ new(args).execute!(step_mother)
29
23
  end
30
24
  end
31
25
 
@@ -33,13 +27,15 @@ module Cucumber
33
27
  @args = args
34
28
  @out_stream = out_stream == STDOUT ? Formatter::ColorIO.new : out_stream
35
29
  @error_stream = error_stream
30
+ $err = error_stream
31
+ @unsupported_programming_languages = []
36
32
  end
37
33
 
38
34
  def execute!(step_mother)
39
35
  trap_interrupt
40
36
  if configuration.drb?
41
37
  begin
42
- return DRbClient.run(@args, @error_stream, @out_stream)
38
+ return DRbClient.run(@args, @error_stream, @out_stream, configuration.drb_port)
43
39
  rescue DRbClientError => e
44
40
  @error_stream.puts "WARNING: #{e.message} Running features locally:"
45
41
  end
@@ -50,8 +46,8 @@ module Cucumber
50
46
  # This is because i18n step methods are only aliased when
51
47
  # features are loaded. If we swap the order, the requires
52
48
  # will fail.
53
- features = load_plain_text_features
54
- load_step_defs
49
+ features = load_plain_text_features(step_mother)
50
+ load_step_defs(step_mother)
55
51
  enable_diffing
56
52
 
57
53
  visitor = configuration.build_formatter_broadcaster(step_mother)
@@ -64,7 +60,7 @@ module Cucumber
64
60
  step_mother.scenarios(:passed).any?
65
61
  else
66
62
  step_mother.scenarios(:failed).any? ||
67
- (configuration.strict? && step_mother.steps(:undefined).any?)
63
+ (configuration.strict? && (step_mother.steps(:undefined).any? || step_mother.steps(:pending).any?))
68
64
  end
69
65
  rescue ProfilesNotDefinedError, YmlLoadError, ProfileNotFound => e
70
66
  @error_stream.puts e.message
@@ -84,19 +80,19 @@ module Cucumber
84
80
  exceeded
85
81
  end
86
82
 
87
- def load_plain_text_features
83
+ def load_plain_text_features(step_mother)
88
84
  features = Ast::Features.new
89
85
 
90
86
  verbose_log("Features:")
91
87
  configuration.feature_files.each do |f|
92
88
  feature_file = FeatureFile.new(f)
93
- feature = feature_file.parse(configuration.options)
89
+ feature = feature_file.parse(step_mother, configuration.options)
94
90
  if feature
95
91
  features.add_feature(feature)
96
92
  verbose_log(" * #{f}")
97
93
  end
98
94
  end
99
- verbose_log("\n"*2)
95
+ verbose_log("\n")
100
96
  features
101
97
  end
102
98
 
@@ -114,50 +110,36 @@ module Cucumber
114
110
 
115
111
  private
116
112
 
117
- def load_step_defs
113
+ def load_step_defs(step_mother)
118
114
  step_def_files = configuration.step_defs_to_load
119
- verbose_log("Step Definitions Files:")
115
+ verbose_log("Step Definitions:")
120
116
  step_def_files.each do |step_def_file|
121
- load_step_def(step_def_file)
117
+ load_step_def(step_mother, step_def_file)
122
118
  end
119
+ verbose_log("\n")
123
120
  end
124
121
 
125
- def load_step_def(step_def_file)
126
- if loader = step_def_loader_for(step_def_file)
122
+ def load_step_def(step_mother, step_def_file)
123
+ if programming_language = programming_language_for(step_mother, step_def_file)
127
124
  verbose_log(" * #{step_def_file}")
128
- loader.load_step_def_file(self, step_def_file)
125
+ programming_language.load_step_def_file(step_def_file)
126
+ else
127
+ verbose_log(" * #{step_def_file} [NOT SUPPORTED]")
129
128
  end
130
129
  end
131
130
 
132
- def step_def_loader_for(step_def_file)
133
- @sted_def_loaders ||= {}
131
+ def programming_language_for(step_mother, step_def_file) # :nodoc:
134
132
  if ext = File.extname(step_def_file)[1..-1]
135
- loader = @sted_def_loaders[ext]
136
- return nil if loader == :missing
137
- return loader if loader
133
+ return nil if @unsupported_programming_languages.index(ext)
138
134
  begin
139
- loader_class = configuration.constantize("Cucumber::Cli::#{ext.capitalize}StepDefLoader")
140
- return @sted_def_loaders[ext] = loader_class.new
135
+ step_mother.load_programming_language(ext)
141
136
  rescue LoadError
142
- @sted_def_loaders[ext] = :missing
137
+ @unsupported_programming_languages << ext
143
138
  nil
144
139
  end
140
+ else
141
+ nil
145
142
  end
146
- nil
147
- end
148
-
149
- def step_def_files
150
- main.verbose_log("Ruby files required:")
151
- main.verbose_log(requires.map{|lib| " * #{lib}"}.join("\n"))
152
- requires.each do |lib|
153
- begin
154
- require lib
155
- rescue LoadError => e
156
- e.message << "\nFailed to load #{lib}"
157
- raise e
158
- end
159
- end
160
- main.verbose_log("\n")
161
143
  end
162
144
 
163
145
  def enable_diffing
@@ -186,5 +168,3 @@ module Cucumber
186
168
  end
187
169
  end
188
170
  end
189
-
190
- Cucumber::Cli::Main.step_mother = self