yard-cucumber 2.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.
Files changed (84) hide show
  1. data/.rspec +3 -0
  2. data/History.txt +190 -0
  3. data/README.md +145 -0
  4. data/Rakefile +17 -0
  5. data/city.gemspec +66 -0
  6. data/example/README.md +8 -0
  7. data/example/child_feature/README.md +21 -0
  8. data/example/child_feature/child.feature +11 -0
  9. data/example/child_feature/grandchild_feature/grandchild.feature +12 -0
  10. data/example/empty.feature +2 -0
  11. data/example/scenario.feature +63 -0
  12. data/example/scenario_outline.feature +80 -0
  13. data/example/step_definitions/example.step.rb +109 -0
  14. data/example/step_definitions/first.step.rb +21 -0
  15. data/example/step_definitions/support/env.rb +7 -0
  16. data/example/step_definitions/support/env_support.rb +12 -0
  17. data/example/step_definitions/support/support.rb +6 -0
  18. data/example/tags.feature +18 -0
  19. data/example/transform.feature +13 -0
  20. data/lib/cucumber/city_builder.rb +209 -0
  21. data/lib/docserver/default/fulldoc/html/js/cucumber.js +85 -0
  22. data/lib/docserver/default/layout/html/headers.erb +13 -0
  23. data/lib/docserver/doc_server/full_list/html/full_list.erb +37 -0
  24. data/lib/docserver/doc_server/full_list/html/setup.rb +18 -0
  25. data/lib/templates/default/feature/html/feature.erb +39 -0
  26. data/lib/templates/default/feature/html/no_steps_defined.erb +1 -0
  27. data/lib/templates/default/feature/html/outline.erb +42 -0
  28. data/lib/templates/default/feature/html/pystring.erb +3 -0
  29. data/lib/templates/default/feature/html/scenario.erb +55 -0
  30. data/lib/templates/default/feature/html/setup.rb +55 -0
  31. data/lib/templates/default/feature/html/steps.erb +39 -0
  32. data/lib/templates/default/feature/html/table.erb +20 -0
  33. data/lib/templates/default/featuredirectory/html/alpha_table.erb +26 -0
  34. data/lib/templates/default/featuredirectory/html/directory.erb +32 -0
  35. data/lib/templates/default/featuredirectory/html/setup.rb +41 -0
  36. data/lib/templates/default/featuretags/html/namespace.erb +131 -0
  37. data/lib/templates/default/featuretags/html/setup.rb +34 -0
  38. data/lib/templates/default/fulldoc/html/css/common.css +214 -0
  39. data/lib/templates/default/fulldoc/html/full_list.erb +36 -0
  40. data/lib/templates/default/fulldoc/html/full_list_features.erb +28 -0
  41. data/lib/templates/default/fulldoc/html/full_list_stepdefinitions.erb +11 -0
  42. data/lib/templates/default/fulldoc/html/full_list_steps.erb +13 -0
  43. data/lib/templates/default/fulldoc/html/full_list_tags.erb +12 -0
  44. data/lib/templates/default/fulldoc/html/index.erb +24 -0
  45. data/lib/templates/default/fulldoc/html/js/cucumber.js +314 -0
  46. data/lib/templates/default/fulldoc/html/setup.rb +72 -0
  47. data/lib/templates/default/layout/html/headers.erb +14 -0
  48. data/lib/templates/default/layout/html/search.erb +7 -0
  49. data/lib/templates/default/requirements/html/alpha_table.erb +26 -0
  50. data/lib/templates/default/requirements/html/requirements.erb +50 -0
  51. data/lib/templates/default/requirements/html/setup.rb +51 -0
  52. data/lib/templates/default/steptransformers/html/header.erb +12 -0
  53. data/lib/templates/default/steptransformers/html/index.erb +10 -0
  54. data/lib/templates/default/steptransformers/html/setup.rb +94 -0
  55. data/lib/templates/default/steptransformers/html/transformers.erb +74 -0
  56. data/lib/templates/default/steptransformers/html/undefinedsteps.erb +26 -0
  57. data/lib/templates/default/tag/html/alpha_table.erb +32 -0
  58. data/lib/templates/default/tag/html/setup.rb +27 -0
  59. data/lib/templates/default/tag/html/tag.erb +35 -0
  60. data/lib/yard/code_objects/cucumber/base.rb +32 -0
  61. data/lib/yard/code_objects/cucumber/feature.rb +18 -0
  62. data/lib/yard/code_objects/cucumber/namespace_object.rb +45 -0
  63. data/lib/yard/code_objects/cucumber/scenario.rb +26 -0
  64. data/lib/yard/code_objects/cucumber/scenario_outline.rb +66 -0
  65. data/lib/yard/code_objects/cucumber/step.rb +35 -0
  66. data/lib/yard/code_objects/cucumber/tag.rb +27 -0
  67. data/lib/yard/code_objects/step_definition.rb +7 -0
  68. data/lib/yard/code_objects/step_transform.rb +7 -0
  69. data/lib/yard/code_objects/step_transformer.rb +51 -0
  70. data/lib/yard/handlers/cucumber/base.rb +22 -0
  71. data/lib/yard/handlers/cucumber/feature_handler.rb +93 -0
  72. data/lib/yard/handlers/legacy/step_definition_handler.rb +46 -0
  73. data/lib/yard/handlers/legacy/step_transform_handler.rb +24 -0
  74. data/lib/yard/handlers/step_definition_handler.rb +22 -0
  75. data/lib/yard/handlers/step_transform_handler.rb +23 -0
  76. data/lib/yard/parser/cucumber/feature.rb +46 -0
  77. data/lib/yard/parser/source_parser.rb +54 -0
  78. data/lib/yard/rake/city_task.rb +12 -0
  79. data/lib/yard/server/adapter.rb +29 -0
  80. data/lib/yard/server/commands/list_command.rb +25 -0
  81. data/lib/yard/server/router.rb +31 -0
  82. data/lib/yard/templates/helpers/base_helper.rb +26 -0
  83. data/lib/yard-cucumber.rb +53 -0
  84. metadata +173 -0
