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.
- data/History.txt +21 -0
- data/Manifest.txt +9 -3
- data/examples/sinatra/features/support/env.rb +1 -3
- data/features/cucumber_cli.feature +1 -0
- data/features/drb_server_integration.feature +56 -3
- data/features/junit_formatter.feature +23 -12
- data/features/step_definitions/cucumber_steps.rb +13 -2
- data/features/support/env.rb +19 -3
- data/lib/cucumber/ast/feature_element.rb +1 -1
- data/lib/cucumber/ast/step.rb +1 -1
- data/lib/cucumber/ast/step_invocation.rb +3 -2
- data/lib/cucumber/cli/configuration.rb +9 -25
- data/lib/cucumber/cli/drb_client.rb +7 -3
- data/lib/cucumber/cli/language_help_formatter.rb +4 -4
- data/lib/cucumber/cli/main.rb +26 -46
- data/lib/cucumber/cli/options.rb +3 -0
- data/lib/cucumber/constantize.rb +28 -0
- data/lib/cucumber/feature_file.rb +3 -3
- data/lib/cucumber/formatter/junit.rb +13 -9
- data/lib/cucumber/formatter/pretty.rb +2 -2
- data/lib/cucumber/language_support/hook_methods.rb +9 -0
- data/lib/cucumber/language_support/language_methods.rb +47 -0
- data/lib/cucumber/language_support/step_definition_methods.rb +44 -0
- data/lib/cucumber/parser/natural_language.rb +72 -0
- data/lib/cucumber/rb_support/rb_dsl.rb +73 -0
- data/lib/cucumber/rb_support/rb_hook.rb +19 -0
- data/lib/cucumber/rb_support/rb_language.rb +129 -0
- data/lib/cucumber/rb_support/rb_step_definition.rb +56 -0
- data/lib/cucumber/step_match.rb +2 -2
- data/lib/cucumber/step_mother.rb +87 -206
- data/lib/cucumber/version.rb +1 -1
- data/lib/cucumber/webrat/element_locator.rb +7 -7
- data/lib/cucumber/world.rb +28 -8
- data/rails_generators/cucumber/templates/cucumber_environment.rb +2 -2
- data/rails_generators/cucumber/templates/spork_env.rb +0 -2
- data/rails_generators/cucumber/templates/webrat_steps.rb +17 -0
- data/spec/cucumber/ast/background_spec.rb +8 -5
- data/spec/cucumber/ast/feature_factory.rb +4 -5
- data/spec/cucumber/ast/feature_spec.rb +7 -1
- data/spec/cucumber/ast/scenario_outline_spec.rb +10 -6
- data/spec/cucumber/ast/scenario_spec.rb +8 -3
- data/spec/cucumber/ast/step_collection_spec.rb +2 -2
- data/spec/cucumber/cli/configuration_spec.rb +15 -0
- data/spec/cucumber/cli/drb_client_spec.rb +35 -1
- data/spec/cucumber/cli/main_spec.rb +5 -4
- data/spec/cucumber/cli/options_spec.rb +6 -0
- data/spec/cucumber/parser/feature_parser_spec.rb +6 -5
- data/spec/cucumber/parser/table_parser_spec.rb +1 -1
- data/spec/cucumber/step_definition_spec.rb +26 -25
- data/spec/cucumber/step_mother_spec.rb +46 -41
- data/spec/cucumber/world/pending_spec.rb +4 -5
- metadata +11 -5
- data/lib/cucumber/cli/rb_step_def_loader.rb +0 -14
- data/lib/cucumber/parser/i18n/language.rb +0 -87
- 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/
|
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/
|
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.
|
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.
|
@@ -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
|
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
|
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
|
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
|
-
|
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="
|
48
|
-
|
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
|
-
|
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
|
+
|
data/features/support/env.rb
CHANGED
@@ -6,7 +6,7 @@ require 'forwardable'
|
|
6
6
|
begin
|
7
7
|
require 'spork'
|
8
8
|
rescue Gem::LoadError => ex
|
9
|
-
gem 'spork', '>= 0.5.
|
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
|
-
|
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
|
data/lib/cucumber/ast/step.rb
CHANGED
@@ -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
|
-
|
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
|
-
|
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
|
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/
|
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::
|
27
|
-
raw = Parser::
|
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::
|
49
|
+
@incomplete = Parser::NaturalLanguage.get(nil, value).incomplete?
|
50
50
|
end
|
51
51
|
status = :comment
|
52
52
|
elsif @incomplete
|
data/lib/cucumber/cli/main.rb
CHANGED
@@ -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!(
|
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"
|
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
|
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
|
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
|
-
|
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
|
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
|
-
|
136
|
-
return nil if loader == :missing
|
137
|
-
return loader if loader
|
133
|
+
return nil if @unsupported_programming_languages.index(ext)
|
138
134
|
begin
|
139
|
-
|
140
|
-
return @sted_def_loaders[ext] = loader_class.new
|
135
|
+
step_mother.load_programming_language(ext)
|
141
136
|
rescue LoadError
|
142
|
-
@
|
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
|