puppet-strings 2.1.0 → 2.5.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (120) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +78 -4
  3. data/CONTRIBUTING.md +32 -2
  4. data/README.md +81 -17
  5. data/lib/puppet-strings.rb +13 -4
  6. data/lib/puppet-strings/describe.rb +68 -0
  7. data/lib/puppet-strings/json.rb +2 -38
  8. data/lib/puppet-strings/markdown.rb +3 -1
  9. data/lib/puppet-strings/markdown/base.rb +37 -16
  10. data/lib/puppet-strings/markdown/data_type.rb +34 -0
  11. data/lib/puppet-strings/markdown/data_types.rb +41 -0
  12. data/lib/puppet-strings/markdown/function.rb +2 -2
  13. data/lib/puppet-strings/markdown/resource_type.rb +19 -2
  14. data/lib/puppet-strings/markdown/table_of_contents.rb +1 -0
  15. data/lib/puppet-strings/markdown/templates/classes_and_defines.erb +12 -4
  16. data/lib/puppet-strings/markdown/templates/data_type.erb +93 -0
  17. data/lib/puppet-strings/markdown/templates/data_type_function.erb +67 -0
  18. data/lib/puppet-strings/markdown/templates/function.erb +36 -1
  19. data/lib/puppet-strings/markdown/templates/puppet_task.erb +1 -1
  20. data/lib/puppet-strings/markdown/templates/resource_type.erb +32 -12
  21. data/lib/puppet-strings/markdown/templates/table_of_contents.erb +6 -6
  22. data/lib/puppet-strings/tasks/generate.rb +10 -3
  23. data/lib/puppet-strings/version.rb +1 -1
  24. data/lib/puppet-strings/yard.rb +16 -0
  25. data/lib/puppet-strings/yard/code_objects.rb +2 -0
  26. data/lib/puppet-strings/yard/code_objects/class.rb +2 -2
  27. data/lib/puppet-strings/yard/code_objects/data_type.rb +100 -0
  28. data/lib/puppet-strings/yard/code_objects/data_type_alias.rb +58 -0
  29. data/lib/puppet-strings/yard/code_objects/defined_type.rb +2 -2
  30. data/lib/puppet-strings/yard/code_objects/function.rb +4 -4
  31. data/lib/puppet-strings/yard/code_objects/plan.rb +2 -2
  32. data/lib/puppet-strings/yard/code_objects/provider.rb +1 -1
  33. data/lib/puppet-strings/yard/code_objects/task.rb +1 -1
  34. data/lib/puppet-strings/yard/code_objects/type.rb +48 -6
  35. data/lib/puppet-strings/yard/handlers.rb +3 -0
  36. data/lib/puppet-strings/yard/handlers/puppet/data_type_alias_handler.rb +24 -0
  37. data/lib/puppet-strings/yard/handlers/ruby/base.rb +12 -1
  38. data/lib/puppet-strings/yard/handlers/ruby/data_type_handler.rb +393 -0
  39. data/lib/puppet-strings/yard/handlers/ruby/function_handler.rb +2 -12
  40. data/lib/puppet-strings/yard/handlers/ruby/provider_handler.rb +1 -9
  41. data/lib/puppet-strings/yard/handlers/ruby/rsapi_handler.rb +3 -3
  42. data/lib/puppet-strings/yard/handlers/ruby/type_base.rb +135 -0
  43. data/lib/puppet-strings/yard/handlers/ruby/type_extras_handler.rb +56 -0
  44. data/lib/puppet-strings/yard/handlers/ruby/type_handler.rb +9 -115
  45. data/lib/puppet-strings/yard/parsers/json/parser.rb +4 -2
  46. data/lib/puppet-strings/yard/parsers/puppet/parser.rb +14 -7
  47. data/lib/puppet-strings/yard/parsers/puppet/statement.rb +25 -0
  48. data/lib/puppet-strings/yard/tags.rb +2 -0
  49. data/lib/puppet-strings/yard/tags/enum_tag.rb +12 -0
  50. data/lib/puppet-strings/yard/tags/factory.rb +16 -0
  51. data/lib/puppet-strings/yard/tags/overload_tag.rb +2 -2
  52. data/lib/puppet-strings/yard/templates/default/fulldoc/html/full_list_puppet_data_type.erb +10 -0
  53. data/lib/puppet-strings/yard/templates/default/fulldoc/html/setup.rb +9 -0
  54. data/lib/puppet-strings/yard/templates/default/layout/html/objects.erb +2 -0
  55. data/lib/puppet-strings/yard/templates/default/layout/html/setup.rb +18 -1
  56. data/lib/puppet-strings/yard/templates/default/puppet_data_type/html/box_info.erb +10 -0
  57. data/lib/puppet-strings/yard/templates/default/puppet_data_type/html/header.erb +1 -0
  58. data/lib/puppet-strings/yard/templates/default/puppet_data_type/html/method_details_list.erb +6 -0
  59. data/lib/puppet-strings/yard/templates/default/puppet_data_type/html/note.erb +6 -0
  60. data/lib/puppet-strings/yard/templates/default/puppet_data_type/html/overview.erb +6 -0
  61. data/lib/puppet-strings/yard/templates/default/puppet_data_type/html/setup.rb +13 -0
  62. data/lib/puppet-strings/yard/templates/default/puppet_data_type/html/source.erb +12 -0
  63. data/lib/puppet-strings/yard/templates/default/puppet_data_type/html/summary.erb +4 -0
  64. data/lib/puppet-strings/yard/templates/default/puppet_data_type/html/todo.erb +6 -0
  65. data/lib/puppet-strings/yard/templates/default/puppet_data_type_alias/html/alias_of.erb +10 -0
  66. data/lib/puppet-strings/yard/templates/default/puppet_data_type_alias/html/box_info.erb +10 -0
  67. data/lib/puppet-strings/yard/templates/default/puppet_data_type_alias/html/header.erb +1 -0
  68. data/lib/puppet-strings/yard/templates/default/puppet_data_type_alias/html/note.erb +6 -0
  69. data/lib/puppet-strings/yard/templates/default/puppet_data_type_alias/html/overview.erb +6 -0
  70. data/lib/puppet-strings/yard/templates/default/puppet_data_type_alias/html/setup.rb +17 -0
  71. data/lib/puppet-strings/yard/templates/default/puppet_data_type_alias/html/source.erb +12 -0
  72. data/lib/puppet-strings/yard/templates/default/puppet_data_type_alias/html/summary.erb +4 -0
  73. data/lib/puppet-strings/yard/templates/default/puppet_data_type_alias/html/todo.erb +6 -0
  74. data/lib/puppet-strings/yard/templates/default/puppet_type/html/setup.rb +3 -1
  75. data/lib/puppet-strings/yard/templates/default/tags/html/enum.erb +17 -0
  76. data/lib/puppet-strings/yard/templates/default/tags/setup.rb +7 -0
  77. data/lib/puppet-strings/yard/util.rb +48 -0
  78. data/lib/puppet/face/strings.rb +68 -3
  79. metadata +36 -45
  80. data/Gemfile +0 -37
  81. data/HISTORY.md +0 -218
  82. data/JSON.md +0 -802
  83. data/Rakefile +0 -93
  84. data/codecov.yml +0 -3
  85. data/misc/ANNOUNCEMENT_TEMPLATE.md +0 -40
  86. data/spec/acceptance/emit_json_options.rb +0 -71
  87. data/spec/acceptance/generate_markdown_spec.rb +0 -49
  88. data/spec/acceptance/lib/util.rb +0 -163
  89. data/spec/acceptance/running_strings_generate.rb +0 -54
  90. data/spec/fixtures/acceptance/modules/test/functions/add.pp +0 -9
  91. data/spec/fixtures/acceptance/modules/test/lib/puppet/functions/4x_function.rb +0 -5
  92. data/spec/fixtures/acceptance/modules/test/lib/puppet/parser/functions/function3x.rb +0 -2
  93. data/spec/fixtures/acceptance/modules/test/lib/puppet/provider/server/linux.rb +0 -9
  94. data/spec/fixtures/acceptance/modules/test/lib/puppet/type/database.rb +0 -15
  95. data/spec/fixtures/acceptance/modules/test/manifests/init.pp +0 -27
  96. data/spec/fixtures/acceptance/modules/test/manifests/triple_nested_classes.pp +0 -27
  97. data/spec/fixtures/acceptance/modules/test/metadata.json +0 -6
  98. data/spec/fixtures/unit/json/output.json +0 -660
  99. data/spec/fixtures/unit/json/output_with_plan.json +0 -697
  100. data/spec/fixtures/unit/json/output_without_puppet_function.json +0 -480
  101. data/spec/fixtures/unit/markdown/output.md +0 -444
  102. data/spec/fixtures/unit/markdown/output_with_plan.md +0 -478
  103. data/spec/spec_helper.rb +0 -45
  104. data/spec/spec_helper_acceptance.rb +0 -28
  105. data/spec/unit/puppet-strings/json_spec.rb +0 -229
  106. data/spec/unit/puppet-strings/markdown/base_spec.rb +0 -146
  107. data/spec/unit/puppet-strings/markdown_spec.rb +0 -283
  108. data/spec/unit/puppet-strings/yard/code_objects/task_spec.rb +0 -92
  109. data/spec/unit/puppet-strings/yard/handlers/json/task_handler_spec.rb +0 -124
  110. data/spec/unit/puppet-strings/yard/handlers/puppet/class_handler_spec.rb +0 -217
  111. data/spec/unit/puppet-strings/yard/handlers/puppet/defined_type_handler_spec.rb +0 -231
  112. data/spec/unit/puppet-strings/yard/handlers/puppet/function_handler_spec.rb +0 -315
  113. data/spec/unit/puppet-strings/yard/handlers/ruby/function_handler_spec.rb +0 -729
  114. data/spec/unit/puppet-strings/yard/handlers/ruby/provider_handler_spec.rb +0 -139
  115. data/spec/unit/puppet-strings/yard/handlers/ruby/rsapi_handler_spec.rb +0 -214
  116. data/spec/unit/puppet-strings/yard/handlers/ruby/type_handler_spec.rb +0 -269
  117. data/spec/unit/puppet-strings/yard/parsers/json/parser_spec.rb +0 -70
  118. data/spec/unit/puppet-strings/yard/parsers/json/task_statement_spec.rb +0 -56
  119. data/spec/unit/puppet-strings/yard/parsers/puppet/parser_spec.rb +0 -209
  120. data/spec/unit/puppet-strings/yard/util_spec.rb +0 -48
