yard-cucumber 3.1.0 → 4.0.0
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.
- 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
|