require 'optparse' module DevenvBuild class Cli def initialize (cmdargs) @args = cmdargs self end def run options = parse_command_line(@args) DevenvBuild::Files::Vagrantfile.new(options).generate DevenvBuild::Files::Provision.new(options).generate end private def default_options options = {} options[:destination_directory] = nil options[:box_name] = nil Provisioning.provisioning_modules.map do |module_name, mod| options[module_name] = false end options end def parse_command_line (args) options = default_options o = OptionParser.new do |opts| opts.banner = "Generate a Vagrant development environment with the selected programming languages and tools.\n\n" opts.on('-d', '--directory=DIRECTORY', 'Target directory where to create the environment on.') do |dir| options[:destination_directory] = dir end opts.on('-n', '--devenv-name=NAME', 'Name of your development environment.') do |dir| options[:box_name] = dir end opts.on('--all', 'Install everything.') do |dir| options[:all] = true end Provisioning.provisioning_modules.map do |module_name, mod| opts.on("--#{module_name}", mod.help, &mod.options_setter(module_name, options)) end opts.on('-h', '--help', 'Print this screen.') do |dir| puts opts exit end end begin o.parse!(args) Provisioning.provisioning_modules.map do |module_name, mod| mod.options_setter(module_name, options).call end if options[:all] if options[:destination_directory].nil? puts "Need a target directory.\n\n" raise OptionParser::MissingArgument end unless Provisioning.provisioning_modules.keys.any? { |module_name| options[module_name] } puts "You need to specify at least one thing to include.\n\n" raise OptionParser::MissingArgument end rescue puts o exit end options end end end