puppet-strings 2.5.0 → 2.9.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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +90 -4
- data/COMMITTERS.md +17 -17
- data/CONTRIBUTING.md +6 -6
- data/README.md +10 -10
- data/lib/puppet/application/strings.rb +2 -0
- data/lib/puppet/face/strings.rb +4 -1
- data/lib/puppet/feature/rgen.rb +2 -0
- data/lib/puppet/feature/yard.rb +2 -0
- data/lib/puppet-strings/describe.rb +2 -0
- data/lib/puppet-strings/json.rb +2 -0
- data/lib/puppet-strings/markdown/base.rb +11 -3
- data/lib/puppet-strings/markdown/data_type.rb +2 -0
- data/lib/puppet-strings/markdown/data_types.rb +3 -1
- data/lib/puppet-strings/markdown/defined_type.rb +2 -0
- data/lib/puppet-strings/markdown/defined_types.rb +3 -1
- data/lib/puppet-strings/markdown/function.rb +9 -7
- data/lib/puppet-strings/markdown/functions.rb +3 -1
- data/lib/puppet-strings/markdown/puppet_class.rb +2 -0
- data/lib/puppet-strings/markdown/puppet_classes.rb +3 -1
- data/lib/puppet-strings/markdown/puppet_plan.rb +2 -0
- data/lib/puppet-strings/markdown/puppet_plans.rb +3 -1
- data/lib/puppet-strings/markdown/puppet_task.rb +2 -0
- data/lib/puppet-strings/markdown/puppet_tasks.rb +3 -1
- data/lib/puppet-strings/markdown/resource_type.rb +2 -0
- data/lib/puppet-strings/markdown/resource_types.rb +3 -1
- data/lib/puppet-strings/markdown/table_of_contents.rb +3 -1
- data/lib/puppet-strings/markdown/templates/classes_and_defines.erb +7 -3
- data/lib/puppet-strings/markdown/templates/data_type.erb +12 -4
- data/lib/puppet-strings/markdown/templates/data_type_function.erb +1 -1
- data/lib/puppet-strings/markdown/templates/function.erb +1 -1
- data/lib/puppet-strings/markdown/templates/puppet_task.erb +1 -1
- data/lib/puppet-strings/markdown/templates/resource_type.erb +8 -2
- data/lib/puppet-strings/markdown.rb +11 -9
- data/lib/puppet-strings/monkey_patches/display_object_command.rb +2 -0
- data/lib/puppet-strings/tasks/generate.rb +2 -0
- data/lib/puppet-strings/tasks/gh_pages.rb +3 -0
- data/lib/puppet-strings/tasks/validate.rb +42 -0
- data/lib/puppet-strings/tasks.rb +3 -0
- data/lib/puppet-strings/version.rb +3 -1
- data/lib/puppet-strings/yard/code_objects/base.rb +2 -0
- data/lib/puppet-strings/yard/code_objects/class.rb +4 -2
- data/lib/puppet-strings/yard/code_objects/data_type.rb +4 -2
- data/lib/puppet-strings/yard/code_objects/data_type_alias.rb +2 -0
- data/lib/puppet-strings/yard/code_objects/defined_type.rb +4 -2
- data/lib/puppet-strings/yard/code_objects/function.rb +6 -3
- data/lib/puppet-strings/yard/code_objects/group.rb +3 -0
- data/lib/puppet-strings/yard/code_objects/plan.rb +4 -2
- data/lib/puppet-strings/yard/code_objects/provider.rb +6 -0
- data/lib/puppet-strings/yard/code_objects/task.rb +2 -0
- data/lib/puppet-strings/yard/code_objects/type.rb +6 -1
- data/lib/puppet-strings/yard/code_objects.rb +2 -0
- data/lib/puppet-strings/yard/handlers/helpers.rb +2 -0
- data/lib/puppet-strings/yard/handlers/json/base.rb +2 -0
- data/lib/puppet-strings/yard/handlers/json/task_handler.rb +2 -0
- data/lib/puppet-strings/yard/handlers/puppet/base.rb +3 -0
- data/lib/puppet-strings/yard/handlers/puppet/class_handler.rb +2 -0
- data/lib/puppet-strings/yard/handlers/puppet/data_type_alias_handler.rb +2 -0
- data/lib/puppet-strings/yard/handlers/puppet/defined_type_handler.rb +2 -0
- data/lib/puppet-strings/yard/handlers/puppet/function_handler.rb +3 -1
- data/lib/puppet-strings/yard/handlers/puppet/plan_handler.rb +2 -0
- data/lib/puppet-strings/yard/handlers/ruby/base.rb +5 -0
- data/lib/puppet-strings/yard/handlers/ruby/data_type_handler.rb +33 -17
- data/lib/puppet-strings/yard/handlers/ruby/function_handler.rb +9 -7
- data/lib/puppet-strings/yard/handlers/ruby/provider_handler.rb +13 -0
- data/lib/puppet-strings/yard/handlers/ruby/rsapi_handler.rb +4 -1
- data/lib/puppet-strings/yard/handlers/ruby/type_base.rb +14 -6
- data/lib/puppet-strings/yard/handlers/ruby/type_extras_handler.rb +15 -5
- data/lib/puppet-strings/yard/handlers/ruby/type_handler.rb +12 -1
- data/lib/puppet-strings/yard/handlers.rb +2 -0
- data/lib/puppet-strings/yard/parsers/json/parser.rb +2 -0
- data/lib/puppet-strings/yard/parsers/json/task_statement.rb +2 -0
- data/lib/puppet-strings/yard/parsers/puppet/parser.rb +18 -14
- data/lib/puppet-strings/yard/parsers/puppet/statement.rb +4 -0
- data/lib/puppet-strings/yard/parsers.rb +2 -0
- data/lib/puppet-strings/yard/tags/enum_tag.rb +2 -0
- data/lib/puppet-strings/yard/tags/factory.rb +2 -0
- data/lib/puppet-strings/yard/tags/overload_tag.rb +4 -1
- data/lib/puppet-strings/yard/tags/parameter_directive.rb +5 -4
- data/lib/puppet-strings/yard/tags/property_directive.rb +5 -4
- data/lib/puppet-strings/yard/tags/summary_tag.rb +2 -0
- data/lib/puppet-strings/yard/tags.rb +2 -0
- data/lib/puppet-strings/yard/templates/default/puppet_function/html/setup.rb +1 -1
- data/lib/puppet-strings/yard/util.rb +4 -1
- data/lib/puppet-strings/yard.rb +3 -0
- data/lib/puppet-strings.rb +2 -0
- metadata +9 -8
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
require 'puppet-strings/yard/handlers/helpers'
|
|
2
4
|
require 'puppet-strings/yard/handlers/ruby/base'
|
|
3
5
|
require 'puppet-strings/yard/code_objects'
|
|
@@ -10,8 +12,10 @@ class PuppetStrings::Yard::Handlers::Ruby::DataTypeHandler < PuppetStrings::Yard
|
|
|
10
12
|
|
|
11
13
|
process do
|
|
12
14
|
return unless statement.count > 1
|
|
15
|
+
|
|
13
16
|
ruby_module_name = statement[0].source
|
|
14
17
|
return unless ruby_module_name == 'Puppet::DataTypes' || ruby_module_name == 'DataTypes' # rubocop:disable Style/MultipleComparison This reads better
|
|
18
|
+
|
|
15
19
|
object = get_datatype_yard_object(get_name(statement, 'Puppet::DataTypes.create_type'))
|
|
16
20
|
# Extract the interface definition
|
|
17
21
|
type_interface = extract_data_type_interface
|
|
@@ -65,8 +69,10 @@ class PuppetStrings::Yard::Handlers::Ruby::DataTypeHandler < PuppetStrings::Yard
|
|
|
65
69
|
next false unless node.is_a?(YARD::Parser::Ruby::MethodCallNode) &&
|
|
66
70
|
node.method_name &&
|
|
67
71
|
node.method_name.source == 'interface'
|
|
72
|
+
|
|
68
73
|
parameters = node.parameters(false)
|
|
69
74
|
next false unless parameters.count >= 1
|
|
75
|
+
|
|
70
76
|
interface_string = node_as_string(parameters[0])
|
|
71
77
|
next false unless interface_string
|
|
72
78
|
|
|
@@ -97,8 +103,10 @@ class PuppetStrings::Yard::Handlers::Ruby::DataTypeHandler < PuppetStrings::Yard
|
|
|
97
103
|
# @return [YARD::Parser::Ruby::AstNode, nil]
|
|
98
104
|
def find_ruby_ast_node(ast_node, recurse = false, &block)
|
|
99
105
|
raise ArgumentError, 'find_ruby_ast_node requires a block' unless block_given?
|
|
106
|
+
|
|
100
107
|
is_found = yield ast_node
|
|
101
108
|
return ast_node if is_found
|
|
109
|
+
|
|
102
110
|
if ast_node.respond_to?(:children)
|
|
103
111
|
ast_node.children.each do |child_node|
|
|
104
112
|
child_found = find_ruby_ast_node(child_node, recurse, &block)
|
|
@@ -128,7 +136,7 @@ class PuppetStrings::Yard::Handlers::Ruby::DataTypeHandler < PuppetStrings::Yard
|
|
|
128
136
|
# Anything else is ignored
|
|
129
137
|
class LazyLiteralEvaluator
|
|
130
138
|
def initialize
|
|
131
|
-
@literal_visitor
|
|
139
|
+
@literal_visitor = ::Puppet::Pops::Visitor.new(self, "literal", 0, 0)
|
|
132
140
|
end
|
|
133
141
|
|
|
134
142
|
def literal(ast)
|
|
@@ -136,72 +144,72 @@ class PuppetStrings::Yard::Handlers::Ruby::DataTypeHandler < PuppetStrings::Yard
|
|
|
136
144
|
end
|
|
137
145
|
|
|
138
146
|
# ----- The following methods are different/additions from the original Literal_evaluator
|
|
139
|
-
def literal_Object(o)
|
|
147
|
+
def literal_Object(o)
|
|
140
148
|
# Ignore any other object types
|
|
141
149
|
end
|
|
142
150
|
|
|
143
|
-
def literal_AccessExpression(o)
|
|
151
|
+
def literal_AccessExpression(o)
|
|
144
152
|
# Extract the raw text of the Access Expression
|
|
145
153
|
::Puppet::Pops::Adapters::SourcePosAdapter.adapt(o).extract_text
|
|
146
154
|
end
|
|
147
155
|
|
|
148
|
-
def literal_QualifiedReference(o)
|
|
156
|
+
def literal_QualifiedReference(o)
|
|
149
157
|
# Extract the raw text of the Qualified Reference
|
|
150
158
|
::Puppet::Pops::Adapters::SourcePosAdapter.adapt(o).extract_text
|
|
151
159
|
end
|
|
152
160
|
|
|
153
161
|
# ----- The following methods are the same as the original Literal_evaluator
|
|
154
|
-
def literal_Factory(o)
|
|
162
|
+
def literal_Factory(o)
|
|
155
163
|
literal(o.model)
|
|
156
164
|
end
|
|
157
165
|
|
|
158
|
-
def literal_Program(o)
|
|
166
|
+
def literal_Program(o)
|
|
159
167
|
literal(o.body)
|
|
160
168
|
end
|
|
161
169
|
|
|
162
|
-
def literal_LiteralString(o)
|
|
170
|
+
def literal_LiteralString(o)
|
|
163
171
|
o.value
|
|
164
172
|
end
|
|
165
173
|
|
|
166
|
-
def literal_QualifiedName(o)
|
|
174
|
+
def literal_QualifiedName(o)
|
|
167
175
|
o.value
|
|
168
176
|
end
|
|
169
177
|
|
|
170
|
-
def literal_LiteralNumber(o)
|
|
178
|
+
def literal_LiteralNumber(o)
|
|
171
179
|
o.value
|
|
172
180
|
end
|
|
173
181
|
|
|
174
|
-
def literal_UnaryMinusExpression(o)
|
|
182
|
+
def literal_UnaryMinusExpression(o)
|
|
175
183
|
-1 * literal(o.expr)
|
|
176
184
|
end
|
|
177
185
|
|
|
178
|
-
def literal_LiteralBoolean(o)
|
|
186
|
+
def literal_LiteralBoolean(o)
|
|
179
187
|
o.value
|
|
180
188
|
end
|
|
181
189
|
|
|
182
|
-
def literal_LiteralUndef(o)
|
|
190
|
+
def literal_LiteralUndef(o)
|
|
183
191
|
nil
|
|
184
192
|
end
|
|
185
193
|
|
|
186
|
-
def literal_LiteralDefault(o)
|
|
194
|
+
def literal_LiteralDefault(o)
|
|
187
195
|
:default
|
|
188
196
|
end
|
|
189
197
|
|
|
190
|
-
def literal_LiteralRegularExpression(o)
|
|
198
|
+
def literal_LiteralRegularExpression(o)
|
|
191
199
|
o.value
|
|
192
200
|
end
|
|
193
201
|
|
|
194
|
-
def literal_ConcatenatedString(o)
|
|
202
|
+
def literal_ConcatenatedString(o)
|
|
195
203
|
# use double quoted string value if there is no interpolation
|
|
196
204
|
throw :not_literal unless o.segments.size == 1 && o.segments[0].is_a?(Model::LiteralString)
|
|
197
205
|
o.segments[0].value
|
|
198
206
|
end
|
|
199
207
|
|
|
200
|
-
def literal_LiteralList(o)
|
|
208
|
+
def literal_LiteralList(o)
|
|
201
209
|
o.values.map { |v| literal(v) }
|
|
202
210
|
end
|
|
203
211
|
|
|
204
|
-
def literal_LiteralHash(o)
|
|
212
|
+
def literal_LiteralHash(o)
|
|
205
213
|
o.entries.reduce({}) do |result, entry|
|
|
206
214
|
result[literal(entry.key)] = literal(entry.value)
|
|
207
215
|
result
|
|
@@ -275,8 +283,10 @@ class PuppetStrings::Yard::Handlers::Ruby::DataTypeHandler < PuppetStrings::Yard
|
|
|
275
283
|
# Find param tags with a type that is different from the actual definition
|
|
276
284
|
object.tags(:param).reject { |tag| tag.types.nil? }.each do |tag|
|
|
277
285
|
next if actual_params_hash[tag.name].nil?
|
|
286
|
+
|
|
278
287
|
actual_data_type = actual_params_hash[tag.name][:types]
|
|
279
288
|
next if actual_data_type.nil?
|
|
289
|
+
|
|
280
290
|
log.warn "The @param tag for '#{tag.name}' has a different type definition than the actual attribute near #{object.file}:#{object.line}." if tag.types != actual_data_type
|
|
281
291
|
end
|
|
282
292
|
|
|
@@ -290,6 +300,7 @@ class PuppetStrings::Yard::Handlers::Ruby::DataTypeHandler < PuppetStrings::Yard
|
|
|
290
300
|
# Set the type in the param tag
|
|
291
301
|
object.tags(:param).each do |tag|
|
|
292
302
|
next if actual_params_hash[tag.name].nil?
|
|
303
|
+
|
|
293
304
|
tag.types = actual_params_hash[tag.name][:types]
|
|
294
305
|
end
|
|
295
306
|
end
|
|
@@ -311,10 +322,13 @@ class PuppetStrings::Yard::Handlers::Ruby::DataTypeHandler < PuppetStrings::Yard
|
|
|
311
322
|
# Functions with the wrong return type
|
|
312
323
|
object.meths.each do |meth|
|
|
313
324
|
next unless actual_func_names.include?(meth.name.to_s)
|
|
325
|
+
|
|
314
326
|
return_tag = meth.docstring.tag(:return)
|
|
315
327
|
next if return_tag.nil?
|
|
328
|
+
|
|
316
329
|
actual_return_types = [actual_functions_hash[meth.name.to_s][:return_type]]
|
|
317
330
|
next if return_tag.types == actual_return_types
|
|
331
|
+
|
|
318
332
|
log.warn "The @return tag for '#{meth.name}' has a different type definition than the actual function near #{object.file}:#{object.line}. Expected #{actual_return_types}"
|
|
319
333
|
return_tag.types = actual_return_types
|
|
320
334
|
end
|
|
@@ -329,6 +343,7 @@ class PuppetStrings::Yard::Handlers::Ruby::DataTypeHandler < PuppetStrings::Yard
|
|
|
329
343
|
# Add the return type for the methods if missing
|
|
330
344
|
object.meths.each do |meth|
|
|
331
345
|
next unless meth.docstring.tag(:return).nil?
|
|
346
|
+
|
|
332
347
|
meth.docstring.add_tag(YARD::Tags::Tag.new(:return, '', actual_functions_hash[meth.name.to_s][:return_type]))
|
|
333
348
|
end
|
|
334
349
|
|
|
@@ -336,6 +351,7 @@ class PuppetStrings::Yard::Handlers::Ruby::DataTypeHandler < PuppetStrings::Yard
|
|
|
336
351
|
object.meths.each do |meth|
|
|
337
352
|
validate_function_method!(object, meth, actual_functions_hash[meth.name.to_s])
|
|
338
353
|
next unless meth.docstring.tag(:return).nil?
|
|
354
|
+
|
|
339
355
|
meth.docstring.add_tag(YARD::Tags::Tag.new(:return, '', actual_functions_hash[meth.name.to_s][:return_type]))
|
|
340
356
|
end
|
|
341
357
|
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
require 'puppet-strings/yard/handlers/helpers'
|
|
2
4
|
require 'puppet-strings/yard/handlers/ruby/base'
|
|
3
5
|
require 'puppet-strings/yard/code_objects'
|
|
@@ -29,6 +31,7 @@ class PuppetStrings::Yard::Handlers::Ruby::FunctionHandler < PuppetStrings::Yard
|
|
|
29
31
|
# newline, YARD ignores the namespace and uses `newfunction` as the source of the
|
|
30
32
|
# first statement.
|
|
31
33
|
return unless statement.count > 1
|
|
34
|
+
|
|
32
35
|
module_name = statement[0].source
|
|
33
36
|
return unless module_name == 'Puppet::Functions' || module_name == 'Puppet::Parser::Functions' || module_name == 'newfunction'
|
|
34
37
|
|
|
@@ -219,8 +222,7 @@ class PuppetStrings::Yard::Handlers::Ruby::FunctionHandler < PuppetStrings::Yard
|
|
|
219
222
|
|
|
220
223
|
# Populate the required parameters
|
|
221
224
|
params = parameters.unnamed_required_params
|
|
222
|
-
|
|
223
|
-
params.each do |parameter|
|
|
225
|
+
params&.each do |parameter|
|
|
224
226
|
add_param_tag(
|
|
225
227
|
overload_tag,
|
|
226
228
|
param_tags,
|
|
@@ -229,12 +231,10 @@ class PuppetStrings::Yard::Handlers::Ruby::FunctionHandler < PuppetStrings::Yard
|
|
|
229
231
|
parameter.line
|
|
230
232
|
)
|
|
231
233
|
end
|
|
232
|
-
end
|
|
233
234
|
|
|
234
235
|
# Populate the optional parameters
|
|
235
236
|
params = parameters.unnamed_optional_params
|
|
236
|
-
|
|
237
|
-
params.each do |parameter|
|
|
237
|
+
params&.each do |parameter|
|
|
238
238
|
add_param_tag(
|
|
239
239
|
overload_tag,
|
|
240
240
|
param_tags,
|
|
@@ -246,7 +246,6 @@ class PuppetStrings::Yard::Handlers::Ruby::FunctionHandler < PuppetStrings::Yard
|
|
|
246
246
|
true
|
|
247
247
|
)
|
|
248
248
|
end
|
|
249
|
-
end
|
|
250
249
|
|
|
251
250
|
# Populate the splat parameter
|
|
252
251
|
param = parameters.splat_param
|
|
@@ -301,7 +300,7 @@ class PuppetStrings::Yard::Handlers::Ruby::FunctionHandler < PuppetStrings::Yard
|
|
|
301
300
|
name = '&' + name
|
|
302
301
|
end
|
|
303
302
|
|
|
304
|
-
type ||= tag
|
|
303
|
+
type ||= tag&.types ? tag.type : 'Any'
|
|
305
304
|
type = optional ? "Optional[#{type}]" : type
|
|
306
305
|
|
|
307
306
|
object.parameters << [name, to_puppet_literal(default)]
|
|
@@ -328,6 +327,7 @@ class PuppetStrings::Yard::Handlers::Ruby::FunctionHandler < PuppetStrings::Yard
|
|
|
328
327
|
# Validate that tags have matching parameters
|
|
329
328
|
overload.tags(:param).each do |tag|
|
|
330
329
|
next if overload.parameters.find { |p| tag.name == p[0] }
|
|
330
|
+
|
|
331
331
|
log.warn "The @param tag for parameter '#{tag.name}' has no matching parameter at #{file}:#{line}."
|
|
332
332
|
end
|
|
333
333
|
end
|
|
@@ -338,9 +338,11 @@ class PuppetStrings::Yard::Handlers::Ruby::FunctionHandler < PuppetStrings::Yard
|
|
|
338
338
|
parameters[1].each do |kvp|
|
|
339
339
|
next unless kvp.count == 2
|
|
340
340
|
next unless node_as_string(kvp[0]) == 'doc'
|
|
341
|
+
|
|
341
342
|
docstring = node_as_string(kvp[1])
|
|
342
343
|
|
|
343
344
|
log.error "Failed to parse docstring for 3.x Puppet function '#{name}' near #{statement.file}:#{statement.line}." and return nil unless docstring
|
|
345
|
+
|
|
344
346
|
return PuppetStrings::Yard::Util.scrub_string(docstring)
|
|
345
347
|
end
|
|
346
348
|
end
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
require 'puppet-strings/yard/handlers/helpers'
|
|
2
4
|
require 'puppet-strings/yard/handlers/ruby/base'
|
|
3
5
|
require 'puppet-strings/yard/code_objects'
|
|
@@ -20,6 +22,7 @@ class PuppetStrings::Yard::Handlers::Ruby::ProviderHandler < PuppetStrings::Yard
|
|
|
20
22
|
# Extract the type name
|
|
21
23
|
type_call_parameters = type_call.parameters(false)
|
|
22
24
|
return unless type_call_parameters.count >= 1
|
|
25
|
+
|
|
23
26
|
type_name = node_as_string(type_call_parameters.first)
|
|
24
27
|
raise YARD::Parser::UndocumentableError, "Could not determine the resource type name for the provider defined at #{statement.file}:#{statement.line}." unless type_name
|
|
25
28
|
|
|
@@ -47,8 +50,10 @@ class PuppetStrings::Yard::Handlers::Ruby::ProviderHandler < PuppetStrings::Yard
|
|
|
47
50
|
if child.type == :assign
|
|
48
51
|
ivar = child.jump(:ivar)
|
|
49
52
|
next unless ivar != child && ivar.source == '@doc'
|
|
53
|
+
|
|
50
54
|
docstring = node_as_string(child[1])
|
|
51
55
|
log.error "Failed to parse docstring for Puppet provider '#{object.name}' (resource type '#{object.type_name}') near #{child.file}:#{child.line}." and return nil unless docstring
|
|
56
|
+
|
|
52
57
|
register_docstring(object, PuppetStrings::Yard::Util.scrub_string(docstring), nil)
|
|
53
58
|
return nil
|
|
54
59
|
elsif child.is_a?(YARD::Parser::Ruby::MethodCallNode)
|
|
@@ -60,6 +65,7 @@ class PuppetStrings::Yard::Handlers::Ruby::ProviderHandler < PuppetStrings::Yard
|
|
|
60
65
|
|
|
61
66
|
docstring = node_as_string(child.parameters[0])
|
|
62
67
|
log.error "Failed to parse docstring for Puppet provider '#{object.name}' (resource type '#{object.type_name}') near #{child.file}:#{child.line}." and return nil unless docstring
|
|
68
|
+
|
|
63
69
|
register_docstring(object, PuppetStrings::Yard::Util.scrub_string(docstring), nil)
|
|
64
70
|
return nil
|
|
65
71
|
end
|
|
@@ -71,6 +77,7 @@ class PuppetStrings::Yard::Handlers::Ruby::ProviderHandler < PuppetStrings::Yard
|
|
|
71
77
|
# Traverse the block looking for confines/defaults/commands
|
|
72
78
|
block = statement.block
|
|
73
79
|
return unless block && block.count >= 2
|
|
80
|
+
|
|
74
81
|
block[1].children.each do |node|
|
|
75
82
|
next unless node.is_a?(YARD::Parser::Ruby::MethodCallNode) && node.method_name
|
|
76
83
|
|
|
@@ -80,8 +87,10 @@ class PuppetStrings::Yard::Handlers::Ruby::ProviderHandler < PuppetStrings::Yard
|
|
|
80
87
|
if method_name == 'confine'
|
|
81
88
|
# Add a confine to the object
|
|
82
89
|
next unless parameters.count >= 1
|
|
90
|
+
|
|
83
91
|
parameters[0].each do |kvp|
|
|
84
92
|
next unless kvp.count == 2
|
|
93
|
+
|
|
85
94
|
object.add_confine(node_as_string(kvp[0]) || kvp[0].source, node_as_string(kvp[1]) || kvp[1].source)
|
|
86
95
|
end
|
|
87
96
|
elsif method_name == 'has_feature' || method_name == 'has_features'
|
|
@@ -92,9 +101,11 @@ class PuppetStrings::Yard::Handlers::Ruby::ProviderHandler < PuppetStrings::Yard
|
|
|
92
101
|
elsif method_name == 'defaultfor'
|
|
93
102
|
# Add a default to the object
|
|
94
103
|
next unless parameters.count >= 1
|
|
104
|
+
|
|
95
105
|
# Some defaultfor statements contain multiple constraints.
|
|
96
106
|
parameters.each do |kvps|
|
|
97
107
|
next unless kvps.count >= 1
|
|
108
|
+
|
|
98
109
|
defaultfor = []
|
|
99
110
|
kvps.each do |kvp|
|
|
100
111
|
defaultfor << [node_as_string(kvp[0]) || kvp[0].source, node_as_string(kvp[1]) || kvp[1].source]
|
|
@@ -104,8 +115,10 @@ class PuppetStrings::Yard::Handlers::Ruby::ProviderHandler < PuppetStrings::Yard
|
|
|
104
115
|
elsif method_name == 'commands'
|
|
105
116
|
# Add the commands to the object
|
|
106
117
|
next unless parameters.count >= 1
|
|
118
|
+
|
|
107
119
|
parameters[0].each do |kvp|
|
|
108
120
|
next unless kvp.count == 2
|
|
121
|
+
|
|
109
122
|
object.add_command(node_as_string(kvp[0]) || kvp[0].source, node_as_string(kvp[1]) || kvp[1].source)
|
|
110
123
|
end
|
|
111
124
|
end
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
require 'puppet-strings/yard/handlers/helpers'
|
|
2
4
|
require 'puppet-strings/yard/handlers/ruby/base'
|
|
3
5
|
require 'puppet-strings/yard/code_objects'
|
|
@@ -6,7 +8,7 @@ require 'puppet-strings/yard/util'
|
|
|
6
8
|
# Implements the handler for Puppet resource types written in Ruby.
|
|
7
9
|
class PuppetStrings::Yard::Handlers::Ruby::RsapiHandler < PuppetStrings::Yard::Handlers::Ruby::Base
|
|
8
10
|
# The default docstring when ensurable is used without given a docstring.
|
|
9
|
-
DEFAULT_ENSURABLE_DOCSTRING = 'The basic property that the resource should be in.'
|
|
11
|
+
DEFAULT_ENSURABLE_DOCSTRING = 'The basic property that the resource should be in.'
|
|
10
12
|
|
|
11
13
|
namespace_only
|
|
12
14
|
handles method_call(:register_type)
|
|
@@ -14,6 +16,7 @@ class PuppetStrings::Yard::Handlers::Ruby::RsapiHandler < PuppetStrings::Yard::H
|
|
|
14
16
|
process do
|
|
15
17
|
# Only accept calls to Puppet::ResourceApi
|
|
16
18
|
return unless statement.count > 1
|
|
19
|
+
|
|
17
20
|
module_name = statement[0].source
|
|
18
21
|
return unless ['Puppet::ResourceApi'].include? module_name
|
|
19
22
|
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
require 'puppet-strings/yard/handlers/ruby/base'
|
|
2
4
|
|
|
3
5
|
class PuppetStrings::Yard::Handlers::Ruby::TypeBase < PuppetStrings::Yard::Handlers::Ruby::Base
|
|
@@ -22,8 +24,10 @@ class PuppetStrings::Yard::Handlers::Ruby::TypeBase < PuppetStrings::Yard::Handl
|
|
|
22
24
|
if child.type == :assign
|
|
23
25
|
ivar = child.jump(:ivar)
|
|
24
26
|
next unless ivar != child && ivar.source == '@doc'
|
|
27
|
+
|
|
25
28
|
docstring = node_as_string(child[1])
|
|
26
29
|
log.error "Failed to parse docstring for #{kind} near #{child.file}:#{child.line}." and return nil unless docstring
|
|
30
|
+
|
|
27
31
|
return PuppetStrings::Yard::Util.scrub_string(docstring)
|
|
28
32
|
elsif child.is_a?(YARD::Parser::Ruby::MethodCallNode)
|
|
29
33
|
# Look for a call to a dispatch method with a block
|
|
@@ -33,6 +37,7 @@ class PuppetStrings::Yard::Handlers::Ruby::TypeBase < PuppetStrings::Yard::Handl
|
|
|
33
37
|
|
|
34
38
|
docstring = node_as_string(child.parameters[0])
|
|
35
39
|
log.error "Failed to parse docstring for #{kind} near #{child.file}:#{child.line}." and return nil unless docstring
|
|
40
|
+
|
|
36
41
|
return PuppetStrings::Yard::Util.scrub_string(docstring)
|
|
37
42
|
end
|
|
38
43
|
end
|
|
@@ -69,6 +74,7 @@ class PuppetStrings::Yard::Handlers::Ruby::TypeBase < PuppetStrings::Yard::Handl
|
|
|
69
74
|
|
|
70
75
|
if method_name == 'newvalue'
|
|
71
76
|
next unless parameters.count >= 1
|
|
77
|
+
|
|
72
78
|
object.add(node_as_string(parameters[0]) || parameters[0].source)
|
|
73
79
|
elsif method_name == 'newvalues'
|
|
74
80
|
parameters.each do |p|
|
|
@@ -76,9 +82,11 @@ class PuppetStrings::Yard::Handlers::Ruby::TypeBase < PuppetStrings::Yard::Handl
|
|
|
76
82
|
end
|
|
77
83
|
elsif method_name == 'aliasvalue'
|
|
78
84
|
next unless parameters.count >= 2
|
|
85
|
+
|
|
79
86
|
object.alias(node_as_string(parameters[0]) || parameters[0].source, node_as_string(parameters[1]) || parameters[1].source)
|
|
80
87
|
elsif method_name == 'defaultto'
|
|
81
88
|
next unless parameters.count >= 1
|
|
89
|
+
|
|
82
90
|
object.default = node_as_string(parameters[0]) || parameters[0].source
|
|
83
91
|
elsif method_name == 'isnamevar'
|
|
84
92
|
object.isnamevar = true
|
|
@@ -103,6 +111,7 @@ class PuppetStrings::Yard::Handlers::Ruby::TypeBase < PuppetStrings::Yard::Handl
|
|
|
103
111
|
parameters[1].each do |kvp|
|
|
104
112
|
next unless kvp.count == 2
|
|
105
113
|
next unless node_as_string(kvp[0]) == 'parent'
|
|
114
|
+
|
|
106
115
|
if kvp[1].source == 'Puppet::Parameter::Boolean'
|
|
107
116
|
object.add('true') unless object.values.include? 'true' # rubocop:disable Performance/InefficientHashSearch Not supported on Ruby 2.1
|
|
108
117
|
object.add('false') unless object.values.include? 'false' # rubocop:disable Performance/InefficientHashSearch Not supported on Ruby 2.1
|
|
@@ -117,19 +126,18 @@ class PuppetStrings::Yard::Handlers::Ruby::TypeBase < PuppetStrings::Yard::Handl
|
|
|
117
126
|
|
|
118
127
|
def set_default_namevar(object)
|
|
119
128
|
return unless object.properties || object.parameters
|
|
129
|
+
|
|
120
130
|
default = nil
|
|
121
|
-
|
|
122
|
-
object.properties.each do |property|
|
|
131
|
+
object.properties&.each do |property|
|
|
123
132
|
return nil if property.isnamevar
|
|
133
|
+
|
|
124
134
|
default = property if property.name == 'name'
|
|
125
135
|
end
|
|
126
|
-
|
|
127
|
-
if object.parameters
|
|
128
|
-
object.parameters.each do |parameter|
|
|
136
|
+
object.parameters&.each do |parameter|
|
|
129
137
|
return nil if parameter.isnamevar
|
|
138
|
+
|
|
130
139
|
default ||= parameter if parameter.name == 'name'
|
|
131
140
|
end
|
|
132
|
-
end
|
|
133
141
|
default.isnamevar = true if default
|
|
134
142
|
end
|
|
135
143
|
end
|
|
@@ -1,16 +1,19 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
require 'puppet-strings/yard/handlers/helpers'
|
|
2
4
|
require 'puppet-strings/yard/handlers/ruby/type_base'
|
|
3
5
|
require 'puppet-strings/yard/code_objects'
|
|
4
6
|
require 'puppet-strings/yard/util'
|
|
5
7
|
|
|
6
|
-
# Implements the handler for Puppet resource type newparam/newproperty calls written in Ruby.
|
|
8
|
+
# Implements the handler for Puppet resource type newparam/newproperty/ensurable calls written in Ruby.
|
|
7
9
|
class PuppetStrings::Yard::Handlers::Ruby::TypeExtrasHandler < PuppetStrings::Yard::Handlers::Ruby::TypeBase
|
|
8
10
|
# The default docstring when ensurable is used without given a docstring.
|
|
9
|
-
DEFAULT_ENSURABLE_DOCSTRING = 'The basic property that the resource should be in.'
|
|
11
|
+
DEFAULT_ENSURABLE_DOCSTRING = 'The basic property that the resource should be in.'
|
|
10
12
|
|
|
11
13
|
namespace_only
|
|
12
14
|
handles method_call(:newparam)
|
|
13
15
|
handles method_call(:newproperty)
|
|
16
|
+
handles method_call(:ensurable)
|
|
14
17
|
|
|
15
18
|
process do
|
|
16
19
|
|
|
@@ -31,13 +34,20 @@ class PuppetStrings::Yard::Handlers::Ruby::TypeExtrasHandler < PuppetStrings::Ya
|
|
|
31
34
|
# propertyname: "content"
|
|
32
35
|
|
|
33
36
|
return unless (statement.count > 1) && (statement[0].children.count > 2)
|
|
37
|
+
|
|
34
38
|
module_name = statement[0].children[0].source
|
|
35
39
|
method1_name = statement[0].children.drop(1).find{ |c| c.type == :ident }.source
|
|
36
|
-
return unless
|
|
40
|
+
return unless ['Type', 'Puppet::Type'].include?(module_name) && method1_name == 'type'
|
|
37
41
|
|
|
42
|
+
# ensurable is syntatic sugar for newproperty
|
|
38
43
|
typename = get_name(statement[0], 'Puppet::Type.type')
|
|
39
|
-
|
|
40
|
-
|
|
44
|
+
if caller_method == 'ensurable'
|
|
45
|
+
method2_name = 'newproperty'
|
|
46
|
+
propertyname = 'ensure'
|
|
47
|
+
else
|
|
48
|
+
method2_name = caller_method
|
|
49
|
+
propertyname = get_name(statement, "Puppet::Type.type().#{method2_name}")
|
|
50
|
+
end
|
|
41
51
|
|
|
42
52
|
typeobject = get_type_yard_object(typename)
|
|
43
53
|
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
require 'puppet-strings/yard/handlers/helpers'
|
|
2
4
|
require 'puppet-strings/yard/handlers/ruby/type_base'
|
|
3
5
|
require 'puppet-strings/yard/code_objects'
|
|
@@ -6,7 +8,7 @@ require 'puppet-strings/yard/util'
|
|
|
6
8
|
# Implements the handler for Puppet resource types written in Ruby.
|
|
7
9
|
class PuppetStrings::Yard::Handlers::Ruby::TypeHandler < PuppetStrings::Yard::Handlers::Ruby::TypeBase
|
|
8
10
|
# The default docstring when ensurable is used without given a docstring.
|
|
9
|
-
DEFAULT_ENSURABLE_DOCSTRING = 'The basic property that the resource should be in.'
|
|
11
|
+
DEFAULT_ENSURABLE_DOCSTRING = 'The basic property that the resource should be in.'
|
|
10
12
|
|
|
11
13
|
namespace_only
|
|
12
14
|
handles method_call(:newtype)
|
|
@@ -14,6 +16,7 @@ class PuppetStrings::Yard::Handlers::Ruby::TypeHandler < PuppetStrings::Yard::Ha
|
|
|
14
16
|
process do
|
|
15
17
|
# Only accept calls to Puppet::Type
|
|
16
18
|
return unless statement.count > 1
|
|
19
|
+
|
|
17
20
|
module_name = statement[0].source
|
|
18
21
|
return unless module_name == 'Puppet::Type' || module_name == 'Type'
|
|
19
22
|
|
|
@@ -40,6 +43,7 @@ class PuppetStrings::Yard::Handlers::Ruby::TypeHandler < PuppetStrings::Yard::Ha
|
|
|
40
43
|
# Traverse the block looking for properties/parameters/features
|
|
41
44
|
block = statement.block
|
|
42
45
|
return unless block && block.count >= 2
|
|
46
|
+
|
|
43
47
|
block[1].children.each do |node|
|
|
44
48
|
next unless node.is_a?(YARD::Parser::Ruby::MethodCallNode) &&
|
|
45
49
|
node.method_name
|
|
@@ -50,24 +54,31 @@ class PuppetStrings::Yard::Handlers::Ruby::TypeHandler < PuppetStrings::Yard::Ha
|
|
|
50
54
|
if method_name == 'newproperty'
|
|
51
55
|
# Add a property to the object
|
|
52
56
|
next unless parameters.count >= 1
|
|
57
|
+
|
|
53
58
|
name = node_as_string(parameters[0])
|
|
54
59
|
next unless name
|
|
60
|
+
|
|
55
61
|
object.add_property(create_property(name, node))
|
|
56
62
|
elsif method_name == 'newparam'
|
|
57
63
|
# Add a parameter to the object
|
|
58
64
|
next unless parameters.count >= 1
|
|
65
|
+
|
|
59
66
|
name = node_as_string(parameters[0])
|
|
60
67
|
next unless name
|
|
68
|
+
|
|
61
69
|
object.add_parameter(create_parameter(name, node))
|
|
62
70
|
elsif method_name == 'newcheck'
|
|
63
71
|
# Add a check to the object
|
|
64
72
|
next unless parameters.count >= 1
|
|
73
|
+
|
|
65
74
|
name = node_as_string(parameters[0])
|
|
66
75
|
next unless name
|
|
76
|
+
|
|
67
77
|
object.add_check(create_check(name, node))
|
|
68
78
|
elsif method_name == 'feature'
|
|
69
79
|
# Add a feature to the object
|
|
70
80
|
next unless parameters.count >= 2
|
|
81
|
+
|
|
71
82
|
name = node_as_string(parameters[0])
|
|
72
83
|
next unless name
|
|
73
84
|
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
require 'puppet'
|
|
2
4
|
require 'puppet/pops'
|
|
3
5
|
require 'puppet-strings/yard/parsers/puppet/statement'
|
|
@@ -20,14 +22,16 @@ class PuppetStrings::Yard::Parsers::Puppet::Parser < YARD::Parser::Base
|
|
|
20
22
|
# @return [void]
|
|
21
23
|
def parse
|
|
22
24
|
begin
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
25
|
+
if @file.to_s.match(/^plans|\/plans\//)
|
|
26
|
+
if Puppet::Util::Package.versioncmp(Puppet.version, "5.0.0") < 0
|
|
27
|
+
log.warn "Skipping #{@file}: Puppet Plans require Puppet 5 or greater."
|
|
28
|
+
return
|
|
29
|
+
end
|
|
30
|
+
Puppet[:tasks] = true if Puppet.settings.include?(:tasks)
|
|
27
31
|
end
|
|
28
32
|
@statements ||= (@visitor.visit(::Puppet::Pops::Parser::Parser.new.parse_string(source)) || []).compact
|
|
29
|
-
rescue ::Puppet::ParseError =>
|
|
30
|
-
log.error "Failed to parse #{@file}: #{
|
|
33
|
+
rescue ::Puppet::ParseError => e
|
|
34
|
+
log.error "Failed to parse #{@file}: #{e.message}"
|
|
31
35
|
@statements = []
|
|
32
36
|
end
|
|
33
37
|
@statements.freeze
|
|
@@ -42,47 +46,47 @@ class PuppetStrings::Yard::Parsers::Puppet::Parser < YARD::Parser::Base
|
|
|
42
46
|
|
|
43
47
|
private
|
|
44
48
|
|
|
45
|
-
def transform_Program(o)
|
|
49
|
+
def transform_Program(o)
|
|
46
50
|
# Cache the lines of the source text; we'll use this to locate comments
|
|
47
51
|
@lines = o.source_text.lines.to_a
|
|
48
52
|
o.definitions.map { |d| @visitor.visit(d) }
|
|
49
53
|
end
|
|
50
54
|
|
|
51
|
-
def transform_Factory(o)
|
|
55
|
+
def transform_Factory(o)
|
|
52
56
|
@visitor.visit(o.current)
|
|
53
57
|
end
|
|
54
58
|
|
|
55
|
-
def transform_HostClassDefinition(o)
|
|
59
|
+
def transform_HostClassDefinition(o)
|
|
56
60
|
statement = PuppetStrings::Yard::Parsers::Puppet::ClassStatement.new(o, @file)
|
|
57
61
|
statement.extract_docstring(@lines)
|
|
58
62
|
statement
|
|
59
63
|
end
|
|
60
64
|
|
|
61
|
-
def transform_ResourceTypeDefinition(o)
|
|
65
|
+
def transform_ResourceTypeDefinition(o)
|
|
62
66
|
statement = PuppetStrings::Yard::Parsers::Puppet::DefinedTypeStatement.new(o, @file)
|
|
63
67
|
statement.extract_docstring(@lines)
|
|
64
68
|
statement
|
|
65
69
|
end
|
|
66
70
|
|
|
67
|
-
def transform_FunctionDefinition(o)
|
|
71
|
+
def transform_FunctionDefinition(o)
|
|
68
72
|
statement = PuppetStrings::Yard::Parsers::Puppet::FunctionStatement.new(o, @file)
|
|
69
73
|
statement.extract_docstring(@lines)
|
|
70
74
|
statement
|
|
71
75
|
end
|
|
72
76
|
|
|
73
|
-
def transform_PlanDefinition(o)
|
|
77
|
+
def transform_PlanDefinition(o)
|
|
74
78
|
statement = PuppetStrings::Yard::Parsers::Puppet::PlanStatement.new(o, @file)
|
|
75
79
|
statement.extract_docstring(@lines)
|
|
76
80
|
statement
|
|
77
81
|
end
|
|
78
82
|
|
|
79
|
-
def transform_TypeAlias(o)
|
|
83
|
+
def transform_TypeAlias(o)
|
|
80
84
|
statement = PuppetStrings::Yard::Parsers::Puppet::DataTypeAliasStatement.new(o, @file)
|
|
81
85
|
statement.extract_docstring(@lines)
|
|
82
86
|
statement
|
|
83
87
|
end
|
|
84
88
|
|
|
85
|
-
def transform_Object(o)
|
|
89
|
+
def transform_Object(o)
|
|
86
90
|
# Ignore anything else (will be compacted out of the resulting array)
|
|
87
91
|
end
|
|
88
92
|
end
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
require 'puppet'
|
|
2
4
|
require 'puppet/pops'
|
|
3
5
|
|
|
@@ -32,11 +34,13 @@ module PuppetStrings::Yard::Parsers::Puppet
|
|
|
32
34
|
comment = []
|
|
33
35
|
(0..@line-2).reverse_each do |index|
|
|
34
36
|
break unless index <= lines.count
|
|
37
|
+
|
|
35
38
|
line = lines[index].strip
|
|
36
39
|
count = line.size
|
|
37
40
|
line.gsub!(COMMENT_REGEX, '')
|
|
38
41
|
# Break out if nothing was removed (wasn't a comment line)
|
|
39
42
|
break unless line.size < count
|
|
43
|
+
|
|
40
44
|
comment << line
|
|
41
45
|
end
|
|
42
46
|
@comments_range = (@line - comment.size - 1..@line - 1)
|