class Appraisal::Command
Executes commands with a clean environment
def announce
def announce if gemfile puts ">> BUNDLE_GEMFILE=#{gemfile} #{command_as_string}" else puts ">> #{command_as_string}" end end
def command_as_string
def command_as_string if command.is_a?(Array) Shellwords.join(command) else command end end
def command_starting_with_bundle(original_command)
def command_starting_with_bundle(original_command) if command_starts_with_bundle?(original_command) original_command else %w(bundle exec) + original_command end end
def command_starts_with_bundle?(original_command)
def command_starts_with_bundle?(original_command) if original_command.is_a?(Array) original_command.first =~ /^bundle/ else original_command =~ /^bundle/ end end
def ensure_bundler_is_available
def ensure_bundler_is_available version = Utils.bundler_version unless system %(gem list --silent -i bundler -v #{version}) puts ">> Reinstall Bundler into #{ENV["GEM_HOME"]}" unless system "gem install bundler --version #{version}" puts puts <<-ERROR.strip.gsub(/\s+/, " ") Bundler installation failed. Please try running: `GEM_HOME="#{ENV["GEM_HOME"]}" gem install bundler --version #{version}` manually. ERROR exit(1) end end end
def initialize(command, options = {})
def initialize(command, options = {}) @gemfile = options[:gemfile] @env = options.fetch(:env, {}) @command = command_starting_with_bundle(command) end
def run
def run run_env = test_environment.merge(env) Bundler.with_original_env do ensure_bundler_is_available announce ENV["BUNDLE_GEMFILE"] = gemfile ENV["APPRAISAL_INITIALIZED"] = "1" run_env.each_pair do |key, value| ENV[key] = value end unless Kernel.system(command_as_string) exit(1) end end end
def test_environment
def test_environment return {} unless ENV["APPRAISAL_UNDER_TEST"] == "1" { "GEM_HOME" => ENV["GEM_HOME"], "GEM_PATH" => "", } end