#!/usr/bin/env ruby # frozen_string_literal: true $VERBOSE = true require 'optparse' require_relative '../lib/planter' options = { help: false, debug: false, version: false } # Variable definition # variables: # - key: var # prompt: Variable # type: [string,float,integer,number,date] # value: (for date type can be today, time, now, etc.) # default: Untitled # min: 1 # max: 5 Planter.variables = {} Planter.base_dir = ENV['PLANTER_DIR'] || File.expand_path('~/.config/planter') Planter::Color.coloring = $stdout.isatty opts = OptionParser.new opts.banner = 'Usage: planter [options] TEMPLATE' Planter.accept_defaults = false opts.on('--defaults', 'Accept default values for all variables') do Planter.accept_defaults = true end Planter.target = Dir.pwd opts.on('-i', '--in TARGET', 'Plant in TARGET instead of current directory') do |opt| target = File.expand_path(opt) FileUtils.mkdir_p(target) unless File.exist?(target) Planter.target = target end opts.on('-k', '--var=KEY:VALUE,KEY:VALUE...', Array, 'Pass a variable on the command line as KEY:VALUE pairs. Can be used multiple times.') do |opt| opt.each do |o| parts = o.split(/:/) key = parts.shift value = parts.join(':') Planter.variables[key.to_var] = value end end opts.on('-o', '--overwrite', 'Overwrite existing files') do Planter.overwrite = true end opts.on_tail('--base-dir DIRECTORY', 'Use an alternate base directory for config and templates') do |opt| Planter.base_dir = opt end opts.on_tail('-d', '--debug', 'Display version number') do Planter.debug = true end opts.on_tail('-h', '--help', 'Display this screen, or list variables for template argument') do options[:help] = true end opts.on_tail('-v', '--version', 'Display version number') do options[:version] = true end opts.parse! ## ## List variables for a template ## ## @param template [String] The template ## def list_vars(template) puts "#{template} variables:" Planter.config = template Planter.config[:variables].sort_by { |v| v[:key].to_var }.each do |var| title = var[:prompt] || var[:key] var_type = var[:type].normalize_type || :string default = var[:value] || var[:default] default = default ? ", default: #{default.coerce(var_type)}" : '' puts "#{title}:" puts " [#{var[:key].to_var}] (type: #{var_type}#{default})" end end if options[:version] puts "planter v#{Planter::VERSION}" Process.exit 0 elsif options[:help] if ARGV.count.zero? puts opts else list_vars(ARGV[0]) end Process.exit 0 elsif ARGV.count.zero? raise Planter::Errors::ArgumentError.new 'Template argument required' end ARGV.each do |template| # Planter.spinner.update(title: 'Initializing configuration') Planter.config = template app = Planter::Plant.new app.plant end