puppet-strings/lib/puppet-strings/yard.rb

97 lines
3.0 KiB
Ruby

require 'yard'
# Module for YARD related functionality.
module PuppetStrings::Yard
require 'puppet-strings/yard/code_objects'
require 'puppet-strings/yard/handlers'
require 'puppet-strings/yard/tags'
require 'puppet-strings/yard/parsers'
# Sets up YARD for use with puppet-strings.
# @return [void]
def self.setup!
# Register the template path
YARD::Templates::Engine.register_template_path(File.join(File.dirname(__FILE__), 'yard', 'templates'))
# Register the Puppet parser
YARD::Parser::SourceParser.register_parser_type(:puppet, PuppetStrings::Yard::Parsers::Puppet::Parser, ['pp'])
# Register our handlers
YARD::Handlers::Processor.register_handler_namespace(:puppet, PuppetStrings::Yard::Handlers::Puppet)
YARD::Handlers::Processor.register_handler_namespace(:puppet_ruby, PuppetStrings::Yard::Handlers::Ruby)
# Register the tag directives
PuppetStrings::Yard::Tags::ParameterDirective.register!
PuppetStrings::Yard::Tags::PropertyDirective.register!
# Ignore documentation on Puppet DSL calls
# This prevents the YARD DSL parser from emitting warnings for Puppet's Ruby DSL
YARD::Handlers::Ruby::DSLHandlerMethods::IGNORE_METHODS['create_function'] = true
YARD::Handlers::Ruby::DSLHandlerMethods::IGNORE_METHODS['newtype'] = true
end
end
# Monkey patch YARD::CLI::Yardoc#all_objects to return our custom code objects.
# @private
class YARD::CLI::Yardoc
def all_objects
YARD::Registry.all(
:root,
:module,
:class,
:puppet_class,
:puppet_defined_type,
:puppet_type,
:puppet_provider,
:puppet_function
)
end
end
# Monkey patch the stats object to return statistics for our objects.
# This is the recommended way to add custom stats.
# @private
class YARD::CLI::Stats
def stats_for_puppet_classes
output 'Puppet Classes', *type_statistics_all(:puppet_class)
end
def stats_for_puppet_defined_types
output 'Puppet Defined Types', *type_statistics_all(:puppet_defined_type)
end
def stats_for_puppet_types
output 'Puppet Types', *type_statistics_all(:puppet_type)
end
def stats_for_puppet_providers
output 'Puppet Providers', *type_statistics_all(:puppet_provider)
end
def stats_for_puppet_functions
output 'Puppet Functions', *type_statistics_all(:puppet_function)
end
def output(name, data, undoc = nil)
# Monkey patch output to accommodate our larger header widths
@total += data if data.is_a?(Integer) && undoc
@undocumented += undoc if undoc.is_a?(Integer)
data =
if undoc
('%5s (% 5d undocumented)' % [data, undoc])
else
'%5s' % data
end
log.puts('%-21s %s' % [name + ':', data])
end
# This differs from the YARD implementation in that it considers
# a docstring without text but with tags to be undocumented.
def type_statistics_all(type)
objs = all_objects.select {|m| m.type == type }
undoc = objs.find_all {|m| m.docstring.all.empty? }
@undoc_list |= undoc if @undoc_list
[objs.size, undoc.size]
end
end