cucumber 2.1.0 → 2.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +10 -0
- data/Gemfile +3 -1
- data/History.md +18 -2
- data/README.md +5 -1
- data/cucumber.gemspec +3 -4
- data/cucumber.yml +2 -2
- data/features/docs/api/run_cli_main_with_existing_runtime.feature +4 -7
- data/features/docs/defining_steps/skip_scenario.feature +6 -2
- data/features/docs/formatters/api_methods.feature +36 -0
- data/features/docs/profiles.feature +2 -2
- data/features/lib/step_definitions/profile_steps.rb +1 -1
- data/lib/cucumber.rb +11 -4
- data/lib/cucumber/cli/configuration.rb +2 -2
- data/lib/cucumber/cli/options.rb +2 -2
- data/lib/cucumber/configuration.rb +25 -3
- data/lib/cucumber/deprecate.rb +29 -0
- data/lib/cucumber/filters/activate_steps.rb +39 -5
- data/lib/cucumber/formatter/console.rb +4 -4
- data/lib/cucumber/formatter/io.rb +1 -1
- data/lib/cucumber/formatter/legacy_api/adapter.rb +30 -30
- data/lib/cucumber/formatter/legacy_api/runtime_facade.rb +4 -9
- data/lib/cucumber/platform.rb +2 -7
- data/lib/cucumber/rb_support/rb_language.rb +72 -26
- data/lib/cucumber/rb_support/rb_step_definition.rb +2 -2
- data/lib/cucumber/rb_support/rb_world.rb +6 -1
- data/lib/cucumber/rb_support/snippet.rb +21 -0
- data/lib/cucumber/running_test_case.rb +5 -1
- data/lib/cucumber/runtime.rb +11 -15
- data/lib/cucumber/runtime/support_code.rb +20 -128
- data/lib/cucumber/step_argument.rb +25 -0
- data/lib/cucumber/step_match.rb +6 -12
- data/lib/cucumber/step_match_search.rb +67 -0
- data/lib/cucumber/version +1 -0
- data/spec/cucumber/configuration_spec.rb +3 -2
- data/spec/cucumber/filters/activate_steps_spec.rb +95 -3
- data/spec/cucumber/formatter/html_spec.rb +1 -1
- data/spec/cucumber/formatter/legacy_api/adapter_spec.rb +55 -28
- data/spec/cucumber/formatter/pretty_spec.rb +2 -2
- data/spec/cucumber/formatter/spec_helper.rb +22 -12
- data/spec/cucumber/rb_support/rb_language_spec.rb +9 -45
- data/spec/cucumber/rb_support/rb_step_definition_spec.rb +2 -2
- data/spec/cucumber/rb_support/rb_world_spec.rb +47 -0
- data/spec/cucumber/runtime/for_programming_languages_spec.rb +1 -1
- data/spec/cucumber/runtime/support_code_spec.rb +4 -111
- data/spec/cucumber/step_argument_spec.rb +18 -0
- data/spec/cucumber/step_match_search_spec.rb +122 -0
- data/spec/cucumber/step_match_spec.rb +8 -2
- data/spec/cucumber/world/pending_spec.rb +2 -1
- data/spec/cucumber_spec.rb +39 -0
- metadata +45 -50
- data/features/docs/wire_protocol/erb_configuration.feature +0 -56
- data/features/docs/wire_protocol/handle_unexpected_response.feature +0 -30
- data/features/docs/wire_protocol/invoke_message.feature +0 -216
- data/features/docs/wire_protocol/readme.md +0 -26
- data/features/docs/wire_protocol/snippets_message.feature +0 -51
- data/features/docs/wire_protocol/step_matches_message.feature +0 -81
- data/features/docs/wire_protocol/table_diffing.feature +0 -126
- data/features/docs/wire_protocol/tags.feature +0 -87
- data/features/docs/wire_protocol/timeouts.feature +0 -64
- data/lib/cucumber/events/bus.rb +0 -86
- data/lib/cucumber/gherkin/formatter/argument.rb +0 -17
- data/lib/cucumber/gherkin/formatter/hashable.rb +0 -27
- data/lib/cucumber/language_support.rb +0 -30
- data/lib/cucumber/language_support/language_methods.rb +0 -72
- data/lib/cucumber/rb_support/regexp_argument_matcher.rb +0 -21
- data/lib/cucumber/wire_support/configuration.rb +0 -38
- data/lib/cucumber/wire_support/connection.rb +0 -61
- data/lib/cucumber/wire_support/request_handler.rb +0 -32
- data/lib/cucumber/wire_support/wire_exception.rb +0 -32
- data/lib/cucumber/wire_support/wire_language.rb +0 -68
- data/lib/cucumber/wire_support/wire_packet.rb +0 -34
- data/lib/cucumber/wire_support/wire_protocol.rb +0 -43
- data/lib/cucumber/wire_support/wire_protocol/requests.rb +0 -133
- data/lib/cucumber/wire_support/wire_step_definition.rb +0 -21
- data/spec/cucumber/events/bus_spec.rb +0 -94
- data/spec/cucumber/rb_support/regexp_argument_matcher_spec.rb +0 -22
- data/spec/cucumber/wire_support/configuration_spec.rb +0 -64
- data/spec/cucumber/wire_support/connection_spec.rb +0 -64
- data/spec/cucumber/wire_support/wire_exception_spec.rb +0 -50
- data/spec/cucumber/wire_support/wire_language_spec.rb +0 -46
- data/spec/cucumber/wire_support/wire_packet_spec.rb +0 -44
@@ -19,7 +19,7 @@ module Cucumber
|
|
19
19
|
def ensure_file(path, name)
|
20
20
|
raise "You *must* specify --out FILE for the #{name} formatter" unless String === path
|
21
21
|
raise "I can't write #{name} to a directory - it has to be a file" if File.directory?(path)
|
22
|
-
ensure_io(path
|
22
|
+
ensure_io(path)
|
23
23
|
end
|
24
24
|
|
25
25
|
def ensure_dir(path, name)
|
@@ -9,9 +9,14 @@ module Cucumber
|
|
9
9
|
module Formatter
|
10
10
|
module LegacyApi
|
11
11
|
|
12
|
-
Adapter = Struct.new(:formatter, :results, :
|
12
|
+
Adapter = Struct.new(:formatter, :results, :config) do
|
13
13
|
extend Forwardable
|
14
14
|
|
15
|
+
def initialize(*)
|
16
|
+
super
|
17
|
+
@matches = collect_matches
|
18
|
+
end
|
19
|
+
|
15
20
|
def_delegators :formatter,
|
16
21
|
:ask
|
17
22
|
|
@@ -51,7 +56,7 @@ module Cucumber
|
|
51
56
|
private
|
52
57
|
|
53
58
|
def printer
|
54
|
-
@printer ||= FeaturesPrinter.new(formatter, results,
|
59
|
+
@printer ||= FeaturesPrinter.new(formatter, results, config, @matches).before
|
55
60
|
end
|
56
61
|
|
57
62
|
def record_test_case_result(test_case, result)
|
@@ -59,8 +64,16 @@ module Cucumber
|
|
59
64
|
results.scenario_visited(scenario)
|
60
65
|
end
|
61
66
|
|
67
|
+
def collect_matches
|
68
|
+
result = {}
|
69
|
+
config.on_event(:step_match) do |event|
|
70
|
+
result[event.test_step.source.last] = event.step_match
|
71
|
+
end
|
72
|
+
result
|
73
|
+
end
|
74
|
+
|
62
75
|
require 'cucumber/core/test/timer'
|
63
|
-
FeaturesPrinter = Struct.new(:formatter, :results, :
|
76
|
+
FeaturesPrinter = Struct.new(:formatter, :results, :config, :matches) do
|
64
77
|
extend Forwardable
|
65
78
|
|
66
79
|
def before
|
@@ -89,7 +102,7 @@ module Cucumber
|
|
89
102
|
def feature(node, *)
|
90
103
|
if node != @current_feature
|
91
104
|
@child.after if @child
|
92
|
-
@child = FeaturePrinter.new(formatter, results,
|
105
|
+
@child = FeaturePrinter.new(formatter, results, matches, config, node).before
|
93
106
|
@current_feature = node
|
94
107
|
end
|
95
108
|
end
|
@@ -125,6 +138,7 @@ module Cucumber
|
|
125
138
|
def timer
|
126
139
|
@timer ||= Cucumber::Core::Test::Timer.new
|
127
140
|
end
|
141
|
+
|
128
142
|
end
|
129
143
|
|
130
144
|
module TestCaseSource
|
@@ -173,9 +187,9 @@ module Cucumber
|
|
173
187
|
|
174
188
|
require 'ostruct'
|
175
189
|
class StepSource < OpenStruct
|
176
|
-
def build_step_invocation(indent,
|
190
|
+
def build_step_invocation(indent, matches, config, messages, embeddings)
|
177
191
|
step_result.step_invocation(
|
178
|
-
|
192
|
+
matches.fetch(step) { NoStepMatch.new(step, step.name) },
|
179
193
|
step,
|
180
194
|
indent,
|
181
195
|
background,
|
@@ -184,14 +198,6 @@ module Cucumber
|
|
184
198
|
embeddings
|
185
199
|
)
|
186
200
|
end
|
187
|
-
|
188
|
-
private
|
189
|
-
|
190
|
-
def step_match(support_code)
|
191
|
-
support_code.step_match(step.name)
|
192
|
-
rescue Cucumber::Undefined
|
193
|
-
NoStepMatch.new(step, step.name)
|
194
|
-
end
|
195
201
|
end
|
196
202
|
|
197
203
|
end
|
@@ -203,7 +209,7 @@ module Cucumber
|
|
203
209
|
end
|
204
210
|
end
|
205
211
|
|
206
|
-
FeaturePrinter = Struct.new(:formatter, :results, :
|
212
|
+
FeaturePrinter = Struct.new(:formatter, :results, :matches, :config, :node) do
|
207
213
|
|
208
214
|
def before
|
209
215
|
formatter.before_feature(node)
|
@@ -251,7 +257,7 @@ module Cucumber
|
|
251
257
|
@delayed_messages = []
|
252
258
|
@delayed_embeddings = []
|
253
259
|
|
254
|
-
@child.after_test_case if @child
|
260
|
+
@child.after_test_case(test_case, test_case_result) if @child
|
255
261
|
@previous_test_case_background = @current_test_case_background
|
256
262
|
@previous_test_case_scenario_outline = current_test_step_source && current_test_step_source.scenario_outline
|
257
263
|
end
|
@@ -357,14 +363,14 @@ module Cucumber
|
|
357
363
|
|
358
364
|
if @failed_hidden_background_step
|
359
365
|
indent = Indent.new(@child.node)
|
360
|
-
step_invocation = @failed_hidden_background_step.build_step_invocation(indent,
|
366
|
+
step_invocation = @failed_hidden_background_step.build_step_invocation(indent, matches, config, messages = [], embeddings = [])
|
361
367
|
@child.step_invocation(step_invocation, @failed_hidden_background_step)
|
362
368
|
@failed_hidden_background_step = nil
|
363
369
|
end
|
364
370
|
|
365
371
|
unless @last_step == current_test_step_source.step
|
366
372
|
indent ||= Indent.new(@child.node)
|
367
|
-
step_invocation = current_test_step_source.build_step_invocation(indent,
|
373
|
+
step_invocation = current_test_step_source.build_step_invocation(indent, matches, config, @delayed_messages, @delayed_embeddings)
|
368
374
|
results.step_visited step_invocation
|
369
375
|
@child.step_invocation(step_invocation, current_test_step_source)
|
370
376
|
@last_step = current_test_step_source.step
|
@@ -523,23 +529,21 @@ module Cucumber
|
|
523
529
|
def step_invocation(step_invocation, source)
|
524
530
|
@child ||= StepsPrinter.new(formatter).before
|
525
531
|
@child.step_invocation step_invocation
|
526
|
-
@last_step_result = source.step_result
|
527
532
|
end
|
528
533
|
|
529
534
|
def after_step_hook(result)
|
530
535
|
result.accept formatter
|
531
536
|
end
|
532
537
|
|
533
|
-
def after_test_case(
|
538
|
+
def after_test_case(test_case, result)
|
539
|
+
@test_case_result = result
|
534
540
|
after
|
535
541
|
end
|
536
542
|
|
537
543
|
def after
|
538
544
|
return if @done
|
539
545
|
@child.after if @child
|
540
|
-
|
541
|
-
# overall scenario result.
|
542
|
-
scenario = last_step_result.scenario(node.name, node.location)
|
546
|
+
scenario = LegacyResultBuilder.new(@test_case_result).scenario(node.name, node.location)
|
543
547
|
after_hook_results.accept(formatter)
|
544
548
|
formatter.after_feature_element(scenario)
|
545
549
|
@done = true
|
@@ -548,10 +552,6 @@ module Cucumber
|
|
548
552
|
|
549
553
|
private
|
550
554
|
|
551
|
-
def last_step_result
|
552
|
-
@last_step_result || LegacyResultBuilder.new(Core::Test::Result::Unknown.new)
|
553
|
-
end
|
554
|
-
|
555
555
|
def indent
|
556
556
|
@indent ||= Indent.new(node)
|
557
557
|
end
|
@@ -610,8 +610,8 @@ module Cucumber
|
|
610
610
|
@child.examples_table_row(node, before_hook_results)
|
611
611
|
end
|
612
612
|
|
613
|
-
def after_test_case
|
614
|
-
@child.after_test_case
|
613
|
+
def after_test_case(test_case, result)
|
614
|
+
@child.after_test_case(test_case, result)
|
615
615
|
end
|
616
616
|
|
617
617
|
def after
|
@@ -712,7 +712,7 @@ module Cucumber
|
|
712
712
|
end
|
713
713
|
|
714
714
|
def after_test_case(*args)
|
715
|
-
@child.after_test_case
|
715
|
+
@child.after_test_case(*args)
|
716
716
|
end
|
717
717
|
|
718
718
|
def after
|
@@ -11,11 +11,10 @@ module Cucumber
|
|
11
11
|
end
|
12
12
|
|
13
13
|
def snippet_text(step_keyword, step_name, multiline_arg) #:nodoc:
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
support_code.unknown_programming_language?
|
14
|
+
keyword = Cucumber::Gherkin::I18n.code_keyword_for(step_keyword).strip
|
15
|
+
configuration.snippet_generators.map { |generator|
|
16
|
+
generator.call(keyword, step_name, multiline_arg, configuration.snippet_type)
|
17
|
+
}.join("\n")
|
19
18
|
end
|
20
19
|
|
21
20
|
def scenarios(status = nil)
|
@@ -25,10 +24,6 @@ module Cucumber
|
|
25
24
|
def steps(status = nil)
|
26
25
|
results.steps(status)
|
27
26
|
end
|
28
|
-
|
29
|
-
def step_match(step_name, name_to_report=nil)
|
30
|
-
support_code.step_match(step_name, name_to_report)
|
31
|
-
end
|
32
27
|
end
|
33
28
|
|
34
29
|
end
|
data/lib/cucumber/platform.rb
CHANGED
@@ -1,22 +1,17 @@
|
|
1
1
|
# Detect the platform we're running on so we can tweak behaviour
|
2
2
|
# in various places.
|
3
3
|
require 'rbconfig'
|
4
|
+
require 'cucumber/core/platform'
|
4
5
|
|
5
6
|
module Cucumber
|
6
7
|
unless defined?(Cucumber::VERSION)
|
7
|
-
VERSION =
|
8
|
+
VERSION = File.read(File.expand_path("../version", __FILE__))
|
8
9
|
BINARY = File.expand_path(File.dirname(__FILE__) + '/../../bin/cucumber')
|
9
10
|
LIBDIR = File.expand_path(File.dirname(__FILE__) + '/../../lib')
|
10
|
-
JRUBY = defined?(JRUBY_VERSION)
|
11
|
-
WINDOWS = RbConfig::CONFIG['host_os'] =~ /mswin|mingw/
|
12
|
-
OS_X = RbConfig::CONFIG['host_os'] =~ /darwin/
|
13
|
-
WINDOWS_MRI = WINDOWS && !JRUBY
|
14
11
|
RAILS = defined?(Rails)
|
15
12
|
RUBY_BINARY = File.join(RbConfig::CONFIG['bindir'], RbConfig::CONFIG['ruby_install_name'])
|
16
13
|
RUBY_2_2 = RUBY_VERSION =~ /^2\.2/
|
17
14
|
RUBY_2_1 = RUBY_VERSION =~ /^2\.1/
|
18
|
-
RUBY_2_0 = RUBY_VERSION =~ /^2\.0/
|
19
|
-
RUBY_1_9 = RUBY_VERSION =~ /^1\.9/
|
20
15
|
|
21
16
|
class << self
|
22
17
|
attr_accessor :use_full_backtrace
|
@@ -7,6 +7,8 @@ require 'cucumber/rb_support/rb_transform'
|
|
7
7
|
require 'cucumber/rb_support/snippet'
|
8
8
|
require 'cucumber/gherkin/i18n'
|
9
9
|
require 'multi_test'
|
10
|
+
require 'cucumber/step_match'
|
11
|
+
require 'cucumber/step_definition_light'
|
10
12
|
|
11
13
|
module Cucumber
|
12
14
|
module RbSupport
|
@@ -32,7 +34,6 @@ module Cucumber
|
|
32
34
|
|
33
35
|
# The Ruby implementation of the programming language API.
|
34
36
|
class RbLanguage
|
35
|
-
include LanguageSupport::LanguageMethods
|
36
37
|
attr_reader :current_world,
|
37
38
|
:step_definitions
|
38
39
|
|
@@ -44,26 +45,21 @@ module Cucumber
|
|
44
45
|
RbDsl.alias_adverb(adverb.strip)
|
45
46
|
end
|
46
47
|
|
47
|
-
def initialize(runtime)
|
48
|
+
def initialize(runtime, configuration)
|
48
49
|
@runtime = runtime
|
49
50
|
@step_definitions = []
|
50
51
|
RbDsl.rb_language = self
|
51
52
|
@world_proc = @world_modules = nil
|
53
|
+
configuration.register_snippet_generator(Snippet::Generator.new)
|
52
54
|
end
|
53
55
|
|
54
|
-
def step_matches(name_to_match
|
55
|
-
@step_definitions.
|
56
|
-
if(arguments = step_definition.arguments_from(name_to_match))
|
57
|
-
StepMatch.new(step_definition, name_to_match,
|
58
|
-
else
|
59
|
-
nil
|
56
|
+
def step_matches(name_to_match)
|
57
|
+
@step_definitions.reduce([]) { |result, step_definition|
|
58
|
+
if (arguments = step_definition.arguments_from(name_to_match))
|
59
|
+
result << StepMatch.new(step_definition, name_to_match, arguments)
|
60
60
|
end
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
def snippet_text(code_keyword, step_name, multiline_arg, snippet_type = :regexp)
|
65
|
-
snippet_class = typed_snippet_class(snippet_type)
|
66
|
-
snippet_class.new(code_keyword, step_name, multiline_arg).to_s
|
61
|
+
result
|
62
|
+
}
|
67
63
|
end
|
68
64
|
|
69
65
|
def begin_rb_scenario(scenario)
|
@@ -96,6 +92,7 @@ module Cucumber
|
|
96
92
|
end
|
97
93
|
|
98
94
|
def load_code_file(code_file)
|
95
|
+
return unless File.extname(code_file) == ".rb"
|
99
96
|
load File.expand_path(code_file) # This will cause self.add_step_definition, self.add_hook, and self.add_transform to be called from RbDsl
|
100
97
|
end
|
101
98
|
|
@@ -107,8 +104,67 @@ module Cucumber
|
|
107
104
|
@current_world = nil
|
108
105
|
end
|
109
106
|
|
107
|
+
def after_configuration(configuration)
|
108
|
+
hooks[:after_configuration].each do |hook|
|
109
|
+
hook.invoke('AfterConfiguration', configuration)
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
113
|
+
def execute_transforms(args)
|
114
|
+
args.map do |arg|
|
115
|
+
matching_transform = transforms.detect {|transform| transform.match(arg) }
|
116
|
+
matching_transform ? matching_transform.invoke(arg) : arg
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
120
|
+
def add_hook(phase, hook)
|
121
|
+
hooks[phase.to_sym] << hook
|
122
|
+
hook
|
123
|
+
end
|
124
|
+
|
125
|
+
def clear_hooks
|
126
|
+
@hooks = nil
|
127
|
+
end
|
128
|
+
|
129
|
+
def add_transform(transform)
|
130
|
+
transforms.unshift transform
|
131
|
+
transform
|
132
|
+
end
|
133
|
+
|
134
|
+
def hooks_for(phase, scenario) #:nodoc:
|
135
|
+
hooks[phase.to_sym].select{|hook| scenario.accept_hook?(hook)}
|
136
|
+
end
|
137
|
+
|
138
|
+
def unmatched_step_definitions
|
139
|
+
available_step_definition_hash.keys - invoked_step_definition_hash.keys
|
140
|
+
end
|
141
|
+
|
142
|
+
def available_step_definition(regexp_source, file_colon_line)
|
143
|
+
available_step_definition_hash[StepDefinitionLight.new(regexp_source, file_colon_line)] = nil
|
144
|
+
end
|
145
|
+
|
146
|
+
def invoked_step_definition(regexp_source, file_colon_line)
|
147
|
+
invoked_step_definition_hash[StepDefinitionLight.new(regexp_source, file_colon_line)] = nil
|
148
|
+
end
|
149
|
+
|
110
150
|
private
|
111
151
|
|
152
|
+
def available_step_definition_hash
|
153
|
+
@available_step_definition_hash ||= {}
|
154
|
+
end
|
155
|
+
|
156
|
+
def invoked_step_definition_hash
|
157
|
+
@invoked_step_definition_hash ||= {}
|
158
|
+
end
|
159
|
+
|
160
|
+
def hooks
|
161
|
+
@hooks ||= Hash.new{|h,k| h[k] = []}
|
162
|
+
end
|
163
|
+
|
164
|
+
def transforms
|
165
|
+
@transforms ||= []
|
166
|
+
end
|
167
|
+
|
112
168
|
def create_world
|
113
169
|
if(@world_proc)
|
114
170
|
@current_world = @world_proc.call
|
@@ -145,19 +201,9 @@ module Cucumber
|
|
145
201
|
end
|
146
202
|
end
|
147
203
|
|
148
|
-
SNIPPET_TYPES = {
|
149
|
-
:regexp => Snippet::Regexp,
|
150
|
-
:classic => Snippet::Classic,
|
151
|
-
:percent => Snippet::Percent
|
152
|
-
}
|
153
|
-
|
154
|
-
def typed_snippet_class(type)
|
155
|
-
SNIPPET_TYPES.fetch(type || :regexp)
|
156
|
-
end
|
157
|
-
|
158
204
|
def self.cli_snippet_type_options
|
159
|
-
SNIPPET_TYPES.keys.sort_by(&:to_s).map do |type|
|
160
|
-
SNIPPET_TYPES[type].cli_option_string(type)
|
205
|
+
Snippet::SNIPPET_TYPES.keys.sort_by(&:to_s).map do |type|
|
206
|
+
Snippet::SNIPPET_TYPES[type].cli_option_string(type)
|
161
207
|
end
|
162
208
|
end
|
163
209
|
end
|
@@ -1,6 +1,6 @@
|
|
1
1
|
require 'cucumber/step_match'
|
2
|
+
require 'cucumber/step_argument'
|
2
3
|
require 'cucumber/core_ext/string'
|
3
|
-
require 'cucumber/rb_support/regexp_argument_matcher'
|
4
4
|
|
5
5
|
module Cucumber
|
6
6
|
module RbSupport
|
@@ -91,7 +91,7 @@ module Cucumber
|
|
91
91
|
end
|
92
92
|
|
93
93
|
def arguments_from(step_name)
|
94
|
-
args =
|
94
|
+
args = StepArgument.arguments_from(@regexp, step_name)
|
95
95
|
@rb_language.invoked_step_definition(regexp_source, location) if args
|
96
96
|
args
|
97
97
|
end
|
@@ -13,7 +13,7 @@ module Cucumber
|
|
13
13
|
|
14
14
|
# Call a Transform with a string from another Transform definition
|
15
15
|
def Transform(arg)
|
16
|
-
rb = @__cucumber_runtime.
|
16
|
+
rb = @__cucumber_runtime.support_code.ruby
|
17
17
|
rb.execute_transforms([arg]).first
|
18
18
|
end
|
19
19
|
|
@@ -94,6 +94,11 @@ module Cucumber
|
|
94
94
|
#
|
95
95
|
# If you'd prefer to see the message immediately, call {Kernel.puts} instead.
|
96
96
|
def puts(*messages)
|
97
|
+
# Even though they won't be output until later, converting the messages to
|
98
|
+
# strings right away will protect them from modifications to their original
|
99
|
+
# objects in the mean time
|
100
|
+
messages.collect! { |message| "#{message}" }
|
101
|
+
|
97
102
|
@__cucumber_runtime.puts(*messages)
|
98
103
|
end
|
99
104
|
|
@@ -4,6 +4,21 @@ module Cucumber
|
|
4
4
|
|
5
5
|
ARGUMENT_PATTERNS = ['"([^"]*)"', '(\d+)']
|
6
6
|
|
7
|
+
class Generator
|
8
|
+
def self.register_on(configuration)
|
9
|
+
configuration.snippet_generators << new
|
10
|
+
end
|
11
|
+
|
12
|
+
def call(code_keyword, step_name, multiline_arg, snippet_type = :regexp)
|
13
|
+
snippet_class = typed_snippet_class(snippet_type)
|
14
|
+
snippet_class.new(code_keyword, step_name, multiline_arg).to_s
|
15
|
+
end
|
16
|
+
|
17
|
+
def typed_snippet_class(type)
|
18
|
+
SNIPPET_TYPES.fetch(type || :regexp)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
7
22
|
class BaseSnippet
|
8
23
|
|
9
24
|
def initialize(code_keyword, pattern, multiline_argument)
|
@@ -91,6 +106,12 @@ module Cucumber
|
|
91
106
|
end
|
92
107
|
end
|
93
108
|
|
109
|
+
SNIPPET_TYPES = {
|
110
|
+
:regexp => Regexp,
|
111
|
+
:classic => Classic,
|
112
|
+
:percent => Percent
|
113
|
+
}
|
114
|
+
|
94
115
|
module MultilineArgumentSnippet
|
95
116
|
|
96
117
|
def self.new(multiline_argument)
|