aslakhellesoy-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
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