@@ -35,7 +35,7 @@ class PuppetStrings::Yard::Handlers::Ruby::FunctionHandler < PuppetStrings::Yard
35
35
  # Create and register the function object
36
36
  is_3x = module_name == 'Puppet::Parser::Functions' || module_name == 'newfunction'
37
37
  object = PuppetStrings::Yard::CodeObjects::Function.new(
38
- get_name,
38
+ get_name(statement, 'Puppet::Functions.create_function'),
39
39
  is_3x ? PuppetStrings::Yard::CodeObjects::Function::RUBY_3X : PuppetStrings::Yard::CodeObjects::Function::RUBY_4X
40
40
  )
41
41
  object.source = statement
@@ -68,14 +68,6 @@ class PuppetStrings::Yard::Handlers::Ruby::FunctionHandler < PuppetStrings::Yard
68
68
  end
69
69
 
70
70
  private
71
- def get_name
72
- parameters = statement.parameters(false)
73
- raise YARD::Parser::UndocumentableError, "Expected at least one parameter to Puppet::Functions.create_function at #{statement.file}:#{statement.line}." if parameters.empty?
74
- name = node_as_string(parameters.first)
75
- raise YARD::Parser::UndocumentableError, "Expected a symbol or string literal for first parameter but found '#{parameters.first.type}' at #{statement.file}:#{statement.line}." unless name
76
- name
77
- end
78
-
79
71
  def add_tags(object)
