yard-cucumber 3.1.0 → 4.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/.yardopts +1 -0
- data/Gemfile +1 -1
- data/Gemfile.lock +20 -17
- data/History.txt +13 -0
- data/README.md +10 -10
- data/example/scenario_outline.feature +8 -2
- data/example/step_definitions/example.step.rb +13 -0
- data/example/transform.feature +5 -0
- data/lib/cucumber/city_builder.rb +64 -15
- data/lib/templates/default/featuretags/html/namespace.erb +32 -4
- data/lib/templates/default/fulldoc/html/full_list_features.erb +1 -1
- data/lib/templates/default/fulldoc/html/full_list_tags.erb +1 -1
- data/lib/templates/default/fulldoc/html/js/cucumber.js +9 -0
- data/lib/templates/default/fulldoc/html/setup.rb +26 -4
- data/lib/templates/default/tag/html/alpha_table.erb +2 -1
- data/lib/yard-cucumber.rb +1 -0
- data/lib/yard-cucumber/version.rb +1 -1
- data/lib/yard/code_objects/cucumber/base.rb +1 -9
- data/lib/yard/code_objects/cucumber/feature.rb +7 -9
- data/lib/yard/code_objects/cucumber/namespace_object.rb +55 -49
- data/lib/yard/code_objects/cucumber/scenario.rb +6 -10
- data/lib/yard/code_objects/cucumber/scenario_outline.rb +16 -23
- data/lib/yard/code_objects/cucumber/step.rb +12 -9
- data/lib/yard/code_objects/cucumber/tag.rb +17 -13
- data/lib/yard/code_objects/step_definition.rb +3 -6
- data/lib/yard/code_objects/step_transform.rb +3 -6
- data/lib/yard/code_objects/step_transformer.rb +1 -4
- data/lib/yard/handlers/constant_transform_handler.rb +98 -0
- data/lib/yard/handlers/cucumber/feature_handler.rb +1 -1
- data/lib/yard/handlers/step_transform_handler.rb +22 -3
- data/yard-cucumber.gemspec +2 -2
- metadata +44 -26
@@ -10,7 +10,7 @@
|
|
10
10
|
<div class="item" style="padding-left: 30px">
|
11
11
|
<%= "<a class='toggle'></a>" unless feature.scenarios.empty? %>
|
12
12
|
<%= linkify feature, feature.value %>
|
13
|
-
<small><%= feature.
|
13
|
+
<small style="display: inline;"><%= feature.total_scenarios %></small>
|
14
14
|
</div>
|
15
15
|
|
16
16
|
<% n = n == 'odd' ? 'even' : 'odd' %>
|
@@ -9,7 +9,7 @@
|
|
9
9
|
<li class="<%= n %>">
|
10
10
|
<div class="item" style="padding-left: 30px;">
|
11
11
|
<%= linkify tag, tag.value %>
|
12
|
-
<small style="display: inline;"><%= tag.
|
12
|
+
<small style="display: inline;"><%= tag.total_scenarios %></small>
|
13
13
|
</div>
|
14
14
|
</li>
|
15
15
|
<% n = n == 'odd' ? 'even' : 'odd' %>
|
@@ -277,6 +277,15 @@ function displayQualifyingFeaturesAndScenarios(tags) {
|
|
277
277
|
|
278
278
|
}
|
279
279
|
|
280
|
+
function updateScenarioCount() {
|
281
|
+
var count = 0;
|
282
|
+
$(".scenario:visible").each(function(index) {
|
283
|
+
count += parseInt($(this).attr("count"))
|
284
|
+
});
|
285
|
+
count_header = " (" + count + ")";
|
286
|
+
document.getElementById("scenario_count").innerHTML = count_header;
|
287
|
+
}
|
288
|
+
|
280
289
|
function generateCssSelectorFromTags(tagGroups) {
|
281
290
|
|
282
291
|
var tagSelectors = [ "" ];
|
@@ -73,7 +73,6 @@ def serialize_feature_directories_recursively(namespaces)
|
|
73
73
|
end
|
74
74
|
end
|
75
75
|
|
76
|
-
|
77
76
|
# Generate feature list
|
78
77
|
# @note this method is called automatically by YARD based on the menus defined in the layout
|
79
78
|
def generate_feature_list
|
@@ -82,11 +81,32 @@ def generate_feature_list
|
|
82
81
|
generate_full_list features_ordered_by_name, :features
|
83
82
|
end
|
84
83
|
|
84
|
+
# Count scenarios for features
|
85
|
+
def record_feature_scenarios(features)
|
86
|
+
count_with_examples = 0
|
87
|
+
features.each do |f|
|
88
|
+
count_with_examples += f.total_scenarios
|
89
|
+
end
|
90
|
+
return count_with_examples
|
91
|
+
end
|
92
|
+
|
93
|
+
# Count scenarios for tags
|
94
|
+
def record_tagged_scenarios(tags)
|
95
|
+
scenario_count = 0
|
96
|
+
count_with_examples = 0
|
97
|
+
tags.each do |t|
|
98
|
+
scenario_count += t.all_scenarios.size
|
99
|
+
count_with_examples += t.total_scenarios
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
85
103
|
# Generate tag list
|
86
104
|
# @note this method is called automatically by YARD based on the menus defined in the layout
|
87
105
|
def generate_tag_list
|
88
106
|
tags = Registry.all(:tag)
|
89
|
-
tags_ordered_by_use = Array(tags).sort {|x,y| y.
|
107
|
+
tags_ordered_by_use = Array(tags).sort {|x,y| y.total_scenarios <=> x.total_scenarios }
|
108
|
+
|
109
|
+
record_tagged_scenarios(tags)
|
90
110
|
|
91
111
|
generate_full_list tags_ordered_by_use, :tags
|
92
112
|
end
|
@@ -162,10 +182,12 @@ end
|
|
162
182
|
# When there are is just one feature directory then we want to link to that directory
|
163
183
|
#
|
164
184
|
def all_features_link
|
185
|
+
features = Registry.all(:feature)
|
186
|
+
count_with_examples = record_feature_scenarios(features)
|
165
187
|
if root_feature_directories.length == 0 || root_feature_directories.length > 1
|
166
|
-
linkify YARD::CodeObjects::Cucumber::CUCUMBER_NAMESPACE, "All Features"
|
188
|
+
linkify YARD::CodeObjects::Cucumber::CUCUMBER_NAMESPACE, "All Features (#{count_with_examples})"
|
167
189
|
else
|
168
|
-
linkify root_feature_directories.first, "All Features"
|
190
|
+
linkify root_feature_directories.first, "All Features (#{count_with_examples})"
|
169
191
|
end
|
170
192
|
end
|
171
193
|
|
@@ -14,7 +14,8 @@
|
|
14
14
|
<% objects.each do |obj| %>
|
15
15
|
<li>
|
16
16
|
<% if obj.is_a?(YARD::CodeObjects::Cucumber::Scenario) || obj.is_a?(YARD::CodeObjects::Cucumber::ScenarioOutline) %>
|
17
|
-
|
17
|
+
<% index = obj.path[(/.+_(\d+)$/),1].to_i - 1 %>
|
18
|
+
<a href="<%= url_for(obj.feature,"scenario_#{index}") %>">
|
18
19
|
<%= h obj.value %>
|
19
20
|
</a>
|
20
21
|
<% else %>
|
data/lib/yard-cucumber.rb
CHANGED
@@ -25,6 +25,7 @@ require File.dirname(__FILE__) + "/yard/handlers/cucumber/feature_handler.rb"
|
|
25
25
|
if RUBY19
|
26
26
|
require File.dirname(__FILE__) + "/yard/handlers/step_definition_handler.rb"
|
27
27
|
require File.dirname(__FILE__) + "/yard/handlers/step_transform_handler.rb"
|
28
|
+
require File.dirname(__FILE__) + "/yard/handlers/constant_transform_handler.rb"
|
28
29
|
end
|
29
30
|
|
30
31
|
require File.dirname(__FILE__) + "/yard/handlers/legacy/step_definition_handler.rb"
|
@@ -1,6 +1,4 @@
|
|
1
|
-
|
2
1
|
module YARD::CodeObjects::Cucumber
|
3
|
-
|
4
2
|
module LocationHelper
|
5
3
|
|
6
4
|
def line_number
|
@@ -14,19 +12,13 @@ module YARD::CodeObjects::Cucumber
|
|
14
12
|
def location
|
15
13
|
"#{file}:#{line_number}"
|
16
14
|
end
|
17
|
-
|
18
15
|
end
|
19
16
|
|
20
17
|
class Base < YARD::CodeObjects::Base
|
21
18
|
include LocationHelper
|
22
|
-
|
19
|
+
|
23
20
|
def path
|
24
21
|
@value || super
|
25
22
|
end
|
26
|
-
|
27
23
|
end
|
28
|
-
|
29
|
-
|
30
|
-
|
31
24
|
end
|
32
|
-
|
@@ -1,18 +1,16 @@
|
|
1
|
-
|
2
|
-
|
3
1
|
module YARD::CodeObjects::Cucumber
|
4
|
-
|
5
2
|
class Feature < NamespaceObject
|
6
|
-
|
7
3
|
attr_accessor :background, :comments, :description, :keyword, :scenarios, :tags, :value
|
8
4
|
|
9
|
-
def
|
5
|
+
def total_scenarios
|
6
|
+
scenarios.count
|
7
|
+
end
|
8
|
+
|
9
|
+
def initialize(namespace, name)
|
10
10
|
@comments = ""
|
11
11
|
@scenarios = []
|
12
12
|
@tags = []
|
13
|
-
super(namespace,name.to_s.strip)
|
13
|
+
super(namespace, name.to_s.strip)
|
14
14
|
end
|
15
|
-
|
16
15
|
end
|
17
|
-
|
18
|
-
end
|
16
|
+
end
|
@@ -1,49 +1,55 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
class
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
end
|
25
|
-
|
26
|
-
def
|
27
|
-
|
28
|
-
end
|
29
|
-
|
30
|
-
def
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
1
|
+
module YARD::CodeObjects::Cucumber
|
2
|
+
class NamespaceObject < YARD::CodeObjects::NamespaceObject
|
3
|
+
include LocationHelper
|
4
|
+
|
5
|
+
def value;
|
6
|
+
nil;
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
class Requirements < NamespaceObject;
|
11
|
+
end
|
12
|
+
class FeatureTags < NamespaceObject;
|
13
|
+
end
|
14
|
+
class StepTransformersObject < NamespaceObject;
|
15
|
+
end
|
16
|
+
|
17
|
+
class FeatureDirectory < YARD::CodeObjects::NamespaceObject
|
18
|
+
|
19
|
+
attr_accessor :description
|
20
|
+
|
21
|
+
def initialize(namespace, name)
|
22
|
+
super(namespace, name)
|
23
|
+
@description = ""
|
24
|
+
end
|
25
|
+
|
26
|
+
def location
|
27
|
+
files.first.first if files && !files.empty?
|
28
|
+
end
|
29
|
+
|
30
|
+
def expanded_path
|
31
|
+
to_s.split('::')[1..-1].join('/')
|
32
|
+
end
|
33
|
+
|
34
|
+
def value;
|
35
|
+
name;
|
36
|
+
end
|
37
|
+
|
38
|
+
def features
|
39
|
+
children.find_all { |d| d.is_a?(Feature) }
|
40
|
+
end
|
41
|
+
|
42
|
+
def subdirectories
|
43
|
+
subdirectories = children.find_all { |d| d.is_a?(FeatureDirectory) }
|
44
|
+
subdirectories + subdirectories.collect { |s| s.subdirectories }.flatten
|
45
|
+
end
|
46
|
+
|
47
|
+
end
|
48
|
+
|
49
|
+
CUCUMBER_NAMESPACE = Requirements.new(:root, "requirements") unless defined?(CUCUMBER_NAMESPACE)
|
50
|
+
|
51
|
+
CUCUMBER_TAG_NAMESPACE = FeatureTags.new(CUCUMBER_NAMESPACE, "tags") unless defined?(CUCUMBER_TAG_NAMESPACE)
|
52
|
+
|
53
|
+
CUCUMBER_STEPTRANSFORM_NAMESPACE = StepTransformersObject.new(CUCUMBER_NAMESPACE, "step_transformers") unless defined?(CUCUMBER_STEPTRANSFORM_NAMESPACE)
|
54
|
+
|
55
|
+
end
|
@@ -1,26 +1,22 @@
|
|
1
|
-
|
2
|
-
|
3
1
|
module YARD::CodeObjects::Cucumber
|
4
2
|
|
5
3
|
class Scenario < NamespaceObject
|
6
|
-
|
4
|
+
|
7
5
|
attr_accessor :value, :comments, :keyword, :description, :steps, :tags, :feature
|
8
|
-
|
9
|
-
def initialize(namespace,name)
|
10
|
-
super(namespace,name.to_s.strip)
|
6
|
+
|
7
|
+
def initialize(namespace, name)
|
8
|
+
super(namespace, name.to_s.strip)
|
11
9
|
@comments = @description = @keyword = @value = @feature = nil
|
12
10
|
@steps = []
|
13
11
|
@tags = []
|
14
12
|
end
|
15
|
-
|
13
|
+
|
16
14
|
def background?
|
17
15
|
@keyword == "Background"
|
18
16
|
end
|
19
|
-
|
17
|
+
|
20
18
|
def outline?
|
21
19
|
false
|
22
20
|
end
|
23
|
-
|
24
21
|
end
|
25
|
-
|
26
22
|
end
|
@@ -1,14 +1,11 @@
|
|
1
|
-
|
2
|
-
|
3
1
|
module YARD::CodeObjects::Cucumber
|
4
|
-
|
5
2
|
class ScenarioOutline < NamespaceObject
|
6
3
|
|
7
4
|
attr_accessor :value, :comments, :keyword, :description, :steps, :tags, :feature
|
8
5
|
attr_accessor :scenarios, :examples
|
9
6
|
|
10
|
-
def initialize(namespace,name)
|
11
|
-
super(namespace,name.to_s.strip)
|
7
|
+
def initialize(namespace, name)
|
8
|
+
super(namespace, name.to_s.strip)
|
12
9
|
@comments = @description = @value = @feature = nil
|
13
10
|
@steps = []
|
14
11
|
@tags = []
|
@@ -23,53 +20,49 @@ module YARD::CodeObjects::Cucumber
|
|
23
20
|
def outline?
|
24
21
|
true
|
25
22
|
end
|
26
|
-
|
23
|
+
|
27
24
|
def examples?
|
28
|
-
@examples.find {|example| example.rows }
|
25
|
+
@examples.find { |example| example.rows }
|
29
26
|
end
|
30
|
-
|
31
|
-
|
27
|
+
|
32
28
|
class Examples
|
33
|
-
|
34
|
-
attr_accessor :name, :line, :keyword, :comments, :rows
|
35
|
-
|
29
|
+
|
30
|
+
attr_accessor :name, :line, :keyword, :comments, :rows, :tags, :scenario
|
31
|
+
|
36
32
|
# The first row of the rows contains the headers for the table
|
37
33
|
def headers
|
38
34
|
rows.first
|
39
35
|
end
|
40
|
-
|
36
|
+
|
41
37
|
# The data of the table starts at the second row. When there is no data then
|
42
38
|
# return a empty string.
|
43
39
|
def data
|
44
40
|
rows ? rows[1..-1] : ""
|
45
41
|
end
|
46
|
-
|
42
|
+
|
47
43
|
def values_for_row(row)
|
48
44
|
hash = {}
|
49
45
|
|
50
|
-
headers.each_with_index do |header,index|
|
46
|
+
headers.each_with_index do |header, index|
|
51
47
|
hash[header] = data[row][index]
|
52
48
|
end
|
53
49
|
|
54
50
|
hash
|
55
51
|
end
|
56
|
-
|
52
|
+
|
57
53
|
def to_hash
|
58
54
|
hash = {}
|
59
55
|
|
60
|
-
rows.each_with_index do |header,index|
|
61
|
-
hash[header] = rows.collect {|row| row[index] }
|
56
|
+
rows.each_with_index do |header, index|
|
57
|
+
hash[header] = rows.collect { |row| row[index] }
|
62
58
|
end
|
63
59
|
|
64
60
|
hash
|
65
61
|
end
|
66
|
-
|
62
|
+
|
67
63
|
def initialize(parameters = {})
|
68
|
-
parameters.each {|key,value| send("#{key.to_sym}=",value) if respond_to? "#{key.to_sym}=" }
|
64
|
+
parameters.each { |key, value| send("#{key.to_sym}=", value) if respond_to? "#{key.to_sym}=" }
|
69
65
|
end
|
70
|
-
|
71
66
|
end
|
72
|
-
|
73
67
|
end
|
74
|
-
|
75
68
|
end
|
@@ -1,13 +1,18 @@
|
|
1
|
-
|
2
|
-
|
3
1
|
module YARD::CodeObjects::Cucumber
|
4
|
-
|
5
2
|
class Step < Base
|
6
3
|
|
7
|
-
attr_accessor :comments,
|
8
|
-
|
9
|
-
|
10
|
-
|
4
|
+
attr_accessor :comments,
|
5
|
+
:definition,
|
6
|
+
:examples,
|
7
|
+
:keyword,
|
8
|
+
:scenario,
|
9
|
+
:table,
|
10
|
+
:text,
|
11
|
+
:transforms,
|
12
|
+
:value
|
13
|
+
|
14
|
+
def initialize(namespace, name)
|
15
|
+
super(namespace, name.to_s.strip)
|
11
16
|
@comments = @definition = @description = @keyword = @table = @text = @value = nil
|
12
17
|
@examples = {}
|
13
18
|
@transforms = []
|
@@ -32,7 +37,5 @@ module YARD::CodeObjects::Cucumber
|
|
32
37
|
def transformed?
|
33
38
|
!@transforms.empty?
|
34
39
|
end
|
35
|
-
|
36
40
|
end
|
37
|
-
|
38
41
|
end
|
@@ -1,27 +1,31 @@
|
|
1
|
-
|
2
|
-
|
3
1
|
module YARD::CodeObjects::Cucumber
|
4
|
-
|
5
2
|
class Tag < NamespaceObject
|
6
3
|
|
7
|
-
attr_accessor :value, :owners
|
8
|
-
|
4
|
+
attr_accessor :value, :owners, :total_scenarios
|
5
|
+
|
9
6
|
def features
|
10
|
-
@owners.find_all{|owner| owner.is_a?(Feature) }
|
7
|
+
@owners.find_all { |owner| owner.is_a?(Feature) }
|
11
8
|
end
|
12
|
-
|
9
|
+
|
13
10
|
def scenarios
|
14
|
-
@owners.find_all
|
11
|
+
all = @owners.find_all do |owner|
|
12
|
+
owner.is_a?(Scenario) || owner.is_a?(ScenarioOutline) || ()
|
13
|
+
end
|
14
|
+
|
15
|
+
@owners.each do |owner|
|
16
|
+
if owner.is_a?(ScenarioOutline::Examples) && !all.include?(owner.scenario)
|
17
|
+
all << owner.scenario
|
18
|
+
end
|
19
|
+
end
|
20
|
+
all
|
15
21
|
end
|
16
|
-
|
22
|
+
|
17
23
|
def indirect_scenarios
|
18
|
-
@owners.find_all{|owner| owner.is_a?(Feature) }.collect {|feature| feature.scenarios }.flatten
|
24
|
+
@owners.find_all { |owner| owner.is_a?(Feature) }.collect { |feature| feature.scenarios }.flatten
|
19
25
|
end
|
20
|
-
|
26
|
+
|
21
27
|
def all_scenarios
|
22
28
|
scenarios + indirect_scenarios
|
23
29
|
end
|
24
|
-
|
25
30
|
end
|
26
|
-
|
27
31
|
end
|