cucumber-in-the-yard 1.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.
- data/History.txt +3 -0
- data/Manifest +51 -0
- data/README.txt +55 -0
- data/Rakefile +28 -0
- data/cucumber-in-the-yard.gemspec +42 -0
- data/example/example.feature +13 -0
- data/example/example.step.rb +48 -0
- data/example/example.third.feature +30 -0
- data/example/second_example.feature +36 -0
- data/lib/city.rb +23 -0
- data/lib/cucumber/city_builder.rb +130 -0
- data/lib/yard/code_objects/cucumber_location_helper.rb +15 -0
- data/lib/yard/code_objects/feature.rb +24 -0
- data/lib/yard/code_objects/scenario.rb +25 -0
- data/lib/yard/code_objects/step.rb +25 -0
- data/lib/yard/code_objects/tags.rb +63 -0
- data/lib/yard/extensions.rb +38 -0
- data/lib/yard/handlers/base.rb +21 -0
- data/lib/yard/handlers/feature_handler.rb +41 -0
- data/lib/yard/parser/feature.rb +46 -0
- data/lib/yard/rake/city_task.rb +12 -0
- data/lib/yard/rb_extensions.rb +152 -0
- data/lib/yard/templates/default/feature/html/feature.erb +243 -0
- data/lib/yard/templates/default/feature/setup.rb +5 -0
- data/lib/yard/templates/default/fulldoc/html/css/common.css +182 -0
- data/lib/yard/templates/default/fulldoc/html/full_list.erb +34 -0
- data/lib/yard/templates/default/fulldoc/html/full_list_features.erb +10 -0
- data/lib/yard/templates/default/fulldoc/html/full_list_scenarios.erb +10 -0
- data/lib/yard/templates/default/fulldoc/html/full_list_stepdefinitions.erb +11 -0
- data/lib/yard/templates/default/fulldoc/html/full_list_steps.erb +13 -0
- data/lib/yard/templates/default/fulldoc/html/full_list_tagusages.erb +10 -0
- data/lib/yard/templates/default/fulldoc/html/index.erb +24 -0
- data/lib/yard/templates/default/fulldoc/html/js/cucumber.js +13 -0
- data/lib/yard/templates/default/fulldoc/html/setup.rb +73 -0
- data/lib/yard/templates/default/layout/html/headers.erb +14 -0
- data/lib/yard/templates/default/layout/html/search.erb +8 -0
- data/lib/yard/templates/default/module/html/step_transforms.erb +23 -0
- data/lib/yard/templates/default/module/setup.rb +5 -0
- data/lib/yard/templates/default/scenario/html/scenario.erb +26 -0
- data/lib/yard/templates/default/scenario/setup.rb +5 -0
- data/lib/yard/templates/default/steptransformers/html/stepdefinition.erb +38 -0
- data/lib/yard/templates/default/steptransformers/setup.rb +5 -0
- data/lib/yard/templates/default/tagusage/html/tagusage.erb +65 -0
- data/lib/yard/templates/default/tagusage/setup.rb +5 -0
- data/spec/city/feature_parser_spec_examples.rb +153 -0
- data/spec/city/gherkin_loader_spec.rb +39 -0
- data/spec/city/test.feature +36 -0
- data/spec/city/yard_handlers_cucumber_spec.rb +24 -0
- data/spec/city/yard_namespace_object_spec.rb +8 -0
- data/spec/city/yard_parser_cucumber_spec.rb +215 -0
- data/spec/city/yard_rb_extensions_spec.rb +128 -0
- data/spec/spec_helper.rb +5 -0
- data.tar.gz.sig +0 -0
- metadata +201 -0
- metadata.gz.sig +0 -0
@@ -0,0 +1,182 @@
|
|
1
|
+
|
2
|
+
.feature {
|
3
|
+
|
4
|
+
}
|
5
|
+
|
6
|
+
.tags {
|
7
|
+
font-family: monospace;
|
8
|
+
font-size: 14px;
|
9
|
+
}
|
10
|
+
|
11
|
+
|
12
|
+
* .title {
|
13
|
+
padding: 10px;
|
14
|
+
font-size: 24px;
|
15
|
+
}
|
16
|
+
|
17
|
+
.feature > .title, .tag > .title {
|
18
|
+
margin: 20px 20px 10px 20px;
|
19
|
+
padding-left: 0px;
|
20
|
+
border-bottom: 1px solid #E3E3E3;
|
21
|
+
}
|
22
|
+
|
23
|
+
.meta .file {
|
24
|
+
float: right;
|
25
|
+
margin-right: 20px;
|
26
|
+
}
|
27
|
+
|
28
|
+
* .title .pre {
|
29
|
+
color: #696969;
|
30
|
+
}
|
31
|
+
|
32
|
+
* .title .name {
|
33
|
+
font-weight: bold;
|
34
|
+
color: #3F3F3F;
|
35
|
+
}
|
36
|
+
|
37
|
+
.meta {
|
38
|
+
margin-left: 30px;
|
39
|
+
color: gray;
|
40
|
+
}
|
41
|
+
.scenario .meta .tags {
|
42
|
+
margin-left: 0px;
|
43
|
+
}
|
44
|
+
|
45
|
+
.feature .description {
|
46
|
+
margin: 10px 20px 0px 30px;
|
47
|
+
padding: 10px 20px 20px 10px;
|
48
|
+
/* background-color: #F5F5F5;*/
|
49
|
+
color: #343332;
|
50
|
+
/* border: #C7C5C5 solid 1px;*/
|
51
|
+
font-family: 'Trebuchet MS', Arial, Helvetica;
|
52
|
+
}
|
53
|
+
|
54
|
+
.odd {
|
55
|
+
background-color: #F0F6F9;
|
56
|
+
}
|
57
|
+
|
58
|
+
.even {
|
59
|
+
background-color: #FFFFFF;
|
60
|
+
}
|
61
|
+
|
62
|
+
|
63
|
+
#background {
|
64
|
+
margin-top: 10px;
|
65
|
+
margin-left: 20px;
|
66
|
+
}
|
67
|
+
|
68
|
+
.scenario {
|
69
|
+
margin-top: 40px;
|
70
|
+
margin-left: 20px;
|
71
|
+
}
|
72
|
+
|
73
|
+
|
74
|
+
.scenario .title, #background .title {
|
75
|
+
font-size: 16px;
|
76
|
+
padding-left: 0px;
|
77
|
+
margin: 0px 20px 0px 10px;
|
78
|
+
border-bottom: 1px solid #E3E3E3;
|
79
|
+
}
|
80
|
+
|
81
|
+
#background .title .pre {
|
82
|
+
color: #346F97;
|
83
|
+
}
|
84
|
+
|
85
|
+
|
86
|
+
.scenario .steps, #background .steps {
|
87
|
+
margin: 20px 20px 0px 30px;
|
88
|
+
font-size: 12px;
|
89
|
+
}
|
90
|
+
|
91
|
+
.scenario .step, #background .step {
|
92
|
+
margin-top: 4px;
|
93
|
+
padding: 4px;
|
94
|
+
font-size: 14px;
|
95
|
+
font-weight: bold;
|
96
|
+
}
|
97
|
+
|
98
|
+
#background .title .name {}
|
99
|
+
#background .description {}
|
100
|
+
|
101
|
+
.scenario .title .name {}
|
102
|
+
.scenario .description {}
|
103
|
+
|
104
|
+
.scenario .title .pre {
|
105
|
+
color: #00AAD2;
|
106
|
+
}
|
107
|
+
|
108
|
+
.scenario .tags {
|
109
|
+
margin-left: 30px;
|
110
|
+
margin-top: 10px;
|
111
|
+
}
|
112
|
+
|
113
|
+
.step .predicate {
|
114
|
+
color: #5D5C5B;
|
115
|
+
}
|
116
|
+
|
117
|
+
.step .undefined {
|
118
|
+
border-bottom: 1px dashed #E99494;
|
119
|
+
}
|
120
|
+
.step .defined {}
|
121
|
+
.step .details {
|
122
|
+
float: right;
|
123
|
+
color: #343332;
|
124
|
+
}
|
125
|
+
.step .details .pre {}
|
126
|
+
.step .details .name {
|
127
|
+
font-family: monospace;
|
128
|
+
color: black;
|
129
|
+
}
|
130
|
+
|
131
|
+
.multiline, .text {
|
132
|
+
margin-top: 10px;
|
133
|
+
margin-left: 20px;
|
134
|
+
}
|
135
|
+
|
136
|
+
.text {
|
137
|
+
padding: 20px;
|
138
|
+
background-color: #F5F5F5;
|
139
|
+
color: #343332;
|
140
|
+
}
|
141
|
+
|
142
|
+
|
143
|
+
.outline {
|
144
|
+
margin-top: 20px;
|
145
|
+
margin-left: 40px;
|
146
|
+
}
|
147
|
+
.multiline table tr, .outline table tr {
|
148
|
+
padding: 4px;
|
149
|
+
}
|
150
|
+
.multiline table thead tr th, .outline table thead tr th {
|
151
|
+
text-align: left;
|
152
|
+
padding: 4px;
|
153
|
+
background-color: #A8C0A8;
|
154
|
+
}
|
155
|
+
.multiline table tr td, .outline table tr td {
|
156
|
+
width: 150px;
|
157
|
+
padding: 4px;
|
158
|
+
}
|
159
|
+
|
160
|
+
|
161
|
+
/* Overrides for scenarios in the tag view */
|
162
|
+
.tag .scenario {
|
163
|
+
margin-left: 30px;
|
164
|
+
margin-top: 0px;
|
165
|
+
}
|
166
|
+
.tag .scenario .title {
|
167
|
+
border-bottom: none;
|
168
|
+
}
|
169
|
+
/* Overrides for scenarios in the tag view */
|
170
|
+
|
171
|
+
.stepdef .title {
|
172
|
+
font-size: 14px;
|
173
|
+
margin-top: 30px;
|
174
|
+
border-bottom: 1px solid #E3E3E3;
|
175
|
+
}
|
176
|
+
|
177
|
+
.stepdef .steps {
|
178
|
+
margin: 10px 0px 0px 30px;
|
179
|
+
}
|
180
|
+
.stepdef .steps .step {
|
181
|
+
padding: 4px;
|
182
|
+
}
|
@@ -0,0 +1,34 @@
|
|
1
|
+
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
2
|
+
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
3
|
+
<html>
|
4
|
+
<head>
|
5
|
+
<meta name="Content-Type" content="text/html; charset=<%= charset %>" />
|
6
|
+
<link rel="stylesheet" href="css/full_list.css" type="text/css" media="screen" charset="utf-8" />
|
7
|
+
<link rel="stylesheet" href="css/common.css" type="text/css" media="screen" charset="utf-8" />
|
8
|
+
<script type="text/javascript" charset="utf-8" src="js/jquery.js"></script>
|
9
|
+
<script type="text/javascript" charset="utf-8" src="js/full_list.js"></script>
|
10
|
+
<base id="base_target" target="_parent" />
|
11
|
+
</head>
|
12
|
+
<body>
|
13
|
+
<script type="text/javascript" charset="utf-8">
|
14
|
+
if (window.top.frames.main) {
|
15
|
+
document.getElementById('base_target').target = 'main';
|
16
|
+
document.body.className = 'frames';
|
17
|
+
}
|
18
|
+
</script>
|
19
|
+
<div id="content">
|
20
|
+
<h1 id="full_list_header"><%= @list_title %></h1>
|
21
|
+
<div id="nav">
|
22
|
+
<a target="_self" href="class_list.html">Classes</a> |
|
23
|
+
<a target="_self" href="method_list.html">Methods</a> |
|
24
|
+
<a target="_self" href="file_list.html">Files</a>
|
25
|
+
</div>
|
26
|
+
<div id="search">Search: <input type="text" /></div>
|
27
|
+
|
28
|
+
<ul id="full_list" class="<%= @list_type %>">
|
29
|
+
<%= erb "full_list_#{@list_type}" %>
|
30
|
+
</ul>
|
31
|
+
</div>
|
32
|
+
</body>
|
33
|
+
</html>
|
34
|
+
|
@@ -0,0 +1,10 @@
|
|
1
|
+
<% n = 1 %>
|
2
|
+
<% @features.each do |feature| %>
|
3
|
+
<li class="r<%= n %>">
|
4
|
+
<span class='object_link'>
|
5
|
+
<a href="<%= feature.filename %>"><%= h(feature.value) %></a>
|
6
|
+
</span>
|
7
|
+
<span class="">(<%= h(feature.file) %>)<span>
|
8
|
+
</li>
|
9
|
+
<% n = n == 2 ? 1 : 2 %>
|
10
|
+
<% end %>
|
@@ -0,0 +1,10 @@
|
|
1
|
+
<% n = 1 %>
|
2
|
+
<% @scenarios.each do |scenario| %>
|
3
|
+
<li class="r<%= n %>">
|
4
|
+
<span class='object_link'>
|
5
|
+
<a href="<%= scenario.feature.filename %>"><%= h(scenario.value) %></a>
|
6
|
+
</span>
|
7
|
+
<span class="">(<%= h(scenario.location) %>)<span>
|
8
|
+
</li>
|
9
|
+
<% n = n == 2 ? 1 : 2 %>
|
10
|
+
<% end %>
|
@@ -0,0 +1,11 @@
|
|
1
|
+
<% n = 1 %>
|
2
|
+
<% @step_definitions.each do |stepdef| %>
|
3
|
+
<li class="r<%= n %>">
|
4
|
+
<span class='object_link'>
|
5
|
+
<span class="pre"><%= stepdef.keyword %></span>
|
6
|
+
<a href="steptransformers.html#<%= stepdef.name %>"><span class="name"><%= h(stepdef.value) %></span></a>
|
7
|
+
</span>
|
8
|
+
<span class="">(<%= h("#{stepdef.files.first.first}:#{stepdef.files.first.last}") %>)<span>
|
9
|
+
</li>
|
10
|
+
<% n = n == 2 ? 1 : 2 %>
|
11
|
+
<% end %>
|
@@ -0,0 +1,13 @@
|
|
1
|
+
<% n = 1 %>
|
2
|
+
<% @steps.each do |step| %>
|
3
|
+
<li class="r<%= n %>">
|
4
|
+
<span class='object_link'>
|
5
|
+
<a href="<%= step.scenario.feature.filename %>">
|
6
|
+
<span class="pre"><%= step.keyword %></span>
|
7
|
+
<span class="name"><%= h(step.value) %></span>
|
8
|
+
</a>
|
9
|
+
</span>
|
10
|
+
<span class="">(<%= h(step.files.first.first) %>)<span>
|
11
|
+
</li>
|
12
|
+
<% n = n == 2 ? 1 : 2 %>
|
13
|
+
<% end %>
|
@@ -0,0 +1,10 @@
|
|
1
|
+
<% n = 1 %>
|
2
|
+
<% @tagusage.each do |usage| %>
|
3
|
+
<li class="r<%= n %>">
|
4
|
+
<span class='object_link'>
|
5
|
+
<a href="<%= usage.filename %>"><%= h(usage.value) %></a>
|
6
|
+
</span>
|
7
|
+
<small><%= usage.total_scenario_count %></small>
|
8
|
+
</li>
|
9
|
+
<% n = n == 2 ? 1 : 2 %>
|
10
|
+
<% end %>
|
@@ -0,0 +1,24 @@
|
|
1
|
+
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
2
|
+
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
3
|
+
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
4
|
+
<head>
|
5
|
+
<%= T('layout/headers') %>
|
6
|
+
</head>
|
7
|
+
<body>
|
8
|
+
<script type="text/javascript" charset="utf-8">
|
9
|
+
if (window.top.frames.main) document.body.className = 'frames';
|
10
|
+
</script>
|
11
|
+
|
12
|
+
<div id="header">
|
13
|
+
<%= T('layout/breadcrumb') %>
|
14
|
+
<%= T('layout/search') %>
|
15
|
+
<div class="clear"></div>
|
16
|
+
</div>
|
17
|
+
|
18
|
+
<iframe id="search_frame"></iframe>
|
19
|
+
|
20
|
+
<div id="content"><%= yieldall %></div>
|
21
|
+
|
22
|
+
<%= T('layout/footer') %>
|
23
|
+
</body>
|
24
|
+
</html>
|
@@ -0,0 +1,13 @@
|
|
1
|
+
function cucumberSearchFrameLinks() {
|
2
|
+
$('#feature_list_link').click(function() {
|
3
|
+
toggleSearchFrame(this, relpath + 'feature_list.html');
|
4
|
+
});
|
5
|
+
$('#tagusage_list_link').click(function() {
|
6
|
+
toggleSearchFrame(this, relpath + 'tagusage_list.html');
|
7
|
+
});
|
8
|
+
$('#scenario_list_link').click(function() {
|
9
|
+
toggleSearchFrame(this, relpath + 'scenario_list.html');
|
10
|
+
});
|
11
|
+
}
|
12
|
+
|
13
|
+
$(cucumberSearchFrameLinks);
|
@@ -0,0 +1,73 @@
|
|
1
|
+
include YARD::Templates::Helpers::HtmlHelper
|
2
|
+
|
3
|
+
def init
|
4
|
+
super
|
5
|
+
asset("js/cucumber.js",file("js/cucumber.js",true))
|
6
|
+
|
7
|
+
# Because I don't parse correctly I have to find all my scenarios, steps, and tags
|
8
|
+
@scenarios = []
|
9
|
+
@tags = []
|
10
|
+
@features = Registry.all(:feature)
|
11
|
+
|
12
|
+
@step_definitions = Registry.all(:stepdefinition)
|
13
|
+
@steps = Registry.all(:step)
|
14
|
+
|
15
|
+
create_full_list(@step_definitions,"Step Definition")
|
16
|
+
create_full_list(@steps)
|
17
|
+
|
18
|
+
@features.each do |feature|
|
19
|
+
serialize_object(feature)
|
20
|
+
|
21
|
+
feature.tags.each { |tag| @tags << tag }
|
22
|
+
|
23
|
+
feature.scenarios.each do |scenario|
|
24
|
+
@scenarios << scenario
|
25
|
+
scenario.tags.each { |tag| @tags << tag }
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
@tags = find_unique_tags(@tags)
|
30
|
+
@tags.each { |tag,tag_objects| serialize_object(tag_objects) }
|
31
|
+
@tagusage = @tags.values.sort {|x,y| y.total_scenario_count <=> x.total_scenario_count }
|
32
|
+
|
33
|
+
create_full_list(@tagusage,"Tag Usage")
|
34
|
+
create_full_list(@features)
|
35
|
+
create_full_list(@scenarios)
|
36
|
+
|
37
|
+
@step_transformers = YARD::CodeObjects::StepTransformersObject.new(:root,"steptransformers")
|
38
|
+
|
39
|
+
@step_definitions.each {|stepdef| @step_transformers << stepdef }
|
40
|
+
|
41
|
+
serialize_object(@step_transformers)
|
42
|
+
|
43
|
+
end
|
44
|
+
|
45
|
+
def asset(path, content)
|
46
|
+
options[:serializer].serialize(path, content) if options[:serializer]
|
47
|
+
end
|
48
|
+
|
49
|
+
def serialize_object(object)
|
50
|
+
options[:object] = object
|
51
|
+
Templates::Engine.with_serializer(object.filename, options[:serializer]) do
|
52
|
+
T('layout').run(options)
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
def create_full_list(objects,friendly_name=nil)
|
57
|
+
@list_type = "#{objects.first.type.to_s}s"
|
58
|
+
@list_title = "#{friendly_name || objects.first.type.to_s.capitalize} List"
|
59
|
+
asset("#{objects.first.type}_list.html",erb(:full_list))
|
60
|
+
end
|
61
|
+
|
62
|
+
def find_unique_tags(tags)
|
63
|
+
|
64
|
+
tags_hash = {}
|
65
|
+
|
66
|
+
tags.each do |tag|
|
67
|
+
tags_hash[tag.value] = YARD::CodeObjects::Cucumber::TagUsage.new(:root,"tag_#{tag.value}"){|t| t.value = tag.value } unless tags_hash[tag.value]
|
68
|
+
tags_hash[tag.value.to_s] << tag
|
69
|
+
end
|
70
|
+
|
71
|
+
tags_hash
|
72
|
+
end
|
73
|
+
|
@@ -0,0 +1,14 @@
|
|
1
|
+
<meta name="Content-Type" content="text/html; charset=<%= charset %>" />
|
2
|
+
<title><%= @page_title %></title>
|
3
|
+
<link rel="stylesheet" href="<%= url_for("css/style.css") %>" type="text/css" media="screen" charset="utf-8" />
|
4
|
+
<link rel="stylesheet" href="<%= url_for("css/common.css") %>" type="text/css" media="screen" charset="utf-8" />
|
5
|
+
<% if @extra_css %>
|
6
|
+
<link rel="stylesheet" href="<%= url_for @extra_css %>" type="text/css" media="screen" charset="utf-8" />
|
7
|
+
<% end %>
|
8
|
+
<script type="text/javascript" charset="utf-8">
|
9
|
+
relpath = '<%= url_for('') %>';
|
10
|
+
if (relpath != '') relpath += '/';
|
11
|
+
</script>
|
12
|
+
<script type="text/javascript" charset="utf-8" src="<%= url_for("js/jquery.js") %>"></script>
|
13
|
+
<script type="text/javascript" charset="utf-8" src="<%= url_for("js/app.js") %>"></script>
|
14
|
+
<script type="text/javascript" charset="utf-8" src="<%= url_for("js/cucumber.js") %>"></script>
|
@@ -0,0 +1,8 @@
|
|
1
|
+
<div id="search">
|
2
|
+
<a id="feature_list_link" href="#">Features</a>
|
3
|
+
<a id="tagusage_list_link" href="#">Tags</a>
|
4
|
+
<a id="scenario_list_link" href="#">Scenarios</a>
|
5
|
+
<a id="class_list_link" href="#">Class List</a>
|
6
|
+
<a id="method_list_link" href="#">Method List</a>
|
7
|
+
<a id ="file_list_link" href="#">File List</a>
|
8
|
+
</div>
|
@@ -0,0 +1,23 @@
|
|
1
|
+
<% if object.step_transforms %>
|
2
|
+
<h2>Step Transforms</h2>
|
3
|
+
<dl class="constants">
|
4
|
+
<% object.step_transforms.each do |step| %>
|
5
|
+
<dt>
|
6
|
+
<span style="font-weight: normal;">Transform</span>
|
7
|
+
<span style="constants"><%= step.value %></span>
|
8
|
+
</dt>
|
9
|
+
<dd><pre class="code"><%= step.source %></pre></dd>
|
10
|
+
<% end %>
|
11
|
+
</dl>
|
12
|
+
<table class="source_code">
|
13
|
+
<tr>
|
14
|
+
<td>
|
15
|
+
<pre class="lines"><%= "\n\n\n" %><%= h format_lines(object) %></pre>
|
16
|
+
</td>
|
17
|
+
<td>
|
18
|
+
<pre class="code"><span class="info file"># File '<%= h object.file %>'<% if object.line %>, line <%= object.line %><% end %></span><%= "\n\n" %><%= html_syntax_highlight object.source %></pre>
|
19
|
+
</td>
|
20
|
+
</tr>
|
21
|
+
</table>
|
22
|
+
|
23
|
+
<% end %>
|
@@ -0,0 +1,26 @@
|
|
1
|
+
<div class="scenario">
|
2
|
+
<div class="title">
|
3
|
+
<span class="pre">Scenario:</span>
|
4
|
+
<span class="name"><%= @scenario.value %></span>
|
5
|
+
</div>
|
6
|
+
<% unless @scenario.tags.empty? %>
|
7
|
+
<div class="tags"><%= @scenario.tags.collect { |tags| tags.value }.join(" ") %></div>
|
8
|
+
<% end %>
|
9
|
+
<% unless @scenario.description.empty? %>
|
10
|
+
<div class="description">
|
11
|
+
<%= @scenario.description.join("\n<br/>") %>
|
12
|
+
</div>
|
13
|
+
<% end %>
|
14
|
+
<div class="steps">
|
15
|
+
<% unless @scenario.steps.empty? %>
|
16
|
+
<% @scenario.steps.each do |step| %>
|
17
|
+
<!-- TODO: Style the first word differently -->
|
18
|
+
<!-- TODO: Link the step to the step definition -->
|
19
|
+
<!-- TODO: Steps without links should appear different -->
|
20
|
+
<div class="step"><span class="predicate"><%= step.keyword %></span> <%= step.line %></div>
|
21
|
+
<% end %>
|
22
|
+
<% else %>
|
23
|
+
<span>No Steps Defined</span>
|
24
|
+
<% end %>
|
25
|
+
</div>
|
26
|
+
</div>
|
@@ -0,0 +1,38 @@
|
|
1
|
+
<div class="title">
|
2
|
+
<div class="name">Step Definitions</div>
|
3
|
+
</div>
|
4
|
+
|
5
|
+
<div style="margin: 10px;"> </div>
|
6
|
+
|
7
|
+
|
8
|
+
<% @step_transformers.definitions.each_with_index do |stepdef,index| %>
|
9
|
+
|
10
|
+
<div class="stepdef">
|
11
|
+
<a name="<%= stepdef.name %>">
|
12
|
+
<div class="title">
|
13
|
+
<span class="pre"><%= stepdef.keyword %></span>
|
14
|
+
<span class="name"><%= stepdef.value %></span>
|
15
|
+
<div style="float: right;"><%= h( "#{stepdef.files.first.first}:#{stepdef.files.first.last}" ) %></div>
|
16
|
+
</div>
|
17
|
+
|
18
|
+
|
19
|
+
<div class="steps">
|
20
|
+
<% if stepdef.steps && !stepdef.steps.empty? %>
|
21
|
+
<% stepdef.steps.each_with_index do |step,step_index| %>
|
22
|
+
<div class="step <%= (step_index + 1) % 2 == 0 ? 'even' : 'odd' %>">
|
23
|
+
<%= h("#{step.keyword} #{step.value}") %>
|
24
|
+
<div class="details"><a href="<%= step.scenario.feature.filename %>"><%= h(step.location) %></a></div>
|
25
|
+
</div>
|
26
|
+
<% end %>
|
27
|
+
<% else %>
|
28
|
+
<span class="undefined">No steps were found to match this step definition.</span>
|
29
|
+
<% end%>
|
30
|
+
</div>
|
31
|
+
|
32
|
+
|
33
|
+
<div class="source">
|
34
|
+
<!-- <%= h(stepdef.source) %> -->
|
35
|
+
</div>
|
36
|
+
</div>
|
37
|
+
|
38
|
+
<% end %>
|
@@ -0,0 +1,65 @@
|
|
1
|
+
<div class="tag">
|
2
|
+
<div class="title">
|
3
|
+
<span class="pre">Tag:</span>
|
4
|
+
<span class="name"><%= @tags.value %></span>
|
5
|
+
|
6
|
+
</div>
|
7
|
+
|
8
|
+
<div class="meta">
|
9
|
+
<div class="file">Usage:
|
10
|
+
<%= @tags.feature_count > 0 ? "#{@tags.feature_count} feature#{@tags.feature_count > 1 ? 's' : ''} (with #{@tags.indirect_scenario_count} scenario#{@tags.indirect_scenario_count > 1 ? 's' : ''})" : "" %>
|
11
|
+
<%= " and " if @tags.feature_count > 0 && @tags.scenario_count > 0 %>
|
12
|
+
<%= @tags.scenario_count > 0 ? "#{@tags.scenario_count} scenario#{@tags.scenario_count > 1 ? 's' : ''}" : "" %>
|
13
|
+
</div>
|
14
|
+
</div>
|
15
|
+
|
16
|
+
<% if @tags.tags %>
|
17
|
+
<% @tags.tags.each do |tag| %>
|
18
|
+
|
19
|
+
<% if tag.scenario %>
|
20
|
+
<div class="feature indirect">
|
21
|
+
<div class="title">
|
22
|
+
<span class="pre">Feature:</span>
|
23
|
+
<span class="name">
|
24
|
+
<a href="<%= tag.scenario.feature.filename %>"><%= tag.scenario.feature.value %></a>
|
25
|
+
</span>
|
26
|
+
</div>
|
27
|
+
<div class="description"><%= tag.scenario.feature.description %></div>
|
28
|
+
</div>
|
29
|
+
|
30
|
+
<div class="scenario direct">
|
31
|
+
<div class="title">
|
32
|
+
<span class="pre">Scenario:</span>
|
33
|
+
<span class="name">
|
34
|
+
<a href="<%= tag.scenario.feature.filename %>"><%= tag.scenario.value %></a>
|
35
|
+
</span>
|
36
|
+
</div>
|
37
|
+
<div class="description"><%= tag.scenario.description %></div>
|
38
|
+
</div>
|
39
|
+
<% else %>
|
40
|
+
<div class="feature direct">
|
41
|
+
<div class="title">
|
42
|
+
<span class="pre">Feature:</span>
|
43
|
+
<span class="name">
|
44
|
+
<a href="<%= tag.feature.filename %>"><%= tag.feature.value %></a>
|
45
|
+
</span>
|
46
|
+
</div>
|
47
|
+
<div class="description"><%= tag.feature.description %></div>
|
48
|
+
</div>
|
49
|
+
|
50
|
+
<% tag.feature.scenarios.each do |scenario| %>
|
51
|
+
<div class="scenario indirect">
|
52
|
+
<div class="title">
|
53
|
+
<span class="pre">Scenario:</span>
|
54
|
+
<span class="name">
|
55
|
+
<a href="<%= scenario.feature.filename %>"><%= scenario.value %></a>
|
56
|
+
</span>
|
57
|
+
</div>
|
58
|
+
<div class="description"><%= scenario.description %></div>
|
59
|
+
</div>
|
60
|
+
<% end %>
|
61
|
+
<% end %>
|
62
|
+
|
63
|
+
<% end %>
|
64
|
+
<% end%>
|
65
|
+
</div>
|