80
72
  log.warn "Missing documentation for Puppet function '#{object.name}' at #{statement.file}:#{statement.line}." if object.docstring.empty? && object.tags.empty?
81
73
  log.warn "The docstring for Puppet 4.x function '#{object.name}' contains @param tags near #{object.file}:#{object.line}: parameter documentation should be made on the dispatch call." unless object.tags(:param).empty?
@@ -309,9 +301,7 @@ class PuppetStrings::Yard::Handlers::Ruby::FunctionHandler < PuppetStrings::Yard
309
301
  name = '&' + name
310
302
  end
311
303
 
312
- unless type
313
- type = tag && tag.types ? tag.type : 'Any'
314
- end
304
+ type ||= tag && tag.types ? tag.type : 'Any'
315
305
  type = optional ? "Optional[#{type}]" : type
316
306
 
317
307
  object.parameters << [name, to_puppet_literal(default)]
@@ -24,7 +24,7 @@ class PuppetStrings::Yard::Handlers::Ruby::ProviderHandler < PuppetStrings::Yard
24
24
  raise YARD::Parser::UndocumentableError, "Could not determine the resource type name for the provider defined at #{statement.file}:#{statement.line}." unless type_name
25
25
 
26
26
  # Register the object
27
- object = PuppetStrings::Yard::CodeObjects::Provider.new(type_name, get_name)
27
+ object = PuppetStrings::Yard::CodeObjects::Provider.new(type_name, get_name(statement, "'provide'"))
28
28
  register object
