realityforge/knife-cookbook-doc

View on GitHub
lib/chef/knife/cookbook_doc.rb

Summary

Maintainability
A
0 mins
Test Coverage
require 'chef/knife'
require 'pathname'

module KnifeCookbookDoc
  class CookbookDoc < Chef::Knife
    deps do
      require 'chef/cookbook/metadata'
      require 'erubis'
      require 'knife_cookbook_doc/base_model'
      require 'knife_cookbook_doc/documenting_lwrp_base'
      require 'knife_cookbook_doc/definitions_model'
      require 'knife_cookbook_doc/libraries_model'
      require 'knife_cookbook_doc/readme_model'
      require 'knife_cookbook_doc/recipe_model'
      require 'knife_cookbook_doc/resource_model'
      require 'knife_cookbook_doc/attributes_model'
    end

    banner 'knife cookbook doc DIR (options)'

    option :constraints,
           :short => '-c',
           :long => '--constraints',
           :boolean => true,
           :default => true,
           :description => 'Include version constraints for platforms and dependencies'

    option :output_file,
           :short => '-o',
           :long => '--output-file FILE',
           :default => 'README.md',
           :description => 'Set the output file to render to relative to cookbook dir. Defaults to README.md'

    option :template_file,
           :short => '-t',
           :long => '--template FILE',
           :default => Pathname.new("#{File.dirname(__FILE__)}/README.md.erb").realpath,
           :description => 'Set template file used to render README.md'

    option :ignore_missing_attribute_desc,
           :long => '--ignore-missing-doc-attr',
           :boolean => true,
           :default => false,
           :description => 'Ignore attributes without documetation'

    option :metadata,
           :long => '--metadata FILE',
           :default => 'metadata.rb',
           :description => 'metadata.rb path'

    def run
      unless (cookbook_dir = name_args.first)
        ui.fatal 'Please provide cookbook directory as an argument'
        exit(1)
      end

      cookbook_dir = File.realpath(cookbook_dir)

      model = ReadmeModel.new(cookbook_dir, config)

      template = File.read(config[:template_file])
      eruby = Erubis::Eruby.new(template)
      result = eruby.result(model.get_binding)

      File.open("#{cookbook_dir}/#{config[:output_file]}", 'wb') do |f|
        result.each_line do |line|
          f.write line.gsub(/[ \t\r\n]*$/,'')
          f.write "\n"
        end
      end
    end
  end
end