class which implements logic of searching/loading versioned libraries
| :absolute |
[R] |
|
| :loaded |
[R] |
|
| :sep |
[R] |
|
Singleton
# File lib/library.rb, line 176
def initialize
@loaded = {}
@sep = File::SEPARATOR
@absolute = }^\s*#{sep}}o
end
|
link(filename, interface=nil)
|
# File lib/library.rb, line 182
def link filename, interface=nil
return false if loaded? (filename, interface)
self.load filename, interface
end
|
load(filename, interface=nil)
|
# File lib/library.rb, line 188
def load filename, interface=nil
fn = nil
v = nil
if interface
fn = filename
v = Version.new(interface)
else
fn, v = Version.parse(filename)
end
entries = []
globs(fn).each do |glob|
Dir[glob].map do |path|
entries << Entry.new(path, Version.new(path))
end
end
entries.sort! {|a,b| a.version <=> b.version}
entries.reverse!
entries.each do |entry|
if entry.version === v
Kernel::load(entry.path)
return (loaded[[filename, interface]] = entry.path)
end
end
msg = "INTERFACE #{interface}\nNOT SUPPORTED BY ANY OF\n"
entries.each {|e| msg << "\t#{e.path} [#{e.version}\]\n"}
raise msg
end
# File lib/library.rb, line 221
def globs filename
fn = filename.clone
ext = fn[}\.[^\.]+$}o]
globs = []
if ext
globs << "#{fn}.[0-9].[0-9].[0-9]"
else
globs << "#{fn}.rb.[0-9].[0-9].[0-9]"
globs << "#{fn}.so.[0-9].[0-9].[0-9]"
end
if fn =~ absolute
return globs
else
return \
$LOAD_PATH.collect do |path|
globs.map {|glob| path.clone << sep << glob }
end.flatten
end
end
# File lib/library.rb, line 243
def loaded_features
loaded.values
end
|
loaded?(filename, interface)
|
# File lib/library.rb, line 247
def loaded? filename, interface
loaded[[filename, interface]]
end