lib/pdk/template/renderer.rb in pdk-2.4.0 vs lib/pdk/template/renderer.rb in pdk-2.5.0

- old
+ new

@@ -1,96 +1,96 @@ -require 'pdk' - -module PDK - module Template - module Renderer - autoload :V1, 'pdk/template/renderer/v1' - - # Returns the most appropriate renderer for the given Template Directory and Context - # - # @param template_root [String] The path to where the template exists on disk - # @param template_uri [PDK::Util::TemplateUri] A URI which points to the source location of the Template - # @param context [PDK::Context] The context in which the redering will occur in - # - # @return [AbstractRenderer, nil] An instance of an AbstractRenderer subclass. Returns nil if no renderer could be found - def self.instance(template_uri, template_root, context) - return V1.instance(template_root, template_uri, context) if V1.compatible?(template_root, context) - nil - end - - # An abstract class which all Template Renderers should subclass and implement. This class is responsible for - # rendering a template or a single item within a template directory - # - # To implement a new renderer: - # 1. Create a new class which subclasses AbstractRenderer and implements the public methods (has_single_item?, render and render_single_item) - # 2. Add class methods .compatible? and .instance which are used to detect if a template is compatible with the new renderer - # and create an instance of the new renderer respectively - # 3. Update the PDK::Template::Renderer.instance method to detect and create an instance of the new renderer (using the .compatible? and .instance methods - # created in step 2). - # - # See the PDK::Template::Renderer::V1 module and classes for an example on how to to this. - # - # @api private - # @abstract - class AbstractRenderer - # @return [String] The path to where the template exists on disk - attr_reader :template_root - - # @return [PDK::Util::TemplateURI] The URI which points to the source location of the Template - attr_reader :template_uri - - # @return context [PDK::Context] The context in which the redering will occur in - attr_reader :context - - # @param template_root [String] The path to where the template exists on disk - # @param template_uri [PDK::Util::TemplateUri] A URI which points to the source location of the Template - # @param context [PDK::Context] The context in which the redering will occur in - def initialize(template_root, template_uri, context) - @template_root = template_root - @template_uri = template_uri - @context = context - end - - # Whether the renderer supports rendering the a single item called 'item_path'. This is used when rendering things like a new Task or a new Puppet Classes. - # Rendering a single item is different than redering an entire project, like a entire Puppet Module or Control Repo. - # - # @param item_path [String] The path to the item to check - # - # @return [Boolean] Whether the renderer can render the item - # @abstract - def has_single_item?(_item_path) # rubocop:disable Naming/PredicateName Changing the method name to `single_item?` will convey the wrong intent - false - end - - # Loop through the files in the template type, yielding each rendered file to the supplied block. - # - # @param template_type [PDK::Template::*_TEMPLATE_TYPE] The type of template to render - # @param name [String] The name to use in the rendering process - # @param options [Hash{Object => Object}] A list of options to pass through to the renderer. See PDK::Template::TemplateDir helper methods for other options - # @option options [Boolean] :include_first_time Whether to include "first time" items when rendering the project. While it is up to the renderer to implement this - # the expected behavior is that if the item already exists, it will not be rendererd again. Unlike normal items which - # are always rendered to keep them in-sync - # - # @yieldparam dest_path [String] The path of the destination file, relative to the root of the context. - # @yieldparam dest_content [String] The rendered content of the destination file. - # @yieldparam dest_status [Symbol] :unmanage, :delete, :init, :manage - # - # @see PDK::Template::TemplateDir.render - # - # @return [void] - # @abstract - def render(template_type, name, options = {}); end - - # Render a single item and return the resulting string. This is used when rendering things like a new Task or a new Puppet Classes. - # Rendering a single item is different than redering an entire project, like a entire Puppet Module or Control Repo. This method is - # used in conjunction with .has_single_item? - # - # @param item_path [String] The path of the single item to render - # @param template_data_hash [Hash{Object => Object}] A hash of information which will be used in the rendering process - # - # @return [String, Nil] The rendered content, or nil of the file could not be rendered - # @abstract - def render_single_item(item_path, template_data_hash = {}); end - end - end - end -end +require 'pdk' + +module PDK + module Template + module Renderer + autoload :V1, 'pdk/template/renderer/v1' + + # Returns the most appropriate renderer for the given Template Directory and Context + # + # @param template_root [String] The path to where the template exists on disk + # @param template_uri [PDK::Util::TemplateUri] A URI which points to the source location of the Template + # @param context [PDK::Context] The context in which the redering will occur in + # + # @return [AbstractRenderer, nil] An instance of an AbstractRenderer subclass. Returns nil if no renderer could be found + def self.instance(template_uri, template_root, context) + return V1.instance(template_root, template_uri, context) if V1.compatible?(template_root, context) + nil + end + + # An abstract class which all Template Renderers should subclass and implement. This class is responsible for + # rendering a template or a single item within a template directory + # + # To implement a new renderer: + # 1. Create a new class which subclasses AbstractRenderer and implements the public methods (has_single_item?, render and render_single_item) + # 2. Add class methods .compatible? and .instance which are used to detect if a template is compatible with the new renderer + # and create an instance of the new renderer respectively + # 3. Update the PDK::Template::Renderer.instance method to detect and create an instance of the new renderer (using the .compatible? and .instance methods + # created in step 2). + # + # See the PDK::Template::Renderer::V1 module and classes for an example on how to to this. + # + # @api private + # @abstract + class AbstractRenderer + # @return [String] The path to where the template exists on disk + attr_reader :template_root + + # @return [PDK::Util::TemplateURI] The URI which points to the source location of the Template + attr_reader :template_uri + + # @return context [PDK::Context] The context in which the redering will occur in + attr_reader :context + + # @param template_root [String] The path to where the template exists on disk + # @param template_uri [PDK::Util::TemplateUri] A URI which points to the source location of the Template + # @param context [PDK::Context] The context in which the redering will occur in + def initialize(template_root, template_uri, context) + @template_root = template_root + @template_uri = template_uri + @context = context + end + + # Whether the renderer supports rendering the a single item called 'item_path'. This is used when rendering things like a new Task or a new Puppet Classes. + # Rendering a single item is different than redering an entire project, like a entire Puppet Module or Control Repo. + # + # @param item_path [String] The path to the item to check + # + # @return [Boolean] Whether the renderer can render the item + # @abstract + def has_single_item?(_item_path) # rubocop:disable Naming/PredicateName Changing the method name to `single_item?` will convey the wrong intent + false + end + + # Loop through the files in the template type, yielding each rendered file to the supplied block. + # + # @param template_type [PDK::Template::*_TEMPLATE_TYPE] The type of template to render + # @param name [String] The name to use in the rendering process + # @param options [Hash{Object => Object}] A list of options to pass through to the renderer. See PDK::Template::TemplateDir helper methods for other options + # @option options [Boolean] :include_first_time Whether to include "first time" items when rendering the project. While it is up to the renderer to implement this + # the expected behavior is that if the item already exists, it will not be rendererd again. Unlike normal items which + # are always rendered to keep them in-sync + # + # @yieldparam dest_path [String] The path of the destination file, relative to the root of the context. + # @yieldparam dest_content [String] The rendered content of the destination file. + # @yieldparam dest_status [Symbol] :unmanage, :delete, :init, :manage + # + # @see PDK::Template::TemplateDir.render + # + # @return [void] + # @abstract + def render(template_type, name, options = {}); end + + # Render a single item and return the resulting string. This is used when rendering things like a new Task or a new Puppet Classes. + # Rendering a single item is different than redering an entire project, like a entire Puppet Module or Control Repo. This method is + # used in conjunction with .has_single_item? + # + # @param item_path [String] The path of the single item to render + # @param template_data_hash [Hash{Object => Object}] A hash of information which will be used in the rendering process + # + # @return [String, Nil] The rendered content, or nil of the file could not be rendered + # @abstract + def render_single_item(item_path, template_data_hash = {}); end + end + end + end +end