yard-cucumber 3.1.0 → 4.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 (33) hide show
  1. checksums.yaml +5 -5
  2. data/.yardopts +1 -0
  3. data/Gemfile +1 -1
  4. data/Gemfile.lock +20 -17
  5. data/History.txt +13 -0
  6. data/README.md +10 -10
  7. data/example/scenario_outline.feature +8 -2
  8. data/example/step_definitions/example.step.rb +13 -0
  9. data/example/transform.feature +5 -0
  10. data/lib/cucumber/city_builder.rb +64 -15
  11. data/lib/templates/default/featuretags/html/namespace.erb +32 -4
  12. data/lib/templates/default/fulldoc/html/full_list_features.erb +1 -1
  13. data/lib/templates/default/fulldoc/html/full_list_tags.erb +1 -1
  14. data/lib/templates/default/fulldoc/html/js/cucumber.js +9 -0
  15. data/lib/templates/default/fulldoc/html/setup.rb +26 -4
  16. data/lib/templates/default/tag/html/alpha_table.erb +2 -1
  17. data/lib/yard-cucumber.rb +1 -0
  18. data/lib/yard-cucumber/version.rb +1 -1
  19. data/lib/yard/code_objects/cucumber/base.rb +1 -9
  20. data/lib/yard/code_objects/cucumber/feature.rb +7 -9
  21. data/lib/yard/code_objects/cucumber/namespace_object.rb +55 -49
  22. data/lib/yard/code_objects/cucumber/scenario.rb +6 -10
  23. data/lib/yard/code_objects/cucumber/scenario_outline.rb +16 -23
  24. data/lib/yard/code_objects/cucumber/step.rb +12 -9
  25. data/lib/yard/code_objects/cucumber/tag.rb +17 -13
  26. data/lib/yard/code_objects/step_definition.rb +3 -6
  27. data/lib/yard/code_objects/step_transform.rb +3 -6
  28. data/lib/yard/code_objects/step_transformer.rb +1 -4
  29. data/lib/yard/handlers/constant_transform_handler.rb +98 -0
  30. data/lib/yard/handlers/cucumber/feature_handler.rb +1 -1
  31. data/lib/yard/handlers/step_transform_handler.rb +22 -3
  32. data/yard-cucumber.gemspec +2 -2
  33. metadata +44 -26
@@ -1,7 +1,4 @@
1
-
2
-
3
1
  module YARD::CodeObjects
4
-
5
- class StepDefinitionObject < StepTransformerObject ; end
6
-
7
- end
2
+ class StepDefinitionObject < StepTransformerObject;
3
+ end
4
+ end
@@ -1,7 +1,4 @@
1
-
2
-
3
1
  module YARD::CodeObjects
4
-
5
- class StepTransformObject < StepTransformerObject ; end
6
-
7
- end
2
+ class StepTransformObject < StepTransformerObject;
3
+ end
4
+ end
@@ -1,6 +1,4 @@
1
-
2
1
  module YARD::CodeObjects
3
-
4
2
  class StepTransformerObject < Base
5
3
 
6
4
  include Cucumber::LocationHelper
@@ -93,5 +91,4 @@ module YARD::CodeObjects
93
91
  value.gsub(/^\/|\/$/,'')
94
92
  end
95
93
  end