29
29
 
30
30
  # Extract the docstring
@@ -41,14 +41,6 @@ class PuppetStrings::Yard::Handlers::Ruby::ProviderHandler < PuppetStrings::Yard
41
41
  end
42
42
 
43
43
  private
44
- def get_name
45
- parameters = statement.parameters(false)
46
- raise YARD::Parser::UndocumentableError, "Expected at least one parameter to 'provide' at #{statement.file}:#{statement.line}." if parameters.empty?
47
- name = node_as_string(parameters.first)
48
- raise YARD::Parser::UndocumentableError, "Expected a symbol or string literal for first parameter but found '#{parameters.first.type}' at #{statement.file}:#{statement.line}." unless name
49
- name
50
- end
51
-
52
44
  def register_provider_docstring(object)
53
45
  # Walk the tree searching for assignments or calls to desc/doc=
54
46
  statement.traverse do |child|
@@ -15,7 +15,7 @@ class PuppetStrings::Yard::Handlers::Ruby::RsapiHandler < PuppetStrings::Yard::H
15
15
  # Only accept calls to Puppet::ResourceApi
16
16
  return unless statement.count > 1
17
17
  module_name = statement[0].source
18
- return unless [ 'Puppet::ResourceApi' ].include? module_name
18
+ return unless ['Puppet::ResourceApi'].include? module_name
19
19
 
20
20
  schema = extract_schema
21
21
 
@@ -71,7 +71,7 @@ class PuppetStrings::Yard::Handlers::Ruby::RsapiHandler < PuppetStrings::Yard::H
71
71
  array_from_node(node)
72
72
  when :var_ref
73
73
  var_ref_from_node(node)
74
- when :symbol, :symbol_literal, :label, :dyna_symbol, :string_literal
74
+ when :symbol, :symbol_literal, :label, :dyna_symbol, :string_literal, :regexp_literal
75
75
  node_as_string(node)
76
76
  else
77
77
  raise_parse_error("unexpected construct #{node.type}")
@@ -92,7 +92,7 @@ class PuppetStrings::Yard::Handlers::Ruby::RsapiHandler < PuppetStrings::Yard::H
92
92
  # puts "hash from #{node.inspect}"
93
93
 
94
94
  kv_pairs = node.children.collect do |assoc|
95
- [ value_from_node(assoc.children[0]), value_from_node(assoc.children[1]) ]
95
+ [value_from_node(assoc.children[0]), value_from_node(assoc.children[1])]
96
96
  end
97
97
  Hash[kv_pairs]
98
98
  end
