def best_version(spec, *methods)
spec = Artifact.to_hash(spec)
spec[:version] = requirement = VersionRequirement.create(spec[:version])
select = lambda do |candidates|
candidates.find { |candidate| requirement.satisfied_by?(candidate) }
end
result = nil
methods = search_methods if methods.empty?
if requirement.composed?
until result || methods.empty?
method = methods.shift
type = method.keys.first
from = method[type]
if (include.empty? || !(include & [:all, type, from]).empty?) &&
(exclude & [:all, type, from]).empty?
if from.respond_to?(:call)
versions = from.call(spec.dup)
else
versions = send("#{type}_versions", spec.dup, *from)
end
result = select[versions]
end
end
end
result ||= requirement.default
raise "Could not find #{Artifact.to_spec(spec)}" +
"\n You may need to use an specific version instead of a requirement" unless result
spec.merge :version => result
end