yard-cucumber2 2.3.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (93) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +6 -0
  3. data/.rspec +3 -0
  4. data/.ruby-gemset +1 -0
  5. data/.ruby-version +1 -0
  6. data/Gemfile +5 -0
  7. data/Gemfile.lock +37 -0
  8. data/History.txt +274 -0
  9. data/LICENSE.txt +22 -0
  10. data/README.md +188 -0
  11. data/Rakefile +25 -0
  12. data/example/README.md +8 -0
  13. data/example/child_feature/README.md +21 -0
  14. data/example/child_feature/child.feature +11 -0
  15. data/example/child_feature/grandchild_feature/grandchild.feature +12 -0
  16. data/example/empty.feature +2 -0
  17. data/example/french.feature +18 -0
  18. data/example/scenario.feature +63 -0
  19. data/example/scenario_outline.feature +94 -0
  20. data/example/scenario_outline_multi.feature +15 -0
  21. data/example/step_definitions/example.step.rb +109 -0
  22. data/example/step_definitions/first.step.rb +21 -0
  23. data/example/step_definitions/french_steps.rb +32 -0
  24. data/example/step_definitions/struct.rb +11 -0
  25. data/example/step_definitions/support/env.rb +7 -0
  26. data/example/step_definitions/support/env_support.rb +12 -0
  27. data/example/step_definitions/support/support.rb +6 -0
  28. data/example/tags.feature +18 -0
  29. data/example/transform.feature +13 -0
  30. data/lib/cucumber/city_builder.rb +331 -0
  31. data/lib/docserver/default/fulldoc/html/js/cucumber.js +85 -0
  32. data/lib/docserver/default/layout/html/headers.erb +14 -0
  33. data/lib/docserver/doc_server/full_list/html/full_list.erb +39 -0
  34. data/lib/docserver/doc_server/full_list/html/setup.rb +18 -0
  35. data/lib/templates/default/feature/html/feature.erb +39 -0
  36. data/lib/templates/default/feature/html/no_steps_defined.erb +1 -0
  37. data/lib/templates/default/feature/html/outline.erb +56 -0
  38. data/lib/templates/default/feature/html/pystring.erb +3 -0
  39. data/lib/templates/default/feature/html/scenario.erb +55 -0
  40. data/lib/templates/default/feature/html/setup.rb +55 -0
  41. data/lib/templates/default/feature/html/steps.erb +39 -0
  42. data/lib/templates/default/feature/html/table.erb +20 -0
  43. data/lib/templates/default/featuredirectory/html/alpha_table.erb +30 -0
  44. data/lib/templates/default/featuredirectory/html/directory.erb +32 -0
  45. data/lib/templates/default/featuredirectory/html/setup.rb +41 -0
  46. data/lib/templates/default/featuretags/html/namespace.erb +131 -0
  47. data/lib/templates/default/featuretags/html/setup.rb +34 -0
  48. data/lib/templates/default/fulldoc/html/css/cucumber.css +227 -0
  49. data/lib/templates/default/fulldoc/html/directories.erb +53 -0
  50. data/lib/templates/default/fulldoc/html/full_list_featuredirectories.erb +11 -0
  51. data/lib/templates/default/fulldoc/html/full_list_features.erb +29 -0
  52. data/lib/templates/default/fulldoc/html/full_list_stepdefinitions.erb +16 -0
  53. data/lib/templates/default/fulldoc/html/full_list_steps.erb +17 -0
  54. data/lib/templates/default/fulldoc/html/full_list_tags.erb +12 -0
  55. data/lib/templates/default/fulldoc/html/js/cucumber.js +305 -0
  56. data/lib/templates/default/fulldoc/html/setup.rb +175 -0
  57. data/lib/templates/default/layout/html/setup.rb +56 -0
  58. data/lib/templates/default/requirements/html/alpha_table.erb +26 -0
  59. data/lib/templates/default/requirements/html/requirements.erb +50 -0
  60. data/lib/templates/default/requirements/html/setup.rb +51 -0
  61. data/lib/templates/default/steptransformers/html/header.erb +12 -0
  62. data/lib/templates/default/steptransformers/html/index.erb +10 -0
  63. data/lib/templates/default/steptransformers/html/setup.rb +94 -0
  64. data/lib/templates/default/steptransformers/html/transformers.erb +79 -0
  65. data/lib/templates/default/steptransformers/html/undefinedsteps.erb +26 -0
  66. data/lib/templates/default/tag/html/alpha_table.erb +32 -0
  67. data/lib/templates/default/tag/html/setup.rb +27 -0
  68. data/lib/templates/default/tag/html/tag.erb +35 -0
  69. data/lib/yard-cucumber.rb +47 -0
  70. data/lib/yard-cucumber/version.rb +3 -0
  71. data/lib/yard/code_objects/cucumber/base.rb +32 -0
  72. data/lib/yard/code_objects/cucumber/feature.rb +18 -0
  73. data/lib/yard/code_objects/cucumber/namespace_object.rb +49 -0
  74. data/lib/yard/code_objects/cucumber/scenario.rb +26 -0
  75. data/lib/yard/code_objects/cucumber/scenario_outline.rb +75 -0
  76. data/lib/yard/code_objects/cucumber/step.rb +38 -0
  77. data/lib/yard/code_objects/cucumber/tag.rb +27 -0
  78. data/lib/yard/code_objects/step_definition.rb +7 -0
  79. data/lib/yard/code_objects/step_transform.rb +7 -0
  80. data/lib/yard/code_objects/step_transformer.rb +97 -0
  81. data/lib/yard/handlers/cucumber/base.rb +21 -0
  82. data/lib/yard/handlers/cucumber/feature_handler.rb +131 -0
  83. data/lib/yard/handlers/legacy/step_definition_handler.rb +45 -0
  84. data/lib/yard/handlers/legacy/step_transform_handler.rb +24 -0
  85. data/lib/yard/handlers/step_definition_handler.rb +86 -0
  86. data/lib/yard/handlers/step_transform_handler.rb +31 -0
  87. data/lib/yard/parser/cucumber/feature.rb +73 -0
  88. data/lib/yard/server/adapter.rb +43 -0
  89. data/lib/yard/server/commands/list_command.rb +31 -0
  90. data/lib/yard/server/router.rb +32 -0
  91. data/lib/yard/templates/helpers/base_helper.rb +26 -0
  92. data/yard-cucumber.gemspec +65 -0
  93. metadata +199 -0
