Move Puppet classes into a custom namespace
Instead of documenting Puppet classes using `ClassObject`, use a custom subclass of `NamespaceObject`. This is done because Puppet classes are not Ruby classes and will have components that don't fit into the model offered by `ClassObject`. This commit also adds a couple of monkey patches to integrate the new `:hostclass` into YARD tooling and the beginnings of some custom templating.
This commit is contained in:
		
							parent
							
								
									35e67f1187
								
							
						
					
					
						commit
						e3d2602cba
					
				| 
						 | 
				
			
			@ -0,0 +1 @@
 | 
			
		|||
require_relative 'code_objects/host_class_object'
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,10 @@
 | 
			
		|||
require 'yard'
 | 
			
		||||
require 'puppet/pops'
 | 
			
		||||
 | 
			
		||||
require_relative '../../../yardoc'
 | 
			
		||||
 | 
			
		||||
module Puppetx::Yardoc::YARD::CodeObjects
 | 
			
		||||
  class HostClassObject < YARD::CodeObjects::NamespaceObject
 | 
			
		||||
    # Nothing to see here yet...
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
| 
						 | 
				
			
			@ -2,10 +2,14 @@ require 'yard'
 | 
			
		|||
require 'puppet/pops'
 | 
			
		||||
 | 
			
		||||
require_relative '../../../yardoc'
 | 
			
		||||
require_relative '../code_objects'
 | 
			
		||||
 | 
			
		||||
module Puppetx::Yardoc::YARD::Handlers
 | 
			
		||||
  class Base < YARD::Handlers::Base
 | 
			
		||||
    include Puppet::Pops::Model # This allows handlers to match based on model classes.
 | 
			
		||||
    # Easy access to Pops model objects for handler matching.
 | 
			
		||||
    include Puppet::Pops::Model
 | 
			
		||||
    # Easy access to custom code objects from which documentation is generated.
 | 
			
		||||
    include Puppetx::Yardoc::YARD::CodeObjects
 | 
			
		||||
 | 
			
		||||
    def self.handles?(statement)
 | 
			
		||||
      handlers.any? {|h| h == statement.type}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -5,7 +5,7 @@ module Puppetx::Yardoc::YARD::Handlers
 | 
			
		|||
    handles HostClassDefinition
 | 
			
		||||
 | 
			
		||||
    process do
 | 
			
		||||
      register YARD::CodeObjects::ClassObject.new(:root, statement.pops_obj.name)
 | 
			
		||||
      register HostClassObject.new(:root, statement.pops_obj.name)
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -0,0 +1,17 @@
 | 
			
		|||
require 'yard'
 | 
			
		||||
 | 
			
		||||
# TODO: As far as I can tell, monkeypatching is the officially recommended way
 | 
			
		||||
# to extend these tools to cover custom usecases. Follow up on the YARD mailing
 | 
			
		||||
# list or IRC to see if there is a better way.
 | 
			
		||||
 | 
			
		||||
class YARD::CLI::Yardoc
 | 
			
		||||
  def all_objects
 | 
			
		||||
    YARD::Registry.all(:root, :module, :class, :hostclass)
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
class YARD::CLI::Stats
 | 
			
		||||
  def stats_for_hostclasses
 | 
			
		||||
    output 'Puppet Classes', *type_statistics(:hostclass)
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
| 
						 | 
				
			
			@ -3,6 +3,7 @@ if RUBY_VERSION < '1.9'
 | 
			
		|||
  require 'backports/1.9.1/kernel/require_relative'
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
require_relative 'monkey_patches'
 | 
			
		||||
require_relative 'parser'
 | 
			
		||||
require_relative 'handlers'
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -11,3 +12,9 @@ YARD::Parser::SourceParser.register_parser_type(:puppet,
 | 
			
		|||
  ['pp'])
 | 
			
		||||
YARD::Handlers::Processor.register_handler_namespace(:puppet,
 | 
			
		||||
  Puppetx::Yardoc::YARD::Handlers)
 | 
			
		||||
 | 
			
		||||
# FIXME: Might not be the best idea to have the template code on the Ruby
 | 
			
		||||
# LOAD_PATH as the contents of this directory really aren't library code.
 | 
			
		||||
YARD::Templates::Engine.register_template_path(File.join(
 | 
			
		||||
  File.dirname(__FILE__),
 | 
			
		||||
  'templates'))
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -0,0 +1,5 @@
 | 
			
		|||
include T('default/module/html')
 | 
			
		||||
 | 
			
		||||
def init
 | 
			
		||||
  sections :header, :box_info, :pre_docstring, T('docstring'), :children
 | 
			
		||||
end
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,9 @@
 | 
			
		|||
# TODO: This should be extendable. However, the re-assignment of
 | 
			
		||||
# @objects_by_letter prevents that. Submit a pull request.
 | 
			
		||||
def index
 | 
			
		||||
  @objects_by_letter = {}
 | 
			
		||||
  objects = Registry.all(:class, :module, :hostclass).sort_by {|o| o.name.to_s }
 | 
			
		||||
  objects = run_verifier(objects)
 | 
			
		||||
  objects.each {|o| (@objects_by_letter[o.name.to_s[0,1].upcase] ||= []) << o }
 | 
			
		||||
  erb(:index)
 | 
			
		||||
end
 | 
			
		||||
		Loading…
	
		Reference in New Issue