class Generators::PuppetGenerator

This is a specialized HTMLGenerator tailored to Puppet manifests

Public Class Methods

for(options) click to toggle source
   # File lib/puppet/util/rdoc/generators/puppet_generator.rb
56 def PuppetGenerator.for(options)
57   AllReferences::reset
58   HtmlMethod::reset
59 
60   if options.all_one_file
61     PuppetGeneratorInOne.new(options)
62   else
63     PuppetGenerator.new(options)
64   end
65 end

Public Instance Methods

build_indices() click to toggle source

Generate:

the list of modules
the list of classes and definitions of a specific module
the list of all classes
the list of nodes
the list of resources
    # File lib/puppet/util/rdoc/generators/puppet_generator.rb
101 def build_indices
102   @allfiles = []
103   @nodes = []
104   @plugins = []
105 
106   # contains all the seen modules
107   @modules = {}
108   @allclasses = {}
109 
110   # remove unknown toplevels
111   # it can happen that RDoc triggers a different parser for some files (ie .c, .cc or .h)
112   # in this case RDoc generates a RDoc::TopLevel which we do not support in this generator
113   # So let's make sure we don't generate html for those.
114   @toplevels = @toplevels.select { |tl| tl.is_a? RDoc::PuppetTopLevel }
115 
116   # build the modules, classes and per modules classes and define list
117   @toplevels.each do |toplevel|
118     next unless toplevel.document_self
119     file = HtmlFile.new(toplevel, @options, FILE_DIR)
120     classes = []
121     methods = []
122     modules = []
123     nodes = []
124 
125     # find all classes of this toplevel
126     # store modules if we find one
127     toplevel.each_classmodule do |k|
128       generate_class_list(classes, modules, k, toplevel, CLASS_DIR)
129     end
130 
131     # find all defines belonging to this toplevel
132     HtmlMethod.all_methods.each do |m|
133       # find parent module, check this method is not already
134       # defined.
135       if m.context.parent.toplevel === toplevel
136         methods << m
137       end
138     end
139 
140     classes.each do |k|
141       @allclasses[k.index_name] = k if !@allclasses.has_key?(k.index_name)
142     end
143 
144     # generate nodes and plugins found
145     classes.each do |k|
146       if k.context.is_module?
147         k.context.each_node do |name,node|
148           nodes << HTMLPuppetNode.new(node, toplevel, NODE_DIR, @options)
149           @nodes << nodes.last
150         end
151         k.context.each_plugin do |plugin|
152           @plugins << HTMLPuppetPlugin.new(plugin, toplevel, PLUGIN_DIR, @options)
153         end
154         k.context.each_fact do |fact|
155           @plugins << HTMLPuppetPlugin.new(fact, toplevel, PLUGIN_DIR, @options)
156         end
157       end
158     end
159 
160     @files << file
161     @allfiles << { "file" => file, "modules" => modules, "classes" => classes, "methods" => methods, "nodes" => nodes }
162   end
163 
164   # scan all classes to create the child's references
165   @allclasses.values.each do |klass|
166     superklass = klass.context.superclass
167     if superklass
168       superklass = AllReferences[superklass]
169       if superklass && (superklass.is_a?(HTMLPuppetClass) || superklass.is_a?(HTMLPuppetNode))
170         superklass.context.add_child(klass.context)
171       end
172     end
173   end
174 
175   @classes = @allclasses.values
176 end
gen_class_index() click to toggle source

generate the all classes index file and the combo index

    # File lib/puppet/util/rdoc/generators/puppet_generator.rb
237 def gen_class_index
238   gen_an_index(@classes, 'All Classes', RDoc::Page::CLASS_INDEX, "fr_class_index.html")
239   @allfiles.each do |file|
240     unless file['file'].context.file_relative_name =~ /\.rb$/
241 
242       gen_composite_index(
243         file,
244           RDoc::Page::COMBO_INDEX,
245 
246           "#{MODULE_DIR}/fr_#{file["file"].context.module_name}.html")
247     end
248   end
249 end
gen_composite_index(collection, template, filename) click to toggle source
    # File lib/puppet/util/rdoc/generators/puppet_generator.rb
