class FluentPluginConfigFormatter

Constants

AVAILABLE_FORMATS
SUPPORTED_TYPES

Public Class Methods

new(argv = ARGV) click to toggle source
# File lib/fluent/command/plugin_config_formatter.rb, line 34
def initialize(argv = ARGV)
  @argv = argv

  @compact = false
  @format = :markdown
  @verbose = false
  @libs = []
  @plugin_dirs = []
  @options = {}

  prepare_option_parser
end

Public Instance Methods

call() click to toggle source
# File lib/fluent/command/plugin_config_formatter.rb, line 47
def call
  parse_options!
  init_libraries
  @plugin = Fluent::Plugin.__send__("new_#{@plugin_type}", @plugin_name)
  dumped_config = {}
  if @plugin.class.respond_to?(:plugin_helpers)
    dumped_config[:plugin_helpers] = @plugin.class.plugin_helpers
  end
  @plugin.class.ancestors.reverse_each do |plugin_class|
    next unless plugin_class.respond_to?(:dump_config_definition)
    unless @verbose
      next if plugin_class.name =~ /::PluginHelper::/
    end
    dumped_config_definition = plugin_class.dump_config_definition
    dumped_config[plugin_class.name] = dumped_config_definition unless dumped_config_definition.empty?
  end
  case @format
  when :txt
    puts dump_txt(dumped_config)
  when :markdown
    puts dump_markdown(dumped_config)
  when :json
    puts dump_json(dumped_config)
  end
end

Private Instance Methods

dump_json(dumped_config) click to toggle source
# File lib/fluent/command/plugin_config_formatter.rb, line 177
def dump_json(dumped_config)
  if @compact
    JSON.generate(dumped_config)
  else
    JSON.pretty_generate(dumped_config)
  end
end
dump_markdown(dumped_config) click to toggle source
# File lib/fluent/command/plugin_config_formatter.rb, line 131
def dump_markdown(dumped_config)
  dumped = ""
  plugin_helpers = dumped_config.delete(:plugin_helpers)
  if plugin_helpers && !plugin_helpers.empty?
    dumped = "## Plugin helpers\n\n"
    plugin_helpers.each do |plugin_helper|
      dumped << "* #{plugin_helper}\n"
    end
    dumped << "\n"
  end
  dumped_config.each do |name, config|
    if name == @plugin.class.name
      dumped << "## #{name}\n\n"
      dumped << dump_section_markdown(config)
    else
      dumped << "* See also: #{name}\n\n"
    end
  end
  dumped
end
dump_section_markdown(base_section, level = 0) click to toggle source
# File lib/fluent/command/plugin_config_formatter.rb, line 152
def dump_section_markdown(base_section, level = 0)
  dumped = ""
  if base_section[:section]
    sections = []
    params = base_section
  else
    sections, params = base_section.partition {|_name, value| value[:section] }
  end
  params.each do |name, config|
    next if name == :section
    template_name = @compact ? "param.md-compact.erb" : "param.md.erb"
    dumped << ERB.new(template_path(template_name).read, nil, "-").result(binding)
  end
  dumped << "\n"
  sections.each do |section_name, sub_section|
    required = sub_section.delete(:required)
    multi = sub_section.delete(:multi)
    alias_name = sub_section.delete(:alias)
    $log.trace(name: section_name, required: required, multi: multi, alias_name: alias_name)
    sub_section.delete(:section)
    dumped << ERB.new(template_path("section.md.erb").read, nil, "-").result(binding)
  end
  dumped
