puppet-strings 0.4.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 +7 -0
- data/lib/puppet-strings/rake_tasks.rb +18 -0
- data/lib/puppet/application/strings.rb +4 -0
- data/lib/puppet/face/strings.rb +64 -0
- data/lib/puppet/feature/rgen.rb +3 -0
- data/lib/puppet/feature/yard.rb +3 -0
- data/lib/puppet_x/puppetlabs/strings.rb +64 -0
- data/lib/puppet_x/puppetlabs/strings/actions.rb +92 -0
- data/lib/puppet_x/puppetlabs/strings/pops/yard_statement.rb +79 -0
- data/lib/puppet_x/puppetlabs/strings/pops/yard_transformer.rb +47 -0
- data/lib/puppet_x/puppetlabs/strings/util.rb +65 -0
- data/lib/puppet_x/puppetlabs/strings/yard/code_objects/defined_type_object.rb +33 -0
- data/lib/puppet_x/puppetlabs/strings/yard/code_objects/host_class_object.rb +22 -0
- data/lib/puppet_x/puppetlabs/strings/yard/code_objects/method_object.rb +62 -0
- data/lib/puppet_x/puppetlabs/strings/yard/code_objects/provider_object.rb +24 -0
- data/lib/puppet_x/puppetlabs/strings/yard/code_objects/puppet_namespace_object.rb +48 -0
- data/lib/puppet_x/puppetlabs/strings/yard/code_objects/type_object.rb +42 -0
- data/lib/puppet_x/puppetlabs/strings/yard/core_ext/yard.rb +40 -0
- data/lib/puppet_x/puppetlabs/strings/yard/handlers/base.rb +13 -0
- data/lib/puppet_x/puppetlabs/strings/yard/handlers/defined_type_handler.rb +31 -0
- data/lib/puppet_x/puppetlabs/strings/yard/handlers/heredoc_helper.rb +80 -0
- data/lib/puppet_x/puppetlabs/strings/yard/handlers/host_class_handler.rb +42 -0
- data/lib/puppet_x/puppetlabs/strings/yard/handlers/provider_handler.rb +95 -0
- data/lib/puppet_x/puppetlabs/strings/yard/handlers/puppet_3x_function_handler.rb +54 -0
- data/lib/puppet_x/puppetlabs/strings/yard/handlers/puppet_4x_function_handler.rb +234 -0
- data/lib/puppet_x/puppetlabs/strings/yard/handlers/type_handler.rb +295 -0
- data/lib/puppet_x/puppetlabs/strings/yard/json_registry_store.rb +85 -0
- data/lib/puppet_x/puppetlabs/strings/yard/monkey_patches.rb +68 -0
- data/lib/puppet_x/puppetlabs/strings/yard/parser.rb +30 -0
- data/lib/puppet_x/puppetlabs/strings/yard/tags/directives.rb +9 -0
- data/lib/puppet_x/puppetlabs/strings/yard/templates/default/definedtype/html/docstring.erb +34 -0
- data/lib/puppet_x/puppetlabs/strings/yard/templates/default/definedtype/html/header.erb +5 -0
- data/lib/puppet_x/puppetlabs/strings/yard/templates/default/definedtype/html/parameter_details.erb +6 -0
- data/lib/puppet_x/puppetlabs/strings/yard/templates/default/definedtype/html/setup.rb +1 -0
- data/lib/puppet_x/puppetlabs/strings/yard/templates/default/definedtype/setup.rb +49 -0
- data/lib/puppet_x/puppetlabs/strings/yard/templates/default/fulldoc/html/full_list_class.erb +2 -0
- data/lib/puppet_x/puppetlabs/strings/yard/templates/default/fulldoc/html/full_list_puppet_manifest.erb +1 -0
- data/lib/puppet_x/puppetlabs/strings/yard/templates/default/fulldoc/html/full_list_puppet_plugin.erb +21 -0
- data/lib/puppet_x/puppetlabs/strings/yard/templates/default/fulldoc/html/full_list_puppet_provider.erb +1 -0
- data/lib/puppet_x/puppetlabs/strings/yard/templates/default/fulldoc/html/full_list_puppet_type.erb +1 -0
- data/lib/puppet_x/puppetlabs/strings/yard/templates/default/fulldoc/html/setup.rb +82 -0
- data/lib/puppet_x/puppetlabs/strings/yard/templates/default/hostclass/html/box_info.erb +22 -0
- data/lib/puppet_x/puppetlabs/strings/yard/templates/default/hostclass/html/setup.rb +1 -0
- data/lib/puppet_x/puppetlabs/strings/yard/templates/default/hostclass/html/subclasses.erb +4 -0
- data/lib/puppet_x/puppetlabs/strings/yard/templates/default/hostclass/setup.rb +21 -0
- data/lib/puppet_x/puppetlabs/strings/yard/templates/default/html_helper.rb +139 -0
- data/lib/puppet_x/puppetlabs/strings/yard/templates/default/layout/html/setup.rb +18 -0
- data/lib/puppet_x/puppetlabs/strings/yard/templates/default/method_details/html/header.erb +17 -0
- data/lib/puppet_x/puppetlabs/strings/yard/templates/default/method_details/setup.rb +21 -0
- data/lib/puppet_x/puppetlabs/strings/yard/templates/default/method_details/text/header.erb +2 -0
- data/lib/puppet_x/puppetlabs/strings/yard/templates/default/provider/html/command_details.erb +8 -0
- data/lib/puppet_x/puppetlabs/strings/yard/templates/default/provider/html/confine_details.erb +10 -0
- data/lib/puppet_x/puppetlabs/strings/yard/templates/default/provider/html/default_details.erb +10 -0
- data/lib/puppet_x/puppetlabs/strings/yard/templates/default/provider/html/docstring.erb +34 -0
- data/lib/puppet_x/puppetlabs/strings/yard/templates/default/provider/html/feature_details.erb +10 -0
- data/lib/puppet_x/puppetlabs/strings/yard/templates/default/provider/html/header.erb +5 -0
- data/lib/puppet_x/puppetlabs/strings/yard/templates/default/provider/html/setup.rb +1 -0
- data/lib/puppet_x/puppetlabs/strings/yard/templates/default/provider/setup.rb +50 -0
- data/lib/puppet_x/puppetlabs/strings/yard/templates/default/puppetnamespace/html/box_info.erb +11 -0
- data/lib/puppet_x/puppetlabs/strings/yard/templates/default/puppetnamespace/html/header.erb +5 -0
- data/lib/puppet_x/puppetlabs/strings/yard/templates/default/puppetnamespace/html/method_details_list.erb +53 -0
- data/lib/puppet_x/puppetlabs/strings/yard/templates/default/puppetnamespace/html/method_summary.erb +20 -0
- data/lib/puppet_x/puppetlabs/strings/yard/templates/default/puppetnamespace/html/setup.rb +1 -0
- data/lib/puppet_x/puppetlabs/strings/yard/templates/default/puppetnamespace/setup.rb +91 -0
- data/lib/puppet_x/puppetlabs/strings/yard/templates/default/template_helper.rb +192 -0
- data/lib/puppet_x/puppetlabs/strings/yard/templates/default/type/html/docstring.erb +34 -0
- data/lib/puppet_x/puppetlabs/strings/yard/templates/default/type/html/header.erb +5 -0
- data/lib/puppet_x/puppetlabs/strings/yard/templates/default/type/html/parameter_details.erb +12 -0
- data/lib/puppet_x/puppetlabs/strings/yard/templates/default/type/html/provider_details.erb +10 -0
- data/lib/puppet_x/puppetlabs/strings/yard/templates/default/type/html/setup.rb +1 -0
- data/lib/puppet_x/puppetlabs/strings/yard/templates/default/type/setup.rb +55 -0
- metadata +142 -0
checksums.yaml
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
---
|
|
2
|
+
SHA1:
|
|
3
|
+
metadata.gz: 3c5d45a8489fb4754aebb00abe3afb2e85b4e75c
|
|
4
|
+
data.tar.gz: cb074d7c812e50b1a1ffbbe42cafde1a909fb125
|
|
5
|
+
SHA512:
|
|
6
|
+
metadata.gz: 5bc48f92940b474aeddff28cad23338216db262815dec6abfc275aaf39f7c458a9d2a4d160c5131898724310e4ef75fe657f597164b80ede62fd9066d616ec9e
|
|
7
|
+
data.tar.gz: 9ce5ee6be34c1727855f9c1f99bb2049146b3434ab4bc5b51579d698cd15e531b70ae3a466beb77b08599ff0439cbf6c2e077c4556cb3d01448e5dd5adaf0a20
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
require 'rake'
|
|
2
|
+
require 'rake/tasklib'
|
|
3
|
+
require 'puppet/face'
|
|
4
|
+
require 'puppet_x/puppetlabs/strings/util'
|
|
5
|
+
|
|
6
|
+
namespace :strings do
|
|
7
|
+
desc 'Generate Puppet documentation with YARD.'
|
|
8
|
+
task :generate do
|
|
9
|
+
PuppetX::PuppetLabs::Strings::Util.generate([
|
|
10
|
+
{emit_json: 'strings.json'}
|
|
11
|
+
])
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
desc 'Serve YARD documentation for modules.'
|
|
15
|
+
task :serve do
|
|
16
|
+
PuppetX::PuppetLabs::Strings::Util.serve
|
|
17
|
+
end
|
|
18
|
+
end
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
require 'puppet/face'
|
|
2
|
+
require 'puppet_x/puppetlabs/strings/yard/tags/directives'
|
|
3
|
+
|
|
4
|
+
Puppet::Face.define(:strings, '0.0.1') do
|
|
5
|
+
summary "Generate Puppet documentation with YARD."
|
|
6
|
+
|
|
7
|
+
# Ensures that the user has the needed features to use puppet strings
|
|
8
|
+
def check_required_features
|
|
9
|
+
unless Puppet.features.yard?
|
|
10
|
+
raise RuntimeError, "The 'yard' gem must be installed in order to use this face."
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
unless Puppet.features.rgen?
|
|
14
|
+
raise RuntimeError, "The 'rgen' gem must be installed in order to use this face."
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
if RUBY_VERSION.match(/^1\.8/)
|
|
18
|
+
raise RuntimeError, "This face requires Ruby 1.9 or greater."
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
action(:yardoc) do
|
|
23
|
+
default
|
|
24
|
+
|
|
25
|
+
option "--emit-json-stdout" do
|
|
26
|
+
summary "Print json representation of the documentation to stdout"
|
|
27
|
+
end
|
|
28
|
+
option "--emit-json FILE" do
|
|
29
|
+
summary "Write json representation of the documentation to FILE"
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
summary "Generate YARD documentation from files."
|
|
33
|
+
arguments "[manifest_file.pp ...]"
|
|
34
|
+
|
|
35
|
+
when_invoked do |*args|
|
|
36
|
+
check_required_features
|
|
37
|
+
require 'puppet_x/puppetlabs/strings/util'
|
|
38
|
+
|
|
39
|
+
PuppetX::PuppetLabs::Strings::Util.generate(args)
|
|
40
|
+
|
|
41
|
+
# Puppet prints the return value of the action. The return value of this
|
|
42
|
+
# action is that of the yardoc_actions invocation, which is the boolean
|
|
43
|
+
# "true". This clutters the statistics yard prints, so instead return the
|
|
44
|
+
# empty string. Note an extra newline will also be printed.
|
|
45
|
+
""
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
# NOTE: Modeled after the `yard gems` command which builds doc indicies
|
|
50
|
+
# (.yardoc directories) for Ruby Gems. Currently lacks the fine-grained
|
|
51
|
+
# control over where these indicies are created and just dumps them in the
|
|
52
|
+
# module roots.
|
|
53
|
+
|
|
54
|
+
action(:server) do
|
|
55
|
+
summary "Serve YARD documentation for modules."
|
|
56
|
+
|
|
57
|
+
when_invoked do |*args|
|
|
58
|
+
check_required_features
|
|
59
|
+
require 'puppet_x/puppetlabs/strings/util'
|
|
60
|
+
|
|
61
|
+
PuppetX::PuppetLabs::Strings::Util.serve(args)
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
end
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
require 'puppet'
|
|
2
|
+
require 'puppet/pops'
|
|
3
|
+
require 'puppet/util/docs'
|
|
4
|
+
require 'yard'
|
|
5
|
+
|
|
6
|
+
module PuppetX
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
# Nothing to see here except forward declarations.
|
|
10
|
+
module PuppetX::PuppetLabs
|
|
11
|
+
module Strings
|
|
12
|
+
# This submodule contains bits that operate on the Pops module produced by
|
|
13
|
+
# the Future parser.
|
|
14
|
+
module Pops
|
|
15
|
+
require 'puppet_x/puppetlabs/strings/pops/yard_statement'
|
|
16
|
+
require 'puppet_x/puppetlabs/strings/pops/yard_transformer'
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
# This submodule contains bits that interface with the YARD plugin system.
|
|
20
|
+
module YARD
|
|
21
|
+
require 'puppet_x/puppetlabs/strings/yard/monkey_patches'
|
|
22
|
+
require 'puppet_x/puppetlabs/strings/yard/parser'
|
|
23
|
+
|
|
24
|
+
module Tags
|
|
25
|
+
require 'puppet_x/puppetlabs/strings/yard/tags/directives'
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
# This submodule contains code objects which are used to represent relevant
|
|
29
|
+
# aspects of puppet code in YARD's Registry
|
|
30
|
+
module CodeObjects
|
|
31
|
+
require 'puppet_x/puppetlabs/strings/yard/code_objects/puppet_namespace_object'
|
|
32
|
+
require 'puppet_x/puppetlabs/strings/yard/code_objects/method_object'
|
|
33
|
+
require 'puppet_x/puppetlabs/strings/yard/code_objects/defined_type_object'
|
|
34
|
+
require 'puppet_x/puppetlabs/strings/yard/code_objects/host_class_object'
|
|
35
|
+
require 'puppet_x/puppetlabs/strings/yard/code_objects/type_object'
|
|
36
|
+
require 'puppet_x/puppetlabs/strings/yard/code_objects/provider_object'
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
# This submodule contains handlers which are used to extract relevant data about
|
|
40
|
+
# puppet code from the ASTs produced by the Ruby and Puppet parsers
|
|
41
|
+
module Handlers
|
|
42
|
+
# This utility library contains some tools for working with Puppet docstrings
|
|
43
|
+
require 'puppet_x/puppetlabs/strings/yard/handlers/base'
|
|
44
|
+
require 'puppet_x/puppetlabs/strings/yard/handlers/defined_type_handler'
|
|
45
|
+
require 'puppet_x/puppetlabs/strings/yard/handlers/host_class_handler'
|
|
46
|
+
require 'puppet_x/puppetlabs/strings/yard/handlers/puppet_3x_function_handler'
|
|
47
|
+
require 'puppet_x/puppetlabs/strings/yard/handlers/puppet_4x_function_handler'
|
|
48
|
+
require 'puppet_x/puppetlabs/strings/yard/handlers/type_handler'
|
|
49
|
+
require 'puppet_x/puppetlabs/strings/yard/handlers/provider_handler'
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
::YARD::Parser::SourceParser.register_parser_type(:puppet,
|
|
53
|
+
PuppetX::PuppetLabs::Strings::YARD::PuppetParser,
|
|
54
|
+
['pp'])
|
|
55
|
+
::YARD::Handlers::Processor.register_handler_namespace(:puppet,
|
|
56
|
+
PuppetX::PuppetLabs::Strings::YARD::Handlers)
|
|
57
|
+
|
|
58
|
+
# FIXME: Might not be the best idea to have the template code on the Ruby
|
|
59
|
+
# LOAD_PATH as the contents of this directory really aren't library code.
|
|
60
|
+
::YARD::Templates::Engine.register_template_path(
|
|
61
|
+
File.join(File.dirname(__FILE__), 'strings', 'yard', 'templates'))
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
end
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
require 'puppet_x/puppetlabs/strings'
|
|
2
|
+
|
|
3
|
+
class PuppetX::PuppetLabs::Strings::Actions
|
|
4
|
+
|
|
5
|
+
# Creates a new instance of the Actions class by determining
|
|
6
|
+
# whether or not debug and backtrace arguments should be sent
|
|
7
|
+
# to YARD
|
|
8
|
+
def initialize(puppet_debug, puppet_backtrace)
|
|
9
|
+
@debug = puppet_debug
|
|
10
|
+
@backtrace = puppet_backtrace
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
# Holds the name of a module and the file path to its YARD index
|
|
14
|
+
ModuleIndex = Struct.new(:name, :index_path)
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
# Maps things like the Puppet `--debug` flag to YARD options.
|
|
18
|
+
def merge_puppet_args!(yard_args)
|
|
19
|
+
yard_args.unshift '--debug' if @debug
|
|
20
|
+
yard_args.unshift '--backtrace' if @backtrace
|
|
21
|
+
|
|
22
|
+
yard_args
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
# Builds doc indices (.yardoc directories) for modules.
|
|
26
|
+
# Currently lacks the fine-grained control over where these
|
|
27
|
+
# indices are created and just dumps them in the module roots.
|
|
28
|
+
#
|
|
29
|
+
# @return [Array<Module>] the modules to be documented
|
|
30
|
+
#
|
|
31
|
+
# @param [Array<String>] module_names a list of the module source files
|
|
32
|
+
# @param [Array<String>] module_sourcefiles default list of module files
|
|
33
|
+
def index_documentation_for_modules(module_names, module_sourcefiles)
|
|
34
|
+
# NOTE: The return value of the `module` Face seems to have changed in
|
|
35
|
+
# 3.6.x. This part of the code will blow up if run under an earlier
|
|
36
|
+
# version of Puppet.
|
|
37
|
+
modules = Puppet::Face[:module, :current].list
|
|
38
|
+
module_list = modules[:modules_by_path].values.flatten
|
|
39
|
+
|
|
40
|
+
module_list.select! {|m| module_names.include? m.name} unless module_names.empty?
|
|
41
|
+
|
|
42
|
+
# Invoke `yardoc` with -n so that it doesn't generate any HTML output but
|
|
43
|
+
# does build a `.yardoc` index that other tools can generate output from.
|
|
44
|
+
yard_args = %w[--no-stats -n] + module_sourcefiles
|
|
45
|
+
merge_puppet_args!(yard_args)
|
|
46
|
+
|
|
47
|
+
module_list.each do |m|
|
|
48
|
+
Dir.chdir(m.path) do
|
|
49
|
+
YARD::CLI::Yardoc.run(*yard_args)
|
|
50
|
+
|
|
51
|
+
# Clear the global Registry so that objects from one module don't
|
|
52
|
+
# bleed into the next.
|
|
53
|
+
YARD::Registry.clear
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
# Extracts the needed information of the modules we're documenting
|
|
59
|
+
#
|
|
60
|
+
# @return [Array<ModuleIndex>] An array of representation of the modules
|
|
61
|
+
# to produce documentation for. Each ModuleIndex contains the module name
|
|
62
|
+
# and the path to its YARD index
|
|
63
|
+
#
|
|
64
|
+
# @param [Array<String>] module_list a list of the module source files
|
|
65
|
+
def generate_module_tuples(module_list)
|
|
66
|
+
module_list.map do |mod|
|
|
67
|
+
name = (mod.forge_name || mod.name).gsub('/', '-')
|
|
68
|
+
yard_index = File.join(mod.path, '.yardoc')
|
|
69
|
+
|
|
70
|
+
ModuleIndex.new(name, yard_index)
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
# Hands off the needed information to YARD so it may
|
|
75
|
+
# serve the documentation
|
|
76
|
+
#
|
|
77
|
+
# @param [Array<String>] yard_args a list of all the arguments to pass to YARD
|
|
78
|
+
def serve_documentation(*yard_args)
|
|
79
|
+
merge_puppet_args!(yard_args)
|
|
80
|
+
YARD::CLI::Server.run(*yard_args)
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
# Hands off the needed information to YARD so it may
|
|
84
|
+
# generate the documentation
|
|
85
|
+
#
|
|
86
|
+
# @param [Array<String>] yard_args a list of all the arguments to pass to YARD
|
|
87
|
+
def generate_documentation(*yard_args)
|
|
88
|
+
merge_puppet_args!(yard_args)
|
|
89
|
+
YARD::CLI::Yardoc.run(*yard_args)
|
|
90
|
+
end
|
|
91
|
+
end
|
|
92
|
+
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
require 'ostruct'
|
|
2
|
+
|
|
3
|
+
# An adapter class that conforms a Pops model instance + adapters to the
|
|
4
|
+
# interface expected by YARD handlers.
|
|
5
|
+
#
|
|
6
|
+
# FIXME: Inhertiting from OpenStruct is a bit of a hack. It allows attributes
|
|
7
|
+
# to be declared as needed but in the long run understandibility of the code
|
|
8
|
+
# would be improved by having a concrete model.
|
|
9
|
+
class PuppetX::PuppetLabs::Strings::Pops::YARDStatement < OpenStruct
|
|
10
|
+
attr_reader :pops_obj, :comments
|
|
11
|
+
|
|
12
|
+
def initialize(pops_obj)
|
|
13
|
+
# Initialize OpenStruct
|
|
14
|
+
super({})
|
|
15
|
+
|
|
16
|
+
unless pops_obj.is_a? Puppet::Pops::Model::PopsObject
|
|
17
|
+
raise ArgumentError, "A YARDStatement can only be initialized from a PopsObject. Got a: #{pops_obj.class}"
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
@pops_obj = pops_obj
|
|
21
|
+
@pos_adapter = Puppet::Pops::Adapters::SourcePosAdapter.adapt(@pops_obj)
|
|
22
|
+
# FIXME: Perhaps this should be a seperate adapter?
|
|
23
|
+
@comments = extract_comments
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def type
|
|
27
|
+
pops_obj.class
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def line
|
|
31
|
+
@line ||= @pos_adapter.line
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def source
|
|
35
|
+
@source ||= @pos_adapter.extract_text
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
# FIXME: I don't know quite what these are supposed to do, but they show up
|
|
39
|
+
# quite often in the YARD handler code. Figure out whether they are
|
|
40
|
+
# necessary.
|
|
41
|
+
alias_method :show, :source
|
|
42
|
+
def comments_hash_flag; nil end
|
|
43
|
+
def comments_range; nil end
|
|
44
|
+
|
|
45
|
+
private
|
|
46
|
+
# TODO: This stuff should probably be part of a separate class/adapter.
|
|
47
|
+
COMMENT_PATTERN = /^\s*#.*\n/
|
|
48
|
+
|
|
49
|
+
def extract_comments
|
|
50
|
+
comments = []
|
|
51
|
+
program = pops_obj.eAllContainers.find {|c| c.is_a?(Puppet::Pops::Model::Program) }
|
|
52
|
+
# FIXME: Horribly inefficient. Multiple copies. Generator pattern would
|
|
53
|
+
# be much better.
|
|
54
|
+
source_text = program.source_text.lines.to_a
|
|
55
|
+
|
|
56
|
+
source_text.slice(0, line-1).reverse.each do |line|
|
|
57
|
+
if COMMENT_PATTERN.match(line)
|
|
58
|
+
# FIXME: The gsub trims comments, but is extremely optimistic: It
|
|
59
|
+
# assumes only one space separates the comment body from the
|
|
60
|
+
# comment character.
|
|
61
|
+
# NOTE: We cannot just trim any amount of whitespace as indentation
|
|
62
|
+
# is sometimes significant in markdown. We would need a real parser.
|
|
63
|
+
|
|
64
|
+
# Comments which begin with some whitespace, a hash and then some
|
|
65
|
+
# tabs and spaces should be scrubbed. Comments which just have a
|
|
66
|
+
# solitary hash then a newline should keep that newline since newlines
|
|
67
|
+
# are significant in markdown.
|
|
68
|
+
comments.unshift line.gsub(/^\s*#[\t ]/, '').gsub(/^\s*#\n/, "\n")
|
|
69
|
+
else
|
|
70
|
+
# No comment found on this line. We must be done piecing together a
|
|
71
|
+
# comment block.
|
|
72
|
+
break
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
# Stick everything back together.
|
|
77
|
+
comments.join
|
|
78
|
+
end
|
|
79
|
+
end
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
# Loosely based on the TreeDumper classes in Pops::Model. The responsibility of
|
|
2
|
+
# this class is to walk a Pops::Model and output objects that can be consumed
|
|
3
|
+
# by YARD handlers.
|
|
4
|
+
#
|
|
5
|
+
# @note Currently, this class only extracts node, host class and type
|
|
6
|
+
# definitions.
|
|
7
|
+
class PuppetX::PuppetLabs::Strings::Pops::YARDTransformer
|
|
8
|
+
def initialize
|
|
9
|
+
@transform_visitor = Puppet::Pops::Visitor.new(self, 'transform')
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def transform(o)
|
|
13
|
+
@transform_visitor.visit(o)
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
private
|
|
17
|
+
|
|
18
|
+
def transform_Factory(o)
|
|
19
|
+
transform(o.current)
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def transform_Program(o)
|
|
23
|
+
o.definitions.map{|d| transform(d)}
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
# Extract comments from type definitions and class definitions. Wrap them
|
|
27
|
+
# into YARDStatement objects that provide an interface for YARD handlers.
|
|
28
|
+
def transform_NamedDefinition(o)
|
|
29
|
+
obj = PuppetX::PuppetLabs::Strings::Pops::YARDStatement.new(o)
|
|
30
|
+
obj.parameters = o.parameters.map do |p|
|
|
31
|
+
param_tuple = [transform(p)]
|
|
32
|
+
param_tuple << ( p.value.nil? ? nil : transform(p.value) )
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
obj
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
# Catch-all visitor.
|
|
39
|
+
def transform_Positioned(o)
|
|
40
|
+
PuppetX::PuppetLabs::Strings::Pops::YARDStatement.new(o)
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
# nil in... nil out!
|
|
44
|
+
def transform_NilClass(o)
|
|
45
|
+
nil
|
|
46
|
+
end
|
|
47
|
+
end
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
require 'puppet_x/puppetlabs/strings/actions'
|
|
2
|
+
|
|
3
|
+
module PuppetX::PuppetLabs::Strings::Util
|
|
4
|
+
MODULE_SOURCEFILES = ['manifests/**/*.pp', 'lib/**/*.rb']
|
|
5
|
+
|
|
6
|
+
def self.generate(args = [])
|
|
7
|
+
yardoc_actions = PuppetX::PuppetLabs::Strings::Actions.new(Puppet[:debug], Puppet[:trace])
|
|
8
|
+
|
|
9
|
+
# The last element of the argument array should be the options hash.
|
|
10
|
+
# We don't have any options yet, so for now just pop the hash off and
|
|
11
|
+
# toss it.
|
|
12
|
+
#
|
|
13
|
+
# NOTE: The Puppet Face will throw 'unrecognized option' errors if any
|
|
14
|
+
# YARD options are passed to it. The best way to approach this problem is
|
|
15
|
+
# by using the `.yardopts` file. YARD will autoload any options placed in
|
|
16
|
+
# that file.
|
|
17
|
+
options = args.pop
|
|
18
|
+
YARD::Config.options = YARD::Config.options.merge(options) if options
|
|
19
|
+
|
|
20
|
+
# For now, assume the remaining positional args are a list of manifest
|
|
21
|
+
# and ruby files to parse.
|
|
22
|
+
yard_args = (args.empty? ? MODULE_SOURCEFILES : args)
|
|
23
|
+
|
|
24
|
+
# If json is going to be emitted to stdout, suppress statistics.
|
|
25
|
+
if options && options[:emit_json_stdout]
|
|
26
|
+
yard_args.push('--no-stats')
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
# This line monkeypatches yard's progress indicator so it doesn't write
|
|
30
|
+
# all over the terminal. This should definitely not be in real code, but
|
|
31
|
+
# it's very handy for debugging with pry
|
|
32
|
+
#class YARD::Logger; def progress(*args); end; end
|
|
33
|
+
YARD::Tags::Library.define_directive("puppet.type.param",
|
|
34
|
+
:with_types_and_name,
|
|
35
|
+
PuppetX::PuppetLabs::Strings::YARD::Tags::PuppetTypeParameterDirective)
|
|
36
|
+
|
|
37
|
+
yardoc_actions.generate_documentation(*yard_args)
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def self.serve(args = [])
|
|
41
|
+
server_actions = PuppetX::PuppetLabs::Strings::Actions.new(Puppet[:debug], Puppet[:trace])
|
|
42
|
+
|
|
43
|
+
args.pop
|
|
44
|
+
|
|
45
|
+
module_names = args
|
|
46
|
+
|
|
47
|
+
# FIXME: This is pretty inefficient as it forcibly re-generates the YARD
|
|
48
|
+
# indicies each time the server is started. However, it ensures things are
|
|
49
|
+
# generated properly.
|
|
50
|
+
module_list = server_actions.index_documentation_for_modules(module_names, MODULE_SOURCEFILES)
|
|
51
|
+
|
|
52
|
+
module_tuples = server_actions.generate_module_tuples(module_list)
|
|
53
|
+
|
|
54
|
+
module_tuples.map! do |mod|
|
|
55
|
+
[mod[:name], mod[:index_path]]
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
# The `-m` flag means a list of name/path pairs will follow. The name is
|
|
59
|
+
# used as the module name and the path indicates which `.yardoc` index to
|
|
60
|
+
# generate documentation from.
|
|
61
|
+
yard_args = %w[-m -q] + module_tuples.flatten
|
|
62
|
+
|
|
63
|
+
server_actions.serve_documentation(*yard_args)
|
|
64
|
+
end
|
|
65
|
+
end
|