puppet-strings 0.4.0 → 0.99.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 (168) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +122 -0
  3. data/COMMITTERS.md +185 -0
  4. data/CONTRIBUTING.md +89 -0
  5. data/Gemfile +38 -0
  6. data/JSON.md +511 -0
  7. data/LICENSE +13 -0
  8. data/README.md +416 -0
  9. data/Rakefile +49 -0
  10. data/lib/puppet-strings.rb +63 -0
  11. data/lib/puppet-strings/json.rb +49 -0
  12. data/lib/puppet-strings/tasks.rb +10 -0
  13. data/lib/puppet-strings/tasks/generate.rb +23 -0
  14. data/lib/puppet-strings/tasks/gh_pages.rb +43 -0
  15. data/lib/puppet-strings/yard.rb +96 -0
  16. data/lib/puppet-strings/yard/code_objects.rb +8 -0
  17. data/lib/puppet-strings/yard/code_objects/base.rb +14 -0
  18. data/lib/puppet-strings/yard/code_objects/class.rb +59 -0
  19. data/lib/puppet-strings/yard/code_objects/defined_type.rb +58 -0
  20. data/lib/puppet-strings/yard/code_objects/function.rb +93 -0
  21. data/lib/puppet-strings/yard/code_objects/group.rb +30 -0
  22. data/lib/puppet-strings/yard/code_objects/provider.rb +93 -0
  23. data/lib/puppet-strings/yard/code_objects/type.rb +146 -0
  24. data/lib/puppet-strings/yard/handlers.rb +16 -0
  25. data/lib/puppet-strings/yard/handlers/puppet/base.rb +44 -0
  26. data/lib/puppet-strings/yard/handlers/puppet/class_handler.rb +23 -0
  27. data/lib/puppet-strings/yard/handlers/puppet/defined_type_handler.rb +23 -0
  28. data/lib/puppet-strings/yard/handlers/puppet/function_handler.rb +42 -0
  29. data/lib/puppet-strings/yard/handlers/ruby/base.rb +38 -0
  30. data/lib/puppet-strings/yard/handlers/ruby/function_handler.rb +357 -0
  31. data/lib/puppet-strings/yard/handlers/ruby/provider_handler.rb +113 -0
  32. data/lib/puppet-strings/yard/handlers/ruby/type_handler.rb +194 -0
  33. data/lib/puppet-strings/yard/parsers.rb +7 -0
  34. data/lib/puppet-strings/yard/parsers/puppet/parser.rb +70 -0
  35. data/lib/puppet-strings/yard/parsers/puppet/statement.rb +146 -0
  36. data/lib/puppet-strings/yard/tags.rb +6 -0
  37. data/lib/puppet-strings/yard/tags/overload_tag.rb +109 -0
  38. data/lib/puppet-strings/yard/tags/parameter_directive.rb +24 -0
  39. data/lib/puppet-strings/yard/tags/property_directive.rb +24 -0
  40. data/lib/puppet-strings/yard/templates/default/fulldoc/html/full_list_puppet_class.erb +9 -0
  41. data/lib/puppet-strings/yard/templates/default/fulldoc/html/full_list_puppet_defined_type.erb +9 -0
  42. data/lib/puppet-strings/yard/templates/default/fulldoc/html/full_list_puppet_function.erb +10 -0
  43. data/lib/puppet-strings/yard/templates/default/fulldoc/html/full_list_puppet_provider.erb +10 -0
  44. data/lib/puppet-strings/yard/templates/default/fulldoc/html/full_list_puppet_type.erb +9 -0
  45. data/lib/puppet-strings/yard/templates/default/fulldoc/html/setup.rb +64 -0
  46. data/lib/puppet-strings/yard/templates/default/layout/html/objects.erb +35 -0
  47. data/lib/puppet-strings/yard/templates/default/layout/html/setup.rb +172 -0
  48. data/lib/puppet-strings/yard/templates/default/puppet_class/html/box_info.erb +26 -0
  49. data/lib/puppet-strings/yard/templates/default/puppet_class/html/header.erb +1 -0
  50. data/lib/puppet-strings/yard/templates/default/puppet_class/html/overview.erb +6 -0
  51. data/lib/puppet-strings/yard/templates/default/puppet_class/html/setup.rb +14 -0
  52. data/lib/puppet-strings/yard/templates/default/puppet_class/html/source.erb +12 -0
  53. data/lib/puppet-strings/yard/templates/default/puppet_defined_type/html/box_info.erb +10 -0
  54. data/lib/puppet-strings/yard/templates/default/puppet_defined_type/html/header.erb +1 -0
  55. data/lib/puppet-strings/yard/templates/default/puppet_defined_type/html/overview.erb +6 -0
  56. data/lib/puppet-strings/yard/templates/default/puppet_defined_type/html/setup.rb +5 -0
  57. data/lib/puppet-strings/yard/templates/default/puppet_defined_type/html/source.erb +12 -0
  58. data/lib/puppet-strings/yard/templates/default/puppet_function/html/box_info.erb +14 -0
  59. data/lib/puppet-strings/yard/templates/default/puppet_function/html/header.erb +1 -0
  60. data/lib/puppet-strings/yard/templates/default/puppet_function/html/overview.erb +18 -0
  61. data/lib/puppet-strings/yard/templates/default/puppet_function/html/setup.rb +5 -0
  62. data/lib/puppet-strings/yard/templates/default/puppet_function/html/source.erb +12 -0
  63. data/lib/puppet-strings/yard/templates/default/puppet_provider/html/box_info.erb +14 -0
  64. data/lib/puppet-strings/yard/templates/default/puppet_provider/html/collection.erb +10 -0
  65. data/lib/puppet-strings/yard/templates/default/puppet_provider/html/features.erb +12 -0
  66. data/lib/puppet-strings/yard/templates/default/puppet_provider/html/header.erb +1 -0
  67. data/lib/puppet-strings/yard/templates/default/puppet_provider/html/overview.erb +6 -0
  68. data/lib/puppet-strings/yard/templates/default/puppet_provider/html/setup.rb +29 -0
  69. data/lib/puppet-strings/yard/templates/default/puppet_type/html/box_info.erb +20 -0
  70. data/lib/puppet-strings/yard/templates/default/puppet_type/html/features.erb +13 -0
  71. data/lib/puppet-strings/yard/templates/default/puppet_type/html/header.erb +1 -0
  72. data/lib/puppet-strings/yard/templates/default/puppet_type/html/overview.erb +6 -0
  73. data/lib/puppet-strings/yard/templates/default/puppet_type/html/parameters.erb +35 -0
  74. data/lib/puppet-strings/yard/templates/default/puppet_type/html/setup.rb +32 -0
  75. data/lib/puppet-strings/yard/templates/default/tags/html/puppet_overload.erb +12 -0
  76. data/lib/puppet-strings/yard/templates/default/tags/setup.rb +15 -0
  77. data/lib/puppet/application/strings.rb +1 -0
  78. data/lib/puppet/face/strings.rb +80 -39
  79. data/spec/acceptance/emit_json_options.rb +41 -0
  80. data/spec/acceptance/lib/util.rb +15 -0
  81. data/spec/acceptance/running_strings_generate.rb +54 -0
  82. data/spec/fixtures/acceptance/modules/test/functions/add.pp +9 -0
  83. data/spec/fixtures/acceptance/modules/test/lib/puppet/functions/4x_function.rb +5 -0
  84. data/spec/fixtures/acceptance/modules/test/lib/puppet/parser/functions/function3x.rb +2 -0
  85. data/spec/fixtures/acceptance/modules/test/lib/puppet/provider/server/linux.rb +9 -0
  86. data/spec/fixtures/acceptance/modules/test/lib/puppet/type/database.rb +15 -0
  87. data/spec/fixtures/acceptance/modules/test/manifests/init.pp +27 -0
  88. data/spec/fixtures/acceptance/modules/test/manifests/triple_nested_classes.pp +27 -0
  89. data/spec/fixtures/acceptance/modules/test/metadata.json +6 -0
  90. data/spec/fixtures/unit/json/output.json +348 -0
  91. data/spec/fixtures/unit/json/output_without_puppet_function.json +301 -0
  92. data/spec/spec_helper.rb +21 -0
  93. data/spec/spec_helper_acceptance.rb +27 -0
  94. data/spec/unit/puppet-strings/json_spec.rb +136 -0
  95. data/spec/unit/puppet-strings/yard/handlers/puppet/class_handler_spec.rb +155 -0
  96. data/spec/unit/puppet-strings/yard/handlers/puppet/defined_type_handler_spec.rb +155 -0
  97. data/spec/unit/puppet-strings/yard/handlers/puppet/function_handler_spec.rb +169 -0
  98. data/spec/unit/puppet-strings/yard/handlers/ruby/function_handler_spec.rb +613 -0
  99. data/spec/unit/puppet-strings/yard/handlers/ruby/provider_handler_spec.rb +90 -0
  100. data/spec/unit/puppet-strings/yard/handlers/ruby/type_handler_spec.rb +214 -0
  101. data/spec/unit/puppet-strings/yard/parsers/puppet/parser_spec.rb +171 -0
  102. metadata +115 -92
  103. data/lib/puppet-strings/rake_tasks.rb +0 -18
  104. data/lib/puppet_x/puppetlabs/strings.rb +0 -64
  105. data/lib/puppet_x/puppetlabs/strings/actions.rb +0 -92
  106. data/lib/puppet_x/puppetlabs/strings/pops/yard_statement.rb +0 -79
  107. data/lib/puppet_x/puppetlabs/strings/pops/yard_transformer.rb +0 -47
  108. data/lib/puppet_x/puppetlabs/strings/util.rb +0 -65
  109. data/lib/puppet_x/puppetlabs/strings/yard/code_objects/defined_type_object.rb +0 -33
  110. data/lib/puppet_x/puppetlabs/strings/yard/code_objects/host_class_object.rb +0 -22
  111. data/lib/puppet_x/puppetlabs/strings/yard/code_objects/method_object.rb +0 -62
  112. data/lib/puppet_x/puppetlabs/strings/yard/code_objects/provider_object.rb +0 -24
  113. data/lib/puppet_x/puppetlabs/strings/yard/code_objects/puppet_namespace_object.rb +0 -48
  114. data/lib/puppet_x/puppetlabs/strings/yard/code_objects/type_object.rb +0 -42
  115. data/lib/puppet_x/puppetlabs/strings/yard/core_ext/yard.rb +0 -40
  116. data/lib/puppet_x/puppetlabs/strings/yard/handlers/base.rb +0 -13
  117. data/lib/puppet_x/puppetlabs/strings/yard/handlers/defined_type_handler.rb +0 -31
  118. data/lib/puppet_x/puppetlabs/strings/yard/handlers/heredoc_helper.rb +0 -80
  119. data/lib/puppet_x/puppetlabs/strings/yard/handlers/host_class_handler.rb +0 -42
  120. data/lib/puppet_x/puppetlabs/strings/yard/handlers/provider_handler.rb +0 -95
  121. data/lib/puppet_x/puppetlabs/strings/yard/handlers/puppet_3x_function_handler.rb +0 -54
  122. data/lib/puppet_x/puppetlabs/strings/yard/handlers/puppet_4x_function_handler.rb +0 -234
  123. data/lib/puppet_x/puppetlabs/strings/yard/handlers/type_handler.rb +0 -295
  124. data/lib/puppet_x/puppetlabs/strings/yard/json_registry_store.rb +0 -85
  125. data/lib/puppet_x/puppetlabs/strings/yard/monkey_patches.rb +0 -68
  126. data/lib/puppet_x/puppetlabs/strings/yard/parser.rb +0 -30
  127. data/lib/puppet_x/puppetlabs/strings/yard/tags/directives.rb +0 -9
  128. data/lib/puppet_x/puppetlabs/strings/yard/templates/default/definedtype/html/docstring.erb +0 -34
  129. data/lib/puppet_x/puppetlabs/strings/yard/templates/default/definedtype/html/header.erb +0 -5
  130. data/lib/puppet_x/puppetlabs/strings/yard/templates/default/definedtype/html/parameter_details.erb +0 -6
  131. data/lib/puppet_x/puppetlabs/strings/yard/templates/default/definedtype/html/setup.rb +0 -1
  132. data/lib/puppet_x/puppetlabs/strings/yard/templates/default/definedtype/setup.rb +0 -49
  133. data/lib/puppet_x/puppetlabs/strings/yard/templates/default/fulldoc/html/full_list_class.erb +0 -2
  134. data/lib/puppet_x/puppetlabs/strings/yard/templates/default/fulldoc/html/full_list_puppet_manifest.erb +0 -1
  135. data/lib/puppet_x/puppetlabs/strings/yard/templates/default/fulldoc/html/full_list_puppet_plugin.erb +0 -21
  136. data/lib/puppet_x/puppetlabs/strings/yard/templates/default/fulldoc/html/full_list_puppet_provider.erb +0 -1
  137. data/lib/puppet_x/puppetlabs/strings/yard/templates/default/fulldoc/html/full_list_puppet_type.erb +0 -1
  138. data/lib/puppet_x/puppetlabs/strings/yard/templates/default/fulldoc/html/setup.rb +0 -82
  139. data/lib/puppet_x/puppetlabs/strings/yard/templates/default/hostclass/html/box_info.erb +0 -22
  140. data/lib/puppet_x/puppetlabs/strings/yard/templates/default/hostclass/html/setup.rb +0 -1
  141. data/lib/puppet_x/puppetlabs/strings/yard/templates/default/hostclass/html/subclasses.erb +0 -4
  142. data/lib/puppet_x/puppetlabs/strings/yard/templates/default/hostclass/setup.rb +0 -21
  143. data/lib/puppet_x/puppetlabs/strings/yard/templates/default/html_helper.rb +0 -139
  144. data/lib/puppet_x/puppetlabs/strings/yard/templates/default/layout/html/setup.rb +0 -18
  145. data/lib/puppet_x/puppetlabs/strings/yard/templates/default/method_details/html/header.erb +0 -17
  146. data/lib/puppet_x/puppetlabs/strings/yard/templates/default/method_details/setup.rb +0 -21
  147. data/lib/puppet_x/puppetlabs/strings/yard/templates/default/method_details/text/header.erb +0 -2
  148. data/lib/puppet_x/puppetlabs/strings/yard/templates/default/provider/html/command_details.erb +0 -8
  149. data/lib/puppet_x/puppetlabs/strings/yard/templates/default/provider/html/confine_details.erb +0 -10
  150. data/lib/puppet_x/puppetlabs/strings/yard/templates/default/provider/html/default_details.erb +0 -10
  151. data/lib/puppet_x/puppetlabs/strings/yard/templates/default/provider/html/docstring.erb +0 -34
  152. data/lib/puppet_x/puppetlabs/strings/yard/templates/default/provider/html/feature_details.erb +0 -10
  153. data/lib/puppet_x/puppetlabs/strings/yard/templates/default/provider/html/header.erb +0 -5
  154. data/lib/puppet_x/puppetlabs/strings/yard/templates/default/provider/html/setup.rb +0 -1
  155. data/lib/puppet_x/puppetlabs/strings/yard/templates/default/provider/setup.rb +0 -50
  156. data/lib/puppet_x/puppetlabs/strings/yard/templates/default/puppetnamespace/html/box_info.erb +0 -11
  157. data/lib/puppet_x/puppetlabs/strings/yard/templates/default/puppetnamespace/html/header.erb +0 -5
  158. data/lib/puppet_x/puppetlabs/strings/yard/templates/default/puppetnamespace/html/method_details_list.erb +0 -53
  159. data/lib/puppet_x/puppetlabs/strings/yard/templates/default/puppetnamespace/html/method_summary.erb +0 -20
  160. data/lib/puppet_x/puppetlabs/strings/yard/templates/default/puppetnamespace/html/setup.rb +0 -1
  161. data/lib/puppet_x/puppetlabs/strings/yard/templates/default/puppetnamespace/setup.rb +0 -91
  162. data/lib/puppet_x/puppetlabs/strings/yard/templates/default/template_helper.rb +0 -192
  163. data/lib/puppet_x/puppetlabs/strings/yard/templates/default/type/html/docstring.erb +0 -34
  164. data/lib/puppet_x/puppetlabs/strings/yard/templates/default/type/html/header.erb +0 -5
  165. data/lib/puppet_x/puppetlabs/strings/yard/templates/default/type/html/parameter_details.erb +0 -12
  166. data/lib/puppet_x/puppetlabs/strings/yard/templates/default/type/html/provider_details.erb +0 -10
  167. data/lib/puppet_x/puppetlabs/strings/yard/templates/default/type/html/setup.rb +0 -1
  168. data/lib/puppet_x/puppetlabs/strings/yard/templates/default/type/setup.rb +0 -55