@@ -0,0 +1,314 @@
1
+ function cucumberSearchFrameLinks() {
2
+ $('#features_list_link').click(function() {
3
+ toggleSearchFrame(this, relpath + 'feature_list.html');
4
+ });
5
+ $('#tags_list_link').click(function() {
6
+ toggleSearchFrame(this, relpath + 'tag_list.html');
7
+ });
8
+ }
9
+
10
+ function cucumberKeyboardShortcuts() {
11
+ if (window.top.frames.main) return;
12
+ $(document).keypress(function(evt) {
13
+ if (evt.altKey || evt.ctrlKey || evt.metaKey || evt.shiftKey) return;
14
+ if (typeof evt.orignalTarget !== "undefined" &&
15
+ (evt.originalTarget.nodeName == "INPUT" ||
16
+ evt.originalTarget.nodeName == "TEXTAREA")) return;
17
+ switch (evt.charCode) {
18
+ case 82: case 114: $('#features_list_link').click(); break; // 'r'
19
+ case 84: case 116: $('#tags_list_link').click(); break; // 't'
20
+ }
21
+ });
22
+ }
23
+
24
+ $(cucumberSearchFrameLinks);
25
+ $(cucumberKeyboardShortcuts);
26
+
27
+
28
+ $(function() {
29
+
30
+ //
31
+ // Feature Page - Scenarios
32
+ //
33
+ $('.scenario div.title').click(function(eventObject) {
34
+ if (typeof eventObject.currentTarget !== "undefined") {
35
+ toggleScenario( $($(eventObject.currentTarget).parent()) );
36
+ }
37
+ });
38
+
39
+ //
40
+ // Developer View
41
+ // Click + Developer View = toggle the expansion of all tags, location, and comments
42
+ //
43
+ $('#view').click(function(eventObject) {
44
+
45
+ if (typeof eventObject.currentTarget !== "undefined") {
46
+ var view = eventObject.currentTarget;
47
+
48
+ if (view.innerHTML === '[More Detail]') {
49
+ $('.developer').show(500);
50
+ view.innerHTML = '[Less Detail]';
51
+ } else {
52
+ $('.developer').hide(500);
53
+ // Already hidden elements with .developer sub-elements were not getting message
54
+ $('.developer').each(function() {
55
+ $(this).css('display','none');
56
+ });
57
+ view.innerHTML = '[More Detail]';
58
+ }
59
+ }
60
+ });
61
+
62
+ //
63
+ // Expand/Collapse All
64
+ //
65
+ $('#expand').click(function(eventObject) {
66
+
67
+ if (typeof eventObject.currentTarget !== "undefined") {
68
+ if (eventObject.currentTarget.innerHTML === '[Expand All]') {
69
+ eventObject.currentTarget.innerHTML = '[Collapse All]';
70
+ $('div.scenario > div.details:hidden').each(function() {
71
+ toggleScenario( $($(this).parent()) );
72
+ });
73
+ } else {
74
+ eventObject.currentTarget.innerHTML = '[Expand All]';
75
+ $('div.scenario > div.details:visible').each(function() {
76
+ toggleScenario( $($(this).parent()) );
77
+ });
78
+ }
79
+ }
80
+ });
81
+
82
+ //
83
+ // Expand/Collapse All
84
+ //
85
+ $('#stepdefinition,#steptransform').click(function(eventObject) {
86
+
87
+ if (typeof eventObject.currentTarget !== "undefined") {
88
+ if (eventObject.currentTarget.innerHTML === '[Expand All]') {
89
+ eventObject.currentTarget.innerHTML = '[Collapse All]';
90
+ $('div.' + eventObject.currentTarget.id + ' > div.details:hidden').each(function() {
91
+ $(this).show(200);
92
+ });
93
+ } else {
94
+ eventObject.currentTarget.innerHTML = '[Expand All]';
95
+ $('div.' + eventObject.currentTarget.id + ' > div.details:visible').each(function() {
96
+ $(this).hide(200);
97
+ });
98
+ }
99
+ }
100
+ });
101
+
102
+
103
+ //
104
+ // Scenario Outlines - Toggle Examples
105
+ //
106
+ $('.outline table tr').click(function(eventObject) {
107
+
108
+ if (typeof eventObject.currentTarget !== "undefined") {
109
+ var exampleRow = $(eventObject.currentTarget);
110
+
111
+ if (eventObject.currentTarget.className.match(/example\d+/) == null) {
112
+ return false;
113
+ }
114
+
115
+ var exampleClass = eventObject.currentTarget.className.match(/example\d+/)[0];
116
+ var example = exampleRow.closest('div.details').find('.' + exampleClass);
117
+
118
+ var currentExample = null;
119
+
120
+ $('.outline table tr').each(function() {
121
+ $(this).removeClass('selected');
122
+ });
123
+
124
+ if ( example[0].style.display == 'none' ) {
125
+ currentExample = example[0];
126
+ exampleRow.addClass('selected');
127
+ } else {
128
+ currentExample = exampleRow.closest('div.details').find('.steps')[0];
129
+ }
130
+
131
+ // hide everything
132
+ exampleRow.closest('div.details').find('.steps').each(function() {
133
+ $(this).hide();
134
+ });
135
+
136
+ // show the selected
137
+ $(currentExample).show();
138
+ }
139
+ });
140
+
141
+
142
+ });
143
+
144
+
145
+ function toggleScenario(scenario) {
146
+
147
+ var state = scenario.find(".attributes input[name='collapsed']")[0];
148
+
149
+ if (state.value === 'true') {
150
+ scenario.find("div.details").each(function() {
151
+ $(this).show(500);
152
+ });
153
+ state.value = "false";
154
+ scenario.find('a.toggle').each(function() {
155
+ this.innerHTML = ' - ';
156
+ });
157
+
158
+ } else {
159
+ scenario.find("div.details").each(function() {
160
+ $(this).hide(500);
161
+ });
162
+ state.value = "true";
163
+ scenario.find('a.toggle').each(function() {
164
+ this.innerHTML = ' + ';
165
+ });
166
+ }
167
+ }
168
+
169
+
170
+ function updateTagFiltering(tagString) {
171
+ var formulaTags = determineTagsUsedInFormula(tagString);
172
+ displayExampleCommandLine(formulaTags);
173
+ displayQualifyingFeaturesAndScenarios(formulaTags);
174
+ fixSectionRowAlternations();
175
+ }
176
+
177
+ function clearTagFiltering() {
178
+ updateTagFiltering("");
179
+ }
180
+
181
+ function determineTagsUsedInFormula(tagString) {
182
+
183
+ tagString = tagString.replace(/^(\s+)|(\s+)$/,'').replace(/\s{2,}/,' ');
184
+
185
+ var tagGroup = tagString.match(/(?:~)?@\w+(,(?:~)?@\w+)*/g);
186
+
187
+ var returnTags = [];
188
+
189
+ if (tagGroup) {
190
+ tagGroup.forEach(function(tag, index, array) {
191
+ console.log("Tag Group: " + tag);
192
+ var validTags = removeInvalidTags(tag)
193
+ if (validTags != "") {
194
+ returnTags.push(validTags);
195
+ }
196
+ });
197
+ }
198
+
199
+ return returnTags;
200
+ }
201
+
202
+ function removeInvalidTags(tagGroup) {
203
+ tagGroup.split(",").forEach(function(tag, index, array) {
204
+
205
+ baseTag = tag.match(/^~(.+)/) ? tag.match(/^~(.+)/)[1] : tag;
206
+
207
+ //console.log("Validating Tag: " + tag)
208
+ if (tag_list.indexOf(baseTag) === -1) {
209
+ //console.log("Removing Tag: " + tag);
210
+ tagGroup = tagGroup.replace(new RegExp(',?' + tag + ',?'),"")
211
+ }
212
+ });
213
+
214
+ return tagGroup;
215
+ }
216
+
217
+
218
+ function displayExampleCommandLine(tags) {
219
+ $("#command_example")[0].innerHTML = "cucumber ";
220
+
221
+ if (tags.length > 0) {
222
+ $("#command_example")[0].innerHTML += "--tags " + tags.join(" --tags ");
223
+ }
224
+ }
225
+
226
+ function fixSectionRowAlternations() {
227
+ $(".feature:visible,.scenario:visible").each(function(index){
228
+ $(this).removeClass("odd even").addClass( ((index + 1) % 2 == 0 ? "even" : "odd") );
229
+ });
230
+ }
231
+
232
+ function displayQualifyingFeaturesAndScenarios(tags) {
233
+
234
+ if (tags.length > 0) {
235
+
236
+ $(".feature,.scenario").each(function(feature){
237
+ $(this).hide();
238
+ });
239
+
240
+ var tagSelectors = generateCssSelectorFromTags(tags);
241
+
242
+ tagSelectors.forEach(function(selector,selectorIndex,selectorArray) {
243
+ var tags = selector;
244
+
245
+ $(".feature." + tags).each(function(index) {
246
+ $(this).show();
247
+ });
248
+ $(".scenario." + tags).each(function(index) {
249
+ $(this).show();
250
+ $(this).parent().prev().show();
251
+ });
252
+
253
+ });
254
+
255
+ if ( $(".feature:visible,.scenario:visible").length == 0 ) {
256
+ $("#features div.undefined").show();
257
+ } else {
258
+ $("#features div.undefined").hide();
259
+ }
260
+
261
+
262
+ } else {
263
+ $(".feature:hidden,.scenario:hidden").each(function(feature){
264
+ $(this).show();
265
+ });
266
+ }
267
+
268
+ }
269
+
270
+ function generateCssSelectorFromTags(tagGroups) {
271
+
272
+ var tagSelectors = [ "" ];
273
+
274
+ tagGroups.forEach(function(tagGroup,index,array) {
275
+ var newTagSelectors = [];
276
+
277
+ tagSelectors.forEach(function(selector,selectorIndex,selectorArray) {
278
+ tagGroup.split(",").forEach(function(tag,tagIndex,tagArray) {
279
+
280
+ if ( tag.match(/^~@.+$/) ) {
281
+ tag = tag.match(/^~(@.+)$/)[1]
282
+ //console.log("selector: " + (selector + " :not(" + tag + ")").trim());
283
+ newTagSelectors.push((selector + ":not(." + tag.replace(/@/g,"\\@") +")").trim());
284
+ } else {
285
+ //console.log("selector: " + (selector + " " + tag).trim());
286
+ newTagSelectors.push((selector + "." + tag.replace(/@/g,"\\@")).trim());
287
+ }
288
+ });
289
+
290
+ });
291
+
292
+ tagSelectors = newTagSelectors;
293
+
294
+ });
295
+
296
+
297
+ return tagSelectors;
298
+ }
299
+
300
+
301
+ function createStepDefinitionLinks() {
302
+ // $('.step_instances_list').
303
+ // before("<span class='showSteps'>[<a href='#' class='toggleSteps'>View steps</a>]</span>");
304
+ $('.toggleSteps').toggle(function() {
305
+ $(this).parent().next().slideUp(100);
306
+ $(this).text("View " + $(this).attr('alt'));
307
+ },
308
+ function() {
309
+ $(this).parent().next().slideDown(100);
310
+ $(this).text("Hide " + $(this).attr('alt'));
311
+ });
312
+ }
313
+
314
+ $(createStepDefinitionLinks);
@@ -0,0 +1,72 @@
1
+ include YARD::Templates::Helpers::HtmlHelper
2
+
3
+ def init
4
+ super
5
+ asset("js/cucumber.js",file("js/cucumber.js",true))
6
+
7
+ @features = Registry.all(:feature)
8
+
9
+ if @features
10
+ @features.each {|feature| serialize(feature) }
11
+ generate_full_list @features.sort {|x,y| x.value.to_s <=> y.value.to_s }
12
+ end
13
+
14
+ @tags = Registry.all(:tag)
15
+
16
+ if @tags
17
+ @tags.each {|tag| serialize(tag) }
18
+ generate_full_list @tags.sort {|x,y| y.all_scenarios.size <=> x.all_scenarios.size }
19
+ end
20
+
21
+ feature_directories = YARD::CodeObjects::Cucumber::CUCUMBER_NAMESPACE.children.find_all {|child| child.is_a?(YARD::CodeObjects::Cucumber::FeatureDirectory) }
22
+
23
+
24
+ serialize(YARD::CodeObjects::Cucumber::CUCUMBER_NAMESPACE)
25
+ serialize(YARD::CodeObjects::Cucumber::CUCUMBER_STEPTRANSFORM_NAMESPACE)
26
+ serialize(YARD::CodeObjects::Cucumber::CUCUMBER_TAG_NAMESPACE)
27
+ serialize_feature_directories(feature_directories)
28
+
29
+ end
30
+
31
+
32
+ def generate_full_list(objects,friendly_name=nil)
33
+ if !objects.empty?
34
+ @items = objects
35
+ @list_type = "#{objects.first.type.to_s}s"
36
+ @list_title = "#{friendly_name || objects.first.type.to_s.capitalize} List"
37
+ @list_class = "class"
38
+ asset("#{objects.first.type}_list.html",erb(:full_list))
39
+ else
40
+ log.warn "Full List: Failed to create a list because the objects array is empty."
41
+ end
42
+ end
43
+
44
+ #
45
+ # Remove CUCUMBER namespace from the class list
46
+ #
47
+ def class_list(root = Registry.root)
48
+ root.instance_eval { children.delete YARD::CodeObjects::Cucumber::CUCUMBER_NAMESPACE } if root == Registry.root
49
+ out = super(root)
50
+ root.instance_eval { children << YARD::CodeObjects::Cucumber::CUCUMBER_NAMESPACE } if root == Registry.root
51
+ out
52
+ end
53
+
54
+ def serialize_feature_directories(namespaces)
55
+ namespaces.each do |namespace|
56
+ Templates::Engine.with_serializer(namespace, options[:serializer]) do
57
+ options[:object] = namespace
58
+ T('layout').run(options)
59
+ end
60
+ serialize_feature_directories(namespace.children.find_all {|child| child.is_a?(YARD::CodeObjects::Cucumber::FeatureDirectory)})
61
+ end
62
+ end
63
+
64
+ def all_features_link
65
+ root_feature_directories = YARD::CodeObjects::Cucumber::CUCUMBER_NAMESPACE.children.find_all {|child| child.is_a?(YARD::CodeObjects::Cucumber::FeatureDirectory)}
66
+
67
+ if root_feature_directories.length > 1
68
+ linkify YARD::CodeObjects::Cucumber::CUCUMBER_NAMESPACE, "All Features"
69
+ else
70
+ linkify root_feature_directories.first, "All Features"
71
+ end
72
+ end
@@ -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,7 @@
1
+ <div id="search">
2
+ <a id="features_list_link" href="#">Features</a>
3
+ <a id="tags_list_link" href="#">Tags</a>
4
+ <a id="class_list_link" href="#">Class List</a>
5
+ <a id="method_list_link" href="#">Method List</a>
6
+ <a id ="file_list_link" href="#">File List</a>
7
+ </div>
@@ -0,0 +1,26 @@
1
+ <% if @elements && !@elements.empty? %>
2
+ <% i = (@elements.length % 2 == 0 ? 1 : 0) %>
3
+ <table style="margin-left: 10px; width: 100%;">
4
+ <tr>
5
+ <td valign='top' width="50%">
6
+ <% @elements.each do |letter, objects| %>
7
+ <% if (i += 1) > (@elements.length / 2 + 1) %>
8
+ </td><td valign='top' width="50%">
9
+ <% i = 0 %>
10
+ <% end %>
11
+ <ul id="alpha_<%= letter %>" class="alpha">
12
+ <li class="letter"><%= letter %></li>
13
+ <ul>
14
+ <% objects.each do |obj| %>
15
+ <li>
16
+ <%= linkify obj, obj.value %>
17
+ <small>(<%= obj.file %>)</small>
18
+ </li>
19
+ <% end %>
20
+ </ul>
21
+ </ul>
22
+ <% end %>
23
+ </td>
24
+ </tr>
25
+ </table>
26
+ <% end %>
@@ -0,0 +1,50 @@
1
+ <% if @namespace %>
2
+ <div id="cukes_logo">&nbsp;</div>
3
+ <div id="cukes_links">
4
+ <a href="http://cukes.info/">Cucumber</a> |
5
+ <a href="http://github.com/aslakhellesoy/cucumber/wiki/Gherkin">Gherkin</a> |
6
+ <a href="http://yardoc.org/">YARD</a> |
7
+ <a href="http://github.com/burtlo/Cucumber-In-The-Yard">Cucumber-In-The-YARD</a>
8
+ </div>
9
+
10
+ <div class="requirements">
11
+
12
+ <% if features && !features.empty? %>
13
+ <%= alpha_table(features) %>
14
+ <% else %>
15
+ <!-- No Features Defined -->
16
+ <div class="none">No Features Defined</div>
17
+ <% end %>
18
+
19
+ <div id="directory" style="margin-left: 40px;">
20
+ <div class="title"><span class="name">Tags</span></div>
21
+ </div>
22
+ <div class="tags">
23
+ <%= tags.collect {|tag| linkify(tag,tag.value) }.join(",\n") %>
24
+ </div>
25
+
26
+ <% if feature_subdirectories && !feature_subdirectories.empty? %>
27
+ <div id="directory" style="margin-left: 40px;">
28
+ <div class="title"><span class="name">Subdirectories</span></div>
29
+ </div>
30
+ <%= alpha_table(feature_subdirectories) %>
31
+ <% else %>
32
+ <!-- No Feature Directories -->
33
+ <% end %>
34
+
35
+ <div id="directory" style="margin-left: 40px;">
36
+ <div class="title"><span class="name">Step Definitions &amp; Transforms</span></div>
37
+ </div>
38
+ <div class="steptransformers">
39
+ <%= step_definitions.length %>
40
+ <a href="<%= url_for step_transformers, "step_definitions" %>">Step Definitions</a>
41
+ <%= transformers.length %>
42
+ <a href="<%= url_for step_transformers, "step_transforms" %>">Transforms</a>
43
+ and <%= undefined_steps.length %>
44
+ <a href="<%= url_for step_transformers, "undefined_steps" %>">Undefined Steps</a>
45
+ </div>
46
+
47
+ </div>
48
+ <% end %>
49
+
50
+
@@ -0,0 +1,51 @@
1
+ def init
2
+ super
3
+ sections.push :requirements
4
+ @namespace = object
5
+
6
+ end
7
+
8
+ def features
9
+ @features ||= Registry.all(:feature)
10
+ end
11
+
12
+ def tags
13
+ @tags ||= Registry.all(:tag).sort_by {|l,o| l.value.to_s }
14
+ end
15
+
16
+ def feature_directories
17
+ @feature_directories ||= YARD::CodeObjects::Cucumber::CUCUMBER_NAMESPACE.children.find_all {|child| child.is_a?(YARD::CodeObjects::Cucumber::FeatureDirectory)}
18
+ end
19
+
20
+ def feature_subdirectories
21
+ @feature_subdirectories ||= Registry.all(:featuredirectory) - feature_directories
22
+ end
23
+
24
+ def step_transformers
25
+ YARD::CodeObjects::Cucumber::CUCUMBER_STEPTRANSFORM_NAMESPACE
26
+ end
27
+
28
+ def step_definitions
29
+ @step_definitions ||= YARD::Registry.all(:stepdefinition)
30
+ end
31
+
32
+ def transformers
33
+ @transformers ||= YARD::Registry.all(:steptransform)
34
+ end
35
+
36
+ def undefined_steps
37
+ @undefined_steps ||= Registry.all(:step).reject {|s| s.definition || s.scenario.outline? }
38
+ end
39
+
40
+
41
+ def alpha_table(objects)
42
+ @elements = Hash.new
43
+
44
+ objects = run_verifier(objects)
45
+ objects.each {|o| (@elements[o.value.to_s[0,1].upcase] ||= []) << o }
46
+ @elements.values.each {|v| v.sort! {|a,b| b.value.to_s <=> a.value.to_s } }
47
+ @elements = @elements.sort_by {|l,o| l.to_s }
48
+
49
+ @elements.each {|letter,objects| objects.sort! {|a,b| b.value.to_s <=> a.value.to_s }}
50
+ erb(:alpha_table)
51
+ end
@@ -0,0 +1,12 @@
1
+ <div class="title">
2
+ <% if @item_type %>
3
+ <a class="control" id="<%= @item_type.gsub(/\s/,'') %>">[Collapse All]</a>
4
+ <div style="clear: right;"></div>
5
+ <% end %>
6
+
7
+ <% if @item_anchor_name %>
8
+ <a name="<%= @item_anchor_name %>">
9
+ <% end %>
10
+ <div class="name"><%= @item_title %></div>
11
+ </div>
12
+
@@ -0,0 +1,10 @@
1
+ <div class="requirements">
2
+ <div class="title">Step Definitions &amp; Transforms</div>
3
+
4
+ <div class="summary">
5
+ <div><%= step_definitions.length %><a href="#step_definitions">Step Definitions</a></div>
6
+ <div><%= step_transforms.length %><a href="#step_transforms">Step Transforms</a></div>
7
+ <div><%= undefined_steps.length %><a href="#undefined_steps">Undefined Steps</a></div>
8
+ </div>
9
+
10
+ </div>
@@ -0,0 +1,94 @@
1
+ def init
2
+ super
3
+ sections.push :index, :stepdefinitions, :steptransforms, :undefinedsteps
4
+ end
5
+
6
+ def step_definitions
7
+ @step_definitions ||= begin
8
+ YARD::Registry.all(:stepdefinition).sort_by {|definition| definition.steps.length * -1 }
9
+ end
10
+ end
11
+
12
+ def step_transforms
13
+ @step_transforms ||= begin
14
+ YARD::Registry.all(:steptransform).sort_by {|definition| definition.steps.length * -1 }
15
+ end
16
+ end
17
+
18
+ def undefined_steps
19
+ @undefined_steps ||= begin
20
+ unique_steps(Registry.all(:step).reject {|s| s.definition || s.scenario.outline? }).sort_by{|steps| steps.last.length * -1 }
21
+ end
22
+ end
23
+
24
+ def stepdefinitions
25
+ @item_title = "Step Definitions"
26
+ @item_anchor_name = "step_definitions"
27
+ @item_type = "step definition"
28
+ @items = step_definitions
29
+ erb(:header) + erb(:transformers)
30
+ end
31
+
32
+ def steptransforms
33
+ @item_title = "Step Transforms"
34
+ @item_anchor_name = "step_transforms"
35
+ @item_type = "step transform"
36
+ @items = step_transforms
37
+ erb(:header) + erb(:transformers)
38
+ end
39
+
40
+ def undefinedsteps
41
+ @item_title = "Undefined Steps"
42
+ @item_anchor_name = "undefined_steps"
43
+ @item_type = nil
44
+ @items = undefined_steps
45
+ erb(:header) + erb(:undefinedsteps)
46
+ end
47
+
48
+
49
+ def unique_steps(steps)
50
+ uniq_steps = {}
51
+ steps.each {|s| (uniq_steps[s.value.to_s] ||= []) << s }
52
+ uniq_steps
53
+ end
54
+
55
+ def display_comments_for(item)
56
+ begin
57
+ T('docstring').run(options.dup.merge({:object => item}))
58
+ rescue
59
+ log.warn %{An error occurred while attempting to render the comments for: #{item.location} }
60
+ return ""
61
+ end
62
+
63
+ end
64
+
65
+ def link_constants(definition)
66
+ value = definition.literal_value.dup
67
+
68
+ definition.constants_from_value(value).each do |name|
69
+ constant = YARD::Registry.all(:constant).find{|c| c.name == name.to_sym }
70
+ value.gsub!(/\b#{name}\b/,"<a href='#{url_for(constant)}'>#{name}</a>") if constant
71
+ end
72
+
73
+ value
74
+ end
75
+
76
+
77
+ def link_transformed_step(step)
78
+ value = step.value.dup
79
+
80
+ if step.definition
81
+ matches = step.value.match(step.definition.regex)
82
+
83
+ if matches
84
+ matches[1..-1].reverse.each_with_index do |match,index|
85
+ next if match == nil
86
+ transform = step.transforms.find {|transform| transform.regex.match(match) }
87
+
88
+ value[matches.begin((matches.size - 1) - index)..(matches.end((matches.size - 1) - index) - 1)] = transform ? "<a href='#{url_for(transform)}'>#{h(match)}</a>" : "<span class='match'>#{match}</span>"
89
+ end
90
+ end
91
+ end
92
+
93
+ value
94
+ end