puppet-strings 2.2.0 → 2.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/CHANGELOG.md +12 -0
- data/Gemfile +14 -5
- data/JSON.md +41 -11
- data/README.md +66 -7
- data/Rakefile +99 -29
- data/lib/puppet-strings/json.rb +2 -0
- data/lib/puppet-strings/markdown.rb +2 -0
- data/lib/puppet-strings/markdown/data_type.rb +18 -0
- data/lib/puppet-strings/markdown/data_types.rb +41 -0
- data/lib/puppet-strings/markdown/function.rb +2 -2
- data/lib/puppet-strings/markdown/table_of_contents.rb +1 -0
- data/lib/puppet-strings/markdown/templates/data_type.erb +78 -0
- data/lib/puppet-strings/tasks/generate.rb +3 -2
- data/lib/puppet-strings/version.rb +1 -1
- data/lib/puppet-strings/yard.rb +10 -0
- data/lib/puppet-strings/yard/code_objects.rb +2 -0
- data/lib/puppet-strings/yard/code_objects/class.rb +1 -1
- data/lib/puppet-strings/yard/code_objects/data_type.rb +80 -0
- data/lib/puppet-strings/yard/code_objects/data_type_alias.rb +58 -0
- data/lib/puppet-strings/yard/code_objects/defined_type.rb +1 -1
- data/lib/puppet-strings/yard/code_objects/function.rb +3 -3
- data/lib/puppet-strings/yard/code_objects/plan.rb +1 -1
- data/lib/puppet-strings/yard/handlers.rb +2 -0
- data/lib/puppet-strings/yard/handlers/puppet/data_type_alias_handler.rb +24 -0
- data/lib/puppet-strings/yard/handlers/ruby/base.rb +2 -2
- data/lib/puppet-strings/yard/handlers/ruby/data_type_handler.rb +236 -0
- data/lib/puppet-strings/yard/handlers/ruby/function_handler.rb +1 -3
- data/lib/puppet-strings/yard/handlers/ruby/rsapi_handler.rb +2 -2
- data/lib/puppet-strings/yard/handlers/ruby/type_base.rb +5 -6
- data/lib/puppet-strings/yard/parsers/json/parser.rb +1 -1
- data/lib/puppet-strings/yard/parsers/puppet/parser.rb +14 -7
- data/lib/puppet-strings/yard/parsers/puppet/statement.rb +25 -0
- data/lib/puppet-strings/yard/tags/overload_tag.rb +1 -1
- data/lib/puppet-strings/yard/templates/default/fulldoc/html/full_list_puppet_data_type.erb +10 -0
- data/lib/puppet-strings/yard/templates/default/fulldoc/html/setup.rb +9 -0
- data/lib/puppet-strings/yard/templates/default/layout/html/objects.erb +2 -0
- data/lib/puppet-strings/yard/templates/default/layout/html/setup.rb +18 -1
- data/lib/puppet-strings/yard/templates/default/puppet_data_type/html/box_info.erb +10 -0
- data/lib/puppet-strings/yard/templates/default/puppet_data_type/html/header.erb +1 -0
- data/lib/puppet-strings/yard/templates/default/puppet_data_type/html/note.erb +6 -0
- data/lib/puppet-strings/yard/templates/default/puppet_data_type/html/overview.erb +6 -0
- data/lib/puppet-strings/yard/templates/default/puppet_data_type/html/setup.rb +5 -0
- data/lib/puppet-strings/yard/templates/default/puppet_data_type/html/source.erb +12 -0
- data/lib/puppet-strings/yard/templates/default/puppet_data_type/html/summary.erb +4 -0
- data/lib/puppet-strings/yard/templates/default/puppet_data_type/html/todo.erb +6 -0
- data/lib/puppet-strings/yard/templates/default/puppet_data_type_alias/html/alias_of.erb +10 -0
- data/lib/puppet-strings/yard/templates/default/puppet_data_type_alias/html/box_info.erb +10 -0
- data/lib/puppet-strings/yard/templates/default/puppet_data_type_alias/html/header.erb +1 -0
- data/lib/puppet-strings/yard/templates/default/puppet_data_type_alias/html/note.erb +6 -0
- data/lib/puppet-strings/yard/templates/default/puppet_data_type_alias/html/overview.erb +6 -0
- data/lib/puppet-strings/yard/templates/default/puppet_data_type_alias/html/setup.rb +17 -0
- data/lib/puppet-strings/yard/templates/default/puppet_data_type_alias/html/source.erb +12 -0
- data/lib/puppet-strings/yard/templates/default/puppet_data_type_alias/html/summary.erb +4 -0
- data/lib/puppet-strings/yard/templates/default/puppet_data_type_alias/html/todo.erb +6 -0
- data/lib/puppet-strings/yard/templates/default/tags/setup.rb +1 -0
- data/lib/puppet/face/strings.rb +3 -3
- data/spec/acceptance/emit_json_options_spec.rb +69 -0
- data/spec/acceptance/generate_markdown_spec.rb +13 -15
- data/spec/acceptance/running_strings_generate_spec.rb +78 -0
- data/spec/fixtures/acceptance/modules/test/metadata.json +5 -1
- data/spec/fixtures/acceptance/modules/test/types/elephant.pp +2 -0
- data/spec/fixtures/unit/markdown/output_with_data_types.md +553 -0
- data/spec/spec_helper.rb +3 -0
- data/spec/spec_helper_acceptance.rb +52 -22
- data/spec/spec_helper_acceptance_local.rb +10 -0
- data/spec/unit/puppet-strings/describe_spec.rb +7 -7
- data/spec/unit/puppet-strings/json_spec.rb +23 -4
- data/spec/unit/puppet-strings/markdown/base_spec.rb +3 -3
- data/spec/unit/puppet-strings/markdown_spec.rb +84 -23
- data/spec/unit/puppet-strings/yard/code_objects/task_spec.rb +1 -1
- data/spec/unit/puppet-strings/yard/handlers/json/task_handler_spec.rb +4 -4
- data/spec/unit/puppet-strings/yard/handlers/puppet/class_handler_spec.rb +8 -8
- data/spec/unit/puppet-strings/yard/handlers/puppet/data_type_alias_handler_spec.rb +65 -0
- data/spec/unit/puppet-strings/yard/handlers/puppet/defined_type_handler_spec.rb +8 -8
- data/spec/unit/puppet-strings/yard/handlers/puppet/function_handler_spec.rb +13 -13
- data/spec/unit/puppet-strings/yard/handlers/ruby/data_type_handler_spec.rb +232 -0
- data/spec/unit/puppet-strings/yard/handlers/ruby/function_handler_spec.rb +36 -19
- data/spec/unit/puppet-strings/yard/handlers/ruby/provider_handler_spec.rb +26 -7
- data/spec/unit/puppet-strings/yard/handlers/ruby/rsapi_handler_spec.rb +7 -7
- data/spec/unit/puppet-strings/yard/handlers/ruby/type_handler_spec.rb +26 -10
- data/spec/unit/puppet-strings/yard/parsers/json/task_statement_spec.rb +2 -2
- data/spec/unit/puppet-strings/yard/parsers/puppet/parser_spec.rb +42 -0
- data/spec/unit/puppet-strings/yard/util_spec.rb +1 -1
- metadata +35 -7
- data/spec/acceptance/emit_json_options.rb +0 -71
- data/spec/acceptance/lib/util.rb +0 -163
- data/spec/acceptance/running_strings_generate.rb +0 -54
@@ -30,11 +30,11 @@ module PuppetStrings::Markdown
|
|
30
30
|
end
|
31
31
|
end
|
32
32
|
|
33
|
-
def error_type(r)
|
33
|
+
def error_type(r) # rubocop:disable Naming/UncommunicativeMethodParamName
|
34
34
|
"`#{r.split(' ')[0]}`"
|
35
35
|
end
|
36
36
|
|
37
|
-
def error_text(r)
|
37
|
+
def error_text(r) # rubocop:disable Naming/UncommunicativeMethodParamName
|
38
38
|
"#{r.split(' ').drop(1).join(' ')}"
|
39
39
|
end
|
40
40
|
end
|
@@ -7,6 +7,7 @@ module PuppetStrings::Markdown
|
|
7
7
|
PuppetStrings::Markdown::DefinedTypes,
|
8
8
|
PuppetStrings::Markdown::ResourceTypes,
|
9
9
|
PuppetStrings::Markdown::Functions,
|
10
|
+
PuppetStrings::Markdown::DataTypes,
|
10
11
|
PuppetStrings::Markdown::PuppetTasks,
|
11
12
|
PuppetStrings::Markdown::PuppetPlans].each do |r|
|
12
13
|
toc = r.toc_info
|
@@ -0,0 +1,78 @@
|
|
1
|
+
### <%= name %>
|
2
|
+
|
3
|
+
<% if text -%>
|
4
|
+
<%= text %>
|
5
|
+
<% elsif summary -%>
|
6
|
+
<%= summary %>
|
7
|
+
<% else -%>
|
8
|
+
<%= "The #{name} data type." %>
|
9
|
+
<% end -%>
|
10
|
+
|
11
|
+
<% if todo -%>
|
12
|
+
* **TODO** <%= todo %>
|
13
|
+
|
14
|
+
<% end -%>
|
15
|
+
<% if note -%>
|
16
|
+
* **Note** <%= note %>
|
17
|
+
|
18
|
+
<% end -%>
|
19
|
+
<% if since -%>
|
20
|
+
* **Since** <%= since %>
|
21
|
+
|
22
|
+
<% end -%>
|
23
|
+
<% if see -%>
|
24
|
+
* **See also**
|
25
|
+
<% see.each do |sa| -%>
|
26
|
+
<% if sa[:name] -%>
|
27
|
+
<%= sa[:name] %>
|
28
|
+
<% end -%>
|
29
|
+
<% if sa[:text] -%>
|
30
|
+
<%= sa[:text] %>
|
31
|
+
<% end -%>
|
32
|
+
<% end -%>
|
33
|
+
|
34
|
+
<% end -%>
|
35
|
+
<% if examples -%>
|
36
|
+
#### Examples
|
37
|
+
|
38
|
+
<% examples.each do |eg| -%>
|
39
|
+
##### <%= eg[:name] %>
|
40
|
+
|
41
|
+
```puppet
|
42
|
+
<%= eg[:text] %>
|
43
|
+
```
|
44
|
+
|
45
|
+
<% end -%>
|
46
|
+
<% end -%>
|
47
|
+
<% if alias_of -%>
|
48
|
+
Alias of `<%= alias_of %>`
|
49
|
+
|
50
|
+
<% end -%>
|
51
|
+
<% if params -%>
|
52
|
+
#### Parameters
|
53
|
+
|
54
|
+
The following parameters are available in the `<%= name %>` <%= @type %>.
|
55
|
+
|
56
|
+
<% params.each do |param| -%>
|
57
|
+
##### `<%= param[:name] %>`
|
58
|
+
|
59
|
+
<% if param[:types] -%>
|
60
|
+
Data type: `<%= param[:types].join(', ') -%>`
|
61
|
+
|
62
|
+
<% end -%>
|
63
|
+
<%= param[:text] %>
|
64
|
+
|
65
|
+
<% if options_for_param(param[:name]) -%>
|
66
|
+
Options:
|
67
|
+
|
68
|
+
<% options_for_param(param[:name]).each do |o| -%>
|
69
|
+
* **<%= o[:opt_name] %>** `<%= o[:opt_types][0] %>`: <%= o[:opt_text] %>
|
70
|
+
<% end -%>
|
71
|
+
|
72
|
+
<% end -%>
|
73
|
+
<% if defaults && defaults[param[:name]] -%>
|
74
|
+
Default value: <%= value_string(defaults[param[:name]]) %>
|
75
|
+
|
76
|
+
<% end -%>
|
77
|
+
<% end -%>
|
78
|
+
<% end -%>
|
@@ -33,11 +33,12 @@ namespace :strings do
|
|
33
33
|
end
|
34
34
|
end
|
35
35
|
end
|
36
|
+
# rubocop:enable Style/PreferredHashMethods
|
36
37
|
|
37
|
-
[
|
38
|
+
%i[json markdown].each { |format| parse_format_option(args, options, format) }
|
38
39
|
|
39
40
|
warn('yard_args behavior is a little dodgy, use at your own risk') if args[:yard_args]
|
40
|
-
options[:yard_args] = args[:yard_args].split if args.
|
41
|
+
options[:yard_args] = args[:yard_args].split if args.key? :yard_args
|
41
42
|
|
42
43
|
PuppetStrings.generate(patterns, options)
|
43
44
|
end
|
data/lib/puppet-strings/yard.rb
CHANGED
@@ -46,6 +46,8 @@ class YARD::CLI::Yardoc
|
|
46
46
|
:module,
|
47
47
|
:class,
|
48
48
|
:puppet_class,
|
49
|
+
:puppet_data_type,
|
50
|
+
:puppet_data_type_alias,
|
49
51
|
:puppet_defined_type,
|
50
52
|
:puppet_type,
|
51
53
|
:puppet_provider,
|
@@ -64,6 +66,14 @@ class YARD::CLI::Stats
|
|
64
66
|
output 'Puppet Classes', *type_statistics_all(:puppet_class)
|
65
67
|
end
|
66
68
|
|
69
|
+
def stats_for_puppet_data_types
|
70
|
+
output 'Puppet Data Types', *type_statistics_all(:puppet_data_type)
|
71
|
+
end
|
72
|
+
|
73
|
+
def stats_for_puppet_data_type_aliases
|
74
|
+
output 'Puppet Data Type Aliases', *type_statistics_all(:puppet_data_type_alias)
|
75
|
+
end
|
76
|
+
|
67
77
|
def stats_for_puppet_defined_types
|
68
78
|
output 'Puppet Defined Types', *type_statistics_all(:puppet_defined_type)
|
69
79
|
end
|
@@ -1,6 +1,8 @@
|
|
1
1
|
# The module for custom YARD code objects.
|
2
2
|
module PuppetStrings::Yard::CodeObjects
|
3
3
|
require 'puppet-strings/yard/code_objects/class'
|
4
|
+
require 'puppet-strings/yard/code_objects/data_type'
|
5
|
+
require 'puppet-strings/yard/code_objects/data_type_alias'
|
4
6
|
require 'puppet-strings/yard/code_objects/defined_type'
|
5
7
|
require 'puppet-strings/yard/code_objects/type'
|
6
8
|
require 'puppet-strings/yard/code_objects/provider'
|
@@ -51,7 +51,7 @@ class PuppetStrings::Yard::CodeObjects::Class < PuppetStrings::Yard::CodeObjects
|
|
51
51
|
hash[:line] = line
|
52
52
|
hash[:inherits] = statement.parent_class if statement.parent_class
|
53
53
|
hash[:docstring] = PuppetStrings::Yard::Util.docstring_to_hash(docstring)
|
54
|
-
defaults = Hash[*parameters.
|
54
|
+
defaults = Hash[*parameters.reject{ |p| p[1].nil? }.flatten]
|
55
55
|
hash[:defaults] = defaults unless defaults.empty?
|
56
56
|
hash[:source] = source unless source && source.empty?
|
57
57
|
hash
|
@@ -0,0 +1,80 @@
|
|
1
|
+
require 'puppet-strings/yard/code_objects/group'
|
2
|
+
require 'puppet-strings/yard/util'
|
3
|
+
|
4
|
+
# Implements the group for Puppet DataTypes.
|
5
|
+
class PuppetStrings::Yard::CodeObjects::DataTypes < PuppetStrings::Yard::CodeObjects::Group
|
6
|
+
# Gets the singleton instance of the group.
|
7
|
+
# @return Returns the singleton instance of the group.
|
8
|
+
def self.instance
|
9
|
+
super(:puppet_data_types)
|
10
|
+
end
|
11
|
+
|
12
|
+
# Gets the display name of the group.
|
13
|
+
# @param [Boolean] prefix whether to show a prefix. Ignored for Puppet group namespaces.
|
14
|
+
# @return [String] Returns the display name of the group.
|
15
|
+
def name(prefix = false)
|
16
|
+
'Puppet Data Types'
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
# Implements the Puppet DataType code object.
|
21
|
+
class PuppetStrings::Yard::CodeObjects::DataType < PuppetStrings::Yard::CodeObjects::Base
|
22
|
+
# Initializes a Puppet class code object.
|
23
|
+
# @param [String] The name of the Data Type
|
24
|
+
# @return [void]
|
25
|
+
def initialize(name)
|
26
|
+
super(PuppetStrings::Yard::CodeObjects::DataTypes.instance, name)
|
27
|
+
@parameters = []
|
28
|
+
@defaults = {}
|
29
|
+
end
|
30
|
+
|
31
|
+
# Gets the type of the code object.
|
32
|
+
# @return Returns the type of the code object.
|
33
|
+
def type
|
34
|
+
:puppet_data_type
|
35
|
+
end
|
36
|
+
|
37
|
+
# Gets the source of the code object.
|
38
|
+
# @return Returns the source of the code object.
|
39
|
+
def source
|
40
|
+
# Not implemented, but would be nice!
|
41
|
+
nil
|
42
|
+
end
|
43
|
+
|
44
|
+
def parameter_exist?(name)
|
45
|
+
!docstring.tags(:param).find { |item| item.name == name }.nil?
|
46
|
+
end
|
47
|
+
|
48
|
+
def add_parameter(name, type, default)
|
49
|
+
tag = docstring.tags(:param).find { |item| item.name == name }
|
50
|
+
if tag.nil?
|
51
|
+
tag = YARD::Tags::Tag.new(:param, '', nil, name)
|
52
|
+
docstring.add_tag(tag)
|
53
|
+
end
|
54
|
+
type = [type] unless type.is_a?(Array)
|
55
|
+
tag.types = type if tag.types.nil?
|
56
|
+
set_parameter_default(name, default)
|
57
|
+
end
|
58
|
+
|
59
|
+
def set_parameter_default(param_name, default)
|
60
|
+
defaults.delete(param_name)
|
61
|
+
defaults[param_name] = default unless default.nil?
|
62
|
+
end
|
63
|
+
|
64
|
+
def parameters
|
65
|
+
docstring.tags(:param).map { |tag| [tag.name, defaults[tag.name]] }
|
66
|
+
end
|
67
|
+
|
68
|
+
# Converts the code object to a hash representation.
|
69
|
+
# @return [Hash] Returns a hash representation of the code object.
|
70
|
+
def to_hash
|
71
|
+
hash = {}
|
72
|
+
hash[:name] = name
|
73
|
+
hash[:file] = file
|
74
|
+
hash[:line] = line
|
75
|
+
hash[:docstring] = PuppetStrings::Yard::Util.docstring_to_hash(docstring)
|
76
|
+
hash[:defaults] = defaults unless defaults.empty?
|
77
|
+
hash[:source] = source unless source && source.empty?
|
78
|
+
hash
|
79
|
+
end
|
80
|
+
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
require 'puppet-strings/yard/code_objects/group'
|
2
|
+
require 'puppet-strings/yard/util'
|
3
|
+
|
4
|
+
# Implements the group for Puppet DataTypeAliases.
|
5
|
+
class PuppetStrings::Yard::CodeObjects::DataTypeAliases < PuppetStrings::Yard::CodeObjects::Group
|
6
|
+
# Gets the singleton instance of the group.
|
7
|
+
# @return Returns the singleton instance of the group.
|
8
|
+
def self.instance
|
9
|
+
super(:puppet_data_type_aliases)
|
10
|
+
end
|
11
|
+
|
12
|
+
# Gets the display name of the group.
|
13
|
+
# @param [Boolean] prefix whether to show a prefix. Ignored for Puppet group namespaces.
|
14
|
+
# @return [String] Returns the display name of the group.
|
15
|
+
def name(prefix = false)
|
16
|
+
'Puppet Data Type Aliases'
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
# Implements the Puppet DataTypeAlias code object.
|
21
|
+
class PuppetStrings::Yard::CodeObjects::DataTypeAlias < PuppetStrings::Yard::CodeObjects::Base
|
22
|
+
attr_reader :statement
|
23
|
+
attr_accessor :alias_of
|
24
|
+
|
25
|
+
# Initializes a Puppet data type alias code object.
|
26
|
+
# @param [PuppetStrings::Parsers::DataTypeAliasStatement] statement The data type alias statement that was parsed.
|
27
|
+
# @return [void]
|
28
|
+
def initialize(statement)
|
29
|
+
@statement = statement
|
30
|
+
@alias_of = statement.alias_of
|
31
|
+
super(PuppetStrings::Yard::CodeObjects::DataTypeAliases.instance, statement.name)
|
32
|
+
end
|
33
|
+
|
34
|
+
# Gets the type of the code object.
|
35
|
+
# @return Returns the type of the code object.
|
36
|
+
def type
|
37
|
+
:puppet_data_type_alias
|
38
|
+
end
|
39
|
+
|
40
|
+
# Gets the source of the code object.
|
41
|
+
# @return Returns the source of the code object.
|
42
|
+
def source
|
43
|
+
# Not implemented, but would be nice!
|
44
|
+
nil
|
45
|
+
end
|
46
|
+
|
47
|
+
# Converts the code object to a hash representation.
|
48
|
+
# @return [Hash] Returns a hash representation of the code object.
|
49
|
+
def to_hash
|
50
|
+
hash = {}
|
51
|
+
hash[:name] = name
|
52
|
+
hash[:file] = file
|
53
|
+
hash[:line] = line
|
54
|
+
hash[:docstring] = PuppetStrings::Yard::Util.docstring_to_hash(docstring)
|
55
|
+
hash[:alias_of] = alias_of
|
56
|
+
hash
|
57
|
+
end
|
58
|
+
end
|
@@ -50,7 +50,7 @@ class PuppetStrings::Yard::CodeObjects::DefinedType < PuppetStrings::Yard::CodeO
|
|
50
50
|
hash[:file] = file
|
51
51
|
hash[:line] = line
|
52
52
|
hash[:docstring] = PuppetStrings::Yard::Util.docstring_to_hash(docstring)
|
53
|
-
defaults = Hash[*parameters.
|
53
|
+
defaults = Hash[*parameters.reject{ |p| p[1].nil? }.flatten]
|
54
54
|
hash[:defaults] = defaults unless defaults.empty?
|
55
55
|
hash[:source] = source unless source && source.empty?
|
56
56
|
hash
|
@@ -88,14 +88,14 @@ class PuppetStrings::Yard::CodeObjects::Function < PuppetStrings::Yard::CodeObje
|
|
88
88
|
if self.has_tag? :overload
|
89
89
|
# loop over overloads and append onto the signatures array
|
90
90
|
self.tags(:overload).each do |o|
|
91
|
-
hash[:signatures] << { :signature => o.signature, :docstring => PuppetStrings::Yard::Util.docstring_to_hash(o.docstring, [
|
91
|
+
hash[:signatures] << { :signature => o.signature, :docstring => PuppetStrings::Yard::Util.docstring_to_hash(o.docstring, %i[param option return example]) }
|
92
92
|
end
|
93
93
|
else
|
94
|
-
hash[:signatures] << { :signature => self.signature, :docstring => PuppetStrings::Yard::Util.docstring_to_hash(docstring, [
|
94
|
+
hash[:signatures] << { :signature => self.signature, :docstring => PuppetStrings::Yard::Util.docstring_to_hash(docstring, %i[param option return example]) }
|
95
95
|
end
|
96
96
|
|
97
97
|
hash[:docstring] = PuppetStrings::Yard::Util.docstring_to_hash(docstring)
|
98
|
-
defaults = Hash[*parameters.
|
98
|
+
defaults = Hash[*parameters.reject{ |p| p[1].nil? }.flatten]
|
99
99
|
hash[:defaults] = defaults unless defaults.empty?
|
100
100
|
hash[:source] = source unless source && source.empty?
|
101
101
|
hash
|
@@ -48,7 +48,7 @@ class PuppetStrings::Yard::CodeObjects::Plan < PuppetStrings::Yard::CodeObjects:
|
|
48
48
|
hash[:file] = file
|
49
49
|
hash[:line] = line
|
50
50
|
hash[:docstring] = PuppetStrings::Yard::Util.docstring_to_hash(docstring)
|
51
|
-
defaults = Hash[*parameters.
|
51
|
+
defaults = Hash[*parameters.reject{ |p| p[1].nil? }.flatten]
|
52
52
|
hash[:defaults] = defaults unless defaults.empty?
|
53
53
|
hash[:source] = source unless source && source.empty?
|
54
54
|
hash
|
@@ -2,6 +2,7 @@
|
|
2
2
|
module PuppetStrings::Yard::Handlers
|
3
3
|
# The module for custom Ruby YARD handlers.
|
4
4
|
module Ruby
|
5
|
+
require 'puppet-strings/yard/handlers/ruby/data_type_handler'
|
5
6
|
require 'puppet-strings/yard/handlers/ruby/type_handler'
|
6
7
|
require 'puppet-strings/yard/handlers/ruby/type_extras_handler'
|
7
8
|
require 'puppet-strings/yard/handlers/ruby/rsapi_handler'
|
@@ -17,6 +18,7 @@ module PuppetStrings::Yard::Handlers
|
|
17
18
|
# The module for custom Puppet YARD handlers.
|
18
19
|
module Puppet
|
19
20
|
require 'puppet-strings/yard/handlers/puppet/class_handler'
|
21
|
+
require 'puppet-strings/yard/handlers/puppet/data_type_alias_handler'
|
20
22
|
require 'puppet-strings/yard/handlers/puppet/defined_type_handler'
|
21
23
|
require 'puppet-strings/yard/handlers/puppet/function_handler'
|
22
24
|
require 'puppet-strings/yard/handlers/puppet/plan_handler'
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require 'puppet-strings/yard/handlers/helpers'
|
2
|
+
require 'puppet-strings/yard/handlers/puppet/base'
|
3
|
+
require 'puppet-strings/yard/parsers'
|
4
|
+
require 'puppet-strings/yard/code_objects'
|
5
|
+
|
6
|
+
# Implements the handler for Puppet Data Type Alias.
|
7
|
+
class PuppetStrings::Yard::Handlers::Puppet::DataTypeAliasHandler < PuppetStrings::Yard::Handlers::Puppet::Base
|
8
|
+
handles PuppetStrings::Yard::Parsers::Puppet::DataTypeAliasStatement
|
9
|
+
|
10
|
+
process do
|
11
|
+
# Register the object
|
12
|
+
object = PuppetStrings::Yard::CodeObjects::DataTypeAlias.new(statement)
|
13
|
+
register object
|
14
|
+
|
15
|
+
# Log a warning if missing documentation
|
16
|
+
log.warn "Missing documentation for Puppet type alias '#{object.name}' at #{statement.file}:#{statement.line}." if object.docstring.empty? && object.tags.empty?
|
17
|
+
|
18
|
+
# Mark the class as public if it doesn't already have an api tag
|
19
|
+
object.add_tag YARD::Tags::Tag.new(:api, 'public') unless object.has_tag? :api
|
20
|
+
|
21
|
+
# Warn if a summary longer than 140 characters was provided
|
22
|
+
PuppetStrings::Yard::Handlers::Helpers.validate_summary_tag(object) if object.has_tag? :summary
|
23
|
+
end
|
24
|
+
end
|
@@ -18,7 +18,8 @@ class PuppetStrings::Yard::Handlers::Ruby::Base < YARD::Handlers::Ruby::Base
|
|
18
18
|
when :label
|
19
19
|
node.source[0..-2]
|
20
20
|
when :dyna_symbol
|
21
|
-
node.
|
21
|
+
content = node.jump(:tstring_content)
|
22
|
+
content.nil? ? node.source : content.source
|
22
23
|
when :string_literal
|
23
24
|
content = node.jump(:tstring_content)
|
24
25
|
return content.source if content != node
|
@@ -45,5 +46,4 @@ class PuppetStrings::Yard::Handlers::Ruby::Base < YARD::Handlers::Ruby::Base
|
|
45
46
|
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
|
46
47
|
name
|
47
48
|
end
|
48
|
-
|
49
49
|
end
|
@@ -0,0 +1,236 @@
|
|
1
|
+
require 'puppet-strings/yard/handlers/helpers'
|
2
|
+
require 'puppet-strings/yard/handlers/ruby/base'
|
3
|
+
require 'puppet-strings/yard/code_objects'
|
4
|
+
require 'puppet-strings/yard/util'
|
5
|
+
|
6
|
+
# Implements the handler for Puppet Data Types written in Ruby.
|
7
|
+
class PuppetStrings::Yard::Handlers::Ruby::DataTypeHandler < PuppetStrings::Yard::Handlers::Ruby::Base
|
8
|
+
namespace_only
|
9
|
+
handles method_call(:create_type)
|
10
|
+
|
11
|
+
process do
|
12
|
+
return unless statement.count > 1
|
13
|
+
ruby_module_name = statement[0].source
|
14
|
+
return unless ruby_module_name == 'Puppet::DataTypes' || ruby_module_name == 'DataTypes' # rubocop:disable Style/MultipleComparison This reads better
|
15
|
+
object = get_datatype_yard_object(get_name(statement, 'Puppet::DataTypes.create_type'))
|
16
|
+
|
17
|
+
actual_params = extract_params_for_data_type # populate_data_type_data(object)
|
18
|
+
|
19
|
+
# Mark the data type as public if it doesn't already have an api tag
|
20
|
+
object.add_tag YARD::Tags::Tag.new(:api, 'public') unless object.has_tag? :api
|
21
|
+
|
22
|
+
validate_tags!(object, actual_params)
|
23
|
+
|
24
|
+
# Set the default values for all parameters
|
25
|
+
actual_params.each { |name, data| object.set_parameter_default(name, data[:default]) }
|
26
|
+
|
27
|
+
# Default any typeless param tag to 'Any'
|
28
|
+
object.tags(:param).each do |tag|
|
29
|
+
tag.types = ['Any'] unless tag.types && !tag.types.empty?
|
30
|
+
end
|
31
|
+
|
32
|
+
# Warn if a summary longer than 140 characters was provided
|
33
|
+
PuppetStrings::Yard::Handlers::Helpers.validate_summary_tag(object) if object.has_tag? :summary
|
34
|
+
end
|
35
|
+
|
36
|
+
private
|
37
|
+
|
38
|
+
def get_datatype_yard_object(name)
|
39
|
+
# Have to guess the path - if we create the object to get the true path from the code,
|
40
|
+
# it also shows up in the .at call - self registering?
|
41
|
+
guess_path = "puppet_data_types::#{name}"
|
42
|
+
object = YARD::Registry.at(guess_path)
|
43
|
+
|
44
|
+
return object unless object.nil?
|
45
|
+
|
46
|
+
# Didn't find, create instead
|
47
|
+
object = PuppetStrings::Yard::CodeObjects::DataType.new(name)
|
48
|
+
register object
|
49
|
+
object
|
50
|
+
end
|
51
|
+
|
52
|
+
def extract_params_for_data_type
|
53
|
+
params = {}
|
54
|
+
# Traverse the block looking for interface
|
55
|
+
block = statement.block
|
56
|
+
return unless block && block.count >= 2
|
57
|
+
block[1].children.each do |node|
|
58
|
+
next unless node.is_a?(YARD::Parser::Ruby::MethodCallNode) &&
|
59
|
+
node.method_name
|
60
|
+
|
61
|
+
method_name = node.method_name.source
|
62
|
+
parameters = node.parameters(false)
|
63
|
+
if method_name == 'interface'
|
64
|
+
next unless parameters.count >= 1
|
65
|
+
interface_string = node_as_string(parameters[0])
|
66
|
+
next unless interface_string
|
67
|
+
# Ref - https://github.com/puppetlabs/puppet/blob/ba4d1a1aba0095d3c70b98fea5c67434a4876a61/lib/puppet/datatypes.rb#L159
|
68
|
+
parsed_interface = Puppet::Pops::Parser::EvaluatingParser.new.parse_string("{ #{interface_string} }").body
|
69
|
+
next unless parsed_interface
|
70
|
+
|
71
|
+
# Now that we parsed the Puppet code (as a string) into a LiteralHash PCore type (Puppet AST),
|
72
|
+
#
|
73
|
+
# We need to convert the LiteralHash into a conventional ruby hash of strings. The
|
74
|
+
# LazyLiteralEvaluator does this by traversing the AST tree can converting objects to strings
|
75
|
+
# where possible and ignoring object types which cannot (thus the 'Lazy' name)
|
76
|
+
#
|
77
|
+
# Once we have it as a standard ruby hash we can then look at the keys and populate the YARD
|
78
|
+
# Code object with the correct attributes etc.
|
79
|
+
literal_eval = LazyLiteralEvaluator.new
|
80
|
+
populate_data_type_params_from_literal_hash!(literal_eval.literal(parsed_interface), params)
|
81
|
+
end
|
82
|
+
end
|
83
|
+
params
|
84
|
+
end
|
85
|
+
|
86
|
+
# Lazily evaluates a Pops object, ignoring any objects that cannot
|
87
|
+
# be converted to a literal value. Based on the Puppet Literal Evaluator
|
88
|
+
# Ref - https://github.com/puppetlabs/puppet/blob/ba4d1a1aba0095d3c70b98fea5c67434a4876a61/lib/puppet/pops/evaluator/literal_evaluator.rb
|
89
|
+
#
|
90
|
+
# Literal values for:
|
91
|
+
# String (not containing interpolation)
|
92
|
+
# Numbers
|
93
|
+
# Booleans
|
94
|
+
# Undef (produces nil)
|
95
|
+
# Array
|
96
|
+
# Hash
|
97
|
+
# QualifiedName
|
98
|
+
# Default (produced :default)
|
99
|
+
# Regular Expression (produces ruby regular expression)
|
100
|
+
# QualifiedReference e.g. File, FooBar
|
101
|
+
# AccessExpression
|
102
|
+
#
|
103
|
+
# Anything else is ignored
|
104
|
+
class LazyLiteralEvaluator
|
105
|
+
def initialize
|
106
|
+
@literal_visitor ||= ::Puppet::Pops::Visitor.new(self, "literal", 0, 0)
|
107
|
+
end
|
108
|
+
|
109
|
+
def literal(ast)
|
110
|
+
@literal_visitor.visit_this_0(self, ast)
|
111
|
+
end
|
112
|
+
|
113
|
+
# ----- The following methods are different/additions from the original Literal_evaluator
|
114
|
+
def literal_Object(o) # rubocop:disable Naming/UncommunicativeMethodParamName
|
115
|
+
# Ignore any other object types
|
116
|
+
end
|
117
|
+
|
118
|
+
def literal_AccessExpression(o) # rubocop:disable Naming/UncommunicativeMethodParamName
|
119
|
+
# Extract the raw text of the Access Expression
|
120
|
+
::Puppet::Pops::Adapters::SourcePosAdapter.adapt(o).extract_text
|
121
|
+
end
|
122
|
+
|
123
|
+
def literal_QualifiedReference(o) # rubocop:disable Naming/UncommunicativeMethodParamName
|
124
|
+
# Extract the raw text of the Qualified Reference
|
125
|
+
::Puppet::Pops::Adapters::SourcePosAdapter.adapt(o).extract_text
|
126
|
+
end
|
127
|
+
|
128
|
+
# ----- The following methods are the same as the original Literal_evaluator
|
129
|
+
def literal_Factory(o) # rubocop:disable Naming/UncommunicativeMethodParamName
|
130
|
+
literal(o.model)
|
131
|
+
end
|
132
|
+
|
133
|
+
def literal_Program(o) # rubocop:disable Naming/UncommunicativeMethodParamName
|
134
|
+
literal(o.body)
|
135
|
+
end
|
136
|
+
|
137
|
+
def literal_LiteralString(o) # rubocop:disable Naming/UncommunicativeMethodParamName
|
138
|
+
o.value
|
139
|
+
end
|
140
|
+
|
141
|
+
def literal_QualifiedName(o) # rubocop:disable Naming/UncommunicativeMethodParamName
|
142
|
+
o.value
|
143
|
+
end
|
144
|
+
|
145
|
+
def literal_LiteralNumber(o) # rubocop:disable Naming/UncommunicativeMethodParamName
|
146
|
+
o.value
|
147
|
+
end
|
148
|
+
|
149
|
+
def literal_LiteralBoolean(o) # rubocop:disable Naming/UncommunicativeMethodParamName
|
150
|
+
o.value
|
151
|
+
end
|
152
|
+
|
153
|
+
def literal_LiteralUndef(o) # rubocop:disable Naming/UncommunicativeMethodParamName
|
154
|
+
nil
|
155
|
+
end
|
156
|
+
|
157
|
+
def literal_LiteralDefault(o) # rubocop:disable Naming/UncommunicativeMethodParamName
|
158
|
+
:default
|
159
|
+
end
|
160
|
+
|
161
|
+
def literal_LiteralRegularExpression(o) # rubocop:disable Naming/UncommunicativeMethodParamName
|
162
|
+
o.value
|
163
|
+
end
|
164
|
+
|
165
|
+
def literal_ConcatenatedString(o) # rubocop:disable Naming/UncommunicativeMethodParamName
|
166
|
+
# use double quoted string value if there is no interpolation
|
167
|
+
throw :not_literal unless o.segments.size == 1 && o.segments[0].is_a?(Model::LiteralString)
|
168
|
+
o.segments[0].value
|
169
|
+
end
|
170
|
+
|
171
|
+
def literal_LiteralList(o) # rubocop:disable Naming/UncommunicativeMethodParamName
|
172
|
+
o.values.map {|v| literal(v) }
|
173
|
+
end
|
174
|
+
|
175
|
+
def literal_LiteralHash(o) # rubocop:disable Naming/UncommunicativeMethodParamName
|
176
|
+
o.entries.reduce({}) do |result, entry|
|
177
|
+
result[literal(entry.key)] = literal(entry.value)
|
178
|
+
result
|
179
|
+
end
|
180
|
+
end
|
181
|
+
end
|
182
|
+
|
183
|
+
def populate_data_type_params_from_literal_hash!(hash, params_hash)
|
184
|
+
return if hash.nil?
|
185
|
+
# Exit early if there are no entries in the hash
|
186
|
+
return if hash['attributes'].nil? || hash['attributes'].count.zero?
|
187
|
+
|
188
|
+
hash['attributes'].each do |key, value|
|
189
|
+
data_type = nil
|
190
|
+
default = nil
|
191
|
+
case value
|
192
|
+
when String
|
193
|
+
data_type = value
|
194
|
+
when Hash
|
195
|
+
data_type = value['type'] unless value['type'].nil?
|
196
|
+
default = value['value'] unless value['value'].nil?
|
197
|
+
end
|
198
|
+
data_type = [data_type] unless data_type.nil? || data_type.is_a?(Array)
|
199
|
+
params_hash[key] = { :types => data_type, :default => default }
|
200
|
+
end
|
201
|
+
end
|
202
|
+
|
203
|
+
def validate_tags!(object, actual_params_hash)
|
204
|
+
actual_param_names = actual_params_hash.keys
|
205
|
+
tagged_param_names = object.tags(:param).map(&:name)
|
206
|
+
# Log any errors
|
207
|
+
# Find attributes which are not documented
|
208
|
+
(actual_param_names - tagged_param_names).each do |item|
|
209
|
+
log.warn "Missing @param tag for attribute '#{item}' near #{object.file}:#{object.line}."
|
210
|
+
end
|
211
|
+
# Find param tags with no matching attribute
|
212
|
+
(tagged_param_names - actual_param_names).each do |item|
|
213
|
+
log.warn "The @param tag for '#{item}' has no matching attribute near #{object.file}:#{object.line}."
|
214
|
+
end
|
215
|
+
# Find param tags with a type that is different from the actual definition
|
216
|
+
object.tags(:param).reject { |tag| tag.types.nil? }.each do |tag|
|
217
|
+
next if actual_params_hash[tag.name].nil?
|
218
|
+
actual_data_type = actual_params_hash[tag.name][:types]
|
219
|
+
next if actual_data_type.nil?
|
220
|
+
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
|
221
|
+
end
|
222
|
+
|
223
|
+
# Automatically fix missing @param tags
|
224
|
+
(actual_param_names - tagged_param_names).each do |name|
|
225
|
+
object.add_parameter(name, actual_params_hash[name][:types], actual_params_hash[name][:default])
|
226
|
+
end
|
227
|
+
# Remove extra param tags
|
228
|
+
object.docstring.delete_tag_if { |item| item.tag_name == 'param' && !actual_param_names.include?(item.name) }
|
229
|
+
|
230
|
+
# Set the type in the param tag
|
231
|
+
object.tags(:param).each do |tag|
|
232
|
+
next if actual_params_hash[tag.name].nil?
|
233
|
+
tag.types = actual_params_hash[tag.name][:types]
|
234
|
+
end
|
235
|
+
end
|
236
|
+
end
|