puppet-strings 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|