64 lines
1.5 KiB
Ruby
64 lines
1.5 KiB
Ruby
# This was added via Merb's bundler
|
|
|
|
require "rubygems"
|
|
require "rubygems/source_index"
|
|
|
|
module Gem
|
|
BUNDLED_SPECS = File.join(Dir.pwd, "gems", "specifications")
|
|
MAIN_INDEX = Gem::SourceIndex.from_gems_in(BUNDLED_SPECS)
|
|
FALLBACK_INDEX = Gem::SourceIndex.from_installed_gems
|
|
|
|
def self.source_index
|
|
MultiSourceIndex.new
|
|
end
|
|
|
|
def self.searcher
|
|
MultiPathSearcher.new
|
|
end
|
|
|
|
class ArbitrarySearcher < GemPathSearcher
|
|
def initialize(source_index)
|
|
@source_index = source_index
|
|
super()
|
|
end
|
|
|
|
def init_gemspecs
|
|
@source_index.map { |_, spec| spec }.sort { |a,b|
|
|
(a.name <=> b.name).nonzero? || (b.version <=> a.version)
|
|
}
|
|
end
|
|
end
|
|
|
|
class MultiPathSearcher
|
|
def initialize
|
|
@main_searcher = ArbitrarySearcher.new(MAIN_INDEX)
|
|
@fallback_searcher = ArbitrarySearcher.new(FALLBACK_INDEX)
|
|
end
|
|
|
|
def find(path)
|
|
try = @main_searcher.find(path)
|
|
return try if try
|
|
@fallback_searcher.find(path)
|
|
end
|
|
|
|
def find_all(path)
|
|
try = @main_searcher.find_all(path)
|
|
return try unless try.empty?
|
|
@fallback_searcher.find_all(path)
|
|
end
|
|
end
|
|
|
|
class MultiSourceIndex
|
|
def search(*args)
|
|
try = MAIN_INDEX.search(*args)
|
|
return try unless try.empty?
|
|
FALLBACK_INDEX.search(*args)
|
|
end
|
|
|
|
def find_name(*args)
|
|
try = MAIN_INDEX.find_name(*args)
|
|
return try unless try.empty?
|
|
FALLBACK_INDEX.find_name(*args)
|
|
end
|
|
end
|
|
end |