module Erber::CLI

Public Class Methods

go() click to toggle source
# File lib/erber/cli.rb, line 11
def self.go
  parser = Trollop::Parser.new do
    opt :property_file, "Property file to include (JSON or YAML)", :type => :string, :multi => true
    opt :override_property, "'dotted.key.name=value' property to inject.", :type => :string, :multi => true
  end

  opts = parser.parse(ARGV)
  filenames = parser.leftovers

  if filenames.length != 1
    $stderr.puts "Usage: erber [-p props1.yaml [-p props2.json [...]]] [-o foo=bar [-o baz.boop=beep [...]]] template.erb"
    Kernel.exit(1)
  end

  templater = Erber::Templater.new(IO.read(filenames[0]))

  props = {}
  opts[:property_file].each do |property_file|
    case File.extname(property_file)
      when ".yaml"
        props.deep_merge!(YAML.load(IO.read(property_file)))
      when ".json"
        props.deep_merge!(JSON.parse(IO.read(property_file)))
      else
        $stderr.puts "ERROR: unrecognized property format '#{property_file}'."
        Kernel.exit(1)
    end
  end

  props.deep_merge!(unroll_flat_properties(opts[:override_property].map { |o| o.split("=", 2) } ))

  puts templater.render(props)
end
unroll_flat_properties(overrides) click to toggle source
# File lib/erber/cli.rb, line 46
def self.unroll_flat_properties(overrides)
  hash_trees = overrides.map do |main_key, main_value|
    main_key.to_s.split(".").reverse.inject(main_value) do |value, key|
      {key.to_s => value}
    end
  end

  retval = {}
  hash_trees.each { |h| retval.deep_merge!(h) }
  retval
end