Sha256: 46f345c74156e4ba06b3ee1092c87d5a838e4861b1974b9c041fd350f2395487

Contents?: true

Size: 1.48 KB

Versions: 1

Compression:

Stored size: 1.48 KB

Contents

# encoding: utf-8
require 'guard'
require 'guard/guard'

module Guard
  class Bundler < Guard
    BUNDLER_ENV_VARS = %w(RUBYOPT BUNDLE_PATH BUNDLE_BIN_PATH BUNDLE_GEMFILE).freeze

    autoload :Notifier, 'guard/bundler/notifier'

    def initialize(watchers = [], options = {})
      super

      @original_env = {}
      options[:notify] = true if options[:notify].nil?
    end
 
    def start
      return refresh_bundle if bundle_need_refresh?
      true
    end

    def stop
      true
    end

    def reload
      refresh_bundle
    end

    def run_on_change(paths = [])
      return refresh_bundle if bundle_need_refresh?
      true
    end

    private

    def notify?
      !!options[:notify]
    end

    def bundle_need_refresh?
      with_clean_env do
        `bundle check`
      end
      $? == 0 ? false : true
    end

    def with_clean_env
      unset_bundler_env_vars
      ENV['BUNDLE_GEMFILE'] = File.join(Dir.pwd, "Gemfile")
      yield
    ensure
      restore_env
    end

    def unset_bundler_env_vars
      BUNDLER_ENV_VARS.each do |key|
        @original_env[key] = ENV[key]
        ENV[key] = nil
      end
    end

    def restore_env
      @original_env.each { |key, value| ENV[key] = value }
    end

    def refresh_bundle
      UI.info 'Refresh bundle', :reset => true
      start_at = Time.now
      result = ''
      with_clean_env do
        result = system('bundle install')
      end
      Notifier::notify(true, Time.now - start_at) if notify?
      result
    end

  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
guard-bundler-0.1.2 lib/guard/bundler.rb