end
dump_section_txt(base_section, level = 0) click to toggle source
# File lib/fluent/command/plugin_config_formatter.rb, line 97
def dump_section_txt(base_section, level = 0)
  dumped = ""
  indent = " " * level
  if base_section[:section]
    sections = []
    params = base_section
  else
    sections, params = base_section.partition {|_name, value| value[:section] }
  end
  params.each do |name, config|
    next if name == :section
    dumped << "#{indent}#{name}: #{config[:type]}: (#{config[:default].inspect})"
    dumped << " # #{config[:description]}" if config.key?(:description)
    dumped << "\n"
  end
  sections.each do |section_name, sub_section|
    required = sub_section.delete(:required)
    multi = sub_section.delete(:multi)
    alias_name = sub_section.delete(:alias)
    required_label = required ? "required" : "optional"
    multi_label = multi ? "multiple" : "single"
    alias_label = "alias: #{alias_name}"
    dumped << "#{indent}<#{section_name}>: #{required_label}, #{multi_label}"
    if alias_name
      dumped << ", #{alias_label}\n"
    else
      dumped << "\n"
    end
    sub_section.delete(:section)
    dumped << dump_section_txt(sub_section, level + 1)
  end
  dumped
end
dump_txt(dumped_config) click to toggle source
# File lib/fluent/command/plugin_config_formatter.rb, line 75
def dump_txt(dumped_config)
  dumped = ""
  plugin_helpers = dumped_config.delete(:plugin_helpers)
  if plugin_helpers && !plugin_helpers.empty?
    dumped << "helpers: #{plugin_helpers.join(',')}\n"
  end
  if @verbose
    dumped_config.each do |name, config|
      dumped << "#{name}\n"
      dumped << dump_section_txt(config)
    end
  else
    configs = dumped_config.values
    root_section = configs.shift
    configs.each do |config|
      root_section.update(config)
    end
    dumped << dump_section_txt(root_section)
  end
  dumped
end
init_libraries() click to toggle source
# File lib/fluent/command/plugin_config_formatter.rb, line 242
def init_libraries
  @libs.each do |lib|
    require lib
  end

  @plugin_dirs.each do |dir|
    if Dir.exist?(dir)
      dir = File.expand_path(dir)
      Fluent::Plugin.add_plugin_dir(dir)
    end
  end
end
parse_options!() click to toggle source
# File lib/fluent/command/plugin_config_formatter.rb, line 227
def parse_options!
  @parser.parse!(@argv)

  raise "Must specify plugin type and name" unless @argv.size == 2

  @plugin_type, @plugin_name = @argv
  @options = {
    compact: @compact,
    format: @format,
    verbose: @verbose,
  }
rescue => e
  usage(e)
end
prepare_option_parser() click to toggle source
# File lib/fluent/command/plugin_config_formatter.rb, line 192
  def prepare_option_parser
    @parser = OptionParser.new
    @parser.banner = <<BANNER
Usage: #{$0} [options] <type> <name>

Output plugin config definitions

Arguments:
\ttype: #{SUPPORTED_TYPES.join(",")}
\tname: registered plugin name

Options:
BANNER
    @parser.on("--verbose", "Be verbose") do
      @verbose = true
    end
    @parser.on("-c", "--compact", "Compact output") do
      @compact = true
    end
    @parser.on("-f", "--format=FORMAT", "Specify format. (#{AVAILABLE_FORMATS.join(',')})") do |s|
      format = s.to_sym
      usage("Unsupported format: #{s}") unless AVAILABLE_FORMATS.include?(format)
      @format = format
    end
    @parser.on("-I PATH", "Add PATH to $LOAD_PATH") do |s|
      $LOAD_PATH.unshift(s)
    end
    @parser.on("-r NAME", "Load library") do |s|
      @libs << s
    end
    @parser.on("-p", "--plugin=DIR", "Add plugin directory") do |s|
      @plugin_dirs << s
    end
  end
template_path(name) click to toggle source
# File lib/fluent/command/plugin_config_formatter.rb, line 255
def template_path(name)
  (Pathname(__dir__) + "../../../templates/plugin_config_formatter/#{name}").realpath
end
usage(message = nil) click to toggle source
# File lib/fluent/command/plugin_config_formatter.rb, line 185
def usage(message = nil)
  puts @parser.to_s
  puts
  puts "Error: #{message}" if message
  exit(false)
end