cucumber 0.5.3 → 0.6.0
Sign up to get free protection for your applications and to get access to all the features.
- data/History.txt +25 -0
- data/Rakefile +4 -3
- data/VERSION.yml +3 -2
- data/cucumber.gemspec +21 -16
- data/cucumber.yml +5 -3
- data/examples/i18n/ar/features/step_definitons/calculator_steps.rb +1 -1
- data/examples/i18n/bg/features/support/env.rb +1 -2
- data/examples/i18n/cat/features/step_definitons/calculator_steps.rb +1 -1
- data/examples/i18n/da/features/step_definitons/lommeregner_steps.rb +1 -1
- data/examples/i18n/de/features/step_definitons/calculator_steps.rb +1 -1
- data/examples/i18n/en-lol/features/support/env.rb +0 -1
- data/examples/i18n/en/features/step_definitons/calculator_steps.rb +2 -2
- data/examples/i18n/es/features/step_definitons/calculador_steps.rb +2 -2
- data/examples/i18n/et/features/step_definitions/kalkulaator_steps.rb +1 -1
- data/examples/i18n/fi/features/step_definitons/laskin_steps.rb +1 -1
- data/examples/i18n/fr/features/step_definitions/calculatrice_steps.rb +0 -6
- data/examples/i18n/fr/features/support/env.rb +5 -0
- data/examples/i18n/he/features/step_definitons/calculator_steps.rb +1 -1
- data/examples/i18n/he/lib/calculator.rb +1 -0
- data/examples/i18n/hu/features/step_definitons/calculator_steps.rb +1 -1
- data/examples/i18n/id/features/step_definitons/calculator_steps.rb +1 -1
- data/examples/i18n/it/features/step_definitons/calcolatrice_steps.rb +1 -1
- data/examples/i18n/ja/features/step_definitons/calculator_steps.rb +0 -5
- data/examples/i18n/ja/features/support/env.rb +5 -0
- data/examples/i18n/ko/features/step_definitons/calculator_steps.rb +1 -1
- data/examples/i18n/lt/features/step_definitons/calculator_steps.rb +1 -1
- data/examples/i18n/lv/features/step_definitons/calculator_steps.rb +1 -1
- data/examples/i18n/no/features/support/env.rb +1 -2
- data/examples/i18n/pl/features/step_definitons/calculator_steps.rb +1 -1
- data/examples/i18n/pl/features/support/env.rb +1 -2
- data/examples/i18n/pt/features/support/env.rb +1 -2
- data/examples/i18n/ro/features/step_definitons/calculator_steps.rb +1 -1
- data/examples/i18n/ru/features/support/env.rb +1 -2
- data/examples/i18n/se/features/step_definitons/kalkulator_steps.rb +1 -1
- data/examples/i18n/sk/features/step_definitons/calculator_steps.rb +1 -1
- data/examples/i18n/sr-latn/features/step_definitons/calculator_steps.rb +3 -3
- data/examples/i18n/sr/features/step_definitons/calculator_steps.rb +1 -5
- data/examples/i18n/sr/features/support/env.rb +5 -0
- data/examples/i18n/tr/features/step_definitons/hesap_makinesi_adimlari.rb +1 -1
- data/examples/i18n/uz/features/support/env.rb +1 -2
- data/examples/i18n/zh-CN/features/step_definitons/calculator_steps.rb +1 -1
- data/examples/i18n/zh-TW/features/step_definitons/calculator_steps.rb +1 -1
- data/examples/self_test/features/step_definitions/sample_steps.rb +2 -0
- data/examples/watir/features/support/screenshots.rb +20 -17
- data/features/call_many_steps.feature +2 -0
- data/features/cucumber_cli.feature +7 -4
- data/features/html_formatter.feature +1 -0
- data/features/html_formatter/a.html +2 -2
- data/features/language_help.feature +1 -0
- data/features/step_definitions/cucumber_steps.rb +3 -3
- data/features/support/env.rb +7 -5
- data/features/tag_logic.feature +7 -7
- data/features/wire_protocol.feature +1 -1
- data/gem_tasks/features.rake +2 -0
- data/lib/autotest/cucumber_mixin.rb +4 -4
- data/lib/cucumber/ast.rb +0 -1
- data/lib/cucumber/ast/feature.rb +9 -12
- data/lib/cucumber/ast/feature_element.rb +4 -4
- data/lib/cucumber/ast/features.rb +2 -2
- data/lib/cucumber/ast/table.rb +1 -0
- data/lib/cucumber/ast/tags.rb +1 -97
- data/lib/cucumber/cli/configuration.rb +3 -1
- data/lib/cucumber/cli/main.rb +20 -23
- data/lib/cucumber/cli/options.rb +9 -18
- data/lib/cucumber/filter.rb +4 -2
- data/lib/cucumber/formatter/console.rb +8 -28
- data/lib/cucumber/formatter/html.rb +1 -1
- data/lib/cucumber/formatter/pdf.rb +0 -4
- data/lib/cucumber/formatter/pretty.rb +1 -2
- data/lib/cucumber/formatter/progress.rb +1 -5
- data/lib/cucumber/formatter/rerun.rb +2 -0
- data/lib/cucumber/formatter/unicode.rb +6 -6
- data/lib/cucumber/language_support/language_methods.rb +0 -1
- data/lib/cucumber/parser/common.rb +16 -4
- data/lib/cucumber/parser/feature.rb +92 -27
- data/lib/cucumber/parser/feature.tt +8 -6
- data/lib/cucumber/parser/py_string.rb +12 -3
- data/lib/cucumber/parser/table.rb +12 -3
- data/lib/cucumber/rb_support/rb_dsl.rb +6 -6
- data/lib/cucumber/rb_support/rb_hook.rb +4 -5
- data/lib/cucumber/rb_support/rb_language.rb +1 -1
- data/lib/cucumber/tag_expression.rb +41 -0
- data/spec/cucumber/ast/feature_spec.rb +23 -2
- data/spec/cucumber/ast/scenario_outline_spec.rb +0 -7
- data/spec/cucumber/cli/options_spec.rb +3 -3
- data/spec/cucumber/formatter/html_spec.rb +10 -0
- data/spec/cucumber/formatter/spec_helper.rb +2 -1
- data/spec/cucumber/tag_expression_spec.rb +127 -0
- metadata +15 -10
- data/spec/cucumber/ast/tags_spec.rb +0 -29
- data/spec/cucumber/formatter/console_spec.rb +0 -20
data/lib/cucumber/ast.rb
CHANGED
data/lib/cucumber/ast/feature.rb
CHANGED
@@ -2,8 +2,9 @@ module Cucumber
|
|
2
2
|
module Ast
|
3
3
|
# Represents the root node of a parsed feature.
|
4
4
|
class Feature #:nodoc:
|
5
|
-
attr_accessor :
|
5
|
+
attr_accessor :language
|
6
6
|
attr_writer :features
|
7
|
+
attr_reader :file
|
7
8
|
attr_reader :name
|
8
9
|
|
9
10
|
def initialize(background, comment, tags, name, feature_elements)
|
@@ -44,21 +45,17 @@ module Cucumber
|
|
44
45
|
"#{file_colon_line(line)}:in `#{step_name}'"
|
45
46
|
end
|
46
47
|
|
48
|
+
def file=(file)
|
49
|
+
file = file.gsub(/\//, '\\') if Cucumber::WINDOWS && file && !ENV['CUCUMBER_FORWARD_SLASH_PATHS']
|
50
|
+
@file = file
|
51
|
+
end
|
52
|
+
|
47
53
|
def file_colon_line(line)
|
48
54
|
"#{@file}:#{line}"
|
49
55
|
end
|
50
56
|
|
51
|
-
def
|
52
|
-
|
53
|
-
@tags.count(tag) # 1.9
|
54
|
-
else
|
55
|
-
@tags.select{|t| t == tag}.length # 1.8
|
56
|
-
end
|
57
|
-
end
|
58
|
-
|
59
|
-
def feature_and_children_tag_count(tag)
|
60
|
-
children_tag_count = @feature_elements.inject(0){|count, feature_element| count += feature_element.tag_count(tag)}
|
61
|
-
children_tag_count + tag_count(tag)
|
57
|
+
def tag_locations(tag)
|
58
|
+
@feature_elements.select{|feature_element| feature_element.tagged_with?(tag)}
|
62
59
|
end
|
63
60
|
|
64
61
|
def short_name
|
@@ -1,5 +1,5 @@
|
|
1
1
|
require 'enumerator'
|
2
|
-
require 'cucumber/
|
2
|
+
require 'cucumber/tag_expression'
|
3
3
|
|
4
4
|
module Cucumber
|
5
5
|
module Ast
|
@@ -49,15 +49,15 @@ module Cucumber
|
|
49
49
|
end
|
50
50
|
|
51
51
|
def accept_hook?(hook)
|
52
|
-
|
52
|
+
TagExpression.parse(hook.tag_expressions).eval(source_tag_names)
|
53
53
|
end
|
54
54
|
|
55
55
|
def source_tag_names
|
56
56
|
(@tags.tag_names + (@feature ? @feature.source_tag_names : [])).uniq
|
57
57
|
end
|
58
58
|
|
59
|
-
def
|
60
|
-
|
59
|
+
def tagged_with?(tag)
|
60
|
+
source_tag_names.index(tag)
|
61
61
|
end
|
62
62
|
|
63
63
|
def language
|
@@ -31,8 +31,8 @@ module Cucumber
|
|
31
31
|
@duration = Time.now - start
|
32
32
|
end
|
33
33
|
|
34
|
-
def
|
35
|
-
@features.
|
34
|
+
def tag_locations(tag)
|
35
|
+
@features.map{|feature| feature.tag_locations(tag)}.flatten
|
36
36
|
end
|
37
37
|
|
38
38
|
end
|
data/lib/cucumber/ast/table.rb
CHANGED
data/lib/cucumber/ast/tags.rb
CHANGED
@@ -1,92 +1,6 @@
|
|
1
|
-
require 'set'
|
2
|
-
|
3
1
|
module Cucumber
|
4
2
|
module Ast
|
5
|
-
|
6
|
-
# Holds the names of tags parsed from a feature file:
|
7
|
-
#
|
8
|
-
# @invoice @release_2
|
9
|
-
#
|
10
|
-
# This gets stored internally as <tt>["invoice", "release_2"]</tt>
|
11
|
-
#
|
12
3
|
class Tags #:nodoc:
|
13
|
-
class And #:nodoc:
|
14
|
-
def initialize(tag_names)
|
15
|
-
if String === tag_names # They still come in as single strings on cuke4duke some times. Not sure why...
|
16
|
-
raise "Commas in tags??? #{tag_names.inspect}" if tag_names =~ /,/ # just in case...
|
17
|
-
tag_names = [tag_names]
|
18
|
-
end
|
19
|
-
@negative_tags, @positive_tags = tag_names.partition{|tag_name| Tags.exclude_tag?(tag_name)}
|
20
|
-
@negative_tags = Tags.strip_negative_char(@negative_tags)
|
21
|
-
end
|
22
|
-
|
23
|
-
def matches?(tag_names)
|
24
|
-
included?(tag_names) && !excluded?(tag_names)
|
25
|
-
end
|
26
|
-
|
27
|
-
private
|
28
|
-
|
29
|
-
def excluded?(tag_names)
|
30
|
-
(@negative_tags & tag_names).any?
|
31
|
-
end
|
32
|
-
|
33
|
-
def included?(tag_names)
|
34
|
-
positive_tag_set = Set.new(@positive_tags)
|
35
|
-
tag_names_set = Set.new(tag_names)
|
36
|
-
positive_tag_set.subset?(tag_names_set)
|
37
|
-
end
|
38
|
-
end
|
39
|
-
|
40
|
-
class Or #:nodoc:
|
41
|
-
def initialize(tag_exp)
|
42
|
-
@exp = tag_exp
|
43
|
-
end
|
44
|
-
|
45
|
-
def matches?(tag_names)
|
46
|
-
@exp.inject(false){|matches, tag_exp| matches || tag_exp.matches?(tag_names)}
|
47
|
-
end
|
48
|
-
end
|
49
|
-
|
50
|
-
class << self
|
51
|
-
EXCLUDE_PATTERN = /^~/
|
52
|
-
|
53
|
-
def matches?(source_tag_names, tag_name_lists)
|
54
|
-
validate_tags(tag_name_lists)
|
55
|
-
tag_name_lists.empty? ? true : check_if_tags_match(source_tag_names, tag_name_lists)
|
56
|
-
end
|
57
|
-
|
58
|
-
def exclude_tag?(tag_name)
|
59
|
-
tag_name =~ EXCLUDE_PATTERN
|
60
|
-
end
|
61
|
-
|
62
|
-
def strip_negative_char(tag_names)
|
63
|
-
tag_names.map{|name| name[1..-1]}
|
64
|
-
end
|
65
|
-
|
66
|
-
def parse_tags(tags_string)
|
67
|
-
tags_string.split(',')
|
68
|
-
end
|
69
|
-
|
70
|
-
private
|
71
|
-
|
72
|
-
def validate_tags(tag_name_lists)
|
73
|
-
all_tag_names = tag_name_lists.flatten
|
74
|
-
exclude_tag_names, include_tag_names = all_tag_names.partition{|tag_name| exclude_tag?(tag_name)}
|
75
|
-
exclude_tag_names = strip_negative_char(exclude_tag_names)
|
76
|
-
check_at_sign_prefix(exclude_tag_names + include_tag_names)
|
77
|
-
end
|
78
|
-
|
79
|
-
def check_if_tags_match(source_tag_names, tag_name_lists)
|
80
|
-
tag_exp = Or.new(tag_name_lists.map{|tag_name_list| And.new(tag_name_list) })
|
81
|
-
tag_exp.matches?(source_tag_names)
|
82
|
-
end
|
83
|
-
|
84
|
-
def check_at_sign_prefix(tag_names)
|
85
|
-
tag_names.each{|tag_name| raise "Tag names must start with an @ sign. The following tag name didn't: #{tag_name.inspect}" unless tag_name[0..0] == '@'}
|
86
|
-
end
|
87
|
-
|
88
|
-
end
|
89
|
-
|
90
4
|
attr_reader :tag_names
|
91
5
|
|
92
6
|
def initialize(line, tag_names)
|
@@ -101,17 +15,7 @@ module Cucumber
|
|
101
15
|
end
|
102
16
|
|
103
17
|
def accept_hook?(hook)
|
104
|
-
|
105
|
-
end
|
106
|
-
|
107
|
-
def count(tag)
|
108
|
-
# See discussion:
|
109
|
-
# http://github.com/weplay/cucumber/commit/2dc592acdf3f7c1a0c333a8164649936bb82d983
|
110
|
-
if @tag_names.respond_to?(:count) && @tag_names.method(:count).arity > 0
|
111
|
-
@tag_names.count(tag) # 1.9
|
112
|
-
else
|
113
|
-
@tag_names.select{|t| t == tag}.length # 1.8
|
114
|
-
end
|
18
|
+
TagExpression.parse(hook.tag_expressions).eval(@tag_names)
|
115
19
|
end
|
116
20
|
|
117
21
|
def to_sexp
|
@@ -1,6 +1,7 @@
|
|
1
1
|
require 'logger'
|
2
2
|
require 'cucumber/cli/options'
|
3
3
|
require 'cucumber/constantize'
|
4
|
+
require 'cucumber/tag_expression'
|
4
5
|
|
5
6
|
module Cucumber
|
6
7
|
module Cli
|
@@ -25,6 +26,7 @@ module Cucumber
|
|
25
26
|
arrange_formats
|
26
27
|
raise("You can't use both --strict and --wip") if strict? && wip?
|
27
28
|
|
29
|
+
@options[:tag_expression] = TagExpression.parse(@options[:tag_expressions])
|
28
30
|
return @args.replace(@options.expanded_args_without_drb) if drb?
|
29
31
|
|
30
32
|
set_environment_variables
|
@@ -57,7 +59,7 @@ module Cucumber
|
|
57
59
|
def drb_port
|
58
60
|
@options[:drb_port].to_i if @options[:drb_port]
|
59
61
|
end
|
60
|
-
|
62
|
+
|
61
63
|
def build_runner(step_mother, io)
|
62
64
|
Ast::TreeWalker.new(step_mother, formatters(step_mother), @options, io)
|
63
65
|
end
|
data/lib/cucumber/cli/main.rb
CHANGED
@@ -7,13 +7,10 @@ require 'cucumber/feature_file'
|
|
7
7
|
require 'cucumber/formatter/color_io'
|
8
8
|
require 'cucumber/cli/configuration'
|
9
9
|
require 'cucumber/cli/drb_client'
|
10
|
-
require 'cucumber/ast/tags'
|
11
10
|
|
12
11
|
module Cucumber
|
13
12
|
module Cli
|
14
13
|
class Main
|
15
|
-
FAILURE = 1
|
16
|
-
|
17
14
|
class << self
|
18
15
|
def step_mother
|
19
16
|
@step_mother ||= StepMother.new
|
@@ -55,36 +52,36 @@ module Cucumber
|
|
55
52
|
|
56
53
|
enable_diffing
|
57
54
|
|
55
|
+
tag_excess = tag_excess(features)
|
56
|
+
configuration.options[:tag_excess] = tag_excess # Hack to make it available in console.rb - later: stick on Run instance.
|
57
|
+
|
58
58
|
runner = configuration.build_runner(step_mother, @out_stream)
|
59
59
|
step_mother.visitor = runner # Needed to support World#announce
|
60
|
+
|
60
61
|
runner.visit_features(features)
|
61
62
|
|
62
|
-
failure = if
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
63
|
+
failure = if tag_excess.any?
|
64
|
+
true
|
65
|
+
elsif configuration.wip?
|
66
|
+
step_mother.scenarios(:passed).any?
|
67
|
+
else
|
68
|
+
step_mother.scenarios(:failed).any? ||
|
69
|
+
(configuration.strict? && (step_mother.steps(:undefined).any? || step_mother.steps(:pending).any?))
|
70
|
+
end
|
70
71
|
rescue ProfilesNotDefinedError, YmlLoadError, ProfileNotFound => e
|
71
72
|
@error_stream.puts e.message
|
72
73
|
true
|
73
74
|
end
|
74
75
|
|
75
|
-
def
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
exceeded = true
|
83
|
-
end
|
84
|
-
end
|
76
|
+
def tag_excess(features)
|
77
|
+
configuration.options[:tag_expression].limits.map do |tag_name, tag_limit|
|
78
|
+
tag_locations = features.tag_locations(tag_name)
|
79
|
+
if tag_limit && (tag_locations.length > tag_limit)
|
80
|
+
[tag_name, tag_limit, tag_locations]
|
81
|
+
else
|
82
|
+
nil
|
85
83
|
end
|
86
|
-
end
|
87
|
-
exceeded
|
84
|
+
end.compact
|
88
85
|
end
|
89
86
|
|
90
87
|
def configuration
|
data/lib/cucumber/cli/options.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
require 'cucumber/cli/profile_loader'
|
2
2
|
require 'cucumber/formatter/ansicolor'
|
3
|
+
require 'cucumber/tag_expression'
|
3
4
|
|
4
5
|
module Cucumber
|
5
6
|
module Cli
|
@@ -29,7 +30,7 @@ module Cucumber
|
|
29
30
|
FORMAT_HELP = (BUILTIN_FORMATS.keys.sort.map do |key|
|
30
31
|
" #{key}#{' ' * (max - key.length)} : #{BUILTIN_FORMATS[key][1]}"
|
31
32
|
end) + ["Use --format rerun --out features.txt to write out failing",
|
32
|
-
"features. You can rerun them with cucumber @
|
33
|
+
"features. You can rerun them with cucumber @rerun.txt.",
|
33
34
|
"FORMAT can also be the fully qualified class name of",
|
34
35
|
"your own custom formatter. If the class isn't loaded,",
|
35
36
|
"Cucumber will attempt to require a file with a relative",
|
@@ -102,7 +103,7 @@ module Cucumber
|
|
102
103
|
opts.banner = ["Usage: cucumber [options] [ [FILE|DIR|URL][:LINE[:LINE]*] ]+", "",
|
103
104
|
"Examples:",
|
104
105
|
"cucumber examples/i18n/en/features",
|
105
|
-
"cucumber @
|
106
|
+
"cucumber @rerun.txt (See --format rerun)",
|
106
107
|
"cucumber examples/i18n/it/features/somma.feature:6:98:113",
|
107
108
|
"cucumber -s -i http://rubyurl.com/eeCl", "", "",
|
108
109
|
].join("\n")
|
@@ -163,8 +164,7 @@ module Cucumber
|
|
163
164
|
"Limit WIP: Positive tags can be given a threshold to limit the",
|
164
165
|
"number of occurrences. Example: --tags @qa:3 will fail if there",
|
165
166
|
"are more than 3 occurrences of the @qa tag.") do |v|
|
166
|
-
|
167
|
-
@options[:tag_names] << tag_names
|
167
|
+
@options[:tag_expressions] << v
|
168
168
|
end
|
169
169
|
opts.on("-n NAME", "--name NAME",
|
170
170
|
"Only execute the feature elements which match part of the given name.",
|
@@ -184,7 +184,7 @@ module Cucumber
|
|
184
184
|
@profiles << v
|
185
185
|
end
|
186
186
|
opts.on(NO_PROFILE_SHORT_FLAG, NO_PROFILE_LONG_FLAG,
|
187
|
-
"Disables all profile
|
187
|
+
"Disables all profile loading to avoid using the 'default' profile.") do |v|
|
188
188
|
@disable_profile_loading = true
|
189
189
|
end
|
190
190
|
opts.on("-c", "--[no-]color",
|
@@ -299,17 +299,8 @@ module Cucumber
|
|
299
299
|
end
|
300
300
|
end
|
301
301
|
|
302
|
-
def
|
303
|
-
|
304
|
-
parse_tag_limits(tag_names)
|
305
|
-
end
|
306
|
-
|
307
|
-
def parse_tag_limits(tag_names)
|
308
|
-
tag_names.inject({}) do |dict, tag|
|
309
|
-
tag, limit = tag.split(':')
|
310
|
-
dict[tag] = limit.nil? ? limit : limit.to_i
|
311
|
-
dict
|
312
|
-
end
|
302
|
+
def tag_filter(tag_string)
|
303
|
+
tags = TagExpression.parse(tag_string)
|
313
304
|
end
|
314
305
|
|
315
306
|
def disable_profile_loading?
|
@@ -348,7 +339,7 @@ module Cucumber
|
|
348
339
|
@options[:require] += other_options[:require]
|
349
340
|
@options[:excludes] += other_options[:excludes]
|
350
341
|
@options[:name_regexps] += other_options[:name_regexps]
|
351
|
-
@options[:
|
342
|
+
@options[:tag_expressions] += other_options[:tag_expressions]
|
352
343
|
@options[:env_vars] = other_options[:env_vars].merge(@options[:env_vars])
|
353
344
|
if @options[:paths].empty?
|
354
345
|
@options[:paths] = other_options[:paths]
|
@@ -403,7 +394,7 @@ module Cucumber
|
|
403
394
|
:dry_run => false,
|
404
395
|
:formats => [],
|
405
396
|
:excludes => [],
|
406
|
-
:
|
397
|
+
:tag_expressions => [],
|
407
398
|
:name_regexps => [],
|
408
399
|
:env_vars => {},
|
409
400
|
:diff_enabled => true
|
data/lib/cucumber/filter.rb
CHANGED
@@ -1,9 +1,11 @@
|
|
1
|
+
require 'cucumber/tag_expression'
|
2
|
+
|
1
3
|
module Cucumber
|
2
4
|
# Filters the AST based on --tags and --name
|
3
5
|
class Filter #:nodoc:
|
4
6
|
def initialize(lines, options)
|
5
7
|
@lines = lines
|
6
|
-
@
|
8
|
+
@tag_expression = options[:tag_expression] || TagExpression.new
|
7
9
|
@name_regexps = options[:name_regexps] || []
|
8
10
|
end
|
9
11
|
|
@@ -27,7 +29,7 @@ module Cucumber
|
|
27
29
|
end
|
28
30
|
|
29
31
|
def matches_tags?(syntax_node)
|
30
|
-
syntax_node.matches_tags?(@
|
32
|
+
syntax_node.matches_tags?(@tag_expression)
|
31
33
|
end
|
32
34
|
|
33
35
|
def outline_matches_names?(syntax_node)
|
@@ -124,34 +124,14 @@ module Cucumber
|
|
124
124
|
end
|
125
125
|
end
|
126
126
|
|
127
|
-
def print_tag_limit_warnings(
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
@io.puts if first_tag
|
136
|
-
first_tag = false
|
137
|
-
@io.puts format_string("#{tag_name} occurred #{tag_frequency} times, but the limit was set to #{limit}", :failed)
|
138
|
-
@tag_occurrences[tag_name].each {|location| @io.puts format_string(" #{location}", :failed)}
|
139
|
-
@io.flush
|
140
|
-
end
|
141
|
-
end
|
142
|
-
end
|
143
|
-
end
|
144
|
-
end
|
145
|
-
end
|
146
|
-
|
147
|
-
def record_tag_occurrences(feature_element, options)
|
148
|
-
@tag_occurrences ||= Hash.new{|k,v| k[v] = []}
|
149
|
-
options[:tag_names].each do |tag_list|
|
150
|
-
tag_list.each do |tag_name, limit|
|
151
|
-
if !Ast::Tags.exclude_tag?(tag_name) && feature_element.tag_count(tag_name) > 0
|
152
|
-
@tag_occurrences[tag_name] << feature_element.file_colon_line
|
153
|
-
end
|
154
|
-
end
|
127
|
+
def print_tag_limit_warnings(features)
|
128
|
+
first_tag = true
|
129
|
+
@options[:tag_excess].each do |tag_name, tag_limit, tag_locations|
|
130
|
+
@io.puts if first_tag
|
131
|
+
first_tag = false
|
132
|
+
@io.puts format_string("#{tag_name} occurred #{tag_locations.length} times, but the limit was set to #{tag_limit}", :failed)
|
133
|
+
tag_locations.each {|tag_location| @io.puts format_string(" #{tag_location.file_colon_line}", :failed)}
|
134
|
+
@io.flush
|
155
135
|
end
|
156
136
|
end
|
157
137
|
|
@@ -236,7 +236,7 @@ module Cucumber
|
|
236
236
|
if status == :undefined
|
237
237
|
step_multiline_class = @step.multiline_arg ? @step.multiline_arg.class : nil
|
238
238
|
@builder.pre do |pre|
|
239
|
-
pre << @step_mother.snippet_text(
|
239
|
+
pre << @step_mother.snippet_text(@step.actual_keyword,step_match.instance_variable_get("@name") || '',step_multiline_class)
|
240
240
|
end
|
241
241
|
end
|
242
242
|
@builder << '</li>'
|