251 def gen_composite_index(collection, template, filename)
252   return if Puppet::FileSystem.exist?(filename)
253 
254   template = TemplatePage.new(RDoc::Page::FR_INDEX_BODY, template)
255   res1 = []
256   collection['classes'].sort.each do |f|
257     if f.document_self
258       res1 << { "href" => "../"+CGI.escapeHTML(f.path), "name" => CGI.escapeHTML(f.index_name) } unless f.context.is_module?
259     end
260   end
261 
262   res2 = []
263   collection['methods'].sort.each do |f|
264     res2 << { "href" => "../#{f.path}", "name" => f.index_name.sub(/\(.*\)$/,'') } if f.document_self
265   end
266 
267   module_name = []
268   res3 = []
269   res4 = []
270   collection['modules'].sort.each do |f|
271     module_name << { "href" => "../"+CGI.escapeHTML(f.path), "name" => CGI.escapeHTML(f.index_name) }
272     unless f.facts.nil?
273       f.facts.each do |fact|
274         res3 << {"href" => "../"+CGI.escapeHTML(AllReferences["PLUGIN(#{fact.name})"].path), "name" => CGI.escapeHTML(fact.name)}
275       end
276     end
277     unless f.plugins.nil?
278       f.plugins.each do |plugin|
279         res4 << {"href" => "../"+CGI.escapeHTML(AllReferences["PLUGIN(#{plugin.name})"].path), "name" => CGI.escapeHTML(plugin.name)}
280       end
281     end
282   end
283 
284   res5 = []
285   collection['nodes'].sort.each do |f|
286     res5 << { "href" => "../"+CGI.escapeHTML(f.path), "name" => CGI.escapeHTML(f.name) } if f.document_self
287   end
288 
289   values = {
290     "module" => module_name,
291     "classes"    => res1,
292     'classes_title' => CGI.escapeHTML("Classes"),
293     'defines_title' => CGI.escapeHTML("Defines"),
294     'facts_title' => CGI.escapeHTML("Custom Facts"),
295     'plugins_title' => CGI.escapeHTML("Plugins"),
296     'nodes_title' => CGI.escapeHTML("Nodes"),
297     'index_url'  => main_url,
298     'charset'    => @options.charset,
299     'style_url'  => style_url('', @options.css),
300   }
301 
302   values["defines"] = res2 if res2.size>0
303   values["facts"] = res3 if res3.size>0
304   values["plugins"] = res4 if res4.size>0
305   values["nodes"] = res5 if res5.size>0
306 
307   Puppet::FileSystem.open(filename, nil, "w:UTF-8") do |f|
308     template.write_html_on(f, values)
309   end
310 end
gen_file_index() click to toggle source

generate the index of modules

    # File lib/puppet/util/rdoc/generators/puppet_generator.rb
209 def gen_file_index
210   gen_top_index(@modules.values, 'All Modules', RDoc::Page::TOP_INDEX, "fr_modules_index.html")
211 end
gen_method_index() click to toggle source
   # File lib/puppet/util/rdoc/generators/puppet_generator.rb
81 def gen_method_index
82   # we don't generate an all define index
83   # as the presentation is per module/per class
84 end
gen_sub_directories() click to toggle source

generate all the subdirectories, modules, classes and files

Calls superclass method
    # File lib/puppet/util/rdoc/generators/puppet_generator.rb
198 def gen_sub_directories
199     super
200     File.makedirs(MODULE_DIR)
201     File.makedirs(NODE_DIR)
202     File.makedirs(PLUGIN_DIR)
203 rescue
204     $stderr.puts $ERROR_INFO.message
205     exit 1
206 end
gen_top_index(collection, title, template, filename) click to toggle source