@@ -0,0 +1,135 @@
1
+ require 'puppet-strings/yard/handlers/ruby/base'
2
+
3
+ class PuppetStrings::Yard::Handlers::Ruby::TypeBase < PuppetStrings::Yard::Handlers::Ruby::Base
4
+ protected
5
+ def get_type_yard_object(name)
6
+ #Have to guess the path - if we create the object to get the true path from the code,
7
+ #it also shows up in the .at call - self registering?
8
+ guess_path = "puppet_types::#{name}"
9
+ object = YARD::Registry.at(guess_path)
10
+
11
+ return object unless object.nil?
12
+
13
+ #Didn't find, create instead
14
+ object = PuppetStrings::Yard::CodeObjects::Type.new(name)
15
+ register object
16
+ object
17
+ end
18
+
19
+ def find_docstring(node, kind)
20
+ # Walk the tree searching for assignments or calls to desc/doc=
21
+ node.traverse do |child|
22
+ if child.type == :assign
23
+ ivar = child.jump(:ivar)
24
+ next unless ivar != child && ivar.source == '@doc'
25
+ docstring = node_as_string(child[1])
26
+ log.error "Failed to parse docstring for #{kind} near #{child.file}:#{child.line}." and return nil unless docstring
27
+ return PuppetStrings::Yard::Util.scrub_string(docstring)
28
+ elsif child.is_a?(YARD::Parser::Ruby::MethodCallNode)
29
+ # Look for a call to a dispatch method with a block
30
+ next unless child.method_name &&
31
+ (child.method_name.source == 'desc' || child.method_name.source == 'doc=') &&
32
+ child.parameters(false).count == 1
33
+
34
+ docstring = node_as_string(child.parameters[0])
35
+ log.error "Failed to parse docstring for #{kind} near #{child.file}:#{child.line}." and return nil unless docstring
36
+ return PuppetStrings::Yard::Util.scrub_string(docstring)
37
+ end
38
+ end
39
+ log.warn "Missing a description for #{kind} at #{node.file}:#{node.line}."
40
+ nil
41
+ end
42
+
43
+ def create_parameter(name, node)
44
+ parameter = PuppetStrings::Yard::CodeObjects::Type::Parameter.new(name, find_docstring(node, "Puppet resource parameter '#{name}'"))
45
+ set_values(node, parameter)
46
+ parameter
47
+ end
48
+
49
+ def create_property(name, node)
50
+ property = PuppetStrings::Yard::CodeObjects::Type::Property.new(name, find_docstring(node, "Puppet resource property '#{name}'"))
51
+ set_values(node, property)
52
+ property
53
+ end
54
+
55
+ def create_check(name, node)
56
+ check = PuppetStrings::Yard::CodeObjects::Type::Check.new(name, find_docstring(node, "Puppet resource check '#{name}'"))
57
+ set_values(node, check)
58
+ check
59
+ end
60
+
61
+ def set_values(node, object)
62
+ return unless node.block && node.block.count >= 2
63
+
64
+ node.block[1].children.each do |child|
65
+ next unless child.is_a?(YARD::Parser::Ruby::MethodCallNode) && child.method_name
66
+
67
+ method_name = child.method_name.source
68
+ parameters = child.parameters(false)
69
+
70
+ if method_name == 'newvalue'
71
+ next unless parameters.count >= 1
72
+ object.add(node_as_string(parameters[0]) || parameters[0].source)
73
+ elsif method_name == 'newvalues'
74
+ parameters.each do |p|
75
+ object.add(node_as_string(p) || p.source)
76
+ end
77
+ elsif method_name == 'aliasvalue'
78
+ next unless parameters.count >= 2
79
+ object.alias(node_as_string(parameters[0]) || parameters[0].source, node_as_string(parameters[1]) || parameters[1].source)
80
+ elsif method_name == 'defaultto'
81
+ next unless parameters.count >= 1
82
+ object.default = node_as_string(parameters[0]) || parameters[0].source
83
+ elsif method_name == 'isnamevar'
84
+ object.isnamevar = true
85
+ elsif method_name == 'defaultvalues' && object.name == 'ensure'
86
+ object.add('present')
87
+ object.add('absent')
88
+ object.default = 'present'
89
+ end
90
+ end
91
+
92
+ parameters = node.parameters(false)
93
+
94
+ if parameters.count >= 2
95
+ kvps = parameters[1].find_all { |kvp| kvp.count == 2 }
96
+ required_features_kvp = kvps.find { |kvp| node_as_string(kvp[0]) == 'required_features' }
97
+ object.required_features = node_as_string(required_features_kvp[1]) unless required_features_kvp.nil?
98
+ end
99
+
100
+ if object.is_a? PuppetStrings::Yard::CodeObjects::Type::Parameter
101
+ # Process the options for parameter base types
102
+ if parameters.count >= 2
103
+ parameters[1].each do |kvp|
104
+ next unless kvp.count == 2
105
+ next unless node_as_string(kvp[0]) == 'parent'
106
+ if kvp[1].source == 'Puppet::Parameter::Boolean'
107
+ object.add('true') unless object.values.include? 'true' # rubocop:disable Performance/InefficientHashSearch Not supported on Ruby 2.1
108
+ object.add('false') unless object.values.include? 'false' # rubocop:disable Performance/InefficientHashSearch Not supported on Ruby 2.1
109
+ object.add('yes') unless object.values.include? 'yes' # rubocop:disable Performance/InefficientHashSearch Not supported on Ruby 2.1
110
+ object.add('no') unless object.values.include? 'no' # rubocop:disable Performance/InefficientHashSearch Not supported on Ruby 2.1
111
+ end
112
+ break
113
+ end
114
+ end
115
+ end
116
+ end
117
+
118
+ def set_default_namevar(object)
119
+ return unless object.properties || object.parameters
120
+ default = nil
121
+ if object.properties
122
+ object.properties.each do |property|
123
+ return nil if property.isnamevar
124
+ default = property if property.name == 'name'
125
+ end
126
+ end
127
+ if object.parameters
128
+ object.parameters.each do |parameter|
129
+ return nil if parameter.isnamevar
130
+ default ||= parameter if parameter.name == 'name'
131
+ end
132
+ end
133
+ default.isnamevar = true if default
134
+ end
135
+ end
@@ -0,0 +1,56 @@
1
+ require 'puppet-strings/yard/handlers/helpers'
2
+ require 'puppet-strings/yard/handlers/ruby/type_base'
3
+ require 'puppet-strings/yard/code_objects'
4
+ require 'puppet-strings/yard/util'
5
+
6
+ # Implements the handler for Puppet resource type newparam/newproperty calls written in Ruby.
7
+ class PuppetStrings::Yard::Handlers::Ruby::TypeExtrasHandler < PuppetStrings::Yard::Handlers::Ruby::TypeBase
8
+ # The default docstring when ensurable is used without given a docstring.
9
+ DEFAULT_ENSURABLE_DOCSTRING = 'The basic property that the resource should be in.'.freeze
10
+
11
+ namespace_only
12
+ handles method_call(:newparam)
13
+ handles method_call(:newproperty)
14
+
15
+ process do
16
+
17
+ # Our entry point is a type newproperty/newparam compound statement like this:
18
+ # "Puppet::Type.type(:file).newparam(:content) do"
19
+ # We want to
20
+ # Verify the structure
21
+ # Capture the three parameters (e.g. type: 'file', newproperty or newparam?, name: 'source')
22
+ # Proceed with collecting data
23
+ # Either decorate an existing type object or store for future type object parsing
24
+
25
+ # Only accept calls to Puppet::Type.type(<type>).newparam/.newproperty
26
+ # e.g. "Puppet::Type.type(:file).newparam(:content) do" would yield:
27
+ # module_name: "Puppet::Type"
28
+ # method1_name: "type"
29
+ # typename: "file"
30
+ # method2_name: "newparam"
31
+ # propertyname: "content"
32
+
33
+ return unless (statement.count > 1) && (statement[0].children.count > 2)
34
+ module_name = statement[0].children[0].source
35
+ method1_name = statement[0].children.drop(1).find{ |c| c.type == :ident }.source
36
+ return unless (module_name == 'Puppet::Type' || module_name == 'Type') && method1_name == 'type'
37
+
38
+ typename = get_name(statement[0], 'Puppet::Type.type')
39
+ method2_name = caller_method
40
+ propertyname = get_name(statement, "Puppet::Type.type().#{method2_name}")
41
+
42
+ typeobject = get_type_yard_object(typename)
43
+
44
+ # node - what should it be here?
45
+ node = statement #?? not sure... test...
46
+
47
+ if method2_name == 'newproperty'
48
+ typeobject.add_property(create_property(propertyname, node))
49
+ elsif method2_name == 'newparam'
50
+ typeobject.add_parameter(create_parameter(propertyname, node))
51
+ end
52
+
53
+ # Set the default namevar
54
+ set_default_namevar(typeobject)
55
+ end
56
+ end
@@ -1,10 +1,10 @@
1
1
  require 'puppet-strings/yard/handlers/helpers'
