lib/appbundler/cli.rb in appbundler-0.5.0 vs lib/appbundler/cli.rb in appbundler-0.6.0

- old
+ new

@@ -1,98 +1,113 @@ -require 'appbundler/version' -require 'appbundler/app' -require 'mixlib/cli' - -module Appbundler - class CLI - include Mixlib::CLI - - banner(<<-BANNER) -Usage: appbundler APPLICATION_DIR BINSTUB_DIR - - APPLICATION_DIR is the root directory of your app - BINSTUB_DIR is the directory where you want generated executables to be written -BANNER - - option :version, - :short => '-v', - :long => '--version', - :description => 'Show appbundler version', - :boolean => true, - :proc => lambda {|v| $stdout.puts("Appbundler Version: #{::Appbundler::VERSION}")}, - :exit => 0 - - option :help, - :short => "-h", - :long => "--help", - :description => "Show this message", - :on => :tail, - :boolean => true, - :show_options => true, - :exit => 0 - - def self.run(argv) - cli = new(argv) - cli.handle_options - cli.validate! - cli.run - end - - attr_reader :argv - - attr_reader :app_path - attr_reader :bin_path - - def initialize(argv) - @argv = argv - super() - end - - def handle_options - parse_options(@argv) - end - - def validate! - if cli_arguments.size != 2 - usage_and_exit! - else - @app_path = File.expand_path(cli_arguments[0]) - @bin_path = File.expand_path(cli_arguments[1]) - verify_app_path - verify_bin_path - end - end - - def verify_app_path - if !File.directory?(app_path) - err("APPLICATION_DIR `#{app_path}' is not a directory or doesn't exist") - usage_and_exit! - elsif !File.exist?(File.join(app_path, "Gemfile.lock")) - err("APPLICATION_DIR does not contain require Gemfile.lock") - usage_and_exit! - end - end - - def verify_bin_path - if !File.directory?(bin_path) - err("BINSTUB_DIR `#{bin_path}' is not a directory or doesn't exist") - usage_and_exit! - end - end - - def run - created_stubs = App.new(app_path, bin_path).write_executable_stubs - created_stubs.each do |real_executable_path, stub_path| - $stdout.puts "Generated binstub #{stub_path} => #{real_executable_path}" - end - end - - def err(message) - $stderr.print("#{message}\n") - end - - def usage_and_exit! - err(banner) - exit 1 - end - end -end +require 'appbundler/version' +require 'appbundler/app' +require 'mixlib/cli' + +module Appbundler + class CLI + include Mixlib::CLI + + banner(<<-BANNER) +Usage: appbundler APPLICATION_DIR BINSTUB_DIR + + APPLICATION_DIR is the root directory to a working copy of your app + BINSTUB_DIR is the directory where you want generated executables to be written + +Your bundled application must already be gem installed. Generated binstubs +will point to the gem, not your working copy. +BANNER + + option :version, + :short => '-v', + :long => '--version', + :description => 'Show appbundler version', + :boolean => true, + :proc => lambda {|v| $stdout.puts("Appbundler Version: #{::Appbundler::VERSION}")}, + :exit => 0 + + option :help, + :short => "-h", + :long => "--help", + :description => "Show this message", + :on => :tail, + :boolean => true, + :show_options => true, + :exit => 0 + + def self.run(argv) + cli = new(argv) + cli.handle_options + cli.validate! + cli.run + end + + attr_reader :argv + + attr_reader :app_path + attr_reader :bin_path + + def initialize(argv) + @argv = argv + super() + end + + def handle_options + parse_options(@argv) + end + + def validate! + if cli_arguments.size != 2 + usage_and_exit! + else + @app_path = File.expand_path(cli_arguments[0]) + @bin_path = File.expand_path(cli_arguments[1]) + verify_app_path + verify_bin_path + verify_gem_installed + end + end + + def verify_app_path + if !File.directory?(app_path) + err("APPLICATION_DIR `#{app_path}' is not a directory or doesn't exist") + usage_and_exit! + elsif !File.exist?(File.join(app_path, "Gemfile.lock")) + err("APPLICATION_DIR does not contain required Gemfile.lock") + usage_and_exit! + end + end + + def verify_bin_path + if !File.directory?(bin_path) + err("BINSTUB_DIR `#{bin_path}' is not a directory or doesn't exist") + usage_and_exit! + end + end + + def verify_gem_installed + app = App.new(app_path, bin_path) + app.app_gemspec + rescue Gem::LoadError + err("Unable to find #{app.app_spec.name} #{app.app_spec.version} installed as a gem") + err("You must install the top-level app as a gem before calling app-bundler") + usage_and_exit! + end + + def run + app = App.new(app_path, bin_path) + created_stubs = app.write_executable_stubs + created_stubs.each do |real_executable_path, stub_path| + $stdout.puts "Generated binstub #{stub_path} => #{real_executable_path}" + end + app.copy_bundler_env + end + + def err(message) + $stderr.print("#{message}\n") + end + + def usage_and_exit! + err(banner) + exit 1 + end + end +end