require "rubygems/version"
require "rubygems/deprecate"
Gem.load_yaml if defined? ::YAML
class Gem::Requirement
OPS = { "=" => lambda { |v, r| v == r },
"!=" => lambda { |v, r| v != r },
">" => lambda { |v, r| v > r },
"<" => lambda { |v, r| v < r },
">=" => lambda { |v, r| v >= r },
"<=" => lambda { |v, r| v <= r },
"~>" => lambda { |v, r| v >= r && v.release < r.bump }
}
quoted = OPS.keys.map { |k| Regexp.quote k }.join "|"
PATTERN_RAW = "\\s*(#{quoted})?\\s*(#{Gem::Version::VERSION_PATTERN})\\s*"
PATTERN = /\A#{PATTERN_RAW}\z/
DefaultRequirement = [">=", Gem::Version.new(0)]
class BadRequirementError < ArgumentError; end
def self.create input
case input
when Gem::Requirement then
input
when Gem::Version, Array then
new input
else
if input.respond_to? :to_str then
new [input.to_str]
else
default
end
end
end
def self.default
new '>= 0'
end
def self.parse obj
return ["=", obj] if Gem::Version === obj
unless PATTERN =~ obj.to_s
raise BadRequirementError, "Illformed requirement [#{obj.inspect}]"
end
if $1 == ">=" && $2 == "0"
DefaultRequirement
else
[$1 || "=", Gem::Version.new($2)]
end
end
attr_reader :requirements
def initialize *requirements
requirements = requirements.flatten
requirements.compact!
requirements.uniq!
if requirements.empty?
@requirements = [DefaultRequirement]
else
@requirements = requirements.map! { |r| self.class.parse r }
end
end
def none?
if @requirements.size == 1
@requirements[0] == DefaultRequirement
else
false
end
end
def as_list # :nodoc:
requirements.map { |op, version| "#{op} #{version}" }.sort
end
def hash # :nodoc:
requirements.hash
end
def marshal_dump # :nodoc:
fix_syck_default_key_in_requirements
[@requirements]
end
def marshal_load array # :nodoc:
@requirements = array[0]
fix_syck_default_key_in_requirements
end
def yaml_initialize(tag, vals) vals.each do |ivar, val|
instance_variable_set "@#{ivar}", val
end
Gem.load_yaml
fix_syck_default_key_in_requirements
end
def init_with coder # :nodoc:
yaml_initialize coder.tag, coder.map
end
def to_yaml_properties
["@requirements"]
end
def encode_with(coder)
coder.add 'requirements', @requirements
end
def prerelease?
requirements.any? { |r| r.last.prerelease? }
end
def pretty_print q # :nodoc:
q.group 1, 'Gem::Requirement.new(', ')' do
q.pp as_list
end
end
def satisfied_by? version
raise ArgumentError, "Need a Gem::Version: #{version.inspect}" unless
Gem::Version === version
requirements.all? { |op, rv| (OPS[op] || OPS["="]).call version, rv }
end
alias :=== :satisfied_by?
alias :=~ :satisfied_by?
def specific?
return true if @requirements.length > 1
not %w[> >=].include? @requirements.first.first end
def to_s # :nodoc:
as_list.join ", "
end
def == other
Gem::Requirement === other and to_s == other.to_s
end
private
def fix_syck_default_key_in_requirements
Gem.load_yaml
@requirements.each do |r|
if r[0].kind_of? Gem::SyckDefaultKey
r[0] = "="
end
end
end
end
class Gem::Version
Requirement = Gem::Requirement
end