GemPathSearcher has the capability to find loadable files inside gems. It generates data up front to speed up searches later.
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
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
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
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
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
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
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.
Generated with the Darkfish Rdoc Generator 1.1.6.