2
- require 'puppet-strings/yard/handlers/ruby/base'
2
+ require 'puppet-strings/yard/handlers/ruby/type_base'
3
3
  require 'puppet-strings/yard/code_objects'
4
4
  require 'puppet-strings/yard/util'
5
5
 
6
6
  # Implements the handler for Puppet resource types written in Ruby.
7
- class PuppetStrings::Yard::Handlers::Ruby::TypeHandler < PuppetStrings::Yard::Handlers::Ruby::Base
7
+ class PuppetStrings::Yard::Handlers::Ruby::TypeHandler < PuppetStrings::Yard::Handlers::Ruby::TypeBase
8
8
  # The default docstring when ensurable is used without given a docstring.
9
9
  DEFAULT_ENSURABLE_DOCSTRING = 'The basic property that the resource should be in.'.freeze
10
10
 
@@ -17,8 +17,7 @@ class PuppetStrings::Yard::Handlers::Ruby::TypeHandler < PuppetStrings::Yard::Ha
17
17
  module_name = statement[0].source
18
18
  return unless module_name == 'Puppet::Type' || module_name == 'Type'
19
19
 
20
- object = PuppetStrings::Yard::CodeObjects::Type.new(get_name)
21
- register object
20
+ object = get_type_yard_object(get_name(statement, 'Puppet::Type.newtype'))
22
21
 
