Class: Gem::GemPathSearcher
Overview
GemPathSearcher has the capability to find loadable files inside gems. It generates data up front to speed up searches later.
Instance Method Summary (collapse)
-
- (Object) find(glob)
Look in all the installed gems until a matching glob is found.
-
- (Object) find_all(glob)
Works like #find, but finds all gemspecs matching glob.
-
- (Object) init_gemspecs
Return a list of all installed gemspecs, sorted by alphabetical order and in reverse version order.
-
- (GemPathSearcher) initialize
constructor
Initialise the data we need to make searches later.
-
- (Object) lib_dirs_for(spec)
Returns library directories glob for a gemspec.
-
- (Boolean) matching_file?(spec, path)
Attempts to find a matching path using the require_paths of the given spec.
-
- (Object) matching_files(spec, path)
Returns files matching path in spec.
Constructor Details
- (GemPathSearcher) initialize
Initialise the data we need to make searches later.
10 11 12 13 14 15 16 17 18 19 20 21 22 |
# File 'lib/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 |
Instance Method Details
- (Object) find(glob)
Look in all the installed gems until a matching glob 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.
44 45 46 47 48 |
# File 'lib/rubygems/gem_path_searcher.rb', line 44 def find(glob) @gemspecs.find do |spec| matching_file? spec, glob end end |
- (Object) find_all(glob)
Works like #find, but finds all gemspecs matching glob.
53 54 55 56 57 |
# File 'lib/rubygems/gem_path_searcher.rb', line 53 def find_all(glob) @gemspecs.select do |spec| matching_file? spec, glob end end |
- (Object) init_gemspecs
Return a list of all installed gemspecs, sorted by alphabetical order and in reverse version order. (bar-2, bar-1, foo-2)
82 83 84 85 86 87 88 89 90 |
# File 'lib/rubygems/gem_path_searcher.rb', line 82 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 |
- (Object) lib_dirs_for(spec)
Returns library directories glob for a gemspec. For example,
'/usr/local/lib/ruby/gems/1.8/gems/foobar-1.0/{lib,ext}'
96 97 98 99 |
# File 'lib/rubygems/gem_path_searcher.rb', line 96 def lib_dirs_for(spec) "#{spec.full_gem_path}/{#{spec.require_paths.join(',')}}" if spec.require_paths end |
- (Boolean) matching_file?(spec, path)
Attempts to find a matching path using the require_paths of the given spec.
63 64 65 |
# File 'lib/rubygems/gem_path_searcher.rb', line 63 def matching_file?(spec, path) !matching_files(spec, path).empty? end |
- (Object) matching_files(spec, path)
Returns files matching path in spec. -- Some of the intermediate results are cached in @lib_dirs for speed.
72 73 74 75 76 |
# File 'lib/rubygems/gem_path_searcher.rb', line 72 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 |