Parent

Class 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 lib/rubygems/gem_path_searcher.rb, line 10
10:   def initialize
11:     # We want a record of all the installed gemspecs, in the order we wish to
12:     # examine them.
13:     @gemspecs = init_gemspecs
14: 
15:     # Map gem spec to glob of full require_path directories.  Preparing this
16:     # information may speed up searches later.
17:     @lib_dirs = {}
18: 
19:     @gemspecs.each do |spec|
20:       @lib_dirs[spec.object_id] = lib_dirs_for spec
21:     end
22:   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 lib/rubygems/gem_path_searcher.rb, line 44
44:   def find(path)
45:     @gemspecs.find do |spec| matching_file? spec, path end
46:   end
find_all(path) click to toggle source

Works like #, but finds all gemspecs matching path.

    # File lib/rubygems/gem_path_searcher.rb, line 51
51:   def find_all(path)
52:     @gemspecs.select do |spec|
53:       matching_file? spec, path
54:     end
55:   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 lib/rubygems/gem_path_searcher.rb, line 80
80:   def init_gemspecs
81:     specs = Gem.source_index.map { |_, spec| spec }
82: 
83:     specs.sort { |a, b|
84:       names = a.name <=> b.name
85:       next names if names.nonzero?
86:       b.version <=> a.version
87:     }
88:   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 lib/rubygems/gem_path_searcher.rb, line 94
94:   def lib_dirs_for(spec)
95:     "#{spec.full_gem_path}/{#{spec.require_paths.join(',')}}" if
96:       spec.require_paths
97:   end
matching_file?(spec, path) click to toggle source

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

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

Returns files matching path in spec.

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

Disabled; run with --debug to generate this.

[Validate]

Generated with the Darkfish Rdoc Generator 1.1.6.