| Class | Gem::Dependency |
| In: |
lib/rubygems/dependency.rb
|
| Parent: | Object |
The Dependency class holds a Gem name and a Gem::Requirement.
| TYPES | = | [ :development, :runtime, ] | Valid dependency types. |
| name | [RW] | Dependency name or regular expression. |
| prerelease | [W] | Allows you to force this dependency to be a prerelease. |
Constructs a dependency with name and requirements. The last argument can optionally be the dependency type, which defaults to :runtime.
# File lib/rubygems/dependency.rb, line 34
34: def initialize name, *requirements
35: type = Symbol === requirements.last ? requirements.pop : :runtime
36: requirements = requirements.first if 1 == requirements.length # unpack
37:
38: unless TYPES.include? type
39: raise ArgumentError, "Valid types are #{TYPES.inspect}, "
40: + "not #{type.inspect}"
41: end
42:
43: @name = name
44: @requirement = Gem::Requirement.create requirements
45: @type = type
46: @prerelease = false
47:
48: # This is for Marshal backwards compatibility. See the comments in
49: # +requirement+ for the dirty details.
50:
51: @version_requirements = @requirement
52: end
Dependencies are ordered by name.
# File lib/rubygems/dependency.rb, line 148
148: def <=> other
149: self.name <=> other.name
150: end
Uses this dependency as a pattern to compare to other. This dependency will match if the name matches the other‘s name, and other has only an equal version requirement that satisfies this dependency.
# File lib/rubygems/dependency.rb, line 158
158: def =~ other
159: unless Gem::Dependency === other
160: return unless other.respond_to?(:name) && other.respond_to?(:version)
161: other = Gem::Dependency.new other.name, other.version
162: end
163:
164: return false unless name === other.name
165:
166: reqs = other.requirement.requirements
167:
168: return false unless reqs.length == 1
169: return false unless reqs.first.first == '='
170:
171: version = reqs.first.last
172:
173: requirement.satisfied_by? version
174: end
# File lib/rubygems/dependency.rb, line 176
176: def match? name, version
177: return false unless self.name === name
178: return true if requirement.none?
179:
180: requirement.satisfied_by? Gem::Version.new(version)
181: end
# File lib/rubygems/dependency.rb, line 183
183: def matches_spec? spec
184: return false unless name === spec.name
185: return true if requirement.none?
186:
187: requirement.satisfied_by?(spec.version)
188: end
Merges the requirements of other into this dependency
# File lib/rubygems/dependency.rb, line 193
193: def merge other
194: unless name == other.name then
195: raise ArgumentError,
196: "#{self} and #{other} have different names"
197: end
198:
199: default = Gem::Requirement.default
200: self_req = self.requirement
201: other_req = other.requirement
202:
203: return self.class.new name, self_req if other_req == default
204: return self.class.new name, other_req if self_req == default
205:
206: self.class.new name, self_req.as_list.concat(other_req.as_list)
207: end
Does this dependency require a prerelease?
# File lib/rubygems/dependency.rb, line 70
70: def prerelease?
71: @prerelease || requirement.prerelease?
72: end
What does this dependency require?
# File lib/rubygems/dependency.rb, line 92
92: def requirement
93: return @requirement if defined?(@requirement) and @requirement
94:
95: # @version_requirements and @version_requirement are legacy ivar
96: # names, and supported here because older gems need to keep
97: # working and Dependency doesn't implement marshal_dump and
98: # marshal_load. In a happier world, this would be an
99: # attr_accessor. The horrifying instance_variable_get you see
100: # below is also the legacy of some old restructurings.
101: #
102: # Note also that because of backwards compatibility (loading new
103: # gems in an old RubyGems installation), we can't add explicit
104: # marshaling to this class until we want to make a big
105: # break. Maybe 2.0.
106: #
107: # Children, define explicit marshal and unmarshal behavior for
108: # public classes. Marshal formats are part of your public API.
109:
110: if defined?(@version_requirement) && @version_requirement
111: version = @version_requirement.instance_variable_get :@version
112: @version_requirement = nil
113: @version_requirements = Gem::Requirement.new version
114: end
115:
116: @requirement = @version_requirements if defined?(@version_requirements)
117: end
# File lib/rubygems/dependency.rb, line 119
119: def requirements_list
120: requirement.as_list
121: end