Re-enable spec/library for full CI runs.
[rbx.git] / lib / rubygems / dependency.rb
blob7b9904df5559c126f77c914056e54b6ec6114f66
1 #--
2 # Copyright 2006 by Chad Fowler, Rich Kilmer, Jim Weirich and others.
3 # All rights reserved.
4 # See LICENSE.txt for permissions.
5 #++
7 require 'rubygems'
9 ##
10 # The Dependency class holds a Gem name and a Gem::Requirement
12 class Gem::Dependency
14   ##
15   # Valid dependency types.
16   #--
17   # When this list is updated, be sure to change
18   # Gem::Specification::CURRENT_SPECIFICATION_VERSION as well.
20   TYPES = [
21     :development,
22     :runtime,
23   ]
25   ##
26   # Dependency name or regular expression.
28   attr_accessor :name
30   ##
31   # Dependency type.
33   attr_reader :type
35   ##
36   # Dependent versions.
38   attr_writer :version_requirements
40   ##
41   # Orders dependencies by name only.
43   def <=>(other)
44     [@name] <=> [other.name]
45   end
47   ##
48   # Constructs a dependency with +name+ and +requirements+.
50   def initialize(name, version_requirements, type=:runtime)
51     @name = name
53     unless TYPES.include? type
54       raise ArgumentError, "Valid types are #{TYPES.inspect}, not #{@type.inspect}"
55     end
57     @type = type
59     @version_requirements = Gem::Requirement.create version_requirements
60     @version_requirement = nil   # Avoid warnings.
61   end
63   def version_requirements
64     normalize if defined? @version_requirement and @version_requirement
65     @version_requirements
66   end
68   def requirement_list
69     version_requirements.as_list
70   end
72   alias requirements_list requirement_list
74   def normalize
75     ver = @version_requirement.instance_eval { @version }
76     @version_requirements = Gem::Requirement.new([ver])
77     @version_requirement = nil
78   end
80   def to_s # :nodoc:
81     "#{name} (#{version_requirements}, #{@type || :runtime})"
82   end
84   def ==(other) # :nodoc:
85     self.class === other &&
86       self.name == other.name &&
87       self.type == other.type &&
88       self.version_requirements == other.version_requirements
89   end
91   ##
92   # Uses this dependency as a pattern to compare to the dependency +other+.
93   # This dependency will match if the name matches the other's name, and other
94   # has only an equal version requirement that satisfies this dependency.
96   def =~(other)
97     return false unless self.class === other
99     pattern = @name
100     pattern = /\A#{@name}\Z/ unless Regexp === pattern
102     return false unless pattern =~ other.name
104     reqs = other.version_requirements.requirements
106     return false unless reqs.length == 1
107     return false unless reqs.first.first == '='
109     version = reqs.first.last
111     version_requirements.satisfied_by? version
112   end
114   def hash # :nodoc:
115     name.hash + type.hash + version_requirements.hash
116   end