23
22
  docstring = find_docstring(statement, "Puppet resource type '#{object.name}'")
24
23
  register_docstring(object, docstring, nil) if docstring
@@ -37,38 +36,6 @@ class PuppetStrings::Yard::Handlers::Ruby::TypeHandler < PuppetStrings::Yard::Ha
37
36
  end
38
37
 
39
38
  private
40
- def get_name
41
- parameters = statement.parameters(false)
42
- raise YARD::Parser::UndocumentableError, "Expected at least one parameter to Puppet::Type.newtype at #{statement.file}:#{statement.line}." if parameters.empty?
43
- name = node_as_string(parameters.first)
44
- raise YARD::Parser::UndocumentableError, "Expected a symbol or string literal for first parameter but found '#{parameters.first.type}' at #{statement.file}:#{statement.line}." unless name
45
- name
46
- end
47
-
48
- def find_docstring(node, kind)
49
- # Walk the tree searching for assignments or calls to desc/doc=
50
- node.traverse do |child|
51
- if child.type == :assign
52
- ivar = child.jump(:ivar)
53
- next unless ivar != child && ivar.source == '@doc'
54
- docstring = node_as_string(child[1])
55
- log.error "Failed to parse docstring for #{kind} near #{child.file}:#{child.line}." and return nil unless docstring
56
- return PuppetStrings::Yard::Util.scrub_string(docstring)
57
- elsif child.is_a?(YARD::Parser::Ruby::MethodCallNode)
58
- # Look for a call to a dispatch method with a block
59
- next unless child.method_name &&
60
- (child.method_name.source == 'desc' || child.method_name.source == 'doc=') &&
61
- child.parameters(false).count == 1
62
-
63
- docstring = node_as_string(child.parameters[0])
64
- log.error "Failed to parse docstring for #{kind} near #{child.file}:#{child.line}." and return nil unless docstring
65
- return PuppetStrings::Yard::Util.scrub_string(docstring)
66
- end
67
- end
68
- log.warn "Missing a description for #{kind} at #{node.file}:#{node.line}."
69
- nil
70
- end
71
-
72
39
  def populate_type_data(object)
73
40
  # Traverse the block looking for properties/parameters/features
74
41
  block = statement.block
@@ -92,6 +59,12 @@ class PuppetStrings::Yard::Handlers::Ruby::TypeHandler < PuppetStrings::Yard::Ha
92
59
  name = node_as_string(parameters[0])
93
60
  next unless name
94
61
  object.add_parameter(create_parameter(name, node))
62
+ elsif method_name == 'newcheck'
63
+ # Add a check to the object
64
+ next unless parameters.count >= 1
65
+ name = node_as_string(parameters[0])
66
+ next unless name
67
+ object.add_check(create_check(name, node))
95
68
  elsif method_name == 'feature'
