Sha256: 805cc9b03ec19bc628906b599e3cd1b7f2e5023178aba27e56c4d73b23d995f8

Contents?: true

Size: 1.27 KB

Versions: 2

Compression:

Stored size: 1.27 KB

Contents

require 'bundler'

module JavaGems
  class ClasspathBuilder
    class ClasspathError < RuntimeError; end
    
    def classpath_for(gemfile)
      with_hijacked_bundler_logging do
        bundler_env = Bundler::Environment.load(gemfile)
        deps = bundler_env.dependencies.map {|dep| dep.to_gem_dependency }
        cp = Bundler::Resolver.resolve(deps, sources).collect do |spec|
          spec.require_paths.collect do |req_path|
            (Pathname(spec.full_gem_path) + req_path).expand_path.to_s
          end
        end.flatten.join(File::PATH_SEPARATOR)
      end

    rescue => e
      raise ClasspathError, "#{e.message} - #{@hijacked_out.read}"  
    end

  private

    def with_hijacked_bundler_logging
      @hijacked_out = StringIO.new
      real_logger, Bundler.logger = Bundler.logger, Logger.new(@hijacked_out, Logger::INFO)
      Bundler.logger.formatter = real_logger.formatter
      yield
    ensure
      @hijacked_out.rewind
      Bundler.logger = real_logger
    end

    # I will find gems in a relative vendor directory and then using the system source, similar to how
    # Gem Bundler will normally work
    def sources
      [Bundler::DirectorySource.new(:location => 'vendor'), Bundler::SystemGemSource.instance]
    end

  end # ClasspathBuilder
end   # JavaGems

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
javagems-0.4.11 lib/javagems/classpath_builder.rb
javagems-0.4.10 lib/javagems/classpath_builder.rb