generate a top index

    # File lib/puppet/util/rdoc/generators/puppet_generator.rb
214 def gen_top_index(collection, title, template, filename)
215   template = TemplatePage.new(RDoc::Page::FR_INDEX_BODY, template)
216   res = []
217   collection.sort.each do |f|
218     if f.document_self
219       res << { "classlist" => CGI.escapeHTML("#{MODULE_DIR}/fr_#{f.index_name}.html"), "module" => CGI.escapeHTML("#{CLASS_DIR}/#{f.index_name}.html"),"name" => CGI.escapeHTML(f.index_name) }
220     end
221   end
222 
223   values = {
224     "entries"    => res,
225     'list_title' => CGI.escapeHTML(title),
226     'index_url'  => main_url,
227     'charset'    => @options.charset,
228     'style_url'  => style_url('', @options.css),
229   }
230 
231   Puppet::FileSystem.open(filename, nil, "w:UTF-8") do |f|
232     template.write_html_on(f, values)
233   end
234 end
generate_class_list(classes, modules, from, html_file, class_dir) click to toggle source

produce a class/module list of HTMLPuppetModule/HTMLPuppetClass based on the code object traversal.

    # File lib/puppet/util/rdoc/generators/puppet_generator.rb
180 def generate_class_list(classes, modules, from, html_file, class_dir)
181   if from.is_module? and !@modules.has_key?(from.name)
182     k = HTMLPuppetModule.new(from, html_file, class_dir, @options)
183     classes << k
184     @modules[from.name] = k
185     modules << @modules[from.name]
186   elsif from.is_module?
187     modules << @modules[from.name]
188   elsif !from.is_module?
189     k = HTMLPuppetClass.new(from, html_file, class_dir, @options)
190     classes << k
191   end
192   from.each_classmodule do |mod|
193     generate_class_list(classes, modules, mod, html_file, class_dir)
194   end
195 end
generate_html() click to toggle source

This is the central method, it generates the whole structures along with all the indices.

Calls superclass method
   # File lib/puppet/util/rdoc/generators/puppet_generator.rb
88 def generate_html
89   super
90   gen_into(@nodes)
91   gen_into(@plugins)
92 end
load_html_template() click to toggle source

loads our own html template file

   # File lib/puppet/util/rdoc/generators/puppet_generator.rb
73 def load_html_template
74     require_relative '../../../../puppet/util/rdoc/generators/template/puppet/puppet'
75     extend RDoc::Page
76 rescue LoadError
77     $stderr.puts "Could not find Puppet template '#{template}'"
78     exit 99
79 end
main_url() click to toggle source

returns the initial_page url

    # File lib/puppet/util/rdoc/generators/puppet_generator.rb
313 def main_url
314   main_page = @options.main_page
315   ref = nil
316   if main_page
317     ref = AllReferences[main_page]
318     if ref
319       ref = ref.path
320     else
321       $stderr.puts "Could not find main page #{main_page}"
322     end
323   end
324 
325   unless ref
326     for file in @files
327       if file.document_self and file.context.global
328         ref = CGI.escapeHTML("#{CLASS_DIR}/#{file.context.module_name}.html")
329         break
330       end
331     end
332   end
333 
334   unless ref
335     for file in @files
336       if file.document_self and !file.context.global
337         ref = CGI.escapeHTML("#{CLASS_DIR}/#{file.context.module_name}.html")
338         break
339       end
340     end
341   end
342 
343   unless ref
344     $stderr.puts "Couldn't find anything to document"
345     $stderr.puts "Perhaps you've used :stopdoc: in all classes"
346     exit(1)
347   end
348 
349   ref
350 end

Protected Instance Methods

initialize(options) click to toggle source
   # File lib/puppet/util/rdoc/generators/puppet_generator.rb
67 def initialize(options) #:not-new:
68   @options    = options
69   load_html_template
70 end