Extended maintenance of Ruby versions 1.8.7 and 1.9.2 ended on July 31, 2014. Read more

In Files

  • rubygems/gem_path_searcher.rb

Class/Module Index [+]

Quicksearch

Gem::GemPathSearcher

GemPathSearcher has the capability to find loadable files inside gems. It generates data up front to speed up searches later.

Public Class Methods

new() click to toggle source

Initialise the data we need to make searches later.

 
               # File rubygems/gem_path_searcher.rb, line 10
def initialize
  # We want a record of all the installed gemspecs, in the order we wish to
  # examine them.
  @gemspecs = init_gemspecs

  # Map gem spec to glob of full require_path directories.  Preparing this
  # information may speed up searches later.
  @lib_dirs = {}

  @gemspecs.each do |spec|
    @lib_dirs[spec.object_id] = lib_dirs_for spec
  end
end
            

Public Instance Methods

find(path) click to toggle source

Look in all the installed gems until a matching path is found. Return the gemspec of the gem where it was found. If no match is found, return nil.

The gems are searched in alphabetical order, and in reverse version order.

For example:

find('log4r')              # -> (log4r-1.1 spec)
find('log4r.rb')           # -> (log4r-1.1 spec)
find('rake/rdoctask')      # -> (rake-0.4.12 spec)
find('foobarbaz')          # -> nil

Matching paths can have various suffixes (‘.rb’, ‘.so’, and others), which may or may not already be attached to file. This method doesn’t care about the full filename that matches; only that there is a match.

 
               # File rubygems/gem_path_searcher.rb, line 44
def find(path)
  @gemspecs.find do |spec| matching_file? spec, path end
end
            
find_all(path) click to toggle source

Works like find, but finds all gemspecs matching path.

 
               # File rubygems/gem_path_searcher.rb, line 51
def find_all(path)
  @gemspecs.select do |spec|
    matching_file? spec, path
  end
end
            
init_gemspecs() click to toggle source

Return a list of all installed gemspecs, sorted by alphabetical order and in reverse version order. (bar-2, bar-1, foo-2)

 
               # File rubygems/gem_path_searcher.rb, line 80
def init_gemspecs
  specs = Gem.source_index.map { |_, spec| spec }

  specs.sort { |a, b|
    names = a.name <=> b.name
    next names if names.nonzero?
    b.version <=> a.version
  }
end
            
lib_dirs_for(spec) click to toggle source

Returns library directories glob for a gemspec. For example,

'/usr/local/lib/ruby/gems/1.8/gems/foobar-1.0/{lib,ext}'
 
               # File rubygems/gem_path_searcher.rb, line 94
def lib_dirs_for(spec)
  "#{spec.full_gem_path}/{#{spec.require_paths.join(',')}}" if
    spec.require_paths
end
            
matching_file?(spec, path) click to toggle source

Attempts to find a matching path using the require_paths of the given spec.

 
               # File rubygems/gem_path_searcher.rb, line 61
def matching_file?(spec, path)
  !matching_files(spec, path).empty?
end
            
matching_files(spec, path) click to toggle source

Returns files matching path in spec.

 
               # File rubygems/gem_path_searcher.rb, line 70
def matching_files(spec, path)
  return [] unless @lib_dirs[spec.object_id] # case no paths
  glob = File.join @lib_dirs[spec.object_id], "#{path}#{Gem.suffix_pattern}"
  Dir[glob].select { |f| File.file? f.untaint }
end
            

Commenting is here to help enhance the documentation. For example, code samples, or clarification of the documentation.

If you have questions about Ruby or the documentation, please post to one of the Ruby mailing lists. You will get better, faster, help that way.

If you wish to post a correction of the docs, please do so, but also file bug report so that it can be corrected for the next release. Thank you.

If you want to help improve the Ruby documentation, please visit Documenting-ruby.org.

blog comments powered by Disqus