@@ -0,0 +1,27 @@
1
+ def init
2
+ super
3
+ @tag = object
4
+
5
+ sections.push :tag
6
+ end
7
+
8
+ def features
9
+ @tag.features
10
+ end
11
+
12
+ def scenarios
13
+ @tag.scenarios
14
+ end
15
+
16
+
17
+ def alpha_table(objects)
18
+ @elements = Hash.new
19
+
20
+ objects = run_verifier(objects)
21
+ objects.each {|o| (@elements[o.value.to_s[0,1].upcase] ||= []) << o }
22
+ @elements.values.each {|v| v.sort! {|a,b| b.value.to_s <=> a.value.to_s } }
23
+ @elements = @elements.sort_by {|l,o| l.to_s }
24
+
25
+ @elements.each {|letter,objects| objects.sort! {|a,b| b.value.to_s <=> a.value.to_s }}
26
+ erb(:alpha_table)
27
+ end
@@ -0,0 +1,35 @@
1
+ <div class="tag">
2
+ <div class="title">
3
+ <span class="pre">Tag:</span>
4
+ <span class="name"><%= @tag.value %></span>
5
+
6
+ </div>
7
+
8
+ <div class="meta">
9
+ <div class="file">
10
+ <%= @tag.features.size > 0 ? "#{@tag.features.size} feature#{@tag.features.size > 1 ? 's' : ''} (with #{@tag.indirect_scenarios.size} scenario#{@tag.indirect_scenarios.size > 1 ? 's' : ''})" : "" %>
11
+ <%= " and " if @tag.features.size > 0 && @tag.scenarios.size > 0 %>
12
+ <%= @tag.scenarios.size > 0 ? "#{@tag.scenarios.size} scenario#{@tag.scenarios.size > 1 ? 's' : ''}" : "" %>
13
+ </div>
14
+ </div>
15
+
16
+ <div style="margin-top: 20px;">&nbsp;</div>
17
+
18
+ <% if features && !features.empty? %>
19
+ <div id="features" style="margin-left: 40px;">
20
+ <div class="title"><span class="name">Features</span></div>
21
+ </div>
22
+ <%= alpha_table(features) %>
23
+
24
+ <% end %>
25
+
26
+ <% if scenarios && !scenarios.empty? %>
27
+ <div id="features" style="margin-left: 40px;">
28
+ <div class="title"><span class="name">Scenarios</span></div>
29
+ </div>
30
+ <%= alpha_table(scenarios) %>
31
+
32
+ <% end %>
33
+
34
+
35
+ </div>
@@ -0,0 +1,47 @@
1
+ require 'cucumber/platform'
2
+ require 'gherkin/parser/parser'
3
+ require 'gherkin/formatter/tag_count_formatter'
4
+
5
+ require File.dirname(__FILE__) + "/yard-cucumber/version.rb"
6
+
7
+ require File.dirname(__FILE__) + "/yard/code_objects/cucumber/base.rb"
8
+ require File.dirname(__FILE__) + "/yard/code_objects/cucumber/namespace_object.rb"
9
+ require File.dirname(__FILE__) + "/yard/code_objects/cucumber/feature.rb"
10
+ require File.dirname(__FILE__) + "/yard/code_objects/cucumber/scenario_outline.rb"
11
+ require File.dirname(__FILE__) + "/yard/code_objects/cucumber/scenario.rb"
12
+ require File.dirname(__FILE__) + "/yard/code_objects/cucumber/step.rb"
13
+ require File.dirname(__FILE__) + "/yard/code_objects/cucumber/tag.rb"
14
+
15
+ require File.dirname(__FILE__) + "/cucumber/city_builder.rb"
16
+
17
+ require File.dirname(__FILE__) + "/yard/code_objects/step_transformer.rb"
18
+ require File.dirname(__FILE__) + "/yard/code_objects/step_definition.rb"
19
+ require File.dirname(__FILE__) + "/yard/code_objects/step_transform.rb"
20
+
21
+ require File.dirname(__FILE__) + "/yard/parser/cucumber/feature.rb"
22
+
23
+ require File.dirname(__FILE__) + "/yard/handlers/cucumber/base.rb"
24
+ require File.dirname(__FILE__) + "/yard/handlers/cucumber/feature_handler.rb"
25
+
26
+ if RUBY19
27
+ require File.dirname(__FILE__) + "/yard/handlers/step_definition_handler.rb"
28
+ require File.dirname(__FILE__) + "/yard/handlers/step_transform_handler.rb"
29
+ end
30
+
31
+ require File.dirname(__FILE__) + "/yard/handlers/legacy/step_definition_handler.rb"
32
+ require File.dirname(__FILE__) + "/yard/handlers/legacy/step_transform_handler.rb"
33
+
34
+ #require File.dirname(__FILE__) + "/yard/parser/source_parser.rb"
35
+ require File.dirname(__FILE__) + "/yard/templates/helpers/base_helper.rb"
36
+
37
+ require File.dirname(__FILE__) + "/yard/server/adapter.rb"
38
+ require File.dirname(__FILE__) + "/yard/server/commands/list_command.rb"
39
+ require File.dirname(__FILE__) + "/yard/server/router.rb"
40
+
41
+
42
+ # This registered template works for yardoc
43
+ YARD::Templates::Engine.register_template_path File.dirname(__FILE__) + '/templates'
44
+
45
+ # The following static paths and templates are for yard server
46
+ YARD::Server.register_static_path File.dirname(__FILE__) + "/templates/default/fulldoc/html"
47
+ YARD::Server.register_static_path File.dirname(__FILE__) + "/docserver/default/fulldoc/html"
@@ -0,0 +1,3 @@
1
+ module CucumberInTheYARD
2
+ VERSION = '2.3.2'
3
+ end
@@ -0,0 +1,32 @@
1
+
2
+ module YARD::CodeObjects::Cucumber
3
+
4
+ module LocationHelper
5
+
6
+ def line_number
7
+ files.first.last
8
+ end
9
+
10
+ def file
11
+ files.first.first if files && !files.empty?
12
+ end
13
+
14
+ def location
15
+ "#{file}:#{line_number}"
16
+ end
17
+
18
+ end
19
+
20
+ class Base < YARD::CodeObjects::Base
21
+ include LocationHelper
22
+
23
+ def path
24
+ @value || super
25
+ end
26
+
27
+ end
28
+
29
+
30
+
31
+ end
32
+
@@ -0,0 +1,18 @@
1
+
2
+
3
+ module YARD::CodeObjects::Cucumber
4
+
5
+ class Feature < NamespaceObject
6
+
7
+ attr_accessor :background, :comments, :description, :keyword, :scenarios, :tags, :value
8
+
9
+ def initialize(namespace,name)
10
+ @comments = ""
11
+ @scenarios = []
12
+ @tags = []
13
+ super(namespace,name.to_s.strip)
14
+ end
15
+
16
+ end
17
+
18
+ end
@@ -0,0 +1,49 @@
1
+
2
+ module YARD::CodeObjects::Cucumber
3
+
4
+ class NamespaceObject < YARD::CodeObjects::NamespaceObject
5
+ include LocationHelper
6
+ def value ; nil ; end
7
+ end
8
+
9
+ class Requirements < NamespaceObject ; end
10
+ class FeatureTags < NamespaceObject ; end
11
+ class StepTransformersObject < NamespaceObject ; end
12
+
13
+ class FeatureDirectory < YARD::CodeObjects::NamespaceObject
14
+
15
+ attr_accessor :description
16
+
17
+ def initialize(namespace,name)
18
+ super(namespace,name)
19
+ @description = ""
20
+ end
21
+
22
+ def location
23
+ files.first.first if files && !files.empty?
24
+ end
25
+
26
+ def expanded_path
27
+ to_s.split('::')[1..-1].join('/')
28
+ end
29
+
30
+ def value ; name ; end
31
+
32
+ def features
33
+ children.find_all {|d| d.is_a?(Feature) }
34
+ end
35
+
36
+ def subdirectories
37
+ subdirectories = children.find_all {|d| d.is_a?(FeatureDirectory) }
38
+ subdirectories + subdirectories.collect {|s| s.subdirectories }.flatten
39
+ end
40
+
41
+ end
42
+
43
+ CUCUMBER_NAMESPACE = Requirements.new(:root, "requirements") unless defined?(CUCUMBER_NAMESPACE)
44
+
45
+ CUCUMBER_TAG_NAMESPACE = FeatureTags.new(CUCUMBER_NAMESPACE, "tags") unless defined?(CUCUMBER_TAG_NAMESPACE)
46
+
47
+ CUCUMBER_STEPTRANSFORM_NAMESPACE = StepTransformersObject.new(CUCUMBER_NAMESPACE, "step_transformers") unless defined?(CUCUMBER_STEPTRANSFORM_NAMESPACE)
48
+
49
+ end
@@ -0,0 +1,26 @@
1
+
2
+
3
+ module YARD::CodeObjects::Cucumber
4
+
5
+ class Scenario < NamespaceObject
6
+
7
+ attr_accessor :value, :comments, :keyword, :description, :steps, :tags, :feature
8
+
9
+ def initialize(namespace,name)
10
+ super(namespace,name.to_s.strip)
11
+ @comments = @description = @keyword = @value = @feature = nil
12
+ @steps = []
13
+ @tags = []
14
+ end
15
+
16
+ def background?
17
+ @keyword == "Background"
18
+ end
19
+
20
+ def outline?
21
+ false
22
+ end
23
+
24
+ end
25
+
26
+ end
@@ -0,0 +1,75 @@
1
+
2
+
3
+ module YARD::CodeObjects::Cucumber
4
+
5
+ class ScenarioOutline < NamespaceObject
6
+
7
+ attr_accessor :value, :comments, :keyword, :description, :steps, :tags, :feature
8
+ attr_accessor :scenarios, :examples
9
+
10
+ def initialize(namespace,name)
11
+ super(namespace,name.to_s.strip)
12
+ @comments = @description = @value = @feature = nil
13
+ @steps = []
14
+ @tags = []
15
+ @scenarios = []
16
+ @examples = []
17
+ end
18
+
19
+ def background?
20
+ false
21
+ end
22
+
23
+ def outline?
24
+ true
25
+ end
26
+
27
+ def examples?
28
+ @examples.find {|example| example.rows }
29
+ end
30
+
31
+
32
+ class Examples
33
+
34
+ attr_accessor :name, :line, :keyword, :comments, :rows
35
+
36
+ # The first row of the rows contains the headers for the table
37
+ def headers
38
+ rows.first
39
+ end
40
+
41
+ # The data of the table starts at the second row. When there is no data then
42
+ # return a empty string.
43
+ def data
44
+ rows ? rows[1..-1] : ""
45
+ end
46
+
47
+ def values_for_row(row)
48
+ hash = {}
49
+
50
+ headers.each_with_index do |header,index|
51
+ hash[header] = data[row][index]
52
+ end
53
+
54
+ hash
55
+ end
56
+
57
+ def to_hash
58
+ hash = {}
59
+
60
+ rows.each_with_index do |header,index|
61
+ hash[header] = rows.collect {|row| row[index] }
62
+ end
63
+
64
+ hash
65
+ end
66
+
67
+ def initialize(parameters = {})
68
+ parameters.each {|key,value| send("#{key.to_sym}=",value) if respond_to? "#{key.to_sym}=" }
69
+ end
70
+
71
+ end
72
+
73
+ end
74
+
75
+ end
@@ -0,0 +1,38 @@
1
+
2
+
3
+ module YARD::CodeObjects::Cucumber
4
+
5
+ class Step < Base
6
+
7
+ attr_accessor :comments, :definition, :examples, :keyword, :scenario, :table, :text, :transforms, :value
8
+
9
+ def initialize(namespace,name)
10
+ super(namespace,name.to_s.strip)
11
+ @comments = @definition = @description = @keyword = @table = @text = @value = nil
12
+ @examples = {}
13
+ @transforms = []
14
+ end
15
+
16
+ def has_table?
17
+ !@table.nil?
18
+ end
19
+
20
+ def has_text?
21
+ !@text.nil?
22
+ end
23
+
24
+ def definition=(stepdef)
25
+ @definition = stepdef
26
+
27
+ unless stepdef.steps.map(&:files).include?(files)
28
+ stepdef.steps << self
29
+ end
30
+ end
31
+
32
+ def transformed?
33
+ !@transforms.empty?
34
+ end
35
+
36
+ end
37
+
38
+ end
@@ -0,0 +1,27 @@
1
+
2
+
3
+ module YARD::CodeObjects::Cucumber
4
+
5
+ class Tag < NamespaceObject
6
+
7
+ attr_accessor :value, :owners
8
+
9
+ def features
10
+ @owners.find_all{|owner| owner.is_a?(Feature) }
11
+ end
12
+
13
+ def scenarios
14
+ @owners.find_all{|owner| owner.is_a?(Scenario) || owner.is_a?(ScenarioOutline) }
15
+ end
16
+
17
+ def indirect_scenarios
18
+ @owners.find_all{|owner| owner.is_a?(Feature) }.collect {|feature| feature.scenarios }.flatten
19
+ end
20
+
21
+ def all_scenarios
22
+ scenarios + indirect_scenarios
23
+ end
24
+
25
+ end
26
+
27
+ end
@@ -0,0 +1,7 @@
1
+
2
+
3
+ module YARD::CodeObjects
4
+
5
+ class StepDefinitionObject < StepTransformerObject ; end
6
+
7
+ end
@@ -0,0 +1,7 @@
1
+
2
+
3
+ module YARD::CodeObjects
4
+
5
+ class StepTransformObject < StepTransformerObject ; end
6
+
7
+ end
@@ -0,0 +1,97 @@
1
+
2
+ module YARD::CodeObjects
3
+
4
+ class StepTransformerObject < Base
5
+
6
+ include Cucumber::LocationHelper
7
+
8
+ attr_reader :constants, :keyword, :source, :value, :literal_value
9
+ attr_accessor :steps, :pending, :substeps
10
+
11
+ # This defines an escape pattern within a string or regex:
12
+ # /^the first #{CONSTANT} step$/
13
+ #
14
+ # This is used below in the value to process it if there happen to be
15
+ # constants defined here.
16
+ #
17
+ # @note this does not handle the result of method calls
18
+ # @note this does not handle multiple constants within the same escaped area
19
+ #
20
+ def escape_pattern
21
+ /#\{\s*(\w+)\s*\}/
22
+ end
23
+
24
+ #
25
+ # When requesting a step tranformer object value, process it, if it hasn't
26
+ # alredy been processed, replacing any constants that may be lurking within
27
+ # the value.
28
+ #
29
+ # Processing it means looking for any escaped characters that happen to be
30
+ # CONSTANTS that could be matched and then replaced. This is done recursively
31
+ # as CONSTANTS can be defined with more CONSTANTS.
32
+ #
33
+ def value
34
+ unless @processed
35
+ @processed = true
36
+ until (nested = constants_from_value).empty?
37
+ nested.each {|n| @value.gsub!(value_regex(n),find_value_for_constant(n)) }
38
+ end
39
+ end
40
+
41
+ @value
42
+ end
43
+
44
+ #
45
+ # Set the literal value and the value of the step definition.
46
+ #
47
+ # The literal value is as it appears in the step definition file with any
48
+ # constants. The value, when retrieved will attempt to replace those
49
+ # constants with their regex or string equivalents to hopefully match more
50
+ # steps and step definitions.
51
+ #
52
+ #
53
+ def value=(value)
54
+ @literal_value = format_source(value)
55
+ @value = format_source(value)
56
+
57
+ @steps = []
58
+ value
59
+ end
60
+
61
+ # Generate a regex with the step transformers value
62
+ def regex
63
+ @regex ||= /#{strip_regex_from(value)}/
64
+ end
65
+
66
+ # Look through the specified data for the escape pattern and return an array
67
+ # of those constants found. This defaults to the @value within step transformer
68
+ # as it is used internally, however, it can be called externally if it's
69
+ # needed somewhere.
70
+ def constants_from_value(data=@value)
71
+ data.scan(escape_pattern).flatten.collect { |value| value.strip }
72
+ end
73
+
74
+ protected
75
+
76
+ #
77
+ # Looking through all the constants in the registry and returning the value
78
+ # with the regex items replaced from the constnat if present
79
+ #
80
+ def find_value_for_constant(name)
81
+ constant = YARD::Registry.all(:constant).find{|c| c.name == name.to_sym }
82
+ log.warn "StepTransformer#find_value_for_constant : Could not find the CONSTANT [#{name}] using the string value." unless constant
83
+ constant ? strip_regex_from(constant.value) : name
84
+ end
85
+
86
+ # Return a regex of the value
87
+ def value_regex(value)
88
+ /#\{\s*#{value}\s*\}/
89
+ end
90
+
91
+ # Step the regex starting / and ending / from the value
92
+ def strip_regex_from(value)
93
+ value.gsub(/^\/|\/$/,'')
94
+ end
95
+ end
96
+
97
+ end