cucumber-in-the-yard 1.6.1 → 1.6.3
Sign up to get free protection for your applications and to get access to all the features.
- data/History.txt +13 -0
- data/README.md +27 -50
- data/example/child_feature/grandchild_feature/scenario.feature +52 -0
- data/example/child_feature/scenario.feature +52 -0
- data/example/scenario.feature +51 -0
- data/example/scenario_outline.feature +60 -0
- data/example/step_definitions/example.step.rb +7 -2
- data/example/step_definitions/first.step.rb +15 -0
- data/example/step_definitions/support/support.rb +6 -0
- data/example/transform.feature +13 -0
- data/lib/city.rb +2 -1
- data/lib/cucumber/city_builder.rb +10 -0
- data/lib/templates/default/feature/html/no_steps_defined.erb +1 -1
- data/lib/templates/default/feature/html/outline.erb +36 -29
- data/lib/templates/default/feature/html/scenario.erb +1 -1
- data/lib/templates/default/feature/html/steps.erb +20 -8
- data/lib/templates/default/feature/html/table.erb +16 -16
- data/lib/templates/default/feature/setup.rb +1 -1
- data/lib/templates/default/{tags → featuretags}/html/namespace.erb +0 -0
- data/lib/templates/default/{tags → featuretags}/html/setup.rb +0 -0
- data/lib/templates/default/fulldoc/html/css/common.css +25 -5
- data/lib/templates/default/requirements/html/namespace.erb +47 -34
- data/lib/templates/default/requirements/html/setup.rb +16 -5
- data/lib/templates/default/steptransformers/html/transformers.erb +5 -0
- data/lib/templates/default/steptransformers/html/undefined_steps.erb +30 -0
- data/lib/templates/default/steptransformers/setup.rb +17 -7
- data/lib/yard/code_objects/cucumber/namespace_object.rb +2 -2
- data/lib/yard/code_objects/step_definition.rb +2 -35
- data/lib/yard/code_objects/step_transform.rb +1 -34
- data/lib/yard/code_objects/step_transformer.rb +50 -0
- data/lib/yard/handlers/cucumber/feature_handler.rb +1 -1
- data/lib/yard/handlers/step_definition_handler.rb +0 -36
- data/lib/yard/handlers/step_transform_handler.rb +1 -33
- metadata +27 -22
- data/.autotest +0 -15
- data/autotest/discover.rb +0 -3
- data/example/example.third.feature +0 -33
- data/example/first_example.feature +0 -19
- data/example/second_example.feature +0 -51
- data/example/sub_features/second_example.feature +0 -51
- data/spec/city/feature_parser_spec_examples.rb +0 -153
- data/spec/city/gherkin_loader_spec.rb +0 -39
- data/spec/city/test.feature +0 -36
- data/spec/city/yard_handlers_cucumber_spec.rb +0 -24
- data/spec/city/yard_namespace_object_spec.rb +0 -8
- data/spec/city/yard_parser_cucumber_spec.rb +0 -215
- data/spec/city/yard_rb_extensions_spec.rb +0 -128
- data/spec/spec_helper.rb +0 -5
File without changes
|
File without changes
|
@@ -12,7 +12,7 @@
|
|
12
12
|
.meta { margin-left: 30px; color: gray; }
|
13
13
|
.scenario .meta .tags { margin-left: 0px; }
|
14
14
|
|
15
|
-
.feature .description, .requirements .summary {
|
15
|
+
.feature .description, .requirements .summary, .scenario .description, #background .description {
|
16
16
|
margin: 10px 20px 0px 30px;
|
17
17
|
padding: 10px 20px 20px 10px;
|
18
18
|
color: #343332;
|
@@ -57,24 +57,26 @@
|
|
57
57
|
font-size: 12px;
|
58
58
|
}
|
59
59
|
|
60
|
-
.scenario .step, #background .step {
|
60
|
+
.scenario .step, #background .step, .steps .none {
|
61
61
|
margin-top: 4px;
|
62
62
|
padding: 4px;
|
63
63
|
font-size: 14px;
|
64
64
|
font-weight: bold;
|
65
65
|
}
|
66
|
+
.steps .none { color: #5D5C5B; }
|
67
|
+
|
66
68
|
|
67
69
|
#background .title .name {}
|
68
70
|
#background .description {}
|
69
71
|
|
70
72
|
.scenario .title .name {}
|
71
|
-
.scenario .description {}
|
73
|
+
.scenario .description { }
|
72
74
|
|
73
75
|
.scenario .title .pre { color: #00AAD2; }
|
74
76
|
.scenario .tags { margin-left: 30px; margin-top: 10px; }
|
75
77
|
|
76
78
|
.step .predicate { color: #5D5C5B; }
|
77
|
-
|
79
|
+
/*.step .undefined { border-bottom: 1px dashed #E99494; }*/
|
78
80
|
.step .defined {}
|
79
81
|
.step .details { float: right; color: #343332; }
|
80
82
|
.step .details .pre {}
|
@@ -141,9 +143,27 @@
|
|
141
143
|
width: 762px; text-align: center;
|
142
144
|
padding: 10px;
|
143
145
|
}
|
146
|
+
|
144
147
|
#cukes_logo {
|
145
148
|
margin: 0px auto 10px auto;
|
146
149
|
width: 762px;
|
147
150
|
height: 190px;
|
148
151
|
background: url(data:image/png;base64,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%3D) no-repeat center left;
|
149
|
-
}
|
152
|
+
}
|
153
|
+
|
154
|
+
.valid {
|
155
|
+
margin: 0px auto 10px auto;
|
156
|
+
width: 15px;
|
157
|
+
height: 15px;
|
158
|
+
background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA8AAAAPCAIAAAC0tAIdAAAACXBIWXMAAA86AAAPOgGXOdvCAAABVklEQVQoFS2RO1IEMQxEJY+zzSDZlCNwAQIOxJm4DReAnICIIuFTW7U7lsxreTUzHltqtVqyPzw/HQ+3Oaebpc16EospszJ+OfP7/NePh5vHu/sRMfHw2RwxLjHOcQnlJHg42L9+vncIImOPQTbQOXPPHBmRE3o5RQMZwexmvig5pxFTMkqoLllaSZa/5ewgAoA4QEgrgXqXc9ELvbs1iItVNMCh4RgW1GzWoAaHEXV3lJjzwFeiqXD1OAjXUrjmzMw70MbrqFI5WBaTUKUbnDcW4TUTpIugcmBjg5wliRblb0gSoMO1ApxKkWrzXadmtrl6K98UN/takaLJMEGmFMtHmtMRHXCma8kXWd0cN5L7HHtdPIIJ1fAlFevcDcrFJ2JmPFYdVimTJOnQFZq45S9Xeb1tbettU6+a9WqnemLeX6ffl483BcjFdN01eyFFVHK0/FxO/9H/ezlUKYH7AAAAAElFTkSuQmCC) no-repeat center;
|
159
|
+
|
160
|
+
}
|
161
|
+
|
162
|
+
.invalid {
|
163
|
+
margin: 0px auto 10px auto;
|
164
|
+
width: 15px;
|
165
|
+
height: 15px;
|
166
|
+
background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA8AAAAPCAIAAAC0tAIdAAAACXBIWXMAAA86AAAPOgGXOdvCAAABWUlEQVQoFS2SvVEEMQyFJdkspFcCVAAVUREZXVAHHRAwZOQwQ3YM67X4nnwe3+3afn+S18/P9366s5yZ042R6c3c3bRKDw+WwZxf791Pt/3hMcev5QBpFtauPLoBYrYr6zcem/Xr8frUbc4c59zPPoekQeSesTm47IaD74kfTjnDbNqxC5pTzrJfQcCFBQClIh7bIdDc9S+6E8WIQXTl9somfA1S4iJVbUnJmyOhJT+51AMRkXVArMtBdUNLGcpmaReDdSIGHw4m2iyNIiMslTWqBvMuZSVZB4QhMRRp6IUjzYuPctvq3TpWumq2sIfNw/KQ3DwomfIv6aVBT+ZQMFKxhB8uLfhlzkO3Sstlwh1ja3+oEKVuqipGHhMztEGvvlZEQHwyMKPD1NDtrrpBR3jbalv90hWzo05FBr1vlKGXtvGF9fz5HG8vFRpK1a5yV0/KVuZSzO+Pf3G6tVs/+L00AAAAAElFTkSuQmCC) no-repeat center;
|
167
|
+
}
|
168
|
+
|
169
|
+
.conflicted {}
|
@@ -19,55 +19,68 @@
|
|
19
19
|
<%= tags.collect {|tag| linkify(tag,tag.value) }.join(",\n") %>
|
20
20
|
</div>
|
21
21
|
|
22
|
-
|
23
|
-
<div
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
<
|
28
|
-
<
|
29
|
-
|
30
|
-
<%
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
<
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
22
|
+
<% if features && !features.empty? %>
|
23
|
+
<div id="features" style="margin-left: 40px;">
|
24
|
+
<div class="title"><span class="name">Features</span></div>
|
25
|
+
</div>
|
26
|
+
<% i = 0 %>
|
27
|
+
<table style="margin-left: 10px;">
|
28
|
+
<tr>
|
29
|
+
<td valign='top' width="50%">
|
30
|
+
<% all_features_by_letter.sort_by {|l,o| l.to_s }.each do |letter, objects| %>
|
31
|
+
<% if (i += 1) % 13 == 0 %>
|
32
|
+
</td><td valign='top' width="50%">
|
33
|
+
<% i = 0 %>
|
34
|
+
<% end %>
|
35
|
+
<ul id="alpha_<%= letter %>" class="alpha">
|
36
|
+
<li class="letter"><%= letter %></li>
|
37
|
+
<ul>
|
38
|
+
<% objects.each do |obj| %>
|
39
|
+
<li>
|
40
|
+
<%= linkify obj, obj.value %>
|
41
|
+
<small>(<%= obj.file %>)</small>
|
42
|
+
</li>
|
43
|
+
<% end %>
|
44
|
+
</ul>
|
43
45
|
</ul>
|
44
|
-
|
45
|
-
|
46
|
-
</
|
47
|
-
</
|
48
|
-
|
46
|
+
<% end %>
|
47
|
+
</td>
|
48
|
+
</tr>
|
49
|
+
</table>
|
50
|
+
<% else %>
|
51
|
+
<!-- No Features Defined -->
|
52
|
+
<% end %>
|
49
53
|
|
50
|
-
<% if
|
54
|
+
<% if feature_directories && !feature_directories.empty? %>
|
51
55
|
<div id="directory" style="margin-left: 40px;">
|
52
56
|
<div class="title"><span class="name">Subdirectories</span></div>
|
53
57
|
</div>
|
54
58
|
<% i = 0 %>
|
55
59
|
<table style="margin-left: 10px;">
|
56
60
|
<tr>
|
57
|
-
<td valign='top' width="
|
58
|
-
<%
|
59
|
-
<% if (i += 1) %
|
60
|
-
</td><td valign='top' width="
|
61
|
+
<td valign='top' width="50%">
|
62
|
+
<% all_directories_by_letter.sort_by {|l,o| l.to_s }.each do |letter, objects| %>
|
63
|
+
<% if (i += 1) % 13 == 0 %>
|
64
|
+
</td><td valign='top' width="50%">
|
61
65
|
<% i = 0 %>
|
62
66
|
<% end %>
|
63
|
-
<ul>
|
64
|
-
|
67
|
+
<ul id="alpha_<%= letter %>" class="alpha">
|
68
|
+
<li class="letter"><%= letter %></li>
|
69
|
+
<ul>
|
70
|
+
<% objects.each do |obj| %>
|
71
|
+
<li>
|
72
|
+
<%= linkify obj, obj.value %>
|
73
|
+
<small>(<%= obj.file %>)</small>
|
74
|
+
</li>
|
75
|
+
<% end %>
|
76
|
+
</ul>
|
65
77
|
</ul>
|
66
78
|
<% end %>
|
67
79
|
</td>
|
68
80
|
</tr>
|
69
81
|
</table>
|
70
|
-
|
82
|
+
<% else %>
|
83
|
+
<!-- No Feature Directories -->
|
71
84
|
<% end %>
|
72
85
|
|
73
86
|
</div>
|
@@ -6,7 +6,6 @@ def init
|
|
6
6
|
end
|
7
7
|
|
8
8
|
def namespace
|
9
|
-
@directories = Registry.all(:featuredirectory)
|
10
9
|
erb(:namespace)
|
11
10
|
end
|
12
11
|
|
@@ -18,18 +17,30 @@ def all_features_by_letter
|
|
18
17
|
hash
|
19
18
|
end
|
20
19
|
|
20
|
+
def all_directories_by_letter
|
21
|
+
hash = {}
|
22
|
+
objects = feature_directories
|
23
|
+
objects = run_verifier(objects)
|
24
|
+
objects.each {|o| (hash[o.value.to_s[0,1].upcase] ||= []) << o }
|
25
|
+
hash
|
26
|
+
end
|
27
|
+
|
28
|
+
def feature_directories
|
29
|
+
@feature_directories ||= Registry.all(:featuredirectory)
|
30
|
+
end
|
31
|
+
|
21
32
|
def features
|
22
|
-
Registry.all(:feature)
|
33
|
+
@features ||= Registry.all(:feature)
|
23
34
|
end
|
24
35
|
|
25
36
|
def scenarios
|
26
|
-
Registry.all(:scenario)
|
37
|
+
@scenarios ||= Registry.all(:scenario)
|
27
38
|
end
|
28
39
|
|
29
40
|
def steps
|
30
|
-
Registry.all(:step)
|
41
|
+
@steps ||= Registry.all(:step)
|
31
42
|
end
|
32
43
|
|
33
44
|
def tags
|
34
|
-
Registry.all(:tag)
|
45
|
+
@tags ||= Registry.all(:tag)
|
35
46
|
end
|
@@ -34,7 +34,12 @@
|
|
34
34
|
<% if item.steps && !item.steps.empty? %>
|
35
35
|
<% item.steps.each_with_index do |step,step_index| %>
|
36
36
|
<div class="step <%= (step_index + 1) % 2 == 0 ? 'even' : 'odd' %>">
|
37
|
+
<span class="predicate">
|
38
|
+
<%= step.keyword %>
|
39
|
+
</span>
|
40
|
+
<span class="defined">
|
37
41
|
<%= link_transformed_step(step) %>
|
42
|
+
</span>
|
38
43
|
<div class="details"><a href="<%= url_for step.scenario.feature %>"><%= h(step.location) %></a></div>
|
39
44
|
</div>
|
40
45
|
<% end %>
|
@@ -0,0 +1,30 @@
|
|
1
|
+
|
2
|
+
<div style="margin: 10px;"> </div>
|
3
|
+
|
4
|
+
<div id="undefined_steps" class="title">
|
5
|
+
<div class="name">Undefined Steps</div>
|
6
|
+
</div>
|
7
|
+
|
8
|
+
<div style="margin: 10px;"> </div>
|
9
|
+
|
10
|
+
<div class="stepdef">
|
11
|
+
<div class="steps">
|
12
|
+
<% if @undefined_steps && !@undefined_steps.empty? %>
|
13
|
+
<% @undefined_steps.each_with_index do |step,step_index| %>
|
14
|
+
<div class="step <%= (step_index + 1) % 2 == 0 ? 'even' : 'odd' %>">
|
15
|
+
<span class="predicate"><%= step.keyword %></span>
|
16
|
+
<span class="undefined">
|
17
|
+
<%= h step.value %>
|
18
|
+
</span>
|
19
|
+
<div class="details">
|
20
|
+
<a href="<%= url_for step.scenario.feature %>"><%= h(step.location) %></a>
|
21
|
+
</div>
|
22
|
+
</div>
|
23
|
+
<% end %>
|
24
|
+
<% else %>
|
25
|
+
<div class="steps">
|
26
|
+
<span class="undefined">No undefined steps</span>
|
27
|
+
</div>
|
28
|
+
<% end%>
|
29
|
+
</div>
|
30
|
+
</div>
|
@@ -1,6 +1,6 @@
|
|
1
1
|
def init
|
2
2
|
super
|
3
|
-
sections.push :steptransformers, [:stepdefinitions, :steptransforms]
|
3
|
+
sections.push :steptransformers, [:stepdefinitions, :steptransforms], :undefined_steps
|
4
4
|
end
|
5
5
|
|
6
6
|
|
@@ -18,17 +18,27 @@ def steptransforms
|
|
18
18
|
erb(:transformers)
|
19
19
|
end
|
20
20
|
|
21
|
+
def undefined_steps
|
22
|
+
@undefined_steps ||= Registry.all(:step).reject {|s| s.definition || s.scenario.outline? }
|
23
|
+
erb(:undefined_steps)
|
24
|
+
end
|
25
|
+
|
21
26
|
|
22
27
|
def link_transformed_step(step)
|
23
|
-
value =
|
28
|
+
value = step.value
|
24
29
|
|
25
|
-
if step.
|
26
|
-
step.value.match(
|
27
|
-
|
28
|
-
|
30
|
+
if step.definition
|
31
|
+
matches = step.value.match(step.definition.regex)
|
32
|
+
|
33
|
+
if matches
|
34
|
+
matches[1..-1].reverse.each_with_index do |match,index|
|
35
|
+
next if match == nil
|
36
|
+
transform = step.transforms.find {|transform| transform.regex.match(match) }
|
37
|
+
|
38
|
+
value[matches.begin((matches.size - 1) - index)..(matches.end((matches.size - 1) - index) - 1)] = transform ? "<a href='#{url_for(transform)}'>#{match}</a>" : "<span class='match'>#{match}</span>"
|
29
39
|
end
|
30
40
|
end
|
31
41
|
end
|
32
|
-
|
42
|
+
|
33
43
|
value
|
34
44
|
end
|
@@ -7,7 +7,7 @@ module YARD::CodeObjects::Cucumber
|
|
7
7
|
end
|
8
8
|
|
9
9
|
class Requirements < NamespaceObject ; end
|
10
|
-
class
|
10
|
+
class FeatureTags < NamespaceObject ; end
|
11
11
|
class StepTransformersObject < NamespaceObject ; end
|
12
12
|
|
13
13
|
class FeatureDirectory < YARD::CodeObjects::NamespaceObject
|
@@ -21,7 +21,7 @@ module YARD::CodeObjects::Cucumber
|
|
21
21
|
|
22
22
|
CUCUMBER_NAMESPACE = Requirements.new(:root, "requirements")
|
23
23
|
|
24
|
-
CUCUMBER_TAG_NAMESPACE =
|
24
|
+
CUCUMBER_TAG_NAMESPACE = FeatureTags.new(CUCUMBER_NAMESPACE, "tags")
|
25
25
|
|
26
26
|
CUCUMBER_STEPTRANSFORM_NAMESPACE = StepTransformersObject.new(CUCUMBER_NAMESPACE, "step_transformers")
|
27
27
|
|
@@ -2,39 +2,6 @@
|
|
2
2
|
|
3
3
|
module YARD::CodeObjects
|
4
4
|
|
5
|
-
class StepDefinitionObject <
|
6
|
-
|
7
|
-
|
8
|
-
attr_reader :constants, :keyword, :source, :value
|
9
|
-
attr_accessor :steps
|
10
|
-
|
11
|
-
def value=(value)
|
12
|
-
@value = format_source(value)
|
13
|
-
@constants = {}
|
14
|
-
@steps = []
|
15
|
-
@compare_value = nil
|
16
|
-
end
|
17
|
-
|
18
|
-
def compare_value
|
19
|
-
unless @compare_value
|
20
|
-
@compare_value = value.gsub(/^\/|\/$/,'')
|
21
|
-
@constants.each do |name,value|
|
22
|
-
@compare_value.gsub!(/\#\{\s*#{name.to_s}\s*\}/,value.gsub(/^\/|\/$/,''))
|
23
|
-
end
|
24
|
-
end
|
25
|
-
@compare_value
|
26
|
-
end
|
27
|
-
|
28
|
-
def _value_constants(data=@value)
|
29
|
-
data.scan(/\#\{([^\}]+)\}/).flatten.collect { |value| value.strip }
|
30
|
-
end
|
31
|
-
|
32
|
-
def constants=(value)
|
33
|
-
value.each do |val|
|
34
|
-
@constants[val.name.to_s] = val if val.respond_to?(:name) && val.respond_to?(:value)
|
35
|
-
end
|
36
|
-
end
|
37
|
-
|
38
|
-
end
|
39
|
-
|
5
|
+
class StepDefinitionObject < StepTransformerObject ; end
|
6
|
+
|
40
7
|
end
|
@@ -2,39 +2,6 @@
|
|
2
2
|
|
3
3
|
module YARD::CodeObjects
|
4
4
|
|
5
|
-
class StepTransformObject <
|
6
|
-
include Cucumber::LocationHelper
|
7
|
-
|
8
|
-
attr_reader :constants, :source, :value
|
9
|
-
attr_accessor :steps
|
10
|
-
|
11
|
-
def value=(value)
|
12
|
-
@value = format_source(value)
|
13
|
-
@constants = {}
|
14
|
-
@steps = []
|
15
|
-
@compare_value = nil
|
16
|
-
end
|
17
|
-
|
18
|
-
def compare_value
|
19
|
-
unless @compare_value
|
20
|
-
@compare_value = value.gsub(/^\/|\/$/,'')
|
21
|
-
@constants.each do |name,value|
|
22
|
-
@compare_value.gsub!(/\#\{\s*#{name.to_s}\s*\}/,value.gsub(/^\/|\/$/,''))
|
23
|
-
end
|
24
|
-
end
|
25
|
-
@compare_value
|
26
|
-
end
|
27
|
-
|
28
|
-
def _value_constants(data=@value)
|
29
|
-
data.scan(/\#\{([^\}]+)\}/).flatten.collect { |value| value.strip }
|
30
|
-
end
|
31
|
-
|
32
|
-
def constants=(value)
|
33
|
-
value.each do |val|
|
34
|
-
@constants[val.name.to_s] = val if val.respond_to?(:name) && val.respond_to?(:value)
|
35
|
-
end
|
36
|
-
end
|
37
|
-
|
38
|
-
end
|
5
|
+
class StepTransformObject < StepTransformerObject ; end
|
39
6
|
|
40
7
|
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
|
2
|
+
module YARD::CodeObjects
|
3
|
+
|
4
|
+
class StepTransformerObject < Base
|
5
|
+
|
6
|
+
include Cucumber::LocationHelper
|
7
|
+
|
8
|
+
attr_reader :constants, :keyword, :source, :value
|
9
|
+
attr_accessor :steps
|
10
|
+
|
11
|
+
ESCAPE_PATTERN = /#\{\s*(\w+)\s*\}/
|
12
|
+
|
13
|
+
def value=(value)
|
14
|
+
@value = format_source(value)
|
15
|
+
|
16
|
+
until (nested = constants_from_value).empty?
|
17
|
+
nested.each {|n| @value.gsub!(value_regex(n),find_value_for_constant(n)) }
|
18
|
+
end
|
19
|
+
|
20
|
+
@steps = []
|
21
|
+
end
|
22
|
+
|
23
|
+
def regex
|
24
|
+
@regex ||= /#{strip_regex_from(@value)}/
|
25
|
+
end
|
26
|
+
|
27
|
+
def constants_from_value(data=@value)
|
28
|
+
data.scan(ESCAPE_PATTERN).flatten.collect { |value| value.strip }
|
29
|
+
end
|
30
|
+
|
31
|
+
protected
|
32
|
+
|
33
|
+
def find_value_for_constant(name)
|
34
|
+
constant = YARD::Registry.all(:constant).find{|c| c.name == name.to_sym }
|
35
|
+
log.warn "StepTransformer#find_value_for_constant : Could not find the CONSTANT #{name} using an empty string for value." unless constant
|
36
|
+
constant ? strip_regex_from(constant.value) : ""
|
37
|
+
end
|
38
|
+
|
39
|
+
def value_regex(value)
|
40
|
+
/#\{\s*#{value}\s*\}/
|
41
|
+
end
|
42
|
+
|
43
|
+
def strip_regex_from(value)
|
44
|
+
value.gsub(/^\/|\/$/,'')
|
45
|
+
end
|
46
|
+
|
47
|
+
|
48
|
+
end
|
49
|
+
|
50
|
+
end
|
@@ -19,48 +19,12 @@ class StepDefinitionHandler < YARD::Handlers::Ruby::Legacy::Base
|
|
19
19
|
o.keyword = keyword
|
20
20
|
end
|
21
21
|
|
22
|
-
# TODO: Currently I have not devised a good way to declare them or show them
|
23
|
-
#find_steps_defined_in_block(statement.block)
|
24
|
-
|
25
|
-
begin
|
26
|
-
@constants = YARD::Registry.all(:constant)
|
27
|
-
|
28
|
-
# Look for all constants within the step definitions
|
29
|
-
stepdef_instance._value_constants.each do |stepdef_constant|
|
30
|
-
@constants.each do |constant|
|
31
|
-
if stepdef_constant.to_sym == constant.name
|
32
|
-
#log.debug "Constant #{constant.name} was found in the step definition #{stepdef_instance.value}, attempting to replace that value"
|
33
|
-
returned_constant = unpack_constants(constant.value)
|
34
|
-
#log.debug "CONSTANT: #{constant.name}\nFINAL: #{returned_constant}"
|
35
|
-
stepdef_instance.constants[constant.name] = unpack_constants(constant.value)
|
36
|
-
end
|
37
|
-
end
|
38
|
-
end
|
39
|
-
|
40
|
-
rescue Exception => e
|
41
|
-
log.error "Failed to link step definition to constants. This will make step definition to step linking impossible if constants are present. #{e}"
|
42
|
-
end
|
43
|
-
|
44
|
-
|
45
22
|
obj = register stepdef_instance
|
46
23
|
parse_block :owner => obj
|
47
24
|
|
48
25
|
rescue YARD::Handlers::NamespaceMissingError
|
49
26
|
end
|
50
27
|
|
51
|
-
|
52
|
-
def unpack_constants(constant_value)
|
53
|
-
constant_value.scan(/\#\{([^\}]+)\}/).flatten.collect { |value| value.strip }.each do |inner_constant|
|
54
|
-
inner_constant_match = @constants.find {|constant| constant.name.to_s == inner_constant }
|
55
|
-
if inner_constant_match
|
56
|
-
constant_value.gsub!(/\#\{#{inner_constant}\}/,unpack_constants(inner_constant_match.value))
|
57
|
-
end
|
58
|
-
end
|
59
|
-
|
60
|
-
constant_value.gsub!(/^('|"|\/)|('|"|\/)$/,'')
|
61
|
-
constant_value
|
62
|
-
end
|
63
|
-
|
64
28
|
#
|
65
29
|
# Step Definitions can contain defined steps within them. While it is likely that they could not
|
66
30
|
# very easily be parsed because of variables that are only calculated at runtime, it would be nice
|
@@ -15,44 +15,12 @@ class StepTransformHandler < YARD::Handlers::Ruby::Legacy::Base
|
|
15
15
|
o.value = transform
|
16
16
|
o.keyword = "Transform"
|
17
17
|
end
|
18
|
-
|
19
|
-
log.debug "Step Tranform: #{instance}"
|
20
|
-
|
21
|
-
begin
|
22
|
-
@constants = YARD::Registry.all(:constant)
|
23
|
-
|
24
|
-
# Look for all constants within the step transforms
|
25
|
-
instance._value_constants.each do |instance_constants|
|
26
|
-
@constants.each do |constant|
|
27
|
-
if instance_constants.to_sym == constant.name
|
28
|
-
returned_constant = unpack_constants(constant.value)
|
29
|
-
instance.constants[constant.name] = unpack_constants(constant.value)
|
30
|
-
end
|
31
|
-
end
|
32
|
-
end
|
33
|
-
|
34
|
-
rescue Exception => e
|
35
|
-
log.error "Failed to link step transform to constants. This will make step transform to step linking impossible if constants are present. #{e}"
|
36
|
-
end
|
37
|
-
|
18
|
+
|
38
19
|
obj = register instance
|
39
20
|
parse_block :owner => obj
|
40
21
|
|
41
22
|
rescue YARD::Handlers::NamespaceMissingError
|
42
23
|
end
|
43
24
|
|
44
|
-
|
45
|
-
def unpack_constants(constant_value)
|
46
|
-
constant_value.scan(/\#\{([^\}]+)\}/).flatten.collect { |value| value.strip }.each do |inner_constant|
|
47
|
-
inner_constant_match = @constants.find {|constant| constant.name.to_s == inner_constant }
|
48
|
-
if inner_constant_match
|
49
|
-
constant_value.gsub!(/\#\{#{inner_constant}\}/,unpack_constants(inner_constant_match.value))
|
50
|
-
end
|
51
|
-
end
|
52
|
-
|
53
|
-
constant_value.gsub!(/^('|"|\/)|('|"|\/)$/,'')
|
54
|
-
constant_value
|
55
|
-
end
|
56
|
-
|
57
25
|
end
|
58
26
|
|