96
-
97
- end
94
+ end
@@ -0,0 +1,98 @@
1
+ # There might be a nicer way to decorate this class but with my limited knowledge could only get this handler
2
+ # to be applied after the default constant handler by inheriting from the default constant handler.
3
+ # This is required so that the value assigned from the transform is not overridden in the registry by the
4
+ # default handler
5
+ class YARD::Handlers::Ruby::ConstantTransformHandler < YARD::Handlers::Ruby::ConstantHandler
6
+ include YARD::Handlers::Ruby::StructHandlerMethods
7
+ handles :assign
8
+
9
+ namespace_only
10
+
11
+ process do
12
+ begin
13
+ if statement[1][0][0] == "Transform"
14
+ name = statement[0][0][0]
15
+ # Move the docstring to the transform statement
16
+ statement[1].docstring = statement.docstring
17
+ # Set the docstring on the constant to reference the transform that will be processed
18
+ statement.docstring = "Reference to {#{YARD::CodeObjects::Cucumber::CUCUMBER_STEPTRANSFORM_NAMESPACE}::#{name} transform}"
19
+ value = statement[1][1].source
20
+ value = substitute(value)
21
+ value = convert_captures(strip_anchors(value))
22
+ instance = register ConstantObject.new(namespace, name) {|o| o.source = statement; o.value = value }
23
+ # specify the owner so that the transform can use the registered constant's name
24
+ parse_block(statement[1], {:owner => instance})
25
+ elsif statement[1][0][0] == "ParameterType"
26
+ name = statement[0][0][0]
27
+ # Move the docstring to the transform statement
28
+ statement[1].docstring = statement.docstring
29
+ # Set the docstring on the constant to reference the transform that will be processed
30
+ statement.docstring = "Reference to {#{YARD::CodeObjects::Cucumber::CUCUMBER_STEPTRANSFORM_NAMESPACE}::#{name} transform}"
31
+
32
+ value = find(statement, :label, 'regexp:').parent.children[1].source
33
+
34
+ value = substitute(value)
35
+ value = convert_captures(strip_anchors(value))
36
+ instance = register ConstantObject.new(namespace, name) {|o| o.source = statement; o.value = value }
37
+ # specify the owner so that the transform can use the registered constant's name
38
+ parse_block(statement[1], {:owner => instance})
39
+ end
40
+ rescue
41
+ # This supresses any errors where any of the statement elements are out of bounds.
42
+ # In this case the or in cases where the object being assigned is not a Transform
43
+ # the default constant handler will already have performed the relevant action
44
+ end
45
+ end
46
+
47
+ private
48
+
49
+ def find(node, node_type, value)
50
+ node.traverse { |child| return(child) if node_type == child.type && child.source == value }
51
+ self
52
+ end
53
+
54
+ # Cucumber's Transform object overrides the to_s function and strips
55
+ # the anchor tags ^$ and any captures so that id it is interpolated in a step definition
56
+ # the it can appear anywhere in the step without being effected by position or captures
57
+ def convert_captures(regexp_source)
58
+ regexp_source
59
+ .gsub(/(\()(?!\?[<:=!])/,'(?:')
60
+ .gsub(/(\(\?<)(?![=!])/,'(?:<')
61
+ end
62
+
63
+ def strip_anchors(regexp_source)
64
+ regexp_source.
65
+ gsub(/(^\(\/|\/\)$)/, '').
66
+ gsub(/(^\^|\$$)/, '')
67
+ end
68
+
69
+ # Support for interpolation in the Transform's Regex
70
+ def substitute(data)
71
+ until (nested = constants_from_value(data)).empty?
72
+ nested.each {|n| data.gsub!(value_regex(n),find_value_for_constant(n)) }
73
+ end
74
+ data
75
+ end
76
+
77
+ def constants_from_value(data)
78
+ escape_pattern = /#\{\s*(\w+)\s*\}/
79
+ data.scan(escape_pattern).flatten.collect { |value| value.strip }
80
+ end
81
+
82
+ # Return a regex of the value
83
+ def value_regex(value)
84
+ /#\{\s*#{value}\s*\}/
85
+ end
86
+
87
+ def find_value_for_constant(name)
88
+ constant = YARD::Registry.all(:constant).find{|c| c.name == name.to_sym }
89
+ log.warn "ConstantTransformHandler#find_value_for_constant : Could not find the CONSTANT [#{name}] using the string value." unless constant
90
+ constant ? strip_regex_from(constant.value) : name
91
+ end
92
+
93
+ # Step the regex starting / and ending / from the value
94
+ def strip_regex_from(value)
95
+ value.gsub(/^\/|\/$/,'')
96
+ end
97
+
98
+ end
@@ -105,7 +105,7 @@ module YARD
105
105
 
106
106
  if stepdef_matches
107
107
  step.definition = stepdef_object
108
- stepdef_matches[-1..1].each do |match|
108
+ stepdef_matches[1..-1].each do |match|
109
109
  @@step_transforms.each do |steptrans,steptransform_object|
110
110
  if steptrans.match(match)
111
111
  step.transforms << steptransform_object
@@ -1,18 +1,26 @@
1
1
 
2
2
  class YARD::Handlers::Ruby::StepTransformHandler < YARD::Handlers::Ruby::Base
3
3
  handles method_call(:Transform)
4
+ handles method_call(:ParameterType)
4
5
 
5
6
  process do
6
7
 
8
+ nextStatement = nil
7
9
  instance = YARD::CodeObjects::StepTransformObject.new(step_transform_namespace,step_transformer_name) do |o|
8
10
  o.source = statement.source
9
11
  o.comments = statement.comments
10
12
  o.keyword = statement[0].source
11
- o.value = statement[1].source
13
+ if (o.keyword == 'Transform')
14
+ o.value = statement[1].source.gsub(/(^\(?\/|\/\)?$)/, '').gsub(/(^\^|\$$)/, '')
15
+ nextStatement = statement[2]
16
+ elsif (o.keyword == 'ParameterType')
17
+ o.value = find(statement, :label, 'regexp:').parent.children[1].source.gsub(/(^\(?\/|\/\)?$)/, '').gsub(/(^\^|\$$)/, '')
18
+ nextStatement = find(statement, :label, 'transformer:').parent.children[1]
19
+ end
12
20
  end
13
21
 
14
22
  obj = register instance
15
- parse_block(statement[2],:owner => obj)
23
+ parse_block(nextStatement,:owner => obj)
16
24
 
17
25
  end
18
26
 
@@ -21,11 +29,22 @@ class YARD::Handlers::Ruby::StepTransformHandler < YARD::Handlers::Ruby::Base
21
29
  end
22
30
 
23
31
  def step_transformer_name
24
- "step_transform#{self.class.generate_unique_id}"
32
+ # If the owner is a constant then we get the name of the constant so that the reference from the constant will work
33
+ if (owner.is_a?(YARD::CodeObjects::ConstantObject))
34
+ owner.name
35
+ else
36
+ "step_transform#{self.class.generate_unique_id}"
37
+ end
25
38
  end
26
39
 
27
40
  def self.generate_unique_id
28
41
  @step_transformer_count = @step_transformer_count.to_i + 1
29
42
  end
30
43
 
44
+ private
45
+
46
+ def find(node, node_type, value)
47
+ node.traverse { |child| return(child) if node_type == child.type && child.source == value }
48
+ self
49
+ end
31
50
  end
@@ -56,8 +56,8 @@ Gem::Specification.new do |s|
56
56
 
57
57
  s.add_development_dependency 'rake', '~> 10'
58
58
 
59
- s.add_dependency 'gherkin', '~> 4.0'
60
- s.add_dependency 'cucumber', '~> 2'
59
+ s.add_dependency 'gherkin', '>= 4.0', '< 6.0'
60
+ s.add_dependency 'cucumber', '>= 2.0', '< 4.0'
61
61
  s.add_dependency 'yard', '~> 0.8', '>= 0.8.1'
62
62
 
63
63
  s.rubygems_version = "1.3.7"
metadata CHANGED
@@ -1,75 +1,87 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: yard-cucumber
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.1.0
4
+ version: 4.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Franklin Webber
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-12-07 00:00:00.000000000 Z
11
+ date: 2018-02-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - ~>
17
+ - - "~>"
18
18
  - !ruby/object:Gem::Version
19
19
  version: '10'
20
20
  type: :development
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - ~>
24
+ - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: '10'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: gherkin
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - ~>
31
+ - - ">="
32
32
  - !ruby/object:Gem::Version
33
33
  version: '4.0'
34
+ - - "<"
35
+ - !ruby/object:Gem::Version
36
+ version: '6.0'
34
37
  type: :runtime
35
38
  prerelease: false
36
39
  version_requirements: !ruby/object:Gem::Requirement
37
40
  requirements:
38
- - - ~>
41
+ - - ">="
39
42
  - !ruby/object:Gem::Version
40
43
  version: '4.0'
44
+ - - "<"
45
+ - !ruby/object:Gem::Version
46
+ version: '6.0'
41
47
  - !ruby/object:Gem::Dependency
42
48
  name: cucumber
43
49
  requirement: !ruby/object:Gem::Requirement
44
50
  requirements:
45
- - - ~>
51
+ - - ">="
52
+ - !ruby/object:Gem::Version
53
+ version: '2.0'
54
+ - - "<"
46
55
  - !ruby/object:Gem::Version
47
- version: '2'
56
+ version: '4.0'
48
57
  type: :runtime
49
58
  prerelease: false
50
59
  version_requirements: !ruby/object:Gem::Requirement
51
60
  requirements:
52
- - - ~>
61
+ - - ">="
62
+ - !ruby/object:Gem::Version
63
+ version: '2.0'
64
+ - - "<"
53
65
  - !ruby/object:Gem::Version
54
- version: '2'
66
+ version: '4.0'
55
67
  - !ruby/object:Gem::Dependency
56
68
  name: yard
57
69
  requirement: !ruby/object:Gem::Requirement
58
70
  requirements:
59
- - - ~>
71
+ - - "~>"
60
72
  - !ruby/object:Gem::Version
61
73
  version: '0.8'
62
- - - '>='
74
+ - - ">="
63
75
  - !ruby/object:Gem::Version
64
76
  version: 0.8.1
65
77
  type: :runtime
66
78
  prerelease: false
67
79
  version_requirements: !ruby/object:Gem::Requirement
68
80
  requirements:
69
- - - ~>
81
+ - - "~>"
70
82
  - !ruby/object:Gem::Version
71
83
  version: '0.8'
72
- - - '>='
84
+ - - ">="
73
85
  - !ruby/object:Gem::Version
74
86
  version: 0.8.1
75
87
  description: "\n YARD-Cucumber is a YARD extension that processes Cucumber Features,
@@ -84,10 +96,11 @@ extra_rdoc_files:
84
96
  - README.md
85
97
  - History.txt
86
98
  files:
87
- - .gitignore
88
- - .rspec
89
- - .ruby-gemset
90
- - .ruby-version
99
+ - ".gitignore"
100
+ - ".rspec"
101
+ - ".ruby-gemset"
102
+ - ".ruby-version"
103
+ - ".yardopts"
91
104
  - Gemfile
92
105
  - Gemfile.lock
93
106
  - History.txt
@@ -163,6 +176,7 @@ files:
163
176
  - lib/yard/code_objects/step_definition.rb
164
177
  - lib/yard/code_objects/step_transform.rb
165
178
  - lib/yard/code_objects/step_transformer.rb
179
+ - lib/yard/handlers/constant_transform_handler.rb
166
180
  - lib/yard/handlers/cucumber/base.rb
167
181
  - lib/yard/handlers/cucumber/feature_handler.rb
168
182
  - lib/yard/handlers/legacy/step_definition_handler.rb
@@ -180,27 +194,31 @@ licenses:
180
194
  - MIT
181
195
  metadata: {}
182
196
  post_install_message: "\n(::) (::) (::) (::) (::) (::) (::) (::) (::) (::) (::) (::)
183
- (::) (::) (::)\n\n Thank you for installing yard-cucumber 3.1.0 / 2016-12-06.\n\n
184
- \ Changes:\n \n * Updates to Gherkin 4.0 and Cucumber 2.4.0\n * Fixes issues
185
- with the formatting that comes from these changes\n \n\n(::) (::) (::) (::) (::)
186
- (::) (::) (::) (::) (::) (::) (::) (::) (::) (::)\n\n"
197
+ (::) (::) (::)\n\n Thank you for installing yard-cucumber 4.0.0 / 2018-02-25.\n\n
198
+ \ Changes:\n \n * @wellavelino: Adjusts the indentation of several project classes\n
199
+ \ (https://github.com/burtlo/yard-cucumber/pull/89)\n * @elhuang: Adding example
200
+ tags and scenarios counts\n (https://github.com/burtlo/yard-cucumber/pull/87)\n
201
+ \ * @weh: Update README.md\n (https://github.com/burtlo/yard-cucumber/pull/84)\n
202
+ \ * @weh: Fix Gem Load Error\n (https://github.com/burtlo/yard-cucumber/pull/83)\n
203
+ \ * @Stephen-Kaye: Transforms with CONSTANTS\n (https://github.com/burtlo/yard-cucumber/pull/79)\n
204
+ \ \n\n(::) (::) (::) (::) (::) (::) (::) (::) (::) (::) (::) (::) (::) (::) (::)\n\n"
187
205
  rdoc_options:
188
- - --charset=UTF-8
206
+ - "--charset=UTF-8"
189
207
  require_paths:
190
208
  - lib
191
209
  required_ruby_version: !ruby/object:Gem::Requirement
192
210
  requirements:
193
- - - '>='
211
+ - - ">="
194
212
  - !ruby/object:Gem::Version
195
213
  version: '0'
196
214
  required_rubygems_version: !ruby/object:Gem::Requirement
197
215
  requirements:
198
- - - '>='
216
+ - - ">="
199
217
  - !ruby/object:Gem::Version
200
218
  version: '0'
201
219
  requirements: []
202
220
  rubyforge_project:
203
- rubygems_version: 2.0.14
221
+ rubygems_version: 2.7.6
204
222
  signing_key:
205
223
  specification_version: 4
206
224
  summary: Cucumber Features in YARD