yard-cucumber 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
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