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