158 lines
5.1 KiB
Ruby
158 lines
5.1 KiB
Ruby
require 'puppet-strings'
|
|
require 'puppet-strings/json'
|
|
require 'puppet-strings/yard'
|
|
|
|
module PuppetStrings::Markdown
|
|
# This class makes elements in a YARD::Registry hash easily accessible for templates.
|
|
#
|
|
# Here's an example hash:
|
|
#{:name=>:klass,
|
|
# :file=>"(stdin)",
|
|
# :line=>16,
|
|
# :inherits=>"foo::bar",
|
|
# :docstring=>
|
|
# {:text=>"An overview for a simple class.",
|
|
# :tags=>
|
|
# [{:tag_name=>"summary", :text=>"A simple class."},
|
|
# {:tag_name=>"since", :text=>"1.0.0"},
|
|
# {:tag_name=>"see", :name=>"www.puppet.com"},
|
|
# {:tag_name=>"example",
|
|
# :text=>
|
|
# "class { 'klass':\n" +
|
|
# " param1 => 1,\n" +
|
|
# " param3 => 'foo',\n" +
|
|
# "}",
|
|
# :name=>"This is an example"},
|
|
# {:tag_name=>"author", :text=>"eputnam"},
|
|
# {:tag_name=>"option", :name=>"opts"},
|
|
# {:tag_name=>"raise", :text=>"SomeError"},
|
|
# {:tag_name=>"param",
|
|
# :text=>"First param.",
|
|
# :types=>["Integer"],
|
|
# :name=>"param1"},
|
|
# {:tag_name=>"param",
|
|
# :text=>"Second param.",
|
|
# :types=>["Any"],
|
|
# :name=>"param2"},
|
|
# {:tag_name=>"param",
|
|
# :text=>"Third param.",
|
|
# :types=>["String"],
|
|
# :name=>"param3"}]},
|
|
# :defaults=>{"param1"=>"1", "param2"=>"undef", "param3"=>"'hi'"},
|
|
# :source=>
|
|
# "class klass (\n" +
|
|
# " Integer $param1 = 1,\n" +
|
|
# " $param2 = undef,\n" +
|
|
# " String $param3 = 'hi'\n" +
|
|
# ") inherits foo::bar {\n" +
|
|
# "}"}
|
|
class Base
|
|
def initialize(registry, component_type)
|
|
@type = component_type
|
|
@registry = registry
|
|
@tags = registry[:docstring][:tags] || []
|
|
end
|
|
|
|
# generate 1:1 tag methods
|
|
# e.g. {:tag_name=>"author", :text=>"eputnam"}
|
|
{ :return_val => 'return',
|
|
:since => 'since',
|
|
:summary => 'summary' }.each do |method_name, tag_name|
|
|
define_method method_name do
|
|
@tags.select { |tag| tag[:tag_name] == "#{tag_name}" }[0][:text] unless @tags.select { |tag| tag[:tag_name] == "#{tag_name}" }[0].nil?
|
|
end
|
|
end
|
|
|
|
# @return [String] top-level name
|
|
def name
|
|
@registry[:name].to_s unless @registry[:name].nil?
|
|
end
|
|
|
|
# @return [String] 'Overview' text (untagged text)
|
|
def text
|
|
@registry[:docstring][:text] unless @registry[:docstring][:text].empty?
|
|
end
|
|
|
|
# @return [String] data type of return value
|
|
def return_type
|
|
@tags.select { |tag| tag[:tag_name] == 'return' }[0][:types][0] unless @tags.select { |tag| tag[:tag_name] == 'return' }[0].nil?
|
|
end
|
|
|
|
# @return [String] text from @since tag
|
|
def since
|
|
@tags.select { |tag| tag[:tag_name] == 'since' }[0][:text] unless @tags.select { |tag| tag[:tag_name] == 'since' }[0].nil?
|
|
end
|
|
|
|
# @return [Array] @see tag hashes
|
|
def see
|
|
@tags.select { |tag| tag[:tag_name] == 'see' } unless @tags.select { |tag| tag[:tag_name] == 'see' }[0].nil?
|
|
end
|
|
|
|
# @return [Array] parameter tag hashes
|
|
def params
|
|
@tags.select { |tag| tag[:tag_name] == 'param' } unless @tags.select { |tag| tag[:tag_name] == 'param' }[0].nil?
|
|
end
|
|
|
|
# @return [Array] example tag hashes
|
|
def examples
|
|
@tags.select { |tag| tag[:tag_name] == 'example' } unless @tags.select { |tag| tag[:tag_name] == 'example' }[0].nil?
|
|
end
|
|
|
|
# @return [Array] raise tag hashes
|
|
def raises
|
|
@tags.select { |tag| tag[:tag_name] == 'raise' } unless @tags.select { |tag| tag[:tag_name] == 'raise' }[0].nil?
|
|
end
|
|
|
|
# @return [Array] option tag hashes
|
|
def options
|
|
@tags.select { |tag| tag[:tag_name] == 'option' } unless @tags.select { |tag| tag[:tag_name] == 'option' }[0].nil?
|
|
end
|
|
|
|
# @param parameter_name
|
|
# parameter name to match to option tags
|
|
# @return [Array] option tag hashes that have a parent parameter_name
|
|
def options_for_param(parameter_name)
|
|
opts_for_p = options.select { |o| o[:parent] == parameter_name } unless options.nil?
|
|
opts_for_p unless opts_for_p.nil? || opts_for_p.length.zero?
|
|
end
|
|
|
|
# @return [Array] any defaults found for the component
|
|
def defaults
|
|
@registry[:defaults] unless @registry[:defaults].nil?
|
|
end
|
|
|
|
# @return [Hash] information needed for the table of contents
|
|
def toc_info
|
|
{
|
|
name: name.to_s,
|
|
link: link,
|
|
desc: summary || @registry[:docstring][:text].gsub("\n", ". ")
|
|
}
|
|
end
|
|
|
|
# @return [String] makes the component name suitable for a GitHub markdown link
|
|
def link
|
|
name.delete('::').strip.gsub(' ','-').downcase
|
|
end
|
|
|
|
# Some return, default, or valid values need to be in backticks. Instead of fu in the handler or code_object, this just does the change on the front.
|
|
# @param value
|
|
# any string
|
|
# @return [String] value or value in backticks if it is in a list
|
|
def value_string(value)
|
|
to_symbol = %w[undef true false]
|
|
if to_symbol.include? value
|
|
return "`#{value}`"
|
|
else
|
|
return value
|
|
end
|
|
end
|
|
|
|
# @return [String] full markdown rendering of a component
|
|
def render(template)
|
|
file = File.join(File.dirname(__FILE__),"templates/#{template}")
|
|
ERB.new(File.read(file), nil, '-').result(binding)
|
|
end
|
|
end
|
|
end
|