class Bundler::Source::Path

def generate_bin(spec)

def generate_bin(spec)
  gem_dir  = spec.full_gem_path
  gem_file = Dir.chdir(gem_dir){ Gem::Builder.new(spec).build }
  installer = Gem::Installer.new File.join(gem_dir, gem_file),
    :bin_dir           => "#{Gem.dir}/bin",
    :wrappers          => true,
    :env_shebang       => false,
    :format_executable => false
  installer.instance_eval { @gem_dir = gem_dir }
  installer.build_extensions
  installer.generate_bin
rescue Gem::InvalidSpecificationException => e
  Bundler.ui.warn "\n#{spec.name} at #{spec.full_gem_path} did not have a valid gemspec.\n" \
                  "This prevents bundler from installing bins or native extensions, but " \
                  "that may not affect its functionality."
  if !spec.extensions.empty? && !spec.email.empty?
    Bundler.ui.warn "If you need to use this package without installing it from a gem " \
                    "repository, please contact #{spec.email} and ask them " \
                    "to modify their .gemspec so it can work with `gem build`."
  end
  Bundler.ui.warn "The validation message from Rubygems was:\n  #{e.message}"
ensure
  Dir.chdir(gem_dir){ FileUtils.rm_rf(gem_file) if gem_file && File.exist?(gem_file) }
end

def initialize(options)

def initialize(options)
  @options = options
  @glob = options["glob"] || "{,*/}*.gemspec"
  if options["path"]
    @path = Pathname.new(options["path"]).expand_path(Bundler.root)
  end
  @name = options["name"]
  @version = options["version"]
end

def install(spec)

def install(spec)
  Bundler.ui.debug "  * Using path #{path}"
  generate_bin(spec)
end

def load_spec_files

def load_spec_files
  index = Index.new
  if File.directory?(path)
    Dir["#{path}/#{@glob}"].each do |file|
      file = Pathname.new(file)
      # Eval the gemspec from its parent directory
      spec = Dir.chdir(file.dirname) do
        begin
          Gem::Specification.from_yaml(file.basename)
          # Raises ArgumentError if the file is not valid YAML
        rescue ArgumentError, Gem::EndOfYAMLException, Gem::Exception
          begin
            eval(File.read(file.basename), TOPLEVEL_BINDING, file.expand_path.to_s)
          rescue LoadError
            raise GemspecError, "There was a LoadError while evaluating #{file.basename}.\n" +
              "Does it try to require a relative path? That doesn't work in Ruby 1.9."
          end
        end
      end
      if spec
        spec = Specification.from_gemspec(spec)
        spec.loaded_from = file.to_s
        spec.source = self
        index << spec
      end
    end
    if index.empty? && @name && @version
      index << Specification.new do |s|
        s.name     = @name
        s.source   = self
        s.version  = Gem::Version.new(@version)
        s.summary  = "Fake gemspec for #{@name}"
        s.relative_loaded_from = "#{@name}.gemspec"
        if path.join("bin").exist?
          binaries = path.join("bin").children.map{|c| c.basename.to_s }
          s.executables = binaries
        end
      end
    end
  else
    raise PathError, "The path `#{path}` does not exist."
  end
  index
end

def local_specs

def local_specs
  @local_specs ||= load_spec_files
end

def to_s

def to_s
  "source code at #{@path}"
end