@@ -0,0 +1,155 @@
1
+ require 'spec_helper'
2
+ require 'puppet-strings/yard'
3
+
4
+ describe PuppetStrings::Yard::Handlers::Puppet::ClassHandler do
5
+ subject {
6
+ YARD::Parser::SourceParser.parse_string(source, :puppet)
7
+ YARD::Registry.all(:puppet_class)
8
+ }
9
+
10
+ describe 'parsing source without a class definition' do
11
+ let(:source) { 'notice hi' }
12
+
13
+ it 'no classes should be in the registry' do
14
+ expect(subject.empty?).to eq(true)
15
+ end
16
+ end
17
+
18
+ describe 'parsing source with a syntax error' do
19
+ let(:source) { 'class foo{' }
20
+
21
+ it 'should log an error' do
22
+ expect{ subject }.to output(/\[error\]: Failed to parse \(stdin\): Syntax error at end of file/).to_stdout_from_any_process
23
+ expect(subject.empty?).to eq(true)
24
+ end
25
+ end
26
+
27
+ describe 'parsing a class with a missing docstring' do
28
+ let(:source) { 'class foo{}' }
29
+
30
+ it 'should log a warning' do
31
+ expect{ subject }.to output(/\[warn\]: Missing documentation for Puppet class 'foo' at \(stdin\):1\./).to_stdout_from_any_process
32
+ end
33
+ end
34
+
35
+ describe 'parsing a class with a docstring' do
36
+ let(:source) { <<-SOURCE
37
+ # A simple foo class.
38
+ # @param param1 First param.
39
+ # @param param2 Second param.
40
+ # @param param3 Third param.
41
+ class foo(Integer $param1, $param2, String $param3 = hi) inherits foo::bar {
42
+ file { '/tmp/foo':
43
+ ensure => present
44
+ }
45
+ }
46
+ SOURCE
47
+ }
48
+
49
+ it 'should register a class object' do
50
+ expect(subject.size).to eq(1)
51
+ object = subject.first
52
+ expect(object).to be_a(PuppetStrings::Yard::CodeObjects::Class)
53
+ expect(object.namespace).to eq(PuppetStrings::Yard::CodeObjects::Classes.instance)
54
+ expect(object.name).to eq(:foo)
55
+ expect(object.statement).not_to eq(nil)
56
+ expect(object.parameters).to eq([['param1', nil], ['param2', nil], ['param3', 'hi']])
57
+ expect(object.docstring).to eq('A simple foo class.')
58
+ expect(object.docstring.tags.size).to eq(4)
59
+ tags = object.docstring.tags(:param)
60
+ expect(tags.size).to eq(3)
61
+ expect(tags[0].name).to eq('param1')
62
+ expect(tags[0].text).to eq('First param.')
63
+ expect(tags[0].types).to eq(['Integer'])
64
+ expect(tags[1].name).to eq('param2')
65
+ expect(tags[1].text).to eq('Second param.')
66
+ expect(tags[1].types).to eq(['Any'])
67
+ expect(tags[2].name).to eq('param3')
68
+ expect(tags[2].text).to eq('Third param.')
69
+ expect(tags[2].types).to eq(['String'])
70
+ tags = object.docstring.tags(:api)
71
+ expect(tags.size).to eq(1)
72
+ expect(tags[0].text).to eq('public')
73
+ end
74
+ end
75
+
76
+ describe 'parsing a class with a missing parameter' do
77
+ let(:source) { <<-SOURCE
78
+ # A simple foo class.
79
+ # @param param1 First param.
80
+ # @param param2 Second param.
81
+ # @param param3 Third param.
82
+ # @param param4 missing!
83
+ class foo(Integer $param1, $param2, String $param3 = hi) inherits foo::bar {
84
+ file { '/tmp/foo':
85
+ ensure => present
86
+ }
87
+ }
88
+ SOURCE
89
+ }
90
+
91
+ it 'should output a warning' do
92
+ expect{ subject }.to output(/\[warn\]: The @param tag for parameter 'param4' has no matching parameter at \(stdin\):6\./).to_stdout_from_any_process
93
+ end
94
+ end
95
+
96
+ describe 'parsing a class with a missing @param tag' do
97
+ let(:source) { <<-SOURCE
98
+ # A simple foo class.
99
+ # @param param1 First param.
100
+ # @param param2 Second param.
101
+ class foo(Integer $param1, $param2, String $param3 = hi) inherits foo::bar {
102
+ file { '/tmp/foo':
103
+ ensure => present
104
+ }
105
+ }
106
+ SOURCE
107
+ }
108
+
109
+ it 'should output a warning' do
110
+ expect{ subject }.to output(/\[warn\]: Missing @param tag for parameter 'param3' near \(stdin\):4\./).to_stdout_from_any_process
111
+ end
112
+ end
113
+
114
+ describe 'parsing a class with a typed parameter that also has a @param tag type' do
115
+ let(:source) { <<-SOURCE
116
+ # A simple foo class.
117
+ # @param [Boolean] param1 First param.
118
+ # @param param2 Second param.
119
+ # @param param3 Third param.
120
+ class foo(Integer $param1, $param2, String $param3 = hi) inherits foo::bar {
121
+ file { '/tmp/foo':
122
+ ensure => present
123
+ }
124
+ }
125
+ SOURCE
126
+ }
127
+
128
+ it 'should output a warning' do
129
+ expect{ subject }.to output(/\[warn\]: The @param tag for parameter 'param1' should not contain a type specification near \(stdin\):5: ignoring in favor of parameter type information\./).to_stdout_from_any_process
130
+ end
131
+ end
132
+
133
+ describe 'parsing a class with a untyped parameter that also has a @param tag type' do
134
+ let(:source) { <<-SOURCE
135
+ # A simple foo class.
136
+ # @param param1 First param.
137
+ # @param [Boolean] param2 Second param.
138
+ # @param param3 Third param.
139
+ class foo(Integer $param1, $param2, String $param3 = hi) inherits foo::bar {
140
+ file { '/tmp/foo':
141
+ ensure => present
142
+ }
143
+ }
144
+ SOURCE
145
+ }
146
+
147
+ it 'should respect the type that was documented' do
148
+ expect{ subject }.to output('').to_stdout_from_any_process
149
+ expect(subject.size).to eq(1)
150
+ tags = subject.first.tags(:param)
151
+ expect(tags.size).to eq(3)
152
+ expect(tags[1].types).to eq(['Boolean'])
153
+ end
154
+ end
155
+ end
@@ -0,0 +1,155 @@
1
+ require 'spec_helper'
2
+ require 'puppet-strings/yard'
3
+
4
+ describe PuppetStrings::Yard::Handlers::Puppet::DefinedTypeHandler do
5
+ subject {
6
+ YARD::Parser::SourceParser.parse_string(source, :puppet)
7
+ YARD::Registry.all(:puppet_defined_type)
8
+ }
9
+
10
+ describe 'parsing source without a defined type definition' do
11
+ let(:source) { 'notice hi' }
12
+
13
+ it 'no defined types should be in the registry' do
14
+ expect(subject.empty?).to eq(true)
15
+ end
16
+ end
17
+
18
+ describe 'parsing source with a syntax error' do
19
+ let(:source) { 'define foo{' }
20
+
21
+ it 'should log an error' do
22
+ expect{ subject }.to output(/\[error\]: Failed to parse \(stdin\): Syntax error at end of file/).to_stdout_from_any_process
23
+ expect(subject.empty?).to eq(true)
24
+ end
25
+ end
26
+
27
+ describe 'parsing a defined type with a missing docstring' do
28
+ let(:source) { 'define foo{}' }
29
+
30
+ it 'should log a warning' do
31
+ expect{ subject }.to output(/\[warn\]: Missing documentation for Puppet defined type 'foo' at \(stdin\):1\./).to_stdout_from_any_process
32
+ end
33
+ end
34
+
35
+ describe 'parsing a defined type with a docstring' do
36
+ let(:source) { <<-SOURCE
37
+ # A simple foo defined type.
38
+ # @param param1 First param.
39
+ # @param param2 Second param.
40
+ # @param param3 Third param.
41
+ define foo(Integer $param1, $param2, String $param3 = hi) {
42
+ file { '/tmp/foo':
43
+ ensure => present
44
+ }
45
+ }
46
+ SOURCE
47
+ }
48
+
49
+ it 'should register a defined type object' do
50
+ expect(subject.size).to eq(1)
51
+ object = subject.first
52
+ expect(object).to be_a(PuppetStrings::Yard::CodeObjects::DefinedType)
53
+ expect(object.namespace).to eq(PuppetStrings::Yard::CodeObjects::DefinedTypes.instance)
54
+ expect(object.name).to eq(:foo)
55
+ expect(object.statement).not_to eq(nil)
56
+ expect(object.parameters).to eq([['param1', nil], ['param2', nil], ['param3', 'hi']])
57
+ expect(object.docstring).to eq('A simple foo defined type.')
58
+ expect(object.docstring.tags.size).to eq(4)
59
+ tags = object.docstring.tags(:param)
60
+ expect(tags.size).to eq(3)
61
+ expect(tags[0].name).to eq('param1')
62
+ expect(tags[0].text).to eq('First param.')
63
+ expect(tags[0].types).to eq(['Integer'])
64
+ expect(tags[1].name).to eq('param2')
65
+ expect(tags[1].text).to eq('Second param.')
66
+ expect(tags[1].types).to eq(['Any'])
67
+ expect(tags[2].name).to eq('param3')
68
+ expect(tags[2].text).to eq('Third param.')
69
+ expect(tags[2].types).to eq(['String'])
70
+ tags = object.docstring.tags(:api)
71
+ expect(tags.size).to eq(1)
72
+ expect(tags[0].text).to eq('public')
73
+ end
74
+ end
75
+
76
+ describe 'parsing a defined type with a missing parameter' do
77
+ let(:source) { <<-SOURCE
78
+ # A simple foo defined type.
79
+ # @param param1 First param.
80
+ # @param param2 Second param.
81
+ # @param param3 Third param.
82
+ # @param param4 missing!
83
+ define foo(Integer $param1, $param2, String $param3 = hi) {
84
+ file { '/tmp/foo':
85
+ ensure => present
86
+ }
87
+ }
88
+ SOURCE
89
+ }
90
+
91
+ it 'should output a warning' do
92
+ expect{ subject }.to output(/\[warn\]: The @param tag for parameter 'param4' has no matching parameter at \(stdin\):6\./).to_stdout_from_any_process
93
+ end
94
+ end
95
+
96
+ describe 'parsing a defined type with a missing @param tag' do
97
+ let(:source) { <<-SOURCE
98
+ # A simple foo defined type.
99
+ # @param param1 First param.
100
+ # @param param2 Second param.
101
+ define foo(Integer $param1, $param2, String $param3 = hi) {
102
+ file { '/tmp/foo':
103
+ ensure => present
104
+ }
105
+ }
106
+ SOURCE
107
+ }
108
+
109
+ it 'should output a warning' do
110
+ expect{ subject }.to output(/\[warn\]: Missing @param tag for parameter 'param3' near \(stdin\):4\./).to_stdout_from_any_process
111
+ end
112
+ end
113
+
114
+ describe 'parsing a defined type with a typed parameter that also has a @param tag type' do
115
+ let(:source) { <<-SOURCE
116
+ # A simple foo defined type.
117
+ # @param [Boolean] param1 First param.
118
+ # @param param2 Second param.
119
+ # @param param3 Third param.
120
+ define foo(Integer $param1, $param2, String $param3 = hi) {
121
+ file { '/tmp/foo':
122
+ ensure => present
123
+ }
124
+ }
125
+ SOURCE
126
+ }
127
+
128
+ it 'should output a warning' do
129
+ expect{ subject }.to output(/\[warn\]: The @param tag for parameter 'param1' should not contain a type specification near \(stdin\):5: ignoring in favor of parameter type information\./).to_stdout_from_any_process
130
+ end
131
+ end
132
+
133
+ describe 'parsing a defined type with a untyped parameter that also has a @param tag type' do
134
+ let(:source) { <<-SOURCE
135
+ # A simple foo defined type.
136
+ # @param param1 First param.
137
+ # @param [Boolean] param2 Second param.
138
+ # @param param3 Third param.
139
+ define foo(Integer $param1, $param2, String $param3 = hi) {
140
+ file { '/tmp/foo':
141
+ ensure => present
142
+ }
143
+ }
144
+ SOURCE
145
+ }
146
+
147
+ it 'should respect the type that was documented' do
148
+ expect{ subject }.to output('').to_stdout_from_any_process
149
+ expect(subject.size).to eq(1)
150
+ tags = subject.first.tags(:param)
151
+ expect(tags.size).to eq(3)
152
+ expect(tags[1].types).to eq(['Boolean'])
153
+ end
154
+ end
155
+ end
@@ -0,0 +1,169 @@
1
+ require 'spec_helper'
2
+ require 'puppet-strings/yard'
3
+
4
+ # Limit this spec to Puppet 4.1+ (when functions in Puppet were implemented)
5
+ describe PuppetStrings::Yard::Handlers::Puppet::FunctionHandler, if: TEST_PUPPET_FUNCTIONS do
6
+ subject {
7
+ YARD::Parser::SourceParser.parse_string(source, :puppet)
8
+ YARD::Registry.all(:puppet_function)
9
+ }
10
+
11
+ describe 'parsing source without a function definition' do
12
+ let(:source) { 'notice hi' }
13
+
14
+ it 'no functions should be in the registry' do
15
+ expect(subject.empty?).to eq(true)
16
+ end
17
+ end
18
+
19
+ describe 'parsing source with a syntax error' do
20
+ let(:source) { 'function foo{' }
21
+
22
+ it 'should log an error' do
23
+ expect{ subject }.to output(/\[error\]: Failed to parse \(stdin\): Syntax error at end of file/).to_stdout_from_any_process
24
+ expect(subject.empty?).to eq(true)
25
+ end
26
+ end
27
+
28
+ describe 'parsing a function with a missing docstring' do
29
+ let(:source) { 'function foo{}' }
30
+
31
+ it 'should log a warning' do
32
+ expect{ subject }.to output(/\[warn\]: Missing documentation for Puppet function 'foo' at \(stdin\):1\./).to_stdout_from_any_process
33
+ end
34
+ end
35
+
36
+ describe 'parsing a function with a docstring' do
37
+ let(:source) { <<-SOURCE
38
+ # A simple foo function.
39
+ # @param param1 First param.
40
+ # @param param2 Second param.
41
+ # @param param3 Third param.
42
+ # @return [Undef] Returns nothing.
43
+ function foo(Integer $param1, $param2, String $param3 = hi) {
44
+ notice 'hello world'
45
+ undef
46
+ }
47
+ SOURCE
48
+ }
49
+
50
+ it 'should register a function object' do
51
+ expect(subject.size).to eq(1)
52
+ object = subject.first
53
+ expect(object).to be_a(PuppetStrings::Yard::CodeObjects::Function)
54
+ expect(object.namespace).to eq(PuppetStrings::Yard::CodeObjects::Functions.instance(PuppetStrings::Yard::CodeObjects::Function::PUPPET))
55
+ expect(object.name).to eq(:foo)
56
+ expect(object.signature).to eq('foo(Integer $param1, Any $param2, String $param3 = hi)')
57
+ expect(object.parameters).to eq([['param1', nil], ['param2', nil], ['param3', 'hi']])
58
+ expect(object.docstring).to eq('A simple foo function.')
59
+ expect(object.docstring.tags.size).to eq(5)
60
+ tags = object.docstring.tags(:param)
61
+ expect(tags.size).to eq(3)
62
+ expect(tags[0].name).to eq('param1')
63
+ expect(tags[0].text).to eq('First param.')
64
+ expect(tags[0].types).to eq(['Integer'])
65
+ expect(tags[1].name).to eq('param2')
66
+ expect(tags[1].text).to eq('Second param.')
67
+ expect(tags[1].types).to eq(['Any'])
68
+ expect(tags[2].name).to eq('param3')
69
+ expect(tags[2].text).to eq('Third param.')
70
+ expect(tags[2].types).to eq(['String'])
71
+ tags = object.docstring.tags(:api)
72
+ expect(tags.size).to eq(1)
73
+ expect(tags[0].text).to eq('public')
74
+ end
75
+ end
76
+
77
+ describe 'parsing a function with a missing parameter' do
78
+ let(:source) { <<-SOURCE
79
+ # A simple foo function.
80
+ # @param param1 First param.
81
+ # @param param2 Second param.
82
+ # @param param3 Third param.
83
+ # @param param4 missing!
84
+ # @return [Undef] Returns nothing.
85
+ function foo(Integer $param1, $param2, String $param3 = hi) {
86
+ notice 'hello world'
87
+ }
88
+ SOURCE
89
+ }
90
+
91
+ it 'should output a warning' do
92
+ expect{ subject }.to output(/\[warn\]: The @param tag for parameter 'param4' has no matching parameter at \(stdin\):7\./).to_stdout_from_any_process
93
+ end
94
+ end
95
+
96
+ describe 'parsing a function with a missing @param tag' do
97
+ let(:source) { <<-SOURCE
98
+ # A simple foo function.
99
+ # @param param1 First param.
100
+ # @param param2 Second param.
101
+ # @return [Undef] Returns nothing.
102
+ function foo(Integer $param1, $param2, String $param3 = hi) {
103
+ notice 'hello world'
104
+ }
105
+ SOURCE
106
+ }
107
+
108
+ it 'should output a warning' do
109
+ expect{ subject }.to output(/\[warn\]: Missing @param tag for parameter 'param3' near \(stdin\):5\./).to_stdout_from_any_process
110
+ end
111
+ end
112
+
113
+ describe 'parsing a function with a typed parameter that also has a @param tag type' do
114
+ let(:source) { <<-SOURCE
115
+ # A simple foo function.
116
+ # @param [Boolean] param1 First param.
117
+ # @param param2 Second param.
118
+ # @param param3 Third param.
119
+ # @return [Undef] Returns nothing.
120
+ function foo(Integer $param1, $param2, String $param3 = hi) {
121
+ notice 'hello world'
122
+ }
123
+ SOURCE
124
+ }
125
+
126
+ it 'should output a warning' do
127
+ expect{ subject }.to output(/\[warn\]: The @param tag for parameter 'param1' should not contain a type specification near \(stdin\):6: ignoring in favor of parameter type information\./).to_stdout_from_any_process
128
+ end
129
+ end
130
+
131
+ describe 'parsing a function with a untyped parameter that also has a @param tag type' do
132
+ let(:source) { <<-SOURCE
133
+ # A simple foo function.
134
+ # @param param1 First param.
135
+ # @param [Boolean] param2 Second param.
136
+ # @param param3 Third param.
137
+ # @return [Undef] Returns nothing.
138
+ function foo(Integer $param1, $param2, String $param3 = hi) {
139
+ notice 'hello world'
140
+ }
141
+ SOURCE
142
+ }
143
+
144
+ it 'should respect the type that was documented' do
145
+ expect{ subject }.to output('').to_stdout_from_any_process
146
+ expect(subject.size).to eq(1)
147
+ tags = subject.first.tags(:param)
148
+ expect(tags.size).to eq(3)
149
+ expect(tags[1].types).to eq(['Boolean'])
150
+ end
151
+ end
152
+
153
+ describe 'parsing a function with a missing @return tag' do
154
+ let(:source) { <<-SOURCE
155
+ # A simple foo function.
156
+ # @param param1 First param.
157
+ # @param param2 Second param.
158
+ # @param param3 Third param.
159
+ function foo(Integer $param1, $param2, String $param3 = hi) {
160
+ notice 'hello world'
161
+ }
162
+ SOURCE
163
+ }
164
+
165
+ it 'should output a warning' do
166
+ expect{ subject }.to output(/\[warn\]: Missing @return tag near \(stdin\):5\./).to_stdout_from_any_process
167
+ end
168
+ end
169
+ end