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