96
69
  # Add a feature to the object
97
70
  next unless parameters.count >= 2
@@ -116,83 +89,4 @@ class PuppetStrings::Yard::Handlers::Ruby::TypeHandler < PuppetStrings::Yard::Ha
116
89
  end
117
90
  end
118
91
  end
119
-
120
- def create_parameter(name, node)
121
- parameter = PuppetStrings::Yard::CodeObjects::Type::Parameter.new(name, find_docstring(node, "Puppet resource parameter '#{name}'"))
122
- set_values(node, parameter)
123
- parameter
124
- end
125
-
126
- def create_property(name, node)
127
- property = PuppetStrings::Yard::CodeObjects::Type::Property.new(name, find_docstring(node, "Puppet resource property '#{name}'"))
128
- set_values(node, property)
129
- property
130
- end
131
-
132
- def set_values(node, object)
133
- return unless node.block && node.block.count >= 2
134
-
135
- node.block[1].children.each do |child|
136
- next unless child.is_a?(YARD::Parser::Ruby::MethodCallNode) && child.method_name
137
-
138
- method_name = child.method_name.source
139
- parameters = child.parameters(false)
140
-
141
- if method_name == 'newvalue'
142
- next unless parameters.count >= 1
143
- object.add(node_as_string(parameters[0]) || parameters[0].source)
144
- elsif method_name == 'newvalues'
145
- parameters.each do |p|
146
- object.add(node_as_string(p) || p.source)
147
- end
148
- elsif method_name == 'aliasvalue'
149
- next unless parameters.count >= 2
150
- object.alias(node_as_string(parameters[0]) || parameters[0].source, node_as_string(parameters[1]) || parameters[1].source)
151
- elsif method_name == 'defaultto'
152
- next unless parameters.count >= 1
153
- object.default = node_as_string(parameters[0]) || parameters[0].source
154
- elsif method_name == 'isnamevar'
155
- object.isnamevar = true
156
- elsif method_name == 'defaultvalues' && object.name == 'ensure'
157
- object.add('present')
158
- object.add('absent')
159
- object.default = 'present'
160
- end
161
- end
162
- if object.is_a? PuppetStrings::Yard::CodeObjects::Type::Parameter
163
- # Process the options for parameter base types
164
- parameters = node.parameters(false)
165
- if parameters.count >= 2
166
- parameters[1].each do |kvp|
167
- next unless kvp.count == 2
168
- next unless node_as_string(kvp[0]) == 'parent'
169
- if kvp[1].source == 'Puppet::Parameter::Boolean'
170
- object.add('true') unless object.values.include? 'true'
171
- object.add('false') unless object.values.include? 'false'
172
- object.add('yes') unless object.values.include? 'yes'
173
- object.add('no') unless object.values.include? 'no'
174
- end
175
- break
176
- end
177
- end
178
- end
179
- end
180
-
181
- def set_default_namevar(object)
182
- return unless object.properties || object.parameters
183
- default = nil
184
- if object.properties
185
- object.properties.each do |property|
186
- return nil if property.isnamevar
187
- default = property if property.name == 'name'
188
- end
189
- end
190
- if object.parameters
191
- object.parameters.each do |parameter|
192
- return nil if parameter.isnamevar
193
- default ||= parameter if parameter.name == 'name'
194
- end
195
- end
196
- default.isnamevar = true if default
197
- end
198
92
  end
@@ -22,8 +22,10 @@ class PuppetStrings::Yard::Parsers::JSON::Parser < YARD::Parser::Base
22
22
  def parse
23
23
  begin
24
24
  json = JSON.parse(source)
25
- @statements.push(PuppetStrings::Yard::Parsers::JSON::TaskStatement.new(json, @source, @file))
26
- rescue
25
+ # TODO: this should compare json to a Task metadata json-schema or perform some other hueristics
26
+ # to determine what type of statement it represents
27
+ @statements.push(PuppetStrings::Yard::Parsers::JSON::TaskStatement.new(json, @source, @file)) unless json.empty?
28
+ rescue # rubocop:disable Style/RescueStandardError Just catch everything
27
29
  log.error "Failed to parse #{@file}: "
28
30
  @statements = []
29
31
  end